@tailwind base; @tailwind components; @tailwind utilities; /* ── Color tokens ── */ :root { /* Light theme (default) */ --c-bg: #f5f6f8; --c-sf: #ecedf1; --c-card: #ffffff; --c-top: #f8fbff; --c-top-bd: rgba(148,163,184,0.18); --c-top-el: rgba(255,255,255,0.76); --c-top-el-h: #ffffff; --c-side: #f1f5fb; --c-side-bd: rgba(148,163,184,0.22); --c-side-el: rgba(255,255,255,0.72); --c-side-el-h: rgba(255,255,255,0.92); --c-side-act: #ffffff; --c-side-act-bd: rgba(96,165,250,0.22); --c-side-tx: #334155; --c-side-tx2: rgba(51,65,85,0.78); --c-side-tx3: rgba(51,65,85,0.52); --c-bd: rgba(0,0,0,0.09); --c-bd-hi: rgba(0,0,0,0.22); --c-tx: #121212; --c-tx2: #3d3d3d; --c-tx3: rgba(0,0,0,0.38); --c-txph: rgba(0,0,0,0.32); --c-hi: rgba(0,0,0,0.08); --c-ho: rgba(0,0,0,0.04); --c-ub: #dbeafe; --c-ub-bd: #bfdbfe; --c-utx: #1d4ed8; --c-code: rgba(0,0,0,0.06); --c-scrl: rgba(0,0,0,0.15); --c-scrl-hv: rgba(0,0,0,0.28); --c-prose: #2d2d2d; --c-prose-h: #0f0f0f; --c-prose-a: #2563eb; --c-prose-ah: #1d4ed8; --c-prose-cd: #1a3a72; } .dark { --c-bg: #0b0b0b; --c-sf: #0a0a0a; --c-card: #141414; --c-top: #10161f; --c-top-bd: rgba(148,163,184,0.14); --c-top-el: rgba(255,255,255,0.06); --c-top-el-h: rgba(255,255,255,0.10); --c-side: #131922; --c-side-bd: rgba(148,163,184,0.16); --c-side-el: rgba(255,255,255,0.05); --c-side-el-h: rgba(255,255,255,0.08); --c-side-act: rgba(59,130,246,0.16); --c-side-act-bd: rgba(96,165,250,0.24); --c-side-tx: #e5ecf6; --c-side-tx2: rgba(226,232,240,0.78); --c-side-tx3: rgba(226,232,240,0.48); --c-bd: rgba(255,255,255,0.07); --c-bd-hi: rgba(255,255,255,0.18); --c-tx: #e2e2e2; --c-tx2: rgba(255,255,255,0.75); --c-tx3: rgba(255,255,255,0.28); --c-txph: rgba(255,255,255,0.22); --c-hi: rgba(255,255,255,0.07); --c-ho: rgba(255,255,255,0.04); --c-ub: rgba(79,142,247,0.13); --c-ub-bd: rgba(79,142,247,0.22); --c-utx: rgba(255,255,255,0.90); --c-code: #0e0e0e; --c-scrl: rgba(255,255,255,0.12); --c-scrl-hv: rgba(255,255,255,0.22); --c-prose: #d8d8d8; --c-prose-h: #ffffff; --c-prose-a: #7dd3fc; --c-prose-ah: #bae6fd; --c-prose-cd: #e2e8f0; } * { box-sizing: border-box; } html, body, #app { height: 100%; margin: 0; padding: 0; } body { background: var(--c-bg); color: var(--c-tx); } /* Custom scrollbar */ ::-webkit-scrollbar { width: 5px; height: 5px; } ::-webkit-scrollbar-track { background: transparent; } ::-webkit-scrollbar-thumb { background: var(--c-scrl); border-radius: 10px; } ::-webkit-scrollbar-thumb:hover { background: var(--c-scrl-hv); } /* User message bubble */ .user-bubble { background: var(--c-ub); border: 1px solid var(--c-ub-bd); border-radius: 18px; } /* Prose — markdown content */ .prose-dark { color: var(--c-prose); line-height: 1.75; word-break: break-word; } .prose-dark h1, .prose-dark h2, .prose-dark h3, .prose-dark h4 { color: var(--c-prose-h); font-weight: 600; margin: 1em 0 0.5em; line-height: 1.3; } .prose-dark h1 { font-size: 1.5em; } .prose-dark h2 { font-size: 1.25em; } .prose-dark h3 { font-size: 1.1em; } .prose-dark p { margin: 0.6em 0; } .prose-dark p:first-child { margin-top: 0; } .prose-dark p:last-child { margin-bottom: 0; } .prose-dark a { color: var(--c-prose-a); text-decoration: underline; } .prose-dark a:hover { color: var(--c-prose-ah); } .prose-dark ul, .prose-dark ol { padding-left: 1.5em; margin: 0.5em 0; } .prose-dark li { margin: 0.2em 0; } .prose-dark blockquote { border-left: 3px solid var(--c-bd); padding-left: 1em; color: var(--c-tx3); margin: 0.75em 0; font-style: italic; } .prose-dark hr { border: none; border-top: 1px solid var(--c-bd); margin: 1em 0; } .prose-dark table { border-collapse: collapse; width: 100%; margin: 0.75em 0; font-size: 0.9em; } .prose-dark th, .prose-dark td { border: 1px solid var(--c-bd); padding: 0.4em 0.75em; text-align: left; } .prose-dark th { background: var(--c-hi); font-weight: 600; } .prose-dark code:not(pre code) { background: var(--c-code); border: 1px solid var(--c-bd); border-radius: 3px; padding: 0.1em 0.35em; font-size: 0.875em; font-family: 'JetBrains Mono', 'Fira Code', monospace; color: var(--c-prose-cd); } .prose-dark pre { background: var(--c-code); border: 1px solid var(--c-bd); border-radius: 6px; padding: 1em; overflow-x: auto; margin: 0.75em 0; position: relative; } .prose-dark pre code { background: none; border: none; padding: 0; font-size: 0.85em; font-family: 'JetBrains Mono', 'Fira Code', monospace; color: var(--c-prose-cd); } /* Code block copy button */ .code-block-wrapper { position: relative; } .copy-btn { position: absolute; top: 0.5em; right: 0.5em; background: var(--c-hi); border: 1px solid var(--c-bd); border-radius: 6px; color: var(--c-tx3); font-size: 0.7em; padding: 2px 8px; cursor: pointer; opacity: 0; transition: opacity 0.15s ease; } .code-block-wrapper:hover .copy-btn { opacity: 1; } .copy-btn:hover { background: var(--c-ho); color: var(--c-tx); } /* Message fade-in animation */ @keyframes fadeInUp { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: translateY(0); } } .message-enter { animation: fadeInUp 0.2s ease forwards; } /* Typing indicator */ @keyframes typingDot { 0%, 60%, 100% { opacity: 0.2; transform: translateY(0); } 30% { opacity: 1; transform: translateY(-4px); } } .typing-dot { display: inline-block; width: 6px; height: 6px; border-radius: 50%; background: var(--c-tx3); animation: typingDot 1.2s infinite; } .typing-dot:nth-child(2) { animation-delay: 0.2s; } .typing-dot:nth-child(3) { animation-delay: 0.4s; } /* Sidebar transition */ .sidebar-transition { transition: transform 0.25s ease, opacity 0.25s ease; } /* Input textarea auto-resize */ textarea { resize: none; overflow-y: auto; } /* Dropdown */ .dropdown-enter { animation: dropdownFade 0.15s ease forwards; } @keyframes dropdownFade { from { opacity: 0; transform: translateY(-4px); } to { opacity: 1; transform: translateY(0); } } /* Modal */ .modal-backdrop { animation: modalFadeIn 0.15s ease forwards; } @keyframes modalFadeIn { from { opacity: 0; } to { opacity: 1; } } .modal-panel { animation: modalSlideIn 0.2s ease forwards; } @keyframes modalSlideIn { from { opacity: 0; transform: scale(0.96) translateY(-8px); } to { opacity: 1; transform: scale(1) translateY(0); } } /* hljs theme overrides */ .hljs { background: transparent !important; }