Agentscoop / static /css /app.css
Nerdur's picture
F05+TokenSaver: export dropdown, Token Saver banner in chat, improved PDF/MD (v2.7.1)
02ad098 verified
Raw
History Blame Contribute Delete
59.8 kB
/* ── AgentScope PWA β€” app.css ───────────────────────────────────────────── */
/* Aesthetic: industrial-terminal, cyan on near-black, monospace precision */
@import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@300;400;500;600;700&family=Syne:wght@400;600;700;800&display=swap');
/* ── CSS Variables ── */
:root {
--bg: #080c14;
--bg2: #0d1220;
--bg3: #111827;
--border: rgba(0,229,255,.12);
--border2: rgba(0,229,255,.22);
--accent: #00e5ff;
--accent2: #7c3aed;
--accent3: #10b981;
--warn: #f59e0b;
--error: #ef4444;
--text: #e2e8f0;
--text2: #94a3b8;
--text3: #64748b;
--sidebar-w: 260px;
--radius: 6px;
--font-mono: 'JetBrains Mono', 'Fira Code', monospace;
--font-ui: 'Syne', 'JetBrains Mono', sans-serif;
--transition: .18s cubic-bezier(.4,0,.2,1);
}
body.light {
--bg: #f0f4f8;
--bg2: #ffffff;
--bg3: #e8edf4;
--border: rgba(0,100,180,.14);
--border2: rgba(0,100,180,.28);
--accent: #0284c7;
--text: #0f172a;
--text2: #475569;
--text3: #94a3b8;
}
/* ── Reset ── */
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
html {
height: 100%;
}
body {
/* body IS the layout flex container (no .layout wrapper in HTML) */
display: flex;
height: 100vh;
height: 100dvh; /* dynamic: shrinks when mobile keyboard appears */
width: 100vw;
overflow: hidden;
font-family: var(--font-mono);
background: var(--bg);
color: var(--text);
font-size: 14px;
line-height: 1.5;
}
/* ── Layout (alias β€” body already is the flex container) ── */
.layout {
display: flex;
height: 100vh;
height: 100dvh;
width: 100vw;
overflow: hidden;
}
/* ── Sidebar ── */
.sidebar {
width: var(--sidebar-w);
min-width: var(--sidebar-w);
background: var(--bg2);
border-right: 1px solid var(--border);
display: flex;
flex-direction: column;
overflow: hidden;
transition: transform var(--transition);
z-index: 100;
position: relative;
}
.sidebar-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 1rem;
border-bottom: 1px solid var(--border);
flex-shrink: 0;
}
.logo {
display: flex;
align-items: center;
gap: .5rem;
font-family: var(--font-ui);
font-size: 1.1rem;
font-weight: 700;
letter-spacing: .02em;
color: var(--accent);
}
.logo-icon {
font-size: 1.4rem;
filter: drop-shadow(0 0 6px var(--accent));
}
.btn-new {
width: 28px;
height: 28px;
display: flex;
align-items: center;
justify-content: center;
background: transparent;
border: 1px solid var(--border2);
color: var(--accent);
border-radius: var(--radius);
cursor: pointer;
transition: background var(--transition);
}
.btn-new:hover { background: rgba(0,229,255,.1); }
.btn-new svg { width: 14px; height: 14px; }
/* Nav */
.sidebar-nav {
display: flex;
flex-direction: column;
gap: 2px;
padding: .5rem;
flex-shrink: 0;
border-bottom: 1px solid var(--border);
}
.nav-item {
display: flex;
align-items: center;
gap: .6rem;
padding: .5rem .75rem;
background: transparent;
border: none;
color: var(--text2);
border-radius: var(--radius);
cursor: pointer;
font-family: var(--font-ui);
font-size: .8rem;
font-weight: 600;
letter-spacing: .08em;
text-transform: uppercase;
transition: all var(--transition);
text-align: left;
}
.nav-item svg { width: 15px; height: 15px; flex-shrink: 0; }
.nav-item:hover { background: rgba(0,229,255,.07); color: var(--text); }
.nav-item.active { background: rgba(0,229,255,.12); color: var(--accent); }
/* Session list */
.session-list-header {
padding: .5rem 1rem .25rem;
font-size: .65rem;
letter-spacing: .12em;
color: var(--text3);
font-family: var(--font-ui);
font-weight: 700;
flex-shrink: 0;
display: flex;
align-items: center;
justify-content: space-between;
}
.btn-new-session {
font-size: .65rem;
letter-spacing: 0;
font-weight: 600;
color: var(--accent);
background: rgba(0,229,255,.08);
border: 1px solid rgba(0,229,255,.2);
border-radius: 4px;
padding: 2px 8px;
cursor: pointer;
transition: background .15s;
white-space: nowrap;
}
.btn-new-session:hover { background: rgba(0,229,255,.18); }
.session-list {
flex: 1;
overflow-y: auto;
list-style: none;
padding: .25rem .5rem;
}
.session-list::-webkit-scrollbar { width: 4px; }
.session-list::-webkit-scrollbar-thumb { background: var(--border2); border-radius: 2px; }
.session-item {
display: flex;
align-items: center;
gap: .5rem;
padding: .5rem .6rem;
border-radius: var(--radius);
cursor: pointer;
transition: background var(--transition);
border: 1px solid transparent;
}
.session-item:hover { background: rgba(0,229,255,.05); }
.session-item.active { background: rgba(0,229,255,.1); border-color: var(--border2); }
.session-dot {
width: 6px; height: 6px;
border-radius: 50%;
background: var(--accent3);
flex-shrink: 0;
}
.session-title {
flex: 1;
font-size: .78rem;
color: var(--text2);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.session-item.active .session-title { color: var(--text); }
.session-del {
width: 20px; height: 20px;
display: flex; align-items: center; justify-content: center;
background: transparent; border: none;
color: var(--text3); cursor: pointer;
border-radius: 4px; opacity: 0;
transition: opacity var(--transition);
}
.session-item:hover .session-del { opacity: 1; }
.session-del:hover { color: var(--error); }
.session-del svg { width: 12px; height: 12px; }
/* Sidebar footer */
.sidebar-footer {
padding: .75rem 1rem;
border-top: 1px solid var(--border);
display: flex;
align-items: center;
gap: .5rem;
flex-shrink: 0;
}
.status-dot {
width: 8px; height: 8px;
border-radius: 50%;
background: var(--error);
margin-left: auto;
transition: background .3s;
}
.status-dot.online { background: var(--accent3); box-shadow: 0 0 6px var(--accent3); }
/* ── Mobile topbar ── */
.mobile-topbar {
display: none;
position: fixed;
top: 0; left: 0; right: 0;
height: 52px;
background: var(--bg2);
border-bottom: 1px solid var(--border);
align-items: center;
justify-content: space-between;
padding: 0 .75rem;
z-index: 200;
}
.mobile-title {
font-family: var(--font-ui);
font-size: 1rem;
font-weight: 700;
color: var(--accent);
}
/* ── Main ── */
.main {
flex: 1;
display: flex;
flex-direction: column;
overflow: hidden;
min-width: 0;
}
/* ── Views ── */
.view { display: none; flex: 1; flex-direction: column; overflow: hidden; }
.view.active { display: flex; }
/* ── Chat view ── */
.chat-header {
padding: .75rem 1.25rem;
border-bottom: 1px solid var(--border);
display: flex;
align-items: center;
justify-content: space-between;
background: var(--bg2);
flex-shrink: 0;
}
.chat-header-info { display: flex; flex-direction: column; gap: 2px; }
.chat-agent-name {
font-family: var(--font-ui);
font-size: .95rem;
font-weight: 700;
color: var(--text);
}
.chat-model-tag {
font-size: .7rem;
color: var(--accent);
background: rgba(0,229,255,.1);
padding: 1px 6px;
border-radius: 3px;
width: fit-content;
border: 1px solid rgba(0,229,255,.2);
}
.chat-header-actions { display: flex; gap: .5rem; }
/* Messages */
.messages {
flex: 1;
overflow-y: auto;
overflow-x: hidden;
padding: 1.25rem;
display: flex;
flex-direction: column;
gap: 1rem;
min-width: 0;
}
.messages::-webkit-scrollbar { width: 4px; }
.messages::-webkit-scrollbar-thumb { background: var(--border2); border-radius: 2px; }
.message {
display: flex;
gap: .75rem;
animation: msgIn .2s ease-out;
}
@keyframes msgIn {
from { opacity: 0; transform: translateY(8px); }
to { opacity: 1; transform: translateY(0); }
}
.message.user { flex-direction: row-reverse; }
.msg-avatar {
width: 32px; height: 32px;
border-radius: 6px;
display: flex; align-items: center; justify-content: center;
font-size: .75rem;
font-weight: 700;
flex-shrink: 0;
font-family: var(--font-ui);
}
.message.user .msg-avatar {
background: rgba(124,58,237,.2);
border: 1px solid rgba(124,58,237,.4);
color: #a78bfa;
}
.message.assistant .msg-avatar {
background: rgba(0,229,255,.1);
border: 1px solid rgba(0,229,255,.25);
color: var(--accent);
}
.message.system .msg-avatar {
background: rgba(16,185,129,.1);
border: 1px solid rgba(16,185,129,.25);
color: var(--accent3);
}
.msg-body { flex: 1; min-width: 0; }
.msg-meta {
font-size: .68rem;
color: var(--text3);
margin-bottom: .25rem;
}
.msg-content {
background: var(--bg3);
border: 1px solid var(--border);
border-radius: var(--radius);
padding: .75rem 1rem;
font-size: .85rem;
line-height: 1.7;
word-break: break-word;
position: relative;
}
.message.user .msg-content {
background: rgba(124,58,237,.1);
border-color: rgba(124,58,237,.25);
}
/* Markdown in messages */
.msg-content h1, .msg-content h2, .msg-content h3 {
font-family: var(--font-ui);
color: var(--accent);
margin: .75rem 0 .35rem;
}
.msg-content h1 { font-size: 1.2rem; }
.msg-content h2 { font-size: 1rem; }
.msg-content h3 { font-size: .9rem; }
.msg-content p { margin: .4rem 0; }
.msg-content ul, .msg-content ol { margin: .4rem 0 .4rem 1.2rem; }
.msg-content li { margin: .2rem 0; }
.msg-content a { color: var(--accent); text-decoration: underline; }
.msg-content code {
font-family: var(--font-mono);
font-size: .8em;
background: rgba(0,229,255,.08);
border: 1px solid rgba(0,229,255,.15);
padding: 1px 5px;
border-radius: 3px;
}
.msg-content pre {
background: #030712;
border: 1px solid var(--border2);
border-radius: var(--radius);
padding: .75rem 1rem;
overflow-x: auto;
max-width: 100%;
margin: .5rem 0;
position: relative;
box-sizing: border-box;
}
.msg-content pre code {
background: transparent;
border: none;
padding: 0;
font-size: .78rem;
white-space: pre-wrap;
word-break: break-word;
overflow-wrap: break-word;
}
.copy-code-btn {
position: absolute;
top: .4rem; right: .4rem;
background: rgba(0,229,255,.1);
border: 1px solid rgba(0,229,255,.2);
color: var(--accent);
font-size: .65rem;
padding: 2px 8px;
border-radius: 3px;
cursor: pointer;
font-family: var(--font-mono);
transition: background var(--transition);
}
.copy-code-btn:hover { background: rgba(0,229,255,.2); }
/* Tool call events */
.tool-event {
font-size: .75rem;
color: var(--text2);
background: rgba(16,185,129,.06);
border: 1px solid rgba(16,185,129,.2);
border-radius: var(--radius);
padding: .4rem .75rem;
display: flex;
align-items: center;
gap: .5rem;
}
.tool-event .tool-name { color: var(--accent3); font-weight: 600; }
.tool-event .tool-status { color: var(--text3); }
.tool-event-result {
font-size: .72rem;
color: var(--text3);
background: var(--bg3);
border: 1px solid var(--border);
border-radius: var(--radius);
padding: .4rem .75rem;
font-family: var(--font-mono);
max-height: 200px;
overflow-x: hidden;
overflow-y: auto;
white-space: pre-wrap;
word-break: break-word;
overflow-wrap: break-word;
}
/* Streaming cursor */
.streaming-cursor::after {
content: 'β–Œ';
color: var(--accent);
animation: blink .7s step-end infinite;
}
@keyframes blink { 50% { opacity: 0; } }
/* Message actions */
.msg-actions {
display: flex;
gap: .25rem;
margin-top: .35rem;
opacity: 0;
transition: opacity var(--transition);
}
.message:hover .msg-actions { opacity: 1; }
.msg-action-btn {
background: transparent;
border: 1px solid var(--border);
color: var(--text3);
font-size: .68rem;
padding: 2px 7px;
border-radius: 3px;
cursor: pointer;
font-family: var(--font-mono);
transition: all var(--transition);
}
.msg-action-btn:hover { border-color: var(--accent); color: var(--accent); }
/* Welcome screen */
.welcome-screen {
flex: 1;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 1rem;
text-align: center;
padding: 2rem;
}
.welcome-screen.hidden { display: none; }
.welcome-logo {
font-size: 4rem;
color: var(--accent);
filter: drop-shadow(0 0 20px var(--accent));
line-height: 1;
}
.welcome-title {
font-family: var(--font-ui);
font-size: 2rem;
font-weight: 800;
color: var(--text);
letter-spacing: -.02em;
}
.welcome-sub { color: var(--text2); font-size: .85rem; max-width: 400px; }
.welcome-features {
display: flex;
flex-wrap: wrap;
gap: .5rem;
justify-content: center;
max-width: 500px;
}
.feature-chip {
background: var(--bg3);
border: 1px solid var(--border2);
color: var(--text2);
padding: .35rem .75rem;
border-radius: 20px;
font-size: .75rem;
}
/* Chat form */
.chat-form {
padding: .75rem 1.25rem 1rem;
border-top: 1px solid var(--border);
background: var(--bg2);
flex-shrink: 0;
}
.input-wrapper {
display: flex;
align-items: flex-end;
gap: .5rem;
background: var(--bg3);
border: 1px solid var(--border2);
border-radius: var(--radius);
padding: .5rem;
transition: border-color var(--transition);
}
.input-wrapper:focus-within { border-color: var(--accent); }
.chat-input {
flex: 1;
background: transparent;
border: none;
color: var(--text);
font-family: var(--font-mono);
font-size: .85rem;
resize: none;
outline: none;
line-height: 1.5;
max-height: 200px;
overflow-y: auto;
}
.chat-input::placeholder { color: var(--text3); }
.chat-input:disabled { opacity: .4; cursor: not-allowed; }
.input-hint {
font-size: .68rem;
color: var(--text3);
margin-top: .35rem;
padding: 0 .25rem;
}
/* Buttons */
.btn-send {
width: 34px; height: 34px;
display: flex; align-items: center; justify-content: center;
background: var(--accent);
border: none;
border-radius: 5px;
color: var(--bg);
cursor: pointer;
flex-shrink: 0;
transition: all var(--transition);
}
.btn-send:hover { filter: brightness(1.1); }
.btn-send:disabled { opacity: .3; cursor: not-allowed; }
.btn-send svg { width: 14px; height: 14px; }
.btn-send.stop-mode { background: var(--error); }
.icon-btn {
width: 32px; height: 32px;
display: flex; align-items: center; justify-content: center;
background: transparent;
border: 1px solid var(--border);
color: var(--text2);
border-radius: var(--radius);
cursor: pointer;
transition: all var(--transition);
flex-shrink: 0;
}
.icon-btn:hover { border-color: var(--border2); color: var(--text); }
.icon-btn.active { border-color: var(--accent); color: var(--accent); }
.icon-btn svg { width: 15px; height: 15px; }
.icon-btn:disabled { opacity: .3; cursor: not-allowed; }
.input-action {
width: 28px; height: 28px;
border: none;
}
.btn-primary {
background: var(--accent);
color: var(--bg);
border: none;
border-radius: var(--radius);
padding: .5rem 1.25rem;
font-family: var(--font-ui);
font-size: .8rem;
font-weight: 700;
letter-spacing: .05em;
cursor: pointer;
transition: all var(--transition);
}
.btn-primary:hover { filter: brightness(1.1); }
.btn-primary.btn-lg { padding: .75rem 2rem; font-size: .95rem; }
.btn-outline {
background: transparent;
color: var(--accent);
border: 1px solid var(--border2);
border-radius: var(--radius);
padding: .4rem 1rem;
font-family: var(--font-mono);
font-size: .78rem;
cursor: pointer;
transition: all var(--transition);
}
.btn-outline:hover { background: rgba(0,229,255,.08); border-color: var(--accent); }
.btn-sm { padding: .3rem .7rem; font-size: .72rem; }
/* ── View header ── */
.view-header {
padding: 1.25rem 1.5rem;
border-bottom: 1px solid var(--border);
background: var(--bg2);
display: flex;
align-items: center;
justify-content: space-between;
flex-shrink: 0;
}
.view-header h2 {
font-family: var(--font-ui);
font-size: 1.1rem;
font-weight: 700;
letter-spacing: -.01em;
}
.view-body {
flex: 1;
overflow-y: auto;
padding: 1.5rem;
display: flex;
flex-direction: column;
gap: 1rem;
}
.view-body::-webkit-scrollbar { width: 4px; }
.view-body::-webkit-scrollbar-thumb { background: var(--border2); border-radius: 2px; }
/* ── Card ── */
.card {
background: var(--bg2);
border: 1px solid var(--border);
border-radius: var(--radius);
padding: 1.25rem;
}
.card-title {
font-family: var(--font-ui);
font-size: .9rem;
font-weight: 700;
color: var(--text);
margin-bottom: .75rem;
letter-spacing: .02em;
}
.card-actions {
display: flex;
align-items: center;
gap: .75rem;
margin-top: 1rem;
padding-top: 1rem;
border-top: 1px solid var(--border);
}
/* ── Forms ── */
.form-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: .75rem;
}
.form-group { display: flex; flex-direction: column; gap: .35rem; }
.form-group.full { grid-column: 1 / -1; }
.form-group label {
font-size: .72rem;
font-weight: 600;
color: var(--text2);
letter-spacing: .06em;
text-transform: uppercase;
}
.hint {
font-size: .65rem;
color: var(--text3);
font-weight: 400;
text-transform: none;
letter-spacing: 0;
}
.input {
background: var(--bg3);
border: 1px solid var(--border);
color: var(--text);
border-radius: var(--radius);
padding: .5rem .75rem;
font-family: var(--font-mono);
font-size: .82rem;
outline: none;
width: 100%;
transition: border-color var(--transition);
}
.input:focus { border-color: var(--accent); }
.input option { background: var(--bg3); }
textarea.input { resize: vertical; }
/* Checkbox */
.checkbox-group {
display: flex;
flex-wrap: wrap;
gap: .5rem;
}
.checkbox-item {
display: flex;
align-items: center;
gap: .4rem;
font-size: .78rem;
color: var(--text2);
cursor: pointer;
background: var(--bg3);
border: 1px solid var(--border);
border-radius: var(--radius);
padding: .3rem .6rem;
transition: border-color var(--transition);
}
.checkbox-item:hover { border-color: var(--border2); }
.checkbox-item input[type=checkbox] { accent-color: var(--accent); }
/* ── Provider select (with free badges) ── */
.provider-option-free::after {
content: " ✦ FREE";
color: var(--accent3);
font-size: .7em;
}
/* ── Agents grid ── */
.agent-cards {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
gap: .75rem;
}
.agent-card {
background: var(--bg3);
border: 1px solid var(--border);
border-radius: var(--radius);
padding: 1rem;
cursor: pointer;
transition: border-color var(--transition);
}
.agent-card:hover { border-color: var(--accent); }
.agent-card-name {
font-family: var(--font-ui);
font-weight: 700;
font-size: .9rem;
color: var(--text);
margin-bottom: .3rem;
}
.agent-card-meta {
font-size: .72rem;
color: var(--text3);
display: flex;
gap: .5rem;
flex-wrap: wrap;
}
.badge {
background: rgba(0,229,255,.1);
border: 1px solid rgba(0,229,255,.2);
color: var(--accent);
padding: 1px 6px;
border-radius: 3px;
font-size: .68rem;
}
.badge.free { background: rgba(16,185,129,.1); border-color: rgba(16,185,129,.2); color: var(--accent3); }
/* ── Tools grid ── */
.tools-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
gap: .75rem;
}
.tool-card {
background: var(--bg3);
border: 1px solid var(--border);
border-radius: var(--radius);
padding: 1rem;
}
.tool-card-name {
font-family: var(--font-ui);
font-weight: 700;
font-size: .85rem;
color: var(--text);
margin-bottom: .3rem;
}
.tool-card-desc { font-size: .75rem; color: var(--text2); }
.skeleton-card {
background: var(--bg3);
border: 1px solid var(--border);
border-radius: var(--radius);
height: 90px;
animation: skeletonPulse 1.5s ease-in-out infinite;
}
@keyframes skeletonPulse {
0%,100% { opacity: .5; }
50% { opacity: 1; }
}
/* MCP rows */
.mcp-list { display: flex; flex-direction: column; gap: .4rem; margin-bottom: .4rem; }
.mcp-row {
display: flex;
gap: .4rem;
align-items: center;
}
/* MCP inspect result */
.mcp-inspect-result {
background: var(--bg3);
border: 1px solid var(--border2);
border-radius: var(--radius);
padding: .75rem;
margin-top: .75rem;
font-size: .78rem;
}
.mcp-inspect-result.hidden { display: none; }
/* Settings */
.about-info { display: flex; flex-direction: column; gap: .5rem; }
.about-row {
display: flex;
justify-content: space-between;
font-size: .8rem;
padding: .4rem 0;
border-bottom: 1px solid var(--border);
color: var(--text2);
}
.about-row:last-child { border-bottom: none; }
.about-row a { color: var(--accent); text-decoration: none; }
.text-muted { color: var(--text2); font-size: .8rem; }
/* Error/success */
.error-banner {
background: rgba(239,68,68,.1);
border: 1px solid rgba(239,68,68,.3);
color: var(--error);
border-radius: var(--radius);
padding: .5rem .75rem;
font-size: .8rem;
margin-top: .5rem;
}
.error-banner.hidden { display: none; }
.success-msg { color: var(--accent3); font-size: .8rem; }
.success-msg.hidden { display: none; }
/* Toast */
#toast-container {
position: fixed;
bottom: 1.5rem;
right: 1.5rem;
display: flex;
flex-direction: column;
gap: .5rem;
z-index: 9999;
}
.toast {
background: var(--bg2);
border: 1px solid var(--border2);
color: var(--text);
padding: .6rem 1rem;
border-radius: var(--radius);
font-size: .8rem;
animation: toastIn .2s ease-out;
max-width: 300px;
}
.toast.error { border-color: rgba(239,68,68,.4); color: var(--error); }
.toast.success { border-color: rgba(16,185,129,.4); color: var(--accent3); }
@keyframes toastIn {
from { opacity: 0; transform: translateX(20px); }
to { opacity: 1; transform: translateX(0); }
}
/* Sidebar overlay mobile */
.sidebar-overlay {
display: block;
position: fixed;
inset: 0;
background: rgba(0,0,0,.6);
z-index: 90;
opacity: 0;
pointer-events: none;
transition: opacity 0.25s ease;
}
.sidebar-overlay.active {
opacity: 1;
pointer-events: auto;
}
/* Provider grid for settings */
.provider-keys-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
gap: .6rem;
}
/* ── Responsive ── */
@media (max-width: 768px) {
:root { --sidebar-w: 280px; }
.mobile-topbar { display: flex; }
/* Apply top padding to body (no .layout div in HTML) */
body { padding-top: 52px; height: calc(100vh - 52px); height: calc(100dvh - 52px); }
.sidebar {
position: fixed;
top: 52px; left: 0;
height: calc(100vh - 52px);
height: calc(100dvh - 52px);
transform: translateX(-100%);
z-index: 150;
}
.sidebar.open { transform: translateX(0); }
/* overlay visibility handled by .active class + pointer-events (see above) */
.form-grid { grid-template-columns: 1fr; }
.agent-cards, .tools-grid, .provider-keys-grid {
grid-template-columns: 1fr;
}
/* ── Mobile fixes v2.2 ── */
/* Less padding in view panels */
.view-header { padding: 0.5rem 0.75rem; }
.view-body { padding: 0.75rem; }
/* Stack side-by-side form rows vertically on mobile */
.form-row { flex-direction: column; gap: 0; }
/* Presets: compact horizontal scroll strip instead of tall grid */
.presets-section {
overflow: hidden;
flex-shrink: 0;
}
.presets-grid {
display: flex !important;
flex-wrap: nowrap !important;
overflow-x: auto;
overflow-y: hidden;
gap: 6px;
padding-bottom: 6px;
-webkit-overflow-scrolling: touch;
scroll-snap-type: x mandatory;
scrollbar-width: none;
}
.presets-grid::-webkit-scrollbar { display: none; }
.preset-card {
flex: 0 0 auto;
width: 80px;
min-width: 80px;
padding: 7px 5px;
scroll-snap-align: start;
}
.preset-icon { font-size: 18px; margin-bottom: 2px; }
.preset-name { font-size: 10px; }
.preset-desc { display: none; }
/* Chat header compact on mobile */
.chat-header { padding: 0.5rem 0.75rem; }
/* Welcome screen on mobile */
.welcome-title { font-size: 1.4rem; }
.welcome-features { gap: 0.35rem; }
.feature-chip { font-size: 0.7rem; padding: 0.25rem 0.5rem; }
/* Tools inspector input row stacks vertically */
.input-row { flex-direction: column; }
.input-row .btn-primary { width: 100%; margin-top: 0.4rem; }
/* MCP actions row wraps on mobile */
.mcp-actions { flex-wrap: wrap; gap: 0.4rem; }
}
/* ── File Upload UI ────────────────────────────────────────────────────────── */
.attached-files {
display: flex;
flex-wrap: wrap;
gap: 0.4rem;
padding: 0.5rem 0.75rem 0;
width: 100%;
}
.file-chip {
display: inline-flex;
align-items: center;
gap: 0.4rem;
background: var(--surface-2, rgba(108,99,255,0.15));
border: 1px solid var(--border, rgba(255,255,255,0.1));
border-radius: 6px;
padding: 0.25rem 0.6rem;
font-size: 0.75rem;
color: var(--text-2, #aaa);
max-width: 200px;
}
.file-chip .file-name {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.file-chip .file-remove {
background: none;
border: none;
color: inherit;
cursor: pointer;
padding: 0;
line-height: 1;
opacity: 0.7;
flex-shrink: 0;
}
.file-chip .file-remove:hover { opacity: 1; color: #ff6b6b; }
.file-chip .file-icon {
flex-shrink: 0;
font-size: 1rem;
}
.file-chip.uploading { opacity: 0.6; }
.file-chip.error { border-color: #ff6b6b; color: #ff6b6b; }
.msg-file-list {
margin-top: 0.5rem;
display: flex;
flex-wrap: wrap;
gap: 0.4rem;
}
.msg-file-badge {
background: rgba(108,99,255,0.2);
border: 1px solid rgba(108,99,255,0.3);
border-radius: 4px;
padding: 0.2rem 0.5rem;
font-size: 0.72rem;
color: #a0a0ff;
}
/* ── Range slider ── */
.range-input{-webkit-appearance:none;appearance:none;width:100%;height:6px;border-radius:3px;background:var(--border);outline:none;padding:0;margin:.5rem 0 .25rem;cursor:pointer}
.range-input::-webkit-slider-thumb{-webkit-appearance:none;width:18px;height:18px;border-radius:50%;background:var(--accent);cursor:pointer;border:2px solid var(--bg-primary);box-shadow:0 1px 4px rgba(0,0,0,.3)}
.range-input::-moz-range-thumb{width:18px;height:18px;border-radius:50%;background:var(--accent);border:2px solid var(--bg-primary);cursor:pointer}
.range-labels{display:flex;justify-content:space-between;font-size:.7rem;color:var(--text-muted)}
.btn-danger{background:transparent;border:1px solid #e55;color:#e55;padding:.35rem .75rem;border-radius:6px;cursor:pointer;font-size:.8rem;transition:background .15s}
.btn-danger:hover{background:rgba(238,85,85,.12)}
/* ═══════════════════════════════ v2.2 Styles ═══════════════════════════════ */
/* F6: Collapsible tool results */
.tool-result-pre { max-height: 200px; overflow: hidden; transition: max-height 0.2s; }
.tool-collapse-btn {
display: block; width: 100%; margin-top: 4px; padding: 4px 8px;
background: var(--surface2, #1e2530); border: 1px solid var(--border, #2a3341);
border-radius: 4px; color: var(--text-muted, #8899aa); font-size: 11px;
cursor: pointer; text-align: left; font-family: monospace;
}
.tool-collapse-btn:hover { background: var(--surface3, #252f3f); color: var(--text, #e2e8f0); }
/* F7: Thinking / streaming visual */
.thinking-steps {
display: flex; align-items: center; gap: 8px;
color: var(--accent, #38bdf8); font-size: 13px; padding: 8px 0; font-family: monospace;
}
.thinking-dot {
width: 8px; height: 8px; border-radius: 50%;
background: var(--accent, #38bdf8);
animation: thinking-pulse 1s ease-in-out infinite;
}
@keyframes thinking-pulse { 0%,100%{opacity:1;transform:scale(1)} 50%{opacity:0.3;transform:scale(0.7)} }
/* F3: Image paste preview */
.paste-preview {
display: flex; align-items: center; gap: 8px; padding: 8px;
background: var(--surface2, #1e2530); border-radius: 8px;
border: 1px solid var(--border, #2a3341); margin-bottom: 6px;
}
/* F9: Slash command menu */
.slash-menu {
position: absolute; bottom: 100%; left: 0; right: 0;
background: var(--surface, #13161e); border: 1px solid var(--border, #2a3341);
border-radius: 8px; box-shadow: 0 -8px 24px rgba(0,0,0,0.4);
z-index: 1000; overflow: hidden; margin-bottom: 4px;
}
.slash-menu.hidden { display: none; }
.slash-item {
display: flex; align-items: center; gap: 10px; padding: 8px 12px;
cursor: pointer; transition: background 0.12s; font-size: 13px;
}
.slash-item:hover, .slash-item.active { background: var(--surface2, #1e2530); }
.slash-item code { color: var(--accent, #38bdf8); font-size: 12px; min-width: 80px; }
.slash-item span { color: var(--text-muted, #8899aa); }
/* F5: Agent presets grid */
.presets-section { margin-bottom: 16px; }
.presets-grid {
display: grid; grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); gap: 8px;
}
.preset-card {
background: var(--surface2, #1e2530); border: 1px solid var(--border, #2a3341);
border-radius: 8px; padding: 12px; cursor: pointer; transition: all 0.15s;
text-align: center;
}
.preset-card:hover { border-color: var(--accent, #38bdf8); transform: translateY(-1px); }
.preset-card.active { border-color: var(--accent, #38bdf8); background: rgba(56,189,248,0.08); }
.preset-icon { font-size: 24px; margin-bottom: 6px; }
.preset-name { font-size: 12px; font-weight: 600; color: var(--text, #e2e8f0); margin-bottom: 4px; }
.preset-desc { font-size: 10px; color: var(--text-muted, #8899aa); line-height: 1.4; }
/* F12: Context window meter */
.context-meter {
display: flex; align-items: center; gap: 8px; height: 18px;
padding: 0 2px; margin-bottom: 4px;
}
.meter-bar {
flex: 1; height: 3px; border-radius: 2px;
background: var(--accent, #38bdf8); transition: width 0.3s, background 0.3s;
min-width: 0;
}
.meter-bar.meter-warn { background: #f59e0b; }
.meter-bar.meter-danger { background: #f43f5e; animation: meter-flash 1s ease infinite; }
.meter-label { font-size: 10px; color: var(--text-muted, #8899aa); font-family: monospace; white-space: nowrap; }
@keyframes meter-flash { 0%,100%{opacity:1} 50%{opacity:0.5} }
/* Pipeline section styling */
.pipeline-section { margin-top: 16px; padding: 12px; background: var(--surface2,#1e2530); border-radius: 8px; }
.pipeline-step { display:flex; align-items:center; gap:8px; padding:8px; margin:4px 0; background:var(--surface,#13161e); border-radius:6px; }
/* Export buttons */
#btn-export-md, #btn-export-json { font-size: 11px; padding: 4px 8px; }
/* ── Bottom Nav Bar (Mobile) v2.3 ──────────────────────────────────────────── */
.bottom-nav {
display: none;
position: fixed;
bottom: 0; left: 0; right: 0;
height: 60px;
background: var(--bg, #0d1117);
border-top: 1px solid var(--border, #21262d);
z-index: 400;
flex-direction: row;
align-items: stretch;
box-shadow: 0 -4px 24px rgba(0,0,0,0.45);
padding-bottom: env(safe-area-inset-bottom, 0px);
}
@media (max-width: 768px) {
.bottom-nav { display: flex; }
.chat-input-bar { bottom: calc(60px + env(safe-area-inset-bottom, 0px)) !important; }
.messages { padding-bottom: 80px; }
#messages { padding-bottom: 80px; }
}
.bottom-nav-item {
flex: 1;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 3px;
background: none;
border: none;
cursor: pointer;
color: var(--text-muted, #7d8590);
font-size: 10px;
font-weight: 500;
font-family: inherit;
padding: 6px 4px 4px;
transition: color 0.15s, background 0.15s;
position: relative;
-webkit-tap-highlight-color: transparent;
}
.bottom-nav-item:focus-visible { outline: 2px solid var(--accent, #00e5a0); outline-offset: -2px; }
.bottom-nav-item:hover { color: var(--accent, #00e5a0); background: rgba(0,229,160,0.05); }
.bottom-nav-item.active { color: var(--accent, #00e5a0); }
.bottom-nav-item.active::before {
content: '';
position: absolute;
top: 0; left: 25%; right: 25%;
height: 2px;
background: var(--accent, #00e5a0);
border-radius: 0 0 2px 2px;
}
.bottom-nav-item svg { transition: transform 0.15s; }
.bottom-nav-item:active svg { transform: scale(0.88); }
.bottom-nav-item span { line-height: 1; }
/* ── Mobile: Compact token meter (ne zauzima input prostor) v2.3 ────────────── */
@media (max-width: 768px) {
/* Meter postaje tanka linija na dnu input-wrappera, bez zauzimanja prostora */
.input-wrapper { position: relative; }
.context-meter {
position: absolute;
bottom: -1px; left: 0; right: 0;
height: 2px !important;
margin: 0 !important;
padding: 0 !important;
gap: 0 !important;
border-radius: 0 0 var(--radius, 8px) var(--radius, 8px);
overflow: hidden;
pointer-events: none;
z-index: 1;
}
.meter-bar {
height: 2px !important;
border-radius: 0 !important;
position: absolute;
left: 0; bottom: 0; top: 0;
}
.meter-label { display: none !important; }
/* Sakrij input hint na mobilnom (samo zauzima prostor) */
.input-hint { display: none; }
}
/* ── HTML Code Preview v2.4 ──────────────────────────────────────────────── */
.code-preview-btn {
display:inline-flex;align-items:center;gap:5px;font-size:11px;
font-family:var(--font-mono,monospace);padding:3px 10px;margin-top:4px;
background:rgba(0,212,255,0.08);border:1px solid rgba(0,212,255,0.25);
color:#00d4ff;border-radius:4px;cursor:pointer;transition:background 0.15s;
-webkit-tap-highlight-color:transparent;
}
.code-preview-btn:hover{background:rgba(0,212,255,0.16);}
.code-preview-wrap{margin-top:6px;border-radius:8px;overflow:hidden;border:1px solid var(--border,#21262d);}
.code-preview-iframe{width:100%;height:320px;border:none;background:#fff;display:block;}
/* ── v2.5 ──────────────────────────────────────────────────────────────────── */
.btn-stop{display:inline-flex;align-items:center;gap:5px;padding:6px 14px;background:rgba(255,95,95,0.1);border:1px solid rgba(255,95,95,0.3);color:#ff5f5f;border-radius:8px;cursor:pointer;font-size:13px;font-family:var(--font-mono,monospace);transition:background 0.15s;-webkit-tap-highlight-color:transparent;}
.btn-stop:hover{background:rgba(255,95,95,0.2);}
.code-toolbar{display:flex;align-items:center;gap:6px;padding:4px 10px;background:rgba(255,255,255,0.03);border:1px solid var(--border,#21262d);border-bottom:none;border-radius:6px 6px 0 0;margin-top:8px;}
.code-toolbar + pre{margin-top:0 !important;border-radius:0 0 6px 6px;}
.code-lang-badge{font-family:var(--font-mono,monospace);font-size:10px;font-weight:600;padding:1px 7px;border-radius:4px;letter-spacing:0.5px;background:rgba(0,212,255,0.1);border:1px solid rgba(0,212,255,0.2);color:#00d4ff;}
.code-copy-btn{margin-left:auto;display:inline-flex;align-items:center;gap:4px;font-size:10px;font-family:var(--font-mono,monospace);padding:2px 8px;background:rgba(255,255,255,0.05);border:1px solid rgba(255,255,255,0.1);color:#8b949e;border-radius:4px;cursor:pointer;transition:all 0.15s;-webkit-tap-highlight-color:transparent;}
.code-copy-btn:hover{background:rgba(255,255,255,0.1);color:#e2e8f0;}
.code-collapsed{max-height:160px;overflow:hidden;position:relative;}
.code-collapsed::after{content:'';position:absolute;bottom:0;left:0;right:0;height:48px;background:linear-gradient(transparent,var(--bg-secondary,#161b22));pointer-events:none;}
.code-expand-btn{display:block;width:100%;text-align:center;font-size:11px;font-family:var(--font-mono,monospace);padding:4px;margin-top:2px;background:rgba(255,255,255,0.04);border:1px solid var(--border,#21262d);color:#8b949e;border-radius:0 0 6px 6px;cursor:pointer;transition:background 0.15s;}
.code-expand-btn:hover{background:rgba(255,255,255,0.08);color:#e2e8f0;}
.mermaid-wrap{background:rgba(255,255,255,0.03);border:1px solid var(--border,#21262d);border-radius:8px;padding:16px;margin:8px 0;overflow-x:auto;text-align:center;}
.mermaid-wrap svg{max-width:100%;height:auto;}
.img-lightbox{display:none;position:fixed;inset:0;background:rgba(0,0,0,0.9);z-index:9999;align-items:center;justify-content:center;}
.img-lightbox.active{display:flex;}
.lb-img{max-width:92vw;max-height:90vh;border-radius:8px;box-shadow:0 8px 40px rgba(0,0,0,0.6);}
.lb-close{position:absolute;top:16px;right:16px;background:rgba(255,255,255,0.1);border:1px solid rgba(255,255,255,0.2);color:#fff;border-radius:50%;width:36px;height:36px;font-size:16px;cursor:pointer;display:flex;align-items:center;justify-content:center;}
.lb-close:hover{background:rgba(255,255,255,0.2);}
.prose table,.message-bubble table{border-collapse:collapse;width:100%;margin:10px 0;font-size:13px;border-radius:6px;overflow:hidden;}
.prose th,.message-bubble th{background:rgba(0,212,255,0.08);color:#00d4ff;padding:7px 12px;text-align:left;font-weight:600;border-bottom:1px solid rgba(0,212,255,0.2);}
.prose td,.message-bubble td{padding:6px 12px;border-bottom:1px solid rgba(255,255,255,0.05);}
.prose tr:last-child td,.message-bubble tr:last-child td{border-bottom:none;}
.prose tr:hover td,.message-bubble tr:hover td{background:rgba(255,255,255,0.03);}
.prose table,.message-bubble table{display:block;overflow-x:auto;}
/* v3.0 */
.token-badge{display:inline-flex;align-items:center;font-family:var(--font-mono,monospace);font-size:9px;color:rgba(0,212,255,.45);margin-top:3px;padding:1px 6px;border-radius:4px;background:rgba(0,212,255,.05);border:1px solid rgba(0,212,255,.1);}
.token-session-bar{display:flex;align-items:center;gap:6px;padding:3px 10px;font-size:10px;color:#6b7280;background:rgba(0,0,0,.2);border-bottom:1px solid rgba(255,255,255,.05);font-family:monospace;}
.file-manager-panel{position:fixed;right:0;top:0;bottom:0;width:280px;background:#0e1119;border-left:1px solid rgba(255,255,255,.08);z-index:200;transform:translateX(100%);transition:transform .25s;display:flex;flex-direction:column;overflow:hidden;}
.file-manager-panel.open{transform:translateX(0);}
.fm-header{display:flex;align-items:center;padding:14px 16px;border-bottom:1px solid rgba(255,255,255,.06);gap:8px;}
.fm-header h3{font-size:14px;font-weight:600;flex:1;}
.fm-close{background:none;border:none;color:#8b949e;cursor:pointer;font-size:18px;}
.fm-tree{flex:1;overflow-y:auto;padding:10px;}
.fm-item{display:flex;align-items:center;gap:8px;padding:7px 10px;border-radius:6px;cursor:pointer;transition:background .15s;}
.fm-item:hover{background:rgba(255,255,255,.05);}
.fm-name{font-size:12px;flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.fm-size{font-size:10px;color:#6b7280;font-family:monospace;}
.fm-empty{text-align:center;color:#6b7280;font-size:12px;padding:20px;}
.memory-item{display:flex;align-items:flex-start;gap:8px;padding:8px 10px;background:rgba(0,212,255,.04);border:1px solid rgba(0,212,255,.12);border-radius:7px;margin-bottom:6px;}
.memory-key{font-weight:600;font-size:12px;color:#00d4ff;min-width:80px;flex-shrink:0;}
.memory-val{font-size:12px;color:#dde3ef;flex:1;word-break:break-word;}
.memory-del{background:none;border:none;color:#6b7280;cursor:pointer;font-size:14px;}
.memory-del:hover{color:#ff4757;}
.memory-add{display:flex;gap:6px;margin-top:10px;flex-wrap:wrap;}
.memory-add input{flex:1;min-width:80px;padding:5px 8px;background:rgba(255,255,255,.05);border:1px solid rgba(255,255,255,.1);border-radius:6px;color:#dde3ef;font-size:12px;}
.multiagent-modal{display:none;position:fixed;inset:0;background:rgba(0,0,0,.7);z-index:500;align-items:center;justify-content:center;}
.multiagent-modal.open{display:flex;}
.ma-box{background:#0e1119;border:1px solid rgba(255,255,255,.1);border-radius:14px;padding:24px;width:90%;max-width:520px;max-height:80vh;overflow-y:auto;}
.ma-title{font-size:16px;font-weight:700;margin-bottom:16px;}
.ma-chat{background:#07090f;border-radius:8px;padding:12px;max-height:300px;overflow-y:auto;margin-top:12px;}
.ma-msg{padding:8px 10px;border-radius:7px;margin-bottom:8px;font-size:12px;line-height:1.5;}
.ma-msg.a{background:rgba(0,212,255,.08);border-left:3px solid #00d4ff;}
.ma-msg.b{background:rgba(180,124,245,.08);border-left:3px solid #b47cf5;}
.ma-label{font-size:10px;font-weight:700;opacity:.7;margin-bottom:3px;font-family:monospace;}
.cm-editor-wrap{border:1px solid rgba(0,212,255,.2);border-radius:0 0 6px 6px;margin-top:0;}
.cm-editor-wrap .CodeMirror{height:auto;max-height:400px;font-size:12px;border-radius:0 0 6px 6px;}
.code-edit-btn{display:inline-flex;align-items:center;gap:4px;font-size:10px;font-family:var(--font-mono,monospace);padding:2px 8px;background:rgba(180,124,245,.08);border:1px solid rgba(180,124,245,.2);color:#b47cf5;border-radius:4px;cursor:pointer;}
.code-edit-btn:hover{background:rgba(180,124,245,.15);}
.code-run-btn{display:inline-flex;align-items:center;gap:4px;font-size:10px;font-family:var(--font-mono,monospace);padding:2px 8px;background:rgba(57,211,83,.08);border:1px solid rgba(57,211,83,.2);color:#39d353;border-radius:4px;cursor:pointer;margin-left:4px;}
.code-run-btn:hover{background:rgba(57,211,83,.15);}
.plotly-wrap{margin:8px 0;border-radius:8px;overflow:hidden;border:1px solid rgba(255,255,255,.07);background:#0d1225;}
.btn-files{position:fixed;bottom:80px;right:16px;width:44px;height:44px;background:rgba(0,212,255,.12);border:1px solid rgba(0,212,255,.25);color:#00d4ff;border-radius:50%;font-size:18px;cursor:pointer;display:flex;align-items:center;justify-content:center;box-shadow:0 4px 12px rgba(0,212,255,.15);z-index:100;transition:background .15s;}
.btn-files:hover{background:rgba(0,212,255,.22);}
/* v3.0 */
.token-badge{display:inline-flex;align-items:center;font-family:var(--font-mono,monospace);font-size:9px;color:rgba(0,212,255,.45);margin-top:3px;padding:1px 6px;border-radius:4px;background:rgba(0,212,255,.05);border:1px solid rgba(0,212,255,.1);}
.token-session-bar{display:flex;align-items:center;gap:6px;padding:3px 10px;font-size:10px;color:#6b7280;background:rgba(0,0,0,.2);border-bottom:1px solid rgba(255,255,255,.05);font-family:monospace;}
.file-manager-panel{position:fixed;right:0;top:0;bottom:0;width:280px;background:#0e1119;border-left:1px solid rgba(255,255,255,.08);z-index:200;transform:translateX(100%);transition:transform .25s;display:flex;flex-direction:column;overflow:hidden;}
.file-manager-panel.open{transform:translateX(0);}
.fm-header{display:flex;align-items:center;padding:14px 16px;border-bottom:1px solid rgba(255,255,255,.06);gap:8px;}
.fm-header h3{font-size:14px;font-weight:600;flex:1;}
.fm-close{background:none;border:none;color:#8b949e;cursor:pointer;font-size:18px;}
.fm-tree{flex:1;overflow-y:auto;padding:10px;}
.fm-item{display:flex;align-items:center;gap:8px;padding:7px 10px;border-radius:6px;cursor:pointer;transition:background .15s;}
.fm-item:hover{background:rgba(255,255,255,.05);}
.fm-name{font-size:12px;flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.fm-size{font-size:10px;color:#6b7280;font-family:monospace;}
.fm-empty{text-align:center;color:#6b7280;font-size:12px;padding:20px;}
.memory-item{display:flex;align-items:flex-start;gap:8px;padding:8px 10px;background:rgba(0,212,255,.04);border:1px solid rgba(0,212,255,.12);border-radius:7px;margin-bottom:6px;}
.memory-key{font-weight:600;font-size:12px;color:#00d4ff;min-width:80px;flex-shrink:0;}
.memory-val{font-size:12px;color:#dde3ef;flex:1;word-break:break-word;}
.memory-del{background:none;border:none;color:#6b7280;cursor:pointer;font-size:14px;}
.memory-del:hover{color:#ff4757;}
.memory-add{display:flex;gap:6px;margin-top:10px;flex-wrap:wrap;}
.memory-add input{flex:1;min-width:80px;padding:5px 8px;background:rgba(255,255,255,.05);border:1px solid rgba(255,255,255,.1);border-radius:6px;color:#dde3ef;font-size:12px;}
.multiagent-modal{display:none;position:fixed;inset:0;background:rgba(0,0,0,.7);z-index:500;align-items:center;justify-content:center;}
.multiagent-modal.open{display:flex;}
.ma-box{background:#0e1119;border:1px solid rgba(255,255,255,.1);border-radius:14px;padding:24px;width:90%;max-width:520px;max-height:80vh;overflow-y:auto;}
.ma-title{font-size:16px;font-weight:700;margin-bottom:16px;}
.ma-chat{background:#07090f;border-radius:8px;padding:12px;max-height:300px;overflow-y:auto;margin-top:12px;}
.ma-msg{padding:8px 10px;border-radius:7px;margin-bottom:8px;font-size:12px;line-height:1.5;}
.ma-msg.a{background:rgba(0,212,255,.08);border-left:3px solid #00d4ff;}
.ma-msg.b{background:rgba(180,124,245,.08);border-left:3px solid #b47cf5;}
.ma-label{font-size:10px;font-weight:700;opacity:.7;margin-bottom:3px;font-family:monospace;}
.cm-editor-wrap{border:1px solid rgba(0,212,255,.2);border-radius:0 0 6px 6px;margin-top:0;}
.cm-editor-wrap .CodeMirror{height:auto;max-height:400px;font-size:12px;border-radius:0 0 6px 6px;}
.code-edit-btn{display:inline-flex;align-items:center;gap:4px;font-size:10px;font-family:var(--font-mono,monospace);padding:2px 8px;background:rgba(180,124,245,.08);border:1px solid rgba(180,124,245,.2);color:#b47cf5;border-radius:4px;cursor:pointer;}
.code-edit-btn:hover{background:rgba(180,124,245,.15);}
.code-run-btn{display:inline-flex;align-items:center;gap:4px;font-size:10px;font-family:var(--font-mono,monospace);padding:2px 8px;background:rgba(57,211,83,.08);border:1px solid rgba(57,211,83,.2);color:#39d353;border-radius:4px;cursor:pointer;margin-left:4px;}
.code-run-btn:hover{background:rgba(57,211,83,.15);}
.plotly-wrap{margin:8px 0;border-radius:8px;overflow:hidden;border:1px solid rgba(255,255,255,.07);background:#0d1225;}
.btn-files{position:fixed;bottom:80px;right:16px;width:44px;height:44px;background:rgba(0,212,255,.12);border:1px solid rgba(0,212,255,.25);color:#00d4ff;border-radius:50%;font-size:18px;cursor:pointer;display:flex;align-items:center;justify-content:center;box-shadow:0 4px 12px rgba(0,212,255,.15);z-index:100;transition:background .15s;}
.btn-files:hover{background:rgba(0,212,255,.22);}
/* ── Build Preview Panel ─────────────────────────────────────────────────── */
.build-panel {
position:fixed;right:0;top:0;bottom:0;
width:min(48%,760px);min-width:280px;
background:#0b0e1a;
border-left:1px solid rgba(0,212,255,0.18);
display:flex;flex-direction:column;
z-index:300;
transform:translateX(102%);
transition:transform 0.28s cubic-bezier(.4,0,.2,1);
pointer-events:none;
box-shadow:-4px 0 24px rgba(0,0,0,0.5);
}
.build-panel.open{transform:translateX(0);pointer-events:all;}
.build-panel-head {
display:flex;align-items:center;justify-content:space-between;
padding:10px 14px;
background:rgba(0,212,255,0.05);
border-bottom:1px solid rgba(0,212,255,0.12);
font-size:12px;font-weight:600;color:#00d4ff;flex-shrink:0;
}
.build-panel-title{display:flex;align-items:center;gap:8px;}
.build-live-dot{width:7px;height:7px;border-radius:50%;background:#00ff88;box-shadow:0 0 6px #00ff88;animation:livePulse 1.8s ease-in-out infinite;}
@keyframes livePulse{0%,100%{opacity:1;transform:scale(1);}50%{opacity:.5;transform:scale(.8);}}
.build-panel-actions{display:flex;gap:4px;}
.build-panel-btn{background:rgba(255,255,255,0.06);border:1px solid rgba(255,255,255,0.12);color:#aab;border-radius:4px;padding:3px 9px;cursor:pointer;font-size:13px;line-height:1;transition:background .15s;-webkit-tap-highlight-color:transparent;}
.build-panel-btn:hover{background:rgba(255,255,255,0.14);color:#fff;}
.build-iframe{flex:1;border:none;background:#fff;width:100%;}
@media(max-width:700px){.build-panel{width:100%;}}
/* ═══════════════════════════════════════════════════════════════
AgentScoop v2.8 β€” UX Upgrade Pack styles
═══════════════════════════════════════════════════════════════ */
/* ── 1. Reconnect banner ─────────────────────────────────────── */
.reconnect-banner {
position: fixed;
top: 0; left: 0; right: 0;
z-index: 9000;
background: linear-gradient(90deg, #7c2d12, #92400e);
color: #fef3c7;
font-size: 12px;
font-family: var(--font-mono);
display: flex;
align-items: center;
justify-content: center;
gap: 12px;
padding: 8px 16px;
border-bottom: 1px solid rgba(251,191,36,.3);
animation: slideDown .3s ease;
}
@keyframes slideDown { from { transform: translateY(-100%); } to { transform: translateY(0); } }
.reconnect-banner button {
background: rgba(251,191,36,.2);
border: 1px solid rgba(251,191,36,.4);
color: #fef3c7;
border-radius: 4px;
padding: 3px 10px;
cursor: pointer;
font-size: 11px;
font-family: var(--font-mono);
transition: background .15s;
}
.reconnect-banner button:hover { background: rgba(251,191,36,.35); }
/* ── 2. Upload progress chip ─────────────────────────────────── */
.file-chip {
display: flex;
align-items: center;
gap: .3rem;
background: var(--bg3);
border: 1px solid var(--border);
border-radius: 6px;
padding: .25rem .5rem;
font-size: .75rem;
max-width: 200px;
position: relative;
overflow: hidden;
}
.file-chip .upload-pct {
font-size: 10px;
color: var(--accent);
white-space: nowrap;
font-family: var(--font-mono);
}
.upload-bar-wrap {
position: absolute;
bottom: 0; left: 0; right: 0;
height: 2px;
background: var(--border);
}
.upload-bar-fill {
height: 100%;
background: var(--accent);
transition: width .15s linear;
border-radius: 0 0 6px 6px;
}
.file-chip.error { border-color: var(--error); color: var(--error); }
.file-chip .file-remove {
background: none; border: none; cursor: pointer;
color: var(--text3); font-size: .9rem; padding: 0; flex-shrink: 0;
line-height: 1;
}
.file-chip .file-remove:hover { color: var(--error); }
.file-chip .file-icon { flex-shrink: 0; }
.file-chip .file-name {
flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
/* Drag-over highlight on message area */
#messages.drag-over {
outline: 2px dashed var(--accent);
outline-offset: -4px;
background: rgba(0,229,255,.03);
}
/* ── 3. Tool accordion ───────────────────────────────────────── */
.tool-call-card {
background: var(--bg3);
border: 1px solid rgba(16,185,129,.2);
border-radius: 8px;
overflow: hidden;
font-size: 12px;
font-family: var(--font-mono);
margin: 4px 0;
transition: border-color .15s;
}
.tool-call-card:hover { border-color: rgba(16,185,129,.4); }
.tool-call-header {
display: flex;
align-items: center;
gap: 8px;
padding: 7px 10px;
background: rgba(16,185,129,.06);
border-bottom: 1px solid rgba(16,185,129,.12);
user-select: none;
}
.tool-call-name { font-weight: 600; color: var(--accent3); flex: 1; }
.tool-call-status {
font-size: 10px;
padding: 2px 7px;
border-radius: 10px;
white-space: nowrap;
}
.tool-call-status.running {
background: rgba(245,158,11,.12);
color: var(--warn);
animation: statusPulse 1.2s ease infinite;
}
.tool-call-status.done {
background: rgba(16,185,129,.12);
color: var(--accent3);
}
@keyframes statusPulse { 0%,100%{opacity:1} 50%{opacity:.5} }
.tool-args-toggle {
font-size: 10px;
color: var(--text3);
padding: 1px 6px;
border-radius: 3px;
background: rgba(255,255,255,.04);
border: 1px solid var(--border);
cursor: pointer;
flex-shrink: 0;
transition: color .12s;
}
.tool-call-header:hover .tool-args-toggle { color: var(--text2); }
.tool-call-args {
padding: 6px 10px;
background: rgba(0,0,0,.2);
border-bottom: 1px solid var(--border);
}
.tool-call-args pre {
font-size: 11px;
color: var(--text2);
white-space: pre-wrap;
word-break: break-word;
max-height: 120px;
overflow-y: auto;
}
.tool-call-result { padding: 6px 10px; }
.tool-result-pre {
font-size: 11px;
color: var(--text);
white-space: pre-wrap;
word-break: break-word;
line-height: 1.5;
max-height: 100px;
overflow: hidden;
transition: max-height .25s ease;
}
.tool-result-pre:not(.tool-result-collapsed) { max-height: none; }
.tool-toggle-btn {
display: block;
width: 100%;
margin-top: 4px;
padding: 4px 8px;
background: rgba(0,229,255,.04);
border: 1px solid rgba(0,229,255,.15);
border-radius: 4px;
color: var(--text3);
font-size: 10px;
font-family: var(--font-mono);
cursor: pointer;
text-align: left;
transition: all .12s;
}
.tool-toggle-btn:hover { background: rgba(0,229,255,.1); color: var(--accent); }
/* ── 4. System prompt template selector ──────────────────────── */
#prompt-template-select {
outline: none;
cursor: pointer;
transition: border-color .15s;
}
#prompt-template-select:focus { border-color: var(--accent); }
#prompt-template-select option { background: var(--bg2); }
/* ── 5. Keyboard shortcut overlay ────────────────────────────── */
.shortcut-overlay {
position: fixed;
inset: 0;
background: rgba(0,0,0,.75);
z-index: 8000;
display: flex;
align-items: center;
justify-content: center;
backdrop-filter: blur(4px);
}
.shortcut-overlay.hidden { display: none; }
.shortcut-box {
background: var(--bg2);
border: 1px solid var(--border2);
border-radius: 12px;
padding: 24px;
width: min(480px, 90vw);
box-shadow: 0 24px 60px rgba(0,0,0,.6);
}
.shortcut-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 16px;
font-size: 15px;
font-weight: 700;
color: var(--accent);
}
.shortcut-close {
background: none;
border: none;
color: var(--text3);
font-size: 18px;
cursor: pointer;
padding: 0;
line-height: 1;
transition: color .12s;
}
.shortcut-close:hover { color: var(--text); }
.shortcut-list { display: flex; flex-direction: column; gap: 10px; }
.shortcut-row {
display: flex;
align-items: center;
gap: 14px;
}
.shortcut-key {
font-family: var(--font-mono);
font-size: 11px;
background: var(--bg3);
border: 1px solid var(--border2);
border-radius: 5px;
padding: 3px 8px;
color: var(--accent);
white-space: nowrap;
min-width: 110px;
text-align: center;
}
.shortcut-desc {
font-size: 13px;
color: var(--text2);
}
.shortcut-footer {
margin-top: 18px;
padding-top: 14px;
border-top: 1px solid var(--border);
font-size: 11px;
color: var(--text3);
text-align: center;
}
#btn-shortcuts {
font-size: 13px;
padding: 3px 8px;
}
#btn-export-pdf { font-size: 11px; padding: 4px 8px; }
/* tool-warning inline */
.tool-warning {
font-size: 11px;
color: var(--warn);
background: rgba(245,158,11,.08);
border: 1px solid rgba(245,158,11,.25);
border-radius: 6px;
padding: 5px 10px;
margin: 4px 0;
font-family: var(--font-mono);
}
/* ── Memory View (v2.7) ─────────────────────────────────────────── */
.memory-item{display:flex;align-items:center;gap:.5rem;padding:7px 10px;background:var(--bg3);border:1px solid var(--border);border-radius:var(--radius);margin-bottom:5px;}
.memory-item .mem-key{font-weight:600;color:var(--accent);font-size:.75rem;min-width:110px;}
.memory-item .mem-val{flex:1;color:var(--text2);font-size:.75rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.memory-item .mem-del{background:transparent;border:none;cursor:pointer;color:var(--error);opacity:.5;font-size:.8rem;padding:0 4px;transition:opacity .15s;}
.memory-item .mem-del:hover{opacity:1;}
/* ── Multi-Agent Modal (v2.7) ───────────────────────────────────── */
.ma-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:1rem;}
.ma-chat-wrap{background:#07090f;border-radius:8px;padding:10px;max-height:280px;overflow-y:auto;margin-top:.75rem;}
/* ── Pipeline View (v2.7) ───────────────────────────────────────── */
.pipeline-chain{display:flex;align-items:center;gap:0;margin:.75rem 0;overflow-x:auto;padding-bottom:4px;}
.agent-node{background:var(--bg3);border:1px solid var(--border2);border-radius:8px;padding:10px 14px;min-width:100px;text-align:center;flex-shrink:0;}
.agent-node-icon{font-size:1.2rem;margin-bottom:3px;}
.agent-node-label{font-size:.65rem;font-weight:700;text-transform:uppercase;letter-spacing:.06em;color:var(--text3);}
.agent-node-name{font-size:.7rem;color:var(--text2);margin-top:2px;}
.chain-arrow{padding:0 6px;color:var(--text3);font-size:1rem;flex-shrink:0;}
/* ── v2.8 Fix: message-bubble overflow on mobile ──────────────────────────── */
.message-bubble {
max-width: 100%;
box-sizing: border-box;
overflow-wrap: break-word;
word-break: break-word;
min-width: 0;
}
.message-bubble pre,
.prose pre,
.msg-content pre {
white-space: pre-wrap !important;
word-break: break-word !important;
overflow-wrap: break-word !important;
overflow-x: auto;
max-width: 100%;
box-sizing: border-box;
}
.message-bubble pre code,
.prose pre code,
.msg-content pre code {
white-space: pre-wrap !important;
word-break: break-word !important;
}
.message-body, .msg-body { min-width: 0; max-width: 100%; overflow: hidden; }
.message { min-width: 0; max-width: 100%; }
.tool-call-args pre, .tool-result-pre {
white-space: pre-wrap !important;
word-break: break-word !important;
overflow-wrap: break-word !important;
overflow-x: auto;
}
/* ── F05 + Token Saver v2.7.1 ───────────────────────────────────────────────── */
.token-saver-banner{margin:10px 16px;}
.tsb-inner{background:linear-gradient(135deg,rgba(0,212,255,.07),rgba(0,150,180,.04));border:1px solid rgba(0,212,255,.22);border-radius:10px;padding:10px 14px;}
.tsb-header{display:flex;align-items:center;gap:7px;font-size:12px;font-weight:600;color:rgba(0,212,255,.85);font-family:var(--font-mono,monospace);}
.tsb-icon{font-size:14px;}.tsb-title{letter-spacing:.3px;}
.tsb-summary{margin-top:7px;font-size:12px;color:rgba(180,200,220,.75);line-height:1.6;border-left:2px solid rgba(0,212,255,.2);padding-left:8px;}
.export-dropdown-wrap{position:relative;display:inline-flex;}
.export-drop-btn{font-size:12px !important;padding:3px 8px !important;white-space:nowrap;}
.export-drop-menu{display:none;position:absolute;top:calc(100% + 4px);right:0;background:#131c2b;border:1px solid rgba(0,212,255,.2);border-radius:8px;min-width:175px;z-index:200;box-shadow:0 8px 24px rgba(0,0,0,.5);overflow:hidden;}
.export-drop-menu.open{display:block;}
.export-drop-menu button{display:block;width:100%;text-align:left;padding:9px 14px;font-size:13px;color:#c9d5e0;background:transparent;border:none;cursor:pointer;transition:background .15s;}
.export-drop-menu button:hover{background:rgba(0,212,255,.1);color:#00d4ff;}
.export-drop-menu button+button{border-top:1px solid rgba(255,255,255,.05);}