@import url("https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600;700&display=swap"); * { margin: 0; padding: 0; box-sizing: border-box; } /* Catppuccin Mocha Palette */ :root { --ctp-rosewater: #f5e0dc; --ctp-flamingo: #f2cdcd; --ctp-pink: #f5c2e7; --ctp-mauve: #cba6f7; --ctp-red: #f38ba8; --ctp-maroon: #eba0ac; --ctp-peach: #fab387; --ctp-yellow: #f9e2af; --ctp-green: #a6e3a1; --ctp-teal: #94e2d5; --ctp-sky: #89dceb; --ctp-sapphire: #74c7ec; --ctp-blue: #89b4fa; --ctp-lavender: #b4befe; --ctp-text: #cdd6f4; --ctp-subtext1: #bac2de; --ctp-subtext0: #a6adc8; --ctp-overlay2: #9399b2; --ctp-overlay1: #7f849c; --ctp-overlay0: #6c7086; --ctp-surface2: #585b70; --ctp-surface1: #45475a; --ctp-surface0: #313244; --ctp-base: #1e1e2e; --ctp-mantle: #181825; --ctp-crust: #11111b; } body { font-family: "JetBrains Mono", monospace; background: var(--ctp-base); color: var(--ctp-text); height: 100vh; overflow: hidden; image-rendering: pixelated; } .hidden { display: none !important; } /* ==================== LOGIN SCREEN ==================== */ .login-screen { height: 100vh; display: flex; flex-direction: column; justify-content: center; align-items: center; gap: 32px; } .login-btn { background: var(--ctp-surface0); border: 2px solid var(--ctp-surface1); color: var(--ctp-text); padding: 14px 24px; font-family: inherit; font-size: 14px; cursor: pointer; transition: border-color 0.15s ease, background 0.15s ease; user-select: none; } .login-btn:hover { border-color: var(--ctp-mauve); background: var(--ctp-surface1); } .login-btn:active { background: var(--ctp-surface2); } .login-btn:disabled { opacity: 0.5; cursor: not-allowed; } /* ==================== WELCOME SCREEN ==================== */ .welcome-screen { height: 100vh; display: flex; flex-direction: column; justify-content: center; align-items: center; gap: 32px; } .logo { font-size: 48px; font-weight: 700; letter-spacing: 4px; text-transform: uppercase; user-select: none; display: flex; gap: 4px; } .logo-dev { color: var(--ctp-overlay1); } .logo-den { color: var(--ctp-mauve); } /* ==================== INPUT STYLES ==================== */ .input-container { width: 100%; max-width: 560px; display: flex; flex-direction: column; gap: 8px; padding: 0 16px; } .input-box { display: flex; align-items: center; background: var(--ctp-surface0); border: 2px solid var(--ctp-surface1); padding: 12px 16px; transition: border-color 0.15s ease; } .input-box:focus-within { border-color: var(--ctp-mauve); } input { flex: 1; background: transparent; border: none; outline: none; color: var(--ctp-text); font-size: 14px; font-family: inherit; } input::placeholder { color: var(--ctp-overlay0); } .hint { text-align: center; font-size: 11px; color: var(--ctp-overlay0); } kbd { background: var(--ctp-surface1); color: var(--ctp-subtext1); padding: 2px 6px; font-size: 10px; font-family: inherit; } /* ==================== CHAT SCREEN ==================== */ .chat-screen { height: 100vh; display: flex; flex-direction: column; background: var(--ctp-base); } .chat-messages { flex: 1; overflow-y: auto; padding: 16px; } .chat-messages::-webkit-scrollbar { width: 8px; } .chat-messages::-webkit-scrollbar-track { background: var(--ctp-mantle); } .chat-messages::-webkit-scrollbar-thumb { background: var(--ctp-surface1); } .chat-messages::-webkit-scrollbar-thumb:hover { background: var(--ctp-surface2); } /* ==================== MESSAGES ==================== */ .message { font-size: 13px; line-height: 1.9; padding: 12px 24px; margin-bottom: 16px; border-left: 3px solid transparent; opacity: 0; animation: fadeIn 0.2s ease forwards; } @keyframes fadeIn { to { opacity: 1; } } .message.user { border-left-color: var(--ctp-sapphire); background: var(--ctp-mantle); } .message.user .message-text { color: var(--ctp-text); } .message.assistant { border-left-color: var(--ctp-mauve); } .message.assistant .message-text { color: var(--ctp-subtext1); } /* ==================== MARKDOWN ELEMENTS ==================== */ /* Styles for markdown-rendered content in assistant messages */ .message.assistant .message-text p { margin: 0.8em 0; } .message.assistant .message-text p:first-child { margin-top: 0; } .message.assistant .message-text p:last-child { margin-bottom: 0; } /* Headers */ .message.assistant .message-text h1, .message.assistant .message-text h2, .message.assistant .message-text h3, .message.assistant .message-text h4, .message.assistant .message-text h5, .message.assistant .message-text h6 { color: var(--ctp-text); } .message.assistant .message-text h1 { font-size: 2em; font-weight: 700; margin: 1.5em 0 0.6em 0; } .message.assistant .message-text h2 { font-size: 1.6em; font-weight: 700; margin: 1.2em 0 0.5em 0; } .message.assistant .message-text h3 { font-size: 1.3em; font-weight: 600; margin: 1em 0 0.4em 0; } .message.assistant .message-text h4 { font-size: 1.15em; font-weight: 600; margin: 1em 0 0.4em 0; } .message.assistant .message-text h5 { font-size: 1em; font-weight: 500; margin: 0.8em 0 0.3em 0; } .message.assistant .message-text h6 { font-size: 0.9em; font-weight: 500; margin: 0.8em 0 0.3em 0; } /* First header in message should have no top margin */ .message.assistant .message-text h1:first-child, .message.assistant .message-text h2:first-child, .message.assistant .message-text h3:first-child, .message.assistant .message-text h4:first-child, .message.assistant .message-text h5:first-child, .message.assistant .message-text h6:first-child { margin-top: 0; } /* Inline code */ .message.assistant .message-text code { background: var(--ctp-surface0); color: var(--ctp-pink); padding: 2px 6px; border-radius: 3px; font-family: inherit; font-size: 0.95em; } /* Code blocks */ .message.assistant .message-text pre { background: var(--ctp-surface0); border: 1px solid var(--ctp-surface1); border-left: 3px solid var(--ctp-mauve); padding: 16px; margin: 1.2em 0; overflow-x: auto; border-radius: 6px; position: relative; } .message.assistant .message-text pre code { background: transparent; color: var(--ctp-text); padding: 0; border-radius: 0; font-size: 0.9em; } /* Lists */ .message.assistant .message-text ul, .message.assistant .message-text ol { margin: 1em 0; padding-left: 2.5em; } .message.assistant .message-text li { margin: 0.5em 0; } .message.assistant .message-text ul { list-style-type: disc; } .message.assistant .message-text ol { list-style-type: decimal; } /* Custom bullet colors */ .message.assistant .message-text ul li::marker { color: var(--ctp-mauve); } .message.assistant .message-text ol li::marker { color: var(--ctp-mauve); font-weight: 600; } /* Links */ .message.assistant .message-text a { color: var(--ctp-sapphire); text-decoration: underline; transition: color 0.15s ease; } .message.assistant .message-text a:hover { color: var(--ctp-sky); } /* Blockquotes */ .message.assistant .message-text blockquote { border-left: 3px solid var(--ctp-overlay0); padding-left: 12px; margin: 0.8em 0; color: var(--ctp-subtext0); font-style: italic; } /* Horizontal rule */ .message.assistant .message-text hr { border: none; border-top: 1px solid var(--ctp-surface1); margin: 1em 0; } /* Tables */ .message.assistant .message-text table { border-collapse: collapse; width: 100%; margin: 0.8em 0; } .message.assistant .message-text th, .message.assistant .message-text td { border: 1px solid var(--ctp-surface1); padding: 6px 10px; text-align: left; } .message.assistant .message-text th { background: var(--ctp-surface0); color: var(--ctp-text); font-weight: 600; } /* Strong and emphasis */ .message.assistant .message-text strong { font-weight: 700; color: var(--ctp-text); } .message.assistant .message-text em { font-style: italic; } /* Copy button for code blocks */ .copy-button { position: absolute; top: 8px; right: 8px; background: var(--ctp-surface1); color: var(--ctp-text); border: 1px solid var(--ctp-surface2); padding: 4px 12px; font-size: 11px; font-family: inherit; border-radius: 4px; cursor: pointer; opacity: 0; transition: opacity 0.2s ease, background 0.15s ease; } .message.assistant .message-text pre:hover .copy-button { opacity: 1; } .copy-button:hover { background: var(--ctp-surface2); border-color: var(--ctp-mauve); } .copy-button:active { background: var(--ctp-surface0); } .copy-button.copied { background: var(--ctp-green); color: var(--ctp-base); border-color: var(--ctp-green); } /* ==================== CHAT INPUT ==================== */ .chat-input { padding: 16px; max-width: 100%; background: var(--ctp-mantle); border-top: 2px solid var(--ctp-surface0); } /* ==================== TYPING INDICATOR ==================== */ .typing { display: inline-flex; gap: 4px; } .typing span { width: 6px; height: 6px; background: var(--ctp-mauve); animation: blink 1s infinite step-start; } .typing span:nth-child(2) { animation-delay: 0.33s; } .typing span:nth-child(3) { animation-delay: 0.66s; } @keyframes blink { 0%, 100% { opacity: 1; } 50% { opacity: 0.2; } }