:root{--bg-0:#0b1220;--bg-1:#0f172a;--bg-2:#1e293b;--bg-3:#273449;--fg-0:#e2e8f0;--fg-1:#cbd5e1;--fg-2:#94a3b8;--fg-3:#64748b;--accent:#1e88e5;--accent-hover:#1976d2;--accent-soft:#1e88e52e;--ok:#43a047;--warn:#fb8c00;--danger:#e53935;--border:#1f2a3d;--border-strong:#2c3a52;--radius-sm:6px;--radius-md:10px;--radius-lg:14px;--space-1:4px;--space-2:8px;--space-3:12px;--space-4:16px;--space-5:24px;--font-mono:ui-monospace, SFMono-Regular, "JetBrains Mono", Menlo, Consolas, monospace;--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Microsoft YaHei", Roboto, sans-serif;--toolbar-h:52px}@media (prefers-color-scheme:light){:root{--bg-0:#f8fafc;--bg-1:#fff;--bg-2:#f1f5f9;--bg-3:#e2e8f0;--fg-0:#0f172a;--fg-1:#1e293b;--fg-2:#475569;--fg-3:#64748b;--border:#e2e8f0;--border-strong:#cbd5e1;--accent-soft:#1e88e51f}}*,:before,:after{box-sizing:border-box}html,body,#root{height:100%;margin:0}body{font-family:var(--font-sans);color:var(--fg-0);background:var(--bg-0);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:14px}button{font-family:inherit;font-size:inherit;cursor:pointer;background:var(--bg-2);color:var(--fg-1);border:1px solid var(--border);border-radius:var(--radius-sm);align-items:center;gap:4px;padding:6px 10px;transition:background .15s,border-color .15s,color .15s;display:inline-flex}button:hover:not(:disabled){background:var(--bg-3);color:var(--fg-0)}button:disabled{opacity:.4;cursor:not-allowed}button.primary{background:var(--accent);color:#fff;border-color:var(--accent)}button.primary:hover:not(:disabled){background:var(--accent-hover)}button.danger{color:var(--danger);border-color:#e5393566}button.icon-btn{background:0 0;border:none;padding:4px}button.install{background:var(--accent-soft);border-color:var(--accent);color:var(--accent)}input[type=text],input[type=password],input[type=number],select,textarea{font-family:inherit;font-size:inherit;background:var(--bg-1);width:100%;color:var(--fg-0);border:1px solid var(--border);border-radius:var(--radius-sm);outline:none;padding:8px 10px;transition:border-color .15s}input:focus,select:focus,textarea:focus{border-color:var(--accent)}code{font-family:var(--font-mono);background:var(--bg-2);border-radius:3px;padding:1px 4px;font-size:12px}.app-shell{background:var(--bg-0);flex-direction:column;height:100vh;display:flex}.main-split{flex:1;grid-template-rows:minmax(0,1fr);grid-template-columns:minmax(300px,360px) minmax(0,1fr) minmax(280px,380px);min-height:0;transition:grid-template-columns .2s;display:grid;position:relative}.main-split.script-collapsed{grid-template-columns:minmax(300px,360px) minmax(0,1fr)}.toolbar{height:var(--toolbar-h);padding:0 var(--space-4);border-bottom:1px solid var(--border);background:linear-gradient(180deg, var(--bg-1), var(--bg-0));justify-content:space-between;align-items:center;display:flex}.toolbar-brand{align-items:baseline;gap:var(--space-2);display:flex}.toolbar-brand .logo{color:var(--accent);font-size:22px;font-weight:800}.toolbar-brand .title{letter-spacing:.5px;font-weight:700}.toolbar-brand .subtitle{color:var(--fg-3);font-size:11px}.toolbar-actions,.tb-group{gap:var(--space-1);align-items:center;display:flex}.tb-sep{background:var(--border);width:1px;height:22px;margin:0 var(--space-1);flex-shrink:0}.token-stat{margin-left:var(--space-2);border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--bg-2);color:var(--fg-2);white-space:nowrap;cursor:default;-webkit-user-select:none;user-select:none;align-items:baseline;gap:3px;padding:4px 10px;font-size:12px;display:inline-flex}.token-stat-total{font-family:var(--font-mono);color:var(--fg-1);font-weight:600}.token-stat-label{text-transform:uppercase;letter-spacing:.4px;color:var(--fg-3);font-size:10px}.domain-switch{background:var(--bg-2);border:1px solid var(--border);border-radius:var(--radius-sm);margin-right:var(--space-2);display:inline-flex;overflow:hidden}.domain-switch button{color:var(--fg-2);background:0 0;border:none;border-radius:0;padding:6px 10px}.domain-switch button.active{background:var(--accent-soft);color:var(--accent)}.domain-toast{background:var(--bg-2);color:var(--fg-1);border:1px solid var(--border);border-radius:var(--radius-md);z-index:50;pointer-events:none;white-space:nowrap;padding:8px 18px;font-size:13px;animation:.25s toast-in,.3s 2.2s forwards toast-out;position:absolute;top:58px;left:50%;transform:translate(-50%);box-shadow:0 8px 24px #0000004d}@keyframes toast-in{0%{opacity:0;top:64px}to{opacity:1;top:58px}}@keyframes toast-out{0%{opacity:1}to{opacity:0}}.offline-banner{color:var(--warn);padding:6px var(--space-4);text-align:center;background:#fb8c0026;border-bottom:1px solid #fb8c004d;font-size:13px}.chat-panel{border-right:1px solid var(--border);background:var(--bg-1);flex-direction:column;min-height:0;display:flex}.chat-messages{padding:var(--space-4);flex-direction:column;flex:1;gap:0;display:flex;overflow-y:auto}.empty-hint{text-align:center;color:var(--fg-2);max-width:320px;margin:auto}.empty-hint h3{margin:0 0 var(--space-3) 0;color:var(--fg-0)}.empty-hint em{color:var(--accent);font-style:normal}.muted{color:var(--fg-3)}.small{font-size:12px}.bubble{gap:var(--space-2);padding:var(--space-3);border-radius:var(--radius-md);border:1px solid var(--border);background:var(--bg-2);margin-bottom:var(--space-3);line-height:1.55;display:flex;position:relative}.bubble:last-child{margin-bottom:0}.bubble-icon{color:var(--fg-2);flex-shrink:0;margin-top:2px}.bubble-body{flex:1;min-width:0}.bubble-user{background:var(--accent-soft);border-color:#1e88e559}.bubble-user .bubble-icon{color:var(--accent)}.bubble-error{color:var(--danger);background:#e539351a;border-color:#e5393559}.bubble-ask{background:#fb8c0014;border-color:#fb8c0059}.bubble-ask .bubble-icon{color:var(--warn)}.ask-label{color:var(--warn);text-transform:uppercase;letter-spacing:.5px;font-size:12px;font-weight:600}.ask-hint{margin-top:var(--space-2);color:var(--fg-3);font-size:11px;font-style:italic;display:block}.bubble-user+.bubble-user,.bubble-assistant+.bubble-assistant{border-top-left-radius:6px;border-top-right-radius:6px}:is(.bubble-user:has(+.bubble-user),.bubble-assistant:has(+.bubble-assistant)){margin-bottom:var(--space-1);border-bottom-right-radius:6px;border-bottom-left-radius:6px}.bubble-assistant+.bubble-assistant:before,.bubble-user+.bubble-user:before{content:"";background:var(--border-strong);width:2px;height:6px;position:absolute;top:-5px;left:18px}.bubble-user+.bubble-user:before{background:#1e88e559}.bubble-spec-review{background:var(--bg-2);border:1px solid var(--accent);border-radius:var(--radius-md);padding:var(--space-3);gap:var(--space-2);display:flex}.bubble-spec-review .bubble-icon{color:var(--accent);flex-shrink:0;margin-top:2px}.spec-review-label{color:var(--accent);margin-bottom:var(--space-2);font-size:12px;font-weight:600}.spec-preview{background:var(--bg-1);border:1px solid var(--border);padding:var(--space-2);white-space:pre-wrap;word-break:break-word;max-height:240px;color:var(--fg-1);border-radius:6px;margin:0;font-size:13px;line-height:1.7;overflow-y:auto}.spec-edit-area{background:var(--bg-1);border:1px solid var(--accent);width:100%;min-height:120px;padding:var(--space-2);color:var(--fg-1);resize:vertical;border-radius:6px;font-family:inherit;font-size:13px;line-height:1.7}.spec-edit-area:focus{border-color:var(--accent);outline:none;box-shadow:0 0 0 2px #1e88e533}.spec-review-actions{gap:var(--space-2);margin-top:var(--space-2);display:flex}.spec-btn{cursor:pointer;border:1px solid #0000;border-radius:4px;align-items:center;gap:4px;padding:5px 12px;font-size:12px;font-weight:500;transition:all .15s;display:inline-flex}.spec-btn.edit{background:var(--bg-2);color:var(--fg-2);border-color:var(--border)}.spec-btn.edit:hover{background:var(--bg-3);color:var(--fg-1)}.spec-btn.retry{color:#fb8c00;background:#fb8c001a;border-color:#fb8c004d}.spec-btn.retry:hover{background:#fb8c0033}.spec-btn.confirm{background:var(--accent);color:#fff;border-color:var(--accent)}.spec-btn.confirm:hover{background:#1976d2}.markdown p{margin:0 0 8px}.markdown p:last-child{margin:0}.markdown .katex{font-size:1.05em}.cmd-toggle{margin-top:var(--space-2);color:var(--fg-2);background:0 0;border:none;padding:2px 0;font-size:12px}.cmd-toggle:hover{color:var(--fg-0);background:0 0}.self-check-details{margin-top:var(--space-1);padding:var(--space-1) var(--space-2);background:var(--bg-3);border-radius:var(--radius-sm);font-size:12px}.self-check-summary{cursor:pointer;color:var(--accent);font-weight:600}.self-check-body{margin-top:var(--space-1);color:var(--fg-2);line-height:1.4}.cmd-status.ok{color:var(--ok)}.cmd-status.fail{color:var(--warn)}.cmd-list{margin:var(--space-2) 0 0;flex-direction:column;gap:4px;padding:0;font-size:12px;list-style:none;display:flex}.cmd-list li{background:var(--bg-1);border-radius:var(--radius-sm);border:1px solid var(--border);align-items:flex-start;gap:4px;padding:4px 6px;display:flex}.cmd-list li.ok{border-color:#43a0474d}.cmd-list li.fail{border-color:#e5393566}.cmd-list code{overflow-wrap:anywhere;color:var(--fg-1);background:0 0;flex:1}.cmd-list .err{color:var(--danger);font-size:11px}.thinking{align-items:center;gap:var(--space-2);color:var(--fg-2);padding:var(--space-2);margin:var(--space-1) 0 0;font-size:13px;display:flex}.thinking-text{color:var(--accent);text-overflow:ellipsis;white-space:nowrap;max-width:480px;font-weight:500;animation:1.6s ease-in-out infinite thinking-pulse;overflow:hidden}@keyframes thinking-pulse{0%,to{opacity:1}50%{opacity:.65}}.thinking-cancel{background:var(--bg-2);color:var(--fg-2);border:1px solid var(--border);border-radius:var(--radius-sm);cursor:pointer;align-items:center;gap:4px;padding:2px 8px;font-size:11px;display:inline-flex}.thinking-cancel:hover{background:var(--bg-3);color:var(--fg-1)}.spin{animation:1s linear infinite spin}@keyframes spin{to{transform:rotate(360deg)}}.chat-input-area{border-top:1px solid var(--border);padding:var(--space-3);gap:var(--space-2);background:var(--bg-1);display:flex}.chat-input{resize:none;font-family:var(--font-sans);flex:1}.send-btn{background:var(--accent);color:#fff;border-color:var(--accent);justify-content:center;align-self:stretch;width:44px}.send-btn:hover:not(:disabled){background:var(--accent-hover)}.ggb-panel{background:#fff;min-width:0;min-height:0;position:relative;overflow:hidden}.ggb-host{width:100%;height:100%}.script-panel{background:var(--bg-1);border-left:1px solid var(--border);flex-direction:column;min-width:0;min-height:0;display:flex;overflow:hidden}.script-panel.collapsed{z-index:20;pointer-events:none;background:0 0;border:none;width:auto;height:auto;position:absolute;top:10px;right:12px}.script-rail{pointer-events:auto;border:1px solid var(--border);background:var(--bg-2);color:var(--fg-1);cursor:pointer;border-radius:999px;flex-direction:row;align-items:center;gap:6px;padding:6px 12px;font-size:12px;font-weight:500;transition:background .15s,border-color .15s;display:inline-flex;box-shadow:0 4px 12px #00000040}.script-rail:hover{background:var(--bg-3);border-color:var(--accent);color:var(--fg-0)}.script-rail .rail-text{white-space:nowrap}.script-rail .fail-count{color:var(--warn)}.script-header{padding:var(--space-2) var(--space-3);border-bottom:1px solid var(--border);background:var(--bg-2);flex-shrink:0;justify-content:space-between;align-items:center;height:42px;display:flex}.script-title{color:var(--fg-1);align-items:center;gap:6px;font-weight:500;display:inline-flex}.script-stat{color:var(--fg-3);margin-left:4px;font-size:12px}.script-stat .fail-count{color:var(--warn)}.script-actions{gap:4px;display:flex}.script-actions button{padding:4px 8px;font-size:12px}.script-body{padding:var(--space-2) 0;background:var(--bg-0);min-height:0;font-family:var(--font-mono);white-space:pre;flex:1;margin:0;font-size:12.5px;line-height:1.55;overflow:auto}.script-empty{padding:var(--space-4) var(--space-3);color:var(--fg-3);font-size:12px;font-style:italic}.script-line{gap:var(--space-2);padding:1px var(--space-3);display:flex}.script-line:hover{background:var(--bg-2)}.script-line .ln{color:var(--fg-3);-webkit-user-select:none;user-select:none;flex-shrink:0;padding-top:1px;font-size:11px}.script-line code{color:var(--fg-1);white-space:pre-wrap;word-break:break-word;background:0 0;flex:1;padding:0}.script-line.comment code{color:var(--fg-3);font-style:italic}.script-line.fail code{color:var(--danger)}.script-line.fail{background:#e5393512}.modal-overlay{z-index:100;padding:var(--space-4);background:#0000008c;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.modal{background:var(--bg-1);border:1px solid var(--border);border-radius:var(--radius-lg);padding:var(--space-5);width:480px;max-width:100%;max-height:90vh;overflow-y:auto;box-shadow:0 20px 60px #0006}.modal-wide{width:760px}.modal-header{margin-bottom:var(--space-4);justify-content:space-between;align-items:center;display:flex}.modal-header h2{margin:0;font-size:18px}.privacy-banner{gap:var(--space-2);color:var(--warn);padding:var(--space-3);border-radius:var(--radius-sm);margin-bottom:var(--space-4);background:#fb8c001a;border:1px solid #fb8c004d;align-items:flex-start;font-size:13px;display:flex}.privacy-banner strong{color:var(--warn)}.form{gap:var(--space-4);flex-direction:column;display:flex}.form label{color:var(--fg-2);flex-direction:column;gap:4px;font-size:13px;display:flex}.form label.row{align-items:center;gap:var(--space-2);flex-direction:row}.form label.row span{min-width:90px}.form .hint{color:var(--fg-3);font-size:11px}.form a.hint{color:var(--accent);align-items:center;gap:2px;text-decoration:none;display:inline-flex}.test-result{border-radius:var(--radius-sm);padding:8px 10px;font-size:13px}.test-result.ok{color:var(--ok);background:#43a04726;border:1px solid #43a0474d}.test-result.fail{color:var(--danger);background:#e539351f;border:1px solid #e539354d}.actions{align-items:center;gap:var(--space-2);display:flex}.actions .spacer{flex:1}.template-grid{gap:var(--space-2);margin-top:var(--space-3);grid-template-columns:repeat(auto-fill,minmax(160px,1fr));display:grid}.template-card{text-align:left;padding:var(--space-2) var(--space-3);background:var(--bg-2);border-radius:var(--radius-md);border:1px solid var(--border);flex-direction:column;align-items:flex-start;gap:2px;display:flex}.template-card:hover{border-color:var(--accent);background:var(--bg-3)}.template-icon{margin-bottom:2px;font-size:22px;line-height:1}.template-title{color:var(--fg-0);font-size:14px;font-weight:600}.template-subtitle{color:var(--fg-2);font-size:12px;line-height:1.4}.pwa-update{right:var(--space-4);bottom:var(--space-4);align-items:center;gap:var(--space-2);background:var(--bg-2);border:1px solid var(--border);border-radius:var(--radius-md);padding:var(--space-2) var(--space-3);z-index:90;display:flex;position:fixed;box-shadow:0 10px 30px #0006}@media (max-width:1280px){.main-split:not(.script-collapsed){grid-template-columns:minmax(320px,360px) minmax(0,1fr) minmax(280px,360px)}.main-split.script-collapsed{grid-template-columns:minmax(320px,360px) minmax(0,1fr)}}@media (max-width:800px){.main-split,.main-split.script-collapsed{grid-template-rows:minmax(35vh,45vh) 1fr;grid-template-columns:1fr}.chat-panel{border-right:none;border-bottom:1px solid var(--border)}.script-panel:not(.collapsed){display:none}}.session-new{border:1px dashed var(--accent);border-radius:var(--radius-md);width:100%;color:var(--accent);cursor:pointer;background:0 0;align-items:center;gap:6px;margin-bottom:12px;padding:8px 12px;font-size:13px;display:flex}.session-new:hover{background:var(--accent-soft)}.session-empty{color:var(--fg-2);justify-content:center;align-items:center;gap:8px;padding:24px 0;font-size:13px;display:flex}.session-list{max-height:50vh;margin:0;padding:0;list-style:none;overflow-y:auto}.session-item{border-radius:var(--radius-md);cursor:pointer;align-items:center;gap:8px;margin-bottom:4px;padding:10px 12px;display:flex}.session-item:hover{background:var(--bg-1)}.session-item.active{background:var(--accent-soft);outline:1px solid var(--accent)}.session-title{text-overflow:ellipsis;white-space:nowrap;flex:1;font-size:14px;overflow:hidden}.session-meta{color:var(--fg-2);white-space:nowrap;font-size:12px}.session-actions{opacity:0;gap:2px;transition:opacity .15s;display:flex}.session-item:hover .session-actions{opacity:1}.usage-summary-inline{color:var(--fg-3);margin-left:4px;font-size:12px;font-weight:400}.usage-totals{gap:var(--space-2);margin:var(--space-2) 0 var(--space-3);display:flex}.usage-total{padding:var(--space-2) var(--space-3);background:var(--bg-2);border:1px solid var(--border);border-radius:var(--radius-sm);flex-direction:column;flex:1;gap:2px;display:flex}.usage-total-label{color:var(--fg-3);font-size:11px}.usage-total-value{font-family:var(--font-mono);color:var(--fg-0);font-size:16px;font-weight:600}.token-chart{gap:var(--space-3);padding:var(--space-1) 0 var(--space-2);flex-direction:column;display:flex}.token-chart-block{gap:var(--space-1);flex-direction:column;display:flex}.token-chart-title{color:var(--fg-2);font-size:12px}.token-chart-block svg{background:var(--bg-1);border:1px solid var(--border);border-radius:var(--radius-sm);width:100%;height:auto;display:block}.token-chart-empty{padding:var(--space-4) var(--space-2);color:var(--fg-3);text-align:center;font-size:12px;font-style:italic}.token-chart-legend{gap:var(--space-3);padding:var(--space-1) var(--space-1) 0;color:var(--fg-2);flex-wrap:wrap;font-size:11px;display:flex}.legend-item{align-items:center;gap:5px;display:inline-flex}.legend-swatch{border-radius:2px;width:10px;height:10px;display:inline-block}.legend-swatch.legend-line{border-radius:1px;width:14px;height:3px;background:var(--warn)!important}.input-stack{gap:var(--space-2);flex-direction:column;flex:1;min-width:0;display:flex}.attach-btn{flex-shrink:0;justify-content:center;align-self:stretch;align-items:center;width:40px;display:inline-flex}.attach-strip{gap:var(--space-2);flex-wrap:wrap;display:flex}.attach-thumb{border-radius:var(--radius-sm);border:1px solid var(--border-strong);cursor:pointer;flex-shrink:0;width:56px;height:56px;position:relative;overflow:hidden}.attach-thumb img{object-fit:cover;width:100%;height:100%;display:block}.attach-thumb-remove{color:#fff;text-align:center;cursor:pointer;background:#0009;border:none;border-radius:50%;justify-content:center;align-items:center;width:18px;height:18px;padding:0;font-size:12px;line-height:18px;display:flex;position:absolute;top:2px;right:2px}.attach-thumb-remove:hover{background:#000c}.chat-input-area.dragover{border-color:var(--accent);background:var(--accent-soft,#1976d214)}.msg-images{gap:var(--space-2);margin-top:var(--space-2);flex-wrap:wrap;display:flex}.msg-images img{object-fit:cover;border-radius:var(--radius-sm);border:1px solid var(--accent);cursor:pointer;width:96px;height:96px}.msg-images img:hover{opacity:.85}.lightbox-overlay{z-index:100;cursor:pointer;background:#000000bf;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.lightbox-overlay img{border-radius:var(--radius-md);max-width:90vw;max-height:90vh;box-shadow:0 4px 24px #0006}.problem-section{margin-bottom:var(--space-2)}.problem-section-title{color:var(--fg-3);text-transform:uppercase;letter-spacing:.5px;margin-bottom:2px;font-size:11px;font-weight:600}.problem-chips{flex-wrap:wrap;gap:4px;display:flex}.problem-chip{font-size:11px;font-family:var(--font-mono);background:var(--bg-1);border:1px solid var(--border);white-space:nowrap;border-radius:999px;padding:1px 8px}.problem-list{color:var(--fg-1);margin:0;padding-left:1.2em;font-size:12px}.problem-list li{margin-bottom:2px}
