@use "common/colors" as *; @use "common/material" as *; @use "sass:color"; #chat-interface { height: 100%; background: linear-gradient(135deg, $color-dark-background 0%, $color-dark-surface-container 70%, rgba($color-dark-primary-container, 0.3) 100%); position: relative; &::before { content: ''; position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: radial-gradient(circle at 20% 80%, rgba($color-dark-primary, 0.15) 0%, transparent 50%), radial-gradient(circle at 80% 20%, rgba($color-dark-tertiary, 0.15) 0%, transparent 50%), radial-gradient(circle at 40% 40%, rgba($color-dark-secondary, 0.1) 0%, transparent 50%); pointer-events: none; z-index: 0; } .header { display: flex; background-color: $color-dark-surface-container; color: white; padding: 16px 16px; justify-content: end; width: fit-content; z-index: 1000; position: absolute; top: 0; right: 0; .header-content { display: flex; justify-content: space-between; align-items: center; .logo { font-size: 1.8rem; font-weight: 700; display: flex; align-items: center; } #logouts { display: none; list-style: none; gap: 10px; li { a { color: white; text-decoration: none; font-weight: 500; transition: all 0.3s ease; padding: 10px; border-radius: 10px; display: flex; flex-direction: row; align-items: center; gap: 10px; &:hover { background-color: rgba(255, 255, 255, 0.2); } } } } } } .chat-container { display: flex; width: 100%; flex-direction: column; overflow: hidden; .chat-main { flex-grow: 1; display: flex; flex-direction: column; height: 100%; position: relative; overflow: hidden; .chat-header { padding: 16px; background: rgba($color-dark-surface-container, 0.8); backdrop-filter: blur(20px); display: flex; align-items: center; box-shadow: 0 4px 20px rgba($color-dark-primary, 0.1); position: relative; z-index: 1; .chat-header-avatar { width: 45px; height: 45px; border-radius: 20%; object-fit: cover; margin-right: 1rem; } .chat-header-info { display: flex; .info-chat { display: flex; flex-direction: column; h4 { font-size: 1.1rem; margin: 0 0 0.2rem; } p { margin: 0; font-size: 0.8rem; color: #718096; } } .online-status { display: inline-block; width: 10px; height: 10px; border-radius: 50%; background-color: $success; margin-right: 5px; } a { display: flex; flex-direction: row; text-decoration: none; color: white; justify-content: end; padding: 0; margin: 0; position: absolute; right: 2%; top: 2%; &:hover { border: none; } } } } .quote.contextual-content > .quote-inner { display: flex; flex-direction: column; gap: 4px; .reply-username { font-weight: 600; color: $color-dark-on-surface; font-size: 0.85rem; } .reply-text { overflow: hidden; text-overflow: ellipsis; } } .chat-messages { flex: 1; padding: 10px 20px; overflow-y: auto; position: relative; z-index: 1; &::-webkit-scrollbar { width: 7px; } &::-webkit-scrollbar-track { background: transparent; } &::-webkit-scrollbar-thumb { background-color: $color-dark-surface-container-high; border-radius: 20px; } .message { margin-bottom: 1rem; max-width: 70%; position: relative; width: fit-content; display: flex; align-items: flex-end; gap: 8px; .message-inner { border-radius: 12px; position: relative; word-wrap: break-word; overflow-wrap: anywhere; word-break: break-word; width: fit-content; max-width: 100%; display: inline-block; .message-profile-pic { width: 32px; height: 32px; flex-shrink: 0; margin-bottom: 4px; margin: 10px; img { width: 100%; height: 100%; border-radius: 50%; object-fit: cover; transition: transform 0.2s ease, box-shadow 0.2s ease; &:hover { transform: scale(1.1); box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3); } } } .message-username { font-weight: 600; margin-bottom: 0.3rem; font-size: 0.9rem; transition: color 0.2s ease; margin: 10px; &:hover { color: $color-dark-primary; text-decoration: underline; } } .message-content { word-wrap: break-word; margin: 10px 10px 0 10px; white-space: pre-wrap; > p:first-child { margin-block-start: 0; } > p:last-child { margin-block-end: 0; } } .quote.reply-preview { user-select: none; margin: 10px; } .message-attachments { padding: 5px 0 0 0; overflow: hidden; .attachment { a { text-decoration: none; } .attachement-image { max-width: 200px; border-radius: 8px; cursor: pointer; margin-left: 3px; margin-right: 3px; margin-bottom: 3px; &:last-child { margin-bottom: 0; } &.loading { filter: blur(10px); transition: filter 200ms ease; } } .attachement-image.placeholder { background: $color-dark-surface-container-highest; pointer-events: none; } .image-wrapper { position: relative; display: inline-block; } .loading-overlay { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; background: rgba(0, 0, 0, 0.08); backdrop-filter: blur(6px); border-radius: 8px; } .preload-image { position: absolute; width: 0; height: 0; opacity: 0; pointer-events: none; } .with-icon-gap { display: inline-flex; align-items: center; gap: 8px; } } } .message-time { font-size: 0.7rem; color: $color-dark-on-surface-variant; margin-top: 0.3rem; text-align: right; user-select: none; margin: 4px 8px 8px 8px; display: flex; align-items: center; justify-content: flex-end; gap: 4px; .message-status-indicator { display: flex; align-items: center; width: 16px; height: 16px; .error-icon { color: #f44336; font-size: 16px; } .success-icon { color: #4caf50; font-size: 16px; } mdui-circular-progress { width: 16px; height: 16px; } } } } &.received .message-inner { background: $color-dark-surface-container; color: $color-dark-on-surface; border-top-left-radius: 5px; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); border: 1px solid rgba($color-dark-outline-variant, 0.4); position: relative; overflow: hidden; &::before { content: ''; position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: linear-gradient(135deg, rgba($color-dark-primary, 0.05), rgba($color-dark-tertiary, 0.03)); pointer-events: none; z-index: 0; } > * { position: relative; z-index: 1; } } &.received .message-time { color: $color-dark-on-surface-variant; font-weight: 500; .message-status-indicator { .success-icon { color: $color-dark-on-surface-variant; filter: brightness(1.1); } .error-icon { color: #ff6b6b; filter: brightness(1.1); } } } &.sent { margin-left: auto; flex-direction: row-reverse; .message-inner { background: linear-gradient(135deg, color.adjust($color-dark-primary, $lightness: 8%), color.adjust($color-dark-primary-container, $lightness: 5%)); color: $color-dark-on-primary; border-top-right-radius: 5px; box-shadow: 0 0 20px rgba($color-dark-primary, 0.4); border: 1px solid rgba($color-dark-primary, 0.5); position: relative; overflow: hidden; &::before { content: ''; position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: linear-gradient(135deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0.08)); pointer-events: none; z-index: 0; } > * { position: relative; z-index: 1; } } .message-time { color: $color-dark-on-primary; font-weight: 500; .message-status-indicator { .success-icon { color: $color-dark-on-primary; filter: brightness(1.2); } .error-icon { color: #ff6b6b; filter: brightness(1.2); } } } } } } .file-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0, 0, 0, 0.5); z-index: 100; backdrop-filter: blur(20px); .file-overlay-wrapper { border-radius: 30px; outline: 3px dashed $color-dark-primary; outline-offset: -20px; height: 100%; width: 100%; display: flex; align-items: center; justify-content: center; .file-overlay-inner { display: flex; gap: 12px; align-items: center; padding: 12px 16px; background: rgba(18, 18, 18, 0.8); border: 1px solid $color-dark-surface-container-high; border-radius: 12px; color: $color-dark-on-surface; mdui-icon { color: $color-dark-primary; } } } } .chat-input-wrapper { position: relative; margin: 0 10px 10px 10px; .input-group { display: flex; background: $color-dark-surface-container; border-radius: 30px; flex-direction: column; border: 1px solid rgba($color-dark-outline-variant, 0.4); box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1); .contextual-preview { padding: 12px 16px 0 16px; display: flex; align-items: flex-start; gap: 16px; mdui-icon { align-self: center; box-sizing: content-box; } .reply-cancel { margin-left: auto; } } .attachments-preview { align-items: center; .attachments-chips { display: flex; flex-wrap: wrap; gap: 8px; } } .chat-input { flex: 1; display: flex; flex-direction: row; align-items: center; .buttons, .left-buttons { display: flex; flex-direction: row; align-items: center; } .left-buttons { .emoji-btn { margin: 10px; color: $color-dark-on-surface-variant; transition: color 0.2s ease; flex-shrink: 0; align-self: flex-end; &:hover { color: $color-dark-primary; } } } .message-input { flex: 1; padding: 20px 0; border: none; border-radius: 25px; font-size: 1rem; outline: none; caret-color: $color-dark-primary; color: $color-dark-on-surface; background: transparent; resize: none; font: inherit; font-size: 13pt; height: 100%; width: 100%; &::placeholder { color: $color-dark-on-surface-variant; opacity: 0.7; } } .buttons { .send-btn { margin: 10px; width: 50px; height: 50px; border-radius: 50%; background: linear-gradient(135deg, color.adjust($color-dark-primary, $lightness: 8%), color.adjust($color-dark-primary-container, $lightness: 5%)); color: $color-dark-on-primary; border: 1px solid rgba($color-dark-primary, 0.5); cursor: pointer; display: flex; align-items: center; justify-content: center; transition: all 0.25s ease; align-self: flex-end; box-shadow: 0 0 20px rgba($color-dark-primary, 0.4); &:hover { transform: translateY(-2px); box-shadow: 0 0 30px rgba($color-dark-primary, 0.6); } } } } } } } } } // ChatHeader component styles .chat-header-left { .product-name { font-size: 1.8rem; font-weight: 700; background: linear-gradient(45deg, $color-dark-primary, $color-dark-tertiary); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; text-shadow: 0 0 20px rgba($color-dark-primary, 0.5); } .profile { a { display: flex; align-items: center; text-decoration: none; transition: transform 0.3s ease; &:hover { transform: scale(1.05); } img { width: 40px; height: 40px; border-radius: 50%; object-fit: cover; border: 2px solid rgba($color-dark-primary, 0.4); box-shadow: 0 0 15px rgba($color-dark-primary, 0.3); transition: all 0.3s ease; &:hover { box-shadow: 0 0 25px rgba($color-dark-primary, 0.5); border-color: rgba($color-dark-primary, 0.6); } } } } } .message-profile-pic { img { width: 40px; height: 40px; border-radius: 50%; object-fit: cover; border: 2px solid $color-dark-outline; &.loading { opacity: 0.6; cursor: default; } } } .message-username { &.loading { opacity: 0.6; cursor: default; } } .context-menu { position: fixed; background: $color-dark-surface; border-radius: 8px; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3); padding: 0.5rem 0; min-width: 160px; z-index: 1000; &.entering { animation: fadeInDown 0.2s ease forwards; } &.entering-left { animation: fadeInLeft 0.2s ease forwards; } &.entering-up { animation: fadeInUp 0.2s ease forwards; } &.entering-up-left { animation: fadeInUpLeft 0.2s ease forwards; } &.closing { animation: fadeOutUp 0.2s ease forwards; } &.closing-left { animation: fadeOutRight 0.2s ease forwards; } &.closing-up { animation: fadeOutDown 0.2s ease forwards; } &.closing-up-left { animation: fadeOutDownRight 0.2s ease forwards; } .context-menu-item { display: flex; align-items: center; gap: 0.75rem; padding: 0.75rem 1rem; cursor: pointer; color: $color-dark-on-surface; font-size: 0.9rem; transition: background-color 0.2s ease; &:hover { background-color: $color-dark-surface-container; } .material-symbols { font-size: 1.1rem; color: $color-dark-on-surface-variant; } } } // Fullscreen Image Viewer .fullscreen-image-overlay { position: fixed; inset: 0; width: 100vw; height: 100vh; background: rgba(0, 0, 0, 0.6); backdrop-filter: blur(20px); z-index: 9999; opacity: 1; transition: opacity 0.3s ease; &.closing { opacity: 0; } .fullscreen-animated-image { position: absolute; object-fit: contain; border-radius: 12px; box-shadow: 0 20px 40px rgba(0, 0, 0, 0.4); transition: left 0.3s ease, top 0.3s ease, width 0.3s ease, height 0.3s ease; } .fullscreen-controls { position: absolute; display: flex; gap: 8px; &.top-right { top: 12px; right: 12px; } } .progress-wrapper { width: 40px; height: 40px; display: flex; align-items: center; justify-content: center; } } // Emoji Menu Styles .emoji-menu { $transition: cubic-bezier(0.4, 0, 0.2, 1); background: $color-dark-surface-container; border: 1px solid rgba($color-dark-outline-variant, 0.4); border-radius: 16px; box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3); backdrop-filter: blur(20px); width: 320px; height: 400px; overflow: hidden; display: flex; flex-direction: column; transform-origin: bottom left; opacity: 0; transform: translateY(30px); transition: transform 0.25s $transition, opacity 0.25s $transition; user-select: none; &.open { opacity: 1; transform: translateY(0); } .emoji-menu-header { background: $color-dark-surface-container-high; border-bottom: 1px solid rgba($color-dark-outline-variant, 0.2); position: sticky; top: 0; z-index: 1; .emoji-category-tabs { display: flex; gap: 4px; overflow-x: auto; overflow-y: hidden; scroll-behavior: smooth; padding: 8px; &::-webkit-scrollbar { height: 4px; } &::-webkit-scrollbar-track { background: transparent; } &::-webkit-scrollbar-thumb { background-color: $color-dark-surface-container; border-radius: 2px; } &::-webkit-scrollbar-thumb:hover { background-color: $color-dark-surface-container-high; } .emoji-category-tab { background: transparent; border: none; border-radius: 10px; padding: 8px; cursor: pointer; transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); font-size: 1.2rem; min-width: 40px; height: 40px; display: flex; align-items: center; justify-content: center; position: relative; overflow: hidden; &:hover { background: $color-dark-surface-container; } &.active { background: $color-dark-primary-container; color: $color-dark-on-primary-container; transform: scale(1.05); } &::before { content: ''; position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: $color-dark-primary-container; opacity: 0; transition: opacity 0.3s cubic-bezier(0.4, 0, 0.2, 1); border-radius: 8px; } &.active::before { opacity: 1; } span { position: relative; z-index: 1; } } } } .emoji-grid { display: flex; flex-direction: column; flex: 1; overflow-y: auto; scroll-behavior: smooth; &::-webkit-scrollbar { width: 6px; } &::-webkit-scrollbar-track { background: transparent; } &::-webkit-scrollbar-thumb { background-color: $color-dark-surface-container-high; border-radius: 3px; } .emoji-category-section { .emoji-category-title { position: sticky; top: 0; padding-top: 5px; padding-bottom: 5px; padding-left: 12px; padding-right: 12px; font-size: 0.85rem; font-weight: 600; color: $color-dark-on-surface-variant; z-index: 2; margin: 0; backdrop-filter: blur(10px); } .emoji-category-grid { display: flex; flex-direction: row; flex-wrap: wrap; gap: 2px; padding: 8px; } } .emoji-item { $size: 30px; background: transparent; border: none; border-radius: 6px; padding: 5px; cursor: pointer; transition: all 0.15s ease; font-size: $size; width: $size; height: $size; box-sizing: content-box; display: flex; align-items: center; justify-content: center; &:hover { background: $color-dark-surface-container-high; transform: scale(1.1); } &:active { transform: scale(0.95); } } } .emoji-empty-state { padding: 20px; text-align: center; color: $color-dark-on-surface-variant; font-size: 0.9rem; } // Integrated mode styles (inside reaction bar) &.integrated { position: relative !important; width: 320px !important; height: 400px !important; transform: none !important; opacity: 1 !important; box-shadow: none; border: none; background: $color-dark-surface-container; overflow: visible; } }