papilot 0.2.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/README.md +3 -1
  2. package/README.zh-CN.md +3 -1
  3. package/bin/doctor.mjs +11 -0
  4. package/dist/assets/index-BB0zC0wj.css +1 -0
  5. package/dist/assets/index-DTScOfwx.js +206 -0
  6. package/dist/assets/{math-Ebyrobf9.js → math-C3k2egGJ.js} +7 -7
  7. package/dist/assets/{pdf-view-BhJZr4qw.js → pdf-view-Df0q8hSk.js} +1 -1
  8. package/dist/index.html +2 -2
  9. package/package.json +5 -2
  10. package/src/commit.ts +23 -0
  11. package/src/conversation.ts +12 -1
  12. package/src/notes.ts +1 -1
  13. package/src/server/access.ts +170 -0
  14. package/src/server/accounts.ts +226 -0
  15. package/src/server/app.ts +298 -0
  16. package/src/server/frontend.ts +1 -1
  17. package/src/server/main.ts +21 -194
  18. package/src/server/manuscript.ts +95 -14
  19. package/src/server/paths.ts +4 -0
  20. package/src/server/review.ts +2 -1
  21. package/src/server/security.ts +20 -0
  22. package/src/server/store.ts +5 -0
  23. package/src/server/workspace.ts +192 -25
  24. package/src/shared.ts +23 -5
  25. package/vendor/latex-review/dist/web/assets/index-Bg-VqnPa.css +1 -0
  26. package/vendor/latex-review/dist/web/assets/{index-DqkrTw0t.js → index-xLeqYBJt.js} +3 -3
  27. package/vendor/latex-review/dist/web/index.html +2 -2
  28. package/vendor/latex-review/src/render/pdf.ts +35 -1
  29. package/vendor/latex-review/src/web/review.tsx +18 -8
  30. package/vendor/latex-review/src/web/style.css +24 -0
  31. package/vendor/latex-review/src/web/zh-CN.ts +2 -0
  32. package/dist/assets/index-CqhlgnOu.css +0 -1
  33. package/dist/assets/index-Czf1eCno.js +0 -185
  34. package/vendor/latex-review/dist/web/assets/index-Db7pq4Cj.css +0 -1
package/README.md CHANGED
@@ -58,7 +58,7 @@ Jump to any section from the contents, search every page and zoom in sharply. Se
58
58
  <td width="50%" valign="top">
59
59
  <img src="docs/assets/feature-git.png" alt="The Git panel with a diff and a commit message">
60
60
  <h3>🌿 Commit when you're happy</h3>
61
- Diff files, commit the ones you choose, then pull and push without leaving the page.
61
+ Diff files and commit the ones you choose, with a commit message an agent writes. Pull and push, or merge a coauthor's changes and let an agent resolve the conflicts.
62
62
  </td>
63
63
  </tr>
64
64
  </table>
@@ -103,6 +103,8 @@ npm uninstall -g papilot # remove it; your state stays in ~/.papilot until
103
103
 
