/* KODAI Studio — tema gelap mobile-first (dari mockup UI) */
:root{
  --bg:#14161b; --panel:#1a1d24; --panel2:#20242d; --field:#171a20;
  --line:#2b303b; --line2:#3a4150;
  --txt:#e9ecf2; --mut:#8a93a4; --dim:#5b6373;
  --acc:#aebfd6; --user:#2a3140; --danger:#d07a7a; --ok:#8fbf9a;
  --r:16px; --rs:12px;
  --sans:'Space Grotesk',system-ui,-apple-system,sans-serif;
  --mono:'JetBrains Mono',ui-monospace,Menlo,monospace;
  --app-height:100vh;
}
*{box-sizing:border-box;margin:0;padding:0;-webkit-tap-highlight-color:transparent}
html,body{width:100%;height:100%;min-height:100%;overflow:hidden}
html{min-height:-webkit-fill-available}
body{background:var(--bg);color:var(--txt);font-family:var(--sans);font-size:15px;overflow:hidden;overscroll-behavior:none;touch-action:manipulation}
button{font-family:inherit;color:inherit;background:none;border:none;cursor:pointer}
input,textarea,select{font-family:inherit;color:var(--txt);background:var(--field);border:1px solid var(--line);outline:none}
input:focus,textarea:focus,select:focus{border-color:var(--line2)}
a{color:var(--acc)}
::-webkit-scrollbar{width:4px;height:4px}
::-webkit-scrollbar-thumb{background:var(--line);border-radius:2px}

/* label row signature: NAMA ..... hint */
.lrow{display:flex;align-items:baseline;justify-content:space-between;margin:0 0 8px}
.lrow b{font-family:var(--mono);font-size:12px;font-weight:700;letter-spacing:.14em;text-transform:uppercase;color:var(--txt)}
.lrow span{font-family:var(--mono);font-size:12px;color:var(--dim)}

@supports (height:100svh){:root{--app-height:100svh}}
@supports (height:100dvh){:root{--app-height:100dvh}}

/* ===== app frame ===== */
#app{position:fixed;inset:0;width:100%;height:auto;max-height:none;display:flex;flex-direction:column;overflow:hidden}
header{display:flex;align-items:center;gap:10px;padding:10px 14px;padding-top:calc(10px + env(safe-area-inset-top));border-bottom:1px solid var(--line);background:var(--panel);flex-shrink:0}
header .icbtn{width:38px;height:38px;border-radius:12px;display:grid;place-items:center;border:1px solid var(--line);background:var(--field);color:var(--mut);font-size:17px;flex-shrink:0}
header .icbtn:active{background:var(--panel2)}
#hTitle{flex:1;min-width:0}
#hTitle .t{font-weight:700;font-size:15px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
#hTitle .s{font-family:var(--mono);font-size:10.5px;color:var(--dim);letter-spacing:.08em;text-transform:uppercase;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.sessionUsage{height:30px;max-width:152px;border:1px solid var(--line);border-radius:10px;background:var(--field);color:var(--dim);font-family:var(--mono);font-size:10.5px;letter-spacing:.04em;padding:0 10px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex-shrink:0}
.sessionUsage:hover,.sessionUsage:focus{color:var(--txt);border-color:var(--line2)}

