cortico 0.1.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 (311) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +47 -0
  3. package/package.json +43 -0
  4. package/src/boot.ts +46 -0
  5. package/src/bot.ts +1342 -0
  6. package/src/config-file.ts +41 -0
  7. package/src/core/README.md +92 -0
  8. package/src/core/billing.ts +26 -0
  9. package/src/core/blobs.ts +106 -0
  10. package/src/core/bus.ts +311 -0
  11. package/src/core/config-schema.ts +201 -0
  12. package/src/core/config.ts +262 -0
  13. package/src/core/core.ts +699 -0
  14. package/src/core/cost.ts +244 -0
  15. package/src/core/event-store.ts +304 -0
  16. package/src/core/fork.ts +113 -0
  17. package/src/core/generation.ts +118 -0
  18. package/src/core/instance-lock.ts +215 -0
  19. package/src/core/ipc-logger.ts +105 -0
  20. package/src/core/language.ts +62 -0
  21. package/src/core/log-context.ts +38 -0
  22. package/src/core/loop.ts +1858 -0
  23. package/src/core/markers.ts +48 -0
  24. package/src/core/prefix.ts +121 -0
  25. package/src/core/run.ts +95 -0
  26. package/src/core/secrets.ts +18 -0
  27. package/src/core/session.ts +56 -0
  28. package/src/core/sessions.ts +261 -0
  29. package/src/core/state.ts +104 -0
  30. package/src/core/template.ts +72 -0
  31. package/src/core/timers.ts +129 -0
  32. package/src/core/tool-log.ts +135 -0
  33. package/src/core/transcript.ts +92 -0
  34. package/src/core/truncate.ts +121 -0
  35. package/src/core/types.ts +1140 -0
  36. package/src/core/usage-log.ts +79 -0
  37. package/src/core/util.ts +386 -0
  38. package/src/deploy-listing.ts +160 -0
  39. package/src/deploy.ts +162 -0
  40. package/src/extensions/README.md +72 -0
  41. package/src/extensions/dry-mount.ts +390 -0
  42. package/src/extensions/manifest.ts +153 -0
  43. package/src/extensions/runtime.ts +42 -0
  44. package/src/extensions.ts +519 -0
  45. package/src/launcher.ts +285 -0
  46. package/src/paths.ts +155 -0
  47. package/src/protocol/open-responses/LICENSE +201 -0
  48. package/src/protocol/open-responses/README.md +14 -0
  49. package/src/protocol/open-responses/context-helpers.ts +27 -0
  50. package/src/protocol/open-responses/context-log.ts +59 -0
  51. package/src/protocol/open-responses/context.ts +89 -0
  52. package/src/protocol/open-responses/generated.ts +115 -0
  53. package/src/protocol/open-responses/index.ts +33 -0
  54. package/src/protocol/open-responses/openapi.json +4230 -0
  55. package/src/protocol/open-responses/stream.ts +146 -0
  56. package/src/protocol/open-responses/tokens.ts +31 -0
  57. package/src/providers/README.md +86 -0
  58. package/src/providers/base.ts +111 -0
  59. package/src/providers/configuration.ts +97 -0
  60. package/src/providers/console/config.ts +21 -0
  61. package/src/providers/console/settings.ts +443 -0
  62. package/src/providers/console/strings.ts +74 -0
  63. package/src/providers/console/types.ts +11 -0
  64. package/src/providers/llamacpp/archive.ts +148 -0
  65. package/src/providers/llamacpp/catalog.ts +247 -0
  66. package/src/providers/llamacpp/config.ts +36 -0
  67. package/src/providers/llamacpp/console/client.ts +6 -0
  68. package/src/providers/llamacpp/console/models-panel.ts +120 -0
  69. package/src/providers/llamacpp/console/runtime-panel.ts +173 -0
  70. package/src/providers/llamacpp/console/server.ts +153 -0
  71. package/src/providers/llamacpp/index.ts +95 -0
  72. package/src/providers/llamacpp/native.ts +51 -0
  73. package/src/providers/llamacpp/options.ts +117 -0
  74. package/src/providers/llamacpp/runtime-store.ts +139 -0
  75. package/src/providers/llamacpp/runtime.ts +214 -0
  76. package/src/providers/llamacpp/server.ts +286 -0
  77. package/src/providers/llamacpp/strings.ts +230 -0
  78. package/src/providers/openai-responses-compat/config.ts +20 -0
  79. package/src/providers/openai-responses-compat/index.ts +89 -0
  80. package/src/providers/openai-responses-compat/native.ts +127 -0
  81. package/src/providers/openai-responses-compat/strings.ts +19 -0
  82. package/src/providers/pricebook.ts +75 -0
  83. package/src/providers/registry.ts +137 -0
  84. package/src/providers/strings.ts +71 -0
  85. package/src/providers/transport/chat.ts +156 -0
  86. package/src/providers/transport/errors.ts +48 -0
  87. package/src/providers/transport/history.ts +68 -0
  88. package/src/providers/transport/native-input.ts +83 -0
  89. package/src/providers/transport/native-types.ts +13 -0
  90. package/src/providers/transport/response-assembly.ts +191 -0
  91. package/src/providers/transport/response-http.ts +196 -0
  92. package/src/providers/transport/response-meters.ts +27 -0
  93. package/src/providers/transport/responses-input.ts +56 -0
  94. package/src/web/README.md +84 -0
  95. package/src/web/client/console-pages/builtins/llm-settings/panel.ts +625 -0
  96. package/src/web/client/console-pages/builtins/llm-settings/pricing-panel.ts +168 -0
  97. package/src/web/client/console-pages/builtins/llm-settings/strings.ts +213 -0
  98. package/src/web/client/console-pages/builtins.ts +10 -0
  99. package/src/web/client/console-pages/context.ts +135 -0
  100. package/src/web/client/console-pages/host.ts +633 -0
  101. package/src/web/client/console-pages/loader.ts +132 -0
  102. package/src/web/client/console-pages/strings.ts +90 -0
  103. package/src/web/client/console-pages/tools/strings.ts +49 -0
  104. package/src/web/client/console-pages/tools/view.ts +215 -0
  105. package/src/web/client/core/api.ts +200 -0
  106. package/src/web/client/core/language.ts +56 -0
  107. package/src/web/client/core/lifecycle.ts +132 -0
  108. package/src/web/client/core/router.ts +199 -0
  109. package/src/web/client/core/stream.ts +157 -0
  110. package/src/web/client/core/websocket.ts +82 -0
  111. package/src/web/client/features/appearance/index.ts +333 -0
  112. package/src/web/client/features/appearance/strings.ts +87 -0
  113. package/src/web/client/features/config/index.ts +11 -0
  114. package/src/web/client/features/config/strings.ts +41 -0
  115. package/src/web/client/features/config/view.ts +428 -0
  116. package/src/web/client/features/core/events.ts +197 -0
  117. package/src/web/client/features/core/index.ts +254 -0
  118. package/src/web/client/features/core/run.ts +56 -0
  119. package/src/web/client/features/core/runlog.ts +214 -0
  120. package/src/web/client/features/core/sessions.ts +53 -0
  121. package/src/web/client/features/core/strings.ts +157 -0
  122. package/src/web/client/features/extensions/index.ts +422 -0
  123. package/src/web/client/features/extensions/strings.ts +164 -0
  124. package/src/web/client/features/feature.ts +93 -0
  125. package/src/web/client/features/live/context.ts +280 -0
  126. package/src/web/client/features/live/fork.ts +156 -0
  127. package/src/web/client/features/live/index.ts +392 -0
  128. package/src/web/client/features/live/onboarding.ts +113 -0
  129. package/src/web/client/features/live/protocol.ts +122 -0
  130. package/src/web/client/features/live/sessions.ts +71 -0
  131. package/src/web/client/features/live/status.ts +68 -0
  132. package/src/web/client/features/live/strings.ts +252 -0
  133. package/src/web/client/features/live/timeline.ts +590 -0
  134. package/src/web/client/features/prompts/editor.ts +292 -0
  135. package/src/web/client/features/prompts/index.ts +346 -0
  136. package/src/web/client/features/prompts/strings.ts +136 -0
  137. package/src/web/client/features/prompts/view.ts +256 -0
  138. package/src/web/client/features/providers/index.ts +100 -0
  139. package/src/web/client/features/providers/strings.ts +23 -0
  140. package/src/web/client/features/settings/general.ts +28 -0
  141. package/src/web/client/features/settings/index.ts +82 -0
  142. package/src/web/client/features/settings/strings.ts +33 -0
  143. package/src/web/client/features/storage/index.ts +1 -0
  144. package/src/web/client/features/storage/strings.ts +45 -0
  145. package/src/web/client/features/storage/view.ts +154 -0
  146. package/src/web/client/features/usage/chart.ts +486 -0
  147. package/src/web/client/features/usage/index.ts +407 -0
  148. package/src/web/client/features/usage/labels.ts +46 -0
  149. package/src/web/client/features/usage/range.ts +36 -0
  150. package/src/web/client/features/usage/state.ts +37 -0
  151. package/src/web/client/features/usage/strings.ts +191 -0
  152. package/src/web/client/features/usage/tooltip.ts +86 -0
  153. package/src/web/client/features/usage/types.ts +96 -0
  154. package/src/web/client/features/worlds/index.ts +424 -0
  155. package/src/web/client/features/worlds/strings.ts +121 -0
  156. package/src/web/client/main.ts +273 -0
  157. package/src/web/client/shell/avatar.ts +233 -0
  158. package/src/web/client/shell/index.ts +549 -0
  159. package/src/web/client/shell/strings.ts +89 -0
  160. package/src/web/client/theme/handoff.ts +43 -0
  161. package/src/web/client/theme/palette.ts +109 -0
  162. package/src/web/client/theme/registry.ts +130 -0
  163. package/src/web/client/theme/storage.ts +72 -0
  164. package/src/web/client/theme/strings.ts +123 -0
  165. package/src/web/client/theme/studio.ts +366 -0
  166. package/src/web/client/ui/actions.ts +109 -0
  167. package/src/web/client/ui/data.ts +185 -0
  168. package/src/web/client/ui/dom.ts +23 -0
  169. package/src/web/client/ui/fields.ts +191 -0
  170. package/src/web/client/ui/format.ts +75 -0
  171. package/src/web/client/ui/icons.ts +183 -0
  172. package/src/web/client/ui/images.ts +91 -0
  173. package/src/web/client/ui/index.ts +89 -0
  174. package/src/web/client/ui/lamp.ts +125 -0
  175. package/src/web/client/ui/log.ts +98 -0
  176. package/src/web/client/ui/overlay.ts +184 -0
  177. package/src/web/client/ui/page.ts +8 -0
  178. package/src/web/client/ui/prompt-input.tsx +311 -0
  179. package/src/web/client/ui/sheet.ts +131 -0
  180. package/src/web/client/ui/strings.ts +71 -0
  181. package/src/web/console-pages.ts +367 -0
  182. package/src/web/files.ts +107 -0
  183. package/src/web/path-picker.ts +296 -0
  184. package/src/web/public/index.html +17 -0
  185. package/src/web/public/styles.css +1715 -0
  186. package/src/web/server.ts +1883 -0
  187. package/src/web/shared/client-panel.ts +603 -0
  188. package/src/web/shared/console-protocol.ts +560 -0
  189. package/src/web/shared/css.d.ts +1 -0
  190. package/src/web/shared/path-picker.ts +23 -0
  191. package/src/web/shared/theme.ts +256 -0
  192. package/src/web/theme-store.ts +37 -0
  193. package/src/world.ts +449 -0
  194. package/src/worlds/bilibili/ENV_PROMPT.md +5 -0
  195. package/src/worlds/bilibili/README.md +176 -0
  196. package/src/worlds/bilibili/audience-admission.ts +995 -0
  197. package/src/worlds/bilibili/client.ts +528 -0
  198. package/src/worlds/bilibili/coalescing-buffer.ts +125 -0
  199. package/src/worlds/bilibili/config.ts +185 -0
  200. package/src/worlds/bilibili/console/client.ts +202 -0
  201. package/src/worlds/bilibili/definition.ts +35 -0
  202. package/src/worlds/bilibili/gift-frame.ts +131 -0
  203. package/src/worlds/bilibili/normalize.ts +452 -0
  204. package/src/worlds/bilibili/overlay/announcement.ts +76 -0
  205. package/src/worlds/bilibili/overlay/assets.ts +82 -0
  206. package/src/worlds/bilibili/overlay/model.ts +494 -0
  207. package/src/worlds/bilibili/overlay/project.ts +202 -0
  208. package/src/worlds/bilibili/overlay/server.ts +286 -0
  209. package/src/worlds/bilibili/overlay/types.ts +217 -0
  210. package/src/worlds/bilibili/overlay/web/app.js +690 -0
  211. package/src/worlds/bilibili/overlay/web/editor.css +297 -0
  212. package/src/worlds/bilibili/overlay/web/editor.html +102 -0
  213. package/src/worlds/bilibili/overlay/web/editor.js +2116 -0
  214. package/src/worlds/bilibili/overlay/web/overlay.html +13 -0
  215. package/src/worlds/bilibili/overlay/web/styles.css +258 -0
  216. package/src/worlds/bilibili/protobuf.ts +123 -0
  217. package/src/worlds/bilibili/wire.ts +94 -0
  218. package/src/worlds/bilibili/world.ts +1389 -0
  219. package/src/worlds/console-fixture/ENV_PROMPT.md +1 -0
  220. package/src/worlds/console-fixture/console/client.ts +72 -0
  221. package/src/worlds/console-fixture/world.ts +73 -0
  222. package/src/worlds/index.ts +15 -0
  223. package/src/worlds/minecraft/ENV_PROMPT.md +32 -0
  224. package/src/worlds/minecraft/ENV_PROMPT_CAMERA.md +2 -0
  225. package/src/worlds/minecraft/LICENSE-mineflayer-pathfinder.txt +21 -0
  226. package/src/worlds/minecraft/README.md +917 -0
  227. package/src/worlds/minecraft/blueprint-plan.ts +915 -0
  228. package/src/worlds/minecraft/blueprint-registry.ts +566 -0
  229. package/src/worlds/minecraft/blueprint-repair.ts +236 -0
  230. package/src/worlds/minecraft/blueprint-resource.ts +272 -0
  231. package/src/worlds/minecraft/blueprint.ts +492 -0
  232. package/src/worlds/minecraft/body-lease.ts +340 -0
  233. package/src/worlds/minecraft/bridge.ts +749 -0
  234. package/src/worlds/minecraft/check.ts +651 -0
  235. package/src/worlds/minecraft/chests.ts +292 -0
  236. package/src/worlds/minecraft/client-launch.ts +272 -0
  237. package/src/worlds/minecraft/client-options.ts +85 -0
  238. package/src/worlds/minecraft/client-skins.ts +164 -0
  239. package/src/worlds/minecraft/client-window.ps1 +91 -0
  240. package/src/worlds/minecraft/client.ts +423 -0
  241. package/src/worlds/minecraft/combat-context.ts +109 -0
  242. package/src/worlds/minecraft/combat.ts +1552 -0
  243. package/src/worlds/minecraft/config.ts +499 -0
  244. package/src/worlds/minecraft/console/access.ts +218 -0
  245. package/src/worlds/minecraft/console/client.ts +244 -0
  246. package/src/worlds/minecraft/console/log.ts +110 -0
  247. package/src/worlds/minecraft/console/mount.ts +420 -0
  248. package/src/worlds/minecraft/console/skin.ts +257 -0
  249. package/src/worlds/minecraft/console/style.css +154 -0
  250. package/src/worlds/minecraft/console/world.ts +449 -0
  251. package/src/worlds/minecraft/deaths.ts +135 -0
  252. package/src/worlds/minecraft/definition.ts +18 -0
  253. package/src/worlds/minecraft/engine-child.ts +274 -0
  254. package/src/worlds/minecraft/engine-ipc.ts +98 -0
  255. package/src/worlds/minecraft/entity-facts.ts +132 -0
  256. package/src/worlds/minecraft/escape.ts +407 -0
  257. package/src/worlds/minecraft/executor.ts +14494 -0
  258. package/src/worlds/minecraft/explored.ts +156 -0
  259. package/src/worlds/minecraft/geometry.ts +205 -0
  260. package/src/worlds/minecraft/goal-plan.ts +647 -0
  261. package/src/worlds/minecraft/item-break.ts +126 -0
  262. package/src/worlds/minecraft/item-facts.ts +146 -0
  263. package/src/worlds/minecraft/item-pick.ts +67 -0
  264. package/src/worlds/minecraft/level-dat.ts +176 -0
  265. package/src/worlds/minecraft/log.ts +132 -0
  266. package/src/worlds/minecraft/mineflayer-fixes.ts +1180 -0
  267. package/src/worlds/minecraft/names.ts +377 -0
  268. package/src/worlds/minecraft/pathfinder-lib.d.ts +13 -0
  269. package/src/worlds/minecraft/pathfinder-perf.ts +796 -0
  270. package/src/worlds/minecraft/piglin.ts +49 -0
  271. package/src/worlds/minecraft/policy.ts +547 -0
  272. package/src/worlds/minecraft/precheck.ts +655 -0
  273. package/src/worlds/minecraft/proxy.ts +445 -0
  274. package/src/worlds/minecraft/ranged.ts +635 -0
  275. package/src/worlds/minecraft/readouts.ts +102 -0
  276. package/src/worlds/minecraft/round.ts +26 -0
  277. package/src/worlds/minecraft/search-observation.ts +92 -0
  278. package/src/worlds/minecraft/server-config.ts +467 -0
  279. package/src/worlds/minecraft/server.ts +658 -0
  280. package/src/worlds/minecraft/show.ts +84 -0
  281. package/src/worlds/minecraft/skills.ts +1763 -0
  282. package/src/worlds/minecraft/terrain.ts +1735 -0
  283. package/src/worlds/minecraft/window.ts +96 -0
  284. package/src/worlds/minecraft/works.ts +179 -0
  285. package/src/worlds/minecraft/world.ts +6438 -0
  286. package/src/worlds/qq/ENV_PROMPT.md +5 -0
  287. package/src/worlds/qq/config.ts +108 -0
  288. package/src/worlds/qq/console/client.ts +126 -0
  289. package/src/worlds/qq/console/events.ts +155 -0
  290. package/src/worlds/qq/console/gate.ts +232 -0
  291. package/src/worlds/qq/console/roster.ts +203 -0
  292. package/src/worlds/qq/console/style.css +65 -0
  293. package/src/worlds/qq/conversation.ts +28 -0
  294. package/src/worlds/qq/definition.ts +62 -0
  295. package/src/worlds/qq/driver.ts +375 -0
  296. package/src/worlds/qq/history-tools.ts +209 -0
  297. package/src/worlds/qq/normalize.ts +323 -0
  298. package/src/worlds/qq/qface-map.ts +282 -0
  299. package/src/worlds/qq/vision-prompt.ts +27 -0
  300. package/src/worlds/qq/vision.ts +642 -0
  301. package/src/worlds/qq/vlm.ts +142 -0
  302. package/src/worlds/qq/world.ts +1503 -0
  303. package/src/worlds/terminal/ENV_PROMPT.md +11 -0
  304. package/src/worlds/terminal/config.ts +9 -0
  305. package/src/worlds/terminal/definition.ts +14 -0
  306. package/src/worlds/terminal/world.ts +700 -0
  307. package/src/worlds/websearch/ENV_PROMPT.md +1 -0
  308. package/src/worlds/websearch/brave-client.ts +261 -0
  309. package/src/worlds/websearch/config.ts +75 -0
  310. package/src/worlds/websearch/definition.ts +20 -0
  311. package/src/worlds/websearch/world.ts +171 -0
