Đỗ Hải Nam
Refine sidebar empty state transition
565924b
/* ========================================
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;
}