/* ======================================== 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, .sidebar-container.closed .history-empty { 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; transition: opacity 0.35s cubic-bezier(0.4, 0, 0.2, 1), transform 0.35s cubic-bezier(0.4, 0, 0.2, 1); } /* --- 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; }