From 3d4688f4ef90c7939c86c027393569b000bbb518 Mon Sep 17 00:00:00 2001 From: Zac Gaetano Date: Sun, 5 Apr 2026 10:49:05 -0400 Subject: [PATCH] style: dark theme v3 --- frontend/src/App.css | 1097 ++++++++++++++++++++---------------------- 1 file changed, 530 insertions(+), 567 deletions(-) diff --git a/frontend/src/App.css b/frontend/src/App.css index 570499a..9d4f459 100644 --- a/frontend/src/App.css +++ b/frontend/src/App.css @@ -1,639 +1,602 @@ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} +/* ===== Reset & Base ===== */ +*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } :root { - --color-primary: #2563eb; - --color-secondary: #64748b; - --color-success: #10b981; - --color-danger: #ef4444; - --color-warning: #f59e0b; - --color-bg-dark: #0f172a; - --color-bg-light: #f8fafc; - --color-background: #f8fafc; - --color-border: #e2e8f0; - --color-text: #1e293b; - --color-text-dark: #1e293b; - --color-text-light: #64748b; - --radius-sm: 4px; - --radius-md: 8px; - --radius-lg: 12px; - --spacing-xs: 4px; - --spacing-sm: 8px; - --spacing-md: 16px; - --spacing-lg: 24px; - --spacing-xl: 32px; + --bg: #0f1117; + --bg2: #161b22; + --bg3: #21262d; + --border: #30363d; + --text: #e6edf3; + --text2: #8b949e; + --text3: #6e7681; + --primary: #58a6ff; + --primary-dark: #1f6feb; + --green: #3fb950; + --red: #f85149; + --yellow: #d29922; + --purple: #bc8cff; + --orange: #e3b341; + --radius: 8px; + --sidebar-width: 220px; } body { - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', - 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; - background-color: var(--color-bg-light); - color: var(--color-text-dark); - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -/* App Layout */ -.app-container { - display: flex; - flex-direction: column; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; + background: var(--bg); + color: var(--text); height: 100vh; overflow: hidden; - background: var(--color-bg-light); } -.app-header { +button { cursor: pointer; font-family: inherit; } +input, textarea, select { + font-family: inherit; + font-size: 14px; + background: var(--bg); + color: var(--text); + border: 1px solid var(--border); + border-radius: var(--radius); + padding: 8px 12px; + outline: none; + transition: border-color 0.15s; + width: 100%; +} +input:focus, textarea:focus, select:focus { border-color: var(--primary); } +textarea { resize: vertical; } + +/* ===== Layout ===== */ +.app { display: flex; - justify-content: space-between; - align-items: center; - padding: var(--spacing-md) var(--spacing-lg); - background: linear-gradient(135deg, var(--color-primary) 0%, #1d4ed8 100%); - color: white; - border-bottom: 1px solid rgba(0, 0, 0, 0.1); - box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); + height: 100vh; + overflow: hidden; } -.header-content h1 { - font-size: 1.5rem; - font-weight: 700; - margin-bottom: 2px; +/* ===== Sidebar ===== */ +.sidebar { + width: var(--sidebar-width); + flex-shrink: 0; + background: var(--bg2); + border-right: 1px solid var(--border); + display: flex; + flex-direction: column; + overflow: hidden; } -.header-content p { - font-size: 0.8rem; - opacity: 0.85; -} - -.header-right { +.sidebar-brand { display: flex; align-items: center; - gap: var(--spacing-lg); + gap: 8px; + padding: 16px; + border-bottom: 1px solid var(--border); + flex-shrink: 0; } +.brand-icon { font-size: 20px; } +.brand-name { font-weight: 700; font-size: 15px; color: var(--text); } -.header-nav { - display: flex; - gap: 2px; -} - -.nav-btn { - background: rgba(255,255,255,0.12); - border: 1px solid rgba(255,255,255,0.2); - color: rgba(255,255,255,0.8); - padding: 0.4rem 1rem; - font-size: 0.85rem; - font-weight: 600; - cursor: pointer; - transition: all 0.15s; -} -.nav-btn:first-child { border-radius: 6px 0 0 6px; } -.nav-btn:last-child { border-radius: 0 6px 6px 0; } -.nav-btn.active { - background: rgba(255,255,255,0.25); - color: #fff; - border-color: rgba(255,255,255,0.4); -} -.nav-btn:hover { background: rgba(255,255,255,0.2); } - -.system-status { +.claude-status-pill { + margin: 10px 12px; display: flex; align-items: center; - gap: var(--spacing-sm); - font-size: 0.82rem; - opacity: 0.9; + gap: 6px; + padding: 6px 10px; + border-radius: 20px; + border: 1px solid currentColor; + font-size: 12px; + flex-shrink: 0; } - -.status-indicator { - display: inline-block; +.status-dot { width: 8px; height: 8px; border-radius: 50%; - background-color: rgba(255, 255, 255, 0.3); + flex-shrink: 0; } +.status-label { flex: 1; font-weight: 500; } -.status-indicator.running { - background-color: #10b981; - animation: pulse 2s infinite; -} - -@keyframes pulse { - 0% { opacity: 1; } - 50% { opacity: 0.5; } - 100% { opacity: 1; } -} - -/* Auth Badge in Header */ -.auth-badge { display: flex; align-items: center; } -.auth-ok { color: #86efac; font-size: 0.85rem; font-weight: 500; } -.auth-ok.auth-token-saved { color: #fde68a; } -.auth-disconnected-badge { - color: #fca5a5; font-size: 0.85rem; font-weight: 500; -} - -/* Buttons */ -.btn { - padding: var(--spacing-sm) var(--spacing-md); +.btn-tiny { + background: rgba(255,255,255,0.08); border: none; - border-radius: var(--radius-md); - font-size: 0.875rem; - font-weight: 600; - cursor: pointer; - transition: all 0.2s ease; - text-decoration: none; - display: inline-flex; - align-items: center; - gap: var(--spacing-sm); + color: var(--text); + border-radius: 4px; + padding: 2px 6px; + font-size: 13px; + transition: background 0.15s; } -.btn-sm { padding: 0.35rem 0.75rem; font-size: 0.82rem; } -.btn-xs { padding: 0.2rem 0.5rem; font-size: 0.75rem; } -.btn-primary { background: var(--color-primary); color: white; } -.btn-primary:hover { background: #1d4ed8; box-shadow: 0 4px 12px rgba(37, 99, 235, 0.3); } -.btn-secondary { background: var(--color-secondary); color: white; } -.btn-secondary:hover { background: #475569; } -.btn-success { background: var(--color-success); color: white; } -.btn-success:hover { background: #059669; } -.btn-danger { background: var(--color-danger); color: white; } -.btn-danger:hover { background: #dc2626; } -.btn-create { width: 100%; justify-content: center; font-size: 1rem; padding: var(--spacing-md) var(--spacing-lg); } -.btn:disabled { opacity: 0.6; cursor: not-allowed; } +.btn-tiny:hover { background: rgba(255,255,255,0.15); } +.btn-tiny.btn-green { background: rgba(63, 185, 80, 0.15); color: var(--green); } +.btn-tiny.btn-green:hover { background: rgba(63, 185, 80, 0.25); } -/* Main Content */ -.app-main { - display: flex; - flex: 1; - overflow: hidden; - gap: 1px; - background: var(--color-border); -} - -.sidebar { - width: 320px; - background: white; - border-right: 1px solid var(--color-border); - overflow-y: auto; - padding: var(--spacing-lg); +.sidebar-nav { display: flex; flex-direction: column; - gap: var(--spacing-md); + padding: 8px; + flex-shrink: 0; } -.tasks-list { flex: 1; overflow-y: auto; } -.tasks-list h2 { - font-size: 0.875rem; font-weight: 700; text-transform: uppercase; - color: var(--color-text-light); margin-bottom: var(--spacing-md); margin-top: var(--spacing-lg); +.nav-item { + display: flex; + align-items: center; + gap: 8px; + padding: 9px 12px; + border: none; + background: transparent; + color: var(--text2); + border-radius: var(--radius); + font-size: 14px; + font-weight: 500; + text-align: left; + transition: background 0.15s, color 0.15s; +} +.nav-item:hover { background: var(--bg3); color: var(--text); } +.nav-item.active { background: var(--bg3); color: var(--primary); } +.nav-icon { font-size: 16px; } + +/* Session history */ +.session-history { + flex: 1; + overflow-y: auto; + padding: 8px; + border-top: 1px solid var(--border); + margin-top: 8px; +} +.session-history-title { + font-size: 11px; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.08em; + color: var(--text3); + padding: 4px 8px; + margin-bottom: 4px; +} +.session-new-btn { + width: 100%; + padding: 6px 10px; + font-size: 12px; + background: rgba(88, 166, 255, 0.1); + border: 1px solid rgba(88, 166, 255, 0.3); + color: var(--primary); + border-radius: var(--radius); + margin-bottom: 6px; + transition: background 0.15s; +} +.session-new-btn:hover { background: rgba(88, 166, 255, 0.2); } +.session-item { + display: flex; + justify-content: space-between; + align-items: center; + width: 100%; + padding: 6px 8px; + background: transparent; + border: none; + color: var(--text2); + font-size: 12px; + border-radius: var(--radius); + text-align: left; + transition: background 0.15s; + margin-bottom: 2px; +} +.session-item:hover { background: var(--bg3); color: var(--text); } +.session-item.active { background: var(--bg3); color: var(--primary); } +.session-item-date { flex: 1; } +.session-item-count { color: var(--text3); font-size: 11px; } +.session-empty { font-size: 12px; color: var(--text3); padding: 8px; text-align: center; } + +/* ===== Main content ===== */ +.main-content { + flex: 1; + overflow: hidden; + display: flex; + flex-direction: column; } -.task-item { - padding: var(--spacing-md); border: 1px solid var(--color-border); - border-radius: var(--radius-md); cursor: pointer; transition: all 0.2s ease; - margin-bottom: var(--spacing-sm); -} -.task-item:hover { border-color: var(--color-primary); background: rgba(37, 99, 235, 0.03); } -.task-item.active { border-color: var(--color-primary); background: rgba(37, 99, 235, 0.08); } - -.task-item-header { - display: flex; justify-content: space-between; align-items: flex-start; - gap: var(--spacing-md); margin-bottom: var(--spacing-sm); -} -.task-item h3 { font-size: 0.875rem; font-weight: 600; flex: 1; } - -.status-badge { - padding: 2px 8px; border-radius: var(--radius-sm); color: white; - font-size: 0.75rem; font-weight: 600; text-transform: capitalize; white-space: nowrap; -} - -.task-schedule { font-size: 0.75rem; color: var(--color-text-light); margin-bottom: 4px; } -.task-last-run { font-size: 0.75rem; color: var(--color-text-light); } -.empty-state { padding: var(--spacing-lg); text-align: center; color: var(--color-text-light); font-size: 0.875rem; } - -/* Content Area */ -.content { flex: 1; overflow-y: auto; background: white; padding: var(--spacing-xl); } -.form-container { max-width: 600px; } -.form-container h2 { font-size: 1.5rem; margin-bottom: var(--spacing-lg); } - -.task-form { display: flex; flex-direction: column; gap: var(--spacing-lg); } -.form-group { display: flex; flex-direction: column; gap: var(--spacing-sm); } -.form-group label { font-weight: 600; font-size: 0.875rem; color: var(--color-text-dark); } -.form-group input, .form-group textarea, .form-group select { - padding: var(--spacing-md); border: 1px solid var(--color-border); - border-radius: var(--radius-md); font-size: 0.875rem; font-family: inherit; transition: border-color 0.2s; -} -.form-group input:focus, .form-group textarea:focus, .form-group select:focus { - outline: none; border-color: var(--color-primary); box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1); -} -.form-row { display: grid; grid-template-columns: 1fr 1fr; gap: var(--spacing-lg); } -.form-group.checkbox { flex-direction: row; align-items: center; gap: var(--spacing-md); } -.form-group.checkbox input { width: auto; } -.form-actions { display: flex; gap: var(--spacing-md); margin-top: var(--spacing-lg); } -.form-actions button { flex: 1; } - -/* Task Detail */ -.task-detail { display: flex; flex-direction: column; gap: var(--spacing-lg); } -.task-detail-header { - display: flex; justify-content: space-between; align-items: flex-start; - border-bottom: 1px solid var(--color-border); padding-bottom: var(--spacing-lg); -} -.task-detail-header h2 { font-size: 1.75rem; } -.task-actions { display: flex; gap: var(--spacing-md); } - -.task-meta { - display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); - gap: var(--spacing-lg); padding: var(--spacing-lg); - background: var(--color-bg-light); border-radius: var(--radius-md); -} -.meta-item { display: flex; flex-direction: column; gap: var(--spacing-sm); } -.meta-item .label { font-size: 0.75rem; font-weight: 700; text-transform: uppercase; color: var(--color-text-light); } -.meta-item .value { font-size: 0.875rem; font-weight: 600; } - -.task-section { border-top: 1px solid var(--color-border); padding-top: var(--spacing-lg); } -.task-section h3 { font-size: 1rem; margin-bottom: var(--spacing-md); } - -.prompt-display { - background: var(--color-bg-light); padding: var(--spacing-md); - border-radius: var(--radius-md); overflow-x: auto; - border: 1px solid var(--color-border); font-size: 0.875rem; line-height: 1.5; -} - -/* Run History */ -.runs-list { display: flex; flex-direction: column; gap: var(--spacing-md); } -.run-item { border: 1px solid var(--color-border); border-radius: var(--radius-md); padding: var(--spacing-md); } -.run-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: var(--spacing-md); } - -.run-status { - padding: 4px 12px; border-radius: var(--radius-sm); - font-size: 0.75rem; font-weight: 600; text-transform: uppercase; -} -.run-status.completed { background: rgba(16, 185, 129, 0.2); color: var(--color-success); } -.run-status.failed { background: rgba(239, 68, 68, 0.2); color: var(--color-danger); } -.run-status.running { background: rgba(37, 99, 235, 0.2); color: var(--color-primary); } - -.run-time { font-size: 0.75rem; color: var(--color-text-light); } -.run-item details { cursor: pointer; } -.run-item summary { padding: var(--spacing-sm); cursor: pointer; font-weight: 600; font-size: 0.875rem; } -.run-item pre { - background: var(--color-bg-light); padding: var(--spacing-md); - border-radius: var(--radius-md); overflow-x: auto; - font-size: 0.75rem; margin-top: var(--spacing-sm); border: 1px solid var(--color-border); -} -.run-item pre.error { border-left: 3px solid var(--color-danger); } - -/* Empty States */ -.empty-state-main { - display: flex; flex-direction: column; justify-content: center; align-items: center; - height: 100%; gap: var(--spacing-md); color: var(--color-text-light); text-align: center; -} -.empty-state-main h2 { font-size: 1.25rem; color: var(--color-text-dark); } -.empty { padding: var(--spacing-lg); text-align: center; color: var(--color-text-light); font-size: 0.875rem; } - -/* ====== Dashboard ====== */ -.dashboard-view { - flex: 1; overflow-y: auto; background: white; padding: var(--spacing-xl); -} -.dashboard-title { font-size: 1.5rem; font-weight: 700; margin-bottom: var(--spacing-lg); } - -.dashboard-grid { - display: grid; grid-template-columns: repeat(auto-fill, minmax(160px, 1fr)); - gap: var(--spacing-md); margin-bottom: var(--spacing-xl); -} - -.dash-card { - background: var(--color-bg-light); border: 1px solid var(--color-border); - border-radius: var(--radius-lg); padding: var(--spacing-lg); - text-align: center; transition: box-shadow 0.2s; -} -.dash-card:hover { box-shadow: 0 2px 8px rgba(0,0,0,0.06); } -.dash-card-icon { font-size: 1.5rem; margin-bottom: 0.25rem; } -.dash-card-value { font-size: 1.75rem; font-weight: 700; color: var(--color-text); } -.dash-card-label { font-size: 0.78rem; color: var(--color-secondary); margin-top: 0.15rem; } - -.dashboard-section { margin-bottom: var(--spacing-xl); } -.dashboard-section h3 { - font-size: 1.1rem; font-weight: 700; margin-bottom: var(--spacing-md); - padding-bottom: var(--spacing-sm); border-bottom: 2px solid var(--color-border); -} - -/* ====== Auth Panel ====== */ -.auth-panel { - border: 1px solid var(--color-border); border-radius: var(--radius-lg); +/* ===== Chat ===== */ +.chat-container { + display: flex; + flex-direction: column; + height: 100%; overflow: hidden; } -.auth-connected, .auth-token-panel { - display: flex; align-items: flex-start; gap: var(--spacing-md); - padding: var(--spacing-lg); +.chat-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 14px 20px; + border-bottom: 1px solid var(--border); + background: var(--bg2); + flex-shrink: 0; } -.auth-connected { background: #f0fdf4; border: 1px solid #bbf7d0; flex-wrap: wrap; align-items: center; } -.auth-token-panel { flex-direction: column; background: #fefce8; } - -.auth-token-header { display: flex; gap: var(--spacing-md); align-items: flex-start; } -.auth-icon { font-size: 1.5rem; flex-shrink: 0; } -.auth-title { font-weight: 600; font-size: 0.95rem; color: var(--color-text); } -.auth-sub { font-size: 0.82rem; color: var(--color-secondary); margin-top: 0.15rem; } - -.auth-methods { - display: grid; grid-template-columns: 1fr 1fr; gap: var(--spacing-md); - margin-top: var(--spacing-md); +.chat-header h2 { font-size: 16px; font-weight: 600; } +.chat-header-info { display: flex; align-items: center; gap: 12px; } +.chat-header-status { display: flex; align-items: center; gap: 10px; } +.session-id-badge { + font-size: 11px; + color: var(--text3); + background: var(--bg3); + padding: 2px 8px; + border-radius: 10px; + font-family: monospace; } -.auth-method { - background: white; border: 1px solid var(--color-border); - border-radius: var(--radius-md); padding: var(--spacing-md); -} -.auth-method-title { font-weight: 600; font-size: 0.88rem; margin-bottom: 0.35rem; color: var(--color-text); } -.auth-method-desc { font-size: 0.82rem; color: var(--color-secondary); margin-bottom: 0.35rem; line-height: 1.4; } -.auth-method-desc a { color: var(--color-primary); } - -.auth-cmd { - display: block; background: var(--color-bg-dark); color: #a5f3fc; - padding: 0.5rem 0.75rem; border-radius: 6px; font-size: 0.8rem; - margin: 0.5rem 0; font-family: 'SF Mono', 'Fira Code', monospace; - word-break: break-all; user-select: all; -} - -.auth-token-form { margin-top: var(--spacing-md); } - -.auth-token-type-row { - display: flex; gap: var(--spacing-lg); margin-bottom: var(--spacing-sm); -} -.auth-token-type-row label { - display: flex; align-items: center; gap: 0.35rem; - font-size: 0.85rem; color: var(--color-text); cursor: pointer; -} -.auth-token-type-row input[type="radio"] { accent-color: var(--color-primary); } - -.auth-token-input-row { - display: flex; gap: var(--spacing-sm); align-items: center; -} -.auth-token-input { - flex: 1; padding: 0.5rem 0.75rem; border: 1px solid var(--color-border); - border-radius: 6px; font-size: 0.88rem; font-family: monospace; -} -.auth-token-input:focus { - outline: none; border-color: var(--color-primary); - box-shadow: 0 0 0 2px rgba(37,99,235,0.15); -} - -.auth-saved-info { - display: flex; align-items: center; gap: var(--spacing-md); - margin-top: var(--spacing-md); padding-top: var(--spacing-sm); - border-top: 1px solid var(--color-border); - font-size: 0.82rem; color: var(--color-secondary); -} - -/* ====== MCP Panel ====== */ -.mcp-panel { - border: 1px solid var(--color-border); border-radius: var(--radius-lg); - padding: var(--spacing-lg); display: flex; flex-direction: column; gap: var(--spacing-md); -} -.mcp-list { display: flex; flex-direction: column; gap: 0.5rem; } -.mcp-row { - display: flex; align-items: center; gap: var(--spacing-md); - padding: 0.5rem 0.75rem; border-radius: 6px; - background: var(--color-bg-light); border: 1px solid var(--color-border); -} -.mcp-status-dot { width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0; } -.mcp-status-dot.connected { background: var(--color-success); } -.mcp-status-dot.disconnected { background: var(--color-danger); } -.mcp-name { font-weight: 600; color: var(--color-text); } -.mcp-details { color: var(--color-secondary); font-size: 0.82rem; flex: 1; } - -.btn-icon { - background: none; border: none; color: var(--color-secondary); - cursor: pointer; font-size: 0.9rem; padding: 0.2rem 0.4rem; - border-radius: 4px; transition: all 0.15s; -} -.btn-icon:hover { background: #fee2e2; color: var(--color-danger); } - -.mcp-empty { color: var(--color-secondary); font-size: 0.9rem; } -.mcp-empty p { margin-bottom: 0.5rem; } -.mcp-raw { font-size: 0.78rem; background: var(--color-background); padding: 0.5rem; border-radius: 4px; } -.mcp-add-btn { align-self: flex-start; } - -.mcp-add-form { - display: flex; flex-direction: column; gap: 0.5rem; - padding: 0.75rem; border-radius: 8px; - background: var(--color-background); border: 1px solid var(--color-border); -} -.mcp-form-row { display: flex; gap: 0.5rem; } -.mcp-form-row input, .mcp-form-row select { flex: 1; } -.mcp-add-form input, .mcp-add-form select { - padding: 0.45rem 0.65rem; border: 1px solid var(--color-border); - border-radius: 6px; font-size: 0.88rem; -} -.mcp-form-actions { display: flex; gap: 0.5rem; } - -/* ====== Usage Stats ====== */ -.usage-grid { - border: 1px solid var(--color-border); border-radius: var(--radius-lg); - padding: var(--spacing-lg); display: flex; flex-direction: column; gap: 0; -} -.usage-row { - display: flex; justify-content: space-between; align-items: center; - padding: 0.6rem 0; border-bottom: 1px solid var(--color-border); -} -.usage-row:last-of-type { border-bottom: none; } -.usage-row.highlight { background: #fffbeb; margin: 0 -var(--spacing-lg); padding: 0.6rem var(--spacing-lg); } -.usage-label { font-size: 0.88rem; color: var(--color-secondary); } -.usage-value { font-size: 0.88rem; font-weight: 600; color: var(--color-text); } -.usage-note { font-size: 0.78rem; color: var(--color-secondary); margin-top: 0.5rem; font-style: italic; } -.usage-loading { text-align: center; color: var(--color-secondary); padding: var(--spacing-lg); } - -/* ====== Task Breakdown ====== */ -.task-breakdown { - border: 1px solid var(--color-border); border-radius: var(--radius-lg); - padding: var(--spacing-md); overflow: hidden; -} -.breakdown-row { - display: grid; grid-template-columns: 1fr auto auto auto; - gap: var(--spacing-md); padding: 0.5rem 0.75rem; - border-bottom: 1px solid var(--color-border); align-items: center; -} -.breakdown-row:last-child { border-bottom: none; } -.breakdown-name { font-weight: 600; font-size: 0.88rem; } -.breakdown-type { - font-size: 0.78rem; color: var(--color-secondary); - background: var(--color-bg-light); padding: 2px 8px; border-radius: 4px; -} -.breakdown-status { font-size: 0.78rem; font-weight: 600; text-transform: capitalize; } -.status-idle { color: var(--color-secondary); } -.status-running { color: var(--color-primary); } -.status-completed { color: var(--color-success); } -.status-failed { color: var(--color-danger); } -.breakdown-last { font-size: 0.78rem; color: var(--color-secondary); } -.empty-msg { color: var(--color-secondary); font-size: 0.88rem; text-align: center; padding: var(--spacing-lg); } - -/* ====== Form Section Title ====== */ -.form-section-title { - font-size: 0.82rem; font-weight: 700; text-transform: uppercase; - color: var(--color-primary); margin-top: var(--spacing-md); - padding-bottom: var(--spacing-xs); border-bottom: 2px solid rgba(37, 99, 235, 0.15); - letter-spacing: 0.03em; -} - -/* ====== Chat View ====== */ -.chat-view { - display: flex; flex: 1; overflow: hidden; height: 100%; -} - -.chat-sidebar { - width: 240px; background: #f8fafc; border-right: 1px solid var(--color-border); - display: flex; flex-direction: column; padding: var(--spacing-md); - gap: var(--spacing-sm); overflow-y: auto; -} - -.chat-new-btn { width: 100%; justify-content: center; } - -.chat-model-select { display: flex; flex-direction: column; gap: var(--spacing-xs); } -.chat-model-select label { font-size: 0.75rem; font-weight: 600; color: var(--color-text-light); text-transform: uppercase; } -.chat-model-select select { - padding: 0.4rem 0.5rem; border: 1px solid var(--color-border); - border-radius: 6px; font-size: 0.82rem; background: white; -} - -.chat-sessions-list { - flex: 1; overflow-y: auto; display: flex; flex-direction: column; gap: 2px; -} - -.chat-session-item { - padding: 0.5rem 0.65rem; border-radius: 6px; cursor: pointer; - transition: background 0.15s; border: 1px solid transparent; -} -.chat-session-item:hover { background: rgba(37, 99, 235, 0.05); } -.chat-session-item.active { - background: rgba(37, 99, 235, 0.1); border-color: rgba(37, 99, 235, 0.2); -} - -.chat-session-preview { - font-size: 0.82rem; font-weight: 600; color: var(--color-text); - white-space: nowrap; overflow: hidden; text-overflow: ellipsis; -} - -.chat-session-meta { - font-size: 0.72rem; color: var(--color-text-light); margin-top: 2px; -} - -.chat-ws-status { - font-size: 0.75rem; color: var(--color-text-light); - padding-top: var(--spacing-sm); border-top: 1px solid var(--color-border); - text-align: center; -} - -/* Chat Main Area */ -.chat-main { - flex: 1; display: flex; flex-direction: column; overflow: hidden; background: white; +.ws-badge { + font-size: 12px; + font-weight: 600; + padding: 3px 10px; + border-radius: 12px; } +.ws-badge.connected { color: var(--green); background: rgba(63, 185, 80, 0.1); } +.ws-badge.disconnected { color: var(--yellow); background: rgba(210, 153, 34, 0.1); } .chat-messages { - flex: 1; overflow-y: auto; padding: var(--spacing-lg) var(--spacing-xl); - display: flex; flex-direction: column; gap: var(--spacing-md); + flex: 1; + overflow-y: auto; + padding: 20px; + display: flex; + flex-direction: column; + gap: 16px; } .chat-empty { - display: flex; flex-direction: column; align-items: center; justify-content: center; - height: 100%; gap: var(--spacing-md); color: var(--color-text-light); text-align: center; + flex: 1; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + text-align: center; + padding: 40px; + color: var(--text2); } -.chat-empty-icon { font-size: 3rem; opacity: 0.5; } -.chat-empty h3 { font-size: 1.25rem; color: var(--color-text); font-weight: 600; } -.chat-empty-hint { font-size: 0.85rem; max-width: 400px; line-height: 1.5; } +.chat-empty-icon { font-size: 48px; margin-bottom: 16px; } +.chat-empty-title { font-size: 18px; font-weight: 600; margin-bottom: 8px; color: var(--text); } +.chat-empty-sub { font-size: 14px; max-width: 400px; } -/* Chat Messages */ .chat-msg { - display: flex; gap: var(--spacing-md); max-width: 85%; - animation: chatFadeIn 0.2s ease-out; + display: flex; + flex-direction: column; + gap: 6px; + max-width: 85%; + animation: fadeIn 0.2s ease; } -.chat-msg.user { align-self: flex-end; flex-direction: row-reverse; } -.chat-msg.assistant { align-self: flex-start; } -.chat-msg.error { align-self: center; } +@keyframes fadeIn { from { opacity: 0; transform: translateY(4px); } to { opacity: 1; transform: none; } } -@keyframes chatFadeIn { - from { opacity: 0; transform: translateY(6px); } - to { opacity: 1; transform: translateY(0); } +.chat-msg-user { align-self: flex-end; } +.chat-msg-assistant { align-self: flex-start; } +.chat-msg-system { align-self: center; max-width: 100%; } +.chat-msg-error { align-self: center; max-width: 100%; } + +.msg-role { + font-size: 11px; + font-weight: 600; + color: var(--text3); + text-transform: uppercase; + letter-spacing: 0.05em; +} +.chat-msg-user .msg-role { text-align: right; } + +.msg-content { + position: relative; + padding: 12px 16px; + border-radius: var(--radius); + font-size: 14px; + line-height: 1.6; + word-break: break-word; +} +.chat-msg-user .msg-content { + background: var(--primary-dark); + color: #fff; + border-bottom-right-radius: 3px; +} +.chat-msg-assistant .msg-content { + background: var(--bg2); + border: 1px solid var(--border); + color: var(--text); + border-bottom-left-radius: 3px; +} +.chat-msg-system .msg-content { + background: rgba(210, 153, 34, 0.1); + border: 1px solid rgba(210, 153, 34, 0.3); + color: var(--orange); + font-size: 13px; + border-radius: var(--radius); + text-align: center; +} +.chat-msg-error .msg-content { + background: rgba(248, 81, 73, 0.1); + border: 1px solid rgba(248, 81, 73, 0.3); + color: var(--red); + font-size: 13px; + border-radius: var(--radius); + text-align: center; } -.chat-msg-avatar { - width: 32px; height: 32px; border-radius: 50%; display: flex; - align-items: center; justify-content: center; font-size: 0.9rem; - flex-shrink: 0; +.msg-time { + font-size: 10px; + color: var(--text3); } -.chat-msg.user .chat-msg-avatar { background: var(--color-primary); color: white; } -.chat-msg.assistant .chat-msg-avatar { background: #8b5cf6; color: white; } -.chat-msg.error .chat-msg-avatar { background: var(--color-danger); color: white; } +.chat-msg-user .msg-time { text-align: right; } -.chat-msg-content { - flex: 1; min-width: 0; +.typing-cursor { + animation: blink 1s step-end infinite; + margin-left: 2px; } +@keyframes blink { 50% { opacity: 0; } } -.chat-msg-text { - padding: var(--spacing-md); border-radius: var(--radius-lg); - font-size: 0.875rem; line-height: 1.6; white-space: pre-wrap; - word-break: break-word; font-family: inherit; margin: 0; - background: transparent; -} -.chat-msg.user .chat-msg-text { - background: var(--color-primary); color: white; border-bottom-right-radius: 4px; -} -.chat-msg.assistant .chat-msg-text { - background: var(--color-bg-light); color: var(--color-text); - border: 1px solid var(--color-border); border-bottom-left-radius: 4px; -} -.chat-msg.error .chat-msg-text { - background: #fef2f2; color: var(--color-danger); - border: 1px solid #fecaca; font-size: 0.82rem; -} +.msg-text { white-space: pre-wrap; } -/* Streaming cursor blink */ -.chat-msg.assistant .chat-msg-text { +.code-block { + background: var(--bg); + border: 1px solid var(--border); + border-radius: var(--radius); + padding: 12px; + margin: 8px 0; + overflow-x: auto; + font-size: 13px; + line-height: 1.5; position: relative; } +.code-lang { + display: block; + font-size: 11px; + color: var(--text3); + margin-bottom: 6px; + text-transform: lowercase; +} +.code-block code { + font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace; + white-space: pre; +} -/* Chat Input */ +/* Input area */ .chat-input-area { - display: flex; gap: var(--spacing-sm); padding: var(--spacing-md) var(--spacing-xl); - border-top: 1px solid var(--color-border); background: white; align-items: flex-end; + flex-shrink: 0; + padding: 12px 20px 16px; + background: var(--bg2); + border-top: 1px solid var(--border); } +.thinking-bar { + display: flex; + align-items: center; + gap: 8px; + font-size: 12px; + color: var(--text2); + padding: 6px 0 8px; + animation: pulse 1.5s ease-in-out infinite; +} +@keyframes pulse { 0%, 100% { opacity: 0.6; } 50% { opacity: 1; } } +.thinking-dots { letter-spacing: 2px; } -.chat-input { - flex: 1; padding: var(--spacing-md); border: 1px solid var(--color-border); - border-radius: var(--radius-lg); font-size: 0.875rem; font-family: inherit; - resize: none; min-height: 44px; max-height: 160px; line-height: 1.5; - transition: border-color 0.2s; +.chat-input-row { + display: flex; + gap: 10px; + align-items: flex-end; } -.chat-input:focus { - outline: none; border-color: var(--color-primary); - box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1); +.chat-textarea { + flex: 1; + min-height: 60px; + max-height: 200px; + resize: none; + line-height: 1.5; + border-radius: var(--radius); + padding: 10px 14px; } -.chat-input::placeholder { color: var(--color-text-light); } - .chat-send-btn { - width: 44px; height: 44px; border-radius: 50%; border: none; - background: var(--color-primary); color: white; font-size: 1.1rem; - cursor: pointer; transition: all 0.15s; display: flex; - align-items: center; justify-content: center; flex-shrink: 0; + width: 48px; + height: 48px; + border-radius: var(--radius); + border: none; + background: var(--primary); + color: white; + font-size: 18px; + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; + transition: background 0.15s, transform 0.1s; } -.chat-send-btn:hover { background: #1d4ed8; box-shadow: 0 4px 12px rgba(37, 99, 235, 0.3); } -.chat-send-btn:disabled { opacity: 0.5; cursor: not-allowed; } +.chat-send-btn:hover:not(:disabled) { background: #79b8ff; transform: scale(1.05); } +.chat-send-btn:disabled { background: var(--bg3); color: var(--text3); } -/* Scrollbar */ -::-webkit-scrollbar { width: 8px; height: 8px; } +/* ===== View container (tasks, mcp) ===== */ +.view-container { + padding: 24px; + overflow-y: auto; + height: 100%; +} +.view-header { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 16px; +} +.view-header h2 { font-size: 18px; font-weight: 700; } +.view-desc { + color: var(--text2); + font-size: 13px; + margin-bottom: 16px; + max-width: 600px; +} + +/* ===== Buttons ===== */ +.btn { + display: inline-flex; + align-items: center; + justify-content: center; + gap: 6px; + padding: 8px 16px; + border-radius: var(--radius); + border: none; + font-size: 14px; + font-weight: 500; + transition: background 0.15s, transform 0.1s, opacity 0.15s; +} +.btn:hover:not(:disabled) { filter: brightness(1.15); } +.btn:active:not(:disabled) { transform: scale(0.97); } +.btn:disabled { opacity: 0.5; cursor: not-allowed; } +.btn-primary { background: var(--primary); color: #000; } +.btn-secondary { background: var(--bg3); color: var(--text); border: 1px solid var(--border); } +.btn-success { background: rgba(63, 185, 80, 0.15); color: var(--green); border: 1px solid rgba(63, 185, 80, 0.3); } +.btn-danger { background: rgba(248, 81, 73, 0.1); color: var(--red); border: 1px solid rgba(248, 81, 73, 0.3); } +.btn-sm { padding: 5px 10px; font-size: 12px; } +.mt-2 { margin-top: 12px; } + +/* ===== Form card ===== */ +.form-card { + background: var(--bg2); + border: 1px solid var(--border); + border-radius: var(--radius); + padding: 20px; + margin-bottom: 20px; +} +.form-card h3 { font-size: 15px; font-weight: 600; margin-bottom: 16px; } +.form-grid { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 14px; + margin-bottom: 16px; +} +.form-field { display: flex; flex-direction: column; gap: 5px; } +.form-field-full { grid-column: 1 / -1; } +.form-field label { + font-size: 12px; + font-weight: 600; + color: var(--text2); + text-transform: uppercase; + letter-spacing: 0.04em; +} +.form-actions { display: flex; gap: 10px; } + +/* ===== Task list ===== */ +.task-list { display: flex; flex-direction: column; gap: 12px; } +.task-card { + background: var(--bg2); + border: 1px solid var(--border); + border-radius: var(--radius); + padding: 16px; +} +.task-card-header { + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; + margin-bottom: 8px; +} +.task-info { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; } +.task-name { font-weight: 600; font-size: 15px; } +.task-actions { display: flex; gap: 6px; flex-shrink: 0; } +.task-desc { font-size: 13px; color: var(--text2); margin-bottom: 6px; } +.task-prompt-preview { + font-size: 12px; + color: var(--text3); + font-family: monospace; + background: var(--bg); + border-radius: 4px; + padding: 6px 10px; + overflow: hidden; +} + +.task-status-badge { + font-size: 11px; + font-weight: 600; + padding: 2px 8px; + border-radius: 10px; + text-transform: uppercase; +} +.status-idle { background: rgba(139, 148, 158, 0.15); color: var(--text2); } +.status-running { background: rgba(88, 166, 255, 0.15); color: var(--primary); } +.status-completed { background: rgba(63, 185, 80, 0.15); color: var(--green); } +.status-failed { background: rgba(248, 81, 73, 0.15); color: var(--red); } + +.task-cron-badge { + font-size: 11px; + color: var(--text3); + background: var(--bg3); + padding: 2px 8px; + border-radius: 10px; +} + +.task-runs { + margin-top: 12px; + border-top: 1px solid var(--border); + padding-top: 12px; +} +.task-runs-title { + font-size: 11px; + font-weight: 600; + color: var(--text3); + text-transform: uppercase; + margin-bottom: 8px; +} +.run-item { + padding: 8px; + border-radius: var(--radius); + margin-bottom: 6px; + font-size: 12px; + background: var(--bg); + border: 1px solid var(--border); +} +.run-item.run-completed { border-color: rgba(63, 185, 80, 0.3); } +.run-item.run-failed { border-color: rgba(248, 81, 73, 0.3); } +.run-status { font-weight: 600; margin-right: 8px; } +.run-time { color: var(--text3); } +.run-output { + margin-top: 6px; + padding: 6px; + background: var(--bg2); + border-radius: 4px; + font-size: 11px; + white-space: pre-wrap; + overflow-x: auto; + max-height: 100px; + font-family: monospace; +} +.run-error { + margin-top: 6px; + color: var(--red); + font-size: 11px; +} + +/* ===== MCP list ===== */ +.mcp-list { display: flex; flex-direction: column; gap: 10px; margin-top: 12px; } +.mcp-card { + background: var(--bg2); + border: 1px solid var(--border); + border-radius: var(--radius); + padding: 14px; +} +.mcp-card-header { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 4px; +} +.mcp-name { font-weight: 600; font-size: 14px; margin-right: 8px; } +.mcp-type-badge { + font-size: 11px; + padding: 1px 7px; + border-radius: 8px; + background: var(--bg3); + color: var(--text3); +} +.mcp-url { font-size: 12px; color: var(--text3); font-family: monospace; } + +/* ===== Empty state ===== */ +.empty-state { + text-align: center; + color: var(--text2); + font-size: 14px; + padding: 48px 20px; + background: var(--bg2); + border: 1px dashed var(--border); + border-radius: var(--radius); +} + +/* ===== Scrollbar ===== */ +::-webkit-scrollbar { width: 6px; height: 6px; } ::-webkit-scrollbar-track { background: transparent; } -::-webkit-scrollbar-thumb { background: var(--color-border); border-radius: 4px; } -::-webkit-scrollbar-thumb:hover { background: #cbd5e1; } +::-webkit-scrollbar-thumb { background: var(--border); border-radius: 3px; } +::-webkit-scrollbar-thumb:hover { background: var(--text3); } -/* Responsive */ -@media (max-width: 768px) { - .app-main { flex-direction: column; } - .sidebar { width: 100%; border-right: none; border-bottom: 1px solid var(--color-border); max-height: 50vh; } - .content { padding: var(--spacing-lg); } - .task-detail-header { flex-direction: column; gap: var(--spacing-md); } - .task-actions { width: 100%; } - .task-actions button { flex: 1; } - .form-row { grid-template-columns: 1fr; } - .auth-methods { grid-template-columns: 1fr; } - .header-right { flex-wrap: wrap; gap: var(--spacing-sm); } - .chat-view { flex-direction: column; } - .chat-sidebar { width: 100%; max-height: 30vh; border-right: none; border-bottom: 1px solid var(--color-border); } - .chat-msg { max-width: 95%; } - .chat-messages { padding: var(--spacing-md); } - .chat-input-area { padding: var(--spacing-sm) var(--spacing-md); } +/* ===== Responsive tweaks ===== */ +@media (max-width: 600px) { + .sidebar { width: 60px; } + .brand-name, .session-history { display: none; } + .form-grid { grid-template-columns: 1fr; } }