/* ===== chat ===== */
#chat{flex:1;min-height:0;overflow-y:auto;-webkit-overflow-scrolling:touch;overscroll-behavior:contain;padding:16px 14px 8px;scroll-behavior:smooth}
.empty{height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;color:var(--dim);text-align:center;padding:0 30px}
.empty .logo{font-family:var(--mono);font-size:26px;font-weight:700;letter-spacing:.3em;color:var(--mut)}
.empty p{font-size:13px;line-height:1.6}
.msg{max-width:900px;margin:0 auto 18px;display:flex;flex-direction:column}
.msg .meta{font-family:var(--mono);font-size:10.5px;letter-spacing:.12em;text-transform:uppercase;color:var(--dim);margin-bottom:6px;display:flex;gap:10px;align-items:center}
.msg.user .meta{align-self:flex-end}
.msg .bubble{border-radius:var(--r);padding:12px 14px;line-height:1.62;word-wrap:break-word}
.msg.user .bubble{background:var(--user);border:1px solid var(--line2);align-self:flex-end;max-width:88%;border-bottom-right-radius:6px;white-space:pre-wrap}
.msg.assistant .bubble{background:var(--panel);border:1px solid var(--line);border-bottom-left-radius:6px}
.msg .actions{display:flex;gap:6px;margin-top:6px}
.workspaceChanges{margin-top:8px;padding:10px 11px;border:1px solid var(--line);border-radius:12px;background:rgba(255,255,255,.018);font-family:var(--mono)}
.workspaceChangesHead{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:8px}.workspaceChangesHead b{font-size:11px;color:var(--txt)}
.workspaceChangeRow{display:flex;align-items:center;gap:8px;min-width:0;font-size:10.5px;line-height:1.7;color:var(--mut)}
.workspaceChangeRow span:first-child{width:10px;flex:none;text-align:center;font-weight:700}.workspaceChangeRow.added span:first-child{color:var(--ok)}.workspaceChangeRow.modified span:first-child{color:var(--acc)}.workspaceChangeRow.removed span:first-child{color:var(--danger)}
.workspaceChangeRow span:last-child{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.workspaceChangesMore{margin-top:5px;color:var(--dim);font-size:10px}
.msg.user .actions{align-self:flex-end}
.usageMeta{font-family:var(--mono);font-size:10.5px;color:var(--dim);letter-spacing:.06em;margin-top:6px}
.miniBtn{font-family:var(--mono);font-size:10.5px;letter-spacing:.06em;color:var(--dim);border:1px solid var(--line);border-radius:8px;padding:4px 9px;background:var(--field);cursor:pointer}
.copyIconBtn{min-width:28px;padding:4px 7px;font-size:13px;line-height:1}
.miniBtn:active{color:var(--txt);border-color:var(--line2)}
.miniBtn.done{color:var(--ok);border-color:var(--ok)}
.attChips{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:8px;justify-content:flex-end}
.attChip{display:flex;align-items:center;gap:7px;background:var(--field);border:1px solid var(--line);border-radius:10px;padding:6px 9px;font-family:var(--mono);font-size:11px;color:var(--mut);max-width:220px;text-decoration:none}
.attChip img{width:26px;height:26px;object-fit:cover;border-radius:6px}
.attChip .nm{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}

/* markdown */
.md h1,.md h2,.md h3{margin:14px 0 8px;line-height:1.3}
.md h1{font-size:1.3em}.md h2{font-size:1.15em}.md h3{font-size:1.05em}
.md p{margin:8px 0}
.md ul,.md ol{margin:8px 0;padding-left:22px}
.md li{margin:4px 0}
.md a{color:var(--acc)}
.md blockquote{border-left:3px solid var(--line2);padding:2px 12px;margin:10px 0;color:var(--mut)}
.md table{border-collapse:collapse;margin:10px 0;width:100%;font-size:13.5px;display:block;overflow-x:auto}
.md th,.md td{border:1px solid var(--line);padding:6px 10px;text-align:left;white-space:nowrap}
.md th{background:var(--panel2);font-family:var(--mono);font-size:11.5px;letter-spacing:.05em}
.md code{font-family:var(--mono);font-size:.86em;background:var(--panel2);border:1px solid var(--line);border-radius:5px;padding:1px 5px}
.md pre{position:relative;margin:12px 0;border:1px solid var(--line);border-radius:var(--rs);overflow:hidden;background:#12141a}
.md pre code{display:block;padding:32px 14px 12px;overflow-x:auto;background:none;border:none;font-size:12.5px;line-height:1.55}
.md pre .cpLang{position:absolute;top:0;left:0;right:0;height:26px;display:flex;align-items:center;justify-content:space-between;padding:0 10px;background:var(--panel2);border-bottom:1px solid var(--line);font-family:var(--mono);font-size:10.5px;color:var(--dim);letter-spacing:.08em;text-transform:uppercase}
.md pre .cpLang button{font-family:var(--mono);font-size:13px;color:var(--dim);letter-spacing:0;line-height:1}
.md pre .cpLang button:active{color:var(--txt)}
.md hr{border:none;border-top:1px solid var(--line);margin:14px 0}

.typingWrap{display:inline-flex;align-items:center;gap:10px;color:var(--mut);font-size:12.5px}
.typing{display:inline-flex;gap:4px;padding:4px 0}
.typing i{width:6px;height:6px;border-radius:50%;background:var(--dim);animation:tp 1s infinite}
.typing i:nth-child(2){animation-delay:.15s}.typing i:nth-child(3){animation-delay:.3s}
@keyframes tp{0%,60%,100%{opacity:.25;transform:translateY(0)}30%{opacity:1;transform:translateY(-3px)}}
.cursorBlink::after{content:'▌';color:var(--acc);animation:bl .8s infinite}
@keyframes bl{50%{opacity:0}}

/* Teks separa kekal dalam viewport sendiri supaya loop panjang tidak
   memanjangkan keseluruhan chat. Jawapan akhir masih dirender penuh. */
.msg.assistant .streamingBubble{padding:0;overflow:hidden}
.streamHead{height:38px;display:flex;align-items:center;gap:9px;padding:0 11px;border-bottom:1px solid var(--line);background:rgba(255,255,255,.018);font-family:var(--mono);font-size:10.5px}
.streamState{display:flex;align-items:center;gap:7px;color:var(--mut);letter-spacing:.05em}
.streamState:before{content:'';width:6px;height:6px;border-radius:50%;background:var(--acc);box-shadow:0 0 0 3px rgba(174,191,214,.08);animation:tp 1.2s infinite}
.streamCount{margin-left:auto;color:var(--dim);white-space:nowrap}
.streamToggle,.streamFollow{color:var(--mut);border:1px solid var(--line);border-radius:7px;padding:4px 7px;font-family:var(--mono);font-size:10px;white-space:nowrap}
.streamToggle:hover,.streamToggle:focus,.streamFollow:hover,.streamFollow:focus{color:var(--txt);border-color:var(--line2)}
.streamFollow[hidden]{display:none}
.streamBody{max-height:320px;overflow:auto;padding:12px 14px;white-space:pre-wrap;overflow-wrap:anywhere;scroll-behavior:auto;overscroll-behavior:contain}
.streamingBubble.expanded .streamBody{max-height:min(70vh,760px)}
.streamCaret{display:inline-block;width:2px;height:1.05em;margin-left:2px;vertical-align:-.12em;background:var(--acc);animation:bl .8s infinite}
@media(max-width:620px){.streamBody{max-height:260px}.streamingBubble.expanded .streamBody{max-height:62vh}.streamHead{padding:0 9px}.streamCount{display:none}}

/* ===== composer ===== */
#composer{flex-shrink:0;border-top:1px solid var(--line);background:var(--panel);padding:8px 10px calc(8px + max(env(safe-area-inset-bottom), 0px))}
.artifactRail{flex:0 0 auto;display:flex;align-items:center;gap:7px;overflow-x:auto;padding:7px 10px;border-top:1px solid var(--line);background:var(--panel);scrollbar-width:none}
.artifactRail[hidden]{display:none}.artifactRail::-webkit-scrollbar{display:none}.artifactRailLabel{flex:none;font-family:var(--mono);font-size:10px;color:var(--dim);letter-spacing:.04em}.artifactPill{flex:0 0 auto;max-width:210px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;border:1px solid var(--line);border-radius:999px;background:var(--field);color:var(--mut);font-family:var(--mono);font-size:10.5px;padding:6px 9px}.artifactPill:hover{color:var(--txt);border-color:var(--line2)}.artifactRailClose{flex:none;width:26px;height:26px;border-radius:50%;color:var(--dim);font-size:16px}
#pendChips{display:flex;gap:6px;overflow-x:auto;padding-bottom:8px}
#pendChips:empty{display:none;padding:0}
#templateContext{display:flex;gap:7px;overflow-x:auto;padding-bottom:8px}
#templateContext:empty{display:none;padding:0}
.templateContextChip{flex:0 0 auto;max-width:min(360px,85vw);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;border:1px solid rgba(174,191,214,.26);border-radius:999px;background:rgba(174,191,214,.08);color:var(--acc);font-family:var(--mono);font-size:10.5px;padding:6px 10px}
.templateContextChip.needsSetup{border-style:dashed;color:var(--mut);background:var(--field)}
.pend{position:relative;flex-shrink:0;display:flex;align-items:center;gap:7px;background:var(--field);border:1px solid var(--line);border-radius:10px;padding:6px 26px 6px 8px;font-family:var(--mono);font-size:11px;color:var(--mut)}
.pend img{width:30px;height:30px;object-fit:cover;border-radius:6px}
.pend .x{position:absolute;top:2px;right:4px;color:var(--dim);font-size:13px;padding:2px}
.pend.uploading{opacity:.5}
#promptChips{display:flex;gap:7px;overflow-x:auto;padding-bottom:8px;scrollbar-width:none}
#promptChips:empty{display:none}
#promptChips::-webkit-scrollbar{display:none}
.promptChip{flex:0 0 auto;border:1px solid var(--line);border-radius:999px;background:var(--field);color:var(--mut);font-family:var(--mono);font-size:11px;padding:6px 10px;white-space:nowrap}
.promptChip:hover,.promptChip:focus{border-color:var(--line2);color:var(--txt)}
#composerShell{border:1px solid var(--line);border-radius:14px;background:var(--field);overflow:visible}
#composerControls{display:flex;align-items:center;gap:8px;border-top:1px solid var(--line);padding:7px}
.attachWrap{position:relative;flex:0 0 auto}
#attachMenu{position:absolute;left:0;bottom:42px;z-index:30;width:190px;padding:6px;border:1px solid var(--line);border-radius:14px;background:var(--panel2);box-shadow:0 18px 40px rgba(0,0,0,.38)}
#attachMenu[hidden]{display:none}
#attachMenu button{width:100%;display:flex;align-items:center;min-height:34px;padding:8px 10px;border-radius:10px;color:var(--mut);font-family:var(--mono);font-size:11px;text-align:left}
#attachMenu button:active,#attachMenu button:hover{background:var(--field);color:var(--txt)}
#attBtn,#sendBtn{height:34px;border-radius:10px;display:grid;place-items:center;flex-shrink:0;font-family:var(--mono);font-size:11px}
#attBtn{border:1px solid var(--line);background:rgba(255,255,255,.025);color:var(--mut);padding:0 11px}
#sendBtn{width:42px;background:#fff;color:#14161b;font-weight:700;padding:0;font-size:20px;line-height:1}
#sendBtn.running{color:var(--danger);background:rgba(255,95,109,.10);border:1px solid rgba(255,95,109,.42);font-size:15px}
#sendBtn.running:hover{background:rgba(255,95,109,.18)}
#sendBtn:disabled{opacity:.35}
#toolSelect,#quickModelSelect{max-width:150px;height:34px;border-radius:10px;border:1px solid var(--line);background:rgba(23,26,32,.72);color:var(--txt);font-family:var(--mono);font-size:11px;letter-spacing:0;padding:0 26px 0 10px;appearance:none;white-space:nowrap;text-overflow:ellipsis;background-image:linear-gradient(45deg,transparent 50%,var(--mut) 50%),linear-gradient(135deg,var(--mut) 50%,transparent 50%);background-position:calc(100% - 14px) 14px,calc(100% - 9px) 14px;background-size:5px 5px,5px 5px;background-repeat:no-repeat}
#quickModelSelect{max-width:180px}
#executionMode{max-width:142px;height:34px;border-radius:10px;border:1px solid var(--line);background:rgba(23,26,32,.72);color:var(--txt);font-family:var(--mono);font-size:11px;padding:0 25px 0 9px;appearance:none;white-space:nowrap;text-overflow:ellipsis;background-image:linear-gradient(45deg,transparent 50%,var(--mut) 50%),linear-gradient(135deg,var(--mut) 50%,transparent 50%);background-position:calc(100% - 13px) 14px,calc(100% - 8px) 14px;background-size:5px 5px,5px 5px;background-repeat:no-repeat}
#toolSelect{margin-left:auto}
#toolSelect:focus,#quickModelSelect:focus,#executionMode:focus{border-color:var(--line2)}
#msgIn{display:block;width:100%;min-height:66px;resize:none;border:0;border-radius:14px 14px 0 0;padding:12px 13px;max-height:150px;line-height:1.5;font-size:16px;background:transparent}
.sheetHint{margin:0 0 16px;color:var(--mut);font-size:12.5px;line-height:1.55}
.fieldLabel{display:block;margin:0 0 7px;font-family:var(--mono);font-size:10.5px;letter-spacing:.08em;text-transform:uppercase;color:var(--dim)}
#dtxProjectName{width:100%;height:42px;border-radius:10px;padding:0 11px;font-size:14px}
.dtxSetupActions{display:flex;justify-content:flex-end;gap:8px;margin-top:16px}
.dtxSetupActions .primaryBtn{min-height:36px;border-radius:9px;background:#fff;color:#14161b;font-family:var(--mono);font-size:11px;font-weight:700;padding:0 13px}
.dangerBtn{margin-right:auto;color:var(--danger);border-color:rgba(255,95,109,.28)}

/* ===== drawer ===== */
.scrim{position:fixed;inset:0;background:rgba(0,0,0,.55);opacity:0;pointer-events:none;transition:opacity .22s;z-index:40}
.scrim.show{opacity:1;pointer-events:auto}
#drawer{position:fixed;top:0;bottom:0;left:0;width:min(86vw,330px);background:var(--panel);border-right:1px solid var(--line);z-index:50;transform:translateX(-102%);transition:transform .24s ease;display:flex;flex-direction:column;padding-top:env(safe-area-inset-top)}
#drawer.show{transform:none}
#drawer .dhead{padding:16px 16px 12px;border-bottom:1px solid var(--line)}
#drawer .dhead .logo{font-family:var(--mono);font-weight:700;font-size:15px;letter-spacing:.3em}
#drawer .dhead .sub{font-family:var(--mono);font-size:10px;color:var(--dim);letter-spacing:.1em;margin-top:4px}
#dActions{display:flex;flex-wrap:wrap;gap:8px;padding:12px 14px}
.wideBtn{flex:1 1 calc(50% - 8px);font-family:var(--mono);font-size:11.5px;letter-spacing:.08em;text-transform:uppercase;border:1px solid var(--line);border-radius:12px;padding:10px;color:var(--mut);background:var(--field);text-align:center}
.wideBtn.primary{background:#fff;color:#14161b;border-color:#fff;font-weight:700}
#folders{flex:1;overflow-y:auto;padding:4px 10px 8px}
.folder{margin-bottom:4px}
.folder .fhead{display:flex;align-items:center;gap:8px;padding:10px 8px;border-radius:10px;cursor:pointer}
.folder .fhead:active{background:var(--panel2)}
.folder .fhead .car{font-family:var(--mono);color:var(--dim);font-size:11px;transition:transform .18s;width:12px}
.folder.open .fhead .car{transform:rotate(90deg)}
.folder .fhead .fname{flex:1;font-weight:500;font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.folder .fhead .cnt{font-family:var(--mono);font-size:10.5px;color:var(--dim)}
.folder .fhead .fmenu{color:var(--dim);padding:4px 6px;font-size:15px}
.folder .sess{display:none;padding-left:14px}
.folder.open .sess{display:block}
.sessItem{display:flex;align-items:center;gap:8px;padding:9px 10px;border-radius:10px;font-size:13.5px;color:var(--mut);cursor:pointer;border-left:2px solid var(--line)}
.sessItem .nm{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.sessItem .del{color:var(--dim);font-size:13px;padding:2px 5px;display:none}
.sessItem:hover .del,.sessItem.act .del{display:block}
.sessItem.act{color:var(--txt);background:var(--panel2);border-left-color:var(--acc)}
.sessAdd{font-family:var(--mono);font-size:11px;color:var(--dim);padding:8px 10px;letter-spacing:.06em}
.sessAdd:active{color:var(--txt)}
.gwBadge{display:flex;align-items:center;gap:8px;padding:12px 16px calc(12px + max(env(safe-area-inset-bottom), 0px));border-top:1px solid var(--line);font-family:var(--mono);font-size:10.5px;color:var(--dim)}
.gwBadge .dot{width:8px;height:8px;border-radius:50%;background:var(--dim);flex-shrink:0}
.gwBadge.ok .dot{background:var(--ok)}
.gwBadge.bad .dot{background:var(--danger)}

/* ===== sheets ===== */
.sheet{position:fixed;left:0;right:0;bottom:0;z-index:60;background:var(--panel);border:1px solid var(--line);border-bottom:none;border-radius:22px 22px 0 0;transform:translateY(103%);transition:transform .26s ease;max-height:88dvh;display:flex;flex-direction:column;padding-bottom:env(safe-area-inset-bottom)}
.sheet.show{transform:none}
.sheet .grab{width:40px;height:4px;border-radius:2px;background:var(--line2);margin:10px auto 4px;flex-shrink:0}
.sheet .shead{display:flex;align-items:center;justify-content:space-between;padding:8px 20px 12px;border-bottom:1px solid var(--line);flex-shrink:0}
.sheet .shead b{font-family:var(--mono);font-size:13px;letter-spacing:.18em;text-transform:uppercase;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.sheet .shead .closeSheet{color:var(--dim);font-size:20px;padding:4px 8px}
.sheet .sbody{overflow-y:auto;padding:18px 20px 26px}

/* settings — ikut screenshot */
.grid2{display:grid;grid-template-columns:1fr 1fr;gap:16px 14px}
.fld{min-width:0}
.presetWrap select,.fld input[type=number],.fld select{width:100%;border-radius:14px;padding:13px 14px;font-size:16px;font-family:var(--mono);background:var(--field)}
.tempWrap,.sysPromptWrap{margin-top:20px}
.sysPromptWrap{width:100%}
#setSystemPrompt{display:block;width:100%;min-height:180px;border-radius:14px;padding:13px 14px;font-size:16px;font-family:var(--mono);line-height:1.55;background:var(--field);resize:vertical}
input[type=range]{-webkit-appearance:none;appearance:none;width:100%;height:8px;border-radius:4px;background:linear-gradient(to right,#77839a 0%,#77839a var(--fill,12%),#dfe3ea var(--fill,12%));border:none;padding:0}
input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;width:44px;height:28px;border-radius:16px;background:#fff;box-shadow:0 1px 4px rgba(0,0,0,.4);cursor:pointer}
input[type=range]::-moz-range-thumb{width:44px;height:28px;border-radius:16px;background:#fff;border:none;cursor:pointer}
.setNote{font-family:var(--mono);font-size:10.5px;color:var(--dim);margin-top:20px;line-height:1.7}

/* workspace */
.wsItem{display:flex;align-items:center;gap:12px;padding:12px 4px;border-bottom:1px solid var(--line);cursor:pointer}
.wsItem .ic{width:38px;height:38px;border-radius:10px;background:var(--panel2);border:1px solid var(--line);display:grid;place-items:center;font-family:var(--mono);font-size:9.5px;font-weight:700;color:var(--acc);letter-spacing:.04em;flex-shrink:0}
.wsItem.dir .ic{color:var(--mut)}
.wsItem .inf{flex:1;min-width:0}
.wsItem .inf .n{font-family:var(--mono);font-size:13px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.wsItem .inf .d{font-family:var(--mono);font-size:10.5px;color:var(--dim);margin-top:2px}
.wsItem .rm{color:var(--dim);padding:6px}
.wsItem .miniBtn{flex-shrink:0}
.wsLiveApps{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding:12px 4px;border-bottom:1px solid var(--line);background:rgba(255,255,255,.02)}
.wsLiveTitle{font-family:var(--mono);font-size:10.5px;color:var(--dim);letter-spacing:.1em;text-transform:uppercase;margin-right:2px}
.livePreviewBtn{background:rgba(143,191,154,.12);border-color:rgba(143,191,154,.45);color:var(--ok)}
.msgLivePreview{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:12px;padding-top:10px;border-top:1px solid var(--line)}
.msgLivePreview span{font-family:var(--mono);font-size:10.5px;color:var(--dim);letter-spacing:.1em;text-transform:uppercase}
.mediaItem .miniBtn{margin-left:8px;flex-shrink:0}
.mediaItem .rm{margin-left:2px;flex-shrink:0}
.wsEmpty{color:var(--dim);font-size:13px;text-align:center;padding:34px 20px;line-height:1.7}
#fvEditor{width:100%;min-height:46dvh;background:#12141a;border:1px solid var(--line);border-radius:var(--rs);padding:14px;font-family:var(--mono);font-size:12.5px;line-height:1.55;resize:vertical}

/* toast */
#toast{position:fixed;left:50%;bottom:calc(90px + max(env(safe-area-inset-bottom), 0px));transform:translateX(-50%) translateY(20px);background:#fff;color:#14161b;font-family:var(--mono);font-size:12px;font-weight:700;padding:9px 16px;border-radius:99px;opacity:0;transition:.25s;z-index:99;pointer-events:none;white-space:nowrap;max-width:88vw;overflow:hidden;text-overflow:ellipsis}
#toast.show{opacity:1;transform:translateX(-50%)}

/* ===== auth & profil ===== */
.authBody{display:flex;align-items:center;justify-content:center;padding:20px;overflow:auto}
.authCard{width:100%;max-width:400px;background:var(--panel);border:1px solid var(--line);border-radius:22px;padding:28px 24px;margin-bottom:40px}
.authLogo{font-family:var(--mono);font-weight:700;font-size:22px;letter-spacing:.3em}
.authSub{font-family:var(--mono);font-size:10.5px;color:var(--dim);letter-spacing:.12em;margin:4px 0 22px}
.authIn{width:100%;border-radius:14px;padding:13px 14px;font-size:16px}
.authBtn{width:100%;margin-top:22px;background:#fff;color:#14161b;font-family:var(--mono);font-weight:700;font-size:13px;letter-spacing:.1em;text-transform:uppercase;border-radius:14px;padding:14px;cursor:pointer}
.authErr{background:rgba(208,122,122,.12);border:1px solid var(--danger);color:var(--danger);border-radius:12px;padding:10px 13px;font-size:13px;margin-bottom:16px}
.authOk{background:rgba(143,191,154,.1);border:1px solid var(--ok);color:var(--ok);border-radius:12px;padding:10px 13px;font-size:13px;margin-bottom:16px}
.authHint{font-family:var(--mono);font-size:10.5px;color:var(--dim);margin-top:18px;line-height:1.7;text-align:center}
.authHint code{color:var(--mut)}
.profGrid{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;margin-top:24px}
.profStat{background:var(--field);border:1px solid var(--line);border-radius:14px;padding:14px;text-align:center}
.profStat b{font-family:var(--mono);font-size:20px;display:block}
.profStat span{font-family:var(--mono);font-size:10px;color:var(--dim);letter-spacing:.08em;text-transform:uppercase}
.profGw{background:var(--field);border:1px solid var(--line);border-radius:14px;padding:14px;font-family:var(--mono);font-size:12px;line-height:2}
.profGw .k{color:var(--dim);display:inline-block;width:64px}

/* desktop */
@media(min-width:960px){
  #app{flex-direction:row}
  #drawer{position:static;transform:none;width:300px;flex-shrink:0}
  #main{flex:1;display:flex;flex-direction:column;min-width:0;min-height:0;overflow:hidden}
  .scrim.forDrawer{display:none}
  header .icbtn.menu{display:none}
  .sheet{left:auto;right:24px;bottom:24px;width:480px;border-radius:22px;border-bottom:1px solid var(--line)}
  #setSheet{width:min(96vw,760px)}
}
@media(max-width:959px){#main{display:flex;flex-direction:column;flex:1;min-height:0;overflow:hidden}header{gap:8px;padding-left:10px;padding-right:10px}.sessionUsage{max-width:118px;padding:0 8px;font-size:10px}#composerControls{gap:6px}#toolSelect{max-width:128px;font-size:10.5px;padding-left:9px;padding-right:22px}#quickModelSelect{max-width:132px;font-size:10.5px}#attBtn{max-width:104px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}#sendBtn{min-width:42px}#msgIn{font-size:16px;padding-left:12px;padding-right:12px}#setSystemPrompt{font-size:16px}}
@media(prefers-reduced-motion:reduce){*{transition:none!important;animation:none!important}}

/* media viewer */
.mediaViewSheet{top:calc(env(safe-area-inset-top) + 8px);bottom:0;height:auto;max-height:none;border-radius:18px 18px 0 0}
.mediaViewSheet .grab{margin-top:8px}
.mediaViewSheet .shead{position:sticky;top:0;z-index:3;background:var(--panel);padding:6px 12px 10px}
.mediaViewSheet .shead b{min-width:0}
.mediaViewSheet .shead span{display:flex;align-items:center;gap:8px;flex-shrink:0}
.mediaViewSheet .shead .miniBtn{margin-right:0!important;white-space:nowrap}
.mediaViewSheet .shead .closeSheet{min-width:44px;min-height:44px;display:grid;place-items:center;color:var(--txt);padding:0}
.mediaViewSheet .sbody{display:flex;flex-direction:column;flex:1;min-height:0;overflow:hidden;padding:0}
.mediaViewBody{padding:0;display:flex;flex:1;min-height:0;background:#0f1117;overflow:auto;-webkit-overflow-scrolling:touch}
.mediaPreviewImg{display:block;max-width:100%;max-height:100%;margin:auto;object-fit:contain}
.mediaPreviewFrame{width:100%;height:auto;min-height:0;flex:1;border:0;background:#fff}
@supports (height:100svh){.mediaViewSheet{max-height:calc(100svh - env(safe-area-inset-top) - 8px)}}
@media(min-width:960px){.mediaViewSheet{top:auto;left:auto;right:24px;bottom:24px;width:min(96vw,900px);height:min(92dvh,860px);max-height:calc(100dvh - 48px);border-radius:22px;border-bottom:1px solid var(--line)}}


/* generated code result */
.msg.assistant .bubble.generatedCodeBubble{background:transparent;border:none;padding:0;max-width:100%}
.genCodeCard{width:100%;border:1px solid var(--line);border-radius:14px;background:#171b23;padding:12px;overflow:hidden}
.genCodeTop{display:flex;align-items:flex-start;justify-content:space-between;gap:10px;margin-bottom:8px}
.genCodeTitle{font-weight:700;font-size:14px;color:var(--txt)}
.genCodeWs{font-family:var(--mono);font-size:10.5px;color:var(--dim);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:52%}
.genCodeFiles{font-family:var(--mono);font-size:11px;color:var(--mut);line-height:1.5;overflow-wrap:anywhere;margin-bottom:10px}
.genCodeActions{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:10px}
.genCodeTabs{display:flex;gap:6px;overflow-x:auto;padding-bottom:6px;margin-bottom:0}
.genCodeTabs button{flex:0 0 auto;max-width:220px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:var(--mono);font-size:10.5px;color:var(--dim);border:1px solid var(--line);border-radius:8px;padding:5px 8px;background:var(--field)}
.genCodeTabs button.active{color:var(--txt);border-color:var(--line2);background:var(--panel2)}
.genCodePre{max-height:320px;overflow:auto;border:1px solid var(--line);border-radius:12px;background:#10131a;margin:0}
.genCodePre code{display:block;min-width:max-content;padding:12px;font-family:var(--mono);font-size:12px;line-height:1.55;white-space:pre;background:none;border:none}
@media(max-width:520px){.genCodeTop{display:block}.genCodeWs{max-width:100%;margin-top:4px}.genCodeCard{padding:10px}.genCodePre code{font-size:11.5px}}

.genCodePreview[hidden]{display:none}
.genCodePreview{margin-top:8px}
.genCodeWsInline{max-width:100%;margin:0 0 8px}


/* live task experience */
.taskLive{position:relative;z-index:2;flex:0 0 auto;margin:8px 10px;padding:10px 13px;border:1px solid rgba(255,255,255,.10);border-radius:12px;background:rgba(22,25,32,.97);box-shadow:0 8px 22px rgba(0,0,0,.18);overflow:hidden;transition:max-height .24s ease,border-color .24s ease,box-shadow .24s ease}
.taskLive[hidden]{display:none}
.taskCollapsed{min-height:42px;display:flex;align-items:center;justify-content:space-between;gap:16px}
.taskSummaryMain{min-width:0;display:flex;align-items:center;gap:10px}
.taskTitleRow{display:flex;align-items:center;gap:8px;min-width:0}
.taskIcon{display:inline-grid;place-items:center;width:18px;height:18px;font-size:13px;line-height:1;color:var(--acc)}
.taskTitle{font-size:14px;font-weight:700;color:var(--txt);letter-spacing:0;line-height:1.1}
.taskStep{font-size:13px;color:var(--mut);line-height:1.35;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:min(540px,calc(100vw - 170px))}
.taskElapsed{font-family:var(--mono);font-size:11px;color:var(--dim);white-space:nowrap}
.taskElapsed b{font-weight:600;color:var(--mut)}
.taskActions{display:flex;align-items:center;gap:8px;flex-shrink:0}
.taskDetailBtn{font-family:var(--mono);font-size:11px;color:var(--mut);border:1px solid var(--line);background:rgba(255,255,255,.04);border-radius:9px;padding:7px 10px;min-height:34px;white-space:nowrap}
.taskDetailBtn:active{color:var(--txt);border-color:var(--line2)}
.taskLive.queued .taskIcon{color:#e6c15a}.taskLive.running .taskIcon{color:var(--acc)}.taskLive.done .taskIcon{color:var(--ok)}.taskLive.failed .taskIcon,.taskLive.stopped .taskIcon{color:var(--danger)}

.taskLive.done.terminalCompact:not(.expanded){padding:8px 9px;border-radius:999px;box-shadow:0 10px 24px rgba(0,0,0,.24)}
.taskLive.done.terminalCompact:not(.expanded) .taskCollapsed{min-height:34px;gap:9px}
.taskLive.done.terminalCompact:not(.expanded) .taskSummaryMain{display:flex;align-items:center;gap:7px;min-width:0}
.taskLive.done.terminalCompact:not(.expanded) .taskTitleRow{gap:6px}
.taskLive.done.terminalCompact:not(.expanded) .taskTitle{font-size:12.5px;font-weight:700;white-space:nowrap}
.taskLive.done.terminalCompact:not(.expanded) .taskIcon{width:16px;height:16px;font-size:12px}
.taskLive.done.terminalCompact:not(.expanded) .taskStep,.taskLive.done.terminalCompact:not(.expanded) .taskElapsed{display:none}
.taskLive.done.terminalCompact:not(.expanded) .taskDetailBtn{min-height:28px;padding:4px 8px;border-radius:999px;font-size:10.5px}
.taskDetails{max-height:0;opacity:0;overflow:hidden;transition:max-height .24s ease,opacity .18s ease,padding-top .24s ease,margin-top .24s ease;border-top:1px solid transparent;margin-top:0;padding-top:0}
.taskLive.expanded .taskDetails{max-height:340px;opacity:1;margin-top:12px;padding-top:12px;border-top-color:var(--line)}
.taskMetaGrid{display:grid;gap:8px;font-family:var(--mono)}
.taskMetaDetails{grid-template-columns:1fr 1fr;gap:8px 18px}
.taskDetailRow{min-width:0;display:flex;align-items:center;gap:8px;padding:0;line-height:1.35}
.taskDetailRow span,.taskProgressLine span{font-size:10px;color:var(--dim);letter-spacing:.06em;text-transform:uppercase;white-space:nowrap}
.taskDetailRow b,.taskProgressLine b{margin-left:auto;font-size:11px;color:var(--txt);font-weight:500;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:right}
.taskCopyBtn{width:24px;height:24px;display:grid;place-items:center;border:1px solid var(--line);border-radius:7px;background:var(--field);color:var(--mut);font-size:13px;flex:0 0 auto}
.taskProgressLine{display:flex;align-items:center;gap:10px;margin-top:10px;font-family:var(--mono)}
.taskBar{height:5px;border-radius:99px;background:var(--field);overflow:hidden;border:1px solid var(--line);margin-top:6px}
.taskBar span{display:block;height:100%;width:0%;background:linear-gradient(90deg,var(--acc),#fff);transition:width .2s ease}
.taskLog{margin-top:12px;padding-top:9px;border-top:1px solid var(--line);display:grid;gap:5px;max-height:92px;overflow:auto}
.taskLog:before{content:"Recent Logs";font-family:var(--mono);font-size:10px;color:var(--dim);letter-spacing:.06em;text-transform:uppercase;margin-bottom:2px}
.taskLogRow{display:flex;gap:8px;align-items:flex-start;font-size:11.5px;line-height:1.35;color:var(--mut)}
.taskLogRow:before{content:"•";color:var(--dim)}
.taskLogTime{font-family:var(--mono);font-size:10px;color:var(--dim);flex:none;padding-top:1px}
.taskLogRow.tool-done{color:var(--ok)}
.taskLogRow.tool-failed{color:var(--danger)}
.taskLogRow.tool-running{color:var(--mut)}
.taskLogRow[class*="tool-"]:before{content:none}
.taskLogRow .toolIcon{font-family:var(--mono);flex:none;width:11px;text-align:center}
.taskLogRow .toolName{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}
.taskLogRow .toolMs{margin-left:auto;font-family:var(--mono);font-size:10px;color:var(--dim);flex:none}
.taskLogRow.tool-running .toolIcon{animation:tp 1s infinite}
@media(max-width:620px){.taskLive{padding:9px 10px;margin:6px 8px}.taskCollapsed{min-height:40px;gap:8px}.taskSummaryMain{gap:7px}.taskStep{max-width:28vw;font-size:12px}.taskElapsed{display:none}.taskActions{gap:6px}.taskDetailBtn{padding:7px 8px;font-size:10.5px}.taskMetaDetails{grid-template-columns:1fr}.taskDetailRow b{white-space:normal;overflow-wrap:anywhere}.taskLive.expanded .taskDetails{max-height:390px}.taskLive.done.terminalCompact:not(.expanded){max-width:none;padding:7px 8px}.taskLive.done.terminalCompact:not(.expanded) .taskCollapsed{min-height:30px}.taskLive.done.terminalCompact:not(.expanded) .taskTitle{font-size:12px}.taskLive.done.terminalCompact:not(.expanded) .taskDetailBtn{min-height:26px;padding:3px 7px;font-size:10px}}
@media(max-width:520px){#quickModelSelect{max-width:90px;padding-left:7px;padding-right:20px}#toolSelect{max-width:90px;padding-left:7px;padding-right:20px}#attBtn{max-width:76px;padding:0 7px}}
@media(max-width:620px){#composerControls{flex-wrap:wrap}#executionMode{order:5;max-width:none;flex:1 1 150px}#toolSelect{order:6;margin-left:0;flex:1 1 120px;max-width:none}#sendBtn{order:7}}

.officeDownloadCard{min-height:240px;display:flex;align-items:center;gap:14px;padding:18px;border:1px solid var(--line);border-radius:12px;background:rgba(255,255,255,.035)}
.officeIcon{width:52px;height:52px;display:grid;place-items:center;border-radius:12px;background:var(--field);border:1px solid var(--line);font-family:var(--mono);font-size:12px;font-weight:800;color:var(--acc);flex:0 0 auto}
.officeInfo{min-width:0;flex:1}.officeInfo b{display:block;color:var(--txt);font-size:14px;margin-bottom:6px;overflow-wrap:anywhere}.officeInfo p{margin:0;color:var(--mut);font-size:12.5px;line-height:1.45}
@media(max-width:520px){.officeDownloadCard{align-items:flex-start;flex-wrap:wrap}.officeDownloadCard .miniBtn{width:100%;justify-content:center}}

.wsExplorerTools{display:flex;align-items:center;gap:10px;position:sticky;top:0;z-index:2;background:var(--panel);padding:0 0 12px;margin:-2px 0 8px;border-bottom:1px solid var(--line)}
.wsBreadcrumbs{display:flex;align-items:center;gap:5px;min-width:0;flex:1;overflow-x:auto;scrollbar-width:none}
.wsBreadcrumbs::-webkit-scrollbar{display:none}
.wsCrumb{font-family:var(--mono);font-size:11px;color:var(--txt);border:1px solid var(--line);background:var(--field);border-radius:999px;padding:5px 9px;white-space:nowrap;cursor:pointer}
.wsCrumb:active{border-color:var(--line2)}
.wsCrumbSep{font-family:var(--mono);font-size:11px;color:var(--dim);flex-shrink:0}
.wsSearch{width:150px;min-width:120px;height:32px;border:1px solid var(--line);border-radius:999px;background:var(--field);color:var(--txt);padding:0 11px;font-family:var(--mono);font-size:11px;outline:none}
.wsSearch:focus{border-color:var(--line2)}
.wsExplorerMeta{font-family:var(--mono);font-size:10.5px;color:var(--dim);letter-spacing:.04em;padding:4px 4px 8px;border-bottom:1px solid var(--line)}
.wsItem.file .ic{color:var(--acc)}
.wsItem.dir .ic,.wsItem.wsUp .ic{color:var(--mut)}
.wsItem.wsUp{background:rgba(255,255,255,.015)}
@media(max-width:520px){.wsExplorerTools{align-items:stretch;flex-direction:column;gap:8px}.wsSearch{width:100%;min-width:0}.wsItem{gap:9px}.wsItem .ic{width:34px;height:34px;border-radius:9px}.wsItem .inf .n{font-size:12px}.wsItem .miniBtn{padding:4px 7px}}

.wideBtn.danger{color:#ffb4b4;border-color:rgba(255,120,120,.35);background:rgba(255,80,80,.06)}
.folder .fhead .fclear{font-family:var(--mono);font-size:9.5px;letter-spacing:.06em;text-transform:uppercase;color:var(--dim);border:1px solid var(--line);border-radius:999px;padding:3px 7px;background:var(--field)}
.folder .fhead .fclear:active{color:#ffb4b4;border-color:rgba(255,120,120,.45)}
.folder .fhead .fclear:disabled{opacity:.35;cursor:not-allowed}
