diff --git "a/frontend/src/App.css" "b/frontend/src/App.css" new file mode 100644--- /dev/null +++ "b/frontend/src/App.css" @@ -0,0 +1,4333 @@ +/* ======================================== + App Layout + ======================================== */ + +/* ======================================== + Premium Header + ======================================== */ +.premium-header { + height: 60px; + display: flex; + align-items: center; + justify-content: space-between; + padding: 0 1.5rem; + background: rgba(var(--bg-canvas-rgb, 255, 255, 255), 0.75); + backdrop-filter: blur(20px); + -webkit-backdrop-filter: blur(20px); + border-bottom: 1px solid var(--border-light); + position: sticky; + top: 0; + z-index: 1000; + transition: transform 0.3s ease, opacity 0.3s ease, box-shadow 0.3s ease; + /* Exclude color/background from transition to prevent flickering on theme switch */ +} + +.dark .premium-header { + background: rgba(9, 9, 11, 0.75); + /* Zinc 950 */ + border-bottom: 1px solid rgba(255, 255, 255, 0.05); +} + +.header-left { + display: flex; + align-items: center; + gap: 1rem; +} + +.brand-wrapper { + display: flex; + align-items: center; + gap: 0.25rem; + cursor: pointer; + padding: 0.5rem 0.75rem; + border-radius: 0.75rem; + transition: background 0.2s; +} + +.brand-wrapper:hover { + background: var(--bg-surface-hover); +} + +.brand-name { + font-family: 'Outfit', sans-serif; + font-size: 1.15rem; + font-weight: 700; + letter-spacing: -0.02em; + color: var(--text-primary); +} + +.brand-version { + color: var(--text-tertiary); + font-weight: 500; + font-size: 0.95rem; + margin-left: 2px; +} + +.brand-dropdown-icon { + color: var(--text-tertiary); +} + +.header-center { + position: absolute; + left: 50%; + transform: translateX(-50%); +} + +.upgrade-pill { + /* Layout & Spacing */ + display: flex; + align-items: center; + gap: 0.6rem; + padding: 0.5rem 1.125rem; + border-radius: 9999px; + + /* Typography - Bold for impact */ + font-size: 0.85rem; + font-weight: 700; + letter-spacing: 0.01em; + + /* Aesthetics (Bold & Sharper) */ + background: linear-gradient(135deg, + rgba(var(--brand-primary-rgb), 0.20) 0%, + rgba(var(--brand-primary-rgb), 0.10) 100%); + color: var(--brand-primary); + border: 1px solid rgba(var(--brand-primary-rgb), 0.45); + + /* Deeper shadow for 3D feel */ + box-shadow: 0 4px 12px rgba(var(--brand-primary-rgb), 0.12); + + /* Rendering & smoothness */ + cursor: pointer; + position: relative; + overflow: hidden; + transition: all 0.4s cubic-bezier(0.2, 0.8, 0.2, 1); + transform: translateZ(0); + /* Hardware accel only, no movement */ + backdrop-filter: blur(8px); + -webkit-backdrop-filter: blur(8px); +} + +/* Dark mode adjustment (Kept subtle) */ +.dark .upgrade-pill { + background: linear-gradient(135deg, + rgba(var(--brand-primary-rgb), 0.15) 0%, + rgba(var(--brand-primary-rgb), 0.05) 100%); + border-color: rgba(var(--brand-primary-rgb), 0.3); + color: rgb(165, 180, 252); + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2); +} + +/* Hover State - Even Bolder */ +.upgrade-pill:hover { + background: linear-gradient(135deg, + rgba(var(--brand-primary-rgb), 0.30) 0%, + rgba(var(--brand-primary-rgb), 0.20) 100%); + border-color: rgba(var(--brand-primary-rgb), 0.7); + box-shadow: + 0 6px 16px rgba(var(--brand-primary-rgb), 0.25), + 0 0 0 1px rgba(var(--brand-primary-rgb), 0.15); + /* Pronounced glow */ + transform: translateZ(0); + /* Still no movement */ + color: var(--brand-hover); +} + +.dark .upgrade-pill:hover { + background: linear-gradient(135deg, + rgba(var(--brand-primary-rgb), 0.25) 0%, + rgba(var(--brand-primary-rgb), 0.1) 100%); + box-shadow: + 0 4px 20px rgba(0, 0, 0, 0.3), + 0 0 15px rgba(var(--brand-primary-rgb), 0.15); +} + +.upgrade-pill:active { + transform: scale(0.97); +} + +.sparkle-icon { + animation: rotateSparkle 2s infinite linear; +} + +@keyframes rotateSparkle { + 0% { + transform: scale(1) rotate(0); + } + + 50% { + transform: scale(1.2) rotate(180deg); + opacity: 0.8; + } + + 100% { + transform: scale(1) rotate(360deg); + } +} + +.header-right { + display: flex; + align-items: center; + gap: 0.75rem; +} + +.header-menu-container { + position: relative; + display: flex; + align-items: center; +} + +.header-dropdown { + top: calc(100% + 0.5rem) !important; + right: 0 !important; + transform-origin: top right; +} + +.header-icon-btn, +.header-action-btn { + background: transparent; + border: none; + color: var(--text-secondary); + cursor: pointer; + border-radius: 0.5rem; + transition: transform 0.2s, opacity 0.2s, box-shadow 0.2s; + display: flex; + align-items: center; + justify-content: center; + outline: none !important; +} + +.header-icon-btn { + width: 2.5rem; + height: 2.5rem; +} + +.header-action-btn { + padding: 0.5rem 0.75rem; + gap: 0.5rem; + font-size: 0.85rem; + font-weight: 500; +} + +.header-icon-btn:hover, +.header-action-btn:hover { + background: var(--bg-surface-hover); + color: var(--text-primary); +} + +.help-btn { + font-family: 'Outfit', sans-serif !important; + font-weight: 600 !important; + height: 2.5rem !important; + /* Match 40px height of other header buttons */ + padding: 0 1rem !important; + display: flex !important; + align-items: center !important; + justify-content: center !important; + gap: 0.5rem !important; + line-height: 1 !important; +} + +.help-btn .btn-label { + margin: 0 !important; + display: inline-block !important; + line-height: normal !important; +} + +.user-avatar-container { + position: relative; + display: flex; + align-items: center; +} + +.user-avatar-wrapper { + width: 2.5rem; + height: 2.5rem; + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + border-radius: 50%; + transition: transform 0.2s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1); + /* Exclude background/color from transition to prevent flickering on theme switch */ +} + +.user-avatar-wrapper:hover, +.user-avatar-wrapper.active { + background: var(--bg-surface-hover); +} + +.user-avatar img { + width: 100%; + height: 100%; + object-fit: cover; +} + +.user-avatar { + width: 2.2rem; + height: 2.2rem; + background: var(--bg-surface); + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + overflow: hidden; + color: var(--text-secondary); + border: 1px solid var(--border-light); + transition: transform 0.2s, opacity 0.2s; + /* Exclude border/background/color from transition to prevent flickering on theme switch */ +} + +.user-avatar-wrapper:hover .user-avatar { + border-color: var(--brand-primary); + color: var(--brand-primary); +} + +.user-dropdown { + top: calc(100% + 0.5rem) !important; + right: 0 !important; + min-width: 220px !important; + transform-origin: top right; +} + +.user-dropdown-header { + padding: 1rem 1.25rem; +} + +.user-info { + display: flex; + flex-direction: column; +} + +.user-name { + font-size: 0.95rem; + font-weight: 700; + color: var(--text-primary); +} + +.user-email { + font-size: 0.8rem; + color: var(--text-tertiary); + margin-top: 2px; +} + +/* Mobile Specific Header Adjustments */ +@media (max-width: 768px) { + .premium-header { + padding: 0 1rem; + height: 56px; + } + + .btn-label { + display: none; + } + + .upgrade-pill { + display: none; + /* Hide upgrade on mobile center to save space */ + } + + .header-center { + display: none; + } + + .brand-name { + font-size: 1rem; + } +} + +.app-container { + display: flex; + height: 100vh; + height: 100dvh; + overflow: hidden; + background: var(--bg-canvas); + color: var(--text-primary); +} + +/* ======================================== + Sidebar + ======================================== */ +.sidebar { + width: 280px; + background: var(--bg-surface); + border-right: 1px solid var(--border-light); + display: flex; + flex-direction: column; + transition: width 0.3s cubic-bezier(0.16, 1, 0.3, 1); + flex-shrink: 0; + overflow: hidden; +} + +.sidebar.collapsed { + width: 70px; +} + +.sidebar-header { + padding: 1rem; + display: flex; + align-items: center; + gap: 0.75rem; + border-bottom: 1px solid transparent; +} + +.history-label.collapsible { + cursor: pointer; + user-select: none; + display: flex; + align-items: center; + justify-content: space-between; + padding: 0 1.5rem 0.5rem; + font-size: 0.8rem; + font-weight: 600; + color: var(--text-tertiary); + transition: color 0.2s ease; +} + +.history-label.collapsible:hover { + color: var(--text-primary); +} + +.history-label.collapsible svg { + opacity: 0.5; + transition: transform 0.2s ease; +} + +/* Sidebar Chat Item Refinements */ +.sidebar-chat-item { + position: relative; + padding: 8px 12px 8px 14px; + /* Tighter padding as requested */ + font-size: 14.2px; + /* Slightly larger for readability */ + font-weight: 500; + color: var(--text-secondary); + display: flex; + align-items: center; + border-radius: 8px; + cursor: pointer; + transition: opacity 0.35s cubic-bezier(0.4, 0, 0.2, 1); + z-index: 1; + /* Base priority */ +} + +.sidebar-chat-item.menu-open { + z-index: 100; + /* Priority elevation when menu is open */ +} + +.active-indicator { + position: absolute; + left: 0; + top: 50%; + transform: translateY(-50%) scaleY(0.7); + /* Subtle pop entry */ + width: 3px; + height: 18px; + background: #3b82f6; + border-radius: 0 4px 4px 0; + opacity: 0; + transition: opacity 0.3s cubic-bezier(0.34, 1.56, 0.64, 1), + transform 0.3s cubic-bezier(0.34, 1.56, 0.64, 1); + z-index: 5; +} + +.sidebar-chat-item.active .active-indicator { + opacity: 1; + transform: translateY(-50%) scaleY(1); +} + +.sidebar-chat-item.active { + background: rgba(59, 130, 246, 0.08); + color: var(--text-primary); + font-weight: 600; +} + +.dark .sidebar-chat-item.active { + background: rgba(59, 130, 246, 0.15); +} + +.sidebar-chat-item:hover:not(.active) { + background: var(--bg-surface-hover); + color: var(--text-primary); +} + +.chat-item-text { + flex: 1; + overflow: hidden; + white-space: nowrap; + text-overflow: clip; + margin-right: 28px; + /* More space between text and actions */ +} + +.chat-item-text.editing { + margin-right: 0; + padding-right: 0; + display: flex; + align-items: center; + width: 100%; +} + +.inline-rename-input { + width: 100%; + background: transparent; + border: none; + border-bottom: 1px solid #3b82f6; + padding: 0; + margin: 0; + font-size: 14.2px; + font-family: inherit; + font-weight: inherit; + color: var(--text-primary); + outline: none; + line-height: inherit; +} + +.dark .inline-rename-input { + border-bottom-color: #3b82f6; +} + +.chat-item-actions { + position: absolute; + right: 8px; + display: flex; + align-items: center; + opacity: 0; + transform: translateX(4px); + /* Slide effect */ + transition: opacity 0.25s cubic-bezier(0.4, 0, 0.2, 1), + transform 0.25s cubic-bezier(0.4, 0, 0.2, 1); + z-index: 10; +} + +.sidebar-chat-item:hover .chat-item-actions, +.sidebar-chat-item.active .chat-item-actions, +.chat-item-actions:has(.chat-menu-dropdown) { + opacity: 1; + transform: translateX(0); +} + +.menu-trigger-btn { + background: none; + border: none; + padding: 2px; + color: var(--text-tertiary); + cursor: pointer; + border-radius: 4px; + display: flex; + align-items: center; + justify-content: center; + transition: color 0.2s ease, background 0.2s ease; +} + +.menu-trigger-btn:hover { + color: var(--text-primary); + background: rgba(0, 0, 0, 0.04); +} + +.dark .menu-trigger-btn:hover { + background: rgba(255, 255, 255, 0.08); +} + +.chat-menu-dropdown { + position: absolute; + top: 100%; + right: 0; + z-index: 1000; + width: 170px; + /* Slightly wider for better spacing */ + background: #ffffff; + border: 1px solid rgba(0, 0, 0, 0.08); + border-radius: 12px; + box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05); + padding: 6px; + margin-top: 6px; + transform-origin: top right; + animation: menuSmoothEntry 0.25s cubic-bezier(0.34, 1.56, 0.64, 1); +} + +.chat-menu-dropdown.placement-top { + top: auto; + bottom: 100%; + margin-top: 0; + margin-bottom: 6px; + transform-origin: bottom right; + animation: menuSmoothEntryUp 0.25s cubic-bezier(0.34, 1.56, 0.64, 1); +} + +@keyframes menuSmoothEntry { + from { + opacity: 0; + transform: scale(0.9) translateY(-6px); + } + + to { + opacity: 1; + transform: scale(1) translateY(0); + } +} + +@keyframes menuSmoothEntryUp { + from { + opacity: 0; + transform: scale(0.9) translateY(6px); + } + + to { + opacity: 1; + transform: scale(1) translateY(0); + } +} + +.dark .chat-menu-dropdown { + background: #2d2d2d; + border-color: rgba(255, 255, 255, 0.1); + box-shadow: 0 4px 25px rgba(0, 0, 0, 0.5); +} + +.menu-item { + width: 100%; + display: flex; + align-items: center; + gap: 12px; + padding: 8px 10px; + border: none; + background: none; + color: #4b5563; + font-size: 14.2px; + font-weight: 500; + border-radius: 6px; + cursor: pointer; + transition: background 0.15s ease; +} + +.dark .menu-item { + color: #d1d5db; +} + +.menu-item:hover { + background: #f3f4f6; +} + +.dark .menu-item:hover { + background: rgba(255, 255, 255, 0.05); +} + +.menu-item.delete { + color: #ef4444; +} + +.menu-item.delete:hover { + background: rgba(239, 68, 68, 0.05); +} + +.menu-separator { + height: 1px; + background: #f3f4f6; + margin: 4px 0; +} + +.dark .menu-separator { + background: rgba(255, 255, 255, 0.05); +} + +@keyframes menuFadeIn { + from { + opacity: 0; + transform: translateY(-4px); + } + + to { + opacity: 1; + transform: translateY(0); + } +} + +.dark .chat-menu-dropdown { + background: var(--bg-sidebar-dropdown, rgba(35, 35, 35, 0.95)); + border-color: rgba(255, 255, 255, 0.08); +} + +.menu-item { + width: 100%; + display: flex; + align-items: center; + gap: 12px; + padding: 8px 12px; + border: none; + background: none; + color: var(--text-secondary); + font-size: 13.5px; + font-weight: 500; + border-radius: 8px; + cursor: pointer; + transition: transform 0.15s ease, opacity 0.15s ease; +} + +.menu-item:hover { + background: var(--bg-surface-hover); + color: var(--text-primary); +} + +.menu-item span { + flex: 1; + text-align: left; +} + +.menu-item svg { + opacity: 0.7; +} + +.menu-item.delete { + color: #ef4444; +} + +.menu-item.delete:hover { + background: rgba(239, 68, 68, 0.1); +} + +.menu-item.delete svg { + opacity: 1; +} + +.menu-separator { + height: 1px; + background: var(--border-sidebar, rgba(0, 0, 0, 0.05)); + margin: 4px 6px; +} + +.dark .menu-separator { + background: rgba(255, 255, 255, 0.08); +} + +.sidebar-toggle, +.icon-btn { + background: transparent; + border: none; + color: var(--text-secondary); + cursor: pointer; + padding: 0.5rem; + border-radius: 0.5rem; + display: flex; + align-items: center; + justify-content: center; + transition: transform 0.2s, opacity 0.2s; +} + +.sidebar-toggle:hover, +.icon-btn:hover { + background: var(--bg-surface-hover); + color: var(--text-primary); +} + +/* Removed old new-chat-btn styles as they are now unified under .nav-item */ + +.conversations-list { + flex: 1; + overflow-y: auto; + padding: 0.5rem 0.75rem; + margin-top: 0.5rem; +} + +.conversation-item { + display: flex; + align-items: center; + gap: 0.75rem; + padding: 0.6rem 0.75rem; + border-radius: 0.5rem; + cursor: pointer; + transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1); + position: relative; + border: 1px solid transparent; + margin-bottom: 2px; +} + +.conv-icon-container { + position: relative; + display: flex; + align-items: center; + justify-content: center; +} + +.pin-hint-icon { + position: absolute; + top: -5px; + right: -5px; + background: var(--brand-primary); + color: white; + border-radius: 50%; + padding: 1px; + border: 1px solid var(--bg-surface); +} + +.sidebar-section-header { + font-size: 0.7rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.05em; + color: var(--text-secondary); + padding: 1rem 0.75rem 0.5rem; + opacity: 0.6; +} + +.sidebar-archived-toggle { + display: flex; + align-items: center; + gap: 0.6rem; + padding: 0.75rem; + margin: 0.5rem 0.75rem; + background: rgba(var(--bg-canvas-rgb), 0.3); + border-radius: 0.5rem; + cursor: pointer; + font-size: 0.8rem; + color: var(--text-secondary); + transition: all 0.2s; + border: 1px dashed var(--border-light); +} + +.sidebar-archived-toggle:hover { + background: var(--bg-surface-hover); + color: var(--text-primary); + border-style: solid; +} + +.conversation-item:hover { + background: var(--bg-surface-hover); +} + +.conversation-item.active { + background: var(--brand-light); + /* Tint active item */ + border-color: rgba(99, 102, 241, 0.1); + /* Subtle color border */ +} + +/* In dark mode we might want a different active state */ +.dark .conversation-item.active { + background: rgba(255, 255, 255, 0.05); + border-color: rgba(255, 255, 255, 0.05); +} + +.conversation-title { + flex: 1; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + font-size: 0.875rem; + color: var(--text-secondary); +} + +.conversation-item.active .conversation-title { + color: var(--text-primary); + font-weight: 500; +} + +.edit-title-input { + flex: 1; + background: var(--bg-canvas); + border: 1px solid var(--brand-primary); + border-radius: 0.25rem; + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + color: var(--text-primary); + outline: none; +} + +.menu-btn { + opacity: 0; + transition: opacity 0.2s; + padding: 0.25rem; + border-radius: 0.25rem; + color: var(--text-tertiary); + background: none; + border: none; + cursor: pointer; +} + +.conversation-item:hover .menu-btn, +.conversation-item.active .menu-btn { + opacity: 1; +} + +.menu-btn:hover { + color: var(--text-primary); + background: var(--bg-surface-hover); +} + +/* Legacy footer removed */ + +.theme-toggle:hover { + background: var(--bg-surface-hover); + color: var(--text-primary); + border-color: var(--border-medium); +} + +/* Context Menu */ +.context-menu { + position: absolute; + right: 0.5rem; + top: 80%; + background: rgba(var(--bg-canvas-rgb), 0.98); + backdrop-filter: blur(24px); + border: 1px solid var(--border-light); + border-radius: 0.5rem; + box-shadow: var(--shadow-lg); + z-index: 1000; + min-width: 140px; + padding: 0.25rem; + animation: popIn 0.15s cubic-bezier(0.16, 1, 0.3, 1); +} + +.dark .context-menu { + background: rgba(18, 18, 21, 0.98); + border-color: rgba(255, 255, 255, 0.12); +} + +.context-menu button { + width: 100%; + display: flex; + align-items: center; + gap: 0.5rem; + padding: 0.5rem 0.75rem; + background: none; + border: none; + cursor: pointer; + font-size: 0.875rem; + color: var(--text-primary); + border-radius: 0.25rem; + transition: background 0.15s; +} + +.context-menu button:hover { + background: var(--bg-surface-hover); +} + +.context-menu button.danger { + color: var(--status-error); +} + +.context-menu button.danger:hover { + background: rgba(239, 68, 68, 0.1); +} + +.context-menu .divider { + height: 1px; + background: var(--border-light); + margin: 0.25rem 0; +} + +/* Premium Rename Input */ +.premium-rename-input { + width: 100%; + padding: 0.25rem 0.6rem; + background: rgba(var(--bg-surface-rgb), 0.5); + backdrop-filter: blur(8px); + border: 1px solid var(--brand-primary); + border-radius: 0.5rem; + color: var(--text-primary); + font-family: inherit; + font-size: inherit; + outline: none; + box-shadow: 0 0 0 2px rgba(99, 102, 241, 0.15); + transition: all 0.2s ease; +} + +.premium-rename-input:focus { + background: var(--bg-surface); + box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.25), var(--shadow-glow); +} + +.dark .premium-rename-input { + background: rgba(var(--bg-surface-rgb), 0.3); + border-color: var(--brand-primary); +} + +.header-rename-input { + max-width: 250px; + height: 32px; + font-weight: 600; +} + +@media (max-width: 768px) { + .header-rename-input { + max-width: 150px; + } +} + +/* Truly Centered Opaque Rename Modal - Scoped to Main Content */ +.rename-modal-overlay { + position: absolute; + /* Scoped to .main-content */ + top: 60px; + /* Below Header */ + left: 0; + right: 0; + bottom: 0; + background: rgba(0, 0, 0, 0.05); + /* Very light overlay, no blur to keep header sharp */ + display: flex; + align-items: center; + justify-content: center; + z-index: 1500; + animation: fadeIn 0.3s ease-out; +} + +.rename-modal-content { + background: var(--bg-canvas); + /* Opaque background */ + width: 90%; + max-width: 440px; + padding: 2.25rem; + border-radius: 1.5rem; + border: 1px solid var(--border-light); + box-shadow: 0 30px 60px -12px rgba(0, 0, 0, 0.3); + animation: modalPop 0.4s cubic-bezier(0.16, 1, 0.3, 1); + position: relative; + overflow: hidden; + margin-top: -30px; + /* Offset the top:60px to center truly in the available session space */ +} + +.dark .rename-modal-content { + background: #18181b; + /* Zinc 900 - Opaque */ + border-color: rgba(255, 255, 255, 0.1); +} + +.rename-modal-title { + font-size: 1.25rem; + font-weight: 800; + margin-bottom: 1.25rem; + color: var(--text-primary); + font-family: 'Outfit', sans-serif; + letter-spacing: -0.02em; +} + +.rename-modal-actions { + display: flex; + justify-content: flex-end; + gap: 0.875rem; + margin-top: 2rem; +} + +.modal-btn { + padding: 0.7rem 1.75rem; + border-radius: 0.75rem; + font-size: 0.95rem; + font-weight: 600; + cursor: pointer; + transition: all 0.25s ease-in-out; + border: none; + font-family: 'Outfit', sans-serif; + letter-spacing: 0.01em; +} + +.modal-btn:active { + transform: scale(0.98); +} + +.modal-btn-cancel { + background: var(--bg-surface-hover); + color: var(--text-secondary); +} + +.modal-btn-cancel:hover { + background: var(--border-light); + color: var(--text-primary); +} + +.modal-btn-save { + background: var(--brand-primary); + color: white; + box-shadow: 0 4px 12px rgba(var(--brand-primary-rgb), 0.2); +} + +.modal-btn-save:hover { + background: var(--brand-hover); + box-shadow: 0 6px 16px rgba(var(--brand-primary-rgb), 0.3); +} + +@keyframes fadeIn { + from { + opacity: 0; + } + + to { + opacity: 1; + } +} + +@keyframes modalPop { + from { + opacity: 0; + transform: translateY(24px) scale(0.96); + } + + to { + opacity: 1; + transform: translateY(0) scale(1); + } +} + +/* ======================================== + Main Content + ======================================== */ +.main-content { + flex: 1; + display: flex; + flex-direction: column; + min-width: 0; + height: 100%; + position: relative; + background: var(--bg-canvas); + overflow-x: hidden; + /* Prevent horizontal scroll on main area */ +} + +.top-bar { + display: none; + /* Desktop default */ + padding: 0.75rem 1rem; + border-bottom: 1px solid var(--border-light); + align-items: center; + gap: 0.5rem; + background: var(--bg-canvas); +} + +/* Loading Bar */ +.loading-bar { + height: 2px; + width: 100%; + background: var(--bg-surface); + overflow: hidden; + position: absolute; + top: 0; + left: 0; + z-index: 50; +} + +.loading-progress { + height: 100%; + width: 30%; + background: linear-gradient(90deg, var(--brand-primary), var(--brand-hover)); + animation: loading 1.5s ease-in-out infinite; +} + +@keyframes loading { + 0% { + transform: translateX(-100%); + } + + 100% { + transform: translateX(400%); + } +} + +/* ======================================== + Messages Area + ======================================== */ +.messages-container { + flex: 1; + overflow-y: auto; + display: flex; + flex-direction: column; + /* scroll-behavior is now handled dynamically in JavaScript to prevent jumps during session switching */ + padding-bottom: 2rem; + overflow-anchor: none; + overflow-x: hidden; + scrollbar-gutter: stable; + overscroll-behavior: contain; +} + +.messages-container.transitioning { + opacity: 0; + pointer-events: none; + transition: opacity 0.1s ease-out; + /* Chỉ chuyển động mờ ảo khi chuyển session */ +} + +/* Container for messages and fixed elements like scroll-to-bottom */ +.messages-section { + flex: 1; + min-height: 0; + /* Important for flex child with overflow */ + position: relative; + display: flex; + flex-direction: column; +} + +/* Specific spotlight for tour to prevent it being too large */ +.tour-chat-spotlight { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 80%; + height: 75%; + pointer-events: none; + z-index: -1; + visibility: hidden; +} + +/* Welcome Screen */ +.welcome-screen { + flex: 1; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + text-align: center; + padding: 2rem; + max-width: 800px; + margin: 0 auto; + width: 100%; + animation: fadeIn 0.5s ease-out; +} + +.welcome-icon { + margin-bottom: 2rem; + filter: drop-shadow(0 10px 15px rgba(99, 102, 241, 0.2)); +} + +.welcome-icon img { + height: 80px; + width: auto; +} + +.welcome-screen h2 { + font-family: 'Outfit', sans-serif; + font-size: 2.5rem; + margin-bottom: 1.25rem; + font-weight: 800; + line-height: 1.1; + background: linear-gradient(135deg, var(--text-primary) 20%, #6366f1); + -webkit-background-clip: text; + background-clip: text; + -webkit-text-fill-color: transparent; + letter-spacing: -0.04em; +} + +.welcome-screen p { + color: var(--text-secondary); + margin-bottom: 2.5rem; + line-height: 1.6; + font-size: 1.1rem; + max-width: 600px; +} + +.example-prompts { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); + gap: 1rem; + width: 100%; + max-width: 800px; +} + +.example-prompts button { + padding: 1rem; + background: var(--bg-surface); + border: 1px solid var(--border-light); + border-radius: 0.75rem; + cursor: pointer; + font-size: 0.9rem; + color: var(--text-secondary); + text-align: left; + transition: transform 0.2s, box-shadow 0.2s, opacity 0.2s; + line-height: 1.5; +} + +.example-prompts button:hover { + background: var(--bg-canvas); + border-color: var(--brand-primary); + color: var(--text-primary); + transform: translateY(-2px); + box-shadow: var(--shadow-md); +} + +/* Messages - Breathable ChatGPT Layout */ +.message { + display: flex; + gap: 0; + padding: 1rem 1rem 1.25rem; + /* More compact vertical padding */ + max-width: 800px; + /* ChatGPT standard width */ + width: 100%; + margin: 0 auto; + transition: all 0.3s cubic-bezier(0.16, 1, 0.3, 1); + position: relative; + border-bottom: 1px solid transparent; + /* Ready for dividers if needed */ +} + +.message:hover { + background: transparent; + /* Remove hover background for a cleaner feel */ +} + +/* User Message - Mirrored to right */ +.message.user { + flex-direction: row-reverse; + background: transparent; +} + +.message.user .message-body { + text-align: right; + display: flex; + flex-direction: column; + align-items: flex-end; +} + +.message.user .message-content { + text-align: left; + background: #f4f4f4; + /* Minimalist ChatGPT light grey */ + padding: 12px 20px; + /* Refined ChatGPT-like padding */ + border-radius: 1.5rem; + /* Fully rounded ChatGPT style */ + display: block; + width: fit-content; + /* Trải chữ ra trước, bọc màu sau */ + max-width: 75%; + /* Giới hạn tối đa 3/4 khu vực chat */ + min-width: 40px; + box-shadow: none; + /* No shadow for flat look */ + word-break: break-word; + white-space: pre-wrap; + align-self: flex-end; +} + +.dark .message.user .message-content { + background: #2f2f2f; + /* Deep grey for dark mode ChatGPT style */ +} + +.message.user .message-footer { + justify-content: flex-end; + /* Căn nút sang phải cho người dùng */ +} + +.message.user .copy-toast { + left: auto; + right: 0; +} + +/* Assistant Message - Open & Frameless */ +.message.assistant { + background: transparent; + border: none; + box-shadow: none; + margin-top: 0; + margin-bottom: 0; +} + +.message-avatar { + width: 2.5rem; + height: 2.5rem; + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; + border-radius: 0.75rem; + background: var(--bg-surface); + box-shadow: 0 4px 10px rgba(0, 0, 0, 0.05); + transition: transform 0.2s; +} + +.message:hover .message-avatar { + transform: scale(1.05); +} + +.message.user .message-avatar { + background: linear-gradient(135deg, #f1f5f9, #e2e8f0); + color: #64748b; + border: 1px solid rgba(0, 0, 0, 0.05); +} + +.message.assistant .message-avatar { + background: linear-gradient(135deg, var(--brand-primary), #818cf8); + color: white; + box-shadow: 0 4px 12px rgba(99, 102, 241, 0.3); +} + +.message-body { + flex: 1; + min-width: 0; +} + +/* Floating Message Actions - Minimalist ChatGPT Style */ +.message-footer { + position: relative; + /* Moved back into flow */ + margin-top: 8px; + display: flex; + align-items: center; + gap: 0.25rem; + opacity: 0; + transition: all 0.2s ease; + z-index: 1; + width: 100%; +} + +.message:hover .message-footer { + opacity: 1; + transform: translateY(0) scale(1); +} + +.footer-actions-right { + display: flex; + gap: 0.25rem; +} + +.footer-btn { + display: flex; + align-items: center; + justify-content: center; + background: transparent; + /* No background by default */ + border: none; + /* No border */ + color: var(--text-tertiary); + cursor: pointer; + padding: 6px; + border-radius: 6px; + transition: all 0.15s ease; + box-shadow: none; + position: relative; + /* Crucial for toast positioning */ +} + +.footer-btn:hover { + background: rgba(var(--brand-primary-rgb), 0.08); + /* Subtle hover bg */ + color: var(--brand-primary); +} + +.footer-btn svg { + color: var(--text-tertiary); + transition: color 0.2s; +} + +.footer-btn:hover svg { + color: var(--brand-primary); +} + +.footer-btn.expand-toggle { + color: var(--brand-primary); +} + +.footer-btn.expand-toggle:hover { + background: rgba(var(--brand-primary-rgb), 0.12); +} + +.footer-btn.copy-btn.copied { + color: var(--status-success); +} + +/* Export Dropdown */ +.export-dropdown-wrapper { + position: relative; +} + +.export-menu { + position: absolute; + bottom: calc(100% + 8px); + left: 0; + background: var(--bg-surface); + border: 1px solid var(--border-light); + border-radius: 0.75rem; + box-shadow: var(--shadow-lg); + padding: 0.5rem; + min-width: 160px; + z-index: 100; + display: flex; + flex-direction: column; + gap: 2px; + animation: menuSmoothEntryUp 0.2s cubic-bezier(0.16, 1, 0.3, 1); +} + +.message.user .export-menu { + left: auto; + right: 0; +} + +.export-menu button { + display: flex; + align-items: center; + gap: 0.75rem; + padding: 0.5rem 0.75rem; + background: transparent; + border: none; + border-radius: 0.5rem; + color: var(--text-secondary); + font-size: 0.85rem; + cursor: pointer; + transition: all 0.2s; + text-align: left; + white-space: nowrap; +} + +.export-menu button:hover { + background: var(--bg-surface-hover); + color: var(--text-primary); +} + +.export-menu button svg { + color: var(--text-tertiary); +} + +.export-menu button:hover svg { + color: var(--brand-primary); +} + +.copy-toast { + position: absolute; + bottom: calc(100% + 4px); + /* Move closer to icon */ + left: 50%; + transform: translateX(-50%); + background: var(--brand-primary); + color: white; + padding: 2px 8px; + /* Slimmer toast */ + border-radius: 4px; + font-size: 0.65rem; + font-weight: 600; + white-space: nowrap; + animation: premiumToast 1.8s cubic-bezier(0.16, 1, 0.3, 1) forwards; + pointer-events: none; + z-index: 100; + box-shadow: 0 4px 12px rgba(99, 102, 241, 0.3), var(--shadow-glow); + letter-spacing: 0.01em; +} + +@keyframes premiumToast { + 0% { + opacity: 0; + transform: translate(-50%, 12px) scale(0.8); + } + + 15% { + opacity: 1; + transform: translate(-50%, 0) scale(1.05); + } + + 20% { + opacity: 1; + transform: translate(-50%, 0) scale(1); + } + + 85% { + opacity: 1; + transform: translate(-50%, 0) scale(1); + } + + 100% { + opacity: 0; + transform: translate(-50%, -20px) scale(0.9); + } +} + +.message-actions button.copied { + color: var(--status-success) !important; + background: rgba(16, 185, 129, 0.1) !important; + border-radius: 0.25rem; +} + +.message-actions button.copied svg { + animation: successPop 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275); + filter: drop-shadow(0 0 4px rgba(16, 185, 129, 0.4)); +} + +@keyframes successPop { + 0% { + transform: scale(0.5) rotate(-20deg); + opacity: 0; + } + + 50% { + transform: scale(1.2) rotate(10deg); + } + + 100% { + transform: scale(1) rotate(0); + opacity: 1; + } +} + +/* Streaming cursor - ChatGPT style */ +.message.assistant.streaming .message-content::after { + content: ''; + display: inline-block; + width: 6px; + height: 1.1em; + background-color: var(--brand-primary); + vertical-align: middle; + margin-left: 4px; + border-radius: 1px; + animation: cursor-blink 0.8s s-curve infinite; +} + +@keyframes cursor-blink { + + 0%, + 100% { + opacity: 1; + } + + 50% { + opacity: 0; + } +} + +/* Smooth fade-in for streamed text bits */ +.message.assistant.streaming .message-content p { + display: inline; +} + +/* Collapsible Content */ +.collapsible-content { + width: 100%; + display: flex; + flex-direction: column; +} + +.message.user .collapsible-content { + align-items: flex-end; +} + +.collapsible-content.truncated .content-inner { + position: relative; + mask-image: linear-gradient(to bottom, black 50%, transparent 100%); + -webkit-mask-image: linear-gradient(to bottom, black 50%, transparent 100%); +} + +/* Collapsible Content - Fade effect refined */ +.collapsible-content.truncated .content-inner { + position: relative; + mask-image: linear-gradient(to bottom, black 60%, transparent 100%); + -webkit-mask-image: linear-gradient(to bottom, black 60%, transparent 100%); +} + +/* ======================================== + Input Container + ======================================== */ +.input-container { + padding: 1rem 1.5rem 2rem; + max-width: 850px; + margin: 0 auto; + width: 100%; + flex-shrink: 0; + background: linear-gradient(to top, var(--bg-canvas) 80%, transparent); + /* Fade out top */ +} + +.input-wrapper { + display: flex; + align-items: center; + gap: 0.75rem; + background: rgba(var(--bg-surface-rgb), 0.7); + backdrop-filter: blur(24px) saturate(160%); + -webkit-backdrop-filter: blur(24px) saturate(160%); + border: 1px solid var(--border-light); + border-radius: 1.25rem; + padding: 0.75rem 1rem; + transition: transform 0.3s cubic-bezier(0.16, 1, 0.3, 1), opacity 0.3s cubic-bezier(0.16, 1, 0.3, 1), box-shadow 0.3s cubic-bezier(0.16, 1, 0.3, 1); + /* Exclude color/background/border from transition to prevent flickering on theme switch */ + box-shadow: 0 8px 32px rgba(0, 0, 0, 0.04), var(--shadow-sm); + position: relative; + z-index: 10; +} + +.input-wrapper:focus-within { + border-color: var(--brand-primary); + background: rgba(var(--bg-canvas-rgb), 0.9); + box-shadow: 0 12px 40px rgba(99, 102, 241, 0.1); +} + +.drag-overlay { + position: absolute; + inset: 0; + background: rgba(var(--brand-primary-rgb, 99, 102, 241), 0.1); + backdrop-filter: blur(12px); + -webkit-backdrop-filter: blur(12px); + z-index: 50; + display: flex; + align-items: center; + justify-content: center; + border-radius: 1rem; + border: 2px dashed var(--brand-primary); + pointer-events: none; + animation: fadeIn 0.2s ease-out; +} + +.drag-content { + display: flex; + align-items: center; + gap: 0.75rem; + padding: 0 1rem; +} + +.drag-icon { + color: var(--brand-primary); + animation: pulseGlow 1.5s infinite ease-in-out; +} + +.drag-text { + font-family: 'Outfit', sans-serif; + font-size: 0.95rem; + font-weight: 500; + color: var(--brand-primary); + letter-spacing: 0.025em; +} + +@keyframes pulseGlow { + 0% { + transform: scale(1); + opacity: 0.8; + filter: drop-shadow(0 0 0px var(--brand-primary)); + } + + 50% { + transform: scale(1.1); + opacity: 1; + filter: drop-shadow(0 0 8px var(--brand-primary)); + } + + 100% { + transform: scale(1); + opacity: 0.8; + filter: drop-shadow(0 0 0px var(--brand-primary)); + } +} + +/* Dark mode specific overlay refinement */ +.dark .drag-overlay { + background: rgba(0, 0, 0, 0.4); + border-color: var(--brand-primary); +} + +.attach-btn { + width: 2.25rem; + height: 2.25rem; + border-radius: 50%; + background: transparent; + border: none; + color: var(--text-secondary); + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + transition: all 0.2s; +} + +.attach-btn:hover { + background: var(--bg-surface-hover); + color: var(--text-primary); +} + +.input-wrapper textarea { + flex: 1; + background: transparent; + border: none; + outline: none; + resize: none; + color: var(--text-primary); + font-family: inherit; + font-size: 1rem; + line-height: 1.5; + padding: 0.35rem 0.25rem; + max-height: 200px; + min-height: 24px; +} + +.input-wrapper textarea::placeholder { + color: var(--text-tertiary); +} + +.send-btn { + width: 2.25rem; + height: 2.25rem; + border-radius: 0.5rem; + /* Rounded rect looks more modern than circle sometimes, but let's stick to circle or soft square */ + border-radius: 50%; + background: var(--brand-primary); + color: white; + border: none; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + transition: transform 0.2s, opacity 0.2s, box-shadow 0.2s; + /* Exclude color/background from transition to prevent flickering on theme switch */ + flex-shrink: 0; +} + +.send-btn:hover:not(:disabled) { + background: var(--brand-hover); + transform: scale(1.05); +} + +.send-btn:disabled { + background: var(--bg-surface-hover); + color: var(--text-tertiary); + cursor: not-allowed; +} + +.input-hint { + text-align: center; + font-size: 0.75rem; + color: var(--text-tertiary); + margin-top: 0.75rem; +} + +/* Upload Previews */ +/* Image Attachment Area */ +.image-attachment-area { + background: rgba(var(--bg-surface-rgb), 0.6); + backdrop-filter: blur(8px); + -webkit-backdrop-filter: blur(8px); + border: 1px solid var(--border-light); + border-radius: 1rem; + padding: 0.75rem; + margin-bottom: 0.75rem; + animation: slideUp 0.3s ease-out; +} + +.attachment-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 0.5rem; + padding-bottom: 0.5rem; + border-bottom: 1px solid var(--border-light); +} + +.attachment-counter { + font-size: 0.8rem; + color: var(--text-secondary); +} + +.attachment-counter strong { + color: var(--brand-primary); +} + +.clear-all-btn { + background: transparent; + border: none; + color: var(--status-error); + font-size: 0.75rem; + font-weight: 500; + cursor: pointer; + padding: 2px 6px; + border-radius: 4px; + transition: background 0.2s; +} + +.clear-all-btn:hover { + background: rgba(239, 68, 68, 0.1); + /* Based on status-error red */ +} + +.uploaded-images-preview { + display: flex; + gap: 0.75rem; + overflow-x: auto; + padding: 0.25rem 0; + scrollbar-width: thin; +} + +.preview-item { + position: relative; + width: 72px; + height: 72px; + flex-shrink: 0; + border-radius: 0.75rem; + overflow: hidden; + border: 2px solid var(--bg-surface); + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); + background: var(--bg-canvas); + transition: transform 0.2s cubic-bezier(0.16, 1, 0.3, 1); +} + +.preview-item.clickable { + cursor: pointer; +} + +.preview-item.clickable:hover { + transform: scale(1.05); +} + +/* Message Image Previews (Compact) */ +.message-images-list { + display: flex; + gap: 0.75rem; + margin-bottom: 0.25rem; + overflow-x: auto; + padding-bottom: 4px; + /* Tiny bit of room for shadow/border */ + scrollbar-width: none; + max-width: 100%; +} + +/* Bring text closer to images when they exist - but not squashed, and keep it centered */ +.message-images-list+.collapsible-content .message-content { + padding: 10px 20px !important; +} + +.message-images-list+.collapsible-content .message-content p:first-child { + margin-top: 0 !important; +} + +.message-images-list::-webkit-scrollbar { + display: none; +} + +.message-image-preview { + position: relative; + width: 84px; + height: 84px; + flex-shrink: 0; + border-radius: 0.75rem; + overflow: hidden; + border: 1px solid var(--border-light); + box-shadow: var(--shadow-sm); + cursor: pointer; + background: var(--bg-surface); + transition: all 0.2s cubic-bezier(0.16, 1, 0.3, 1); +} + +.message-image-preview:hover { + transform: scale(1.05); + border-color: var(--brand-primary); + box-shadow: 0 4px 12px rgba(99, 102, 241, 0.15); +} + +.message-image-preview img { + width: 100%; + height: 100%; + object-fit: cover; + transition: opacity 0.2s; +} + +.message-image-preview:hover img { + opacity: 0.9; +} + +.remove-img-btn { + position: absolute; + top: 4px; + right: 4px; + background: rgba(0, 0, 0, 0.6); + backdrop-filter: blur(4px); + color: white; + border: none; + border-radius: 50%; + width: 20px; + height: 20px; + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + transition: all 0.2s; + z-index: 2; +} + +.remove-img-btn:hover { + background: #ef4444; + /* status-error */ + transform: scale(1.1); +} + +/* Error Toast */ +.upload-error-toast { + position: absolute; + bottom: calc(100% + 1rem); + left: 50%; + transform: translateX(-50%); + background: #ef4444; + color: white; + padding: 0.5rem 1rem; + border-radius: 2rem; + font-size: 0.85rem; + font-weight: 500; + white-space: nowrap; + box-shadow: var(--shadow-lg); + z-index: 100; + animation: fadeInUp 0.3s ease-out; +} + +@keyframes slideUp { + from { + opacity: 0; + transform: translateY(10px); + } + + to { + opacity: 1; + transform: translateY(0); + } +} + +/* Premium Image Viewer Overlay - Ultra-thin and blurred */ +.premium-viewer-overlay { + position: fixed; + inset: 0; + background: rgba(var(--bg-canvas-rgb), 0.15); + /* Even thinner background */ + backdrop-filter: blur(60px) saturate(200%); + /* Consistent saturation for color vibrance */ + -webkit-backdrop-filter: blur(60px) saturate(200%); + z-index: 2000; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + animation: fadeInOverlay 0.6s cubic-bezier(0.16, 1, 0.3, 1); + padding: 2rem; +} + +.premium-viewer-overlay.is-restored { + animation: none !important; +} + +@keyframes fadeInOverlay { + from { + opacity: 0; + backdrop-filter: blur(0px); + } + + to { + opacity: 1; + backdrop-filter: blur(60px) saturate(200%); + -webkit-backdrop-filter: blur(60px) saturate(200%); + } +} + +.viewer-top-bar { + position: absolute; + top: 1.5rem; + left: 1.5rem; + right: 1.5rem; + height: 64px; + background: rgba(var(--bg-surface-rgb), 0.4); + border: 1px solid var(--border-light); + border-radius: 1.25rem; + backdrop-filter: blur(24px) saturate(160%); + -webkit-backdrop-filter: blur(24px) saturate(160%); + display: flex; + align-items: center; + justify-content: space-between; + padding: 0 1.5rem; + z-index: 2010; + box-shadow: 0 8px 32px rgba(0, 0, 0, 0.08), var(--shadow-sm); +} + +.viewer-info { + color: var(--text-primary); + font-size: 0.95rem; + font-weight: 600; + font-family: 'Outfit', sans-serif; + letter-spacing: 0.02em; +} + +.viewer-actions { + display: flex; + align-items: center; + gap: 0.5rem; +} + +.viewer-actions button { + background: transparent; + border: 1px solid transparent; + color: var(--text-secondary); + width: 40px; + height: 40px; + border-radius: 12px; + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + transition: all 0.25s cubic-bezier(0.16, 1, 0.3, 1); +} + +.viewer-actions button:hover { + background: var(--bg-surface-hover); + color: var(--brand-primary); + border-color: var(--border-light); + transform: none; + /* Removed jumpy translateY */ +} + +.viewer-divider { + width: 1px; + height: 24px; + background: var(--border-light); + margin: 0 0.5rem; +} + +.viewer-close-btn { + background: rgba(var(--status-error-rgb, 239, 68, 68), 0.1) !important; + color: var(--status-error) !important; +} + +.viewer-close-btn:hover { + background: var(--status-error) !important; + color: white !important; + border-color: transparent !important; +} + +.viewer-image-container { + flex: 1; + width: 100%; + display: flex; + align-items: center; + justify-content: center; + overflow: hidden; + margin: 4rem 0; + position: relative; +} + +/* Layered glows for depth and theme coordination */ +.viewer-image-container::before { + content: ''; + position: absolute; + width: 80%; + height: 80%; + background: radial-gradient(circle, rgba(99, 102, 241, 0.15) 0%, transparent 60%); + pointer-events: none; + z-index: -1; + animation: pulseGlowViewer 8s infinite alternate ease-in-out; +} + +.viewer-image-container::after { + content: ''; + position: absolute; + width: 100%; + height: 100%; + background: radial-gradient(circle at 50% 50%, rgba(var(--brand-primary-rgb), 0.05) 0%, transparent 80%); + pointer-events: none; + z-index: -1; +} + +@keyframes pulseGlowViewer { + 0% { + transform: scale(1) opacity(0.5); + } + + 100% { + transform: scale(1.2) opacity(0.8); + } +} + +.viewer-main-image { + max-width: 90vw; + max-height: 75vh; + object-fit: contain; + border-radius: 1.5rem; + border: 1px solid rgba(var(--brand-primary-rgb), 0.1); + box-shadow: 0 40px 100px rgba(0, 0, 0, 0.3), 0 0 40px rgba(var(--brand-primary-rgb), 0.1); + user-select: none; + pointer-events: auto; + background: var(--bg-canvas); + transition: transform 0.3s cubic-bezier(0.16, 1, 0.3, 1); +} + +/* Nav Buttons */ +.viewer-nav-btn { + position: absolute; + top: 50%; + transform: translateY(-50%); + background: rgba(var(--bg-surface-rgb), 0.6); + border: 1px solid var(--border-light); + color: var(--text-primary); + width: 64px; + height: 64px; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + transition: all 0.3s cubic-bezier(0.16, 1, 0.3, 1); + z-index: 2005; + backdrop-filter: blur(12px); + -webkit-backdrop-filter: blur(12px); + box-shadow: var(--shadow-md); +} + +.viewer-nav-btn:hover { + background: var(--brand-primary); + color: white; + border-color: transparent; + box-shadow: 0 0 20px rgba(var(--brand-primary-rgb), 0.3); +} + +.viewer-nav-btn:active { + scale: 0.95; +} + +.viewer-nav-btn.prev { + left: 2rem; +} + +.viewer-nav-btn.next { + right: 2rem; +} + +/* Thumbnails Strip */ +.viewer-thumbnails-strip { + position: absolute; + bottom: 2rem; + left: 50%; + transform: translateX(-50%); + display: flex; + gap: 0.75rem; + padding: 0.65rem; + background: rgba(var(--bg-surface-rgb), 0.6); + backdrop-filter: blur(24px) saturate(160%); + -webkit-backdrop-filter: blur(24px) saturate(160%); + border: 1px solid var(--border-light); + border-radius: 1.25rem; + z-index: 2010; + box-shadow: 0 12px 40px rgba(0, 0, 0, 0.12), var(--shadow-sm); +} + +.viewer-thumb-item { + width: 52px; + height: 52px; + border-radius: 10px; + overflow: hidden; + cursor: pointer; + border: 2px solid transparent; + transition: all 0.3s cubic-bezier(0.16, 1, 0.3, 1); + opacity: 0.5; + background: var(--bg-canvas); +} + +.viewer-thumb-item:hover { + opacity: 1; + transform: translateY(-4px) scale(1.1); +} + +.viewer-thumb-item.active { + opacity: 1; + border-color: var(--brand-primary); + box-shadow: 0 0 15px rgba(var(--brand-primary-rgb), 0.4); + transform: translateY(-4px) scale(1.1); +} + +.viewer-thumb-item img { + width: 100%; + height: 100%; + object-fit: cover; +} + +@keyframes fadeIn { + from { + opacity: 0; + } + + to { + opacity: 1; + } +} + +/* === ChatGPT-Style Sidebar Redesign === */ +.sidebar-container { + width: 260px; + height: 100vh; + background: var(--bg-sidebar); + border-right: 1px solid var(--border-light); + display: flex; + flex-direction: column; + transition: width 0.35s cubic-bezier(0.4, 0, 0.2, 1); + z-index: 1000; + position: relative; + overflow: hidden; + will-change: width; + box-sizing: border-box; + /* Performance optimization */ + transform: translateZ(0); + backface-visibility: hidden; +} + +:root { + --bg-sidebar: #f9f9f9; +} + +.dark { + --bg-sidebar: #171717; +} + +/* Removing sidebar-reopen-btn as we now use a slim sidebar state */ + +.sidebar-container.closed { + width: 60px; + /* Slimmer width as requested */ + transform: none; + opacity: 1; +} + +/* Restored original smooth transition for all text-like elements */ +.nav-item span, +.nav-item-pill span, +.brand-name, +.profile-info, +.profile-name, +.profile-plan, +.chat-item-text, +.chat-item-text span, +.chat-pin-icon, +.history-label span, +.history-label svg, +.upgrade-btn { + transition: opacity 0.35s cubic-bezier(0.4, 0, 0.2, 1), transform 0.35s cubic-bezier(0.4, 0, 0.2, 1); + white-space: nowrap; + opacity: 1; +} + +/* Transitions for elements with dynamic opacity (active/hover) */ +.active-indicator, +.chat-item-actions { + transition: opacity 0.35s cubic-bezier(0.4, 0, 0.2, 1), transform 0.35s cubic-bezier(0.4, 0, 0.2, 1); +} + +/* Final Unified Alignment: 68px (bar) - 20px (margins) = 48px inner. Center = 24px. Icon 32px? wait. + Margin: 10px left. Padding-left: 8px. Total 18px left. Icon 32px. + 18 + 32 = 50px right edge of icon. + 68 width. 18px remaining on right. + So 18px Left space, 18px Right space. Perfect center! +*/ +/* Unified constant geometry for open/closed states */ +.sidebar-container.closed .sidebar-brand, +.sidebar-container.closed .nav-item, +.sidebar-container.closed .nav-item-pill, +.sidebar-container.closed .profile-section, +.sidebar-container.closed .collapsed-footer-actions { + margin: 2px 8px !important; + width: calc(100% - 16px) !important; + justify-content: flex-start !important; +} + +.sidebar-container.closed .nav-item, +.sidebar-container.closed .nav-item-pill { + padding-left: 12px !important; +} + +.sidebar-container.closed .sidebar-brand, +.sidebar-container.closed .profile-section { + padding-left: 6px !important; +} + +.sidebar-container.closed .nav-item-icon { + margin: 0 !important; + width: 20px !important; + min-width: 20px !important; + height: 20px !important; + display: flex; + align-items: center; + justify-content: center; + transform: none !important; +} + +.sidebar-container.closed .profile-avatar, +.sidebar-container.closed .brand-logo { + margin: 0 !important; + width: 32px !important; + min-width: 32px !important; + height: 32px !important; + transform: none !important; + /* Avatar must stay stationary when sidebar closes */ + display: flex; + align-items: center; + justify-content: center; + transform: none !important; +} + +/* Merged and stabilized icons */ + +.sidebar-container.closed .brand-name, +.sidebar-container.closed .nav-item span, +.sidebar-container.closed .nav-item-pill span, +.sidebar-container.closed .profile-info, +.sidebar-container.closed .chat-item-text, +.sidebar-container.closed .chat-item-text span, +.sidebar-container.closed .chat-pin-icon, +.sidebar-container.closed .history-label span, +.sidebar-container.closed .history-label svg, +.sidebar-container.closed .upgrade-btn, +.sidebar-container.closed .profile-name, +.sidebar-container.closed .profile-plan, +.sidebar-container.closed .active-indicator, +.sidebar-container.closed .chat-item-actions { + opacity: 0; + pointer-events: none; + transform: translateX(-15px); + transition: opacity 0.35s cubic-bezier(0.4, 0, 0.2, 1), transform 0.35s cubic-bezier(0.4, 0, 0.2, 1); +} + +/* Toggle button: only visible when sidebar is open */ +.toggle-sidebar-trigger { + cursor: pointer; + color: var(--text-tertiary); + transition: background 0.25s ease, color 0.2s ease, box-shadow 0.25s ease, transform 0.2s ease; + padding: 10px; + border-radius: 12px; + display: flex; + align-items: center; + justify-content: center; + background: transparent; + border: 1px solid transparent; + position: relative; +} + +.toggle-sidebar-trigger:hover { + color: var(--text-primary); + background: var(--bg-surface-hover); + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.04); +} + +.dark .toggle-sidebar-trigger:hover { + background: rgba(255, 255, 255, 0.12); + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2); +} + +.toggle-sidebar-trigger:active { + opacity: 0.7; + transform: scale(0.96); +} + +.toggle-sidebar-trigger svg { + transition: color 0.25s ease; +} + +/* Hide toggle button when sidebar is closed */ +.sidebar-container.closed .toggle-sidebar-trigger { + display: none; +} + +/* Handle chat item background independently to avoid double-opacity fade */ +.sidebar-container.closed .sidebar-chat-item { + background: transparent !important; + pointer-events: none; +} + +.sidebar-container.closed .sidebar-top-nav { + padding: 0; +} + +.sidebar-container.closed .nav-header { + justify-content: flex-start; + padding: 0; + position: relative; + /* Anchor for absolute toggle button */ +} + +/* Clickable area when sidebar is closed - from "Dự án" down to footer (but not including footer) */ +.sidebar-clickable-area { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + cursor: pointer; + pointer-events: auto; + z-index: 1; + /* Covers only sidebar-history area, not footer */ +} + +/* Hide clickable area when sidebar is open */ +.sidebar-container.open .sidebar-clickable-area { + display: none; +} + +/* When sidebar is closed, ensure nav items and header don't block clicks */ +.sidebar-container.closed .nav-header { + position: relative; + z-index: 10; + pointer-events: auto; +} + +.sidebar-container.closed .nav-list { + position: relative; + z-index: 10; + pointer-events: auto; +} + +/* sidebar-history should allow clicks to pass through when closed */ +.sidebar-container.closed .sidebar-history { + position: relative; + z-index: 6; + pointer-events: none; + /* Allow clicks to pass through to clickable area */ +} + +/* Footer should not be clickable when sidebar is closed */ +.sidebar-container.closed .sidebar-footer { + position: relative; + z-index: 10; + pointer-events: auto; + /* Footer keeps its normal functionality */ +} + +/* sidebar-history should keep pointer-events: none when closed for fade effect */ + +/* Logo stays stationary during all transitions */ +.sidebar-brand { + transition: opacity 0.2s ease, transform 0.2s ease; + transform: none !important; + /* Always stationary */ +} + +.sidebar-container.closed .sidebar-brand { + opacity: 1; + transform: none !important; + /* Keep stationary and visible by default */ +} + +/* Logo always visible when sidebar is closed */ + +/* Profile avatar stays stationary during all transitions */ +.profile-avatar { + transform: none !important; + /* Avatar never moves */ + transition: none !important; +} + +.profile-section { + transform: none !important; + /* Profile section never moves */ + transition: background 0.2s ease; + /* Only allow background color transitions */ +} + +.sidebar-inner { + flex: 1; + display: flex; + flex-direction: column; + height: 100%; + position: relative; +} + +/* --- Top Navigation --- */ +/* --- Top Navigation --- */ +.sidebar-top-nav { + padding: 0; + /* Removing padding to prevent jump */ +} + +.nav-header { + height: 60px; + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 0.5rem; + padding: 0; + /* Removed padding to ensure logo is stationary at 30px center */ + position: relative; + /* Anchor for absolute toggle button when closed */ +} + +.sidebar-brand { + display: flex; + align-items: center; + gap: 6px; + cursor: pointer; + padding-left: 6px; + /* Constant anchor */ + margin: 0 8px; + /* Constant margin */ + height: 40px; + /* Enforce height */ +} + +.brand-logo { + width: 32px !important; + height: 32px !important; + min-width: 32px !important; + min-height: 32px !important; + flex: 0 0 32px !important; + aspect-ratio: 1 / 1 !important; + border-radius: 10px; + object-fit: cover; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); + transform: translateY(-0.5px); + /* Optical adjustment to center with text */ +} + +.sidebar-brand .brand-name { + font-family: 'Outfit', sans-serif; + font-weight: 700; + font-size: 1.15rem; + color: var(--text-primary); + letter-spacing: -0.02em; + min-width: 0; +} + +.toggle-sidebar-trigger { + cursor: pointer; + color: var(--text-tertiary); + transition: background 0.25s ease, color 0.2s ease, box-shadow 0.25s ease, transform 0.2s ease; + padding: 10px; + border-radius: 12px; + display: flex; + align-items: center; + justify-content: center; + background: transparent; + border: 1px solid transparent; + position: relative; +} + +.toggle-sidebar-trigger:hover { + color: var(--text-primary); + background: var(--bg-surface-hover); + /* Standardized hover for distinct area */ + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.04); +} + +.dark .toggle-sidebar-trigger:hover { + background: rgba(255, 255, 255, 0.12); + /* Slightly clearer in dark mode */ + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2); +} + +.toggle-sidebar-trigger:active { + opacity: 0.7; + transform: scale(0.96); +} + +.toggle-sidebar-trigger svg { + transition: color 0.25s ease; +} + +/* Static hover: no translation or scaling */ +.toggle-sidebar-trigger:hover svg { + transform: none; +} + +/* Cleaned up conflicting overrides */ + +/* Base class for all unified nav items */ +.nav-item, +.nav-item-pill { + display: flex; + align-items: center; + gap: 0.75rem; + padding: 0 12px; + /* Constant padding */ + margin: 2px 8px; + /* Constant margin */ + height: 44px; + flex-shrink: 0; + border-radius: 10px; + overflow: hidden; + /* Prevent text wrapping during transition */ + transition: all 0.35s cubic-bezier(0.4, 0, 0.2, 1); + color: #475569; + /* Slate 600 for better contrast in light mode */ + font-size: 0.85rem; + font-weight: 600; + /* Bolder as requested */ + width: calc(100% - 16px); + /* Constant width logic */ + text-align: left; + background: transparent; + border: none; + cursor: pointer; +} + +.dark .nav-item, +.dark .nav-item-pill { + color: var(--text-secondary); + /* Retain zinc-400 for dark mode */ +} + +.nav-item:hover, +.nav-item-pill:hover:not(.disabled) { + background: var(--bg-surface-hover); + /* Darker hover for clarity in light mode */ + color: var(--text-primary); +} + +.dark .nav-item:hover, +.dark .nav-item-pill:hover:not(.disabled) { + background: var(--bg-surface-hover); +} + +.nav-item-pill.disabled { + opacity: 0.5; + cursor: not-allowed; +} + +.shortcut-hint { + margin-left: auto; + font-size: 0.75rem; + color: var(--text-secondary); + background: rgba(var(--bg-canvas-rgb), 0.3); + padding: 3px 9px; + border-radius: 6px; + border: 1px solid var(--border-medium); + opacity: 0; + transform: translateX(4px); + transition: all 0.2s ease; + font-weight: 700; + letter-spacing: 0.04em; + pointer-events: none; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + line-height: 1; +} + +.nav-item:hover .shortcut-hint, +.context-menu button:hover .shortcut-hint { + opacity: 1; + transform: translateX(0); +} + +.dark .shortcut-hint { + background: rgba(255, 255, 255, 0.08); + border-color: rgba(255, 255, 255, 0.15); + color: var(--text-secondary); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2); +} + +.dark .nav-item:hover .shortcut-hint, +.dark .context-menu button:hover .shortcut-hint { + color: var(--text-primary); + border-color: rgba(255, 255, 255, 0.3); + background: rgba(255, 255, 255, 0.12); +} + +/* Specific icon colors for unified nav items */ +.nav-item .nav-item-icon, +.nav-item-pill .nav-item-icon { + color: #64748b; + /* Slate 500 for better contrast in light mode */ +} + +.dark .nav-item .nav-item-icon, +.dark .nav-item-pill .nav-item-icon { + color: var(--text-tertiary); +} + +.nav-item:hover .nav-item-icon, +.nav-item-pill:hover:not(.disabled) .nav-item-icon { + color: var(--brand-primary, #6366f1); +} + +.dark .nav-item:hover .nav-item-icon, +.dark .nav-item-pill:hover:not(.disabled) .nav-item-icon { + color: var(--brand-primary, #818cf8); +} + +.nav-item-icon { + display: flex; + align-items: center; + justify-content: center; + width: 20px; + transition: transform 0.2s; +} + +/* Unified hover icon behavior */ +.nav-item:hover .nav-item-icon, +.nav-item-pill:hover .nav-item-icon { + color: var(--brand-primary, #6366f1); +} + +.nav-item:active { + transform: scale(0.98); +} + +.badge-new { + font-size: 0.65rem; + background: rgba(99, 102, 241, 0.1); + color: #6366f1; + padding: 2px 8px; + border-radius: 999px; + margin-left: auto; + font-weight: 700; + letter-spacing: 0.02em; +} + +/* Removed search-btn overrides to maintain consistency across all nav items */ + +.dark .badge-new { + background: rgba(99, 102, 241, 0.2); + color: #818cf8; +} + +/* --- Chat History --- */ +.sidebar-history { + flex: 1; + display: flex; + flex-direction: column; + overflow: hidden; + margin-top: 1rem; + position: relative; + margin-left: 8px; + /* Added margin to show tour borders on the left */ +} + +/* Removed global opacity to allow individual fading */ +.sidebar-container.closed .sidebar-history { + pointer-events: none; +} + +.sidebar-container.closed .history-scroll-area { + overflow: hidden; +} + +.history-label { + padding: 0 1rem 0.5rem; + /* Balanced with 8px margin */ + font-size: 0.75rem; + font-weight: 600; + color: var(--text-tertiary); + text-transform: none; +} + +.history-scroll-area { + flex: 1; + overflow-y: auto; + padding: 0 0.75rem 1rem; +} + +.history-section { + display: flex; + flex-direction: column; + gap: 2px; +} + +.history-empty { + padding: 2rem 1rem; + /* Balanced with 8px margin */ + text-align: center; + color: var(--text-tertiary); + font-size: 0.85rem; + font-style: italic; +} + + +/* --- Profile Footer --- */ +.sidebar-footer { + padding: 0.5rem 0 1.25rem; + /* Lowered the divider line by reducing top padding */ + border-top: 1px solid var(--border-light); + background: var(--bg-sidebar); + transition: transform 0.35s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.35s cubic-bezier(0.4, 0, 0.2, 1), padding 0.35s cubic-bezier(0.4, 0, 0.2, 1); + /* Exclude color/background/border from transition to prevent flickering on theme switch */ + display: flex; + flex-direction: column-reverse; + /* Pin the 1st DOM child (Profile) to absolute bottom */ + gap: 0; + /* Gap managed by margins of children to avoid jumping */ +} + +.sidebar-container.closed .sidebar-footer { + padding: 0.75rem 0; + gap: 0; +} + +.collapsed-footer-actions { + display: flex; + flex-direction: column; + padding-bottom: 8px; + /* Constant spacing from avatar below */ + transition: all 0.35s cubic-bezier(0.4, 0, 0.2, 1); + max-height: 100px; + opacity: 1; + overflow: hidden; +} + +.sidebar-container.open .collapsed-footer-actions { + max-height: 0; + opacity: 0; + margin: 0; + pointer-events: none; +} + +.footer-icon-btn { + width: 24px !important; + height: 24px !important; + min-width: 24px !important; + flex: 0 0 24px !important; + padding-left: 10px; + display: flex; + align-items: center; + justify-content: center; + border-radius: 8px; + color: var(--text-tertiary); + background: transparent; + border: none; + cursor: pointer; + transition: opacity 0.35s cubic-bezier(0.4, 0, 0.2, 1), transform 0.35s cubic-bezier(0.4, 0, 0.2, 1), background 0.2s, color 0.2s; + opacity: 1; +} + +.sidebar-container.open .footer-icon-btn { + width: 40px; + height: 40px; + border-radius: 12px; +} + +/* Center icon when sidebar is closed and fade it out */ +.sidebar-container.closed .footer-icon-btn { + padding-left: 0 !important; + margin: 0 auto; + opacity: 0; + pointer-events: none; + transform: translateX(-15px); +} + +.footer-icon-btn:hover { + background: var(--bg-surface-hover); + color: var(--text-primary); +} + +.profile-section { + display: flex; + align-items: center; + gap: 12px; + /* Increased gap for balanced spacing */ + padding: 0 0 0 6px; + /* Vertical padding removed, using fixed height */ + margin: 0 8px; + width: calc(100% - 16px); + height: 52px !important; + /* Strictly fixed height */ + min-height: 52px !important; + max-height: 52px !important; + border-radius: 0.75rem; + cursor: pointer; + transition: background 0.2s ease; + /* Only background transitions, no transform */ + overflow: hidden; + flex-shrink: 0; + transform: none !important; + /* Profile section never moves */ +} + +/* Merged with base profile-section rules and unified alignment */ + +.profile-section:hover { + background: var(--bg-surface-hover); +} + +.profile-avatar { + width: 32px !important; + height: 32px !important; + min-width: 32px !important; + min-height: 32px !important; + max-width: 32px !important; + max-height: 32px !important; + flex: 0 0 32px !important; + aspect-ratio: 1 / 1 !important; + flex-shrink: 0 !important; + border-radius: 50%; + overflow: hidden; + background: var(--bg-surface); + display: flex; + align-items: center; + justify-content: center; + transform: none !important; + /* Avatar never moves - keep stationary */ + transition: none !important; + /* No transitions on avatar */ + backface-visibility: hidden; +} + +.avatar-circle { + width: 32px; + height: 32px; + border-radius: 50%; + background: #7c3aed; + /* Example purple */ + color: white; + display: flex; + align-items: center; + justify-content: center; + font-size: 0.875rem; + font-weight: 700; +} + +.avatar-circle.small { + width: 100%; + height: 100%; + font-size: 0.9rem; + border-radius: 50%; +} + +.profile-info { + flex: 1; + min-width: 0; +} + +.profile-name { + font-size: 0.875rem; + font-weight: 700; + /* Bolder for prominence */ + color: var(--text-primary); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + line-height: 1.2; +} + +.profile-plan { + font-size: 0.75rem; + font-weight: 500; + color: var(--text-tertiary); + opacity: 0.8; +} + +.upgrade-btn { + font-size: 0.75rem; + font-weight: 600; + padding: 4px 10px; + border-radius: 12px; + border: 1px solid var(--border-light); + background: var(--bg-surface); + color: var(--text-primary); + transition: transform 0.2s, opacity 0.2s, box-shadow 0.2s; + /* Exclude color/background/border from transition to prevent flickering on theme switch */ + flex-shrink: 0; +} + +.upgrade-btn:hover { + background: var(--text-primary); + color: var(--bg-surface); + border-color: var(--text-primary); +} + +/* Modal centered */ +.modal-overlay.centered { + position: fixed; + inset: 0; + z-index: 2000; + display: flex; + align-items: center; + justify-content: center; + background: rgba(0, 0, 0, 0.4); + backdrop-filter: blur(8px); + padding: 1.5rem; + animation: fadeIn 0.3s ease-out; +} + +.glass { + background: var(--bg-modal); + backdrop-filter: blur(32px); + -webkit-backdrop-filter: blur(32px); + border: 1px solid var(--border-light); + box-shadow: 0 24px 64px rgba(0, 0, 0, 0.3); +} + +/* Skip entrance animations when restoring after page refresh */ +.no-animation { + animation: none !important; +} + +.no-animation .settings-container, +.no-animation .search-modal-container { + animation: none !important; +} + +.settings-container.no-animation, +.search-modal-container.no-animation { + animation: none !important; +} + +/* --- Settings Modal Redesign --- */ +.settings-container { + width: 100%; + max-width: 820px; + height: 640px; + max-height: 90vh; + display: flex; + border-radius: 24px; + overflow: hidden; + animation: scaleIn 0.3s cubic-bezier(0.16, 1, 0.3, 1); + position: relative; +} + +.settings-nav { + width: 240px; + background: #f1f5f9; + /* Solid subtle gray for better contrast */ + border-right: 1px solid var(--border-light); + display: flex; + flex-direction: column; + padding: 1.5rem 1rem; +} + +.dark .settings-nav { + background: #111113; + /* Darker sidebar for prominence */ +} + +.nav-title { + font-size: 1.25rem; + font-weight: 800; + margin-bottom: 2rem; + padding-left: 0.5rem; + color: var(--text-primary); +} + +.nav-items { + display: flex; + flex-direction: column; + gap: 0.5rem; +} + +.nav-tab { + display: flex; + align-items: center; + gap: 0.75rem; + padding: 0.85rem 1rem; + border-radius: 14px; + font-size: 0.95rem; + font-weight: 600; + color: var(--text-secondary); + transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1); + background: transparent; + border: none; + /* Explicitly reset any inherited borders */ + outline: none; + text-align: left; + cursor: pointer; +} + +.nav-tab:hover { + background: var(--bg-surface-hover); + color: var(--text-primary); +} + +.nav-tab.active { + background: var(--brand-primary); + color: white !important; + box-shadow: 0 4px 15px rgba(var(--brand-primary-rgb), 0.3); +} + +.dark .nav-tab.active { + background: #3b82f6; + /* Azure Blue for vibrant active state */ + box-shadow: 0 4px 15px rgba(59, 130, 246, 0.4); +} + +.settings-body { + flex: 1; + display: flex; + flex-direction: column; + background: var(--bg-modal); + position: relative; + padding: 2.5rem; +} + +.body-close { + all: unset; + position: absolute; + top: 0.75rem; + right: 0.75rem; + width: 36px; + height: 36px; + display: flex; + align-items: center; + justify-content: center; + border-radius: 50%; + color: var(--text-tertiary); + cursor: pointer; + transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1); + z-index: 1000; +} + +.body-close:hover { + background: var(--bg-surface-hover); + color: #ef4444; + transform: rotate(90deg); +} + +.dark .body-close:hover { + background: rgba(255, 255, 255, 0.1); +} + +.body-content { + flex: 1; + overflow-y: auto; + padding-right: 0.5rem; + scrollbar-width: none; + /* Firefox */ + -ms-overflow-style: none; + /* IE/Edge */ +} + +.body-content::-webkit-scrollbar { + display: none; +} + +.content-header h2 { + font-size: 1.75rem; + font-weight: 800; + margin-bottom: 2rem; + color: var(--text-primary); +} + +.content-section { + animation: fadeInSlideUp 0.4s ease-out; +} + +/* --- General Groups --- */ +.setting-group { + display: flex; + align-items: center; + justify-content: space-between; + padding: 1.25rem 0.5rem; + border-bottom: 1px solid var(--border-light); + transition: background 0.2s; +} + +.setting-group:hover { + background: rgba(var(--brand-primary-rgb), 0.02); +} + +.group-info h3 { + font-size: 0.95rem; + font-weight: 700; + margin-bottom: 0.2rem; + color: var(--text-primary); +} + +.group-info p { + font-size: 0.82rem; + color: var(--text-secondary); + line-height: 1.5; +} + +.toggle-pill { + padding: 6px 18px; + border-radius: 30px; + font-size: 0.75rem; + font-weight: 700; + cursor: pointer; + border: 1.5px solid var(--border-light); + background: transparent; + color: var(--text-secondary); + transition: all 0.25s cubic-bezier(0.16, 1, 0.3, 1); + outline: none !important; + box-shadow: none !important; +} + +.toggle-pill.on { + background: #3b82f6; + border-color: #3b82f6; + color: white; + box-shadow: 0 4px 12px rgba(59, 130, 246, 0.2) !important; +} + +.toggle-pill.on:hover { + background: #2563eb; + border-color: #2563eb; + transform: translateY(-1px); + box-shadow: 0 6px 16px rgba(59, 130, 246, 0.3) !important; +} + +.toggle-pill:not(.on):hover { + border-color: #3b82f6; + color: #3b82f6; + background: rgba(59, 130, 246, 0.05); +} + +/* --- User Profile Card --- */ +.user-profile-card { + display: flex; + align-items: center; + gap: 1.5rem; + padding: 1.5rem; + background: var(--bg-surface); + border: 1px solid var(--border-light); + border-radius: 20px; + margin-bottom: 2rem; + transition: all 0.3s ease; +} + +.user-profile-card.editing { + flex-direction: column; + align-items: center; + padding: 2.5rem 2rem; + gap: 2rem; + text-align: center; +} + +.user-profile-card:hover { + border-color: rgba(var(--brand-primary-rgb), 0.3); + box-shadow: 0 8px 32px rgba(0, 0, 0, 0.03); +} + +.dark .user-profile-card { + background: rgba(255, 255, 255, 0.02); +} + +.card-avatar { + position: relative; + width: 64px; + height: 64px; +} + +.card-avatar.large { + width: 110px; + height: 110px; + margin-bottom: 0.5rem; +} + +.avatar-placeholder { + width: 100%; + height: 100%; + border-radius: 50%; + background: linear-gradient(135deg, #7c3aed, #3b82f6); + color: white; + display: flex; + align-items: center; + justify-content: center; + font-size: 1.5rem; + font-weight: 800; +} + +.avatar-placeholder.large { + font-size: 3rem; +} + +.card-avatar img { + width: 100%; + height: 100%; + border-radius: 50%; + object-fit: cover; + border: 3px solid var(--bg-modal); + box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1); +} + +.avatar-edit-overlay { + position: absolute; + inset: 0; + background: rgba(0, 0, 0, 0.4); + backdrop-filter: blur(4px); + border-radius: 50%; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + color: white; + cursor: pointer; + opacity: 0; + transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1); + font-size: 0.75rem; + font-weight: 700; + gap: 4px; + border: 2px solid transparent; +} + +.card-avatar:hover .avatar-edit-overlay { + opacity: 1; +} + +.card-form { + width: 100%; + display: flex; + flex-direction: column; + gap: 1.5rem; + text-align: left; +} + +.form-group { + display: flex; + flex-direction: column; + gap: 0.6rem; +} + +.form-group label { + font-size: 0.75rem; + font-weight: 800; + color: var(--text-tertiary); + text-transform: uppercase; + letter-spacing: 0.08em; + padding-left: 0.25rem; +} + +.form-group input { + padding: 0.85rem 1.1rem; + background: var(--bg-canvas); + border: 1.5px solid var(--border-light); + border-radius: 14px; + color: var(--text-primary); + font-size: 0.95rem; + transition: all 0.2s cubic-bezier(0.16, 1, 0.3, 1); +} + +.form-group input:focus { + outline: none; + border-color: #3b82f6; + background: var(--bg-surface); + box-shadow: 0 0 0 4px rgba(59, 130, 246, 0.15); +} + +.save-profile-btn { + margin-top: 0.75rem; + padding: 0.9rem; + background: #3b82f6; + color: white; + border: none; + border-radius: 14px; + font-weight: 700; + font-size: 0.95rem; + cursor: pointer; + transition: all 0.25s cubic-bezier(0.16, 1, 0.3, 1); + box-shadow: 0 4px 12px rgba(59, 130, 246, 0.2); +} + +.save-profile-btn:hover:not(:disabled) { + background: #2563eb; + filter: brightness(1.1); + box-shadow: 0 6px 20px rgba(59, 130, 246, 0.3); +} + +.save-profile-btn:active:not(:disabled) { + transform: scale(0.98); +} + +.save-profile-btn:disabled { + opacity: 0.4; + cursor: not-allowed; + background: var(--text-tertiary); + box-shadow: none; +} + +.account-danger-zone { + border-top: 1px solid var(--border-light); + padding-top: 2rem; + margin-top: 1rem; + width: 100%; +} + +/* --- Appearance Grid --- */ +.appearance-grid { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 1.5rem; +} + +.theme-card { + display: flex; + flex-direction: column; + gap: 1rem; + padding: 1.25rem; + border-radius: 20px; + border: 2.5px solid transparent; + background: var(--bg-surface); + transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1); + text-align: left; + cursor: pointer; +} + +.theme-card:hover { + background: var(--bg-surface-hover); + transform: translateY(-2px); +} + +.theme-card.active { + border-color: var(--brand-primary); + background: var(--bg-canvas); + box-shadow: 0 8px 24px rgba(var(--brand-primary-rgb), 0.15); +} + +.sidebar-avatar-img { + width: 32px !important; + height: 32px !important; + min-width: 32px !important; + min-height: 32px !important; + max-width: 32px !important; + max-height: 32px !important; + aspect-ratio: 1 / 1 !important; + object-fit: cover; + border-radius: 50%; + flex-shrink: 0 !important; +} + +.theme-card span { + font-size: 0.95rem; + font-weight: 700; + color: var(--text-primary); + /* Ensure contrast */ +} + +.theme-preview { + height: 100px; + border-radius: 12px; +} + +.theme-preview.light { + background: #ffffff; + border: 1px solid #e2e8f0; +} + +.theme-preview.dark { + background: #18181b; + border: 1px solid #27272a; +} + + +/* --- Archived List --- */ +.archived-list { + display: flex; + flex-direction: column; + gap: 0.75rem; +} + +.archived-row { + display: flex; + align-items: center; + justify-content: space-between; + padding: 0.85rem 1.25rem; + background: var(--bg-surface); + border: 1px solid var(--border-light); + border-radius: 12px; + transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1); +} + +.archived-row:hover { + background: var(--bg-surface-hover); + border-color: rgba(var(--brand-primary-rgb), 0.3); + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05); +} + +.row-info { + display: flex; + flex-direction: column; + gap: 0.15rem; +} + +.row-title { + font-size: 0.95rem; + font-weight: 600; + color: var(--text-primary); +} + +.row-date { + font-size: 0.75rem; + color: var(--text-tertiary); + font-weight: 500; +} + +.restore-btn { + display: flex; + align-items: center; + gap: 0.4rem; + padding: 5px 12px; + border-radius: 10px; + font-size: 0.8rem; + font-weight: 600; + color: #3b82f6; + background: rgba(59, 130, 246, 0.05); + border: 1.5px solid rgba(59, 130, 246, 0.1); + transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1); + cursor: pointer; +} + +.restore-btn:hover { + background: #3b82f6; + color: white; + border-color: #3b82f6; + box-shadow: 0 4px 12px rgba(59, 130, 246, 0.2); +} + +.dark .restore-btn { + background: rgba(59, 130, 246, 0.15); + border-color: rgba(59, 130, 246, 0.2); +} + +.dark .restore-btn:hover { + background: #3b82f6; + border-color: #3b82f6; +} + +/* --- Utility --- */ +.danger-btn-outline { + width: 100%; + padding: 0.85rem; + border: 2px solid #ef4444; + background: transparent; + color: #ef4444; + border-radius: 16px; + font-weight: 700; + font-size: 0.9rem; + letter-spacing: 0.01em; + transition: all 0.25s cubic-bezier(0.16, 1, 0.3, 1); + cursor: pointer; + position: relative; + overflow: hidden; +} + +.danger-btn-outline:hover { + background: rgba(239, 68, 68, 0.1); + box-shadow: 0 0 15px rgba(239, 68, 68, 0.2); + border-color: #f87171; +} + +.danger-btn-outline:active { + background: rgba(239, 68, 68, 0.15); + transform: scale(0.985); +} + +.danger-text { + display: block; + width: fit-content; + background: none; + border: none; + color: #ef4444; + font-weight: 600; + font-size: 0.85rem; + cursor: pointer; + padding: 0.5rem 1rem; + margin-top: 1.5rem; + border-radius: 8px; + opacity: 0.6; + transition: all 0.25s cubic-bezier(0.16, 1, 0.3, 1); +} + +.danger-text:hover { + opacity: 1; + background: rgba(239, 68, 68, 0.05); + color: #f87171; +} + + +.mt-8 { + margin-top: 2rem; +} + +.mt-4 { + margin-top: 1rem; +} + +.mb-4 { + margin-bottom: 1rem; +} + +@keyframes scaleIn { + from { + opacity: 0; + transform: scale(0.9); + } + + to { + opacity: 1; + transform: scale(1); + } +} + +/* Search Modal Centered */ +.search-modal-container { + width: 95%; + max-width: 600px; + height: 520px; + /* ABSOLUTELY FIXED - No jumping ever */ + border-radius: 1.25rem; + overflow: hidden; + display: flex; + flex-direction: column; + box-shadow: 0 50px 100px -20px rgba(0, 0, 0, 0.15), 0 30px 60px -30px rgba(0, 0, 0, 0.2); + border: 1px solid var(--border-medium); + animation: zoomIn 0.3s cubic-bezier(0.16, 1, 0.3, 1); + background: var(--bg-modal); + backdrop-filter: blur(28px) saturate(180%); +} + +.dark .search-modal-container { + background: rgba(15, 15, 18, 0.98); + border-color: rgba(255, 255, 255, 0.12); + box-shadow: 0 40px 80px -20px rgba(0, 0, 0, 0.8); +} + +.search-modal-header { + height: 72px; + /* Increased height for better balance */ + padding: 0 1.5rem; + display: flex; + align-items: center; + gap: 1rem; + background: rgba(var(--bg-canvas-rgb), 0.6); + /* More opaque for "fixed" feel */ + border-bottom: 1px solid var(--border-light); + transition: all 0.3s ease; + flex-shrink: 0; +} + +.search-modal-header:focus-within { + background: rgba(var(--bg-canvas-rgb), 0.7); + border-bottom-color: var(--brand-primary); +} + +.search-input { + flex: 1; + background: transparent; + border: none; + outline: none; + font-size: 1.15rem; + /* Larger font for readability */ + color: var(--text-primary); + font-family: 'Outfit', sans-serif; + letter-spacing: -0.01em; + padding: 0.5rem 0; +} + +.search-input::placeholder { + color: var(--text-tertiary); + opacity: 0.7; +} + +.dark .search-input::placeholder { + color: var(--text-secondary); + opacity: 0.5; +} + +.search-shortcut { + font-size: 0.6rem; + background: var(--bg-surface-hover); + color: var(--text-secondary); + padding: 4px 8px; + /* Better padding */ + border-radius: 6px; + font-weight: 800; + border: 1px solid var(--border-medium); + opacity: 0.8; + letter-spacing: 0.05em; + font-family: 'Inter', sans-serif; +} + +.dark .search-shortcut { + background: rgba(255, 255, 255, 0.1); + color: var(--text-secondary); + border-color: rgba(255, 255, 255, 0.15); +} + +.search-modal-content { + flex: 1; + overflow-y: auto; + padding: 0.75rem; + display: flex; + /* Centering empty state */ + flex-direction: column; +} + +.search-modal-content>div { + flex: 1; + display: flex; + flex-direction: column; +} + +.search-group { + margin-bottom: 1.5rem; +} + +.search-group:last-child { + margin-bottom: 0.5rem; +} + +.group-title { + padding: 0 0.75rem; + margin-bottom: 0.75rem; + font-size: 0.7rem; + font-weight: 800; + color: var(--text-tertiary); + text-transform: uppercase; + letter-spacing: 0.1em; +} + +.group-items { + display: flex; + flex-direction: column; + gap: 2px; +} + +.search-result-item { + display: flex; + align-items: center; + gap: 0.875rem; + padding: 0.75rem 0.875rem; + border-radius: 0.75rem; + transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1); + width: 100%; + text-align: left; + background: transparent; + border: none; + cursor: pointer; +} + +.search-result-item:hover { + background: var(--bg-surface-hover); +} + +.dark .search-result-item:hover { + background: rgba(255, 255, 255, 0.06); +} + +.search-result-item:hover .item-icon { + background: var(--bg-canvas); + color: var(--brand-primary); +} + +.item-icon { + width: 32px; + height: 32px; + background: var(--bg-surface-hover); + border-radius: 8px; + display: flex; + align-items: center; + justify-content: center; + color: var(--text-secondary); + transition: all 0.2s ease; + flex-shrink: 0; +} + +.dark .item-icon { + background: rgba(255, 255, 255, 0.05); + color: var(--text-secondary); +} + +.item-title { + font-size: 0.95rem; + font-weight: 500; + color: var(--text-primary); + transition: color 0.2s ease; +} + +.empty-state { + flex: 1; + /* Occupy remaining space */ + padding: 2rem 1rem; + text-align: center; + color: var(--text-secondary); + font-size: 0.9rem; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + /* Center vertically */ + gap: 1.5rem; + opacity: 0.9; +} + +.dark .empty-state { + color: var(--text-secondary); + opacity: 0.8; +} + +@keyframes zoomIn { + from { + opacity: 0; + transform: scale(0.95); + } + + to { + opacity: 1; + transform: scale(1); + } +} + +@keyframes fadeInSlideUp { + from { + opacity: 0; + transform: translateY(10px); + } + + to { + opacity: 1; + transform: translateY(0); + } +} + +/* Search result snippet & metadata */ +.item-title b, +.search-result-item .bg-brand-primary\/20 { + background: rgba(var(--brand-primary-rgb), 0.15); + color: var(--brand-primary); + padding: 1px 4px; + /* Slightly better surrounding space */ + border-radius: 4px; + font-weight: 700; + /* Bolder for visibility */ + box-shadow: 0 0 0 1px rgba(var(--brand-primary-rgb), 0.1); + /* Subtle outline for depth */ +} + +.dark .item-title b, +.dark .search-result-item .bg-brand-primary\/20 { + background: rgba(var(--brand-primary-rgb), 0.25); + color: #a5b4fc; + /* Indigo 300 for better pop */ + box-shadow: 0 0 0 1px rgba(var(--brand-primary-rgb), 0.2); +} + +.search-result-item p { + color: var(--text-secondary); + /* Softer for better hierarchy */ + font-size: 0.825rem; + line-height: 1.5; + margin-top: 4px; + display: -webkit-box; + -webkit-line-clamp: 2; + /* Increased to 2 lines for better context */ + -webkit-box-orient: vertical; + overflow: hidden; +} + +.dark .search-result-item p { + color: var(--text-secondary); + opacity: 0.7; +} + +.dark .search-result-item .item-title { + color: var(--text-primary) !important; +} + +.search-result-item .item-date { + font-size: 0.65rem; + font-weight: 700; + color: var(--text-secondary); + opacity: 0.6; + letter-spacing: 0.05em; + transition: opacity 0.2s ease; +} + +.search-result-item:hover .item-date { + opacity: 1; +} + +.dark .search-result-item .item-date { + color: var(--text-secondary); + opacity: 0.5; +} + +.dark .search-result-item:hover .item-date { + color: var(--text-primary); + opacity: 0.8; +} + +/* Attachment Menu */ +.attachment-menu { + position: absolute; + bottom: 100%; + left: 0; + margin-bottom: 0.5rem; + background: var(--bg-modal); + backdrop-filter: blur(12px); + border: 1px solid var(--border-light); + border-radius: 0.75rem; + box-shadow: var(--shadow-lg); + padding: 0.5rem; + min-width: 180px; + z-index: 100; + animation: fadeIn 0.15s ease-out; +} + +.attachment-menu button { + width: 100%; + display: flex; + align-items: center; + gap: 0.75rem; + padding: 0.6rem 0.75rem; + background: none; + border: none; + cursor: pointer; + font-size: 0.875rem; + color: var(--text-primary); + border-radius: 0.5rem; +} + +.attachment-menu button:hover { + background: var(--bg-surface-hover); +} + +/* Search Modal */ +.modal-overlay { + background: rgba(0, 0, 0, 0.6); + backdrop-filter: blur(4px); +} + +.search-modal { + background: var(--bg-canvas); + border: 1px solid var(--border-light); + box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25); + border-radius: 1rem; +} + +.search-header { + border-bottom: 1px solid var(--border-light); + background: var(--bg-surface); +} + +.search-results { + background: var(--bg-canvas); +} + +.search-item { + color: var(--text-primary); +} + +.search-item:hover { + background: var(--bg-surface-hover); +} + +/* Scroll to bottom */ +.scroll-to-bottom { + position: absolute; + left: 50%; + transform: translateX(-50%); + bottom: 1.5rem; + /* Lowered, right above input area */ + width: 36px; + /* Slightly smaller to be less intrusive */ + height: 36px; + display: flex; + align-items: center; + justify-content: center; + border-radius: 50%; + z-index: 40; + background: rgba(var(--bg-surface-rgb, 255, 255, 255), 0.6); + /* Transparent background */ + backdrop-filter: blur(8px); + /* Glassmorphism effect */ + -webkit-backdrop-filter: blur(8px); + border: 1px solid var(--border-light); + color: var(--text-secondary); + box-shadow: var(--shadow-sm); + cursor: pointer; + transition: transform 0.2s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.2s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1); + opacity: 0.7; + /* Initially semi-transparent */ +} + +.scroll-to-bottom:hover { + background: rgba(var(--bg-surface-rgb, 255, 255, 255), 0.8); + color: var(--brand-primary); + opacity: 1; + transform: translateX(-50%) translateY(-2px); + box-shadow: var(--shadow-md); +} + +/* Pin Indicator Icon */ +.chat-pin-icon { + display: inline-block; + vertical-align: middle; + margin-right: 8px; + color: #3b82f6; + flex-shrink: 0; +} + +/* Premium Toast Notification */ +.premium-toast { + position: fixed; + bottom: 2rem; + left: 50%; + transform: translateX(-50%); + background: #ffffff; + padding: 12px 20px; + border-radius: 12px; + box-shadow: 0 15px 30px rgba(0, 0, 0, 0.1), 0 5px 15px rgba(0, 0, 0, 0.05); + display: flex; + align-items: center; + gap: 16px; + z-index: 9999; + border: 1px solid rgba(0, 0, 0, 0.05); + animation: toastSlideUp 0.4s cubic-bezier(0.16, 1, 0.3, 1); +} + +.dark .premium-toast { + background: #1e1e1e; + border-color: rgba(255, 255, 255, 0.1); + color: #ffffff; +} + +.premium-toast.warning { + border-left: 4px solid #f59e0b; +} + +.toast-icon { + font-size: 20px; +} + +.toast-content strong { + display: block; + font-size: 14px; + margin-bottom: 2px; +} + +.toast-content p { + font-size: 13px; + margin: 0; + opacity: 0.8; +} + +@keyframes toastSlideUp { + from { + opacity: 0; + transform: translate(-50%, 20px); + } + + to { + opacity: 1; + transform: translate(-50%, 0); + } +} + +/* Premium PDF Export Styling */ +.pdf-export-container { + padding: 60px 50px; + background: white !important; + color: #1a1a1a !important; + font-family: 'Inter', -apple-system, blinkmacsystemfont, 'Segoe UI', roboto, sans-serif; + line-height: 1.6; + width: 800px; + position: fixed; + left: -2000px; + top: 0; + z-index: 9999; +} + +/* Force dark text for all elements in PDF regardless of app theme */ +.pdf-export-container * { + color: #1a1a1a !important; +} + +.pdf-watermark { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%) rotate(-45deg); + font-size: 120px; + font-weight: 900; + color: rgba(0, 0, 0, 0.03) !important; + /* Extremely subtle */ + pointer-events: none; + z-index: 0; + white-space: nowrap; +} + +.pdf-header { + display: flex; + justify-content: space-between; + align-items: center; + border-bottom: 2px solid #f0f0f0; + margin-bottom: 30px; + padding-bottom: 15px; +} + +.pdf-brand { + font-size: 24px; + font-weight: 800; + color: #4f46e5 !important; + letter-spacing: -0.02em; +} + +.pdf-meta { + text-align: right; + font-size: 12px; + color: #666 !important; +} + +.pdf-content { + font-size: 14px; +} + +.pdf-content h1, +.pdf-content h2, +.pdf-content h3 { + color: #111; + margin-top: 1.5em; + margin-bottom: 0.5em; +} + +.pdf-export-container .katex-display { + background: transparent; + padding: 10px 0; + border: none; + margin: 20px 0; +} + +.pdf-footer { + margin-top: 50px; + padding-top: 15px; + border-top: 1px solid #f0f0f0; + font-size: 10px; + color: #999 !important; + text-align: center; +} + +/* --- Unsaved Changes Warning --- */ +.unsaved-warning-overlay { + position: absolute; + inset: 0; + z-index: 1000; + display: flex; + align-items: center; + justify-content: center; + backdrop-filter: blur(12px); + background: rgba(0, 0, 0, 0.4); + animation: fadeIn 0.3s ease-out; + border-radius: 24px; +} + +.warning-content { + background: var(--bg-surface); + padding: 2.5rem; + border-radius: 20px; + width: 90%; + max-width: 440px; + text-align: center; + border: 1px solid var(--border-light); + box-shadow: 0 20px 40px rgba(0, 0, 0, 0.3); + transform: scale(0.95); + animation: scaleIn 0.3s cubic-bezier(0.16, 1, 0.3, 1) forwards; +} + +.warning-icon-wrapper { + width: 60px; + height: 60px; + background: rgba(245, 158, 11, 0.1); + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + margin: 0 auto 1.5rem; +} + +.warning-content h3 { + font-size: 1.35rem; + margin-bottom: 0.75rem; + color: var(--text-primary); +} + +.warning-content p { + font-size: 0.95rem; + color: var(--text-secondary); + line-height: 1.6; + margin-bottom: 2rem; +} + +.warning-actions { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 0.75rem; +} + +.warning-btn { + padding: 0.75rem; + border-radius: 12px; + font-size: 0.85rem; + font-weight: 600; + cursor: pointer; + transition: all 0.2s; + border: 1px solid transparent; +} + +.warning-btn.discard { + background: transparent; + border-color: var(--border-light); + color: var(--text-secondary); +} + +.warning-btn.discard:hover { + background: var(--bg-surface-hover); + color: #ef4444; +} + +.warning-btn.cancel { + background: var(--bg-surface-hover); + color: var(--text-primary); +} + +.warning-btn.cancel:hover { + background: var(--bg-surface-active); +} + +.warning-btn.save { + background: var(--brand-primary); + color: white; +} + +.warning-btn.save:hover { + filter: brightness(1.1); + box-shadow: 0 4px 12px rgba(124, 58, 237, 0.3); +} + +.save-profile-btn.active { + background: var(--brand-primary); + color: white; + box-shadow: 0 4px 15px rgba(124, 58, 237, 0.3); +} + +.save-profile-btn.active:hover { + filter: brightness(1.1); +} + +@keyframes fadeIn { + from { + opacity: 0; + } + + to { + opacity: 1; + } +} + +@keyframes scaleIn { + to { + transform: scale(1); + opacity: 1; + } +} + +/* Sidebar Help Section */ +.sidebar-help { + display: flex; + align-items: center; + gap: 12px; + padding: 10px 12px; + margin: 8px 12px; + border-radius: 12px; + cursor: pointer; + transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1); + color: var(--text-secondary); + border: 1px solid transparent; +} + +.sidebar-help:hover { + background: var(--bg-surface-hover); + color: var(--text-primary); + border-color: var(--border-light); +} + +.sidebar-help .help-icon { + flex-shrink: 0; + transition: transform 0.2s; +} + +.sidebar-help:hover .help-icon { + transform: scale(1.1); +} + +.help-text { + font-size: 0.9rem; + font-weight: 600; + white-space: nowrap; + opacity: 1; + transition: opacity 0.3s, visibility 0.3s; +} + +.sidebar-collapsed .help-text { + opacity: 0; + visibility: hidden; +} + +.sidebar-collapsed .sidebar-help { + justify-content: center; + padding: 10px 0; + margin: 8px 4px; +} \ No newline at end of file