OwnGPT.v2 / client /src /index.css
parthib07's picture
Upload 200 files
48b8720 verified
/* ═══════════════════════════════════════════════
OwnGPT v2 β€” Design System
Font: Space Grotesk + JetBrains Mono
═══════════════════════════════════════════════ */
/* ── Design tokens ─────────────────────────── */
:root {
--bg: #07070E;
--bg2: #0C0C1A;
--bg3: #12122A;
--glass: rgba(10, 10, 24, 0.82);
--s: rgba(255,255,255,0.045);
--s2: rgba(255,255,255,0.08);
--s3: rgba(255,255,255,0.12);
--b: rgba(255,255,255,0.07);
--b2: rgba(255,255,255,0.13);
--b3: rgba(255,255,255,0.20);
--t: #EEEEFF;
--t2: rgba(238,238,255,0.60);
--t3: rgba(238,238,255,0.34);
--t4: rgba(238,238,255,0.18);
--vi: #8B5CF6;
--vi2: #A78BFA;
--cy: #06B6D4;
--cy2: #22D3EE;
--pk: #EC4899;
--am: #F59E0B;
--em: #111111;
--rd: #F43F5E;
--gv: rgba(139,92,246,0.22);
--gc: rgba(6,182,212,0.18);
--gp: rgba(236,72,153,0.14);
--grad: linear-gradient(135deg,var(--vi) 0%,var(--cy) 100%);
--gradt: linear-gradient(135deg,#C4B5FD 0%,#67E8F9 100%);
--sh: 0 8px 32px rgba(0,0,0,0.55);
--sh2: 0 20px 64px rgba(0,0,0,0.72);
--shg: 0 0 48px var(--gv);
--sw: 280px;
--sidebar-collapsed-w: 64px;
--th: 60px;
--r: 16px;
--rs: 10px;
--rx: 6px;
--rp: 999px;
--ease: cubic-bezier(0.22,1,0.36,1);
--spring: cubic-bezier(0.34,1.56,0.64,1);
--tr: 0.22s;
}
@media (prefers-reduced-motion: reduce) {
* {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
scroll-behavior: auto !important;
}
}
[data-theme="light"] {
--bg: #F2F2FF;
--bg2: #E8E8FF;
--bg3: #DDDDF8;
--glass: rgba(242,242,255,0.90);
--s: rgba(0,0,0,0.04);
--s2: rgba(0,0,0,0.07);
--s3: rgba(0,0,0,0.11);
--b: rgba(0,0,0,0.07);
--b2: rgba(0,0,0,0.12);
--b3: rgba(0,0,0,0.20);
--t: rgba(10,10,30,0.92);
--t2: rgba(10,10,30,0.58);
--t3: rgba(10,10,30,0.34);
--t4: rgba(10,10,30,0.18);
--vi: #7C3AED;
--vi2: #8B5CF6;
--cy: #0891B2;
--gv: rgba(124,58,237,0.18);
--gc: rgba(8,145,178,0.14);
--sh: 0 4px 20px rgba(0,0,0,0.12);
--sh2: 0 16px 48px rgba(0,0,0,0.18);
--shg: 0 0 36px rgba(124,58,237,0.14);
}
/* ── Reset ─────────────────────────────────── */
*,*::before,*::after { box-sizing:border-box; margin:0; padding:0; }
html { height:100%; scroll-behavior:smooth; }
.hidden { display:none !important; }
[hidden] { display:none !important; }
body {
height:100%;
font-family: 'Outfit', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
font-size: 14.5px;
line-height: 1.6;
color: var(--t);
background: var(--bg);
overflow: hidden;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
/* ── Premium Mesh Fluid Background ─────────────────────── */
.bg-mesh {
position: fixed; inset: -40%; z-index: 0; pointer-events: none;
background-image:
radial-gradient(circle at 10% 20%, rgba(139,92,246,0.18) 0%, transparent 40%),
radial-gradient(circle at 80% 30%, rgba(6,182,212,0.18) 0%, transparent 45%),
radial-gradient(circle at 40% 80%, rgba(236,72,153,0.14) 0%, transparent 45%),
radial-gradient(circle at 90% 90%, rgba(245,158,11,0.12) 0%, transparent 40%);
filter: blur(80px);
animation: bgRotate 35s linear infinite;
transform-origin: center;
opacity: 1;
}
[data-theme="light"] .bg-mesh {
background-image:
radial-gradient(circle at 10% 20%, rgba(124,58,237,0.16) 0%, transparent 50%),
radial-gradient(circle at 80% 30%, rgba(8,145,178,0.16) 0%, transparent 50%),
radial-gradient(circle at 40% 80%, rgba(219,39,119,0.12) 0%, transparent 50%);
filter: blur(90px);
}
@keyframes bgRotate {
0% { transform: rotate(0deg) scale(1); }
50% { transform: rotate(180deg) scale(1.1); }
100% { transform: rotate(360deg) scale(1); }
}
/* Base Glass Utility */
.premium-glass {
background: var(--glass);
backdrop-filter: blur(40px) saturate(2);
-webkit-backdrop-filter: blur(40px) saturate(2);
box-shadow: inset 0 1px 0 rgba(255,255,255,0.08), inset 0 -1px 0 rgba(0,0,0,0.1);
}
[data-theme="light"] .premium-glass {
box-shadow: inset 0 1px 0 rgba(255,255,255,0.8), inset 0 -1px 0 rgba(0,0,0,0.02);
}
/* ── Layout ────────────────────────────────── */
#root { height:100vh; position:relative; z-index:1; }
.app-shell {
display:flex;
height:100vh;
overflow:hidden;
}
/* ── Sidebar ───────────────────────────────── */
.sidebar {
width: var(--sw);
min-width: var(--sw);
height:100vh;
display:flex; flex-direction:column;
background: var(--glass);
backdrop-filter: blur(40px) saturate(2);
-webkit-backdrop-filter: blur(40px) saturate(2);
box-shadow: inset -1px 0 0 rgba(255,255,255,0.05), inset 1px 0 0 rgba(0,0,0,0.1);
border-right: 1px solid var(--b);
z-index: 30;
transition: transform 0.3s var(--ease), width 0.3s var(--ease);
overflow: hidden;
}
.sidebar.collapsed {
transform: translateX(-100%);
width: 0;
min-width: 0;
}
.sidebar-logo {
display:flex; align-items:center; gap:10px;
padding: 20px 18px 14px;
border-bottom: 1px solid var(--b);
flex-shrink:0;
}
.sidebar-logo-icon {
width:34px; height:34px; border-radius:10px;
background: var(--grad);
display:flex; align-items:center; justify-content:center;
font-size:16px; flex-shrink:0;
box-shadow: 0 0 20px var(--gv);
animation: logoPulse 3.5s ease-in-out infinite;
}
@keyframes logoPulse {
0%,100% { box-shadow:0 0 20px var(--gv); }
50% { box-shadow:0 0 36px var(--gv), 0 0 60px rgba(139,92,246,0.12); }
}
.sidebar-logo-text {
display:flex; flex-direction:column;
}
.sidebar-logo-name {
font-size:15px; font-weight:700; letter-spacing:-0.3px;
background: var(--gradt);
-webkit-background-clip:text; -webkit-text-fill-color:transparent; background-clip:text;
}
.sidebar-logo-version {
font-size:10px; color:var(--t3); letter-spacing:0.08em; text-transform:uppercase; font-weight:600;
}
.sidebar-top {
padding:14px 12px 8px;
flex-shrink:0;
}
.btn-new-chat {
width:100%; padding:10px 14px;
border-radius:var(--rs); border:1px dashed var(--b3);
background:var(--s);
color:var(--t2); font-size:13px; font-weight:600;
cursor:pointer; font-family:inherit;
display:flex; align-items:center; gap:8px;
transition: all 0.2s var(--ease);
}
.btn-new-chat:hover {
background:var(--gv); border-color:rgba(139,92,246,0.45); color:var(--vi2);
transform:translateY(-1px); box-shadow:0 4px 16px rgba(139,92,246,0.20);
}
.btn-new-chat svg { flex-shrink:0; }
.sidebar-search {
padding:10px 12px 6px;
flex-shrink:0;
}
.search-box {
width:100%; padding:8px 12px;
border-radius:var(--rs); border:1px solid var(--b);
background:var(--s);
color:var(--t); font-size:13px; font-family:inherit;
outline:none;
transition: all 0.2s var(--ease);
}
.search-box:focus { border-color:rgba(139,92,246,0.40); background:var(--s2); box-shadow:0 0 0 3px rgba(139,92,246,0.08); }
.search-box::placeholder { color:var(--t4); }
.sidebar-label {
padding:6px 14px 4px;
font-size:10px; font-weight:700; letter-spacing:0.12em; text-transform:uppercase; color:var(--t4);
}
.session-list {
list-style:none;
padding:0 8px;
overflow-y:auto; flex:1; min-height:0;
scrollbar-width:thin; scrollbar-color:var(--b) transparent;
}
.session-list::-webkit-scrollbar { width:3px; }
.session-list::-webkit-scrollbar-thumb { background:var(--b2); border-radius:4px; }
.session-item {
position:relative;
padding:9px 36px 9px 12px;
border-radius:var(--rs); border:1px solid transparent;
cursor:pointer; margin-bottom:3px;
transition: all 0.18s var(--ease);
animation: slideInLeft 280ms var(--ease) both;
}
@keyframes slideInLeft {
from { opacity:0; transform:translateX(-10px); }
to { opacity:1; transform:translateX(0); }
}
.session-item:hover { background:var(--s2); border-color:var(--b); }
.session-item.active {
background:var(--gv); border-color:rgba(139,92,246,0.35);
}
.session-item.active::before {
content:''; position:absolute; left:0; top:20%; height:60%; width:3px;
background:var(--grad); border-radius:0 3px 3px 0;
}
.session-title {
font-size:13px; font-weight:600;
overflow:hidden; text-overflow:ellipsis; white-space:nowrap;
color:var(--t);
}
.session-item.active .session-title { color:var(--vi2); }
.session-preview {
font-size:11.5px; color:var(--t3);
overflow:hidden; text-overflow:ellipsis; white-space:nowrap;
}
.session-delete {
position:absolute; right:6px; top:50%; transform:translateY(-50%);
width:24px; height:24px; border-radius:6px; border:none; background:transparent;
color:var(--t4); cursor:pointer; display:flex; align-items:center; justify-content:center;
opacity:0; transition: all 0.15s;
}
.session-item:hover .session-delete { opacity:1; }
.session-delete:hover { background:rgba(244,63,94,0.12); color:var(--rd); }
.sidebar-bottom {
padding:12px; border-top:1px solid var(--b); flex-shrink:0;
display:flex; flex-direction:column; gap:4px;
}
.sidebar-action {
display:flex; align-items:center; gap:10px;
padding:9px 12px; border-radius:var(--rs); border:none; background:transparent;
color:var(--t2); font-size:13px; font-weight:500; cursor:pointer; font-family:inherit;
transition: all 0.18s var(--ease); width:100%; text-align:left;
}
.sidebar-action:hover { background:var(--s2); color:var(--t); }
.sidebar-action.danger:hover { background:rgba(244,63,94,0.08); color:var(--rd); }
/* ── Main ──────────────────────────────────── */
.main {
flex:1; min-width:0;
display:flex; flex-direction:column;
height:100vh; position:relative;
}
/* ── Topbar ────────────────────────────────── */
.topbar {
height:var(--th); flex-shrink:0;
display:flex; align-items:center; justify-content:space-between; gap:12px;
padding:0 20px;
background: rgba(7,7,14,0.72);
backdrop-filter:blur(24px) saturate(2);
-webkit-backdrop-filter:blur(24px) saturate(2);
z-index:10; position:relative;
}
[data-theme="light"] .topbar { background:rgba(242,242,255,0.85); }
.topbar-left { display:flex; align-items:center; gap:10px; min-width:0; flex:1; }
.topbar-right { display:flex; align-items:center; gap:8px; flex-shrink:0; }
.icon-btn {
width:36px; height:36px;
display:flex; align-items:center; justify-content:center;
border-radius:var(--rs); border:1px solid var(--b); background:var(--s);
color:var(--t2); cursor:pointer;
transition: all 0.18s var(--ease);
}
.icon-btn:hover { background:var(--s2); color:var(--t); border-color:var(--b2); }
.icon-btn svg { width:16px; height:16px; stroke:currentColor; fill:none; stroke-width:2; stroke-linecap:round; stroke-linejoin:round; }
.session-title-display {
font-size:14px; font-weight:700;
overflow:hidden; text-overflow:ellipsis; white-space:nowrap; letter-spacing:-0.1px;
max-width:300px;
}
.avatar-btn {
width:36px; height:36px; border-radius:50%;
background:var(--grad); border:none; cursor:pointer;
display:flex; align-items:center; justify-content:center;
font-size:13px; font-weight:700; color:#fff;
box-shadow:0 0 0 2px var(--bg), 0 0 0 4px rgba(139,92,246,0.35);
transition: all 0.2s var(--ease);
position:relative;
}
.avatar-btn:hover { transform:scale(1.05); box-shadow:0 0 0 2px var(--bg), 0 0 0 4px rgba(139,92,246,0.55); }
.avatar-online { position:absolute; bottom:1px; right:1px; width:9px; height:9px; border-radius:50%; background:#111; border:2px solid var(--bg); }
/* Avatar dropdown */
.avatar-menu { position:relative; }
.avatar-dropdown {
position:absolute; right:0; top:calc(100% + 10px);
width:220px;
background:var(--glass); backdrop-filter:blur(28px); -webkit-backdrop-filter:blur(28px);
border:1px solid var(--b2); border-radius:var(--r);
box-shadow:var(--sh2); overflow:hidden; z-index:100;
animation: dropIn 180ms var(--spring) both;
}
@keyframes dropIn { from { opacity:0; transform:translateY(-8px) scale(0.96); } to { opacity:1; transform:none; } }
.avd-user { padding:14px 14px 10px; border-bottom:1px solid var(--b); }
.avd-name { font-size:13px; font-weight:700; }
.avd-sub { font-size:11.5px; color:var(--t3); margin-top:1px; }
.avd-item {
display:flex; align-items:center; gap:9px;
padding:10px 14px; border:none; background:none;
color:var(--t2); font-size:13px; font-weight:500; font-family:inherit;
cursor:pointer; width:100%; text-align:left;
transition: all 0.15s;
}
.avd-item:hover { background:var(--s2); color:var(--t); }
.avd-item.danger:hover { background:rgba(244,63,94,0.08); color:var(--rd); }
.avd-item svg { width:15px; height:15px; stroke:currentColor; fill:none; stroke-width:2; stroke-linecap:round; stroke-linejoin:round; flex-shrink:0; }
.avd-sep { height:1px; background:var(--b); margin:4px 0; }
/* Theme toggle */
.theme-btn {
display:flex; align-items:center; gap:6px;
padding:7px 12px; border-radius:var(--rs); border:1px solid var(--b); background:var(--s);
color:var(--t2); font-size:12px; font-weight:600; cursor:pointer; font-family:inherit;
transition: all 0.18s var(--ease);
}
.theme-btn:hover { background:var(--s2); color:var(--t); border-color:var(--b2); }
.theme-btn svg { width:14px; height:14px; stroke:currentColor; fill:none; stroke-width:2; stroke-linecap:round; }
/* ── Chat Area ─────────────────────────────── */
.chat-area {
flex:1; overflow-y:auto; min-height:0;
padding:28px 0 160px; /* bottom pad = floating input height */
scrollbar-width:thin; scrollbar-color:var(--b) transparent;
}
.chat-area::-webkit-scrollbar { width:4px; }
.chat-area::-webkit-scrollbar-thumb { background:var(--b2); border-radius:4px; }
.chat-inner {
max-width:760px;
margin:0 auto;
padding:0 20px;
display:flex; flex-direction:column; gap:8px;
}
/* ── Empty State ───────────────────────────── */
.empty-state {
display:flex; flex-direction:column; align-items:center; justify-content:center;
flex:1; padding:60px 24px;
animation: fadeUp 500ms var(--ease) both;
}
@keyframes fadeUp { from{opacity:0;transform:translateY(20px)} to{opacity:1;transform:translateY(0)} }
.empty-logo {
width:80px; height:80px; border-radius:24px;
background:var(--grad); display:flex; align-items:center; justify-content:center;
font-size:36px; margin-bottom:24px;
box-shadow:0 0 50px var(--gv), 0 0 100px rgba(139,92,246,0.10);
animation:logoPulse 3.5s ease-in-out infinite;
}
.empty-title {
font-size:26px; font-weight:700; letter-spacing:-0.5px; text-align:center;
background:var(--gradt); -webkit-background-clip:text; -webkit-text-fill-color:transparent; background-clip:text;
margin-bottom:10px;
}
.empty-sub {
font-size:14.5px; color:var(--t2); text-align:center; max-width:400px; line-height:1.7; margin-bottom:32px;
}
.suggestion-grid {
display:grid; grid-template-columns:repeat(2,1fr); gap:10px; max-width:560px;
}
.suggestion-card {
padding:14px 16px; border-radius:var(--rs);
border:1px solid var(--b2); background:var(--s);
cursor:pointer; text-align:left; font-family:inherit;
color:var(--t2); font-size:13px; line-height:1.5;
transition: all 0.2s var(--ease);
}
.suggestion-card:hover {
background:var(--gv); border-color:rgba(139,92,246,0.40); color:var(--vi2);
transform:translateY(-2px); box-shadow:0 6px 20px rgba(139,92,246,0.16);
}
.suggestion-card strong { display:block; color:var(--t); font-weight:600; margin-bottom:3px; }
/* ── Messages ──────────────────────────────── */
.msg-row {
display:flex; gap:12px;
padding:8px 0;
animation: msgIn 360ms var(--spring) both;
}
@keyframes msgIn { from{opacity:0;transform:translateY(14px) scale(0.98)} to{opacity:1;transform:none} }
.msg-row.user { justify-content:flex-end; }
.msg-indicator {
width:32px; height:32px; border-radius:50%; flex-shrink:0; margin-top:4px;
display:flex; align-items:center; justify-content:center;
font-size:13px; font-weight:700;
}
.msg-indicator.ai {
background:var(--grad);
box-shadow:0 0 16px rgba(139,92,246,0.40);
animation:logoPulse 3.5s ease-in-out infinite;
color:#fff;
}
.msg-indicator.user {
background:var(--s2); border:1px solid var(--b2); color:var(--t2);
}
/* AI message */
.msg-card {
background:var(--s);
border:1px solid var(--b); border-radius:4px 16px 16px 16px;
padding:14px 18px; max-width:85%;
box-shadow:0 2px 12px rgba(0,0,0,0.18);
transition: box-shadow 0.2s;
}
.msg-card:hover { box-shadow:0 4px 20px rgba(0,0,0,0.28); }
/* User message */
.user-bubble {
background:linear-gradient(135deg,rgba(139,92,246,0.18),rgba(6,182,212,0.12));
border:1px solid rgba(139,92,246,0.28);
border-radius:16px 4px 16px 16px;
padding:12px 18px; max-width:85%;
color:var(--t);
box-shadow:0 2px 14px rgba(139,92,246,0.12);
}
/* Attachments in user message */
.msg-atts {
display:flex; flex-wrap:wrap; gap:6px; margin-bottom:8px;
}
.msg-att-chip {
display:inline-flex; align-items:center; gap:5px;
padding:4px 10px; border-radius:var(--rp);
background:rgba(139,92,246,0.15); border:1px solid rgba(139,92,246,0.30);
font-size:11.5px; color:var(--vi2);
}
/* Model badge */
.msg-badge {
display:inline-flex; align-items:center; gap:5px;
margin-top:10px; padding:3px 10px;
border-radius:var(--rp); background:var(--s2); border:1px solid var(--b2);
font-size:11px; color:var(--t3); font-weight:500;
}
/* Markdown content */
.msg-markdown { font-size:14px; line-height:1.72; color:var(--t); }
.msg-markdown p { margin:0 0 10px; }
.msg-markdown p:last-child { margin-bottom:0; }
.msg-markdown ul, .msg-markdown ol { padding-left:22px; margin:8px 0 10px; }
.msg-markdown li { margin:4px 0; }
.msg-markdown h1,.msg-markdown h2,.msg-markdown h3 { font-weight:700; margin:16px 0 8px; }
.msg-markdown h1 { font-size:1.24em; }
.msg-markdown h2 { font-size:1.10em; }
.msg-markdown h3 { font-size:1.00em; }
.msg-markdown strong { font-weight:700; }
.msg-markdown em { color:var(--t2); font-style:italic; }
.msg-markdown a { color:var(--cy); text-decoration:underline; text-underline-offset:2px; }
.msg-markdown blockquote {
border-left:3px solid rgba(139,92,246,0.50); padding-left:14px;
margin:10px 0; color:var(--t2); font-style:italic;
}
.msg-markdown hr { border:none; border-top:1px solid var(--b); margin:14px 0; }
.msg-markdown table { border-collapse:collapse; width:100%; margin:10px 0; font-size:13px; }
.msg-markdown th,.msg-markdown td { border:1px solid var(--b); padding:8px 12px; }
.msg-markdown th { background:var(--s2); font-weight:700; }
.msg-markdown code {
background:rgba(139,92,246,0.12); border:1px solid rgba(139,92,246,0.22);
padding:1px 6px; border-radius:5px;
font-family:'JetBrains Mono',ui-monospace,monospace; font-size:12.5px; color:var(--vi2);
}
/* Code blocks */
.code-wrap {
position:relative; margin:12px 0;
border-radius:12px; overflow:hidden;
border:1px solid var(--b); background:rgba(0,0,0,0.40);
box-shadow:0 4px 20px rgba(0,0,0,0.30);
}
.code-header {
display:flex; align-items:center; justify-content:space-between;
padding:6px 14px; background:rgba(0,0,0,0.35); border-bottom:1px solid var(--b);
}
.code-lang { font-size:10.5px; font-weight:700; color:var(--t3); letter-spacing:0.08em; text-transform:uppercase; }
.copy-btn {
display:inline-flex; align-items:center; gap:5px;
padding:3px 10px; border-radius:var(--rx); border:1px solid var(--b);
background:var(--s2); color:var(--t3); font-size:11.5px; font-weight:600;
cursor:pointer; font-family:inherit;
transition: all 0.15s;
}
.copy-btn:hover { background:var(--gv); border-color:rgba(139,92,246,0.40); color:var(--vi2); }
.copy-btn.copied { background:rgba(0,0,0,0.18); border-color:rgba(255,255,255,0.18); color:var(--t); }
.hljs-pre { margin:0; padding:16px; overflow-x:auto; font-family:'JetBrains Mono',ui-monospace,monospace; font-size:13px; line-height:1.65; }
.msg-markdown .hljs-pre { border-radius:0; }
/* Typing cursor */
.typing-cursor {
display:inline-block; width:2px; height:1.1em;
background:var(--vi); margin-left:2px; vertical-align:text-bottom;
animation:blink 0.8s ease-in-out infinite;
}
@keyframes blink { 0%,50%{opacity:1} 51%,100%{opacity:0} }
/* ── Composer β€” fixed floating bar ──────────── */
.composer-wrap {
position: fixed;
bottom: 20px;
left: 50%;
transform: translateX(-50%);
width: calc(100% - 40px); /* full width minus gutters */
max-width: 800px;
z-index: 50;
/* fade behind input: rendered via the composer's own backdrop */
}
/* Sidebar-aware offsetting */
.app-shell:has(.sidebar:not(.collapsed)) .composer-wrap {
left: calc(50% + var(--sw) / 2);
}
.composer {
width: 100%;
position: relative;
background: var(--glass);
backdrop-filter: blur(48px) saturate(2);
-webkit-backdrop-filter: blur(48px) saturate(2);
border-radius: 20px;
border: 1px solid var(--b2);
box-shadow:
0 8px 32px rgba(0,0,0,0.32),
0 2px 8px rgba(0,0,0,0.18),
inset 0 1px 0 rgba(255,255,255,0.06);
transition: box-shadow 0.22s, border-color 0.22s, transform 0.18s;
}
.composer:focus-within {
transform: translateY(-2px);
box-shadow:
0 12px 40px rgba(0,0,0,0.38),
0 3px 10px rgba(0,0,0,0.20),
inset 0 1px 0 rgba(255,255,255,0.08);
border-color: rgba(255,255,255,0.14);
}
/* Input row β€” no border, just padding */
.composer-row {
display:flex; align-items:flex-end; gap:10px;
padding:14px 16px 6px;
}
.msg-input {
flex:1; border:none; background:transparent; color:var(--t);
font-family:inherit; font-size:15px; resize:none; outline:none;
line-height:1.6; min-height:36px; max-height:200px;
}
.msg-input::placeholder { color:var(--t4); }
/* Bottom toolbar β€” no top border */
.composer-toolbar {
display:flex; align-items:center; justify-content:space-between;
padding:6px 10px 10px;
gap:6px;
}
.composer-toolbar-left { display:flex; align-items:center; gap:6px; }
.composer-toolbar-right { display:flex; align-items:center; gap:6px; flex-shrink:0; }
/* Icon-only button (attach, mic) */
.composer-icon-btn {
display:flex; align-items:center; justify-content:center;
width:32px; height:32px; border-radius:var(--rs); border:none; background:transparent;
color:var(--t3); cursor:pointer;
transition: all 0.18s var(--ease);
}
.composer-icon-btn:hover { background:var(--s2); color:var(--t2); }
.composer-icon-btn svg {
width:16px; height:16px; stroke:currentColor; fill:none;
stroke-width:2; stroke-linecap:round; stroke-linejoin:round;
}
/* Pill selector buttons (model, mode) */
.composer-pill-btn {
display:inline-flex; align-items:center; gap:5px;
padding:5px 11px; border-radius:var(--rp);
border:1px solid var(--b); background:transparent;
color:var(--t2); font-size:12.5px; font-weight:500;
cursor:pointer; font-family:inherit;
transition: all 0.18s var(--ease);
}
.composer-pill-btn:hover { background:var(--s2); color:var(--t); border-color:var(--b2); }
.composer-pill-btn.active { background:var(--gv); border-color:rgba(139,92,246,0.40); color:var(--vi2); }
.composer-pill-btn .badge {
background:var(--vi); color:#fff; font-size:9px; font-weight:700;
padding:1px 5px; border-radius:var(--rp); margin-left:2px;
}
.composer-sep { opacity:0.35; margin:0 1px; }
.chevron-icon {
width:12px; height:12px; stroke:currentColor; fill:none;
stroke-width:2.5; stroke-linecap:round;
}
/* Send button β€” solid black/dark, circular */
.send-btn {
width:34px; height:34px; border-radius:50%; border:none;
background:#111; color:#fff; cursor:pointer; flex-shrink:0;
display:flex; align-items:center; justify-content:center;
transition: all 0.2s var(--spring);
}
[data-theme="light"] .send-btn { background:#1a1a1a; }
.send-btn:hover:not(:disabled) { background:#000; transform:scale(1.08); }
.send-btn:active:not(:disabled) { transform:scale(0.94); }
.send-btn:disabled { background:var(--s3); color:var(--t4); cursor:not-allowed; }
.send-btn svg { width:15px; height:15px; stroke:currentColor; fill:none; stroke-width:2.5; stroke-linecap:round; }
/* Attachments */
.attachments-bar {
display:flex; flex-wrap:wrap; gap:6px; padding:10px 16px 0;
}
.att-chip {
display:inline-flex; align-items:center; gap:6px;
padding:4px 10px; border-radius:var(--rp);
background:var(--gv); border:1px solid rgba(139,92,246,0.35);
font-size:12px; color:var(--vi2);
}
.att-remove {
background:none; border:none; color:var(--vi2); cursor:pointer; padding:0; line-height:1; font-size:14px;
transition:color 0.15s;
}
.att-remove:hover { color:var(--rd); }
.composer-hint {
text-align:center; font-size:11.5px; color:var(--t4); padding:6px 0 0;
}
.composer-hint kbd {
background:var(--s2); border:1px solid var(--b2); padding:1px 5px; border-radius:4px; font-size:10.5px;
}
/* Status bar */
.status-bar {
max-width:760px; margin:0 auto 6px;
display:flex; align-items:center; gap:8px;
padding:0 4px;
font-size:12px; color:var(--t3);
animation: fadeUp 200ms var(--ease) both;
}
.status-pulse {
width:7px; height:7px; border-radius:50%; background:var(--vi);
box-shadow:0 0 8px var(--vi);
animation:blink 0.9s ease-in-out infinite;
}
/* ── Modal base ─────────────────────────────── */
.modal-overlay {
position:fixed; inset:0; z-index:200;
background:rgba(7,7,14,0.72);
backdrop-filter:blur(8px); -webkit-backdrop-filter:blur(8px);
display:flex; align-items:center; justify-content:center;
padding:20px;
animation:overlayIn 200ms ease both;
}
@keyframes overlayIn { from{opacity:0} to{opacity:1} }
.modal-card {
background:var(--glass); backdrop-filter:blur(28px); -webkit-backdrop-filter:blur(28px);
border:1px solid var(--b2); border-radius:22px;
box-shadow:var(--sh2);
width:100%; max-width:440px;
animation:modalIn 280ms var(--spring) both;
overflow:hidden;
}
@keyframes modalIn { from{opacity:0;transform:scale(0.94) translateY(16px)} to{opacity:1;transform:none} }
.modal-header {
display:flex; align-items:center; justify-content:space-between;
padding:20px 22px 16px; border-bottom:1px solid var(--b);
}
.modal-title { font-size:16px; font-weight:700; }
.modal-close {
width:28px; height:28px; border-radius:var(--rx); border:none; background:var(--s);
color:var(--t3); cursor:pointer; display:flex; align-items:center; justify-content:center;
transition:all 0.15s;
}
.modal-close:hover { background:var(--s2); color:var(--t); }
.modal-close svg { width:14px; height:14px; stroke:currentColor; fill:none; stroke-width:2.5; stroke-linecap:round; }
.modal-body { padding:20px 22px; }
.modal-footer { padding:0 22px 20px; display:flex; justify-content:flex-end; gap:10px; }
.field-label { display:block; font-size:12.5px; font-weight:600; color:var(--t2); margin-bottom:6px; }
.field-input {
width:100%; padding:10px 14px;
border-radius:var(--rs); border:1px solid var(--b2); background:var(--s);
color:var(--t); font-size:13.5px; font-family:inherit; outline:none;
transition:all 0.2s var(--ease); margin-bottom:14px;
}
.field-input:focus { border-color:rgba(139,92,246,0.45); background:var(--s2); box-shadow:0 0 0 3px rgba(139,92,246,0.08); }
.field-input::placeholder { color:var(--t4); }
.field-error { font-size:12px; color:var(--rd); margin-top:-10px; margin-bottom:12px; min-height:16px; }
/* ── Buttons ───────────────────────────────── */
.btn {
display:inline-flex; align-items:center; gap:7px;
padding:10px 20px; border-radius:var(--rs); border:1px solid var(--b2);
background:var(--s2); color:var(--t2); font-size:13.5px; font-weight:600;
cursor:pointer; font-family:inherit;
transition: all 0.2s var(--ease);
}
.btn:hover { background:var(--s3); color:var(--t); }
.btn-primary {
background:var(--grad); border-color:transparent; color:#fff;
box-shadow:0 4px 16px rgba(139,92,246,0.30);
}
.btn-primary:hover { box-shadow:0 6px 24px rgba(139,92,246,0.45); transform:translateY(-1px); }
.btn-primary:active { transform:scale(0.97); }
.btn-primary:disabled { opacity:0.45; cursor:not-allowed; transform:none; }
.btn-google {
background:var(--s); border-color:var(--b2); color:var(--t);
display:flex; align-items:center; justify-content:center; gap:10px; width:100%;
}
.btn-google:hover { background:var(--s2); }
.btn-danger { background:rgba(244,63,94,0.10); border-color:rgba(244,63,94,0.30); color:var(--rd); }
.btn-danger:hover { background:rgba(244,63,94,0.18); }
.btn-link { background:none; border:none; color:var(--vi2); font-size:13px; cursor:pointer; font-family:inherit; font-weight:500; }
.btn-link:hover { color:var(--vi); text-decoration:underline; }
.divider-or {
display:flex; align-items:center; gap:12px; margin:14px 0;
color:var(--t4); font-size:12px;
}
.divider-or::before,.divider-or::after { content:''; flex:1; height:1px; background:var(--b2); }
/* ── Auth toggle tabs ───────────────────────── */
.auth-tabs {
display:flex; border-radius:var(--rs); background:var(--s); border:1px solid var(--b);
padding:3px; gap:3px; margin-bottom:20px;
}
.auth-tab {
flex:1; padding:8px; border-radius:var(--rx); border:none; background:transparent;
color:var(--t3); font-size:13px; font-weight:600; cursor:pointer; font-family:inherit;
transition:all 0.2s var(--ease);
}
.auth-tab.active { background:var(--s2); color:var(--t); box-shadow:0 2px 8px rgba(0,0,0,0.20); }
/* ── Model Picker ──────────────────────────── */
.model-picker-card { max-width:580px; }
.picker-layout { display:flex; gap:0; height:400px; }
.picker-providers {
width:160px; min-width:160px; padding:12px 8px;
border-right:1px solid var(--b); overflow-y:auto;
}
.picker-prov-btn {
width:100%; display:flex; align-items:center; gap:8px;
padding:9px 10px; border-radius:var(--rs); border:none; background:transparent;
color:var(--t2); font-size:12.5px; font-weight:500; cursor:pointer; font-family:inherit;
transition:all 0.18s; text-align:left;
}
.picker-prov-btn:hover { background:var(--s2); color:var(--t); }
.picker-prov-btn.active { background:var(--gv); color:var(--vi2); }
.picker-prov-icon { font-size:16px; flex-shrink:0; }
.picker-models { flex:1; padding:12px; overflow-y:auto; }
.picker-model-item {
display:flex; align-items:flex-start; gap:10px;
padding:10px 12px; border-radius:var(--rs); border:1px solid transparent;
cursor:pointer; margin-bottom:5px; transition:all 0.15s;
}
.picker-model-item:hover { background:var(--s2); border-color:var(--b); }
.picker-model-item.active { background:var(--gv); border-color:rgba(139,92,246,0.35); }
.picker-model-badge { font-size:20px; flex-shrink:0; margin-top:1px; }
.picker-model-name { font-size:13px; font-weight:600; color:var(--t); }
.picker-model-active .picker-model-name { color:var(--vi2); }
.picker-traits { display:flex; flex-wrap:wrap; gap:4px; margin-top:5px; }
.trait-pill {
font-size:10px; font-weight:700; padding:2px 7px; border-radius:var(--rp);
background:var(--s2); border:1px solid var(--b2); color:var(--t3);
}
.trait-pill.free { background:rgba(0,0,0,0.25); border-color:rgba(255,255,255,0.14); color:var(--t2); }
.trait-pill.fast { background:rgba(6,182,212,0.10); border-color:rgba(6,182,212,0.25); color:var(--cy2); }
.trait-pill.powerful { background:rgba(139,92,246,0.10); border-color:rgba(139,92,246,0.28); color:var(--vi2); }
.trait-pill.latest { background:rgba(245,158,11,0.10); border-color:rgba(245,158,11,0.28); color:var(--am); }
.trait-pill.reasoning { background:rgba(236,72,153,0.10); border-color:rgba(236,72,153,0.28); color:var(--pk); }
/* ── Feedback Modal ────────────────────────── */
.star-row { display:flex; gap:8px; margin-bottom:6px; }
.star-btn {
background:none; border:none; cursor:pointer; font-size:30px;
color:var(--b3); padding:0; line-height:1;
transition:all 0.15s var(--spring);
}
.star-btn.lit,.star-btn.hover { color:var(--am); transform:scale(1.15); filter:drop-shadow(0 0 6px rgba(245,158,11,0.55)); }
.star-hint { font-size:12px; color:var(--t3); height:16px; font-weight:500; }
.fcat-row { display:flex; flex-wrap:wrap; gap:6px; margin:10px 0 16px; }
.fcat-btn {
padding:6px 14px; border-radius:var(--rp); border:1px solid var(--b2);
background:var(--s); color:var(--t2); font-size:12.5px; font-weight:600;
cursor:pointer; font-family:inherit; transition:all 0.15s;
}
.fcat-btn:hover { background:var(--s2); color:var(--t); }
.fcat-btn.active { background:var(--gv); border-color:rgba(139,92,246,0.45); color:var(--vi2); }
.field-textarea {
width:100%; padding:10px 14px; border-radius:var(--rs);
border:1px solid var(--b2); background:var(--s); color:var(--t);
font-size:13.5px; font-family:inherit; resize:vertical; min-height:100px; outline:none;
transition:all 0.2s var(--ease);
}
.field-textarea:focus { border-color:rgba(139,92,246,0.45); background:var(--s2); box-shadow:0 0 0 3px rgba(139,92,246,0.08); }
.field-textarea::placeholder { color:var(--t4); }
.char-count { text-align:right; font-size:11px; color:var(--t4); margin-top:4px; }
.feedback-success {
display:flex; flex-direction:column; align-items:center;
padding:36px 24px 28px; gap:12px; text-align:center;
animation:modalIn 360ms var(--spring) both;
}
.feedback-success-icon { font-size:54px; line-height:1; animation:bounceIn 500ms var(--spring) both; }
@keyframes bounceIn {
0% { transform:scale(0); opacity:0; }
70% { transform:scale(1.2); opacity:1; }
100% { transform:scale(1); }
}
.feedback-success-title { font-size:20px; font-weight:700; background:var(--gradt); -webkit-background-clip:text; -webkit-text-fill-color:transparent; background-clip:text; }
.feedback-success-sub { font-size:13.5px; color:var(--t2); max-width:280px; line-height:1.6; }
/* ── Settings Modal ────────────────────────── */
.settings-row {
display:flex; align-items:center; justify-content:space-between;
padding:14px 0; border-bottom:1px solid var(--b);
}
.settings-row:last-child { border-bottom:none; }
.settings-row-label { font-size:13.5px; font-weight:600; }
.settings-row-sub { font-size:12px; color:var(--t3); margin-top:2px; }
.seg-ctrl {
display:flex; border-radius:var(--rs); background:var(--s); border:1px solid var(--b); padding:3px; gap:3px;
}
.seg-btn {
padding:6px 12px; border-radius:var(--rx); border:none; background:transparent;
color:var(--t3); font-size:12px; font-weight:600; cursor:pointer; font-family:inherit;
transition:all 0.18s;
}
.seg-btn.active { background:var(--s2); color:var(--t); box-shadow:0 2px 6px rgba(0,0,0,0.20); }
/* ── Responsive ────────────────────────────── */
@media (max-width: 700px) {
:root { --sw: 100vw; }
.sidebar { position:fixed; left:0; top:0; transform:translateX(-100%); transition:transform 0.3s var(--ease); }
.sidebar.open { transform:translateX(0); }
.suggestion-grid { grid-template-columns:1fr; }
.chat-inner { padding:0 12px; }
.composer-wrap { padding:10px 12px 14px; }
.picker-layout { flex-direction:column; }
.picker-providers { width:100%; min-width:0; display:flex; flex-wrap:wrap; gap:4px; border-right:none; border-bottom:1px solid var(--b); }
.picker-prov-btn { width:auto; }
}
/* ── Utilities ─────────────────────────────── */
.flex { display:flex; }
.items-center { align-items:center; }
.gap-2 { gap:8px; }
.mt-1 { margin-top:4px; }
.mt-2 { margin-top:8px; }
.w-full { width:100%; }
.text-sm { font-size:12.5px; }
.text-muted { color:var(--t3); }
.font-bold { font-weight:700; }
/* ── UI Enhancements ───────────────────────── */
/* Composer focus glow */
@keyframes glowPulse {
0%, 100% { opacity: 0.3; }
50% { opacity: 0.6; }
}
.composer-glow {
position: absolute; inset: -2px; border-radius: 20px;
background: linear-gradient(135deg, var(--vi), var(--cy), var(--pk));
opacity: 0; transition: opacity 0.3s;
z-index: -1; pointer-events: none;
}
.composer:focus-within .composer-glow { animation: glowPulse 3s ease-in-out infinite; }
/* Scroll FAB β€” must be fixed to stay above floating composer */
.scroll-fab {
position: fixed; bottom: 140px; right: 28px;
width: 40px; height: 40px; border-radius: 50%;
background: var(--glass); border: 1px solid var(--b2);
display: flex; align-items: center; justify-content: center;
color: var(--t2); cursor: pointer;
backdrop-filter: blur(20px); -webkit-backdrop-filter: blur(20px);
box-shadow: var(--sh); z-index: 60;
transition: all 0.2s var(--spring);
opacity: 0; pointer-events: none; transform: translateY(10px) scale(0.9);
}
.scroll-fab.visible { opacity: 1; pointer-events: auto; transform: none; }
.scroll-fab:hover { background: var(--s2); color: var(--t); transform: translateY(-3px) scale(1.05); }
/* Message Actions */
.msg-actions {
position: absolute; top: -14px; right: 12px;
display: flex; gap: 4px; padding: 4px;
background: var(--glass); border: 1px solid var(--b2); border-radius: 8px;
opacity: 0; transition: all 0.2s; pointer-events: none;
box-shadow: var(--sh);
}
.msg-card { position: relative; }
.msg-card:hover .msg-actions { opacity: 1; pointer-events: auto; }
.msg-action-btn {
background: none; border: none; padding: 4px;
color: var(--t3); border-radius: 4px; cursor: pointer;
display: flex; align-items: center; justify-content: center;
}
.msg-action-btn:hover { background: var(--s2); color: var(--t); }
/* ── Responsive ────────────────────────────── */
@media (max-width: 768px) {
.composer-wrap {
bottom: 12px;
width: calc(100% - 24px);
}
/* On mobile, no sidebar offset needed */
.app-shell:has(.sidebar:not(.collapsed)) .composer-wrap {
left: 50%;
}
.chat-area {
padding-bottom: 140px;
}
.scroll-fab {
right: 14px;
bottom: 130px;
}
.suggestion-grid {
grid-template-columns: 1fr;
}
}
/* Enhanced Typing Indicator */
.typing-wave { display: flex; gap: 4px; align-items: center; height: 20px; }
.typing-dot {
width: 6px; height: 6px; border-radius: 50%; background: var(--vi);
animation: typingWave 1.4s infinite ease-in-out both;
}
.typing-dot:nth-child(1) { animation-delay: -0.32s; }
.typing-dot:nth-child(2) { animation-delay: -0.16s; }
@keyframes typingWave {
0%, 80%, 100% { transform: scale(0); } 40% { transform: scale(1); }
}
/* Staggered Suggestions */
.suggestion-card { will-change: transform, opacity; }