104
104
  Papilot listens only on `127.0.0.1`. To use it from another device, publish it on your tailnet with Tailscale Serve and set `PAPILOT_PUBLIC_ORIGIN` and `PAPILOT_TAILSCALE_LOGIN`. Papilot then checks the host, the browser origin and the Tailscale identity of every request. The [guide](docs/guide.md#remote-access-with-tailscale) has the steps.
105
105
 
106
+ To invite an advisor or co-authors, give Papilot a public HTTPS address with `PAPILOT_ACCOUNT_ORIGIN` and open **People**: each person signs in with a passkey and sees only the papers you share. Invite only people you would trust with access to the computer Papilot runs on; see [Collaborators](docs/guide.md#collaborators).
107
+
106
108
  </details>
107
109
 
108
110
  <details>
package/README.zh-CN.md CHANGED
@@ -58,7 +58,7 @@
58
58
  <td width="50%" valign="top">
59
59
  <img src="docs/assets/feature-git.png" alt="带差异和提交信息的 Git 面板">
60
60
  <h3>🌿 满意了再提交</h3>
61
- 查看差异,只提交你勾选的文件,pull 和 push 都不用离开页面。
61
+ 查看差异,只提交你勾选的文件,提交信息可以让 agent 来写。可以 pull、push,也可以合并合作者的改动,冲突交给 agent 解决。
62
62
  </td>
63
63
  </tr>
64
64
  </table>
@@ -103,6 +103,8 @@ npm uninstall -g papilot # 卸载;状态仍保留在 ~/.papilot,可自
103
103
 
104
104
  Papilot 只监听 `127.0.0.1`。若要从其他设备访问,用 Tailscale Serve 把它发布到你的 tailnet,并设置 `PAPILOT_PUBLIC_ORIGIN` 和 `PAPILOT_TAILSCALE_LOGIN`;Papilot 会校验每个请求的主机、浏览器来源和 Tailscale 身份。具体步骤见[指南](docs/guide.md#remote-access-with-tailscale)。
105
105
 
106
+ 要邀请导师或合作者,用 `PAPILOT_ACCOUNT_ORIGIN` 给 Papilot 一个公开的 HTTPS 地址,然后打开 **成员**:每个人用通行密钥登录,只能看到你共享的论文。只邀请你愿意让其访问运行 Papilot 的这台电脑的人,详见[协作者](docs/guide.md#collaborators)。
107
+
106
108
  </details>
107
109
 
108
110
  <details>
package/bin/doctor.mjs CHANGED
@@ -191,6 +191,17 @@ export async function doctor(args) {
191
191
  try { const url = new URL(origin); remoteValid = ['http:', 'https:'].includes(url.protocol) && url.origin === origin && !url.username && !url.password; } catch { /* Invalid origin. */ }
192
192
  }
193
193
  check('remote', remoteValid, 'error', origin || owner ? 'Tailscale origin and owner configuration.' : 'Local access only; remote access is optional.', 'Set both PAPILOT_PUBLIC_ORIGIN (scheme and host, optional port, no path) and PAPILOT_TAILSCALE_LOGIN, or unset both for local access.');
194
+ // The collaborators' sign-in address: its own HTTPS origin and local port, apart from the tailnet endpoint.
195
+ const accountOrigin = (process.env.PAPILOT_ACCOUNT_ORIGIN || '').replace(/\/+$/, ''), accountPort = Number(process.env.PAPILOT_ACCOUNT_PORT || 7275);
196
+ let accountValid = !accountOrigin;
197
+ if (accountOrigin) {
198
+ try {
199
+ const url = new URL(accountOrigin);
200
+ accountValid = url.origin === accountOrigin && (url.protocol === 'https:' || (url.protocol === 'http:' && url.hostname === 'localhost'))
201
+ && Number.isInteger(accountPort) && accountPort > 0 && accountPort < 65536 && accountPort !== port && !(origin && URL.canParse(origin) && new URL(origin).host === url.host);
202
+ } catch { /* Invalid origin. */ }
203
+ }
204
+ check('accounts', accountValid, 'error', accountOrigin ? `Collaborators sign in at ${accountOrigin}, forwarded to 127.0.0.1:${accountPort}.` : 'No public sign-in for collaborators; it is optional.', 'Set PAPILOT_ACCOUNT_ORIGIN to an https:// origin without a path that differs from PAPILOT_PUBLIC_ORIGIN (for Funnel, port 10000), and PAPILOT_ACCOUNT_PORT to a free port other than the Papilot port. Papilot does not start otherwise.');
194
205
  try {
195
206
  const response = await fetch(`http://127.0.0.1:${port}/api/health`, { signal: AbortSignal.timeout(1500), redirect: 'error' });
196
207
  const health = await response.json();
@@ -0,0 +1 @@
1
+ :root{--bg:#fff;--sidebar:#f9f9f9;--bg-subtle:#fafafa;--bg-muted:#f4f4f4;--bg-hover:#efefef;--bg-active:#e7e7e7;--canvas:#f3f3f3;--line:#e8e8e8;--line-strong:#d6d6d6;--text:#171717;--text-2:#525252;--text-3:#8a8a8a;--accent:#2563eb;--accent-hover:#1d4ed8;--accent-soft:#eff6ff;--accent-line:#bfdbfe;--primary:#2563eb;--primary-hover:#1d4ed8;--green:#15803d;--green-soft:#f0fdf4;--purple:#7c3aed;--purple-soft:#f5f3ff;--red:#dc2626;--red-soft:#fef2f2;--red-line:#fecaca;--amber-soft:#fffbeb;--amber-line:#fde68a;--amber-text:#92400e;--shadow-xs:0 1px 2px #0000000f;--shadow-sm:0 1px 2px #0000000d,0 3px 8px #0000000d;--float:0 2px 4px #0000000a,0 14px 36px #00000021;--ring:0 0 0 3px #2563eb2e;--line-hover:#c4c4c4;--danger:#dc2626;--danger-hover:#b91c1c;--scroll-thumb:#0000001f;--scroll-hover:#0003;--scroll-active:#00000057;--pdf-filter:none;--pdf-page:#fff;--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}:root[data-theme=dark]{--bg:#26272b;--sidebar:#202124;--bg-subtle:#2a2b2f;--bg-muted:#303135;--bg-hover:#37383c;--bg-active:#404145;--canvas:#1e1f22;--line:#38393e;--line-strong:#4b4c52;--line-hover:#63646b;--text:#ececee;--text-2:#c2c3c9;--text-3:#9c9da5;--accent:#8ab4ff;--accent-hover:#b2ceff;--accent-soft:#2b3651;--accent-line:#445c85;--primary:#2563eb;--primary-hover:#1d4ed8;--green:#7bd5a0;--green-soft:#243a2f;--purple:#bfa1ff;--purple-soft:#372d48;--red:#ff9696;--red-soft:#46292e;--red-line:#733b45;--amber-soft:#3e3424;--amber-line:#6d5631;--amber-text:#eac584;--shadow-xs:0 1px 2px #0003;--shadow-sm:0 1px 2px #0000002e,0 3px 8px #0003;--float:0 2px 4px #0003,0 14px 36px #0006;--ring:0 0 0 3px #8ab4ff38;--scroll-thumb:#ffffff29;--scroll-hover:#ffffff40;--scroll-active:#ffffff61;--pdf-filter:invert(.84) hue-rotate(180deg);--pdf-page:#292929;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}@font-face{font-family:Paper Serif;src:url(/assets/TeXGyrePagellaX-Regular-DQJjZE_L.otf)format("opentype");font-weight:400;font-display:swap}@font-face{font-family:Paper Serif;src:url(/assets/TeXGyrePagellaX-Bold-CEtYdOXj.otf)format("opentype");font-weight:700;font-display:swap}@font-face{font-family:Paper Serif;src:url(/assets/TeXGyrePagellaX-Italic-CSuYIstn.otf)format("opentype");font-style:italic;font-display:swap}@font-face{font-family:Paper Mono;src:url(/assets/Inconsolatazi4-Regular-Dbtq7t_r.otf)format("opentype");font-weight:400;font-display:swap}:root{--serif:"Paper Serif","TeX Gyre Pagella",Palatino,"Palatino Linotype","Songti SC","Noto Serif CJK SC",Georgia,serif;--sans:-apple-system,BlinkMacSystemFont,"SF Pro Text","Segoe UI","PingFang SC","Hiragino Sans GB","Noto Sans SC",system-ui,sans-serif;--mono:"Paper Mono",ui-monospace,SFMono-Regular,Menlo,monospace;--r-sm:6px;--r:8px;--r-md:10px;--r-lg:14px;--r-xl:18px;--ease:cubic-bezier(.2,.8,.2,1);font:14px/1.5 var(--sans);color:var(--text);background:var(--bg);font-synthesis:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-kerning:normal}*{box-sizing:border-box}body{background:var(--bg);margin:0}button,input,select,textarea{font:inherit;color:inherit}button,a,input,textarea,select{-webkit-tap-highlight-color:transparent}button{cursor:pointer;background:0 0;border:0;padding:0}button:disabled{opacity:.45;cursor:default}a{color:inherit}:focus-visible{outline:2px solid var(--accent);outline-offset:2px}input:focus-visible,textarea:focus-visible,select:focus-visible{outline:none}::selection{background:#2563eb2e}svg{flex-shrink:0}h1,h2,h3,p{margin-top:0}code{font-family:var(--mono);font-variant-ligatures:none}.sr-only{clip:rect(0 0 0 0);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}.muted{color:var(--text-3);font-size:13px;line-height:1.6}.inline-error{color:var(--red);white-space:pre-wrap;overflow-wrap:anywhere;font-size:13px;line-height:1.6}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-corner{background:0 0}::-webkit-scrollbar-thumb{background-color:var(--scroll-thumb);background-clip:padding-box;border:3px solid #0000;border-radius:999px}:hover::-webkit-scrollbar-thumb{background-color:var(--scroll-hover)}::-webkit-scrollbar-thumb:hover{background-color:var(--scroll-active);border-width:2px}@supports not selector(::-webkit-scrollbar){*{scrollbar-width:thin;scrollbar-color:var(--scroll-hover) transparent}}.button{border-radius:var(--r);white-space:nowrap;border:1px solid #0000;justify-content:center;align-items:center;gap:7px;height:34px;padding:0 14px;font-size:14px;font-weight:500;text-decoration:none;transition:background-color .15s,border-color .15s,box-shadow .15s;display:inline-flex}.button.compact{border-radius:7px;height:30px;padding:0 11px;font-size:13px}.primary{background:var(--primary);color:#fff;box-shadow:var(--shadow-xs)}.primary:hover:not(:disabled){background:var(--primary-hover)}.secondary{background:var(--bg);border-color:var(--line-strong);color:var(--text);box-shadow:var(--shadow-xs)}.secondary:hover:not(:disabled){background:var(--bg-subtle);border-color:var(--line-hover)}.ghost{color:var(--text-2)}.ghost:hover{background:var(--bg-hover);color:var(--text)}.danger{background:var(--danger);color:#fff;box-shadow:var(--shadow-xs)}.danger:hover:not(:disabled){background:var(--danger-hover)}.icon-button{border-radius:var(--r);width:32px;height:32px;color:var(--text-2);flex-shrink:0;justify-content:center;align-items:center;text-decoration:none;transition:background-color .15s,color .15s;display:inline-flex}.icon-button:hover:not(:disabled),.icon-button[aria-expanded=true]{background:var(--bg-hover);color:var(--text)}.spinner{border:2px solid var(--line-strong);border-top-color:var(--text-2);border-radius:50%;flex-shrink:0;width:14px;height:14px;animation:.8s linear infinite spin;display:inline-block}.spinner.light{border-color:#fff #ffffff59 #ffffff59}.spinner.large{width:22px;height:22px}.app-shell{background:var(--bg);height:100dvh;display:flex;overflow:hidden}.main{background:var(--bg);flex-direction:column;flex:1;min-width:0;height:100dvh;min-height:0;display:flex;overflow:hidden}.sidebar{background:var(--sidebar);border-right:1px solid var(--line);flex-direction:column;flex-shrink:0;width:272px;height:100dvh;padding:0 10px 10px;display:flex}.sidebar-collapsed>.sidebar{display:none}.sidebar-header{flex-shrink:0;justify-content:space-between;align-items:center;height:58px;padding:0 2px 0 8px;display:flex}.brand{color:var(--text);font:400 20px/1 var(--serif);letter-spacing:-.005em;align-items:center;gap:10px;text-decoration:none;display:flex}.brand-mark{width:24px;height:24px;display:block}.sidebar-section{color:var(--text-3);align-items:center;gap:6px;margin:0 0 4px;padding:0 10px;font-size:12px;font-weight:500;display:flex}.count{font-variant-numeric:tabular-nums;color:var(--text-3);font-size:11.5px;font-weight:500}.sidebar-actions{flex-direction:column;gap:1px;margin-bottom:16px;display:flex}.sidebar-actions>.menu-anchor{display:flex}.project-switcher{border-radius:var(--r-md);width:100%;min-height:40px;font:400 17px/1.3 var(--serif);text-align:left;color:var(--text);align-items:center;gap:8px;margin-bottom:6px;padding:6px 10px;transition:background-color .15s;display:flex}.project-switcher:hover,.project-switcher[aria-expanded=true]{background:var(--bg-hover)}.project-switcher>svg{color:var(--text-3)}.project-switcher-name{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.nav-link,.add-project{border-radius:var(--r);width:100%;min-height:34px;color:var(--text);text-align:left;align-items:center;gap:10px;padding:0 10px;font-size:14px;transition:background-color .12s,box-shadow .12s;display:flex}.nav-link>svg,.add-project>svg{color:var(--text-3)}.nav-link:hover:not(:disabled),.add-project:hover:not(:disabled){background:var(--bg-hover)}.nav-link.active{background:var(--bg);box-shadow:var(--shadow-xs),0 0 0 1px var(--line);font-weight:500}.nav-link.active>svg{color:var(--accent)}.nav-label{flex-shrink:0}.nav-meta{text-align:right;min-width:0;color:var(--text-3);text-overflow:ellipsis;white-space:nowrap;flex:1;font-size:12px;font-weight:400;overflow:hidden}.add-project{border:1px dashed var(--line-strong);min-height:40px;margin-bottom:6px}.task-list{flex:1;margin:0 -4px;padding:2px 4px;overflow:auto}.task-row{border-radius:var(--r-md);align-items:center;gap:2px;min-width:0;margin-bottom:2px;transition:background-color .12s,box-shadow .12s;display:flex;position:relative}.task-row:hover{background:var(--bg-hover)}.task-row.active{background:var(--bg);box-shadow:var(--shadow-xs),0 0 0 1px var(--line)}.task-link{text-align:left;border-radius:var(--r-md);flex-direction:column;flex:1;gap:2px;min-width:0;padding:8px 4px 8px 10px;display:flex}.task-title{color:var(--text);text-overflow:ellipsis;white-space:nowrap;font-size:14px;line-height:1.35;overflow:hidden}.task-row.active .task-title{font-weight:500}.task-meta{align-items:center;gap:6px;min-width:0;font-size:12.5px;display:flex}.task-meta .status{text-overflow:ellipsis;min-width:0;overflow:hidden}.task-time{color:var(--text-3);font-variant-numeric:tabular-nums;flex-shrink:0;font-size:12px}.task-time:before{content:"·";margin-right:6px}.task-badge{background:var(--accent-soft);min-width:20px;height:20px;color:var(--accent);text-align:center;font-variant-numeric:tabular-nums;border-radius:999px;flex-shrink:0;padding:0 6px;font-size:11.5px;font-weight:600;line-height:20px}.task-row>.menu-anchor{margin-right:3px}.menu-anchor{flex-shrink:0;align-items:center;display:inline-flex}.task-row .more-button{opacity:0;width:28px;height:28px;transition:opacity .12s,background-color .12s}.task-row:hover .more-button,.task-row:focus-within .more-button,.task-row .more-button[aria-expanded=true]{opacity:1}@media (hover:none){.task-row .more-button{opacity:1}}.task-list-empty{color:var(--text-3);padding:8px 10px;font-size:13px;line-height:1.6}.task-rename{flex:1;min-width:0;padding:5px 4px 5px 6px}.task-rename input{border:1px solid var(--accent);border-radius:var(--r);background:var(--bg);width:100%;height:34px;box-shadow:var(--ring);outline:none;padding:0 9px;font-size:14px}.sidebar-preferences{border-top:1px solid var(--line);margin-top:8px;padding-top:8px}.settings-link{min-height:40px;color:var(--text-2)}.sidebar-footer{border-top:1px solid var(--line);margin-top:8px;padding:10px 10px 2px}.host-status{color:var(--text-2);align-items:center;gap:8px;font-size:13px;display:flex}.connection-dot{background:var(--text-3);border-radius:50%;width:7px;height:7px}.connection-dot.connected{background:#22c55e;box-shadow:0 0 0 3px #22c55e2e}.host-state{color:var(--text-3);margin-left:auto;font-size:12px}.host-caption{color:var(--text-3);margin-top:3px;padding-left:15px;font-size:12px}.sidebar-scrim{display:none}.status{color:var(--text-2);white-space:nowrap;align-items:center;gap:6px;font-size:12.5px;display:inline-flex}.status i{background:currentColor;border-radius:50%;flex-shrink:0;width:6px;height:6px;display:block}.status.running,.status.building,.status.queued{color:var(--accent)}.status.running i,.status.building i{animation:1.4s ease-in-out infinite pulse}.status.reviewing{color:var(--green)}.status.reviewing.done,.status.idle,.status.interrupted{color:var(--text-3)}.status.waiting_input{color:var(--purple)}.status.failed,.status.uncertain,.status.deleting{color:var(--red)}.topbar{border-bottom:1px solid var(--line);background:var(--bg);flex-shrink:0;align-items:center;gap:10px;height:56px;padding:0 14px;display:flex}.breadcrumb{flex:1;align-items:center;gap:10px;min-width:0;display:flex}.project-name{font:400 15px/1.3 var(--serif);color:var(--text-3);white-space:nowrap;text-overflow:ellipsis;flex-shrink:1;max-width:240px;overflow:hidden}.slash{color:var(--line-strong);font-size:14px}button.project-name{border-radius:var(--r);text-align:left;margin:0 -6px;padding:3px 6px;transition:background-color .15s,color .15s}button.project-name:hover{background:var(--bg-hover);color:var(--text-2)}.paper-rename{flex-shrink:1;min-width:0;display:flex}.paper-rename input{field-sizing:content;border:1px solid var(--accent);border-radius:var(--r);background:var(--bg);min-width:10ch;max-width:min(360px,40vw);height:30px;font:400 15px/1.3 var(--serif);color:var(--text);box-shadow:var(--ring);outline:none;margin:0 -7px;padding:0 6px}.task-identity{align-items:center;gap:12px;min-width:0;display:flex;overflow:hidden}.task-identity h1{font:400 19px/1.3 var(--serif);white-space:nowrap;text-overflow:ellipsis;letter-spacing:-.005em;min-width:0;margin:0;overflow:hidden}.task-identity>.status{background:var(--bg-muted);border-radius:999px;flex-shrink:0;padding:2px 9px 2px 8px;font-size:12px;font-weight:500}.task-identity>.status.running,.task-identity>.status.building,.task-identity>.status.queued{background:var(--accent-soft)}.task-identity>.status.reviewing:not(.done):not(.commit){background:var(--green-soft)}.task-identity>.status.reviewing.commit{background:var(--accent-soft)}.task-identity>.status.waiting_input{background:var(--purple-soft)}.task-identity>.status.failed,.task-identity>.status.uncertain,.task-identity>.status.deleting{background:var(--red-soft)}.task-state-actions{flex-shrink:0;align-items:center;gap:2px;display:flex}.view-selector{border-radius:var(--r-md);background:var(--bg-muted);flex-shrink:0;align-items:center;gap:2px;padding:3px;display:flex}.view-selector>button{height:28px;color:var(--text-2);border-radius:7px;align-items:center;gap:6px;padding:0 10px;font-size:13px;font-weight:500;transition:background-color .15s,color .15s,box-shadow .15s;display:flex;position:relative}.view-selector>button:hover{color:var(--text)}.view-selector>button[aria-pressed=true]{background:var(--bg);color:var(--text);box-shadow:0 1px 2px #0000001a,0 0 0 .5px #0000000f}.view-count{background:var(--primary);color:#fff;text-align:center;font-variant-numeric:tabular-nums;border-radius:999px;min-width:17px;height:17px;padding:0 5px;font-size:10.5px;font-weight:600;line-height:17px}.attention-dot{background:var(--purple);width:7px;height:7px;box-shadow:0 0 0 2px var(--bg-muted);border-radius:50%}.connection-banner,.runtime-banner,.review-build-error{border-bottom:1px solid var(--amber-line);background:var(--amber-soft);color:var(--amber-text);flex-shrink:0;align-items:center;gap:8px;padding:8px 14px;font-size:13px;display:flex}.runtime-banner{background:var(--bg-subtle);color:var(--text-2);border-bottom-color:var(--line)}.connection-banner>span,.runtime-banner>span,.review-build-error>span{overflow-wrap:anywhere;flex:1;min-width:0}.connection-banner>button,.runtime-banner>button{border-radius:var(--r-sm);white-space:nowrap;color:var(--accent);padding:4px 8px;font-size:13px;font-weight:500}.connection-banner>button:hover,.runtime-banner>button:hover{background:var(--bg-hover)}.toast{z-index:40;border:1px solid var(--red-line);border-radius:var(--r-lg);background:var(--bg);width:max-content;max-width:min(540px,100vw - 24px);box-shadow:var(--float);color:var(--red);animation:toast-in .2s var(--ease);align-items:flex-start;gap:10px;padding:10px 8px 10px 14px;font-size:13.5px;line-height:1.5;display:flex;position:fixed;top:68px;left:50%;transform:translate(-50%)}.toast>svg{margin-top:2px}.toast>span{overflow-wrap:anywhere;min-width:0;color:var(--text);flex:1}.toast>.icon-button{width:24px;height:24px;margin-top:-1px}.task-grid{--chat-width:clamp(340px,30vw,440px);grid-template-columns:minmax(0,1fr) clamp(300px,var(--chat-width),calc(100% - 360px));flex:1;min-height:0;display:grid;position:relative}.review-panel{background:var(--canvas);flex-direction:column;min-width:0;min-height:0;display:flex;position:relative;container-type:inline-size}.review-viewport{flex:1;min-width:0;min-height:0;display:flex;position:relative}.review-frame{background:var(--canvas);border:0;flex:1;width:100%;height:100%;min-height:0;display:block}.review-pending>.review-frame{visibility:hidden}.review-tools{z-index:2;align-items:center;gap:4px;height:44px;padding:0 8px;display:flex;position:absolute;top:0;right:0}.review-tools .full-pdf-link{border-radius:7px;height:28px;padding:0 9px;font-size:13px}.review-tools .icon-button{width:30px;height:30px}.review-tools .review-notes-toggle{gap:6px;height:28px;padding:0 7px;font-size:13px}.review-tools [aria-pressed=true]{background:var(--accent-soft);color:var(--accent)}@container (width<=620px){.review-tools .full-pdf-link span{display:none}.review-tools .full-pdf-link{width:30px;padding:0}}@container (width<=520px){.review-tools .review-notes-label{display:none}.review-tools .review-notes-toggle{justify-content:center;min-width:30px}.review-tools .review-open{display:none}}@container (width<=400px){.review-tools .review-rebuild{display:none}}.review-loading{text-align:center;color:var(--text-2);background:var(--canvas);flex-direction:column;justify-content:center;align-items:center;gap:4px;padding:24px;font-size:14px;line-height:1.6;display:flex;position:absolute;inset:0;overflow:auto}.review-loading p{max-width:340px}.review-placeholder{text-align:center;color:var(--text-2);flex-direction:column;flex:1;justify-content:center;align-items:center;padding:32px;display:flex;overflow:auto}.placeholder-icon{border-radius:var(--r-lg);background:var(--bg);border:1px solid var(--line);width:48px;height:48px;box-shadow:var(--shadow-xs);color:var(--text-3);justify-content:center;align-items:center;margin-bottom:16px;display:flex}.review-placeholder h2{font:400 21px/1.3 var(--serif);color:var(--text);margin:0 0 6px}.review-placeholder p{max-width:360px;color:var(--text-2);margin:0;font-size:14px;line-height:1.6}.review-placeholder>.button{margin-top:18px}.review-build-error{border-bottom-color:var(--red-line);background:var(--red-soft);color:var(--red)}.review-build-error>span{color:var(--text)}.review-feedback{border-top:1px solid var(--line);background:var(--bg);flex-shrink:0;justify-content:space-between;align-items:center;gap:12px;min-width:0;padding:8px 10px 8px 14px;display:flex}.review-feedback>span{min-width:0;color:var(--text-2);align-items:center;gap:8px;font-size:14px;display:flex}.review-feedback>span>svg{color:var(--accent);flex-shrink:0}.review-feedback .button{flex-shrink:0}.review-feedback.card{border:1px solid var(--line);border-radius:var(--r-lg);background:var(--bg-subtle);flex-wrap:wrap;margin:4px 0 14px}.panel-resizer{z-index:3;top:0;bottom:0;left:calc(100% - clamp(300px,var(--chat-width),calc(100% - 360px)) - 4px);cursor:col-resize;touch-action:none;outline:none;width:8px;position:absolute}.panel-resizer:after{content:"";background:0 0;width:2px;transition:background-color .15s .1s;position:absolute;top:0;bottom:0;left:3px}.panel-resizer:hover:after,.panel-resizer:focus-visible:after,body.resizing .panel-resizer:after{background:var(--accent)}body.resizing{cursor:col-resize;-webkit-user-select:none;user-select:none}body.resizing iframe{pointer-events:none}.activity-panel{background:var(--bg);border-left:1px solid var(--line);flex-direction:column;min-width:0;min-height:0;display:flex}.panel-heading{border-bottom:1px solid var(--line);flex-shrink:0;justify-content:space-between;align-items:center;gap:8px;height:44px;padding:0 14px;display:flex}.panel-title{font-size:13.5px;font-weight:600}.model-chip{color:var(--text-2);background:var(--bg-muted);border-radius:var(--r-sm);white-space:nowrap;text-overflow:ellipsis;max-width:60%;padding:2px 8px;font-size:12px;overflow:hidden}.conversation-history{flex-direction:column;flex:1;min-height:0;display:flex;position:relative}.messages{overscroll-behavior:contain;flex:1;min-height:0;padding:18px 18px 12px;overflow:auto}.thread{flex-direction:column;max-width:760px;margin:0 auto;display:flex}.message{min-width:0;margin:0 0 16px}.message.user{align-self:flex-end;max-width:88%}.message.user .message-body{background:var(--bg-muted);white-space:pre-wrap;overflow-wrap:anywhere;border-radius:18px 18px 6px;padding:9px 14px;font-size:15px;line-height:1.55}.message.assistant{align-self:stretch}.message-body{color:var(--text);overflow-wrap:anywhere;font-size:15px;line-height:1.6}.markdown>:first-child{margin-top:0}.markdown>:last-child{margin-bottom:0}.markdown p{margin:0 0 10px}.markdown h3,.markdown h4,.markdown h5,.markdown h6{margin:16px 0 6px;font-size:15px;font-weight:600}.markdown h3{font-size:16px}.markdown ul,.markdown ol{margin:0 0 10px;padding-left:22px}.markdown li{margin:3px 0}.markdown li::marker{color:var(--text-3)}.markdown code{background:var(--bg-muted);border-radius:4px;padding:1px 5px;font-size:.9em}.markdown pre{background:var(--bg-subtle);border:1px solid var(--line);border-radius:var(--r-md);margin:0 0 10px;padding:10px 12px;font-size:13px;line-height:1.5;overflow:auto}.markdown pre code{font-size:inherit;background:0 0;padding:0}.markdown blockquote{border-left:3px solid var(--line-strong);color:var(--text-2);margin:0 0 10px;padding-left:12px}.markdown hr{border:0;border-top:1px solid var(--line);margin:14px 0}.markdown a{color:var(--accent);text-underline-offset:.2em}.markdown .file-reference{background:var(--bg-muted);color:var(--accent);font:inherit;text-align:left;overflow-wrap:anywhere;cursor:pointer;border-radius:4px;padding:1px 5px;font-size:.9em;display:inline}.markdown .file-reference:hover{text-decoration:underline}.markdown .markdown-table{max-width:100%;margin:0 0 12px;overflow:auto}.markdown table{border-collapse:collapse;min-width:100%;font-size:14px}.markdown th,.markdown td{border:1px solid var(--line);text-align:left;min-width:90px;padding:6px 10px}.markdown th{background:var(--bg-muted);font-weight:600}.markdown ul ul,.markdown ul ol,.markdown ol ul,.markdown ol ol{margin-bottom:0}.markdown .task-list-item{list-style:none}.markdown .task-list-item input{accent-color:var(--accent);margin-right:6px}.markdown .katex{font-size:1.08em}.markdown .katex-display{margin:0 0 10px;padding:2px 0;overflow:auto hidden}.markdown .katex-error{font-family:var(--mono);font-size:.9em;color:inherit!important}.message-actions{opacity:0;align-items:center;gap:8px;min-height:26px;margin-top:4px;transition:opacity .15s;display:flex}.message.assistant:hover .message-actions,.message-actions:focus-within{opacity:1}.message-actions time{color:var(--text-3);font-variant-numeric:tabular-nums;font-size:12px}.message-action{border-radius:var(--r-sm);height:26px;color:var(--text-2);align-items:center;gap:5px;margin-left:-8px;padding:0 8px;font-size:13px;display:inline-flex}.message-action:hover{background:var(--bg-hover);color:var(--text)}@media (hover:none){.message-actions{opacity:1}}.tool-item{color:var(--text-2);align-self:stretch;max-width:100%;margin:0 0 4px}.tool-item summary{border-radius:var(--r);cursor:pointer;align-items:center;gap:8px;min-height:28px;margin:0 -8px;padding:3px 8px;font-size:13px;list-style:none;transition:background-color .12s;display:flex}.tool-item summary::-webkit-details-marker{display:none}.tool-item summary:hover{background:var(--bg-muted)}.tool-item summary>svg{color:var(--text-3)}.tool-label{white-space:nowrap;text-overflow:ellipsis;min-width:0;font-family:var(--mono);flex:1;font-size:12.5px;overflow:hidden}.tool-item .spinner{border-width:1.5px;width:12px;height:12px}.tool-status{color:var(--red);font-size:12px;font-weight:500}.tool-item pre{border:1px solid var(--line);border-radius:var(--r-md);background:var(--bg-subtle);white-space:pre-wrap;overflow-wrap:anywhere;max-height:240px;font:13px/1.55 var(--mono);color:var(--text-2);margin:4px 0 8px;padding:10px 12px;overflow:auto}.tool-item+.message,.tool-group+.message{margin-top:10px}.tool-group{color:var(--text-2);align-self:stretch;max-width:100%;margin:0 0 4px}.tool-group>summary{border-radius:var(--r);cursor:pointer;align-items:center;gap:8px;min-height:28px;margin:0 -8px;padding:3px 8px;font-size:13px;list-style:none;transition:background-color .12s;display:flex}.tool-group>summary::-webkit-details-marker{display:none}.tool-group>summary:hover{background:var(--bg-muted)}.tool-group>summary>svg{color:var(--text-3);flex-shrink:0}.tool-group>summary>svg:last-child{transition:transform .15s}.tool-group[open]>summary>svg:last-child{transform:rotate(180deg)}.tool-group-label{white-space:nowrap;text-overflow:ellipsis;flex:1;min-width:0;overflow:hidden}.tool-group .spinner{border-width:1.5px;width:12px;height:12px}.tool-group-items{border-left:1px solid var(--line);margin:4px 0 8px 6px;padding-left:12px}.notes-message .message-body{white-space:normal;padding:10px 14px 12px}.sent-notes-head{color:var(--text-2);align-items:center;gap:6px;margin-bottom:6px;font-size:12.5px;font-weight:500;display:flex}.sent-notes-head>svg{color:var(--text-3)}.sent-notes{margin:0;padding:0;list-style:none}.sent-notes li+li{border-top:1px solid var(--line-strong);margin-top:10px;padding-top:10px}.sent-note-where{font:12px/1.4 var(--mono);color:var(--text-3);margin-bottom:4px;display:block}.sent-notes blockquote{border-left:3px solid var(--line-strong);color:var(--text-2);white-space:pre-wrap;margin:0 0 4px;padding-left:10px;font-size:13px;font-style:italic;line-height:1.5}.sent-note-region{color:var(--text-3);margin-bottom:4px;font-size:13px;font-style:italic;display:block}.sent-notes p{white-space:pre-wrap;margin:0}.feedback-counts{flex-wrap:wrap;gap:6px;margin-bottom:6px;display:flex}.feedback-counts span{background:var(--bg);color:var(--text-2);border-radius:999px;padding:1px 8px;font-size:12.5px;font-weight:500}.feedback-counts .accepted{color:var(--green)}.feedback-counts .rejected,.feedback-counts .failed{color:var(--red)}.feedback-counts .commented{color:var(--accent)}.feedback-counts+.sent-notes{margin-top:8px}.build-message .sent-notes-head>svg{color:var(--red)}.build-error{white-space:pre-wrap;overflow-wrap:anywhere;margin:0;font-size:13px;line-height:1.55}.feedback-attachment{white-space:normal;margin-top:8px}.feedback-attachment>summary{color:var(--text-2);cursor:pointer;align-items:center;gap:5px;font-size:12.5px;list-style:none;display:inline-flex}.feedback-attachment>summary::-webkit-details-marker{display:none}.feedback-attachment[open]>summary{margin-bottom:6px}.message-body>.skill-chip{vertical-align:1px}.skill-chip{background:var(--accent-soft);height:24px;color:var(--accent);white-space:nowrap;border-radius:999px;align-items:center;gap:5px;padding:0 4px 0 8px;font-size:13px;font-weight:500;display:inline-flex}.skill-chip:not(:has(button)){padding-right:9px}.skill-chip button{width:18px;height:18px;color:inherit;opacity:.7;border-radius:50%;place-items:center;display:inline-grid}.skill-chip button:hover{opacity:1;background:#2563eb1f}.composer{position:relative}.composer-skill{align-items:center;gap:8px;min-width:0;padding:10px 14px 0;display:flex}.composer.large .composer-skill{padding:14px 18px 0}.composer-skill-description{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--text-3);font-size:12.5px;overflow:hidden}.skill-menu{z-index:30;border:1px solid var(--line-strong);border-radius:var(--r-lg);background:var(--bg);max-height:min(320px,50dvh);box-shadow:var(--float);padding:5px;position:absolute;bottom:calc(100% + 6px);left:0;right:0;overflow-y:auto}.composer.large .skill-menu{top:calc(100% + 6px);bottom:auto}.skill-option{border-radius:var(--r);cursor:pointer;grid-template-columns:auto 1fr auto;align-items:baseline;gap:10px;padding:7px 10px;display:grid}.skill-option.active{background:var(--bg-hover)}.skill-name{color:var(--text);white-space:nowrap;align-items:center;gap:7px;font-size:14px;font-weight:500;display:inline-flex}.skill-name>svg{color:var(--accent);align-self:center}.skill-description{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--text-3);font-size:13px;overflow:hidden}.skill-source{color:var(--text-3);white-space:nowrap;font-size:11.5px}.skill-empty{color:var(--text-3);margin:0;padding:8px 10px;font-size:13px}.skill-suggestions{flex-wrap:wrap;justify-content:center;gap:8px;margin-top:14px;display:flex}.skill-suggestions button{border:1px solid var(--line);background:var(--bg);height:32px;color:var(--text-2);border-radius:999px;align-items:center;gap:6px;padding:0 13px;font-size:13.5px;transition:border-color .15s,background-color .15s,color .15s;display:inline-flex}.skill-suggestions button>svg{color:var(--text-3)}.skill-suggestions button:hover:not(:disabled){border-color:var(--line-strong);background:var(--bg-subtle);color:var(--text)}.skill-suggestions button[aria-pressed=true]{border-color:var(--accent-line);background:var(--accent-soft);color:var(--accent)}.skill-suggestions button[aria-pressed=true]>svg{color:var(--accent)}.skill-suggestions button:disabled{opacity:.6}.working{color:var(--text-2);align-items:center;gap:10px;margin:4px 0 12px;font-size:14px;display:flex}.working-dots{gap:3px;display:inline-flex}.working-dots i{background:var(--text-3);border-radius:50%;width:5px;height:5px;animation:1.2s ease-in-out infinite bounce}.working-dots i:nth-child(2){animation-delay:.15s}.working-dots i:nth-child(3){animation-delay:.3s}.task-error{background:var(--red-soft);border:1px solid var(--red-line);border-radius:var(--r-md);color:var(--red);gap:10px;margin:8px 0 14px;padding:12px 14px;font-size:14px;display:flex}.task-error>svg{margin-top:3px}.task-error>div{min-width:0}.task-error strong{font-weight:600}.task-error p{white-space:pre-wrap;overflow-wrap:anywhere;max-height:240px;color:var(--text);line-height:1.55;font:13px/1.55 var(--mono);margin:4px 0 0;overflow:auto}.conversation-error{border-radius:var(--r-md);background:var(--amber-soft);border:1px solid var(--amber-line);color:var(--amber-text);justify-content:space-between;align-items:center;gap:12px;margin-bottom:14px;padding:10px 12px;font-size:14px;line-height:1.5;display:flex}.conversation-error p{overflow-wrap:anywhere;margin:0}.jump-latest{white-space:nowrap;border:1px solid var(--line);background:var(--bg);height:32px;color:var(--text);box-shadow:var(--float);border-radius:999px;align-items:center;gap:6px;padding:0 14px;font-size:13px;font-weight:500;display:flex;position:absolute;bottom:12px;left:50%;transform:translate(-50%)}.jump-latest:hover{background:var(--bg-subtle)}.review-ready{border:1px solid var(--line);border-radius:var(--r-lg);background:var(--bg-subtle);color:var(--text-2);align-items:center;gap:10px;margin:4px 0 14px;padding:10px 10px 10px 14px;font-size:14px;display:flex}.review-ready>svg{color:var(--green)}.review-ready>span{flex:1;min-width:0}.request-card{border:1px solid var(--amber-line);border-radius:var(--r-lg);background:var(--amber-soft);box-shadow:var(--shadow-xs);margin-bottom:16px;padding:14px 16px}.request-card h3{color:var(--text);align-items:center;gap:8px;margin:0 0 10px;font-size:14px;font-weight:600;display:flex}.request-card h3>svg{color:var(--purple)}.request-card p{color:var(--text-2);font-size:14px;line-height:1.6}.request-card pre{white-space:pre-wrap;overflow-wrap:anywhere;font:13px/1.55 var(--mono);background:var(--bg);border:1px solid var(--line);border-radius:var(--r);max-height:180px;padding:8px 10px;overflow:auto}.button-row{justify-content:flex-end;gap:8px;display:flex}.question{border:0;min-width:0;margin:12px 0;padding:0;font-size:14px;line-height:1.6;display:block}.question legend{padding:0;font-weight:500}.question input{background:var(--bg);border:1px solid var(--line-strong);border-radius:var(--r);width:100%;margin-top:8px;padding:7px 10px;font-size:14px}.question input:focus{border-color:var(--accent);box-shadow:var(--ring)}.answer-options{flex-direction:column;gap:6px;margin-top:8px;display:flex}.answer-options button{text-align:left;border:1px solid var(--line);border-radius:var(--r-md);background:var(--bg);padding:9px 12px;font-size:14px;transition:border-color .12s,background-color .12s}.answer-options button:hover:not(:disabled){border-color:var(--line-strong)}.answer-options button.selected{border-color:var(--accent);background:var(--accent-soft);box-shadow:0 0 0 1px var(--accent)}.answer-options small{color:var(--text-2);margin-top:2px;font-size:13px;display:block}.composer-wrap{background:var(--bg);padding:8px 14px 14px}.composer{border:1px solid var(--line-strong);border-radius:var(--r-xl);background:var(--bg);max-width:760px;box-shadow:var(--shadow-sm);cursor:text;margin:0 auto;transition:border-color .15s,box-shadow .15s}.composer:focus-within{border-color:var(--line-hover);box-shadow:0 1px 2px #0000000d,0 6px 20px #00000014}.composer textarea{resize:none;width:100%;min-height:48px;max-height:200px;color:var(--text);background:0 0;border:0;outline:none;padding:12px 16px 4px;font-size:15px;line-height:1.5;display:block;overflow-y:auto}.composer textarea::placeholder{color:var(--text-3)}.composer textarea[readonly]{color:var(--text-2)}.composer-footer{cursor:default;justify-content:space-between;align-items:center;gap:8px;padding:4px 8px 8px 16px;display:flex}.composer-hint{color:var(--text-3);text-overflow:ellipsis;white-space:nowrap;min-width:0;font-size:12.5px;overflow:hidden}.composer-actions{flex-shrink:0;gap:6px;margin-left:auto;display:flex}.send-button{background:var(--primary);color:#fff;border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;width:32px;height:32px;transition:background-color .15s,transform .1s;display:flex}.send-button:hover:not(:disabled){background:var(--primary-hover)}.send-button:active:not(:disabled){transform:scale(.94)}.send-button:disabled{opacity:1;background:var(--bg-active);color:var(--text-3)}.send-button.stop{background:var(--bg);color:var(--text);border:1px solid var(--line-strong)}.send-button.stop:hover:not(:disabled){background:var(--bg-hover)}.composer.large{border-radius:22px}.composer.large textarea{min-height:92px;max-height:min(320px,40dvh);padding:16px 20px 6px;font-size:16px}.composer.large .composer-footer{padding:6px 10px 10px 14px}.composer.large .send-button{width:36px;height:36px}.composer-options{flex-wrap:wrap;gap:6px;min-width:0;display:flex}.chip-select{border:1px solid var(--line);min-width:0;max-width:240px;height:30px;color:var(--text);background:var(--bg) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%238a8a8a' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E") no-repeat right 9px center;cursor:pointer;border-radius:999px;align-items:center;gap:6px;padding:0 26px 0 11px;font-size:13px;font-weight:500;transition:border-color .15s,background-color .15s;display:inline-flex;position:relative}.chip-select:hover{border-color:var(--line-strong);background-color:var(--bg-subtle)}.chip-select:focus-within{border-color:var(--accent);box-shadow:var(--ring)}.chip-select>svg{color:var(--text-3)}.chip-value{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.chip-select select{opacity:0;appearance:none;cursor:pointer;border:0;width:100%;height:100%;margin:0;padding:0;font-size:16px;position:absolute;inset:0}.chip-select:has(select:disabled){opacity:.6;cursor:default}.effort-chip .effort-level{color:var(--text-2);flex:none}.effort-chip:disabled{opacity:.6;cursor:default}.effort-panel{border:1px solid var(--line);background:var(--bg);width:min(280px,100vw - 16px);color:var(--text);box-shadow:var(--float);animation:menu-in .14s var(--ease);border-radius:16px;margin:0;padding:12px 14px 14px;position:fixed;inset:auto}.effort-head{justify-content:space-between;align-items:center;gap:8px;min-height:24px;display:flex}.effort-default{background:var(--bg-muted);color:var(--text-2);border-radius:999px;padding:1px 7px;font-size:11px}.effort-name{letter-spacing:-.01em;font-size:15px;font-weight:600}.effort-track{background:var(--bg-active);border-radius:999px;height:30px;margin-top:12px;transition:box-shadow .15s;position:relative}.effort-fill{background:var(--accent);pointer-events:none;border-radius:999px;position:absolute;top:0;bottom:0;left:0}.effort-track.unset .effort-fill{display:none}.effort-track:has(input:focus-visible){box-shadow:0 0 0 3px #2563eb38}.effort-stop{background:var(--scroll-hover);pointer-events:none;border-radius:50%;width:4px;height:4px;margin:-2px 0 0 -2px;position:absolute;top:50%}.effort-stop.on{background:#fff9}.effort-track input{appearance:none;cursor:pointer;background:0 0;outline:none;width:calc(100% - 4px);height:100%;margin:0;position:absolute;inset:0 2px}.effort-track input::-webkit-slider-runnable-track{background:0 0;height:30px}.effort-track input::-webkit-slider-thumb{-webkit-appearance:none;width:26px;height:26px;transition:transform .12s var(--ease);background:#fff;border-radius:50%;margin-top:2px;box-shadow:0 1px 2px #0000002e,0 2px 6px #0000001f}.effort-track input:active::-webkit-slider-thumb{transform:scale(.94)}.effort-track input::-moz-range-track{background:0 0;height:30px}.effort-track input::-moz-range-thumb{background:#fff;border:0;border-radius:50%;width:26px;height:26px;box-shadow:0 1px 2px #0000002e,0 2px 6px #0000001f}.usage{color:var(--text-3);flex-wrap:wrap;justify-content:center;align-items:center;gap:8px 18px;margin-top:14px;font-size:12.5px;display:flex}.usage-account{color:var(--text-2);align-items:center;gap:6px;font-weight:500;display:inline-flex}.usage-plan{background:var(--bg-muted);color:var(--text-2);border-radius:999px;padding:1px 7px;font-size:11px;font-weight:500}.usage-limit{white-space:nowrap;align-items:center;gap:8px;display:inline-flex}.usage-name{color:var(--text-2)}.usage-bar{background:var(--bg-active);border-radius:999px;width:88px;height:5px;position:relative;overflow:hidden}.usage-bar>span{border-radius:inherit;background:var(--accent);position:absolute;inset:0 auto 0 0}.usage-limit.warning .usage-bar>span{background:#f59e0b}.usage-limit.critical .usage-bar>span{background:var(--red)}.usage-limit.critical .usage-value{color:var(--red)}.usage-value{font-variant-numeric:tabular-nums;color:var(--text-2)}.usage-credits{font-variant-numeric:tabular-nums}@media (width<=680px){.usage{gap:6px 14px;font-size:12px}.usage-credits{order:1}.usage-limit{order:2}.usage-bar{width:64px}}.chip-select.zoom-chip{border-color:var(--line-strong);height:28px;color:var(--text-2);box-shadow:var(--shadow-xs);background-position:right 7px center;border-radius:7px;padding:0 24px 0 10px;font-size:13px}.home{background:radial-gradient(120% 70% at 50% 0%,var(--bg) 40%,var(--bg-subtle) 100%);flex:1;min-height:0;padding:24px;display:flex;overflow:auto}.home-inner{text-align:center;flex-direction:column;align-items:center;width:100%;max-width:720px;margin:auto;padding-bottom:8vh;display:flex}.home-logo{width:52px;height:52px;margin-bottom:16px}.home-mark{justify-content:center;align-items:center;width:44px;height:44px;margin-bottom:16px;display:flex}.home h1{font:400 34px/1.2 var(--serif);letter-spacing:-.01em;text-wrap:balance;margin:0 0 26px}.home-copy{color:var(--text-2);max-width:480px;margin:-12px 0 22px;font-size:15px;line-height:1.65}.home .composer{text-align:left;width:100%}.home-error{text-align:left;align-self:stretch;margin:12px 0 0;padding:0 4px}.manuscript{flex:1;grid-template-columns:minmax(0,1fr) 340px;min-height:0;display:grid}.manuscript-pages{background:var(--canvas);flex-direction:column;min-width:0;min-height:0;display:flex;position:relative;overflow:hidden}.manuscript-note{z-index:1;background:color-mix(in srgb,var(--bg) 90%,transparent);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);border-bottom:1px solid var(--line);color:var(--text-2);margin:0;padding:8px 16px;font-size:13px;position:sticky;top:0}.manuscript-note.error{color:var(--red);background:var(--red-soft);border-bottom-color:var(--red-line)}.manuscript-note pre{white-space:pre-wrap;max-height:200px;color:var(--text);font:13px/1.5 var(--mono);margin:6px 0 0;overflow:auto}.manuscript-side{border-left:1px solid var(--line);background:var(--bg);flex-direction:column;min-width:0;min-height:0;display:flex}.side-tabs{border-bottom:1px solid var(--line);flex-shrink:0;gap:4px;padding:8px 12px;display:flex}.side-tabs>button{border-radius:var(--r);height:30px;color:var(--text-2);align-items:center;gap:6px;padding:0 10px;font-size:13px;font-weight:500;transition:background-color .15s,color .15s;display:flex}.side-tabs>button:hover{background:var(--bg-hover);color:var(--text)}.side-tabs>button[aria-selected=true]{background:var(--bg-muted);color:var(--text)}.contents-panel{flex:1;min-height:0;padding:8px;overflow:auto}.contents-panel>p{margin:8px 12px;font-size:13px;line-height:1.5}.contents-panel ol{margin:0;padding:0;list-style:none}.contents-panel button{border-radius:var(--r);text-align:left;width:100%;color:var(--text-2);align-items:baseline;gap:12px;padding:9px 12px;font-size:13px;line-height:1.5;display:flex}.contents-panel button>span:first-child{overflow-wrap:anywhere;flex:1;min-width:0}.contents-panel button:hover{background:var(--bg-hover);color:var(--text)}.contents-panel button[aria-current]{background:var(--accent-soft);color:var(--accent)}.contents-page{color:var(--text-3);font-variant-numeric:tabular-nums;flex-shrink:0}.git-panel{flex:1;min-height:0;padding:4px 0 24px;overflow:auto}.notes-panel{flex-direction:column;flex:1;min-height:0;display:flex}.note-list{flex:1;min-height:0;margin:0;padding:8px;list-style:none;overflow:auto}.note-list li{border:1px solid var(--line);border-radius:var(--r-lg);background:var(--bg);margin-bottom:6px;padding:10px 10px 12px 12px;transition:border-color .15s,box-shadow .15s}.note-list li:hover{border-color:var(--line-strong)}.note-list li.active{border-color:var(--accent-line);box-shadow:0 0 0 3px var(--accent-soft)}.note-list li.stale{background:var(--bg-subtle)}.note-head{align-items:center;gap:8px;margin-bottom:6px;display:flex}.note-number{background:var(--primary);color:#fff;text-align:center;border-radius:999px;min-width:20px;height:20px;padding:0 6px;font-size:11.5px;font-weight:600;line-height:20px}.note-where{min-width:0;font:12px/1.4 var(--mono);color:var(--text-3);text-overflow:ellipsis;white-space:nowrap;flex:1;overflow:hidden}.note-head .icon-button{border-radius:var(--r-sm);width:26px;height:26px}.note-list blockquote{border-left:3px solid var(--line-strong);color:var(--text-2);-webkit-line-clamp:3;-webkit-box-orient:vertical;margin:0 0 6px;padding-left:10px;font-size:13px;font-style:italic;line-height:1.5;display:-webkit-box;overflow:hidden}.note-source{background:var(--bg-subtle);border:1px solid var(--line);border-radius:var(--r);max-height:7.5em;font:12px/1.5 var(--mono);color:var(--text-2);white-space:pre-wrap;overflow-wrap:anywhere;margin:0 0 8px;padding:7px 9px;overflow:auto}.note-list p{white-space:pre-wrap;overflow-wrap:anywhere;margin:0;font-size:14px;line-height:1.5}.notes-empty{flex:1;margin:0;padding:16px 20px}.notes-send{border-top:1px solid var(--line);background:var(--bg);flex-direction:column;gap:8px;padding:12px 14px 14px;display:flex}.notes-send .button{width:100%;height:38px}.pdf-view{flex-direction:column;flex:1;min-height:0;display:flex}.pdf-toolbar{border-bottom:1px solid var(--line);background:var(--bg);flex-shrink:0;align-items:center;gap:6px;height:46px;padding:0 8px;display:flex}.pdf-section{min-width:0;height:32px;color:var(--text);text-align:left;flex:1;align-items:center;padding:0 10px;display:flex}.pdf-section-title{text-overflow:ellipsis;white-space:nowrap;min-width:0;font:400 15px/1.3 var(--serif);overflow:hidden}.pdf-pager,.pdf-zoom{flex-shrink:0;align-items:center;gap:2px;display:flex}.pdf-pager{color:var(--text-2);font-size:13px}.pdf-pager input{text-align:center;border:1px solid var(--line-strong);font-variant-numeric:tabular-nums;border-radius:7px;outline:none;width:44px;height:28px;padding:0 4px;font-size:13px}.pdf-pager input:focus{border-color:var(--accent);box-shadow:var(--ring)}.pdf-pages{min-width:34px;color:var(--text-3);font-variant-numeric:tabular-nums;padding-left:4px}.pdf-zoom{border-left:1px solid var(--line);border-right:1px solid var(--line);padding:0 4px}.pdf-toolbar .icon-button{width:30px;height:30px}.pdf-toolbar .icon-button.active,.pdf-find .icon-button.active{background:var(--accent-soft);color:var(--accent)}.pdf-find{border-bottom:1px solid var(--line);background:var(--bg-subtle);flex-shrink:0;align-items:center;gap:6px;height:44px;padding:0 8px 0 14px;display:flex}.pdf-find>svg{color:var(--text-3)}.pdf-find input{border:1px solid var(--line-strong);border-radius:var(--r);background:var(--bg);outline:none;flex:1;min-width:0;height:30px;padding:0 10px;font-size:13.5px}.pdf-find input:focus{border-color:var(--accent);box-shadow:var(--ring)}.pdf-find-count{text-align:right;min-width:72px;color:var(--text-3);white-space:nowrap;font-variant-numeric:tabular-nums;font-size:12.5px}.pdf-hint{color:var(--accent);background:var(--accent-soft);border-bottom:1px solid var(--accent-line);flex-shrink:0;padding:7px 14px;font-size:13px}.pdf-scroll-host{flex:1;min-height:0;position:relative}.pdf-container{background:var(--canvas);touch-action:pan-x pan-y;outline:none;position:absolute;inset:0;overflow:auto}.pdf-container .pdfViewer{padding:20px 0 56px}.pdf-container .pdfViewer.removePageBorders .page{background-color:var(--pdf-page);border-radius:2px;margin:0 auto 20px;box-shadow:0 1px 2px #0000000f,0 8px 24px #00000014}.pdf-container .pdfViewer .canvasWrapper{filter:var(--pdf-filter)}.marking .pdf-container .textLayer{pointer-events:none}.note-layer{z-index:10;pointer-events:none;position:absolute;inset:0}.note-mark{mix-blend-mode:multiply;background:#2563eb2e;border-radius:2px;position:absolute}.note-mark.active{background:#2563eb52}.note-mark.draft{background:#2563eb3d}.note-box{border:1.5px solid var(--accent);background:#2563eb12;border-radius:3px;position:absolute}.note-box.active{background:#2563eb26;box-shadow:0 0 0 4px #2563eb2e}.note-box.draft{border-style:dashed}.note-tag{z-index:1;background:var(--primary);color:#fff;text-align:center;min-width:20px;height:20px;box-shadow:var(--shadow-xs);pointer-events:auto;cursor:pointer;border-radius:999px;padding:0 6px;font-size:11.5px;font-weight:600;line-height:20px;position:absolute;transform:translateY(-50%)}.note-tag.active{box-shadow:0 0 0 3px #2563eb40}.add-note{z-index:2;background:var(--primary);color:#fff;white-space:nowrap;height:32px;box-shadow:var(--float);pointer-events:auto;animation:menu-in .14s var(--ease);border-radius:999px;align-items:center;gap:6px;padding:0 13px;font-size:13px;font-weight:500;display:inline-flex;position:absolute;transform:translate(-100%,8px)}.add-note:hover{background:var(--primary-hover)}.region-capture{pointer-events:auto;cursor:crosshair;touch-action:none;position:absolute;inset:0}.menu-hint{color:var(--text-3);font-variant-numeric:tabular-nums;flex-shrink:0;margin-left:12px;font-size:12px}.note-editor{pointer-events:auto;z-index:3;background:var(--bg);border:1px solid var(--line);border-radius:var(--r-lg);width:min(340px,100%);box-shadow:var(--float);cursor:default;animation:menu-in .14s var(--ease);padding:10px;position:absolute}.note-editor textarea{background:var(--bg);resize:none;border:1px solid var(--line-strong);border-radius:var(--r);outline:none;width:100%;padding:8px 10px;font-size:14px;line-height:1.5;display:block}.note-editor textarea:focus{border-color:var(--accent);box-shadow:var(--ring)}.note-editor .inline-error{margin:6px 0 0}.note-editor .button-row{margin-top:8px}.panel-label{color:var(--text-3);align-items:center;gap:8px;margin:0 0 10px;font-size:12px;font-weight:600;display:flex}.git-branch{align-items:center;gap:8px;padding:14px 20px 2px;font-size:14px;display:flex}.git-branch>svg,.git-commit>svg{color:var(--text-3);flex-shrink:0}.git-branch code{color:var(--text);text-overflow:ellipsis;white-space:nowrap;min-width:0;font-size:14px;overflow:hidden}.git-sync{background:var(--bg-muted);color:var(--text-2);white-space:nowrap;border-radius:999px;gap:8px;padding:2px 8px;font-size:12px;font-weight:500;display:flex}.git-upstream{color:var(--text-3);margin:0;padding:0 20px 0 44px;font-size:12.5px}.git-upstream code{font-size:12.5px}.git-commit{border:1px solid var(--line);border-radius:var(--r-lg);background:var(--bg-subtle);gap:8px;margin:12px 12px 4px;padding:10px 12px;display:flex}.git-commit>div{min-width:0}.git-commit p{overflow-wrap:anywhere;margin:0;font-size:14px;line-height:1.4}.git-commit small{color:var(--text-3);margin-top:2px;font-size:12px;display:block}.git-commit code{font-size:12px}.git-section{color:var(--text-3);align-items:center;gap:8px;margin:0;padding:16px 20px 6px;font-size:12px;font-weight:600;display:flex}.git-total{font:12px/1 var(--mono);margin-left:auto}.git-remote{align-items:center;gap:4px;margin-left:auto;display:flex}.git-remote .button.compact{height:28px;padding:0 10px}.git-remote .icon-button{width:28px;height:28px}.git-panel input[type=checkbox]{width:15px;height:15px;accent-color:var(--accent);cursor:pointer;flex:none;margin:0}.git-message{margin:10px 20px 0;font-size:13px}.git-notice{color:var(--green);align-items:center;gap:6px;display:flex}.git-commit-form{flex-direction:column;gap:8px;padding:2px 20px 10px;display:flex}.git-commit-form textarea{resize:vertical;border:1px solid var(--line-strong);border-radius:var(--r);background:var(--bg);width:100%;min-height:58px;font:inherit;color:var(--text);outline:none;padding:8px 10px;font-size:13.5px;line-height:1.45;display:block}.git-commit-form textarea:focus{border-color:var(--accent);box-shadow:var(--ring)}.git-commit-form .button{width:100%}.git-message-box{position:relative}.git-commit-form .git-message-box textarea{padding-right:40px}.git-generate{width:28px;height:28px;color:var(--accent);position:absolute;top:5px;right:5px}.git-ignore{border:1px solid var(--amber-line);border-radius:var(--r);background:var(--amber-soft);color:var(--amber-text);justify-content:space-between;align-items:center;gap:8px;margin:0 20px 8px;padding:5px 5px 5px 10px;font-size:13px;display:flex}.git-ignore .button{color:var(--amber-text);flex-shrink:0}.git-merge{border:1px solid var(--red-line);border-radius:var(--r);background:var(--red-soft);margin:0 20px 12px;padding:10px 12px;font-size:13.5px}.git-merge.resolved{border-color:var(--accent-line);background:var(--accent-soft)}.git-merge>p{flex-direction:column;gap:2px;margin:0 0 10px;display:flex}.git-merge>p span{color:var(--text-2);overflow-wrap:anywhere;font-size:12.5px}.git-merge .button-row{flex-wrap:wrap;justify-content:flex-start}.git-merge .button-row .button{gap:6px}.git-merge-summary{border-radius:var(--r);background:var(--bg);max-height:240px;margin:0 0 10px;padding:8px 10px;font-size:13px;overflow:auto}.git-code.s-conflict{color:var(--red);background:var(--red-soft)}.commit-dialog .commit-files{flex-direction:column;gap:3px;margin:-12px 0 16px;padding:0;font-size:13px;list-style:none;display:flex}.commit-dialog .commit-files code{font:12.5px var(--mono);color:var(--text-2);overflow-wrap:anywhere}.commit-dialog textarea{resize:vertical;height:auto;min-height:84px;padding:8px 42px 8px 11px;font-family:inherit;line-height:1.45}.commit-dialog .git-generate{top:11px}.commit-dialog .inline-error{margin-top:10px}.git-files{margin:0;padding:0 8px;list-style:none}.git-files li{border-radius:var(--r)}.git-row{border-radius:var(--r);align-items:center;gap:10px;min-height:34px;padding:4px 12px;display:flex}.git-row:hover,.git-files li.open .git-row{background:var(--bg-hover)}.git-file{min-width:0;font:inherit;text-align:left;color:inherit;cursor:pointer;background:0 0;border:0;flex:1;align-items:baseline;gap:8px;padding:0;display:flex;overflow:hidden}.git-diff-wrap{border:1px solid var(--line);border-radius:var(--r);background:var(--bg);max-height:420px;margin:4px 4px 10px 37px;overflow:auto}.git-diff{font:12px/1.55 var(--mono);white-space:pre-wrap;overflow-wrap:anywhere;color:var(--text-2);margin:0;padding:6px 0}.git-diff span{text-indent:-12px;padding:0 12px 0 24px;display:block}.git-diff .add{background:var(--green-soft);color:var(--green)}.git-diff .del{background:var(--red-soft);color:var(--red)}.git-diff .hunk{background:var(--bg-subtle);color:var(--text-3);margin:4px 0}.git-diff .note{color:var(--text-3)}.git-diff-wrap .inline-error{margin:8px 10px}.git-diff-note{color:var(--text-3);margin:0;padding:8px 12px;font-size:12.5px}.git-name{max-width:100%;color:var(--text);text-overflow:ellipsis;white-space:nowrap;flex-shrink:0;font-size:13.5px;overflow:hidden}.git-dir{min-width:0;color:var(--text-3);text-overflow:ellipsis;white-space:nowrap;font-size:12.5px;overflow:hidden}.git-lines,.git-total{white-space:nowrap}.git-lines{font:12px/1 var(--mono);flex-shrink:0}.git-lines ins,.git-total ins{color:var(--green);text-decoration:none}.git-lines del,.git-total del{color:var(--red);text-decoration:none}.git-code{width:18px;height:18px;font:700 11px/18px var(--mono);text-align:center;color:var(--text-3);background:var(--bg-muted);border-radius:5px;flex-shrink:0}.git-code.s-m{color:var(--accent);background:var(--accent-soft)}.git-code.s-a{color:var(--green);background:var(--green-soft)}.git-code.s-d{color:var(--red);background:var(--red-soft)}.git-code.s-r{color:var(--purple);background:var(--purple-soft)}.git-clean{color:var(--text-3);align-items:center;gap:8px;margin:0;padding:8px 20px;font-size:13.5px;display:flex}.git-clean>svg{color:var(--green)}.action-menu{border:1px solid var(--line);border-radius:var(--r-lg);background:var(--bg);min-width:210px;max-width:min(380px,100vw - 16px);color:var(--text);box-shadow:var(--float);margin:0;padding:5px;font-size:14px;position:fixed;inset:auto}.action-menu:popover-open{animation:menu-in .14s var(--ease);flex-direction:column;gap:1px;display:flex}.action-menu>button,.action-menu>a{border-radius:var(--r);text-align:left;min-height:34px;color:inherit;align-items:center;gap:10px;padding:5px 10px;text-decoration:none;display:flex}.action-menu>button:hover:not(:disabled),.action-menu>a:hover,.action-menu>button:focus-visible,.action-menu>a:focus-visible{background:var(--bg-hover);outline:none}.action-menu>button>svg,.action-menu>a>svg{color:var(--text-3)}.action-menu>.danger-text{color:var(--red)}.action-menu>.danger-text>svg{color:currentColor}.menu-check{width:16px;color:var(--accent);display:inline-flex}.menu-label{flex-direction:column;flex:1;min-width:0;display:flex;overflow:hidden}.menu-label,.menu-detail{white-space:nowrap;text-overflow:ellipsis}.menu-detail{font:12px/1.4 var(--mono);color:var(--text-3);overflow:hidden}.paper-menu [role=menuitemradio] .menu-label{font:400 15.5px/1.35 var(--serif)}.menu-separator{background:var(--line);height:1px;margin:4px 6px}.modal-backdrop{z-index:30;width:100%;max-width:none;height:100%;max-height:none;color:inherit;background:0 0;border:0;justify-content:center;align-items:center;margin:0;padding:24px;display:flex;position:fixed;inset:0}.modal-backdrop:not([open]){display:none}.modal-backdrop::backdrop{-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);background:#0000004d}.modal{background:var(--bg);border:1px solid var(--line);border-radius:var(--r-xl);width:480px;max-width:100%;max-height:92dvh;box-shadow:var(--float);animation:dialog-in .18s var(--ease);padding:26px 26px 22px;position:relative;overflow:auto}.modal-close{position:absolute;top:12px;right:12px}.modal h2{font:400 23px/1.3 var(--serif);letter-spacing:-.005em;margin:0 36px 6px 0}.modal-description{color:var(--text-2);margin-bottom:20px;font-size:14px;line-height:1.6}.modal form>label{color:var(--text);margin-bottom:16px;font-size:13.5px;font-weight:500;display:block}.modal input,.modal textarea,.modal select{border:1px solid var(--line-strong);border-radius:var(--r);background:var(--bg);width:100%;height:38px;color:var(--text);box-shadow:var(--shadow-xs);margin-top:6px;padding:0 11px;font-size:14px;font-weight:400;transition:border-color .15s,box-shadow .15s;display:block}.modal input:focus,.modal textarea:focus,.modal select:focus{border-color:var(--accent);box-shadow:var(--ring)}.modal input::placeholder{color:var(--text-3)}.modal .button-row{margin-top:22px}.delete-dialog>p{overflow-wrap:anywhere;color:var(--text-2);font-size:14px;line-height:1.65}.delete-dialog .delete-task-name{color:var(--text);border-radius:var(--r-md);background:var(--bg-muted);padding:10px 12px;font-weight:500}.delete-dialog .button-row{margin-top:22px}.settings-dialog .modal-description{margin-bottom:8px}.settings-row{border-top:1px solid var(--line);justify-content:space-between;align-items:center;gap:16px;padding:14px 0;display:flex}.settings-row:first-of-type{border-top:0}.settings-name{color:var(--text);font-size:14px;font-weight:500}.modal .chip-select select{width:100%;height:100%;box-shadow:none;border:0;margin:0;padding:0;display:block}.segmented{border-radius:var(--r-md);background:var(--bg-muted);gap:2px;padding:3px;display:inline-flex}.segmented label{height:30px;color:var(--text-2);cursor:pointer;border-radius:7px;align-items:center;gap:6px;padding:0 11px;font-size:13px;transition:background-color .12s,color .12s;display:inline-flex;position:relative}.segmented label:hover{color:var(--text)}.segmented label.checked{background:var(--bg);color:var(--text);box-shadow:var(--shadow-xs);font-weight:500}.segmented label:has(input:focus-visible){outline:2px solid var(--accent);outline-offset:1px}.settings-dialog .segmented input{opacity:0;cursor:pointer;width:100%;height:100%;margin:0;position:absolute;inset:0}.settings-notifications{align-items:flex-start}.settings-text p{color:var(--text-3);margin-top:4px;font-size:13px;line-height:1.55}.people-dialog{width:560px}.people-warning{border:1px solid var(--red-line);border-radius:var(--r);background:var(--red-soft);color:var(--red);align-items:flex-start;gap:8px;margin:-8px 0 18px;padding:10px 12px;font-size:13px;line-height:1.55;display:flex}.people-warning svg{flex:none;margin-top:2px}.people-setup{color:var(--text-2);border:1px dashed var(--line-strong);border-radius:var(--r);margin-bottom:16px;padding:12px;font-size:13.5px;line-height:1.6}.people-invite{border-bottom:1px solid var(--line);margin-bottom:6px;padding-bottom:18px}.people-invite .button-row{margin-top:12px}.people-papers{border:0;flex-wrap:wrap;gap:6px 14px;min-width:0;margin:0;padding:0;display:flex}.people-papers legend{float:left;width:100%;color:var(--text-2);margin-bottom:6px;padding:0;font-size:13px;font-weight:500}.people-papers .checkbox{color:var(--text);cursor:pointer;align-items:center;gap:7px;font-size:13.5px;display:inline-flex}.modal .people-papers input[type=checkbox]{width:15px;height:15px;box-shadow:none;accent-color:var(--accent);margin:0;display:inline-block}.people-list{flex-direction:column;margin:0;padding:0;list-style:none;display:flex}.person{border-top:1px solid var(--line);flex-direction:column;gap:10px;padding:14px 0;display:flex}.person:first-child{border-top:0}.person-head{justify-content:space-between;align-items:baseline;gap:12px;font-size:14px;display:flex}.person-head .muted{text-align:right;font-size:12.5px}.person-actions{flex-wrap:wrap;gap:6px;display:flex}.invite-link{grid-template-columns:1fr auto;align-items:center;gap:6px 8px;display:grid}.modal .invite-link input{height:32px;font:12.5px var(--mono);margin:0}.invite-link small{grid-column:1/-1;font-size:12.5px;line-height:1.5}.device-list{flex-direction:column;gap:4px;margin:0;padding:0;font-size:13px;list-style:none;display:flex}.device-list li{color:var(--text-2);grid-template-columns:auto 1fr auto auto;align-items:center;gap:8px;display:grid}.device-list .muted{font-size:12px}.sign-in{min-height:100dvh}.sign-in .button svg{margin-right:2px}.sign-in-help{margin-top:22px;font-size:13.5px}.message-author{color:var(--text-3);align-self:flex-end;margin:0 6px 3px;font-size:12px;font-weight:500}.message.user:has(>.message-author){flex-direction:column;align-items:flex-end;display:flex}@media (width<=640px){.device-list li{grid-template-columns:auto 1fr auto}.device-list .muted{display:none}}.settings-dialog input.switch{appearance:none;background:var(--line-strong);width:38px;height:22px;box-shadow:none;cursor:pointer;border:0;border-radius:999px;flex:none;margin:0;padding:0;transition:background-color .15s;position:relative}.settings-dialog input.switch:before{content:"";width:18px;height:18px;transition:transform .15s var(--ease);background:#fff;border-radius:50%;position:absolute;top:2px;left:2px;box-shadow:0 1px 2px #0003}.settings-dialog input.switch:checked{background:var(--primary)}.settings-dialog input.switch:checked:before{transform:translate(16px)}.settings-dialog input.switch:focus-visible{box-shadow:var(--ring)}.settings-dialog input.switch:disabled{opacity:.45;cursor:not-allowed}.settings-test{color:var(--text-2);flex-wrap:wrap;align-items:center;gap:8px 12px;padding-bottom:4px;font-size:13px;display:flex}.settings-test .button{align-items:center;gap:6px;display:inline-flex}@media (width<=480px){.settings-row:not(.settings-notifications){flex-direction:column;align-items:stretch;gap:8px}.segmented{display:flex}.segmented label{flex:1;justify-content:center}.settings-dialog select{width:100%}}@media (width>=681px){.task-grid.layout-review,.task-grid.layout-conversation{grid-template-columns:minmax(0,1fr)}.layout-review>.activity-panel,.layout-conversation>.review-panel{display:none}.layout-conversation>.activity-panel{border-left:0}.layout-conversation .messages{padding-top:28px}}@media (width<=1150px){.project-name{max-width:160px}.task-grid{--chat-width:330px}.manuscript{grid-template-columns:minmax(0,1fr) 300px}}@media (width<=1020px){.view-selector>button>span{display:none}.view-selector>button{padding:0 9px}}@media (width<=900px){.sidebar,.sidebar-collapsed>.sidebar{z-index:25;width:min(310px,86vw);box-shadow:var(--float);visibility:hidden;transition:transform .22s var(--ease),visibility 0s linear .22s;display:flex;position:fixed;inset:0 auto 0 0;transform:translate(-102%)}.sidebar.is-open,.sidebar-collapsed>.sidebar.is-open{visibility:visible;transition:transform .22s var(--ease);transform:none}.sidebar-scrim{z-index:24;background:#0000004d;border:0;animation:.2s fade-in;display:block;position:fixed;inset:0}.manuscript{grid-template-columns:minmax(0,1fr)}.manuscript-side{border-left:0;border-top:1px solid var(--line)}.manuscript{grid-template-rows:minmax(0,1fr) auto}.manuscript-side{max-height:45dvh}}@media (width<=680px){.git-commit-form textarea{font-size:16px}.git-generate{width:36px;height:36px;top:4px;right:4px}.git-commit-form .git-message-box textarea{padding-right:46px}.git-row{min-height:44px}.app-shell{inset:auto 0;top:var(--viewport-top,0px);height:var(--viewport-height,100dvh);position:fixed}.main{height:100%;padding-left:env(safe-area-inset-left);padding-right:env(safe-area-inset-right)}.sidebar,.sidebar-collapsed>.sidebar{height:var(--viewport-height,100dvh);padding-bottom:max(10px,env(safe-area-inset-bottom))}.topbar{gap:6px;height:54px;padding:0 6px 0 4px}.topbar .icon-button{width:44px;height:44px}.breadcrumb{gap:6px}.paper-rename input{height:36px;font-size:16px}.task-identity{flex-direction:column;align-items:flex-start;gap:0}.task-identity h1{max-width:100%;font-size:17px}.task-identity>.status{text-overflow:ellipsis;max-width:100%;padding:0;font-size:12px;overflow:hidden;background:0 0!important}.task-state-actions .button{height:36px;padding:0 10px}.view-selector>button{gap:5px;height:36px;padding:0 10px}.view-selector>button>span{display:inline}.task-grid{flex:1;min-height:0;display:flex}.task-grid>.review-panel,.task-grid>.activity-panel{width:100%}.show-conversation>.review-panel,.show-review>.activity-panel{display:none}.activity-panel{border-left:0}.activity-panel>.panel-heading{display:none}.messages{padding:14px 14px 10px}.message-body,.message.user .message-body{font-size:16px}.composer-wrap{padding:6px 10px max(10px,env(safe-area-inset-bottom));flex-shrink:0}.composer textarea{min-height:46px;max-height:min(140px,28dvh);font-size:16px}.composer .send-button{width:36px;height:36px}.chip-select{flex-shrink:1;min-width:0;height:36px}.composer-options{flex-wrap:nowrap;min-width:0}.composer-options>.chip-select:nth-child(2){flex-shrink:3}.home{padding:18px 14px}.home h1{margin-bottom:18px;font-size:26px}.home:has(.compose){padding:0}.home-inner.compose{max-width:none;padding:16px 10px max(10px,env(safe-area-inset-bottom));flex:1;margin:0}.compose .home-logo{width:44px;height:44px;margin-top:auto}.compose h1{margin-bottom:auto}.compose .home-error{order:3;margin:0 0 8px}.compose .composer{order:4;margin-top:16px}.composer.large{border-radius:var(--r-xl)}.composer.large textarea{min-height:52px;max-height:min(200px,30dvh);padding:12px 16px 4px;font-size:16px}.composer.large .composer-footer{padding:4px 8px 8px 12px}.action-menu{border-radius:var(--r-xl);width:auto;max-width:none;padding:6px;top:auto!important;left:8px!important;right:8px!important;bottom:calc(8px + env(safe-area-inset-bottom))!important;min-width:0!important}.action-menu:popover-open{animation:sheet-in .22s var(--ease)}.action-menu::backdrop{background:#0000004d}.action-menu:before{content:attr(aria-label);color:var(--text-3);text-overflow:ellipsis;white-space:nowrap;padding:8px 12px 6px;font-size:13px;font-weight:500;overflow:hidden}.action-menu>button,.action-menu>a{border-radius:var(--r-md);gap:12px;min-height:50px;padding:4px 12px;font-size:16px}.review-tools{height:48px;padding-right:4px}.chip-select.zoom-chip{height:36px}.review-tools .icon-button,.review-tools .full-pdf-link{width:44px;height:44px}.review-tools .review-notes-toggle{min-width:44px;height:44px}.review-panel{padding-bottom:env(safe-area-inset-bottom)}.review-feedback{padding:6px 8px 6px 14px}.review-feedback .button{height:40px}.skill-description{display:none}.review-placeholder{padding:24px 20px}.review-ready .button{height:40px}.manuscript{flex-direction:column;display:flex}.manuscript-side{max-height:none;padding-bottom:env(safe-area-inset-bottom);border-top:0;flex:1}.side-tabs,.manuscript.show-pdf .manuscript-side,.manuscript.show-contents .manuscript-pages,.manuscript.show-notes .manuscript-pages,.manuscript.show-git .manuscript-pages{display:none}.contents-panel button{min-height:44px;font-size:15px}.note-editor textarea{font-size:16px}.note-editor .button{min-height:40px}.notes-send .button{min-height:44px}.manuscript-pages{flex-direction:column;flex:1;display:flex}.pdf-toolbar{gap:2px;padding:0 4px}.pdf-zoom{display:none}.pdf-toolbar .icon-button{width:40px;height:40px}.pdf-pager input{width:38px;height:34px;font-size:16px}.pdf-find input{font-size:16px}.pdf-container .pdfViewer{padding:10px 0 40px}.pdf-container .pdfViewer.removePageBorders .page{margin-bottom:10px}.add-note{height:40px;font-size:14px}.sidebar-header{height:58px}.sidebar .icon-button{width:44px;height:44px}.project-switcher{min-height:44px}.nav-link,.add-project{min-height:44px;font-size:15px}.task-link{min-height:56px;padding:10px 4px 10px 10px}.task-title{font-size:15px}.task-row .more-button{width:44px;height:44px}.task-rename input{height:44px;font-size:16px}.message-action{height:36px}.tool-item summary{min-height:40px}.request-card button,.question input,.connection-banner>button,.runtime-banner>button,.jump-latest,.delete-dialog .button,.modal .button{min-height:44px}.question input,.modal input{font-size:16px}.modal-backdrop{top:var(--viewport-top,0px);height:var(--viewport-height,100dvh);align-items:flex-end;padding:12px;bottom:auto}.modal{max-height:100%;padding:22px 18px}.modal-close{width:44px;height:44px;top:6px;right:6px}.toast{top:60px}}@media (width<=400px){.view-selector>button>span{display:none}.view-selector>button{padding:0 11px}.task-state-actions .button-label{display:none}}@keyframes pulse{50%{opacity:.35}}@keyframes spin{to{transform:rotate(360deg)}}@keyframes bounce{0%,80%,to{opacity:.5;transform:translateY(0)}40%{opacity:1;transform:translateY(-3px)}}@keyframes menu-in{0%{opacity:0;transform:translateY(-4px)scale(.98)}}@keyframes dialog-in{0%{opacity:0;transform:translateY(8px)scale(.98)}}@keyframes toast-in{0%{opacity:0;transform:translate(-50%,-6px)}}@keyframes fade-in{0%{opacity:0}}@keyframes sheet-in{0%{opacity:0;transform:translateY(16px)}}@media (hover:none){.task-row:active,.nav-link:active,.add-project:active,.project-switcher:active,.action-menu>button:active,.action-menu>a:active,.answer-options button:active,.icon-button:active,.view-selector>button:active,.tool-item summary:active{background:var(--bg-hover)}.button:active:not(:disabled){transform:scale(.98)}}@media (prefers-reduced-motion:reduce){*{scroll-behavior:auto!important;transition:none!important;animation:none!important}}