@@ -0,0 +1,1715 @@
1
+ @import "tailwindcss";
2
+
3
+ @theme inline {
4
+ --color-background: var(--background);
5
+ --color-surface: var(--surface);
6
+ --color-surface-hover: var(--surface-hover);
7
+ --color-hover: var(--hover);
8
+ --color-foreground: var(--foreground);
9
+ --color-muted-foreground: var(--muted-foreground);
10
+ --color-border: var(--border);
11
+ --color-border-strong: var(--border-strong);
12
+ --color-ring: var(--accent);
13
+ --color-danger: var(--danger);
14
+ }
15
+
16
+ :root {
17
+ /* 无脚本时的回退值;运行时由统一方案注册表写入。 */
18
+ --paper: #f4f5f4;
19
+ --paper-2: #ecedec;
20
+ --sheet: #fbfbfb;
21
+ --sheet-2: #f2f3f2;
22
+ --sheet-3: #e8e9e8;
23
+ --ink: #1b1a1e;
24
+ --ink-soft:#5c5c60;
25
+ --ink-dim: #8b8b8f;
26
+ --line: #e3e4e3;
27
+ --line-2: #d0d2d0;
28
+ --line-strong: #aeb0ae;
29
+ --accent: #00a870;
30
+ --accent-2:#54b494;
31
+ --ink-blue:#238268;
32
+ --ok: #19815e;
33
+ --warn:#96743b;
34
+ --danger:#b45950;
35
+ --violet:#25765e;
36
+ --on-accent:#082a1e;
37
+ --agent-surface:#f4f5f4;
38
+ --world-bg:#f0f1f0;
39
+ --world-ink:#4a4a4e;
40
+ --bubble-bg:#e6e9e7;
41
+ --bubble-ink:#1f2221;
42
+ --tool-result:#087452;
43
+ --chart-hit:#19815e;
44
+ --chart-miss:#96743b;
45
+ --chart-output:#00a870;
46
+ --chart-1:#00a870;
47
+ --chart-2:#54b494;
48
+ --chart-3:#348f86;
49
+ --chart-4:#72967f;
50
+ --chart-5:#b59564;
51
+ --chart-6:#9b8071;
52
+ --chart-7:#4a8f9a;
53
+ --chart-8:#889460;
54
+ --shadow-soft: color-mix(in srgb, var(--ink) 7%, transparent);
55
+ --shadow-strong: color-mix(in srgb, var(--ink) 20%, transparent);
56
+ --overlay: color-mix(in srgb, var(--ink) 44%, transparent);
57
+ --sans: -apple-system, "Segoe UI", "PingFang SC", "Microsoft YaHei", "Noto Sans SC", sans-serif;
58
+ --mono: ui-monospace, "Cascadia Mono", "Sarasa Mono SC", Consolas, "PingFang SC", "Microsoft YaHei", monospace;
59
+ --background: var(--paper);
60
+ --surface: var(--sheet);
61
+ --surface-hover: var(--sheet-2);
62
+ --hover: color-mix(in srgb, var(--ink) 3.5%, transparent);
63
+ --foreground: var(--ink);
64
+ --muted-foreground: var(--ink-soft);
65
+ --border: var(--line);
66
+ --border-strong: var(--line-2);
67
+ --radius-sm: 6px;
68
+ --radius-md: 10px;
69
+ --radius-lg: 14px;
70
+ --radius-composer: 17px;
71
+ --sidebar-width: 280px;
72
+ --conversation-width: 760px;
73
+ --content-width: 1120px;
74
+ --page-gutter: clamp(20px, 3.1vw, 44px);
75
+ --section-gap: 28px;
76
+ --text-detail: 13px;
77
+ }
78
+ * { box-sizing: border-box; }
79
+ html, body { height: 100%; }
80
+ body {
81
+ margin: 0; background: var(--paper); color: var(--ink);
82
+ font: 15px/1.72 var(--sans);
83
+ display: flex; overflow: hidden;
84
+ -webkit-font-smoothing: antialiased;
85
+ }
86
+ ::-webkit-scrollbar { width: 10px; height: 10px; }
87
+ ::-webkit-scrollbar-thumb { background: var(--line-2); border-radius: 6px; border: 3px solid transparent; background-clip: padding-box; }
88
+ ::-webkit-scrollbar-thumb:hover { background: var(--line-strong); background-clip: padding-box; }
89
+ ::-webkit-scrollbar-track { background: transparent; }
90
+ .hidden { display: none !important; }
91
+ a { color: var(--ink-blue); text-decoration: none; }
92
+ a:hover { text-decoration: underline; }
93
+ button { font-family: inherit; }
94
+
95
+
96
+ #rail {
97
+ width: 262px; flex: none; background: var(--paper-2);
98
+ border-right: 1px solid var(--line-2);
99
+ display: flex; flex-direction: column; min-height: 0;
100
+ }
101
+ .brand { padding: 20px 20px 14px; border-bottom: 1px solid var(--line); }
102
+ /* 字标是一整块笔画,颜色由 currentColor 取,所以只需要给高度。 */
103
+ .brand .wordmark { display: block; width: auto; height: 30px; color: var(--ink); }
104
+ /* 两只眼睛与两个字母 o 跟主题的强调色走,横幅上它们本来就是另一个颜色。 */
105
+ .wordmark .accent, .brandmark .accent { stroke: var(--accent); }
106
+
107
+ nav.stack { flex: 1; min-height: 0; overflow-y: auto; padding: 12px 12px 24px; }
108
+ .stacklabel { font-size: 10.5px; letter-spacing: .18em; color: var(--ink-dim); margin: 14px 8px 7px; text-transform: uppercase; }
109
+
110
+ .navitem {
111
+ position: relative; display: flex; align-items: center; gap: 10px;
112
+ padding: 9px 12px 9px 14px; margin: 3px 0; cursor: pointer;
113
+ border: 1px solid transparent; border-radius: 8px 9px 8px 9px;
114
+ color: var(--ink-soft); font-size: 14.5px; user-select: none;
115
+ transition: background .12s, color .12s, border-color .12s;
116
+ }
117
+ .navitem .tag { position: absolute; left: 0; top: 8px; bottom: 8px; width: 3px; border-radius: 3px; background: var(--line-2); transition: background .12s, top .12s, bottom .12s; }
118
+
119
+ .navitem .lbl {
120
+ font-size: 16px; letter-spacing: .3px;
121
+ min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
122
+ }
123
+ .navitem:hover { background: var(--sheet-2); color: var(--ink); }
124
+ .navitem.active { background: var(--sheet); color: var(--ink); border-color: var(--line); }
125
+ .navitem.active .tag { background: var(--accent); top: 4px; bottom: 4px; }
126
+ .navitem.active .lbl { color: var(--accent); }
127
+ /* 状态灯。灰(本体色)=关着,三色是 online/loading/error。 */
128
+ .navdot { width: 7px; height: 7px; border-radius: 50%; background: var(--ink-dim); flex: none; }
129
+ .navdot[hidden] { display: none; }
130
+ /* 一排灯(一条链路一颗,至多七颗)。导航行里推到行尾,别处贴着自己那行文字。 */
131
+ .navlamps { display: inline-flex; align-items: center; gap: 4px; flex: none; }
132
+ .navlamps[hidden] { display: none; }
133
+ .navitem > .navlamps { margin-left: auto; padding-left: 8px; }
134
+ .navdot.on { background: var(--ok); }
135
+ .navdot.warn { background: var(--warn); }
136
+ .navdot.bad { background: var(--danger); }
137
+
138
+ .railfoot { padding: 10px 16px; border-top: 1px solid var(--line); font-size: 11.5px; color: var(--ink-dim); display: flex; flex-direction: column; align-items: stretch; gap: 8px; }
139
+ .rail-who { display: flex; align-items: center; gap: 9px; min-width: 0; }
140
+ .rail-name { min-width: 0; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; font-size: 13px; color: var(--ink); }
141
+
142
+
143
+ .pagehead {
144
+ flex: none; padding: 18px 30px 0; }
145
+ .pagetitle { font: 600 22px/1.3 var(--sans); color: var(--ink); margin: 5px 0 2px; letter-spacing: .5px; }
146
+ .pagetitle .navlamps { margin-left: 10px; vertical-align: middle; }
147
+ .pagedesc { font-size: 13px; color: var(--ink-soft); max-width: 68ch; }
148
+
149
+ .scroll { flex: 1; min-height: 0; overflow-y: auto; padding: 18px 30px 40px; }
150
+ .measure { max-width: 1080px; }
151
+
152
+
153
+ .subtabs { display: flex; gap: 4px; flex-wrap: wrap; padding: 12px 30px 0; flex: none; }
154
+
155
+
156
+ .sheet {
157
+ background: var(--sheet); border: 1px solid var(--line);
158
+ border-radius: 12px 13px 11px 12px; padding: 18px 20px; margin-bottom: 16px;
159
+ }
160
+ .sheet.tabbed { position: relative; }
161
+ .sheet.tabbed::before {
162
+ content: ''; position: absolute; left: 22px; top: -1px; width: 46px; height: 6px;
163
+ background: var(--accent-2); border-radius: 0 0 4px 4px; opacity: .8;
164
+ }
165
+ .sheet h3 { font: 600 15.5px/1.3 var(--sans); color: var(--ink); margin: 0 0 3px; letter-spacing: .3px; }
166
+ .sheet .sh-desc { font-size: 13.5px; color: var(--ink-soft); margin-bottom: 14px; }
167
+ .sheet h3 .en { font: 10.5px var(--sans); color: var(--ink-dim); margin-left: 8px; letter-spacing: .04em; }
168
+
169
+
170
+ details.sheet.fold { padding: 0; }
171
+ details.sheet.fold > summary {
172
+ display: flex; align-items: baseline; gap: 10px; padding: 13px 20px;
173
+ list-style: none; cursor: pointer; user-select: none;
174
+ }
175
+ details.sheet.fold > summary::-webkit-details-marker { display: none; }
176
+ details.sheet.fold > summary::after { content: '+'; margin-left: auto; color: var(--ink-dim); font: 13px var(--mono); }
177
+ details.sheet.fold[open] > summary::after { content: '−'; }
178
+ details.sheet.fold > summary:hover h3 { color: var(--accent); }
179
+ details.sheet.fold > summary h3 { margin: 0; }
180
+ details.sheet.fold .foldnote { margin-left: auto; font: var(--text-detail)/1.4 var(--sans); color: var(--ink-soft); }
181
+ details.sheet.fold .foldnote.bad { color: var(--danger); }
182
+ details.sheet.fold > .foldbody { padding: 0 20px 16px; }
183
+ details.sheet.fold > .foldbody > .sh-desc { margin-top: -2px; }
184
+
185
+
186
+ .statgrid { display: grid; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); gap: 12px; }
187
+ /* 网格里只剩一句占位时横跨整行,不缩在第一格 */
188
+ .statgrid > .placeholder { grid-column: 1 / -1; }
189
+ .stat {
190
+ background: var(--sheet-2); border: 1px solid var(--line); border-radius: 10px 11px 9px 10px;
191
+ padding: 12px 14px;
192
+ }
193
+ .stat .k { font-size: var(--text-detail); color: var(--ink-soft); letter-spacing: .02em; margin-bottom: 5px; }
194
+ .stat .v { font: 600 22px/1.15 var(--sans); color: var(--ink); word-break: break-word; }
195
+ .stat .v small { font: 400 var(--text-detail)/1.4 var(--sans); color: var(--ink-soft); }
196
+ .stat.accent .v { color: var(--accent); }
197
+
198
+ .kvtable { width: 100%; border-collapse: collapse; font-size: 13.5px; }
199
+ .kvtable td { padding: 5px 2px; border-top: 1px solid var(--line); vertical-align: top; }
200
+ .kvtable tr:first-child td { border-top: none; }
201
+ .kvtable td:first-child { color: var(--ink-soft); width: 40%; }
202
+ .kvtable td:last-child { font-family: var(--mono); font-size: 12.5px; word-break: break-word; }
203
+
204
+
205
+ .btn {
206
+ background: var(--sheet-2); color: var(--ink-soft); border: 1px solid var(--line-2);
207
+ border-radius: 8px; padding: 6px 14px; font-size: 13px; cursor: pointer;
208
+ transition: color .12s, border-color .12s, background .12s;
209
+ }
210
+ .btn:hover { color: var(--ink); border-color: var(--line-strong); background: var(--sheet); }
211
+ .btn:disabled { opacity: .45; cursor: default; }
212
+ .btn.primary { background: var(--accent); color: var(--on-accent); border-color: var(--accent); }
213
+ .btn.primary:hover { filter: brightness(1.06); color: var(--on-accent); }
214
+ .btn.warn:hover { color: var(--warn); border-color: var(--warn); }
215
+ .btn.danger { color: var(--danger); border-color: color-mix(in srgb, var(--danger) 42%, transparent); }
216
+ .btn.danger:hover { background: color-mix(in srgb, var(--danger) 9%, transparent); border-color: var(--danger); }
217
+ .btn.sm { padding: 4px 11px; font-size: var(--text-detail); }
218
+
219
+ .msgline { font: var(--text-detail)/1.45 var(--sans); min-height: 16px; color: var(--ok); }
220
+ .msgline:empty { display: none; }
221
+ .msgline.bad { color: var(--danger); }
222
+ .placeholder { color: var(--ink-dim); font-size: 13px; text-align: center; padding: 30px 12px; }
223
+ .rowbar { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; margin-bottom: 10px; }
224
+ .rowbar .grow { flex: 1; }
225
+ label.check { display: inline-flex; gap: 7px; align-items: center; font-size: var(--text-detail); color: var(--ink-soft); cursor: pointer; }
226
+
227
+
228
+ .tablewrap { border: 1px solid var(--line); border-radius: 11px; overflow: hidden; background: var(--sheet); }
229
+ table.data { width: 100%; border-collapse: collapse; font-size: 13.5px; }
230
+ table.data th { position: sticky; top: 0; background: var(--sheet-3); color: var(--ink-soft); font-weight: 600; text-align: left; padding: 8px 12px; font-size: var(--text-detail); white-space: nowrap; border-bottom: 1px solid var(--line-2); }
231
+ table.data td { padding: 6px 12px; border-top: 1px solid var(--line); vertical-align: top; }
232
+ td.mono { font-family: var(--mono); font-size: var(--text-detail); color: var(--ink-soft); white-space: nowrap; }
233
+ td.txt { word-break: break-word; white-space: pre-wrap; }
234
+ .lv { font: 600 11.5px var(--mono); }
235
+ .lv-error { color: var(--danger); } .lv-warn { color: var(--warn); }
236
+ .lv-info { color: var(--ok); } .lv-debug { color: var(--ink-dim); }
237
+ .data-extra { color: var(--ink-dim); font: 11.5px var(--mono); word-break: break-all; }
238
+
239
+
240
+ .liveband {
241
+ flex: none; display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
242
+ padding: 12px 30px; border-bottom: 1px solid var(--line);
243
+ }
244
+ .chips { display: flex; gap: 6px; flex-wrap: wrap; align-items: center; }
245
+ .chip { font: 11.5px/1 var(--sans); color: var(--ink-soft); background: var(--sheet-2); border: 1px solid var(--line); border-radius: 20px; padding: 5px 11px; white-space: nowrap; }
246
+ .chip b { color: var(--ink); font-weight: 600; }
247
+ .chip.warnc { color: var(--warn); border-color: color-mix(in srgb, var(--warn) 42%, transparent); }
248
+ .chip.dreamc { color: var(--violet); border-color: color-mix(in srgb, var(--violet) 42%, transparent); }
249
+ .sesscards { display: flex; gap: 6px; flex-wrap: wrap; align-items: center; margin-left: auto; }
250
+ .sesscard {
251
+ display: inline-flex; align-items: center; gap: 6px; cursor: pointer;
252
+ font: 11.5px/1 var(--sans); color: var(--ink-soft); background: var(--sheet-2);
253
+ border: 1px solid var(--line); border-radius: 8px; padding: 5px 10px; white-space: nowrap;
254
+ transition: border-color .12s, color .12s;
255
+ }
256
+ .sesscard:hover { border-color: var(--accent-2); color: var(--ink); }
257
+ .sesscard.sel { border-color: var(--accent); }
258
+ .sesscard b { color: var(--ink); font-weight: 600; }
259
+ .sesscard .sdot { width: 7px; height: 7px; border-radius: 50%; background: var(--ink-dim); flex: none; }
260
+ .sesscard.running .sdot { background: var(--ok); }
261
+ .sesscard.running.r-dream .sdot { background: var(--ink-blue); }
262
+ .sesscard .shr { color: var(--ink-blue); }
263
+
264
+
265
+ .ctxanchor { position: static; display: inline-grid; place-items: center; }
266
+ .ctxdonut {
267
+ position: relative; width: 32px; height: 32px; padding: 0; border: none;
268
+ background: var(--ctx-ring, conic-gradient(var(--line-2) 0 100%));
269
+ cursor: pointer; display: grid; place-items: center; border-radius: 50%;
270
+ transition: transform .12s, box-shadow .12s;
271
+ }
272
+ .ctxdonut:hover { transform: scale(1.04); }
273
+ .ctxdonut::before { position: absolute; inset: 4px; content: ''; border-radius: 50%; background: var(--surface); }
274
+ .ctxdonut .ctxpct { position: relative; z-index: 1; font: 650 10.5px/1 var(--mono); color: var(--ink); letter-spacing: -.25px; }
275
+ .ctxdonut.warn { box-shadow: 0 0 0 1px color-mix(in srgb, var(--warn) 24%, transparent); }
276
+ .ctxdonut.danger { box-shadow: 0 0 0 1px color-mix(in srgb, var(--danger) 34%, transparent); }
277
+
278
+ .ctxpanel {
279
+ position: absolute; right: 0; bottom: calc(100% + 10px); z-index: 60;
280
+ width: min(336px, calc(100vw - 28px));
281
+ background: var(--sheet); border: 1px solid var(--line-2); border-radius: 11px 12px 11px 10px;
282
+ box-shadow: 0 14px 40px -12px var(--shadow-strong); padding: 14px 15px 13px;
283
+ font-family: var(--sans); animation: ctxpop .13s ease;
284
+ max-height: calc(100vh - 108px); overflow-y: auto;
285
+ }
286
+ @keyframes ctxpop { from { opacity: 0; transform: translateY(5px); } to { opacity: 1; transform: none; } }
287
+ .ctxpanel .cx-head { display: flex; align-items: baseline; justify-content: space-between; gap: 8px; margin-bottom: 3px; }
288
+ .ctxpanel .cx-title { font: 600 13.5px/1 var(--sans); color: var(--ink); letter-spacing: .3px; }
289
+ .ctxpanel .cx-total { font: 12px/1 var(--mono); color: var(--ink-soft); }
290
+ .ctxpanel .cx-total b { color: var(--ink); }
291
+ .ctxpanel .cx-sub { font-size: 11px; color: var(--ink-dim); margin-bottom: 10px; }
292
+ .ctxpanel .cx-bar {
293
+ display: flex; height: 9px; border-radius: 5px; overflow: hidden; margin-bottom: 12px;
294
+ background: var(--sheet-3); border: 1px solid var(--line);
295
+ }
296
+ .ctxpanel .cx-bar > span { height: 100%; min-width: 1px; }
297
+ .ctxpanel .cx-grp { font-size: 10px; letter-spacing: .14em; color: var(--ink-dim); text-transform: uppercase; margin: 9px 2px 4px; }
298
+ .ctxpanel .cx-grp:first-of-type { margin-top: 0; }
299
+ .ctxpanel .cx-row { display: flex; align-items: center; gap: 8px; padding: 3px 2px; font-size: 12.5px; }
300
+ .ctxpanel .cx-sw { width: 9px; height: 9px; border-radius: 2px; flex: none; }
301
+ .ctxpanel .cx-lbl { color: var(--ink-soft); flex: 1; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
302
+ .ctxpanel .cx-lbl .cx-note { color: var(--ink-dim); font-size: 11px; }
303
+ .ctxpanel .cx-val { font: 12px/1 var(--mono); color: var(--ink); flex: none; }
304
+ .ctxpanel .cx-pctcol { font: 11px/1 var(--mono); color: var(--ink-dim); flex: none; width: 34px; text-align: right; }
305
+ .ctxpanel .cx-foot { margin-top: 11px; padding-top: 9px; border-top: 1px solid var(--line); font-size: 11px; color: var(--ink-dim); line-height: 1.5; }
306
+ .ctxpanel .cx-foot b { color: var(--ink-soft); font-weight: 600; }
307
+
308
+ .forkbanner {
309
+ position: sticky; top: 0; z-index: 5; display: flex; align-items: center; justify-content: space-between; gap: 10px;
310
+ background: var(--sheet-3); border: 1px solid color-mix(in srgb, var(--violet) 42%, transparent); border-radius: 10px;
311
+ padding: 9px 15px; margin-bottom: 5px; color: var(--violet); font-size: 12.5px;
312
+ }
313
+ .forkbanner b { color: var(--ink); }
314
+ .forkbanner .meta2 { color: var(--ink-dim); }
315
+
316
+ .anim-in { animation: fadein .18s ease-out; }
317
+ @keyframes fadein { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: none; } }
318
+ .slide-in { animation: slidein .26s ease-out; }
319
+ @keyframes slidein { from { opacity: 0; transform: translateX(14px); } to { opacity: 1; transform: none; } }
320
+ .clps { display: grid; grid-template-rows: 0fr; transition: grid-template-rows .22s ease; }
321
+ .clps.open { grid-template-rows: 1fr; }
322
+ .clps > div { overflow: hidden; min-height: 0; }
323
+ .chev { display: inline-block; transition: transform .2s; color: var(--ink-dim); font-size: 10px; }
324
+ .chev.up { transform: rotate(180deg); }
325
+
326
+ .tcard { background: var(--sheet); border: 1px solid var(--line); border-radius: 12px 13px 11px 12px; padding: 11px 15px; }
327
+ .badge { display: inline-block; font: 10px/1 var(--mono); letter-spacing: .08em; padding: 3px 8px; border-radius: 6px; border: 1px solid var(--line-2); color: var(--ink-soft); flex: none; }
328
+ .meta { color: var(--ink-dim); font: 11px var(--sans); }
329
+ pre.mono { margin: 0; font: 12.5px/1.62 var(--mono); white-space: pre-wrap; word-break: break-word; color: var(--ink); }
330
+
331
+ .syscard .cardhead { display: flex; align-items: center; gap: 10px; cursor: pointer; min-width: 0; }
332
+ .syscard .badge { color: var(--warn); border-color: color-mix(in srgb, var(--warn) 45%, transparent); }
333
+ .syscard .headtxt { color: var(--ink-soft); font-size: 12.5px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; flex: 1; }
334
+ .syscard pre.mono { margin-top: 10px; max-height: 420px; overflow-y: auto; color: var(--ink-soft); }
335
+
336
+
337
+ .grp { display: grid; grid-template-columns: 32px minmax(0, 1fr); column-gap: 10px; align-items: start; }
338
+ .grp.r { grid-template-columns: minmax(0, 1fr) 32px; }
339
+ .gutter { width: 32px; height: 32px; border-radius: 50%; overflow: hidden; display: grid; place-items: center; background: var(--sheet-3); border: 1px solid var(--line-2); color: var(--ink-soft); font: 600 13px/1 var(--sans); }
340
+ .gutter .glyph { font: 600 11.5px/1 var(--mono); letter-spacing: -.02em; }
341
+ .avatar-image { width: 100%; height: 100%; display: block; object-fit: cover; }
342
+ .gcol { display: flex; flex-direction: column; gap: 10px; min-width: 0; }
343
+ .gcol.r { align-items: flex-end; }
344
+ .ghead { display: flex; align-items: center; gap: 8px; min-height: 32px; min-width: 0; }
345
+ .ghead .headtxt { color: var(--ink-dim); font-size: 11.5px; }
346
+ .ordinal { cursor: help; }
347
+
348
+ .kv { display: inline-flex; align-items: center; gap: 7px; padding: 3px 8px; border-radius: 6px; border: 1px solid var(--kv-line); font: 10.5px/1 var(--mono); letter-spacing: .04em; min-width: 0; }
349
+ .kv-k { color: var(--kv-line); flex: none; }
350
+ .kv-v { color: var(--ink); overflow-wrap: anywhere; }
351
+
352
+ .kv-tool_name { --kv-line: color-mix(in srgb, var(--ink-blue) 60%, transparent); }
353
+ .kv-call_id { --kv-line: color-mix(in srgb, var(--accent-2) 75%, transparent); }
354
+ .kv-合成 { --kv-line: color-mix(in srgb, var(--warn) 75%, transparent); }
355
+ .turn { background: var(--agent-surface); border-left: 3px solid var(--ink-blue); }
356
+ .turnhead { width: 100%; }
357
+ /* 一段里没有任何可画的 Item(空 reasoning、空正文):组头后面标个「空」,原始 Item 里仍看得到它们 */
358
+ .turn.empty .turnstatus:empty { display: inline; }
359
+ .turn.empty .turnstatus:empty::after { content: '(空)'; color: var(--ink-dim); font: 11px var(--sans); }
360
+ .turnhead .badge { color: var(--ink-blue); border-color: color-mix(in srgb, var(--ink-blue) 42%, transparent); }
361
+ .turnhead .grow { flex: 1; }
362
+ .turnhead .turnstatus:empty { display: none; }
363
+ .turnhead .turnstatus { color: var(--warn); }
364
+
365
+ .turnbody { display: flex; flex-direction: column; gap: 10px; }
366
+ .turnbody:empty { display: none; }
367
+ .rawtoggle { cursor: pointer; user-select: none; }
368
+ .rawtoggle:hover { color: var(--ink-soft); }
369
+ .turnraw pre.mono { color: var(--ink-dim); font-size: 11.5px; max-height: 420px; overflow-y: auto; border-top: 1px dashed var(--line); padding-top: 8px; }
370
+ .think { border-left: 3px solid color-mix(in srgb, var(--accent-2) 65%, transparent); padding-left: 12px; }
371
+ .think-head { display: flex; align-items: center; gap: 8px; cursor: pointer; user-select: none; }
372
+ .think-label { color: var(--violet); font-size: 11px; letter-spacing: .1em; }
373
+ .think-body { margin-top: 6px; color: var(--ink-soft); font-size: 13.5px; font-style: italic; white-space: pre-wrap; word-break: break-word; cursor: pointer; }
374
+ .think-sub { margin-top: 8px; padding-top: 6px; border-top: 1px dashed color-mix(in srgb, var(--accent-2) 40%, transparent); }
375
+ .typing::after { content: '▍'; color: var(--violet); animation: blink .9s steps(1) infinite; font-style: normal; }
376
+ @keyframes blink { 50% { opacity: 0; } }
377
+
378
+ .think-enc { color: color-mix(in srgb, var(--violet) 62%, var(--ink-dim)); }
379
+
380
+
381
+ .monolog { align-self: flex-start; max-width: 90%; min-width: 0; background: var(--bubble-bg); color: var(--bubble-ink); border: 1px solid color-mix(in srgb, var(--bubble-ink) 26%, transparent); border-radius: 4px 14px 14px 14px; padding: 8px 14px; }
382
+ .monolog-label { color: color-mix(in srgb, var(--bubble-ink) 62%, transparent); font: 10.5px var(--sans); letter-spacing: .08em; margin-bottom: 3px; }
383
+ .monolog.refusal .monolog-label { color: var(--danger); }
384
+ .monolog-body { color: var(--bubble-ink); white-space: pre-wrap; word-break: break-word; font-size: 14px; }
385
+
386
+
387
+ .toolcall { width: 90%; align-self: flex-start; background: var(--sheet-2); border: 1px solid var(--line); border-radius: 4px 14px 14px 14px; padding: 8px 12px; }
388
+ /* 合成调用对:虚线要稀,浏览器的虚线长度随线宽走,所以线加粗、颜色压淡 */
389
+ .toolcall.evframe { border: 2px dashed color-mix(in srgb, var(--line-2) 75%, transparent); }
390
+ .toolhead { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 8px; min-width: 0; }
391
+ .toolhead .badge { color: var(--ink-blue); border-color: color-mix(in srgb, var(--ink-blue) 42%, transparent); }
392
+ .toolargs { margin-top: 6px; }
393
+ .toolargs pre.mono { color: var(--ink-soft); font-size: 12px; }
394
+ .foldhead { cursor: pointer; color: var(--ink-dim); font-size: 11.5px; user-select: none; }
395
+ .foldhead:hover { color: var(--ink-soft); }
396
+ .toolresult { margin-top: 8px; border-top: 1px dashed color-mix(in srgb, var(--accent-2) 40%, transparent); padding-top: 7px; }
397
+ .toolresult.pending { color: var(--ink-dim); font-size: 11.5px; }
398
+ .toolresult pre.mono { color: var(--tool-result); font-size: 12px; }
399
+
400
+
401
+ .world { max-width: 90%; min-width: 0; border: 1px solid color-mix(in srgb, var(--world-ink) 36%, transparent); background: var(--world-bg); border-radius: 14px 4px 14px 14px; padding: 8px 14px; }
402
+ .world-line { font: 12.5px/1.7 var(--mono); color: var(--world-ink); white-space: pre-wrap; word-break: break-word; }
403
+ .usergrp .badge { color: var(--world-ink); border-color: color-mix(in srgb, var(--world-ink) 42%, transparent); }
404
+ .usergrp .gutter { color: var(--world-ink); }
405
+
406
+ .standalone .cardhead { display: flex; align-items: center; gap: 8px; }
407
+ .standalone .badge { color: var(--ok); border-color: color-mix(in srgb, var(--ok) 42%, transparent); }
408
+ .standalone pre.mono { margin-top: 8px; }
409
+ .divider { text-align: center; color: var(--ink-dim); font-size: 11px; letter-spacing: .2em; display: flex; align-items: center; gap: 12px; }
410
+ .divider::before, .divider::after { content: ''; flex: 1; border-top: 1px dashed var(--line-2); }
411
+
412
+ .divider.sessionhead { color: color-mix(in srgb, var(--ink-dim) 70%, transparent); letter-spacing: .12em; font-size: 10.5px; }
413
+ .divider.sessionhead::before, .divider.sessionhead::after { border-top-color: var(--line); }
414
+
415
+ .pulse { width: 8px; height: 8px; border-radius: 50%; background: var(--violet); animation: pulse 1.15s ease-in-out infinite; }
416
+ @keyframes pulse { 0%,100% { opacity: .3; transform: scale(.75); } 50% { opacity: 1; transform: scale(1.15); } }
417
+
418
+ @keyframes toast { 0% { opacity: 0; transform: translate(-50%, 8px); } 12% { opacity: 1; transform: translate(-50%, 0); } 75% { opacity: 1; } 100% { opacity: 0; transform: translate(-50%, -8px); } }
419
+
420
+ .toast {
421
+ position: fixed; left: 50%; bottom: 26px; transform: translateX(-50%); z-index: 90;
422
+ background: var(--sheet); border: 1px solid var(--line-2); color: var(--ink-soft);
423
+ font-size: 12px; border-radius: 16px; padding: 5px 15px; white-space: nowrap;
424
+ pointer-events: none; animation: toast 1.9s ease forwards;
425
+ box-shadow: 0 12px 32px -16px var(--shadow-strong);
426
+ }
427
+ .toast.bad { color: var(--danger); border-color: color-mix(in srgb, var(--danger) 42%, transparent); }
428
+
429
+
430
+ .treerow { padding: 4px 10px; cursor: pointer; border-radius: 7px; display: flex; justify-content: space-between; gap: 8px; white-space: nowrap; font-size: 13.5px; color: var(--ink); }
431
+ .treerow:hover { background: var(--sheet-2); }
432
+ .treerow.dir { color: var(--accent); }
433
+ .treerow.sel { background: var(--sheet-3); }
434
+ .treerow .fsize { color: var(--ink-dim); font: 10.5px var(--mono); }
435
+
436
+
437
+ .toolgroup { margin-bottom: 18px; }
438
+ .toolgroup .gt { font: 600 13.5px var(--sans); color: var(--accent); margin-bottom: 8px; letter-spacing: .3px; }
439
+ .schema-groups { margin-top: 18px; }
440
+ .schema-group { display: grid; gap: 8px; }
441
+ .tool-schema-card {
442
+ border: 1px solid var(--line); background: var(--sheet-2); border-radius: 5px 12px 7px 4px;
443
+ overflow: clip; box-shadow: 2px 3px 0 -1px var(--paper-2);
444
+ transition: transform .18s ease, border-color .18s ease, box-shadow .18s ease;
445
+ }
446
+ .tool-schema-card[open] { background: var(--sheet); border-color: var(--line-strong); box-shadow: 3px 4px 0 -1px var(--paper-2), 0 12px 24px var(--shadow-soft); }
447
+ .tool-schema-summary {
448
+ min-height: 54px; display: grid; grid-template-columns: minmax(140px, .5fr) minmax(220px, 1.5fr) auto;
449
+ gap: 12px; align-items: center; padding: 10px 13px; cursor: pointer; list-style: none;
450
+ }
451
+ .tool-schema-summary::-webkit-details-marker { display: none; }
452
+ .tool-schema-summary::before { content: '+'; grid-column: 1; grid-row: 1; width: 18px; color: var(--ink-dim); font: 14px var(--mono); }
453
+ .tool-schema-card[open] > .tool-schema-summary::before { content: '−'; }
454
+ .tool-schema-title { grid-column: 1; grid-row: 1; padding-left: 24px; color: var(--ink); font: 600 13px var(--mono); }
455
+ .tool-schema-short {
456
+ grid-column: 2; color: var(--ink-soft); font-size: 12px; line-height: 1.45;
457
+ overflow: hidden; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
458
+ }
459
+ .tool-schema-summary .pill { grid-column: 3; white-space: nowrap; }
460
+ .tool-schema-body { border-top: 1px solid var(--line); padding: 14px; animation: schemaPaperIn .18s ease-out; }
461
+ @keyframes schemaPaperIn { from { opacity: 0; transform: translateY(-5px); } }
462
+ .schema-safety-note {
463
+ padding: 9px 11px; border-left: 3px solid var(--ink); background: var(--sheet-2);
464
+ color: var(--ink-soft); font-size: 11.5px; line-height: 1.55;
465
+ }
466
+ .schema-root-description { margin-top: 10px; padding: 8px 10px; color: var(--ink-soft); background: var(--sheet-2); font-size: 12px; }
467
+ .schema-param-wrap { margin-top: 12px; overflow-x: auto; border: 1px solid var(--line); border-radius: 4px 9px 6px 3px; }
468
+ .schema-param-table { width: 100%; min-width: 620px; border-collapse: collapse; font-size: 11.5px; }
469
+ .schema-param-table th {
470
+ padding: 8px 10px; text-align: left; color: var(--ink-dim); background: var(--sheet-2);
471
+ border-bottom: 1px solid var(--line); font: 10px var(--mono); letter-spacing: .05em;
472
+ }
473
+ .schema-param-table td { padding: 9px 10px; color: var(--ink-soft); border-top: 1px solid var(--line); vertical-align: top; }
474
+ .schema-param-table tbody tr:first-child td { border-top: 0; }
475
+ .schema-param-path, .schema-param-type { font-family: var(--mono); color: var(--ink) !important; }
476
+ .schema-param-required { white-space: nowrap; color: var(--ink-dim) !important; }
477
+ .schema-param-description { min-width: 220px; line-height: 1.5; }
478
+ .schema-empty-params { margin-top: 10px; }
479
+ .schema-raw { margin-top: 12px; border: 1px dashed var(--line-2); background: var(--sheet-2); }
480
+ .schema-raw > summary { cursor: pointer; padding: 9px 11px; color: var(--ink-soft); font: 11px var(--sans); }
481
+ .schema-raw-tools { display: flex; justify-content: flex-end; padding: 0 10px 7px; }
482
+ .schema-raw pre { max-height: 460px; overflow: auto; margin: 0; padding: 13px; border-top: 1px solid var(--line); color: var(--ink); font-size: 11.5px; background: var(--sheet); }
483
+
484
+ .pill { font: 10.5px var(--sans); color: var(--ink-soft); background: var(--sheet-3); border: 1px solid var(--line); border-radius: 20px; padding: 3px 9px; }
485
+ .pill.on { color: var(--ok); border-color: color-mix(in srgb, var(--ok) 42%, transparent); }
486
+ /* 关闭/静默:与 .on 对称的写法,取比中性 .pill 更淡的灰——三态里 off 必须一眼
487
+ 能跟"没给 tone 的中性态"分开,否则那个 tone 等于没写。 */
488
+ .pill.off { color: var(--ink-dim); border-color: color-mix(in srgb, var(--ink-dim) 42%, transparent); }
489
+
490
+
491
+ .iogrid { display: grid; grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); gap: 14px; }
492
+ .iocard { margin: 0; }
493
+
494
+ .iocard-hidden { opacity: .62; }
495
+
496
+ .iocard-missing { border-style: dashed; opacity: .78; }
497
+ .iocard-missing h3 { color: var(--ink-soft); }
498
+ .iocard-inactive { border-style: dashed; opacity: .85; }
499
+ .iocard-inactive h3 { color: var(--ink-soft); }
500
+
501
+
502
+ .mountrow { display: flex; align-items: center; gap: 10px; padding: 7px 0; border-top: 1px solid var(--line); }
503
+ .mountrow .mname { width: 6.2em; flex: none; font-size: 13px; color: var(--ink); }
504
+ .mountrow .mstate { font: 12px var(--sans); white-space: nowrap; }
505
+ .mountrow .mdetail { flex: 1; min-width: 0; font: 11.5px var(--mono); color: var(--ink-dim); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
506
+ .mountrow .macts { display: flex; gap: 6px; flex: none; }
507
+
508
+ textarea.field { width: 100%; background: var(--sheet-2); border: 1px solid var(--line-2); color: var(--ink); border-radius: 9px; padding: 9px 12px; font: 13px var(--mono); outline: none; resize: vertical; min-height: 58px; }
509
+ textarea.field:focus { border-color: var(--accent); }
510
+ input.field, select.field { background: var(--sheet-2); border: 1px solid var(--line-2); color: var(--ink); border-radius: 8px; padding: 6px 10px; font: var(--text-detail)/1.4 var(--mono); outline: none; }
511
+ input.field:focus, select.field:focus { border-color: var(--accent); }
512
+
513
+
514
+ .tsection { font-size: 13.5px; font-weight: 600; color: var(--ink-blue); letter-spacing: .02em; margin: 16px 0 2px; padding-bottom: 5px; border-bottom: 1px solid var(--line-strong); display: flex; align-items: baseline; gap: 7px; }
515
+ .tsection:first-child { margin-top: 2px; }
516
+
517
+ .tsection .ttag { font: 10px var(--sans); font-weight: 400; color: var(--ink-dim); border: 1px solid var(--line); border-radius: 5px; padding: 0 4px; }
518
+ .tsecdesc { color: var(--ink-soft); font-size: var(--text-detail); line-height: 1.55; margin: 5px 0 2px; }
519
+ .trow { display: grid; grid-template-columns: 200px 180px 1fr; gap: 14px; align-items: center; padding: 9px 0; border-top: 1px solid var(--line); }
520
+ .trow .tlabel { font-size: 13px; color: var(--ink); display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
521
+ .trow .ttag { font-size: 10px; color: var(--warn); border: 1px solid var(--line-strong); border-radius: 5px; padding: 0 4px; }
522
+ .trow .tdesc { color: var(--ink-soft); font-size: var(--text-detail); line-height: 1.55; }
523
+ .trow .tfield { display: flex; align-items: center; gap: 6px; min-width: 0; }
524
+ .trow .tfield input.field, .trow .tfield select.field { width: 100%; min-width: 0; }
525
+ .trow .tunit { color: var(--ink-soft); font-size: 12.5px; white-space: nowrap; }
526
+ .trow .pairfield { display: flex; align-items: center; gap: 5px; min-width: 0; flex: 1; }
527
+ .trow .pairfield input.field { width: 100%; min-width: 0; }
528
+ .trow .pairsep { color: var(--ink-dim); }
529
+ .pathfield { display: grid; gap: 5px; width: 100%; min-width: 0; }
530
+ .pathfield-controls { display: flex; align-items: center; gap: 6px; min-width: 0; }
531
+ .pathfield-controls input.field { flex: 1; width: auto; min-width: 0; }
532
+ .btn.pathpick { width: 34px; min-width: 34px; height: 34px; min-height: 34px; padding: 0; display: inline-flex; align-items: center; justify-content: center; }
533
+ .pathpick .icon { width: 16px; height: 16px; flex: none; }
534
+ .pathfield-meta { display: flex; align-items: center; gap: 6px 10px; min-width: 0; flex-wrap: wrap; font-size: 11px; line-height: 1.4; }
535
+ .pathrecommended { min-width: 0; color: var(--ink-dim); overflow-wrap: anywhere; }
536
+ .pathdownload { display: inline-flex; align-items: center; gap: 4px; color: var(--ink-blue); white-space: nowrap; }
537
+ .pathdownload .icon { width: 13px; height: 13px; }
538
+
539
+
540
+ .strow { display: flex; align-items: center; gap: 14px; padding: 11px 14px; border: 1px solid var(--line); border-radius: 10px; margin-bottom: 9px; background: var(--sheet-2); }
541
+ .strow .stinfo { flex: 1; min-width: 0; }
542
+ .strow .stlabel { font-size: 13.5px; color: var(--ink); }
543
+ .strow .stloc { color: var(--ink-soft); font: 12.5px/1.4 var(--mono); margin-left: 8px; }
544
+ .strow .stnote { color: var(--ink-soft); font-size: var(--text-detail); line-height: 1.5; margin-top: 2px; }
545
+ .strow .ststat { font: var(--text-detail)/1.4 var(--mono); color: var(--ink-blue); white-space: nowrap; }
546
+
547
+
548
+ .modal { position: fixed; inset: 0; background: var(--overlay); backdrop-filter: blur(2px); display: flex; align-items: center; justify-content: center; z-index: 30; animation: fadein .14s ease-out; }
549
+ .modalcard { background: var(--paper); border: 1px solid var(--line-strong); border-radius: 14px; width: min(880px, 92vw); max-height: min(84vh, 920px); display: flex; flex-direction: column; box-shadow: 0 20px 50px -24px var(--shadow-strong); }
550
+ .modalhead { flex: none; display: flex; align-items: center; gap: 10px; padding: 13px 18px; border-bottom: 1px solid var(--line); }
551
+ .modaltitle { font: 600 15px var(--sans); color: var(--ink); flex: 1; }
552
+ .modalbody { flex: 1; min-height: 0; overflow: auto; padding: 16px 20px; }
553
+
554
+
555
+ .segwrap { display: inline-flex; border: 1px solid var(--line-2); border-radius: 8px; overflow: hidden; }
556
+ .seg { background: var(--sheet); border: none; border-right: 1px solid var(--line-2); color: var(--ink-soft); font: 12.5px var(--sans); padding: 5px 12px; cursor: pointer; }
557
+ .seg:last-child { border-right: none; }
558
+ .seg.active { background: var(--accent); color: var(--on-accent); }
559
+ .seg:hover:not(.active) { background: var(--sheet-3); }
560
+
561
+ .usagebar { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; margin-bottom: 14px; }
562
+ .urange { display: inline-flex; align-items: center; gap: 6px; font: var(--text-detail)/1.4 var(--sans); color: var(--ink-soft); }
563
+ .urange.hidden { display: none; }
564
+ .ulabel { font: var(--text-detail)/1.4 var(--sans); color: var(--ink-soft); }
565
+ .ubkhint, .urangehint { font: var(--text-detail)/1.4 var(--sans); color: var(--ink-soft); }
566
+ .segwrap.sm .seg { padding: 4px 10px; font-size: var(--text-detail); }
567
+ .usagecards { margin-bottom: 16px; }
568
+
569
+
570
+ #u-comp .compbar { display: flex; height: 26px; border-radius: 7px; overflow: hidden; border: 1px solid var(--line); background: var(--sheet); }
571
+ #u-comp .compseg { min-width: 2px; }
572
+ #u-comp .compleg { display: flex; flex-wrap: wrap; gap: 16px; margin-top: 10px; }
573
+ #u-comp .compitem { display: inline-flex; align-items: center; gap: 6px; font: var(--text-detail)/1.4 var(--sans); color: var(--ink-soft); }
574
+ #u-comp .compsw { width: 11px; height: 11px; border-radius: 3px; }
575
+ #u-comp .compamt { font: var(--text-detail)/1.4 var(--mono); color: var(--ink); }
576
+ #u-comp .comppct { font: var(--text-detail)/1.4 var(--mono); color: var(--ink-soft); }
577
+
578
+
579
+ .chart-legend { display: flex; flex-wrap: wrap; gap: 12px; margin: 8px 0 2px; }
580
+ .chart-legend:empty { display: none; }
581
+ .legitem { display: inline-flex; align-items: center; gap: 6px; font: var(--text-detail)/1.4 var(--sans); color: var(--ink-soft); }
582
+ .legsw { width: 11px; height: 11px; border-radius: 3px; }
583
+ #usagechart, #usagecalls { margin-top: 10px; overflow-x: auto; }
584
+ #usagechart svg, #usagecalls svg { display: block; }
585
+ .barg .bseg { transition: opacity .1s; }
586
+ .barg:hover .bseg { opacity: .82; }
587
+ .barg .bhit { cursor: crosshair; }
588
+ .bseg.seghi { stroke: var(--ink); stroke-width: 1.4; }
589
+ #usagechart .axis, #usagecalls .axis { stroke: var(--line-2); stroke-width: 1; }
590
+ #usagechart .glabel, #usagechart .vlabel, #usagecalls .glabel, #usagecalls .vlabel { fill: var(--ink-soft); font: var(--text-detail) var(--mono); }
591
+ .usagetables { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; margin-top: 16px; }
592
+
593
+
594
+ .u-tip { position: fixed; z-index: 90; pointer-events: none; box-sizing: border-box; width: max-content; max-width: min(268px, calc(100vw - 16px)); background: var(--sheet); border: 1px solid var(--line-strong); border-radius: 9px; padding: 9px 11px; box-shadow: 0 6px 22px var(--shadow-soft); font: 12px var(--sans); color: var(--ink); overflow-wrap: anywhere; }
595
+ .u-tip.hidden { display: none; }
596
+ .u-tip .tt-h { font: 600 12.5px var(--mono); color: var(--accent); margin-bottom: 3px; }
597
+ .u-tip .tt-tot { font: 12px var(--mono); color: var(--ink-soft); margin-bottom: 4px; }
598
+ .u-tip .tt-row { display: grid; grid-template-columns: 9px minmax(0, 1fr) auto; align-items: start; gap: 6px; margin: 2px 0; }
599
+ .u-tip .tt-sw { width: 9px; height: 9px; border-radius: 2px; flex: none; }
600
+ .u-tip .tt-l { min-width: 0; overflow-wrap: anywhere; }
601
+ .u-tip .tt-v { white-space: nowrap; text-align: right; font: 12px var(--mono); color: var(--ink); padding-left: 6px; }
602
+ .u-tip .tt-extra { margin-top: 5px; padding-top: 5px; border-top: 1px solid var(--line); font: 11px var(--mono); color: var(--ink-dim); }
603
+ .u-tip .tt-cur { display: grid; grid-template-columns: 9px minmax(0, 1fr) auto; align-items: start; gap: 6px; font: 600 12px var(--sans); color: var(--accent); margin-bottom: 4px; padding-bottom: 4px; border-bottom: 1px dashed var(--line-2); }
604
+ .u-tip .tt-row.cur { background: var(--sheet-3); border-radius: 4px; margin: 2px -4px; padding: 1px 4px; font-weight: 600; color: var(--ink); }
605
+
606
+ .histrow { padding: 8px 11px; border: 1px solid var(--line); border-radius: 8px; margin-bottom: 6px; background: var(--sheet-2); cursor: pointer; }
607
+ .histrow:hover { border-color: var(--line-strong); }
608
+ .histrow .hh { display: flex; gap: 10px; align-items: baseline; }
609
+ .histrow .hhash { font: 11px var(--mono); color: var(--accent); }
610
+ .histrow .hauthor { font-size: 12px; color: var(--violet); }
611
+ .histrow .hdate { font: 10.5px var(--mono); color: var(--ink-dim); margin-left: auto; }
612
+ .histrow .hmsg { font-size: 12.5px; color: var(--ink); margin-top: 2px; }
613
+ .diffbox { font: 11.5px/1.6 var(--mono); white-space: pre-wrap; word-break: break-word; background: var(--sheet); border: 1px solid var(--line); border-radius: 8px; padding: 10px 12px; margin: 6px 0 12px; max-height: 420px; overflow: auto; }
614
+ .diffbox .di-add { color: var(--ok); }
615
+ .diffbox .di-del { color: var(--danger); }
616
+ .diffbox .di-hunk { color: var(--ink-blue); }
617
+
618
+
619
+ body { background: var(--background); }
620
+ #rail { background: var(--paper-2); border-right: 0; box-shadow: none; }
621
+ .brand { padding-top: 22px; border-bottom: 0; }
622
+ .navitem { min-height: 40px; transition: background-color .15s ease, color .15s ease; }
623
+ .navitem:hover { text-decoration: none; }
624
+ .navitem.active { box-shadow: none; }
625
+
626
+ .btn {
627
+ min-height: 36px;
628
+ transition: background-color .15s ease, color .15s ease, border-color .15s ease, opacity .15s ease;
629
+ }
630
+ .btn.primary, .seg.active { background: var(--accent); border-color: var(--accent); color: var(--on-accent); }
631
+ input.field, select.field, textarea.field { min-height: 40px; }
632
+ input:focus-visible, textarea:focus-visible, select:focus-visible, button:focus-visible, [tabindex]:focus-visible {
633
+ outline: 2px solid color-mix(in srgb, var(--accent) 45%, transparent); outline-offset: 2px;
634
+ }
635
+ .modal { background: var(--overlay); animation: modalFade .15s ease-out; }
636
+ .modalcard { background: var(--sheet); animation: modalPaperIn .16s ease-out; }
637
+ @keyframes modalFade { from { opacity: 0; } }
638
+ @keyframes modalPaperIn { from { opacity: 0; transform: translateY(6px); } }
639
+
640
+
641
+ .treerow { min-height: 34px; align-items: center; border-radius: 3px 8px 4px 2px; transition: background .14s, transform .14s; }
642
+ .treerow:hover { transform: translateX(2px); }
643
+ .treerow.sel { background: var(--accent); color: var(--on-accent); }
644
+ .treerow.sel .fsize { color: color-mix(in srgb, var(--on-accent) 72%, transparent); }
645
+
646
+
647
+ .theme-current {
648
+ flex: none; padding: 6px 10px; border: 1px solid var(--line); background: var(--sheet-2);
649
+ color: var(--ink-soft); font: 11px var(--sans); border-radius: 4px 9px 6px 3px;
650
+ }
651
+ .theme-schemes {
652
+ display: grid; grid-template-columns: repeat(auto-fit, minmax(190px, 1fr)); gap: 10px;
653
+ }
654
+ .theme-scheme {
655
+ min-width: 0; padding: 11px 12px; text-align: left; cursor: pointer; color: var(--ink);
656
+ background: var(--sheet-2); border: 1px solid var(--line); border-radius: 5px 12px 7px 4px;
657
+ transition: transform .16s ease, border-color .16s ease, background .16s ease, box-shadow .16s ease;
658
+ }
659
+ .theme-scheme:hover { transform: translateY(-2px); border-color: var(--line-strong); box-shadow: 2px 3px 0 var(--line); }
660
+ .theme-scheme.active { border-color: var(--accent); box-shadow: inset 3px 0 0 var(--accent-2); background: var(--sheet); }
661
+ .theme-scheme-head { display: flex; align-items: center; gap: 8px; font: 600 13px var(--sans); }
662
+ .theme-scheme-kind { margin-left: auto; color: var(--ink-dim); font: 9px var(--mono); letter-spacing: .08em; text-transform: uppercase; }
663
+ .theme-scheme-note { min-height: 32px; margin: 4px 0 8px; color: var(--ink-soft); font-size: 11px; line-height: 1.45; }
664
+ .theme-swatches { display: flex; height: 15px; overflow: hidden; border: 1px solid var(--line); border-radius: 3px; }
665
+ .theme-swatches span { flex: 1; }
666
+ .theme-workbench { display: grid; grid-template-columns: minmax(0, 1.45fr) minmax(290px, .75fr); gap: 16px; align-items: start; }
667
+ .theme-palette { display: flex; flex-direction: column; gap: 13px; }
668
+ .theme-color-group { border-top: 1px solid var(--line); padding-top: 9px; }
669
+ .theme-color-group:first-child { border-top: 0; padding-top: 0; }
670
+ .theme-color-group h4 { margin: 0 0 7px; color: var(--ink-soft); font: 600 11px var(--sans); letter-spacing: .08em; }
671
+ .theme-color-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(164px, 1fr)); gap: 7px; }
672
+ .theme-color {
673
+ display: grid; grid-template-columns: 32px minmax(0, 1fr); grid-template-rows: auto auto;
674
+ column-gap: 8px; align-items: center; padding: 6px 7px; background: var(--sheet-2);
675
+ border: 1px solid var(--line); border-radius: 4px 8px 5px 3px;
676
+ }
677
+ .theme-color input[type="color"] {
678
+ grid-row: 1 / 3; width: 32px; height: 32px; padding: 0; border: 1px solid var(--line-2);
679
+ background: transparent; border-radius: 5px; cursor: pointer;
680
+ }
681
+ .theme-color-label { min-width: 0; color: var(--ink-soft); font-size: 10.5px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
682
+ .theme-color input[type="text"] {
683
+ width: 100%; min-width: 0; padding: 0; border: 0; background: transparent; color: var(--ink);
684
+ outline: none; font: 11px var(--mono); text-transform: uppercase;
685
+ }
686
+ .theme-color.invalid { border-color: var(--danger); }
687
+ .theme-actions { justify-content: flex-end; }
688
+ .theme-preview-sheet { position: sticky; top: 0; }
689
+ .theme-specimen { display: flex; flex-direction: column; gap: 11px; }
690
+ .theme-specimen .tcard { margin: 0; }
691
+ .theme-chart-preview {
692
+ height: 116px; display: flex; align-items: flex-end; gap: 8px; padding: 14px 12px 10px;
693
+ background: var(--sheet-2); border: 1px solid var(--line); border-radius: 4px 10px 6px 3px;
694
+ }
695
+ .theme-chart-preview span { flex: 1; min-width: 12px; border-radius: 3px 3px 1px 1px; transition: height .2s ease, background .2s ease; }
696
+
697
+ @media (max-width: 720px) {
698
+ body { display: block; overflow: auto; }
699
+ #rail { width: 100%; height: auto; position: sticky; top: 0; z-index: 100; border-right: 0; border-bottom: 1px solid var(--line); }
700
+ .brand { display: none; }
701
+ nav.stack { display: flex; gap: 5px; overflow-x: auto; padding: 8px; }
702
+ .stacklabel { display: none; }
703
+ .navitem { flex: none; padding: 7px 11px; margin: 0; min-height: 38px; }
704
+ .navitem .tag { display: none; }
705
+ .railfoot { display: none; }
706
+ .pagehead { padding-top: 14px; }
707
+ .pagedesc { max-width: none; }
708
+ .modalcard { width: 96vw; max-height: 92dvh; }
709
+ .theme-workbench { grid-template-columns: 1fr; }
710
+ .theme-preview-sheet { position: static; }
711
+ .theme-color-grid { grid-template-columns: repeat(auto-fill, minmax(144px, 1fr)); }
712
+ }
713
+
714
+ @media (max-width: 900px) {
715
+ .usagetables { grid-template-columns: 1fr; }
716
+ .theme-workbench { grid-template-columns: 1fr; }
717
+ .theme-preview-sheet { position: static; }
718
+ #rail { width: 210px; }
719
+ .scroll, .pagehead, .subtabs, .liveband { padding-left: 16px; padding-right: 16px; }
720
+ }
721
+ @media (prefers-reduced-motion: reduce) {
722
+ *, *::before, *::after { animation-duration: .001ms !important; animation-iteration-count: 1 !important; transition-duration: .001ms !important; scroll-behavior: auto !important; }
723
+ }
724
+
725
+
726
+
727
+
728
+ .fieldrow { display: block; margin: 14px 0 0; }
729
+ .fieldrow .fieldlabel { display: block; font-size: 10.5px; letter-spacing: .18em; color: var(--ink-dim); text-transform: uppercase; margin-bottom: 7px; }
730
+ .fieldrow > input.field, .fieldrow > textarea.field { width: 100%; }
731
+
732
+
733
+ .modal.busy { cursor: progress; }
734
+ .busytext { font-size: 13px; color: var(--ink-soft); white-space: pre-wrap; }
735
+
736
+
737
+
738
+
739
+ .logview { border: 1px solid var(--line); border-radius: 11px; background: var(--sheet); overflow: auto; padding: 4px 0; }
740
+ .logline { font: 12px/1.58 var(--mono); color: var(--ink); padding: 2px 12px; white-space: pre-wrap; word-break: break-word; border-top: 1px solid color-mix(in srgb, var(--line) 55%, transparent); }
741
+ .logview > .logline:first-child { border-top: none; }
742
+ .logline.dim { color: var(--ink-dim); }
743
+ .logline.warn { color: var(--warn); }
744
+ .logline.bad { color: var(--danger); background: color-mix(in srgb, var(--danger) 5%, transparent); }
745
+
746
+
747
+ .attachstrip { display: flex; flex-wrap: wrap; gap: 6px; margin: 6px 0 2px; font: 12px var(--sans); }
748
+ .attachcell {
749
+ display: inline-flex; align-items: center; justify-content: center;
750
+ width: 112px; height: 84px; padding: 0; overflow: hidden;
751
+ border: 1px solid var(--line); border-radius: 9px; background: var(--paper-2);
752
+ color: var(--ink-dim); cursor: zoom-in;
753
+ }
754
+ .attachcell:disabled { cursor: default; }
755
+ .attachcell.missing { font-size: 11px; }
756
+ .attachcell img { width: 100%; height: 100%; object-fit: cover; display: block; }
757
+ .imgzoom { display: block; max-width: 100%; max-height: min(76vh, 860px); margin: 0 auto; border-radius: 8px; }
758
+
759
+
760
+ .progress { margin: 12px 0 0; }
761
+ .progresshead { display: flex; align-items: baseline; gap: 10px; margin-bottom: 6px; }
762
+ .progresslabel { font-size: 11.5px; color: var(--ink-dim); letter-spacing: .04em; }
763
+ .progressnum { margin-left: auto; font: 11.5px/1 var(--mono); color: var(--ink-soft); }
764
+ .progresstrack { height: 6px; border-radius: 20px; background: var(--sheet-3); border: 1px solid var(--line); overflow: hidden; }
765
+ .progressfill { height: 100%; background: var(--accent); transition: width .18s ease; }
766
+ .progress.warnc .progressfill { background: var(--warn); }
767
+ .progress.dreamc .progressfill { background: var(--violet); }
768
+
769
+
770
+
771
+
772
+ .liveview, .coreview { flex: 1; min-height: 0; height: 100%; display: flex; flex-direction: column; }
773
+ .liveview { position: relative; }
774
+
775
+
776
+ .tlwrap { position: relative; flex: 1; min-height: 0; display: flex; flex-direction: column; }
777
+ .tlscroll { flex: 1; min-height: 0; overflow-y: auto; padding: 20px 24px 10px; }
778
+ .tlinner { max-width: 880px; margin: 0 auto; display: flex; flex-direction: column; gap: 13px; }
779
+ .tlthink { flex: none; display: flex; align-items: center; gap: 9px; color: var(--violet); font-size: 12.5px; padding: 6px 24px; max-width: 880px; margin: 0 auto; width: 100%; }
780
+ .tljump { position: absolute; bottom: 20px; left: 50%; transform: translateX(-50%); z-index: 4; }
781
+
782
+
783
+ #kernel-root { flex: 1; min-width: 0; min-height: 0; display: flex; flex-direction: column; }
784
+ #kernel-root > div { flex: 1; min-width: 0; min-height: 0; display: flex; flex-direction: column; }
785
+ #kernel-root > div:empty { flex: none; display: none; }
786
+
787
+
788
+ #boot-note { margin: auto; text-align: center; color: var(--ink-dim); }
789
+ #boot-note .boot-hint { margin-top: 10px; font-size: 12.5px; }
790
+ #boot-note code { font-family: var(--mono); }
791
+
792
+
793
+ body {
794
+ background: var(--background);
795
+ color: var(--foreground);
796
+ font: 15px/1.62 var(--sans);
797
+ }
798
+
799
+ #rail {
800
+ width: var(--sidebar-width);
801
+ background: var(--paper-2);
802
+ border: 0;
803
+ box-shadow: none;
804
+ }
805
+ .brand { padding: 22px 18px 10px; border: 0; }
806
+ .brand .wordmark { height: 26px; color: var(--foreground); }
807
+ nav.stack { padding: 16px 10px 20px; }
808
+ .navgroup { display: flex; flex-direction: column; gap: 1px; }
809
+ .navgroup + .navgroup {
810
+ margin-top: 14px;
811
+ padding-top: 14px;
812
+ border-top: 1px solid color-mix(in srgb, var(--border) 78%, transparent);
813
+ }
814
+ .stacklabel {
815
+ margin: 0 10px 7px;
816
+ color: var(--muted-foreground);
817
+ font-size: 11px;
818
+ font-weight: 600;
819
+ letter-spacing: .07em;
820
+ }
821
+ .navitem {
822
+ min-height: 36px;
823
+ margin: 0;
824
+ padding: 7px 10px;
825
+ border: 0;
826
+ border-radius: var(--radius-md);
827
+ color: var(--muted-foreground);
828
+ gap: 9px;
829
+ }
830
+ .navicon { width: 16px; height: 16px; flex: none; color: color-mix(in srgb, currentColor 82%, transparent); }
831
+ .navitem .lbl { font: 450 14px/1.35 var(--sans); letter-spacing: 0; }
832
+ .navitem:hover { background: var(--hover); color: var(--foreground); }
833
+ .navitem:focus-visible,
834
+ .rail-action:focus-visible,
835
+ .rail-avatar:focus-visible,
836
+ .settings-jump:focus-visible {
837
+ outline: 2px solid color-mix(in srgb, var(--accent) 48%, transparent);
838
+ outline-offset: 1px;
839
+ }
840
+ .navitem.active { background: color-mix(in srgb, var(--accent) 8%, transparent); color: var(--foreground); }
841
+ .navitem.active .navicon { color: var(--accent); }
842
+ .navitem.active .lbl { color: inherit; font-weight: 550; }
843
+
844
+ .navgroup-provider .navitem { min-height: 36px; padding-block: 6px; }
845
+ .navgroup-provider .navitem .lbl { font-size: 13.5px; font-weight: 500; }
846
+ .navgroup-primary .navitem {
847
+ color: var(--foreground);
848
+ font-weight: 520;
849
+ }
850
+ .navgroup-world-tree {
851
+ position: relative;
852
+ gap: 1px;
853
+ }
854
+ .navgroup-world-tree > .navitem {
855
+ color: var(--foreground);
856
+ font-weight: 520;
857
+ }
858
+ .navmodule-list {
859
+ position: relative;
860
+ display: flex;
861
+ flex-direction: column;
862
+ gap: 1px;
863
+ margin: 1px 0 0 18px;
864
+ padding: 3px 0 2px 11px;
865
+ }
866
+ .navmodule-list::before {
867
+ position: absolute;
868
+ top: 0;
869
+ bottom: 6px;
870
+ left: 0;
871
+ width: 1px;
872
+ content: '';
873
+ background: color-mix(in srgb, var(--border) 84%, transparent);
874
+ }
875
+ .navmodule-list .navitem {
876
+ position: relative;
877
+ min-height: 34px;
878
+ padding-block: 5px;
879
+ }
880
+ .navmodule-list .navitem::before {
881
+ position: absolute;
882
+ top: 50%;
883
+ left: -11px;
884
+ width: 7px;
885
+ height: 1px;
886
+ content: '';
887
+ background: color-mix(in srgb, var(--border) 84%, transparent);
888
+ }
889
+ .navdot { width: 6px; height: 6px; }
890
+ .railfoot { min-height: 62px; padding: 10px 16px 14px; border: 0; gap: 9px; }
891
+ .rail-avatar-wrap {
892
+ display: grid;
893
+ flex: none;
894
+ place-items: center;
895
+ padding: 2px;
896
+ border: 1px solid color-mix(in srgb, var(--border-strong) 72%, transparent);
897
+ border-radius: 50%;
898
+ background: color-mix(in srgb, var(--surface) 68%, transparent);
899
+ }
900
+ .rail-avatar {
901
+ position: relative;
902
+ width: 34px;
903
+ height: 34px;
904
+ flex: none;
905
+ overflow: hidden;
906
+ padding: 0;
907
+ border: 0;
908
+ border-radius: 50%;
909
+ background: var(--surface);
910
+ color: var(--foreground);
911
+ cursor: pointer;
912
+ }
913
+ .rail-avatar-image { width: 100%; height: 100%; display: block; object-fit: cover; }
914
+ .rail-avatar-fallback { display: grid; width: 100%; height: 100%; place-items: center; font: 600 14px/1 var(--sans); }
915
+ .rail-avatar-edit {
916
+ position: absolute;
917
+ inset: 0;
918
+ display: grid;
919
+ place-items: center;
920
+ background: color-mix(in srgb, var(--foreground) 52%, transparent);
921
+ color: var(--surface);
922
+ opacity: 0;
923
+ transition: opacity .15s ease;
924
+ }
925
+ .rail-avatar-edit .icon { width: 15px; height: 15px; }
926
+ .rail-avatar:hover .rail-avatar-edit { opacity: 1; }
927
+ .rail-actions { display: flex; gap: 3px; }
928
+ .rail-name { color: var(--foreground); }
929
+ .rail-action {
930
+ width: 34px;
931
+ height: 34px;
932
+ display: grid;
933
+ place-items: center;
934
+ padding: 0;
935
+ border: 0;
936
+ border-radius: var(--radius-md);
937
+ background: transparent;
938
+ color: var(--muted-foreground);
939
+ cursor: pointer;
940
+ transition: background-color .15s ease, color .15s ease;
941
+ }
942
+ .rail-action:hover { background: var(--hover); color: var(--foreground); }
943
+
944
+ .rail-shutdown:hover:not(:disabled) {
945
+ background: color-mix(in srgb, var(--danger) 12%, transparent);
946
+ color: var(--danger);
947
+ }
948
+ .rail-action.active { background: color-mix(in srgb, var(--foreground) 6%, transparent); color: var(--foreground); }
949
+ .rail-action:disabled { opacity: .35; cursor: default; }
950
+ .rail-action .icon { width: 17px; height: 17px; }
951
+ .rail-run:not(.paused) { color: var(--accent); }
952
+ .visually-hidden {
953
+ position: absolute !important;
954
+ width: 1px !important;
955
+ height: 1px !important;
956
+ overflow: hidden !important;
957
+ clip: rect(0 0 0 0) !important;
958
+ white-space: nowrap !important;
959
+ }
960
+
961
+ #kernel-root {
962
+ margin: 0;
963
+ overflow: hidden;
964
+ background: transparent;
965
+ border-radius: 0;
966
+ }
967
+ #kernel-root > div { overflow: hidden; }
968
+ .featureslot,
969
+ .panelslot {
970
+ display: flex;
971
+ flex: 1;
972
+ flex-direction: column;
973
+ min-width: 0;
974
+ min-height: 0;
975
+ container: console-content / inline-size;
976
+ overflow-x: hidden;
977
+ overflow-y: auto;
978
+ padding: 30px var(--page-gutter) 56px;
979
+ scrollbar-gutter: stable;
980
+ }
981
+ .providerchrome {
982
+ flex: none;
983
+ min-width: 0;
984
+ padding: 30px var(--page-gutter) 0;
985
+ }
986
+ .panelslot { padding-top: 8px; }
987
+ .featureslot > :not(.viewport-overlay),
988
+ .providerchrome > *,
989
+ .panelslot > :not(.viewport-overlay) {
990
+ flex: none;
991
+ width: 100%;
992
+ max-width: var(--content-width);
993
+ margin-right: auto;
994
+ margin-left: auto;
995
+ }
996
+ .featureslot-live,
997
+ .featureslot-core {
998
+ overflow: hidden;
999
+ padding: 0;
1000
+ }
1001
+ .coreview .measure {
1002
+ width: min(100%, var(--conversation-width));
1003
+ margin-right: auto;
1004
+ margin-left: 0;
1005
+ }
1006
+ .featureslot-live > *,
1007
+ .featureslot-core > * {
1008
+ flex: 1;
1009
+ min-height: 0;
1010
+ max-width: none;
1011
+ }
1012
+ .pagehead {
1013
+ width: 100%;
1014
+ max-width: calc(var(--content-width) + var(--page-gutter) + var(--page-gutter));
1015
+ margin: 0 auto;
1016
+ padding: 30px var(--page-gutter) 0;
1017
+ }
1018
+ .featureintro { flex: none; }
1019
+ .featureintro .pagetitle { margin: 0; }
1020
+ .featureintro .pagedesc { max-width: 64ch; margin: 6px 0 0; }
1021
+ .providerintro .rowbar { margin-top: 14px; }
1022
+ .providerintro .msgline { margin-top: 10px; }
1023
+ .pagetitle { margin-top: 7px; font: 600 22px/1.3 var(--sans); letter-spacing: -.025em; }
1024
+ .pagedesc { margin-top: 5px; color: var(--muted-foreground); font-size: 13px; line-height: 1.55; }
1025
+ .scroll { padding: 22px var(--page-gutter) 48px; scrollbar-gutter: stable; }
1026
+ .measure { width: min(100%, var(--content-width)); margin-inline: auto; }
1027
+ .subtabs {
1028
+ width: 100%;
1029
+ max-width: calc(var(--content-width) + var(--page-gutter) + var(--page-gutter));
1030
+ margin: 10px auto 0;
1031
+ padding: 0 var(--page-gutter);
1032
+ gap: 2px;
1033
+ }
1034
+ .sheet {
1035
+ margin-block: 0;
1036
+ padding: 22px 0;
1037
+ background: transparent;
1038
+ border: 0;
1039
+ border-top: 1px solid var(--border);
1040
+ border-radius: 0;
1041
+ box-shadow: none;
1042
+ }
1043
+ .sheet:first-child { border-top: 0; }
1044
+ .sheet.tabbed::before { display: none; }
1045
+ .sheet h3 { font: 600 15px/1.4 var(--sans); letter-spacing: -.01em; }
1046
+ .sheet h3 .en { font-size: 11.5px; }
1047
+ .sheet .sh-desc { max-width: 68ch; margin-top: 3px; margin-bottom: 16px; line-height: 1.55; }
1048
+ details.sheet.fold,
1049
+ .iogrid > .sheet {
1050
+ padding: 16px 18px;
1051
+ background: color-mix(in srgb, var(--surface) 70%, transparent);
1052
+ border: 1px solid var(--border);
1053
+ border-radius: var(--radius-lg);
1054
+ }
1055
+ details.sheet.fold { margin-bottom: 10px; }
1056
+ details.sheet.fold > summary { padding: 0; }
1057
+ details.sheet.fold > .foldbody { padding: 14px 0 0; }
1058
+ .featureslot > :not(.sheet) + .sheet,
1059
+ .featureslot > .sheet + .sheet,
1060
+ .panelslot > :not(.sheet) + .sheet,
1061
+ .panelslot > .sheet + .sheet,
1062
+ .measure > .sheet + .sheet,
1063
+ .measure > div > .sheet + .sheet { margin-top: var(--section-gap); }
1064
+ .featureslot > :where(.iogrid, .theme-workbench, .usagetables) {
1065
+ margin-top: var(--section-gap);
1066
+ }
1067
+ .featureslot > .featureintro + .sheet {
1068
+ margin-top: 24px;
1069
+ padding-top: 0;
1070
+ border-top: 0;
1071
+ }
1072
+ .theme-workbench > .sheet,
1073
+ .usagetables > .sheet {
1074
+ padding-top: 0;
1075
+ border-top: 0;
1076
+ }
1077
+ .usagetables {
1078
+ grid-template-columns: minmax(0, 1fr);
1079
+ gap: var(--section-gap);
1080
+ }
1081
+ .usagetables > .sheet { min-width: 0; }
1082
+ .sheetbody > .rowbar:last-child,
1083
+ .foldbody > .rowbar:last-child { margin-bottom: 0; }
1084
+ /* 为无自有间距的相邻卡片内容补间距;已有间距的标题、操作行和列表行除外。 */
1085
+ .sheetbody > :not(.sh-desc, .sectionhead, .rowbar) + :where(
1086
+ input.field, select.field, textarea.field,
1087
+ .tablewrap, .logview, .statgrid, .msgline, .rowbar:not(.actionbar)
1088
+ ),
1089
+ .foldbody > :not(.sh-desc, .sectionhead, .rowbar) + :where(
1090
+ input.field, select.field, textarea.field,
1091
+ .tablewrap, .logview, .statgrid, .msgline, .rowbar:not(.actionbar)
1092
+ ) { margin-top: 14px; }
1093
+ .sectionhead {
1094
+ margin: 28px 0 14px;
1095
+ padding-top: 22px;
1096
+ border-top: 1px solid var(--border);
1097
+ }
1098
+ .sheetbody > .sectionhead:first-child,
1099
+ .foldbody > .sectionhead:first-child,
1100
+ .sh-desc + .sectionhead {
1101
+ margin-top: 8px;
1102
+ padding-top: 0;
1103
+ border-top: 0;
1104
+ }
1105
+ .sectionhead h4 {
1106
+ margin: 0;
1107
+ color: var(--foreground);
1108
+ font: 600 13px/1.4 var(--sans);
1109
+ letter-spacing: -.005em;
1110
+ }
1111
+ .sectiondesc {
1112
+ max-width: 68ch;
1113
+ margin-top: 4px;
1114
+ color: var(--muted-foreground);
1115
+ font-size: var(--text-detail);
1116
+ line-height: 1.5;
1117
+ }
1118
+ .actionbar {
1119
+ justify-content: flex-end;
1120
+ margin: 24px 0 0;
1121
+ padding-top: 16px;
1122
+ border-top: 1px solid var(--border);
1123
+ }
1124
+ .actionbar + .sectionhead {
1125
+ padding-top: 0;
1126
+ border-top: 0;
1127
+ }
1128
+ .measure .actionbar { justify-content: flex-start; }
1129
+ .measure .run-actions .grow { flex: 0; }
1130
+ .prompt-toolbar {
1131
+ display: flex;
1132
+ align-items: center;
1133
+ gap: 12px;
1134
+ margin-top: 24px;
1135
+ padding-bottom: 18px;
1136
+ border-bottom: 1px solid var(--border);
1137
+ }
1138
+ .prompt-toolbar .msgline { min-width: 0; overflow-wrap: anywhere; }
1139
+ .featureslot-prompts > .prompt-library,
1140
+ .panelslot > .prompt-library { margin-top: 28px; }
1141
+ .prompt-card textarea.field {
1142
+ width: 100%;
1143
+ min-height: 300px;
1144
+ resize: vertical;
1145
+ padding: 14px 16px;
1146
+ font: 13.5px/1.7 var(--mono);
1147
+ }
1148
+ .prompt-card .actionbar { align-items: center; }
1149
+ .prompt-card .actionbar .grow { flex: 1; }
1150
+ .prompt-state { min-width: 0; flex: 0 1 auto; overflow-wrap: anywhere; }
1151
+ .prompt-warn { color: var(--warn); font-size: 12px; }
1152
+ .prompt-warn:empty { display: none; }
1153
+
1154
+
1155
+ .prompt-vars {
1156
+ margin-top: 12px;
1157
+ padding: 10px 12px;
1158
+ border-left: 3px solid var(--border);
1159
+ background: var(--sheet-2);
1160
+ font-size: 12px;
1161
+ }
1162
+ .prompt-vars > b { display: block; margin-bottom: 8px; color: var(--ink-soft); }
1163
+ .prompt-var + .prompt-var { margin-top: 10px; padding-top: 10px; border-top: 1px solid var(--border); }
1164
+ .prompt-var-head { display: flex; align-items: center; gap: 8px; }
1165
+ .prompt-var-name { font-family: var(--mono); }
1166
+ .prompt-var-desc { margin: 4px 0; color: var(--ink-soft); }
1167
+ .prompt-var-value {
1168
+ max-height: 120px;
1169
+ overflow: auto;
1170
+ margin: 0;
1171
+ padding: 6px 8px;
1172
+ background: var(--sheet);
1173
+ color: var(--ink-soft);
1174
+ font-size: 11.5px;
1175
+ white-space: pre-wrap;
1176
+ }
1177
+
1178
+ /* 前缀块对应编辑器中的行区间;标签与右栏按块位置定位。 */
1179
+ .prefix-stage { position: relative; display: flex; align-items: flex-start; gap: 0; margin-top: 24px; }
1180
+ .prefix-host { flex: 1; min-width: 0; }
1181
+
1182
+
1183
+ .prefix-grip {
1184
+ flex: 0 0 10px;
1185
+ align-self: stretch;
1186
+ min-height: 40px;
1187
+ cursor: col-resize;
1188
+ }
1189
+ .prefix-grip:hover, .prefix-grip.grip-dragging {
1190
+ background: linear-gradient(var(--border) 0 100%) center / 2px 100% no-repeat;
1191
+ }
1192
+
1193
+ /* CodeMirror 默认颜色使用当前主题变量覆盖。 */
1194
+ .prefix-host .cm-editor { border: 1px solid var(--border); background: var(--sheet); color: var(--ink); }
1195
+ .prefix-host .cm-editor.cm-focused { outline: 0; }
1196
+ .prefix-host .cm-scroller { font: 13px/1.7 var(--mono); }
1197
+ .prefix-host .cm-content { padding: 0; caret-color: var(--accent); }
1198
+ .prefix-host .cm-cursor, .prefix-host .cm-dropCursor {
1199
+ border-left: 2px solid var(--accent);
1200
+ }
1201
+ .prefix-host .cm-selectionBackground,
1202
+ .prefix-host .cm-content ::selection { background: color-mix(in srgb, var(--accent) 30%, transparent); }
1203
+ .prefix-host .cm-gutters {
1204
+ border: 0;
1205
+ background: transparent;
1206
+ color: var(--ink-soft);
1207
+ }
1208
+ .prefix-host .cm-activeLine { background: transparent; }
1209
+
1210
+ /* 块首行预留边界高度,分割线由跨列的 prefix-divider 绘制。 */
1211
+ .cm-block { padding-left: 10px; }
1212
+ .cm-block-persona { background: color-mix(in srgb, var(--accent) 8%, transparent); }
1213
+ .cm-block-world { background: color-mix(in srgb, var(--ok) 10%, transparent); }
1214
+ .cm-block-derived { background: color-mix(in srgb, var(--ink) 8%, transparent); color: var(--ink-soft); }
1215
+ .cm-block-first { border-top: 2px solid transparent; }
1216
+
1217
+
1218
+ .prefix-dividers { position: absolute; inset: 0; z-index: 2; pointer-events: none; }
1219
+ .prefix-divider { position: absolute; right: 0; height: 2px; background: var(--border); }
1220
+ .prefix-divider.tone-persona { background: var(--accent); }
1221
+ .prefix-divider.tone-world { background: var(--ok); }
1222
+
1223
+ /* 保存提示使用行伪元素,避免 contentEditable 节点影响空行退格;不参与选取或指针命中。 */
1224
+ .cm-line[data-save-hint]::after {
1225
+ content: attr(data-save-hint);
1226
+ margin-left: 16px;
1227
+ padding: 0 6px;
1228
+ border-radius: 3px;
1229
+ background: color-mix(in srgb, var(--ink) 8%, transparent);
1230
+ color: var(--ink-dim);
1231
+ font-size: 11px;
1232
+ pointer-events: none;
1233
+ }
1234
+ .cm-line.cm-save-dirty::after { color: var(--accent); }
1235
+ .cm-line.cm-save-saved::after { color: var(--ok); }
1236
+ /* 仅隐藏带提示空行的 br,避免伪元素另起一行;行高由 strut 保持。 */
1237
+ .cm-line[data-save-hint] > br:only-child { display: none; }
1238
+
1239
+ /* hover 与 active 通过行装饰覆盖整块。 */
1240
+ .cm-block-hover { background-image: linear-gradient(color-mix(in srgb, var(--ink) 4%, transparent) 0 100%); }
1241
+ .cm-block-active {
1242
+ background-image: linear-gradient(color-mix(in srgb, var(--accent) 6%, transparent) 0 100%);
1243
+ }
1244
+
1245
+ /* 块标签使用矩形与固定高度三角形;三角形向内重叠 1px 以覆盖舍入误差。 */
1246
+ .prefix-flags { position: relative; flex: 0 0 158px; }
1247
+ .prefix-flag {
1248
+ position: absolute;
1249
+ left: 0;
1250
+ right: 9px;
1251
+ z-index: 1;
1252
+ display: flex;
1253
+ align-items: center;
1254
+ box-sizing: border-box;
1255
+ min-height: 24px;
1256
+ padding: 4px 8px 4px 9px;
1257
+ background: var(--sheet-3);
1258
+ color: var(--ink-soft);
1259
+ transform: translateY(-50%);
1260
+ font-size: 10.5px;
1261
+ line-height: 1.35;
1262
+ }
1263
+ .prefix-flag::after {
1264
+ content: '';
1265
+ position: absolute;
1266
+ top: 50%;
1267
+ left: 100%;
1268
+ width: 10px;
1269
+ height: 20px;
1270
+ margin-left: -1px;
1271
+ transform: translateY(-50%);
1272
+ background: inherit;
1273
+ clip-path: polygon(0 0, 100% 50%, 0 100%);
1274
+ }
1275
+
1276
+ .prefix-flag:hover { z-index: 5; }
1277
+ .prefix-flag-text { overflow-wrap: break-word; }
1278
+ .prefix-flag.tone-persona {
1279
+ background: color-mix(in srgb, var(--accent) 26%, var(--sheet));
1280
+ color: var(--accent);
1281
+ }
1282
+ .prefix-flag.tone-world {
1283
+ background: color-mix(in srgb, var(--ok) 26%, var(--sheet));
1284
+ color: var(--ok);
1285
+ }
1286
+ .prefix-flag.flag-readonly { color: var(--ink-dim); }
1287
+
1288
+
1289
+ .prefix-host .cm-lineNumbers .cm-gutterElement {
1290
+ padding: 0 8px 0 10px;
1291
+ color: var(--ink-dim);
1292
+ font-size: 11px;
1293
+ }
1294
+
1295
+
1296
+ .prefix-rail { position: relative; flex: 0 0 190px; }
1297
+ .prefix-railcell {
1298
+ position: absolute;
1299
+ left: 0;
1300
+ right: 0;
1301
+ display: flex;
1302
+ flex-direction: column;
1303
+ align-items: flex-start;
1304
+ gap: 6px;
1305
+ padding-top: 4px;
1306
+ }
1307
+ .prefix-railnote { color: var(--ink-dim); font-size: 11px; }
1308
+ .prefix-railwarn { color: var(--warn); font-size: 11px; overflow-wrap: anywhere; }
1309
+ .varchip { max-width: 100%; font-size: 11.5px; overflow-wrap: anywhere; text-align: left; }
1310
+ .varchip-unused { opacity: .5; }
1311
+
1312
+ /*
1313
+ * 浮层通过 right: 100% 向左展开,避免遮挡触发 chip,使再次点击能够关闭。
1314
+ */
1315
+ .varpop {
1316
+ position: absolute;
1317
+ right: 100%;
1318
+ top: 0;
1319
+ z-index: 30;
1320
+ width: 320px;
1321
+ margin-right: 10px;
1322
+ padding: 12px 14px;
1323
+ border: 1px solid var(--border-strong, var(--border));
1324
+ background: var(--sheet);
1325
+ box-shadow: 0 8px 28px rgb(0 0 0 / 28%);
1326
+ }
1327
+ .varpop-name { font-size: 12px; font-weight: 600; }
1328
+ .varpop-desc { margin: 6px 0 10px; color: var(--ink-soft); font-size: 12px; }
1329
+ .varpop-label { color: var(--ink-soft); font-size: 10.5px; letter-spacing: .04em; }
1330
+ .varpop-value {
1331
+ max-height: 200px;
1332
+ overflow: auto;
1333
+ margin: 4px 0 0;
1334
+ padding: 6px 8px;
1335
+ background: var(--sheet-2);
1336
+ font-size: 11.5px;
1337
+ white-space: pre-wrap;
1338
+ }
1339
+ .iogrid { align-items: stretch; gap: 12px; }
1340
+ .iogrid > .sheet { display: flex; min-width: 0; flex-direction: column; position: relative; }
1341
+
1342
+ .iogrid > .sheet > h3 { padding-right: 104px; }
1343
+ .iocorner { position: absolute; top: 10px; right: 12px; display: flex; gap: 2px; }
1344
+ .iobtn {
1345
+ width: 30px;
1346
+ height: 30px;
1347
+ display: grid;
1348
+ place-items: center;
1349
+ padding: 0;
1350
+ border: 0;
1351
+ border-radius: var(--radius-md);
1352
+ background: transparent;
1353
+ color: var(--muted-foreground);
1354
+ cursor: pointer;
1355
+ transition: background-color .15s ease, color .15s ease;
1356
+ }
1357
+ .iobtn:hover:not(:disabled) { background: var(--hover); color: var(--foreground); }
1358
+ .iobtn:disabled { opacity: .35; cursor: default; }
1359
+ .iobtn .icon { width: 16px; height: 16px; }
1360
+ .iobtn-visible { color: var(--accent); }
1361
+ .iobtn-start { color: var(--accent); }
1362
+
1363
+ .iobtn-stop:hover:not(:disabled) {
1364
+ background: color-mix(in srgb, var(--danger) 12%, transparent);
1365
+ color: var(--danger);
1366
+ }
1367
+ .iogrid > .sheet > .sheetbody { display: flex; flex: 1; min-height: 0; flex-direction: column; }
1368
+ .iogrid .actionbar { margin-top: auto; margin-bottom: 0; }
1369
+
1370
+ .statgrid, .usagecards {
1371
+ grid-template-columns: repeat(4, minmax(0, 1fr));
1372
+ gap: 18px 28px;
1373
+ }
1374
+ .usagecards {
1375
+ margin-bottom: 0;
1376
+ }
1377
+ .usagecontrols {
1378
+ display: flex;
1379
+ flex-direction: column;
1380
+ gap: 10px;
1381
+ margin-top: 24px;
1382
+ padding-bottom: 18px;
1383
+ border-bottom: 1px solid var(--border);
1384
+ }
1385
+ .usagecontrols .usagebar { margin-bottom: 0; }
1386
+ .usagecontrols + .usagecards { margin-top: 24px; }
1387
+ .stat {
1388
+ min-width: 0;
1389
+ min-height: 0;
1390
+ padding: 0;
1391
+ background: transparent;
1392
+ border: 0;
1393
+ border-radius: 0;
1394
+ box-shadow: none;
1395
+ }
1396
+ .stat .v { margin-top: 0; overflow-wrap: anywhere; font-family: var(--sans); font-weight: 600; letter-spacing: -.025em; }
1397
+ .stat .v small {
1398
+ display: block;
1399
+ margin-top: 3px;
1400
+ line-height: 1.35;
1401
+ }
1402
+ .strow {
1403
+ margin: 0;
1404
+ padding: 12px 0;
1405
+ background: transparent;
1406
+ border: 0;
1407
+ border-top: 1px solid var(--border);
1408
+ border-radius: 0;
1409
+ box-shadow: none;
1410
+ }
1411
+
1412
+ .btn {
1413
+ min-height: 34px;
1414
+ padding: 6px 11px;
1415
+ background: transparent;
1416
+ color: var(--muted-foreground);
1417
+ border: 1px solid transparent;
1418
+ border-radius: var(--radius-md);
1419
+ box-shadow: none;
1420
+ }
1421
+ .btn:hover { background: var(--hover); color: var(--foreground); border-color: transparent; box-shadow: none; }
1422
+ .btn.primary { background: var(--accent); border-color: var(--accent); color: var(--on-accent); }
1423
+ .btn.primary:hover { background: color-mix(in srgb, var(--accent) 90%, var(--ink)); filter: none; }
1424
+ :root[data-theme-scheme="mint"] .btn.primary {
1425
+ background: color-mix(in srgb, var(--accent) 78%, var(--sheet-2));
1426
+ border-color: color-mix(in srgb, var(--accent) 78%, var(--sheet-2));
1427
+ }
1428
+ :root[data-theme-scheme="mint"] .btn.primary:hover {
1429
+ background: color-mix(in srgb, var(--accent) 86%, var(--sheet-2));
1430
+ border-color: color-mix(in srgb, var(--accent) 86%, var(--sheet-2));
1431
+ }
1432
+ .btn.danger { color: var(--danger); border: 0; }
1433
+ .btn.danger:hover { background: color-mix(in srgb, var(--danger) 8%, transparent); }
1434
+
1435
+ input.field, select.field, textarea.field {
1436
+ background: var(--surface);
1437
+ border-color: var(--border);
1438
+ border-radius: var(--radius-md);
1439
+ font-family: var(--sans);
1440
+ font-size: 13px;
1441
+ }
1442
+ input.field:focus, select.field:focus, textarea.field:focus { border-color: var(--border-strong); }
1443
+ .fieldrow .fieldlabel { margin-bottom: 6px; color: var(--muted-foreground); font-size: 11px; letter-spacing: 0; text-transform: none; }
1444
+ .segwrap { gap: 2px; padding: 2px; background: var(--surface-hover); border: 0; border-radius: var(--radius-md); }
1445
+ .seg { border: 0; border-radius: calc(var(--radius-md) - 2px); background: transparent; }
1446
+ .seg.active { background: var(--surface); color: var(--foreground); }
1447
+ .pill, .chip { background: transparent; border-color: var(--border); }
1448
+
1449
+ .tablewrap, .logview {
1450
+ background: color-mix(in srgb, var(--surface) 62%, transparent);
1451
+ border-color: var(--border);
1452
+ border-radius: var(--radius-lg);
1453
+ box-shadow: none;
1454
+ }
1455
+ .tablewrap { overflow: auto; }
1456
+ table.data th { background: var(--surface-hover); border-color: var(--border); }
1457
+ table.data td, .logline { border-color: color-mix(in srgb, var(--border) 65%, transparent); }
1458
+ .logview.conversation { padding: 8px 2px; background: transparent; border: 0; }
1459
+ .logview.conversation .logline {
1460
+ padding: 7px 10px;
1461
+ border: 0;
1462
+ color: var(--foreground);
1463
+ font: 14.5px/1.62 var(--sans);
1464
+ }
1465
+ .logview.conversation .logline.dim { color: var(--muted-foreground); }
1466
+
1467
+ .tlscroll { padding: 24px 32px 18px; }
1468
+ .tlinner { max-width: var(--conversation-width); gap: 18px; }
1469
+ .tcard { padding: 2px 0; background: transparent; border: 0; border-radius: 0; box-shadow: none; }
1470
+ .turn { background: transparent; border: 0; }
1471
+ .gcol { gap: 12px; }
1472
+ .gutter { background: var(--surface-hover); border-color: var(--border); }
1473
+ .turnbody { gap: 12px; }
1474
+ .turnhead .badge { color: var(--muted-foreground); border-color: var(--border); }
1475
+ .turnraw pre.mono { border-color: var(--border); }
1476
+ .syscard, .standalone {
1477
+ padding: 10px 12px;
1478
+ background: color-mix(in srgb, var(--surface-hover) 72%, transparent);
1479
+ border: 1px solid var(--border);
1480
+ border-radius: var(--radius-md);
1481
+ }
1482
+ .toolcall {
1483
+ padding: 10px 12px;
1484
+ background: color-mix(in srgb, var(--surface-hover) 72%, transparent);
1485
+ border: 1px solid var(--border);
1486
+ border-radius: 4px 15px 15px 15px;
1487
+ }
1488
+ .toolcall.evframe { border: 2px dashed color-mix(in srgb, var(--border-strong) 70%, transparent); }
1489
+ .world { padding: 10px 14px; border: 0; border-radius: 15px 4px 15px 15px; }
1490
+ .monolog { border: 0; border-radius: 4px 15px 15px 15px; }
1491
+ .liveband {
1492
+ width: 100%;
1493
+ max-width: calc(var(--content-width) + var(--page-gutter) + var(--page-gutter));
1494
+ margin-inline: auto;
1495
+ padding: 12px var(--page-gutter) 10px;
1496
+ border-color: var(--border);
1497
+ align-items: stretch;
1498
+ flex-direction: column;
1499
+ gap: 7px;
1500
+ }
1501
+ .live-summary { display: flex; min-width: 0; align-items: center; gap: 10px; }
1502
+ .live-summary .grow { flex: 1; }
1503
+ .live-summary .chips { gap: 2px 10px; }
1504
+ .live-summary .chip,
1505
+ .live-summary .pill { padding: 2px 0; border: 0; background: transparent; }
1506
+ .liveband .sesscards {
1507
+ width: 100%;
1508
+ margin-left: 0;
1509
+ padding-bottom: 2px;
1510
+ flex-wrap: nowrap;
1511
+ overflow-x: auto;
1512
+ scrollbar-width: none;
1513
+ }
1514
+ .liveband .sesscards::-webkit-scrollbar { display: none; }
1515
+ .liveband .sesscard { padding: 4px 8px; background: transparent; border-color: transparent; }
1516
+ .liveband .sesscard:hover,
1517
+ .liveband .sesscard.sel { background: var(--hover); border-color: var(--border); }
1518
+
1519
+ .prompt-input-host { width: min(100%, var(--conversation-width)); margin: 18px auto 0; }
1520
+ .prompt-input-host textarea:focus-visible { outline: none; }
1521
+ .liveview > .prompt-input-host {
1522
+ position: absolute;
1523
+ bottom: 0;
1524
+ left: 50%;
1525
+ z-index: 12;
1526
+ width: min(
1527
+ calc(100% - 64px + var(--radius-composer) + var(--radius-composer)),
1528
+ calc(var(--conversation-width) + var(--radius-composer) + var(--radius-composer))
1529
+ );
1530
+ margin: 0;
1531
+ padding: 10px 0 18px;
1532
+ transform: translateX(calc(-50% - 5px));
1533
+ }
1534
+ .liveview > .prompt-input-host > form { position: relative; background: color-mix(in srgb, var(--surface) 94%, transparent); }
1535
+ .liveview .tlscroll { padding-bottom: 154px; }
1536
+
1537
+ .settings-layout {
1538
+ display: grid;
1539
+ grid-template-columns: 150px minmax(0, 1fr);
1540
+ gap: 34px;
1541
+ margin-top: 28px;
1542
+ }
1543
+ .settings-index {
1544
+ position: sticky;
1545
+ top: 0;
1546
+ display: flex;
1547
+ align-self: start;
1548
+ flex-direction: column;
1549
+ gap: 2px;
1550
+ }
1551
+ .settings-jump {
1552
+ width: 100%;
1553
+ padding: 7px 9px;
1554
+ border: 0;
1555
+ border-radius: var(--radius-md);
1556
+ background: transparent;
1557
+ color: var(--muted-foreground);
1558
+ text-align: left;
1559
+ font-size: 13px;
1560
+ cursor: pointer;
1561
+ }
1562
+ .settings-jump:hover { background: var(--hover); color: var(--foreground); }
1563
+ .settings-jump.active { background: color-mix(in srgb, var(--foreground) 5%, transparent); color: var(--foreground); font-weight: 550; }
1564
+ .settings-section { display: none; }
1565
+ .settings-section.active { display: block; }
1566
+ .settings-section-head h2 { margin: 0; font: 600 18px/1.35 var(--sans); letter-spacing: -.02em; }
1567
+ .settings-section-head p { max-width: 64ch; margin: 5px 0 20px; color: var(--muted-foreground); font-size: 13px; }
1568
+ .settings-section-body > .sheet:first-child { padding-top: 0; border-top: 0; }
1569
+ .settings-section-body > .prompt-toolbar:first-child { margin-top: 0; }
1570
+
1571
+ /* Provider 页:左侧次级菜单是供应模块清单,右侧是嵌入的控制台页宿主(页头 + 面板槽)。
1572
+ 宿主自带的整页内边距与滚动在这里让位给外层页面。 */
1573
+ .providerhub-jump { display: flex; align-items: center; gap: 8px; }
1574
+ .providerhub-jump .lbl { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1575
+ .providerhub .settings-content { min-width: 0; }
1576
+ .providerhub .providerchrome,
1577
+ .providerhub .panelslot { display: block; flex: none; padding: 0; overflow: visible; container: none; }
1578
+ .providerhub .panelslot { margin-top: 22px; }
1579
+ .providerhub .providerchrome > *,
1580
+ .providerhub .panelslot > :not(.viewport-overlay) { max-width: none; }
1581
+ .providerhub .providerintro .pagetitle { margin: 0; font-size: 18px; }
1582
+ .providerhub .providerintro .pagedesc { margin-top: 4px; }
1583
+ .providerhub .providerintro .rowbar { margin-top: 10px; }
1584
+
1585
+ .avatar-editor { display: flex; flex-direction: column; align-items: center; gap: 18px; }
1586
+ .avatar-canvas {
1587
+ width: min(100%, 300px);
1588
+ height: auto;
1589
+ border: 1px solid var(--border);
1590
+ border-radius: 50%;
1591
+ background: var(--surface-hover);
1592
+ cursor: grab;
1593
+ touch-action: none;
1594
+ }
1595
+ .avatar-canvas:active { cursor: grabbing; }
1596
+ .avatar-zoom-row { width: min(100%, 300px); display: grid; grid-template-columns: auto 1fr; gap: 14px; align-items: center; color: var(--muted-foreground); font-size: 13px; }
1597
+ .avatar-zoom { width: 100%; accent-color: var(--accent); }
1598
+ .avatar-note { max-width: 42ch; margin: 0; color: var(--muted-foreground); font-size: 12.5px; text-align: center; }
1599
+ .avatar-editor .actionbar { width: 100%; }
1600
+ .modalcard, .ctxpanel, .u-tip {
1601
+ border-color: var(--border);
1602
+ border-radius: var(--radius-lg);
1603
+ box-shadow: 0 18px 48px -28px var(--shadow-strong);
1604
+ }
1605
+ .tool-schema-card, .tool-schema-card[open], .theme-scheme, .theme-scheme.active { box-shadow: none; }
1606
+ .tool-schema-card, .theme-scheme { border-radius: var(--radius-md); }
1607
+ .tool-schema-card:hover, .theme-scheme:hover { transform: none; box-shadow: none; background: var(--surface-hover); }
1608
+
1609
+ @media (max-width: 900px) {
1610
+ #rail { width: 232px; }
1611
+ .pagehead, .scroll, .subtabs, .liveband, .tlscroll { padding-left: 20px; padding-right: 20px; }
1612
+ .settings-layout { grid-template-columns: minmax(0, 1fr); gap: 20px; }
1613
+ .settings-index { position: static; flex-direction: row; overflow-x: auto; }
1614
+ .settings-jump { width: auto; white-space: nowrap; }
1615
+ }
1616
+
1617
+ @media (max-width: 720px) {
1618
+ #rail { width: 100%; border-bottom: 1px solid var(--border); }
1619
+ #kernel-root { height: calc(100dvh - 54px); margin: 0; border-radius: 0; }
1620
+ nav.stack { padding: 7px 8px; }
1621
+ .navgroup { display: contents; }
1622
+ .navitem { min-height: 36px; }
1623
+ .navgroup-provider .navitem { padding: 7px 11px; }
1624
+ .pagehead { padding-top: 22px; }
1625
+ .sheet { padding-block: 18px; }
1626
+ .prompt-input-host { margin-top: 14px; }
1627
+ }
1628
+
1629
+ @container console-content (max-width: 720px) {
1630
+ .statgrid,
1631
+ .usagecards { grid-template-columns: repeat(2, minmax(0, 1fr)); }
1632
+
1633
+ .usagetables,
1634
+ .theme-workbench { grid-template-columns: minmax(0, 1fr); }
1635
+ .theme-preview-sheet { position: static; }
1636
+ }
1637
+
1638
+ @container console-content (max-width: 560px) {
1639
+ .iogrid { grid-template-columns: minmax(0, 1fr); }
1640
+
1641
+ .tool-schema-summary { grid-template-columns: minmax(0, 1fr) auto; gap: 5px 8px; }
1642
+ .tool-schema-title { grid-column: 1; }
1643
+ .tool-schema-short { grid-column: 1 / -1; grid-row: 2; padding-left: 24px; }
1644
+ .tool-schema-summary .pill { grid-column: 2; grid-row: 1; }
1645
+
1646
+ .forkbanner {
1647
+ align-items: flex-start;
1648
+ flex-direction: column;
1649
+ }
1650
+ .forkbanner > span { min-width: 0; overflow-wrap: anywhere; }
1651
+
1652
+ .trow {
1653
+ grid-template-columns: minmax(0, 1fr);
1654
+ gap: 7px;
1655
+ align-items: stretch;
1656
+ padding: 14px 0;
1657
+ }
1658
+ .trow .tdesc { line-height: 1.5; }
1659
+
1660
+ .strow {
1661
+ display: grid;
1662
+ grid-template-columns: minmax(0, 1fr) auto;
1663
+ gap: 8px 12px;
1664
+ align-items: center;
1665
+ }
1666
+ .strow .stinfo { grid-column: 1 / -1; }
1667
+ .strow .stloc { display: block; margin: 3px 0 0; overflow-wrap: anywhere; }
1668
+
1669
+ .mountrow {
1670
+ display: grid;
1671
+ grid-template-columns: auto minmax(0, 1fr) auto;
1672
+ gap: 7px 9px;
1673
+ align-items: center;
1674
+ padding: 12px 0;
1675
+ }
1676
+ .mountrow .mname { width: auto; }
1677
+ .mountrow .mdetail,
1678
+ .mountrow .macts { grid-column: 2 / -1; }
1679
+ .mountrow .mdetail { white-space: normal; overflow-wrap: anywhere; }
1680
+ .mountrow .macts { flex-wrap: wrap; }
1681
+
1682
+ .usagebar { gap: 8px; }
1683
+ .usagebar > .grow { display: none; }
1684
+ }
1685
+
1686
+ @container console-content (max-width: 380px) {
1687
+ .statgrid,
1688
+ .usagecards { grid-template-columns: minmax(0, 1fr); }
1689
+ }
1690
+
1691
+ /* 开场引导:终端页时间线上方那一组 Cortico 气泡。 */
1692
+ .onboarding { padding: 4px 0 14px; }
1693
+ .ob-grid {
1694
+ display: grid;
1695
+ grid-template-columns: 32px minmax(0, 1fr);
1696
+ column-gap: 10px;
1697
+ align-items: start;
1698
+ width: min(100%, var(--conversation-width));
1699
+ margin: 0 auto;
1700
+ }
1701
+ .ob-mark { color: var(--foreground); }
1702
+ .ob-mark .brandmark { width: 19px; height: 19px; }
1703
+ .ob-col { display: flex; flex-direction: column; gap: 12px; min-width: 0; }
1704
+ .ob-who { font: 600 12px/1 var(--sans); color: var(--muted-foreground); }
1705
+ .ob-state { margin-top: 6px; font: 12.5px/1.4 var(--sans); color: color-mix(in srgb, var(--bubble-ink) 62%, transparent); }
1706
+ .ob-state.ok { color: var(--ok); }
1707
+ .ob-state.bad { color: var(--danger); }
1708
+ .ob-acts { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-top: 8px; }
1709
+ .onboarding .monolog { max-width: 100%; }
1710
+ .ob-btn { display: inline-flex; align-items: center; gap: 6px; padding: 8px 14px; transition: background .15s ease, filter .15s ease; }
1711
+ .ob-btn:hover:not(:disabled) { background: var(--hover); }
1712
+ .ob-btn .icon { width: 14px; height: 14px; }
1713
+ .ob-btn:disabled { opacity: .55; cursor: not-allowed; }
1714
+ .ob-btn.ob-go { background: var(--accent); color: var(--on-accent); }
1715
+ .ob-btn.ob-go:hover:not(:disabled) { filter: brightness(1.06); }