synabun 2.0.9 → 2.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 (679) hide show
  1. package/CHANGELOG.md +115 -0
  2. package/README.md +25 -2
  3. package/THIRD-PARTY-LICENSES.md +68 -4
  4. package/bin/synabun.js +71 -24
  5. package/docs/whatsapp.md +2 -2
  6. package/hooks/claude-code/pre-websearch.mjs +12 -1
  7. package/hooks/claude-code/shared.mjs +5 -0
  8. package/hooks/claude-code/stop.mjs +1 -1
  9. package/launcher.mjs +9 -3
  10. package/lib/claude-hooks.js +172 -18
  11. package/lib/client-config-repair.js +17 -8
  12. package/lib/desktop-app.js +7 -1
  13. package/lib/external-tools.js +1 -1
  14. package/lib/first-launch-protection.js +57 -12
  15. package/lib/mcp-dist.js +176 -0
  16. package/lib/release-npm-ci.mjs +138 -0
  17. package/lib/release-publish.mjs +91 -0
  18. package/lib/release-scan.mjs +50 -0
  19. package/lib/server-crash-record.js +123 -0
  20. package/lib/server-exit.js +318 -0
  21. package/lib/server-supervisor.js +508 -0
  22. package/lib/start-launcher.js +43 -5
  23. package/lib/tools-cli.js +45 -0
  24. package/lib/update-snapshot.js +228 -0
  25. package/lib/virustotal.mjs +192 -0
  26. package/lib/windows-crash-event.js +269 -0
  27. package/mcp-server/dist/http.d.ts +20 -1
  28. package/mcp-server/dist/http.d.ts.map +1 -1
  29. package/mcp-server/dist/http.js +59 -12
  30. package/mcp-server/dist/http.js.map +1 -1
  31. package/mcp-server/dist/index.d.ts +33 -27
  32. package/mcp-server/dist/index.d.ts.map +1 -1
  33. package/mcp-server/dist/index.js +128 -143
  34. package/mcp-server/dist/index.js.map +1 -1
  35. package/mcp-server/dist/preload.js +1 -1
  36. package/mcp-server/dist/preload.js.map +1 -1
  37. package/mcp-server/dist/services/codex-config-heal.d.ts +6 -2
  38. package/mcp-server/dist/services/codex-config-heal.d.ts.map +1 -1
  39. package/mcp-server/dist/services/codex-config-heal.js +81 -28
  40. package/mcp-server/dist/services/codex-config-heal.js.map +1 -1
  41. package/mcp-server/dist/services/memory-judge-backfill.d.ts +6 -0
  42. package/mcp-server/dist/services/memory-judge-backfill.d.ts.map +1 -1
  43. package/mcp-server/dist/services/memory-judge-backfill.js +7 -1
  44. package/mcp-server/dist/services/memory-judge-backfill.js.map +1 -1
  45. package/mcp-server/dist/services/neural-interface.d.ts +16 -10
  46. package/mcp-server/dist/services/neural-interface.d.ts.map +1 -1
  47. package/mcp-server/dist/services/neural-interface.js +67 -11
  48. package/mcp-server/dist/services/neural-interface.js.map +1 -1
  49. package/mcp-server/dist/services/server-instructions.d.ts +7 -2
  50. package/mcp-server/dist/services/server-instructions.d.ts.map +1 -1
  51. package/mcp-server/dist/services/server-instructions.js +20 -62
  52. package/mcp-server/dist/services/server-instructions.js.map +1 -1
  53. package/mcp-server/dist/services/tool-catalog.d.ts +120 -0
  54. package/mcp-server/dist/services/tool-catalog.d.ts.map +1 -0
  55. package/mcp-server/dist/services/tool-catalog.js +339 -0
  56. package/mcp-server/dist/services/tool-catalog.js.map +1 -0
  57. package/mcp-server/dist/services/tool-list-refresh-barrier.d.ts +12 -0
  58. package/mcp-server/dist/services/tool-list-refresh-barrier.d.ts.map +1 -0
  59. package/mcp-server/dist/services/tool-list-refresh-barrier.js +40 -0
  60. package/mcp-server/dist/services/tool-list-refresh-barrier.js.map +1 -0
  61. package/mcp-server/dist/services/tool-list.d.ts +108 -0
  62. package/mcp-server/dist/services/tool-list.d.ts.map +1 -0
  63. package/mcp-server/dist/services/tool-list.js +334 -0
  64. package/mcp-server/dist/services/tool-list.js.map +1 -0
  65. package/mcp-server/dist/services/tool-runtime.d.ts +161 -0
  66. package/mcp-server/dist/services/tool-runtime.d.ts.map +1 -0
  67. package/mcp-server/dist/services/tool-runtime.js +400 -0
  68. package/mcp-server/dist/services/tool-runtime.js.map +1 -0
  69. package/mcp-server/dist/services/whiteboard-geometry.d.ts +26 -2
  70. package/mcp-server/dist/services/whiteboard-geometry.d.ts.map +1 -1
  71. package/mcp-server/dist/services/whiteboard-geometry.js +91 -8
  72. package/mcp-server/dist/services/whiteboard-geometry.js.map +1 -1
  73. package/mcp-server/dist/tools/agents.d.ts +10 -10
  74. package/mcp-server/dist/tools/agents.d.ts.map +1 -1
  75. package/mcp-server/dist/tools/agents.js +22 -13
  76. package/mcp-server/dist/tools/agents.js.map +1 -1
  77. package/mcp-server/dist/tools/browser-batch.d.ts +3 -3
  78. package/mcp-server/dist/tools/image-tools.d.ts +1 -1
  79. package/mcp-server/dist/tools/image-tools.js +1 -1
  80. package/mcp-server/dist/tools/skill-tools.d.ts +505 -0
  81. package/mcp-server/dist/tools/skill-tools.d.ts.map +1 -0
  82. package/mcp-server/dist/tools/skill-tools.js +639 -0
  83. package/mcp-server/dist/tools/skill-tools.js.map +1 -0
  84. package/mcp-server/dist/tools/skill.d.ts +7 -0
  85. package/mcp-server/dist/tools/skill.d.ts.map +1 -0
  86. package/mcp-server/dist/tools/skill.js +11 -0
  87. package/mcp-server/dist/tools/skill.js.map +1 -0
  88. package/mcp-server/dist/tools/tool-groups.d.ts +68 -0
  89. package/mcp-server/dist/tools/tool-groups.d.ts.map +1 -0
  90. package/mcp-server/dist/tools/tool-groups.js +147 -0
  91. package/mcp-server/dist/tools/tool-groups.js.map +1 -0
  92. package/mcp-server/dist/tools/whiteboard-format.d.ts.map +1 -1
  93. package/mcp-server/dist/tools/whiteboard-format.js +7 -4
  94. package/mcp-server/dist/tools/whiteboard-format.js.map +1 -1
  95. package/mcp-server/dist/tools/whiteboard-tools.d.ts +64 -13
  96. package/mcp-server/dist/tools/whiteboard-tools.d.ts.map +1 -1
  97. package/mcp-server/dist/tools/whiteboard-tools.js +30 -5
  98. package/mcp-server/dist/tools/whiteboard-tools.js.map +1 -1
  99. package/mcp-server/package-lock.json +2 -2
  100. package/mcp-server/package.json +1 -1
  101. package/mcp-server/src/http.ts +75 -12
  102. package/mcp-server/src/index.ts +147 -154
  103. package/mcp-server/src/preload.ts +12 -12
  104. package/mcp-server/src/services/codex-config-heal.ts +80 -29
  105. package/mcp-server/src/services/memory-judge-backfill.ts +7 -1
  106. package/mcp-server/src/services/neural-interface.ts +79 -20
  107. package/mcp-server/src/services/server-instructions.ts +27 -63
  108. package/mcp-server/src/services/tool-catalog.ts +403 -0
  109. package/mcp-server/src/services/tool-list-refresh-barrier.ts +33 -0
  110. package/mcp-server/src/services/tool-list.ts +410 -0
  111. package/mcp-server/src/services/tool-runtime.ts +457 -0
  112. package/mcp-server/src/services/whiteboard-geometry.ts +94 -9
  113. package/mcp-server/src/tools/agents.ts +22 -14
  114. package/mcp-server/src/tools/image-tools.ts +1 -1
  115. package/mcp-server/src/tools/skill-tools.ts +589 -0
  116. package/mcp-server/src/tools/skill.ts +13 -0
  117. package/mcp-server/src/tools/tool-groups.ts +164 -0
  118. package/mcp-server/src/tools/whiteboard-format.ts +9 -3
  119. package/mcp-server/src/tools/whiteboard-tools.ts +39 -5
  120. package/neural-interface/i18n/en.json +3680 -206
  121. package/neural-interface/i18n/pt-BR.json +3628 -157
  122. package/neural-interface/lib/account-usage.js +5 -3
  123. package/neural-interface/lib/app-controls-api.js +161 -0
  124. package/neural-interface/lib/assistant-api.js +148 -35
  125. package/neural-interface/lib/assistant-brains/claude.js +4 -3
  126. package/neural-interface/lib/assistant-brains/codex-browser-policy-hook.mjs +12 -2
  127. package/neural-interface/lib/assistant-brains/codex-route-gate-hook.mjs +32 -9
  128. package/neural-interface/lib/assistant-brains/codex.js +9 -5
  129. package/neural-interface/lib/assistant-brains/opencode.js +122 -44
  130. package/neural-interface/lib/assistant-brains/opencode2-browser-policy/index.js +59 -0
  131. package/neural-interface/lib/assistant-brains/opencode2-route-gate/index.js +97 -0
  132. package/neural-interface/lib/assistant-catalog.js +23 -9
  133. package/neural-interface/lib/assistant-dispatch.js +874 -156
  134. package/neural-interface/lib/assistant-envelope.js +22 -2
  135. package/neural-interface/lib/assistant-persona.js +80 -11
  136. package/neural-interface/lib/assistant-plan-permissions.js +10 -9
  137. package/neural-interface/lib/assistant-route-gate-codex.js +3 -0
  138. package/neural-interface/lib/assistant-route-gate.js +6 -4
  139. package/neural-interface/lib/assistant-router.js +13 -8
  140. package/neural-interface/lib/assistant-runtime.js +183 -26
  141. package/neural-interface/lib/assistant-task-prompt.js +78 -14
  142. package/neural-interface/lib/assistant-tools.js +51 -0
  143. package/neural-interface/lib/backup-service.js +620 -3
  144. package/neural-interface/lib/backup-zip-reader.js +10 -5
  145. package/neural-interface/lib/backup-zip-writer.js +257 -0
  146. package/neural-interface/lib/browser-execution.js +10 -2
  147. package/neural-interface/lib/browser-guard-cdp.js +83 -0
  148. package/neural-interface/lib/browser-network-guard.js +284 -0
  149. package/neural-interface/lib/browser-policy-roots.js +64 -0
  150. package/neural-interface/lib/browser-tool-policy.js +186 -31
  151. package/neural-interface/lib/claude-agent-bridge.js +4 -2
  152. package/neural-interface/lib/claude-hooks-status.js +103 -0
  153. package/neural-interface/lib/claude-model-catalog.js +64 -14
  154. package/neural-interface/lib/claude-temporary.js +5 -11
  155. package/neural-interface/lib/cli-install.js +18 -138
  156. package/neural-interface/lib/cli-resolver.js +4 -1
  157. package/neural-interface/lib/cli-update-planner.js +32 -31
  158. package/neural-interface/lib/cloudflared/tunnel.js +42 -2
  159. package/neural-interface/lib/codex-mcp-approvals.js +11 -0
  160. package/neural-interface/lib/codex-settings-schema.js +109 -47
  161. package/neural-interface/lib/codex-worker-app-server.js +172 -0
  162. package/neural-interface/lib/confined-fs.js +30 -3
  163. package/neural-interface/lib/crash-notice-api.js +98 -0
  164. package/neural-interface/lib/editor-completion-opencode.js +164 -67
  165. package/neural-interface/lib/exec-loop-command.js +4 -1
  166. package/neural-interface/lib/http-guards.js +8 -2
  167. package/neural-interface/lib/install-details.js +4 -1
  168. package/neural-interface/lib/launch-cache.js +293 -0
  169. package/neural-interface/lib/login-start.js +524 -0
  170. package/neural-interface/lib/mcp-agent-servers.js +67 -0
  171. package/neural-interface/lib/mcp-client-config.js +0 -29
  172. package/neural-interface/lib/mcp-external-servers.js +323 -0
  173. package/neural-interface/lib/{mcp-profile-refresh-coordinator.js → mcp-tools-refresh-coordinator.js} +4 -4
  174. package/neural-interface/lib/morelogin.js +30 -0
  175. package/neural-interface/lib/native-loop-providers.js +565 -50
  176. package/neural-interface/lib/native-loop-runtime.js +287 -41
  177. package/neural-interface/lib/opencode-config.js +557 -0
  178. package/neural-interface/lib/opencode-db-schema.js +58 -0
  179. package/neural-interface/lib/opencode-history.js +49 -204
  180. package/neural-interface/lib/opencode-mcp-ready.js +108 -0
  181. package/neural-interface/lib/opencode-native-boundary.js +44 -0
  182. package/neural-interface/lib/opencode-protocol.js +310 -0
  183. package/neural-interface/lib/opencode-provider-view.js +81 -0
  184. package/neural-interface/lib/opencode-runtime-config.js +32 -15
  185. package/neural-interface/lib/opencode-serve-records.js +624 -0
  186. package/neural-interface/lib/opencode-v2-client.js +53 -131
  187. package/neural-interface/lib/opencode-v2-ws-requests.js +35 -195
  188. package/neural-interface/lib/opencode-worker-activity.js +229 -0
  189. package/neural-interface/lib/opencode-worker-data.js +27 -0
  190. package/neural-interface/lib/opencode2-client.js +796 -0
  191. package/neural-interface/lib/opencode2-proxy.js +76 -0
  192. package/neural-interface/lib/opencode2-translate.js +1057 -0
  193. package/neural-interface/lib/owner-authority.js +249 -0
  194. package/neural-interface/lib/page-session.js +275 -0
  195. package/neural-interface/lib/peer-identity.js +763 -0
  196. package/neural-interface/lib/process-identity.js +361 -0
  197. package/neural-interface/lib/request-gate.js +17 -2
  198. package/neural-interface/lib/rulesets/api.js +1 -1
  199. package/neural-interface/lib/rulesets/fs-safe.js +1 -1
  200. package/neural-interface/lib/rulesets/installer.js +92 -27
  201. package/neural-interface/lib/rulesets/json-edit.js +1 -1
  202. package/neural-interface/lib/session-cache-builder.js +18 -10
  203. package/neural-interface/lib/session-title-generator.js +58 -18
  204. package/neural-interface/lib/skills/api-v2.js +495 -0
  205. package/neural-interface/lib/skills/bundle.js +418 -0
  206. package/neural-interface/lib/skills/catalog.js +294 -0
  207. package/neural-interface/lib/skills/creation-api.js +191 -0
  208. package/neural-interface/lib/skills/creation-brief.js +247 -0
  209. package/neural-interface/lib/skills/creation-sources.js +267 -0
  210. package/neural-interface/lib/skills/creation.js +843 -0
  211. package/neural-interface/lib/skills/deploy.js +564 -0
  212. package/neural-interface/lib/skills/digest.js +119 -0
  213. package/neural-interface/lib/skills/discover.js +111 -0
  214. package/neural-interface/lib/skills/draft-confinement.js +214 -0
  215. package/neural-interface/lib/skills/eval-confinement.js +397 -0
  216. package/neural-interface/lib/skills/eval-sandbox.js +280 -0
  217. package/neural-interface/lib/skills/eval-trace.js +119 -0
  218. package/neural-interface/lib/skills/evals-api.js +212 -0
  219. package/neural-interface/lib/skills/evals.js +1573 -0
  220. package/neural-interface/lib/skills/export.js +200 -0
  221. package/neural-interface/lib/skills/frontmatter.js +64 -0
  222. package/neural-interface/lib/skills/health.js +75 -0
  223. package/neural-interface/lib/skills/json-edit.js +165 -0
  224. package/neural-interface/lib/skills/known-bridge-digests.json +387 -0
  225. package/neural-interface/lib/skills/known-bridges.js +96 -0
  226. package/neural-interface/lib/skills/library.js +823 -0
  227. package/neural-interface/lib/skills/local-store.js +21 -0
  228. package/neural-interface/lib/skills/migration.js +433 -0
  229. package/neural-interface/lib/skills/operations.js +45 -0
  230. package/neural-interface/lib/skills/ownership.js +427 -0
  231. package/neural-interface/lib/skills/packages.js +88 -0
  232. package/neural-interface/lib/skills/reviews.js +212 -0
  233. package/neural-interface/lib/skills/revision.js +80 -0
  234. package/neural-interface/lib/skills/roots.js +262 -0
  235. package/neural-interface/lib/skills/runtime-checks.js +355 -0
  236. package/neural-interface/lib/skills/scan-assets.js +252 -0
  237. package/neural-interface/lib/skills/scan-context.js +26 -0
  238. package/neural-interface/lib/skills/scan-shell.js +324 -0
  239. package/neural-interface/lib/skills/scan.js +364 -0
  240. package/neural-interface/lib/skills/scanners.js +54 -0
  241. package/neural-interface/lib/skills/service.js +522 -0
  242. package/neural-interface/lib/skills/telemetry.js +113 -0
  243. package/neural-interface/lib/sqlite-integrity-worker.js +22 -0
  244. package/neural-interface/lib/style-guide/api.js +4 -3
  245. package/neural-interface/lib/tool-lists.js +124 -0
  246. package/neural-interface/lib/untrusted-file-headers.js +27 -0
  247. package/neural-interface/lib/whatsapp/bridge.js +6 -3
  248. package/neural-interface/lib/worker-confinement.js +1192 -0
  249. package/neural-interface/lib/worker-guard-setting.js +56 -0
  250. package/neural-interface/lib/worker-mcp-channel.js +175 -0
  251. package/neural-interface/lib/worker-relay-ports.js +227 -0
  252. package/neural-interface/lib/worker-resume.js +229 -0
  253. package/neural-interface/lib/worker-sandbox.js +299 -0
  254. package/neural-interface/package-lock.json +1354 -50
  255. package/neural-interface/package.json +6 -2
  256. package/neural-interface/public/index.html +5 -3
  257. package/neural-interface/public/index2d.html +19 -11
  258. package/neural-interface/public/onboarding.html +2 -2
  259. package/neural-interface/public/shared/account-menu.js +8 -5
  260. package/neural-interface/public/shared/agent-runtime-options.js +76 -16
  261. package/neural-interface/public/shared/api.js +1527 -1336
  262. package/neural-interface/public/shared/app-frame.js +192 -0
  263. package/neural-interface/public/shared/assistant/asst-agents-dock.js +205 -19
  264. package/neural-interface/public/shared/assistant/asst-api.js +11 -3
  265. package/neural-interface/public/shared/assistant/asst-ask-styles.js +270 -0
  266. package/neural-interface/public/shared/assistant/asst-ask-tail.js +118 -0
  267. package/neural-interface/public/shared/assistant/asst-ask.js +397 -0
  268. package/neural-interface/public/shared/assistant/asst-brain-picker.js +241 -112
  269. package/neural-interface/public/shared/assistant/asst-composer.js +1 -1
  270. package/neural-interface/public/shared/assistant/asst-control.js +157 -26
  271. package/neural-interface/public/shared/assistant/asst-followups-card.js +383 -0
  272. package/neural-interface/public/shared/assistant/asst-followups.js +417 -0
  273. package/neural-interface/public/shared/assistant/asst-hosts.js +49 -2
  274. package/neural-interface/public/shared/assistant/asst-limit-dock.js +40 -0
  275. package/neural-interface/public/shared/assistant/asst-limit-wait.js +294 -0
  276. package/neural-interface/public/shared/assistant/asst-limit.js +168 -0
  277. package/neural-interface/public/shared/assistant/asst-mascot.js +49 -12
  278. package/neural-interface/public/shared/assistant/asst-menu.js +84 -12
  279. package/neural-interface/public/shared/assistant/asst-panel.js +303 -44
  280. package/neural-interface/public/shared/assistant/asst-rack-styles.js +93 -58
  281. package/neural-interface/public/shared/assistant/asst-redact.js +186 -0
  282. package/neural-interface/public/shared/assistant/asst-render.js +770 -100
  283. package/neural-interface/public/shared/assistant/asst-route.js +83 -12
  284. package/neural-interface/public/shared/assistant/asst-run-stage.js +231 -0
  285. package/neural-interface/public/shared/assistant/asst-sanitize.js +193 -3
  286. package/neural-interface/public/shared/assistant/asst-scene-styles.js +273 -0
  287. package/neural-interface/public/shared/assistant/asst-scenes.js +530 -0
  288. package/neural-interface/public/shared/assistant/asst-sidepanel-styles.js +3 -15
  289. package/neural-interface/public/shared/assistant/asst-sidepanel.js +67 -4
  290. package/neural-interface/public/shared/assistant/asst-slash.js +9 -7
  291. package/neural-interface/public/shared/assistant/asst-state.js +25 -15
  292. package/neural-interface/public/shared/assistant/asst-stop.js +127 -0
  293. package/neural-interface/public/shared/assistant/asst-styles.js +102 -21
  294. package/neural-interface/public/shared/assistant/asst-tool-kinds.js +165 -13
  295. package/neural-interface/public/shared/automation-context.js +5 -2
  296. package/neural-interface/public/shared/cc-dropdown.js +550 -0
  297. package/neural-interface/public/shared/cdx/cdx-context-menu.js +10 -9
  298. package/neural-interface/public/shared/cdx/cdx-copy.js +16 -0
  299. package/neural-interface/public/shared/cdx/cdx-output-model.js +22 -1
  300. package/neural-interface/public/shared/cdx/cdx-output.js +8 -7
  301. package/neural-interface/public/shared/cdx/cdx-panel.js +58 -150
  302. package/neural-interface/public/shared/cdx/cdx-protocol.js +28 -1
  303. package/neural-interface/public/shared/cdx/cdx-render.js +62 -32
  304. package/neural-interface/public/shared/cdx/cdx-requests.js +3 -3
  305. package/neural-interface/public/shared/cdx/cdx-skill-hints.js +54 -0
  306. package/neural-interface/public/shared/cdx/cdx-styles.js +15 -3
  307. package/neural-interface/public/shared/cdx/cdx-tabs.js +201 -74
  308. package/neural-interface/public/shared/cdx/cdx-ws.js +0 -1
  309. package/neural-interface/public/shared/cli-install-view.js +4 -8
  310. package/neural-interface/public/shared/cli-status.js +2 -2
  311. package/neural-interface/public/shared/constants.js +2 -2
  312. package/neural-interface/public/shared/context-menu-areas.js +34 -0
  313. package/neural-interface/public/shared/context-menu-logic.js +243 -0
  314. package/neural-interface/public/shared/context-menu-model.js +366 -0
  315. package/neural-interface/public/shared/context-menu.js +372 -0
  316. package/neural-interface/public/shared/cp/cp-context-menu.js +10 -9
  317. package/neural-interface/public/shared/cp/cp-markdown.js +4 -57
  318. package/neural-interface/public/shared/crash-notice-view.js +168 -0
  319. package/neural-interface/public/shared/data-cache.js +223 -0
  320. package/neural-interface/public/shared/desktop-bridge.js +11 -0
  321. package/neural-interface/public/shared/desktop-titlebar-view.js +78 -1
  322. package/neural-interface/public/shared/desktop-titlebar.js +214 -28
  323. package/neural-interface/public/shared/desktop-update-view.js +35 -5
  324. package/neural-interface/public/shared/editor/editor-panel-logic.js +2 -2
  325. package/neural-interface/public/shared/file-links.js +73 -8
  326. package/neural-interface/public/shared/html-shell.js +78 -86
  327. package/neural-interface/public/shared/i18n.js +2 -0
  328. package/neural-interface/public/shared/launch-prefetch.js +59 -0
  329. package/neural-interface/public/shared/ocp-v2/ocp-v2-approvals.js +7 -7
  330. package/neural-interface/public/shared/ocp-v2/ocp-v2-binding.js +4 -4
  331. package/neural-interface/public/shared/ocp-v2/ocp-v2-caps.js +3 -2
  332. package/neural-interface/public/shared/ocp-v2/ocp-v2-changes-logic.js +3 -101
  333. package/neural-interface/public/shared/ocp-v2/ocp-v2-childpanel.js +9 -2
  334. package/neural-interface/public/shared/ocp-v2/ocp-v2-compact-button.js +1 -3
  335. package/neural-interface/public/shared/ocp-v2/ocp-v2-composer-logic.js +2 -6
  336. package/neural-interface/public/shared/ocp-v2/ocp-v2-context-menu.js +11 -11
  337. package/neural-interface/public/shared/ocp-v2/ocp-v2-context-model.js +0 -3
  338. package/neural-interface/public/shared/ocp-v2/ocp-v2-events.js +8 -4
  339. package/neural-interface/public/shared/ocp-v2/ocp-v2-manager.js +7 -7
  340. package/neural-interface/public/shared/ocp-v2/ocp-v2-modelpicker.js +54 -17
  341. package/neural-interface/public/shared/ocp-v2/ocp-v2-outcome-notifications.js +16 -0
  342. package/neural-interface/public/shared/ocp-v2/ocp-v2-panel.js +140 -254
  343. package/neural-interface/public/shared/ocp-v2/ocp-v2-plan.js +1 -2
  344. package/neural-interface/public/shared/ocp-v2/ocp-v2-projectbar.js +97 -203
  345. package/neural-interface/public/shared/ocp-v2/ocp-v2-providers.js +11 -9
  346. package/neural-interface/public/shared/ocp-v2/ocp-v2-rehydrate.js +15 -4
  347. package/neural-interface/public/shared/ocp-v2/ocp-v2-render.js +7 -22
  348. package/neural-interface/public/shared/ocp-v2/ocp-v2-send-logic.js +401 -0
  349. package/neural-interface/public/shared/ocp-v2/ocp-v2-send.js +20 -13
  350. package/neural-interface/public/shared/ocp-v2/ocp-v2-session-actions.js +8 -61
  351. package/neural-interface/public/shared/ocp-v2/ocp-v2-sessions-logic.js +53 -82
  352. package/neural-interface/public/shared/ocp-v2/ocp-v2-slash-hints.js +16 -15
  353. package/neural-interface/public/shared/ocp-v2/ocp-v2-state.js +8 -21
  354. package/neural-interface/public/shared/ocp-v2/ocp-v2-status-logic.js +1 -99
  355. package/neural-interface/public/shared/ocp-v2/ocp-v2-status.js +5 -35
  356. package/neural-interface/public/shared/ocp-v2/ocp-v2-styles.js +48 -40
  357. package/neural-interface/public/shared/ocp-v2/{ocp-v2-profile-inheritance.js → ocp-v2-tools-inheritance.js} +16 -16
  358. package/neural-interface/public/shared/ocp-v2/ocp-v2-ws.js +205 -62
  359. package/neural-interface/public/shared/opencode-providers.js +39 -0
  360. package/neural-interface/public/shared/page-session.js +96 -0
  361. package/neural-interface/public/shared/registry.js +5 -3
  362. package/neural-interface/public/shared/retired-2d.js +3 -0
  363. package/neural-interface/public/shared/schedules-view.js +452 -0
  364. package/neural-interface/public/shared/settings/settings-app-pane.js +335 -0
  365. package/neural-interface/public/shared/settings/settings-app.js +243 -0
  366. package/neural-interface/public/shared/settings/settings-claude-hooks.js +135 -0
  367. package/neural-interface/public/shared/settings/settings-data.js +90 -0
  368. package/neural-interface/public/shared/settings/settings-ia.js +23 -6
  369. package/neural-interface/public/shared/settings/settings-opencode.js +89 -0
  370. package/neural-interface/public/shared/settings/settings-skill-folders-pane.js +265 -0
  371. package/neural-interface/public/shared/settings/settings-skill-folders.js +130 -0
  372. package/neural-interface/public/shared/settings/settings-worker-guard.js +72 -0
  373. package/neural-interface/public/shared/sidepanel-session-status.js +49 -0
  374. package/neural-interface/public/shared/skills/ss-args.js +96 -0
  375. package/neural-interface/public/shared/skills/ss-creation.js +219 -0
  376. package/neural-interface/public/shared/skills/ss-dialog.js +130 -0
  377. package/neural-interface/public/shared/skills/ss-doc.js +173 -0
  378. package/neural-interface/public/shared/skills/ss-eval-adapters.js +269 -0
  379. package/neural-interface/public/shared/skills/ss-eval-grade.js +359 -0
  380. package/neural-interface/public/shared/skills/ss-eval-optimise.js +153 -0
  381. package/neural-interface/public/shared/skills/ss-eval-plan.js +315 -0
  382. package/neural-interface/public/shared/skills/ss-evals.js +417 -0
  383. package/neural-interface/public/shared/skills/ss-form.js +159 -0
  384. package/neural-interface/public/shared/skills/ss-frontmatter.js +376 -0
  385. package/neural-interface/public/shared/skills/ss-ids.js +32 -0
  386. package/neural-interface/public/shared/skills/ss-lint.js +141 -0
  387. package/neural-interface/public/shared/skills/ss-presets.js +117 -0
  388. package/neural-interface/public/shared/skills/ss-profiles.js +475 -0
  389. package/neural-interface/public/shared/skills/ss-resources.js +165 -0
  390. package/neural-interface/public/shared/skills/ss-review-view.js +190 -0
  391. package/neural-interface/public/shared/skills/ss-tabs.js +79 -0
  392. package/neural-interface/public/shared/skills/ss-unicode.js +135 -0
  393. package/neural-interface/public/shared/skills/studio/sx-actions.js +222 -0
  394. package/neural-interface/public/shared/skills/studio/sx-cm.js +101 -0
  395. package/neural-interface/public/shared/skills/studio/sx-create-ai-view.js +749 -0
  396. package/neural-interface/public/shared/skills/studio/sx-create-ai.js +236 -0
  397. package/neural-interface/public/shared/skills/studio/sx-create-view.js +254 -0
  398. package/neural-interface/public/shared/skills/studio/sx-create.js +126 -0
  399. package/neural-interface/public/shared/skills/studio/sx-diff-view.js +43 -0
  400. package/neural-interface/public/shared/skills/studio/sx-diff.js +133 -0
  401. package/neural-interface/public/shared/skills/studio/sx-docs.js +480 -0
  402. package/neural-interface/public/shared/skills/studio/sx-dom.js +229 -0
  403. package/neural-interface/public/shared/skills/studio/sx-edit-view.js +848 -0
  404. package/neural-interface/public/shared/skills/studio/sx-editor-model.js +193 -0
  405. package/neural-interface/public/shared/skills/studio/sx-errors.js +22 -0
  406. package/neural-interface/public/shared/skills/studio/sx-geometry.js +82 -0
  407. package/neural-interface/public/shared/skills/studio/sx-import.js +262 -0
  408. package/neural-interface/public/shared/skills/studio/sx-inspector.js +308 -0
  409. package/neural-interface/public/shared/skills/studio/sx-install-flow.js +279 -0
  410. package/neural-interface/public/shared/skills/studio/sx-install.js +296 -0
  411. package/neural-interface/public/shared/skills/studio/sx-library-view.js +639 -0
  412. package/neural-interface/public/shared/skills/studio/sx-library.js +475 -0
  413. package/neural-interface/public/shared/skills/studio/sx-main.js +681 -0
  414. package/neural-interface/public/shared/skills/studio/sx-operations-view.js +98 -0
  415. package/neural-interface/public/shared/skills/studio/sx-operations.js +11 -0
  416. package/neural-interface/public/shared/skills/studio/sx-plan.js +158 -0
  417. package/neural-interface/public/shared/skills/studio/sx-publish-view.js +621 -0
  418. package/neural-interface/public/shared/skills/studio/sx-review-view.js +369 -0
  419. package/neural-interface/public/shared/skills/studio/sx-review.js +148 -0
  420. package/neural-interface/public/shared/skills/studio/sx-scan.js +35 -0
  421. package/neural-interface/public/shared/skills/studio/sx-snippets.js +96 -0
  422. package/neural-interface/public/shared/skills/studio/sx-subject.js +248 -0
  423. package/neural-interface/public/shared/skills/studio/sx-test-view.js +994 -0
  424. package/neural-interface/public/shared/skills/studio/sx-test.js +328 -0
  425. package/neural-interface/public/shared/skills/studio/sx-versions-view.js +241 -0
  426. package/neural-interface/public/shared/skills/studio/sx-workspace-view.js +425 -0
  427. package/neural-interface/public/shared/styleguide/sg-panel.js +4 -2
  428. package/neural-interface/public/shared/styles.css +2065 -2150
  429. package/neural-interface/public/shared/synabun-mascot.js +1115 -9
  430. package/neural-interface/public/shared/tool-list-picker.js +55 -0
  431. package/neural-interface/public/shared/tool-list-storage.js +24 -0
  432. package/neural-interface/public/shared/tool-list-view.js +112 -0
  433. package/neural-interface/public/shared/tour/tour-actor.js +268 -0
  434. package/neural-interface/public/shared/tour/tour-beats.js +336 -0
  435. package/neural-interface/public/shared/tour/tour-engine.js +884 -0
  436. package/neural-interface/public/shared/tour/tour-ink.js +390 -0
  437. package/neural-interface/public/shared/tour/tour-stage.js +440 -0
  438. package/neural-interface/public/shared/tour/tour-state.js +40 -0
  439. package/neural-interface/public/shared/tour/tour-tips.js +99 -0
  440. package/neural-interface/public/shared/tour/tour.css +144 -0
  441. package/neural-interface/public/shared/ui-assistant.js +27 -5
  442. package/neural-interface/public/shared/ui-automation-studio.js +155 -152
  443. package/neural-interface/public/shared/ui-bookmarks.js +2 -1
  444. package/neural-interface/public/shared/ui-claude-panel.js +153 -13
  445. package/neural-interface/public/shared/ui-codex-panel.js +1 -0
  446. package/neural-interface/public/shared/ui-command-runner.js +6 -3
  447. package/neural-interface/public/shared/ui-context-menu.js +295 -0
  448. package/neural-interface/public/shared/ui-cost-widget.js +57 -59
  449. package/neural-interface/public/shared/ui-crash-notice.js +187 -0
  450. package/neural-interface/public/shared/ui-detail.js +21 -9
  451. package/neural-interface/public/shared/ui-file-links.js +1 -0
  452. package/neural-interface/public/shared/ui-image-gallery.js +56 -52
  453. package/neural-interface/public/shared/ui-invite.js +18 -2
  454. package/neural-interface/public/shared/ui-keybinds.js +26 -1
  455. package/neural-interface/public/shared/ui-link.js +9 -9
  456. package/neural-interface/public/shared/ui-menubar.js +229 -40
  457. package/neural-interface/public/shared/ui-native-loop-router-state.js +5 -0
  458. package/neural-interface/public/shared/ui-native-loop-router.js +9 -1
  459. package/neural-interface/public/shared/ui-navbar.js +4 -24
  460. package/neural-interface/public/shared/ui-opencode-panel-v2.js +1 -0
  461. package/neural-interface/public/shared/ui-panels.js +96 -65
  462. package/neural-interface/public/shared/ui-schedules-studio.js +2267 -953
  463. package/neural-interface/public/shared/ui-sessions.js +20 -7
  464. package/neural-interface/public/shared/ui-settings.js +679 -496
  465. package/neural-interface/public/shared/ui-sidebar.js +4 -4
  466. package/neural-interface/public/shared/ui-sidepanel-session-entry.js +13 -0
  467. package/neural-interface/public/shared/ui-sidepanel-sessions.js +56 -5
  468. package/neural-interface/public/shared/ui-sidepanel-state.js +23 -12
  469. package/neural-interface/public/shared/ui-sidepanel-tray.js +84 -8
  470. package/neural-interface/public/shared/ui-sidepanel-windows.js +16 -11
  471. package/neural-interface/public/shared/ui-skills.js +42 -2781
  472. package/neural-interface/public/shared/ui-styleguide.js +5 -2
  473. package/neural-interface/public/shared/ui-sync.js +22 -5
  474. package/neural-interface/public/shared/ui-terminal.js +159 -199
  475. package/neural-interface/public/shared/ui-tool-updates.js +3 -1
  476. package/neural-interface/public/shared/ui-tooltip.js +10 -5
  477. package/neural-interface/public/shared/ui-trash.js +14 -5
  478. package/neural-interface/public/shared/ui-tutorial-layout.js +3 -117
  479. package/neural-interface/public/shared/ui-tutorial-preview.js +103 -0
  480. package/neural-interface/public/shared/ui-tutorial-steps.js +3 -61
  481. package/neural-interface/public/shared/ui-tutorial.css +47 -100
  482. package/neural-interface/public/shared/ui-tutorial.js +285 -499
  483. package/neural-interface/public/shared/ui-update.js +121 -16
  484. package/neural-interface/public/shared/ui-whiteboard.js +313 -59
  485. package/neural-interface/public/shared/ui-worker-end.js +4 -0
  486. package/neural-interface/public/shared/ui-workspaces.js +3 -2
  487. package/neural-interface/public/shared/view-variant.js +66 -0
  488. package/neural-interface/public/shared/whatsapp/wa-view.js +1 -1
  489. package/neural-interface/public/shared/whiteboard-list.js +172 -0
  490. package/neural-interface/public/shared/worker-end.js +10 -3
  491. package/neural-interface/public/shared/worker-restart.js +12 -0
  492. package/neural-interface/public/sidepanel-session.html +1 -1
  493. package/neural-interface/public/variant/2d/background.js +2 -1
  494. package/neural-interface/public/variant/2d/context-menu.js +8 -2
  495. package/neural-interface/public/variant/2d/graph.js +42 -20
  496. package/neural-interface/public/variant/2d/hulls.js +14 -9
  497. package/neural-interface/public/variant/2d/lasso.js +11 -7
  498. package/neural-interface/public/variant/2d/main.js +36 -2
  499. package/neural-interface/public/variant/2d/minimap.js +11 -13
  500. package/neural-interface/public/variant/3d/main.js +72 -6
  501. package/neural-interface/public/variant/3d/map-controls.js +24 -9
  502. package/neural-interface/public/vendor/caveat/OFL.txt +93 -0
  503. package/neural-interface/public/vendor/caveat/caveat-latin-400-normal.woff2 +0 -0
  504. package/neural-interface/public/vendor/caveat/caveat-latin-700-normal.woff2 +0 -0
  505. package/neural-interface/public/vendor/caveat/caveat.css +17 -0
  506. package/neural-interface/public/vendor/caveat/manifest.json +12 -0
  507. package/neural-interface/public/vendor/highlight/LICENSE +29 -0
  508. package/neural-interface/public/vendor/highlight/github-dark-dimmed-11.12.0.min.css +9 -0
  509. package/neural-interface/public/vendor/highlight/highlight-11.12.0.min.js +1262 -0
  510. package/neural-interface/public/vendor/highlight/manifest.json +5 -0
  511. package/neural-interface/public/vendor/html2canvas/LICENSE +22 -0
  512. package/neural-interface/public/vendor/html2canvas/html2canvas-1.4.1.min.js +20 -0
  513. package/neural-interface/public/vendor/html2canvas/manifest.json +4 -0
  514. package/neural-interface/public/vendor/marked/LICENSE.md +44 -0
  515. package/neural-interface/public/vendor/marked/manifest.json +4 -0
  516. package/neural-interface/public/vendor/marked/marked-14.1.4.esm.js +2502 -0
  517. package/neural-interface/public/vendor/mermaid/LICENSE +21 -0
  518. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/abnfDiagram-PAR5IXJI.mjs +1 -0
  519. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/architecture-7GRP2DOG-M7G3SWCO.mjs +1 -0
  520. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/architectureDiagram-2PNWDENW.mjs +36 -0
  521. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/blockDiagram-PUWGUBOA.mjs +129 -0
  522. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/c4Diagram-3NLNHZP5.mjs +38 -0
  523. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-2NMSUPJH.mjs +1 -0
  524. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-32MCUW2P.mjs +206 -0
  525. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-3NPNU5GP.mjs +1 -0
  526. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-3SMGFRGC.mjs +1 -0
  527. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-4CAJECRU.mjs +14 -0
  528. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-4OADUZ5Q.mjs +10 -0
  529. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-5IMINLNL.mjs +1 -0
  530. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-5IQCK5RY.mjs +3 -0
  531. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-5MVFYWFU.mjs +1 -0
  532. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-AQ6EADP3.mjs +1 -0
  533. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-AZZRMDJM.mjs +15 -0
  534. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-CLS4B6BI.mjs +168 -0
  535. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-DZP67EKU.mjs +70 -0
  536. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-EICP7K5X.mjs +1 -0
  537. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-GDY2UAB4.mjs +1 -0
  538. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-H7VHZCWX.mjs +1 -0
  539. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-IJBDOHL6.mjs +1 -0
  540. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-JFFVMJIA.mjs +1 -0
  541. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-JQRUD6KW.mjs +1 -0
  542. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-JZGDI5JK.mjs +1 -0
  543. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-KD6SPIPN.mjs +2 -0
  544. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-NF366YI6.mjs +231 -0
  545. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-NUDPKBEF.mjs +32 -0
  546. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-OJINMHTS.mjs +1 -0
  547. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-Q6NGPIAH.mjs +2 -0
  548. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-QJSWEUOL.mjs +132 -0
  549. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-R7JDMUKV.mjs +1 -0
  550. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-RCXAM2GK.mjs +1 -0
  551. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-RT4MAWR3.mjs +1 -0
  552. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-SFMINX4W.mjs +1 -0
  553. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-SLDQ463B.mjs +88 -0
  554. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-STOV2HOB.mjs +1 -0
  555. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-T5OCTHI4.mjs +1 -0
  556. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-TCEHX7R3.mjs +1 -0
  557. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-VQC2EELJ.mjs +1 -0
  558. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-VRZKL3EH.mjs +1 -0
  559. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-VTHDQ7BV.mjs +1 -0
  560. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-VY2OSTJR.mjs +2 -0
  561. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-WUBWJARI.mjs +1 -0
  562. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-YBMQ5JGJ.mjs +2 -0
  563. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-YDMLL4PJ.mjs +1 -0
  564. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-Z6V44ARX.mjs +62 -0
  565. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-ZJJ7VQJP.mjs +339 -0
  566. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-ZNLK7HRR.mjs +1 -0
  567. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-ZQN7UHIL.mjs +1 -0
  568. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-ZS6VBONO.mjs +174 -0
  569. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-ZUNWM646.mjs +1 -0
  570. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/classDiagram-FGAMPOII.mjs +1 -0
  571. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/classDiagram-v2-AI5RJEK4.mjs +1 -0
  572. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/cose-bilkent-Q72C2OJ3.mjs +1 -0
  573. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/cynefin-OW5HDTMX-6OCTWOGG.mjs +1 -0
  574. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/cynefinDiagram-2OOWUY4M.mjs +62 -0
  575. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/dagre-MPVFI544.mjs +4 -0
  576. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/diagram-AE4NWXFW.mjs +24 -0
  577. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/diagram-BUJID5UG.mjs +41 -0
  578. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/diagram-C44CZ5NI.mjs +24 -0
  579. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/diagram-EYOLEXXS.mjs +30 -0
  580. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/diagram-P7B6PWOJ.mjs +3 -0
  581. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/ebnfDiagram-FTPZ3PV6.mjs +1 -0
  582. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/erDiagram-H3ERR26V.mjs +99 -0
  583. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/eventmodeling-NTZA5JFV-WKSWQHFS.mjs +1 -0
  584. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/flowDiagram-YHGXBVSY.mjs +1 -0
  585. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/ganttDiagram-RWFTB7ED.mjs +292 -0
  586. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/gitGraph-4MIJSDKK-JH2HKYUO.mjs +1 -0
  587. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/gitGraphDiagram-MAR6GKOP.mjs +106 -0
  588. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/info-A6RAGUB7-3TX3OFWW.mjs +1 -0
  589. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/infoDiagram-LV547AFH.mjs +2 -0
  590. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/ishikawaDiagram-PUJQGNDS.mjs +70 -0
  591. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/journeyDiagram-EW5QJT4W.mjs +139 -0
  592. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/kanban-definition-JSQERAZB.mjs +89 -0
  593. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/katex-CZ4GXH2S.mjs +257 -0
  594. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/mindmap-definition-VBJCLQLM.mjs +96 -0
  595. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/packet-AYTQ26CC-MKII6P3Y.mjs +1 -0
  596. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/pegDiagram-7WILOQTJ.mjs +1 -0
  597. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/pie-WAS4IAKB-6B4OPMJ5.mjs +1 -0
  598. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/pieDiagram-EFA7CBSB.mjs +39 -0
  599. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/quadrantDiagram-WARVYA7P.mjs +7 -0
  600. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/radar-RG4KPBEZ-UPTR3XUL.mjs +1 -0
  601. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/railroad-74A4TZTK-MEFUPFMS.mjs +1 -0
  602. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/railroad-abnf-HS5TGJTU-R5YG2S5D.mjs +1 -0
  603. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/railroad-ebnf-LZEXJU2U-G5QEX2L6.mjs +1 -0
  604. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/railroad-peg-WCYAUIDC-H5I2ZRY2.mjs +1 -0
  605. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/railroadDiagram-5NIQVNLQ.mjs +1 -0
  606. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/requirementDiagram-SXREGOKZ.mjs +84 -0
  607. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/sankeyDiagram-VV74M2VP.mjs +40 -0
  608. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/sequenceDiagram-52ZFIFDL.mjs +162 -0
  609. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/sizeCapture-FGA5AGYP.mjs +1 -0
  610. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/stateDiagram-3QAKPIVI.mjs +1 -0
  611. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/stateDiagram-v2-HN2P4RDZ.mjs +1 -0
  612. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/swimlanes-QLVP42QD.mjs +1 -0
  613. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/swimlanesDiagram-JKPDBFCN.mjs +8 -0
  614. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/timeline-definition-GS45XAXW.mjs +120 -0
  615. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/treeView-Q6P3EWNA-ZRJGANNQ.mjs +1 -0
  616. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/treemap-WGGIJYW6-K64VN5AS.mjs +1 -0
  617. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/vennDiagram-QIQU2ZRJ.mjs +34 -0
  618. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/wardley-WFR3VGLG-D67OWCCH.mjs +1 -0
  619. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/wardleyDiagram-U6YNM66N.mjs +78 -0
  620. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/xychartDiagram-XJAZEDNM.mjs +7 -0
  621. package/neural-interface/public/vendor/mermaid/manifest.json +4 -0
  622. package/neural-interface/public/vendor/mermaid/mermaid-11.17.2.esm.min.mjs +14 -0
  623. package/neural-interface/public/vendor/yaml/LICENSE +13 -0
  624. package/neural-interface/public/vendor/yaml/manifest.json +4 -0
  625. package/neural-interface/public/vendor/yaml/yaml-2.9.1.min.js +137 -0
  626. package/neural-interface/scripts/build-vendor.mjs +116 -3
  627. package/neural-interface/server.js +4834 -2541
  628. package/neural-interface/templates/rulesets/core.md +1 -1
  629. package/neural-interface/templates/rulesets/legacy-hashes.json +18 -0
  630. package/neural-interface/templates/rulesets/manifest.json +8 -8
  631. package/npm-shrinkwrap.json +18 -12
  632. package/package.json +16 -3
  633. package/postinstall.js +9 -4
  634. package/preuninstall.js +1 -1
  635. package/setup.js +97 -322
  636. package/skills/skill-forge/SKILL.md +177 -0
  637. package/skills/skill-forge/evals/evals.json +54 -0
  638. package/skills/skill-forge/references/package.md +105 -0
  639. package/skills/skill-forge/references/review-and-recovery.md +63 -0
  640. package/skills/skill-forge/references/runtime-profiles.md +20 -0
  641. package/skills/skill-forge/references/sources-and-capabilities.md +51 -0
  642. package/skills/synabun/SKILL.md +10 -7
  643. package/skills/synabun/modules/audit.md +1 -5
  644. package/skills/synabun/modules/changelog.md +1 -5
  645. package/skills/synabun/modules/idea.md +1 -1
  646. package/skills/synabun/modules/memorize.md +6 -9
  647. package/skills/synabun/modules/schedule.md +5 -5
  648. package/mcp-server/dist/services/profiles.d.ts +0 -120
  649. package/mcp-server/dist/services/profiles.d.ts.map +0 -1
  650. package/mcp-server/dist/services/profiles.js +0 -387
  651. package/mcp-server/dist/services/profiles.js.map +0 -1
  652. package/mcp-server/dist/tools/leonardo-browser-tools.d.ts +0 -97
  653. package/mcp-server/dist/tools/leonardo-browser-tools.d.ts.map +0 -1
  654. package/mcp-server/dist/tools/leonardo-browser-tools.js +0 -228
  655. package/mcp-server/dist/tools/leonardo-browser-tools.js.map +0 -1
  656. package/mcp-server/dist/tools/leonardo.d.ts +0 -13
  657. package/mcp-server/dist/tools/leonardo.d.ts.map +0 -1
  658. package/mcp-server/dist/tools/leonardo.js +0 -21
  659. package/mcp-server/dist/tools/leonardo.js.map +0 -1
  660. package/mcp-server/dist/tools/profile.d.ts +0 -17
  661. package/mcp-server/dist/tools/profile.d.ts.map +0 -1
  662. package/mcp-server/dist/tools/profile.js +0 -114
  663. package/mcp-server/dist/tools/profile.js.map +0 -1
  664. package/mcp-server/src/services/profiles.ts +0 -428
  665. package/mcp-server/src/tools/leonardo-browser-tools.ts +0 -291
  666. package/mcp-server/src/tools/leonardo.ts +0 -30
  667. package/mcp-server/src/tools/profile.ts +0 -122
  668. package/neural-interface/lib/assistant-brains/opencode-browser-policy.js +0 -47
  669. package/neural-interface/lib/assistant-brains/opencode-route-gate.js +0 -62
  670. package/neural-interface/lib/mcp-profile-servers.js +0 -120
  671. package/neural-interface/public/shared/ui-tutorial-draw.js +0 -311
  672. package/skills/leonardo/SKILL.md +0 -168
  673. package/skills/leonardo/icon.svg +0 -1
  674. package/skills/leonardo/modules/browser-guide.md +0 -378
  675. package/skills/leonardo/modules/image-prompter.md +0 -283
  676. package/skills/leonardo/modules/model-advisor.md +0 -100
  677. package/skills/leonardo/modules/prompt-library.md +0 -110
  678. package/skills/leonardo/modules/style-guide.md +0 -186
  679. package/skills/leonardo/modules/video-prompter.md +0 -317
@@ -101,6 +101,20 @@
101
101
  --right-panel-gap: 0px;
102
102
  --claude-panel-width: 0px;
103
103
  --claude-panel-gap: 0px;
104
+ /* ── App frame (APP FRAME below, shared/app-frame.js) ──
105
+ The workspace is a rounded card inset from the chrome (title bar, explorers). The gap is 0 on a page
106
+ without the frame (html.app-framed sets it), so every rule below reads the old geometry there. */
107
+ --frame-gap: 0px; /* spacing sm on a framed page: the gutter */
108
+ --frame-radius: 16px; /* radius shell */
109
+ --frame-chrome: rgb(18, 18, 20); /* the title bar's and the explorers' tone: the gutter */
110
+ --frame-surface: #07080b; /* the memory map's background: the card's interior */
111
+ --frame-border-color: var(--b-light); /* border-light */
112
+ --frame-bar-height: 48px; /* the bar on a framed page: the desktop app's (TITLE_BAR_HEIGHT) */
113
+ --frame-top: calc(var(--navbar-height, 48px) + var(--frame-gap));
114
+ --frame-left: calc(var(--sidebar-total-width, 0px) + var(--frame-gap));
115
+ }
116
+ html.app-framed {
117
+ --frame-gap: 8px;
104
118
  }
105
119
 
106
120
  /* ── Global dark select options (Windows Chrome ignores color-scheme for option popups) ── */
@@ -124,6 +138,10 @@
124
138
  width: 100%;
125
139
  overscroll-behavior: none;
126
140
  }
141
+ /* A framed page: whatever the chrome and the card leave uncovered (the gutter, an explorer sliding) is chrome. */
142
+ html.app-framed body {
143
+ background: var(--frame-chrome);
144
+ }
127
145
 
128
146
  /* macOS fullscreen: lock height so menu bar overlays instead of pushing content */
129
147
  body.is-fullscreen {
@@ -143,7 +161,7 @@
143
161
  }
144
162
  body.is-fullscreen .fe-editor-panel {
145
163
  position: absolute;
146
- height: var(--fs-locked-height);
164
+ height: calc(var(--fs-locked-height) - var(--frame-top) - var(--frame-gap));
147
165
  }
148
166
 
149
167
  /* ── Window Controls Overlay (PWA standalone on macOS / Windows / Linux, and the SynaBun desktop app) ──
@@ -280,12 +298,17 @@
280
298
  /* ═══════════════════════════════════════════
281
299
  GRAPH CONTAINER
282
300
  ═══════════════════════════════════════════ */
301
+ /* The memory map fills the app frame (APP FRAME), above a docked terminal. Its canvas sizes from this box
302
+ (variant/3d/map-renderer.js). */
283
303
  #graph-container {
284
304
  position: fixed;
285
- top: 0;
286
- left: var(--sidebar-total-width, 0px);
287
- width: calc(100% - var(--sidebar-total-width, 0px));
288
- height: calc(100dvh - var(--terminal-height, 0px));
305
+ top: var(--frame-top);
306
+ left: var(--frame-left);
307
+ width: calc(100% - var(--sidebar-total-width, 0px) - 2 * var(--frame-gap));
308
+ height: calc(100dvh - var(--frame-top) - var(--frame-gap) - var(--terminal-height, 0px));
309
+ border-radius: var(--frame-radius);
310
+ overflow: hidden;
311
+ background: var(--frame-surface);
289
312
  z-index: 1;
290
313
  opacity: 1;
291
314
  filter: blur(0px);
@@ -317,9 +340,89 @@
317
340
  transition: opacity 0.25s ease;
318
341
  }
319
342
 
343
+ /* ═══════════════════════════════════════════
344
+ APP FRAME — the workspace as an inset rounded card
345
+ ═══════════════════════════════════════════
346
+ Chrome outside: the title bar, the two explorers and a gutter of their tone. Inside: the graphs, every
347
+ floating window and panel, the terminal, menus, tooltips, popovers. Modals and full-window backdrops are
348
+ stacked above the frame and still cover the whole window, the bar included.
349
+ Two fixed layers that never take a click (html-shell.js puts them in the page and sets html.app-framed):
350
+ - #app-frame-surface, under the graph: the card's interior, so a graph fading out (focus mode) never shows
351
+ the chrome through it.
352
+ - #app-frame, over every window, panel and terminal: its box is the work area (below the bar, right of the
353
+ explorers, so it never draws over them), and its ::before is the card: the 1px border, and a box-shadow
354
+ spread that paints the gutter and the rounded corners around it. Whatever reaches the frame's edge is cut
355
+ along it.
356
+ Geometry: the --frame-* variables of :root; JS clamps read the same values through app-frame.js frameRect().
357
+ Radii: an element that hugs the card's corner uses the outer radius minus its inset. Flush (inset 0), the
358
+ frame's own corner cuts it to the outer 16px whatever its own radius (--glass-radius); the docked terminal and
359
+ the provider panels keep their place 20px from the window, 12px inside the card, and their own 16px. */
360
+ #app-frame-surface,
361
+ #app-frame {
362
+ display: none;
363
+ }
364
+ html.app-framed #app-frame-surface,
365
+ html.app-framed #app-frame {
366
+ display: block;
367
+ position: fixed;
368
+ pointer-events: none;
369
+ transition: left 0.3s cubic-bezier(0.22, 1, 0.36, 1);
370
+ }
371
+ html.app-framed #app-frame-surface {
372
+ top: var(--frame-top);
373
+ left: var(--frame-left);
374
+ right: var(--frame-gap);
375
+ bottom: var(--frame-gap);
376
+ z-index: 0;
377
+ border-radius: var(--frame-radius);
378
+ background: var(--frame-surface);
379
+ }
380
+ /* Below the bar (50000) so its menus drop over the gutter; above the floating layers (terminals 10000-12000,
381
+ provider panels 11000+, floating windows 49900), under every modal band (50200 and up). */
382
+ html.app-framed #app-frame {
383
+ top: var(--navbar-height, 48px);
384
+ left: var(--sidebar-total-width, 0px);
385
+ right: 0;
386
+ bottom: 0;
387
+ z-index: 49990;
388
+ overflow: hidden;
389
+ }
390
+ html.app-framed #app-frame::before {
391
+ content: '';
392
+ position: absolute;
393
+ inset: var(--frame-gap);
394
+ border: 1px solid var(--frame-border-color);
395
+ border-radius: var(--frame-radius);
396
+ box-shadow: 0 0 0 100vmax var(--frame-chrome);
397
+ }
398
+ /* The title bar is chrome inside the frame: opaque, the gutter's tone, no line or shadow between them. Nothing
399
+ marks its box, and the frame starts one gutter below that box (--navbar-height is its measured height), so the
400
+ box is only what the content needs: no 1px line under it, which would sit the content half a pixel off. */
401
+ html.app-framed #title-bar {
402
+ background: var(--frame-chrome);
403
+ backdrop-filter: none;
404
+ -webkit-backdrop-filter: none;
405
+ border-bottom-width: 0;
406
+ box-shadow: none;
407
+ }
408
+ /* Outside the overlay (a tab, a standalone or Safari web app, the desktop app in full screen) the bar is the
409
+ desktop app's 48px, and its content sits midway between the window's top and the frame's top edge: the bar and
410
+ the gutter are one tone, so what reads is the space above the content against the space down to the frame. The
411
+ gutter's width as padding above (none below) mirrors the gutter under the bar, and the content is centred in the
412
+ rest: with the 38px toolbar pill, 9px above it and 1px + the 8px gutter below, the frame at 56. Taller content
413
+ (a larger scale) still grows the bar, the gaps equal. Under the overlay (body.wco-active) its height is the
414
+ system's and its content is centred in it, on the traffic lights. */
415
+ html.app-framed body:not(.wco-active) #title-bar {
416
+ min-height: var(--frame-bar-height);
417
+ padding-top: var(--frame-gap);
418
+ padding-bottom: 0;
419
+ }
420
+
320
421
  /* ═══════════════════════════════════════════
321
422
  FOCUS MODE BACKGROUND
322
- ═══════════════════════════════════════════ */
423
+ ═══════════════════════════════════════════
424
+ Its box stays the window's (the whiteboard in it keeps its origin, so saved boards and the MCP's board
425
+ coordinates do not move); the app frame over it shows only the card, in the card's own colour. */
323
426
  #static-bg {
324
427
  position: fixed;
325
428
  top: 0;
@@ -330,7 +433,7 @@
330
433
  display: flex;
331
434
  align-items: center;
332
435
  justify-content: center;
333
- background: #070709;
436
+ background: var(--frame-surface);
334
437
  opacity: 0;
335
438
  transform: scale(1.03);
336
439
  pointer-events: none;
@@ -699,7 +802,7 @@
699
802
  background: transparent;
700
803
  border: 1px solid transparent;
701
804
  border-radius: 12px;
702
- cursor: grab;
805
+ cursor: move;
703
806
  user-select: none;
704
807
  white-space: nowrap;
705
808
  width: max-content;
@@ -749,7 +852,7 @@
749
852
  background: transparent;
750
853
  border: 1px solid transparent;
751
854
  border-radius: 12px;
752
- cursor: grab;
855
+ cursor: move;
753
856
  user-select: none;
754
857
  transition: border-color 0.15s, box-shadow 0.15s, background 0.15s;
755
858
  }
@@ -792,12 +895,49 @@
792
895
  color: var(--t-faint, rgba(255,255,255,0.2));
793
896
  pointer-events: none;
794
897
  }
898
+ /* Nested items (data-level, whiteboard-list.js): one bullet indent per level, the browser's nesting styles
899
+ per level (disc → circle → square, decimal → lower-alpha → lower-roman). Numbered lists count each level
900
+ on its own with counters: the items are siblings, so the native numbering would run through all of them.
901
+ The numbers sit where the native marker did (right-aligned, one space before the text). */
902
+ .wb-list li[data-level="1"] { margin-left: 1.4em; }
903
+ .wb-list li[data-level="2"] { margin-left: 2.8em; }
904
+ .wb-list li[data-level="3"] { margin-left: 4.2em; }
905
+ .wb-list li[data-level="4"] { margin-left: 5.6em; }
906
+ .wb-list ul li[data-level="1"],
907
+ .wb-list ul li[data-level="4"] { list-style-type: circle; }
908
+ .wb-list ul li[data-level="2"] { list-style-type: square; }
909
+ .wb-list ol {
910
+ list-style: none;
911
+ counter-reset: wbl0;
912
+ }
913
+ .wb-list ol li {
914
+ position: relative;
915
+ counter-increment: wbl0;
916
+ counter-reset: wbl1;
917
+ }
918
+ .wb-list ol li::after {
919
+ content: counter(wbl0) '.';
920
+ position: absolute;
921
+ top: 0;
922
+ right: 100%;
923
+ padding-right: 0.6em;
924
+ white-space: nowrap;
925
+ font-variant-numeric: tabular-nums;
926
+ }
927
+ .wb-list ol li[data-level="1"] { counter-increment: wbl1; counter-reset: wbl2; }
928
+ .wb-list ol li[data-level="1"]::after { content: counter(wbl1, lower-alpha) '.'; }
929
+ .wb-list ol li[data-level="2"] { counter-increment: wbl2; counter-reset: wbl3; }
930
+ .wb-list ol li[data-level="2"]::after { content: counter(wbl2, lower-roman) '.'; }
931
+ .wb-list ol li[data-level="3"] { counter-increment: wbl3; counter-reset: wbl4; }
932
+ .wb-list ol li[data-level="3"]::after { content: counter(wbl3) '.'; }
933
+ .wb-list ol li[data-level="4"] { counter-increment: wbl4; counter-reset: none; }
934
+ .wb-list ol li[data-level="4"]::after { content: counter(wbl4, lower-alpha) '.'; }
795
935
 
796
936
  /* ── Images ── */
797
937
  .wb-image {
798
938
  position: absolute;
799
939
  border-radius: 16px;
800
- cursor: grab;
940
+ cursor: move;
801
941
  border: 2px solid rgba(255,255,255,0.08);
802
942
  transition: border-color 0.15s, box-shadow 0.15s;
803
943
  }
@@ -1133,7 +1273,7 @@
1133
1273
  backdrop-filter: blur(8px);
1134
1274
  border: 1.5px solid rgba(255, 255, 255, 0.2);
1135
1275
  border-radius: 50%;
1136
- cursor: grab;
1276
+ cursor: move;
1137
1277
  z-index: 20;
1138
1278
  display: flex;
1139
1279
  align-items: center;
@@ -1148,7 +1288,7 @@
1148
1288
  color: rgba(255, 255, 255, 0.95);
1149
1289
  box-shadow: var(--shadow-md);
1150
1290
  }
1151
- .wb-rotate-float:active { cursor: grabbing; }
1291
+ .wb-rotate-float:active { cursor: move; }
1152
1292
 
1153
1293
  .wb-move-float {
1154
1294
  position: absolute;
@@ -1158,7 +1298,7 @@
1158
1298
  backdrop-filter: blur(8px);
1159
1299
  border: 1.5px solid rgba(255, 255, 255, 0.2);
1160
1300
  border-radius: 50%;
1161
- cursor: grab;
1301
+ cursor: move;
1162
1302
  z-index: 20;
1163
1303
  display: flex;
1164
1304
  align-items: center;
@@ -1173,7 +1313,7 @@
1173
1313
  color: rgba(255, 255, 255, 0.95);
1174
1314
  box-shadow: var(--shadow-md);
1175
1315
  }
1176
- .wb-move-float:active { cursor: grabbing; }
1316
+ .wb-move-float:active { cursor: move; }
1177
1317
 
1178
1318
  /* ── Shapes ── */
1179
1319
  .wb-shape {
@@ -1181,7 +1321,7 @@
1181
1321
  min-width: 40px;
1182
1322
  min-height: 40px;
1183
1323
  background: transparent;
1184
- cursor: grab;
1324
+ cursor: move;
1185
1325
  user-select: none;
1186
1326
  transition: filter 0.15s, box-shadow 0.15s;
1187
1327
  }
@@ -1204,7 +1344,7 @@
1204
1344
  min-height: 30px;
1205
1345
  border: 1px dashed rgba(255,255,255,0.35);
1206
1346
  border-radius: 4px;
1207
- cursor: grab;
1347
+ cursor: move;
1208
1348
  user-select: none;
1209
1349
  transition: border-color 0.15s, box-shadow 0.15s, background 0.15s;
1210
1350
  display: flex;
@@ -1633,7 +1773,15 @@
1633
1773
  color: var(--t-secondary);
1634
1774
  }
1635
1775
 
1636
- .menubar-dropdown {
1776
+ /* A standalone button whose window is open (Schedules) looks like an open menu's label */
1777
+ .menubar-action.active,
1778
+ .menubar-action.active:hover {
1779
+ background: var(--s-active);
1780
+ color: var(--t-bright);
1781
+ }
1782
+
1783
+ .menubar-dropdown,
1784
+ .menubar-submenu {
1637
1785
  position: absolute;
1638
1786
  top: calc(100% + 14px);
1639
1787
  left: 0;
@@ -1671,10 +1819,78 @@
1671
1819
  display: block;
1672
1820
  }
1673
1821
 
1822
+ /* Taller than the room under the bar (ui-menubar.js fitDropdown): it scrolls, and the caret,
1823
+ which the scroll box would clip, goes. */
1824
+ .menubar-dropdown.menubar-dropdown--scroll {
1825
+ overflow-y: auto;
1826
+ overscroll-behavior: contain;
1827
+ scrollbar-width: thin;
1828
+ }
1829
+ .menubar-dropdown.menubar-dropdown--scroll::before { display: none; }
1830
+
1674
1831
  .menubar-dropdown--wide {
1675
1832
  min-width: 300px;
1676
1833
  }
1677
1834
 
1835
+ /* ── Submenus (Apps › Browser apps, Map, Games; ui-menubar.js wireSubmenus) ──
1836
+ The dropdown's box without its caret. The script moves the panel out of the dropdown, whose
1837
+ scroll box would clip it, onto the .menubar-item and places it beside its row. */
1838
+ .menubar-submenu {
1839
+ top: 0;
1840
+ z-index: 102;
1841
+ animation: menuSubIn 0.14s ease-out;
1842
+ }
1843
+
1844
+ .menubar-item.open .menubar-submenu.open {
1845
+ display: block;
1846
+ }
1847
+
1848
+ @keyframes menuSubIn {
1849
+ from { opacity: 0; }
1850
+ to { opacity: 1; }
1851
+ }
1852
+
1853
+ /* ── App context menu (shared/context-menu.js, opened by ui-context-menu.js) ──
1854
+ The dropdown's box and rows at body level, where the right-click was. Above every window, the floating
1855
+ terminals' focus counter (10000-12000), the Settings / Schedules windows (300000+) and the help overlay
1856
+ (999999); below the loading / restart screen, which opts out of the menu. */
1857
+ .app-ctx-menu {
1858
+ position: fixed;
1859
+ left: 0;
1860
+ top: 0;
1861
+ z-index: 1000000;
1862
+ min-width: 200px;
1863
+ max-width: min(360px, calc(100vw - 16px));
1864
+ max-height: calc(100vh - 16px);
1865
+ overflow-y: auto;
1866
+ overscroll-behavior: contain;
1867
+ scrollbar-width: thin;
1868
+ padding: 5px;
1869
+ background: rgba(32, 32, 36, 0.96);
1870
+ backdrop-filter: blur(var(--blur-heavy)) saturate(1.6);
1871
+ -webkit-backdrop-filter: blur(var(--blur-heavy)) saturate(1.6);
1872
+ border: 1px solid rgba(255,255,255,0.14);
1873
+ border-radius: 10px;
1874
+ box-shadow: 0 1px 3px rgba(0,0,0,0.3),
1875
+ 0 8px 20px rgba(0,0,0,0.25),
1876
+ 0 24px 48px rgba(0,0,0,0.18);
1877
+ animation: menuSubIn 0.14s ease-out;
1878
+ user-select: none;
1879
+ -webkit-user-select: none;
1880
+ outline: none;
1881
+ }
1882
+
1883
+ /* The highlighted row is the focus mark, as in the menubar's dropdowns. */
1884
+ .app-ctx-menu .menu-item:focus { outline: none; }
1885
+
1886
+ /* A long label (the selection being searched for) is cut, its shortcut stays. */
1887
+ .app-ctx-menu .menu-text { min-width: 0; }
1888
+ .app-ctx-menu .app-ctx-label { overflow: hidden; text-overflow: ellipsis; }
1889
+
1890
+ @media (prefers-reduced-motion: reduce) {
1891
+ .app-ctx-menu { animation: none; }
1892
+ }
1893
+
1678
1894
  /* ── Resume Dropdown ── */
1679
1895
 
1680
1896
  .menubar-dropdown--resume {
@@ -2241,7 +2457,8 @@
2241
2457
  .menu-item[hidden] { display: none !important; }
2242
2458
 
2243
2459
  .menu-item:hover,
2244
- .menu-item.focused {
2460
+ .menu-item.focused,
2461
+ .menu-item.submenu-open {
2245
2462
  background: rgba(255,255,255,0.06);
2246
2463
  color: var(--t-bright);
2247
2464
  }
@@ -2281,6 +2498,20 @@
2281
2498
  border: 1px solid rgba(255,255,255,0.06);
2282
2499
  }
2283
2500
 
2501
+ /* A submenu row's chevron, where a shortcut would be */
2502
+ .menu-submenu-arrow {
2503
+ display: inline-flex;
2504
+ width: 10px;
2505
+ height: 10px;
2506
+ margin-left: 20px;
2507
+ flex-shrink: 0;
2508
+ color: var(--t-faint);
2509
+ }
2510
+ .menu-submenu-arrow svg { width: 100%; height: 100%; }
2511
+ .menu-item:hover .menu-submenu-arrow,
2512
+ .menu-item.focused .menu-submenu-arrow,
2513
+ .menu-item.submenu-open .menu-submenu-arrow { color: inherit; }
2514
+
2284
2515
  .menu-sep {
2285
2516
  height: 1px;
2286
2517
  background: rgba(255,255,255,0.06);
@@ -2813,7 +3044,7 @@
2813
3044
  .kb-backdrop {
2814
3045
  position: fixed;
2815
3046
  inset: 0;
2816
- z-index: 9998;
3047
+ z-index: 50200; /* a modal backdrop: over the app frame (49990) and the bar, the whole window */
2817
3048
  background: rgba(0, 0, 0, 0.4);
2818
3049
  backdrop-filter: blur(8px);
2819
3050
  -webkit-backdrop-filter: blur(8px);
@@ -2826,7 +3057,7 @@
2826
3057
 
2827
3058
  .keybinds-panel {
2828
3059
  position: fixed;
2829
- z-index: 9999;
3060
+ z-index: 50201;
2830
3061
  top: 50%;
2831
3062
  left: 50%;
2832
3063
  transform: translate(-50%, -50%) scale(0.95);
@@ -5302,7 +5533,7 @@
5302
5533
 
5303
5534
  .tw {
5304
5535
  position: fixed;
5305
- z-index: 50100;
5536
+ z-index: 49900; /* under the app frame (49990): its rounded corners cut a window that reaches them */
5306
5537
  width: 640px;
5307
5538
  max-width: 92vw;
5308
5539
  min-width: 420px;
@@ -6110,6 +6341,32 @@
6110
6341
  .topright-icon-btn:hover svg {
6111
6342
  filter: drop-shadow(0 0 4px rgba(255, 255, 255, 0.2));
6112
6343
  }
6344
+
6345
+ /* The desktop app's Restart to update (ui-update.js desktopRestartButton): while a downloaded update waits for a
6346
+ restart, the update button grows into a pill with its words, in the update badge's own green, as Discord's
6347
+ green button does. */
6348
+ #topright-update-btn.update-ready {
6349
+ width: auto;
6350
+ gap: 6px;
6351
+ padding: 0 10px 0 8px;
6352
+ color: #34c759;
6353
+ background: rgba(52, 199, 89, 0.14);
6354
+ box-shadow: inset 0 0 0 1px rgba(52, 199, 89, 0.25);
6355
+ }
6356
+ #topright-update-btn.update-ready:hover {
6357
+ color: #34c759;
6358
+ background: rgba(52, 199, 89, 0.22);
6359
+ transform: none;
6360
+ }
6361
+ #topright-update-btn.update-ready .count-badge { display: none; }
6362
+ #topright-update-btn.update-ready--asked { opacity: 0.8; }
6363
+ #topright-update-btn[aria-busy="true"] { cursor: progress; }
6364
+ #topright-update-btn .update-ready-label {
6365
+ font-size: 12px;
6366
+ font-weight: 500;
6367
+ line-height: 1;
6368
+ white-space: nowrap;
6369
+ }
6113
6370
  #topright-assistant-panel-btn svg,
6114
6371
  #topright-codex-panel-btn svg,
6115
6372
  #topright-opencode-panel-btn svg {
@@ -8338,13 +8595,13 @@
8338
8595
  }
8339
8596
  /* Drag-to-terminal grip */
8340
8597
  .detail-drag-to-term {
8341
- cursor: grab;
8598
+ cursor: move;
8342
8599
  color: var(--accent-blue);
8343
8600
  opacity: 0.5;
8344
8601
  transition: opacity 0.15s;
8345
8602
  }
8346
8603
  .detail-drag-to-term:hover { opacity: 1; }
8347
- .detail-drag-to-term:active { cursor: grabbing; }
8604
+ .detail-drag-to-term:active { cursor: move; }
8348
8605
  .detail-card.detail-dragging-to-term { opacity: 0.45; }
8349
8606
 
8350
8607
  /* ── Compact mode ── */
@@ -11515,19 +11772,6 @@
11515
11772
  color: rgba(255,255,255,0.64);
11516
11773
  padding: 3px 0;
11517
11774
  }
11518
- .stg-tool-select {
11519
- width: 78px;
11520
- padding: 3px 6px;
11521
- font-size: 11.5px;
11522
- background: rgba(0,0,0,0.2);
11523
- border: 1px solid rgba(255,255,255,0.07);
11524
- border-radius: 5px;
11525
- color: var(--t-primary);
11526
- font-family: inherit;
11527
- outline: none;
11528
- cursor: pointer;
11529
- }
11530
- .stg-tool-select:focus { border-color: rgba(79,195,247,0.4); }
11531
11775
 
11532
11776
  /* MCP server rows */
11533
11777
  .stg-mcp-row {
@@ -11598,394 +11842,105 @@
11598
11842
  margin: 0;
11599
11843
  max-width: 420px;
11600
11844
  }
11601
- .stg-mcp-matrix-wrap {
11602
- position: relative;
11603
- overflow: hidden;
11604
- border: 1px solid rgba(148,163,184,0.08);
11605
- border-radius: 14px;
11606
- background:
11607
- linear-gradient(180deg, rgba(255,255,255,0.02) 0%, rgba(255,255,255,0.008) 100%),
11608
- rgba(0,0,0,0.14);
11609
- box-shadow: inset 0 1px 0 rgba(255,255,255,0.035);
11610
- }
11611
- .stg-mcp-matrix-wrap::after {
11612
- content: '';
11613
- position: absolute;
11614
- top: 0;
11615
- bottom: 0;
11616
- left: 148px;
11617
- width: 18px;
11618
- background: linear-gradient(90deg, rgba(10,13,17,0.36) 0%, rgba(10,13,17,0) 100%);
11619
- pointer-events: none;
11620
- z-index: 4;
11621
- }
11622
- .stg-mcp-matrix-scroll {
11623
- overflow-x: auto;
11624
- overflow-y: hidden;
11625
- border-radius: inherit;
11626
- scrollbar-gutter: stable;
11845
+ .stg-mcp-empty-note { padding: 12px 14px; font-size: 11px; color: var(--t-secondary); line-height: 1.5; }
11846
+
11847
+ /* Shared small actions */
11848
+ .stg-mx-srv-del {
11849
+ background: none;
11850
+ border: none;
11851
+ color: rgba(148,163,184,0.24);
11852
+ cursor: pointer;
11853
+ font-size: 12px;
11854
+ padding: 0 2px;
11855
+ line-height: 1;
11856
+ transition: color 0.12s ease;
11857
+ flex-shrink: 0;
11627
11858
  }
11628
- .stg-mcp-matrix-empty,
11629
- .stg-mcp-empty-note {
11630
- padding: 12px 14px;
11631
- font-size: 11px;
11632
- color: rgba(148,163,184,0.52);
11633
- line-height: 1.5;
11859
+ .stg-mx-srv-del:hover { color: rgba(255,82,82,0.72); }
11860
+
11861
+ /* Always-on footer */
11862
+ .stg-mcp-section-header {
11863
+ display: block;
11864
+ font-size: 9.5px;
11865
+ text-transform: uppercase;
11866
+ letter-spacing: 0.09em;
11867
+ color: rgba(148,163,184,0.46);
11868
+ font-weight: 700;
11869
+ margin-bottom: 6px;
11634
11870
  }
11635
- #stg-mcp-matrix {
11636
- border-collapse: separate;
11637
- border-spacing: 0;
11638
- width: max-content;
11639
- min-width: 100%;
11871
+ .stg-mx-always-on-row {
11872
+ display: flex;
11873
+ flex-wrap: wrap;
11874
+ gap: 6px;
11640
11875
  }
11641
- #stg-mcp-matrix th, #stg-mcp-matrix td {
11642
- padding: 0;
11643
- margin: 0;
11644
- border: none;
11876
+ .stg-mx-always-chip {
11877
+ display: inline-flex;
11878
+ align-items: center;
11879
+ gap: 5px;
11880
+ padding: 3px 8px;
11881
+ border-radius: 5px;
11882
+ font-size: 10px;
11883
+ font-weight: 600;
11884
+ background: rgba(148,163,184,0.05);
11885
+ border: 1px solid rgba(148,163,184,0.07);
11886
+ box-shadow: inset 0 1px 0 rgba(255,255,255,0.02);
11887
+ color: rgba(203,213,225,0.54);
11888
+ user-select: none;
11645
11889
  }
11646
11890
 
11647
- /* Row label column (sticky) */
11648
- .stg-mx-label-th, .stg-mx-label-td {
11649
- position: sticky;
11650
- left: 0;
11651
- backdrop-filter: blur(12px);
11652
- }
11653
- .stg-mx-label-th {
11654
- width: 148px;
11655
- min-width: 148px;
11656
- z-index: 6;
11657
- background:
11658
- linear-gradient(180deg, rgba(255,255,255,0.022) 0%, rgba(255,255,255,0.01) 100%),
11659
- linear-gradient(90deg, rgba(16,19,25,0.985) 0%, rgba(16,19,25,0.965) 86%, rgba(16,19,25,0.9) 100%);
11660
- border-bottom: 1px solid rgba(148,163,184,0.08);
11661
- box-shadow:
11662
- inset -1px 0 0 rgba(148,163,184,0.05),
11663
- 10px 0 18px -16px rgba(0,0,0,0.55);
11891
+ /* External server list below matrix */
11892
+ #stg-mcp-ext-servers {
11893
+ display: flex;
11894
+ flex-direction: column;
11895
+ gap: 10px;
11664
11896
  }
11665
- #stg-mcp-matrix .stg-mx-label-td {
11666
- z-index: 5;
11667
- padding: 5px 14px;
11668
- min-width: 148px;
11897
+ .stg-mx-ext-row {
11898
+ padding: 10px 11px;
11899
+ border: 1px solid rgba(148,163,184,0.08);
11900
+ border-radius: 12px;
11669
11901
  background:
11670
- linear-gradient(90deg, rgba(18,21,27,0.985) 0%, rgba(18,21,27,0.965) 86%, rgba(18,21,27,0.92) 100%);
11671
- border-bottom: 1px solid rgba(148,163,184,0.04);
11672
- box-shadow:
11673
- inset -1px 0 0 rgba(148,163,184,0.04),
11674
- 10px 0 18px -16px rgba(0,0,0,0.52);
11902
+ linear-gradient(180deg, rgba(255,255,255,0.018) 0%, rgba(255,255,255,0.008) 100%),
11903
+ rgba(255,255,255,0.012);
11904
+ box-shadow: inset 0 1px 0 rgba(255,255,255,0.025);
11675
11905
  }
11676
- .stg-mx-label-inner {
11906
+ .stg-mx-ext-main {
11677
11907
  display: flex;
11678
11908
  align-items: center;
11679
- gap: 6px;
11909
+ gap: 10px;
11910
+ }
11911
+ .stg-mx-ext-dot {
11912
+ width: 6px;
11913
+ height: 6px;
11914
+ border-radius: 50%;
11915
+ background: rgba(148,163,184,0.52);
11916
+ flex-shrink: 0;
11917
+ }
11918
+ .stg-mx-ext-copy {
11919
+ flex: 1;
11920
+ min-width: 0;
11680
11921
  }
11681
- .stg-mx-corner-head {
11922
+ .stg-mx-ext-head {
11682
11923
  display: flex;
11683
11924
  align-items: center;
11684
- padding: 0 14px;
11685
- font-size: 8px;
11686
- font-weight: 700;
11687
- letter-spacing: 0.12em;
11688
- text-transform: uppercase;
11689
- color: rgba(148,163,184,0.34);
11690
- white-space: nowrap;
11925
+ gap: 8px;
11926
+ flex-wrap: wrap;
11691
11927
  }
11692
- .stg-mx-grp-name {
11693
- font-size: 11px;
11694
- color: rgba(255,255,255,0.62);
11695
- font-weight: 500;
11696
- white-space: nowrap;
11697
- overflow: hidden;
11698
- text-overflow: ellipsis;
11699
- flex: 1;
11700
- letter-spacing: 0.01em;
11928
+ .stg-mx-ext-name {
11929
+ font-size: 11.5px;
11930
+ font-weight: 600;
11931
+ color: rgba(255,255,255,0.72);
11701
11932
  }
11702
- .stg-mx-grp-count {
11703
- font-size: 8px;
11704
- color: rgba(148,163,184,0.34);
11705
- font-family: 'JetBrains Mono', 'SF Mono', monospace;
11706
- flex-shrink: 0;
11933
+ .stg-mx-ext-type {
11707
11934
  display: inline-flex;
11708
11935
  align-items: center;
11709
11936
  justify-content: center;
11710
- min-width: 16px;
11711
- padding: 1px 4px;
11712
- border-radius: 3px;
11713
- background: rgba(148,163,184,0.04);
11714
- border: 1px solid rgba(148,163,184,0.05);
11715
- }
11716
-
11717
- /* Profile column headers */
11718
- .stg-mx-profile-th {
11719
- padding: 6px 4px;
11720
- text-align: center;
11721
- vertical-align: middle;
11722
- min-width: 68px;
11723
- max-width: 92px;
11724
- border-bottom: 1px solid rgba(148,163,184,0.06);
11725
- background: transparent;
11726
- transition: background 0.15s ease, border-color 0.15s ease;
11727
- }
11728
- .stg-mx-profile-th.active {
11729
- border-bottom-color: rgba(148,163,184,0.12);
11730
- background: rgba(148,163,184,0.02);
11731
- }
11732
- .stg-mx-profile-head {
11733
- display: flex;
11734
- flex-direction: column;
11735
- align-items: center;
11736
- gap: 3px;
11737
- cursor: pointer;
11738
- user-select: none;
11739
- position: relative;
11740
- padding: 2px 4px;
11741
- border-radius: 6px;
11742
- transition: background 0.15s ease;
11743
- }
11744
- .stg-mx-profile-head:hover { background: rgba(148,163,184,0.05); }
11745
- .stg-mx-profile-head:hover .stg-mx-profile-name { color: rgba(255,255,255,0.82); }
11746
- .stg-mx-profile-dot {
11747
- width: 4px;
11748
- height: 4px;
11749
- border-radius: 50%;
11750
- background: rgba(148,163,184,0.18);
11751
- transition: background 0.2s ease, box-shadow 0.2s ease;
11752
- }
11753
- .stg-mx-profile-dot.on {
11754
- background: rgba(226,232,240,0.7);
11755
- box-shadow: 0 0 6px rgba(148,163,184,0.16);
11756
- }
11757
- .stg-mx-profile-name {
11758
- font-size: 10px;
11759
- color: rgba(255,255,255,0.5);
11760
- font-weight: 600;
11761
- white-space: nowrap;
11762
- overflow: hidden;
11763
- text-overflow: ellipsis;
11764
- max-width: 74px;
11765
- letter-spacing: 0.01em;
11766
- transition: color 0.12s ease;
11767
- }
11768
- .stg-mx-profile-th.active .stg-mx-profile-name { color: rgba(255,255,255,0.72); }
11769
- .stg-mx-profile-del {
11770
- position: absolute;
11771
- top: -3px;
11772
- right: -1px;
11773
- background: none;
11774
- border: none;
11775
- color: rgba(148,163,184,0.22);
11776
- cursor: pointer;
11777
- font-size: 10px;
11778
- padding: 0;
11779
- line-height: 1;
11780
- transition: color 0.12s ease;
11781
- display: none;
11782
- }
11783
- .stg-mx-profile-head:hover .stg-mx-profile-del { display: block; }
11784
- .stg-mx-profile-del:hover { color: rgba(255,82,82,0.72); }
11785
- .stg-mx-tool-count {
11786
- display: block;
11787
- font-size: 8.5px;
11788
- color: rgba(148,163,184,0.36);
11789
- font-family: 'JetBrains Mono', 'SF Mono', monospace;
11790
- margin-top: 2px;
11791
- }
11792
-
11793
- /* Toggle cells */
11794
- .stg-mx-cell {
11795
- text-align: center;
11796
- padding: 6px 0;
11797
- cursor: pointer;
11798
- border-bottom: 1px solid rgba(148,163,184,0.03);
11799
- transition: background 0.18s ease;
11800
- }
11801
- .stg-mx-cell:hover {
11802
- background: rgba(148,163,184,0.04);
11803
- }
11804
- .stg-mx-toggle {
11805
- display: inline-block;
11806
- width: 16px;
11807
- height: 16px;
11808
- border-radius: 4px;
11809
- border: 1.5px solid rgba(148,163,184,0.12);
11810
- background: rgba(255,255,255,0.01);
11811
- position: relative;
11812
- transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
11813
- }
11814
- .stg-mx-toggle.on {
11815
- background: rgba(148,163,184,0.14);
11816
- border-color: rgba(148,163,184,0.32);
11817
- box-shadow: 0 0 8px rgba(148,163,184,0.08), inset 0 0 4px rgba(148,163,184,0.06);
11818
- }
11819
- .stg-mx-toggle.on::after {
11820
- content: '';
11821
- position: absolute;
11822
- top: 3px;
11823
- left: 3px;
11824
- width: 7px;
11825
- height: 4px;
11826
- border-left: 1.5px solid rgba(226,232,240,0.82);
11827
- border-bottom: 1.5px solid rgba(226,232,240,0.82);
11828
- transform: rotate(-45deg);
11829
- transform-origin: center;
11830
- }
11831
- .stg-mx-cell:hover .stg-mx-toggle:not(.on) {
11832
- border-color: rgba(148,163,184,0.24);
11833
- background: rgba(148,163,184,0.04);
11834
- }
11835
- .stg-mx-cell:active .stg-mx-toggle {
11836
- transform: scale(0.9);
11837
- }
11838
-
11839
- /* Add profile column (sticky right) */
11840
- .stg-mx-add-th, .stg-mx-add-spacer {
11841
- position: sticky;
11842
- right: 0;
11843
- z-index: 4;
11844
- background: linear-gradient(90deg, rgba(16,19,25,0.9) 0%, rgba(16,19,25,0.985) 14%, rgba(16,19,25,0.985) 100%);
11845
- }
11846
- .stg-mx-add-th {
11847
- padding: 4px 6px 4px;
11848
- text-align: center;
11849
- vertical-align: bottom;
11850
- min-width: 34px;
11851
- border-bottom: 1px solid rgba(148,163,184,0.06);
11852
- }
11853
- .stg-mx-add-btn {
11854
- background: rgba(148,163,184,0.08);
11855
- border: 1px dashed rgba(148,163,184,0.18);
11856
- color: rgba(148,163,184,0.42);
11857
- cursor: pointer;
11858
- width: 28px;
11859
- height: 28px;
11860
- border-radius: 50%;
11861
- font-size: 15px;
11862
- line-height: 1;
11863
- display: inline-flex;
11864
- align-items: center;
11865
- justify-content: center;
11866
- box-shadow: inset 0 1px 0 rgba(255,255,255,0.03);
11867
- transition: all 0.15s ease;
11868
- }
11869
- .stg-mx-add-btn:hover {
11870
- background: rgba(148,163,184,0.12);
11871
- border-color: rgba(148,163,184,0.26);
11872
- color: rgba(255,255,255,0.62);
11873
- transform: translateY(-1px);
11874
- }
11875
- .stg-mx-add-spacer {
11876
- min-width: 34px;
11877
- border-bottom: 1px solid rgba(148,163,184,0.04);
11878
- }
11879
- .stg-mx-inline-input {
11880
- width: 64px;
11881
- padding: 5px 7px;
11882
- font-size: 10px;
11883
- background: rgba(0,0,0,0.3);
11884
- border: 1px solid rgba(148,163,184,0.2);
11885
- border-radius: 8px;
11886
- color: rgba(255,255,255,0.8);
11887
- outline: none;
11888
- font-family: inherit;
11889
- }
11890
- .stg-mx-inline-input:focus { border-color: rgba(148,163,184,0.4); }
11891
-
11892
- /* Shared small actions */
11893
- .stg-mx-srv-del {
11894
- background: none;
11895
- border: none;
11896
- color: rgba(148,163,184,0.24);
11897
- cursor: pointer;
11898
- font-size: 12px;
11899
- padding: 0 2px;
11900
- line-height: 1;
11901
- transition: color 0.12s ease;
11902
- flex-shrink: 0;
11903
- }
11904
- .stg-mx-srv-del:hover { color: rgba(255,82,82,0.72); }
11905
-
11906
- /* Always-on footer */
11907
- .stg-mcp-section-header {
11908
- display: block;
11909
- font-size: 9.5px;
11910
- text-transform: uppercase;
11911
- letter-spacing: 0.09em;
11912
- color: rgba(148,163,184,0.46);
11913
- font-weight: 700;
11914
- margin-bottom: 6px;
11915
- }
11916
- .stg-mx-always-on-row {
11917
- display: flex;
11918
- flex-wrap: wrap;
11919
- gap: 6px;
11920
- }
11921
- .stg-mx-always-chip {
11922
- display: inline-flex;
11923
- align-items: center;
11924
- gap: 5px;
11925
- padding: 3px 8px;
11926
- border-radius: 5px;
11927
- font-size: 10px;
11928
- font-weight: 600;
11929
- background: rgba(148,163,184,0.05);
11930
- border: 1px solid rgba(148,163,184,0.07);
11931
- box-shadow: inset 0 1px 0 rgba(255,255,255,0.02);
11932
- color: rgba(203,213,225,0.54);
11933
- user-select: none;
11934
- }
11935
-
11936
- /* External server list below matrix */
11937
- #stg-mcp-ext-servers {
11938
- display: flex;
11939
- flex-direction: column;
11940
- gap: 10px;
11941
- }
11942
- .stg-mx-ext-row {
11943
- padding: 10px 11px;
11944
- border: 1px solid rgba(148,163,184,0.08);
11945
- border-radius: 12px;
11946
- background:
11947
- linear-gradient(180deg, rgba(255,255,255,0.018) 0%, rgba(255,255,255,0.008) 100%),
11948
- rgba(255,255,255,0.012);
11949
- box-shadow: inset 0 1px 0 rgba(255,255,255,0.025);
11950
- }
11951
- .stg-mx-ext-main {
11952
- display: flex;
11953
- align-items: center;
11954
- gap: 10px;
11955
- }
11956
- .stg-mx-ext-dot {
11957
- width: 6px;
11958
- height: 6px;
11959
- border-radius: 50%;
11960
- background: rgba(148,163,184,0.52);
11961
- flex-shrink: 0;
11962
- }
11963
- .stg-mx-ext-copy {
11964
- flex: 1;
11965
- min-width: 0;
11966
- }
11967
- .stg-mx-ext-head {
11968
- display: flex;
11969
- align-items: center;
11970
- gap: 8px;
11971
- flex-wrap: wrap;
11972
- }
11973
- .stg-mx-ext-name {
11974
- font-size: 11.5px;
11975
- font-weight: 600;
11976
- color: rgba(255,255,255,0.72);
11977
- }
11978
- .stg-mx-ext-type {
11979
- display: inline-flex;
11980
- align-items: center;
11981
- justify-content: center;
11982
- padding: 2px 6px;
11983
- border-radius: 999px;
11984
- font-size: 9px;
11985
- font-family: 'JetBrains Mono', 'SF Mono', monospace;
11986
- color: rgba(148,163,184,0.56);
11987
- background: rgba(148,163,184,0.07);
11988
- border: 1px solid rgba(148,163,184,0.08);
11937
+ padding: 2px 6px;
11938
+ border-radius: 999px;
11939
+ font-size: 9px;
11940
+ font-family: 'JetBrains Mono', 'SF Mono', monospace;
11941
+ color: rgba(148,163,184,0.56);
11942
+ background: rgba(148,163,184,0.07);
11943
+ border: 1px solid rgba(148,163,184,0.08);
11989
11944
  }
11990
11945
  .stg-mx-ext-sub {
11991
11946
  margin-top: 2px;
@@ -11996,46 +11951,6 @@
11996
11951
  .stg-mx-ext-remove {
11997
11952
  margin-left: auto;
11998
11953
  }
11999
- .stg-mx-ext-profiles {
12000
- display: flex;
12001
- flex-wrap: wrap;
12002
- gap: 6px;
12003
- margin-top: 9px;
12004
- }
12005
- .stg-mx-ext-toggle {
12006
- display: inline-flex;
12007
- align-items: center;
12008
- justify-content: center;
12009
- min-height: 28px;
12010
- padding: 0 10px;
12011
- border-radius: 999px;
12012
- border: 1px solid rgba(148,163,184,0.1);
12013
- background: rgba(255,255,255,0.02);
12014
- color: rgba(255,255,255,0.5);
12015
- cursor: pointer;
12016
- transition: background 0.15s ease, border-color 0.15s ease, color 0.15s ease, box-shadow 0.15s ease;
12017
- }
12018
- .stg-mx-ext-toggle:hover {
12019
- background: rgba(148,163,184,0.055);
12020
- border-color: rgba(148,163,184,0.16);
12021
- color: rgba(255,255,255,0.68);
12022
- }
12023
- .stg-mx-ext-toggle.on {
12024
- background: rgba(148,163,184,0.11);
12025
- border-color: rgba(148,163,184,0.24);
12026
- box-shadow: inset 0 1px 0 rgba(255,255,255,0.03);
12027
- color: rgba(226,232,240,0.84);
12028
- }
12029
- .stg-mx-ext-toggle-name {
12030
- max-width: 130px;
12031
- overflow: hidden;
12032
- text-overflow: ellipsis;
12033
- white-space: nowrap;
12034
- font-size: 10px;
12035
- font-weight: 600;
12036
- letter-spacing: 0.01em;
12037
- }
12038
-
12039
11954
  /* Add-server form */
12040
11955
  .stg-mcp-add-form {
12041
11956
  margin-top: 10px;
@@ -12275,7 +12190,7 @@
12275
12190
  display: none;
12276
12191
  }
12277
12192
 
12278
- /* Top-level page tabs (Profiles / Installed) inside the MCP settings page */
12193
+ /* Top-level page tabs (Default tools / Installed) inside the MCP settings page */
12279
12194
  .stg-mcp-page-tabs {
12280
12195
  display: inline-flex;
12281
12196
  gap: 2px;
@@ -13586,6 +13501,7 @@
13586
13501
  ═══════════════════════════════════════════ */
13587
13502
  .settings-panel,
13588
13503
  .command-runner-panel,
13504
+ .schedules-studio-panel,
13589
13505
  .styleguide-panel {
13590
13506
  /* Text roles for the dark panel. Each clears WCAG AA (4.5:1) on the panel and inside a group. */
13591
13507
  --stg-text: rgba(255,255,255,0.92);
@@ -13621,6 +13537,7 @@
13621
13537
  @supports (color: oklch(from red l c h)) {
13622
13538
  .settings-panel,
13623
13539
  .command-runner-panel,
13540
+ .schedules-studio-panel,
13624
13541
  .styleguide-panel {
13625
13542
  --stg-accent-fill: oklch(from var(--accent-blue) 0.5 c h);
13626
13543
  --stg-accent-fill-hover: oklch(from var(--accent-blue) 0.55 c h);
@@ -14179,13 +14096,13 @@
14179
14096
  .settings-panel .settings-content :is(
14180
14097
  .ocp-server-bar-status, .ocp-srv-btn, .stg-cap-filter, .stg-cap-filter-letter, .stg-provider-status, .stg-model-count-badge, .stg-model-count-sep,
14181
14098
  .stg-model-expand-btn, .stg-model-toggle-name, .stg-cap, .stg-ocp-oauth-wait, .stg-ocp-toggle-all, .ocp-config-footer, .ocp-config-link, .stg-tool-name,
14182
- .stg-tool-select, .ocp-danger-meta, .stg-callout-copy, .stg-callout-note, .db-model-footer, .settings-status, .settings-status span,
14099
+ .ocp-danger-meta, .stg-callout-copy, .stg-callout-note, .db-model-footer, .settings-status, .settings-status span,
14183
14100
  .cc-panel-row-label, .cc-panel-row-value, .cc-enable-btn, .cc-disable-btn, .cc-remove-panel-btn, .cc-panel-status, .cc-explore-btn, .cc-trust-btn,
14184
14101
  .project-storage-intro, .project-storage-stat span, .project-storage-stat strong, .project-storage-loading strong, .project-storage-loading small,
14185
14102
  .project-storage-safety-note, .project-storage-btn, .project-storage-placeholder, .project-storage-feedback,
14186
14103
  .cc-dropdown-item, .browser-cfg-range-val, .bc-profile-name, .bc-profile-divider, .stg-mcp-note strong, .stg-mcp-note span,
14187
- .stg-mx-corner-head, .stg-mx-profile-name, .stg-mx-profile-del, .stg-mx-grp-name, .stg-mx-grp-count, .stg-mcp-section-header, .stg-mx-always-chip,
14188
- .stg-mx-ext-name, .stg-mx-ext-type, .stg-mx-ext-sub, .stg-mx-ext-toggle-name, .stg-mx-ext-cli-badge, .stg-mcp-empty-note, .stg-mcp-source-tab,
14104
+ .stg-mcp-section-header, .stg-mx-always-chip,
14105
+ .stg-mx-ext-name, .stg-mx-ext-type, .stg-mx-ext-sub, .stg-mx-ext-cli-badge, .stg-mcp-empty-note, .stg-mcp-source-tab,
14189
14106
  .stg-mcp-page-tab, .cc-cheatsheet-table code, .wa-mode-notes li, .recall-control-scale span,
14190
14107
  select option
14191
14108
  ) { font-size: 12px; }
@@ -14201,8 +14118,7 @@
14201
14118
  Census: tools/literals.js contrast(). Dimmed-by-state text (disabled buttons, hidden models, a provider that is
14202
14119
  not connected) and buttons drawn on a gradient are the exceptions, recorded in SPEC.md. */
14203
14120
  .settings-panel .settings-content :is(
14204
- .jv-sf-skipped, .stg-model-count-badge, .stg-model-count-sep, .stg-model-expand-btn, .stg-model-expand-icon, .stg-mx-grp-count, .stg-mx-corner-head,
14205
- .stg-mx-profile-del, .stg-mx-srv-del, .stg-mx-add-btn, .stg-mx-always-chip, .stg-mx-ext-type, .stg-mx-ext-sub, .stg-mcp-section-header, .stg-mcp-empty-note,
14121
+ .jv-sf-skipped, .stg-model-count-badge, .stg-model-count-sep, .stg-model-expand-btn, .stg-model-expand-icon, .stg-mx-srv-del, .stg-mx-always-chip, .stg-mx-ext-type, .stg-mx-ext-sub, .stg-mcp-section-header, .stg-mcp-empty-note,
14206
14122
  .stg-mcp-note span, .stg-ocp-oauth-wait, .stg-cap-filter, .stg-provider-status-disconnected, .ocp-config-footer, .ocp-config-link, .ocp-danger-meta,
14207
14123
  .stg-callout-note, .project-storage-path, .project-storage-item-meta, .project-storage-protection, .project-storage-group-path, .project-storage-group-total,
14208
14124
  .project-storage-group-empty, .project-storage-stat span, .project-storage-safety-note, .cc-cheatsheet-table th, .cc-tool-category-count, .cc-panel-row-label,
@@ -14286,11 +14202,6 @@
14286
14202
  .stg-mcp-note strong { font-size: 9px; }
14287
14203
  .stg-mcp-note span { font-size: 10.5px; }
14288
14204
  .stg-mcp-section-head { align-items: flex-start; flex-direction: column; gap: 6px; }
14289
- .stg-mcp-matrix-wrap::after { left: 134px; }
14290
- .stg-mx-label-th,
14291
- .stg-mx-label-td { width: 134px; min-width: 134px; }
14292
- .stg-mx-profile-th { min-width: 62px; max-width: 78px; }
14293
- .stg-mx-profile-name { max-width: 64px; font-size: 9.5px; }
14294
14205
  .stg-mcp-form-grid { grid-template-columns: 1fr; }
14295
14206
  /* Permissions — tighter items at medium width */
14296
14207
  .cc-tool-category .cc-integration-item { padding: 5px 8px; }
@@ -14325,14 +14236,8 @@
14325
14236
  .stg-toggle-row label { font-size: 11px; }
14326
14237
  .stg-mcp-note { flex-direction: column; }
14327
14238
  .stg-mcp-section-head { gap: 5px; }
14328
- .stg-mcp-matrix-wrap::after { left: 120px; }
14329
- .stg-mx-label-th,
14330
- .stg-mx-label-td { width: 120px; min-width: 120px; }
14331
- .stg-mx-corner-head { min-height: 48px; padding-bottom: 8px; }
14332
14239
  .stg-mx-ext-main { align-items: flex-start; flex-wrap: wrap; }
14333
14240
  .stg-mx-ext-remove { margin-left: 0; }
14334
- .stg-mx-ext-profiles { gap: 5px; }
14335
- .stg-mx-ext-toggle { min-height: 26px; }
14336
14241
  /* OpenCode responsive — narrow */
14337
14242
  .ocp-server-bar { flex-direction: column; align-items: stretch; gap: 8px; }
14338
14243
  .ocp-server-bar-right { justify-content: flex-start; }
@@ -14421,7 +14326,7 @@
14421
14326
 
14422
14327
  /* ── Buttons: 13px, 6px corners, a neutral fill with a hairline ── */
14423
14328
  .settings-panel .settings-content :is(.stg-action-btn, .cc-copy-btn, .cli-detect-btn, .bc-action-btn, .wa-btn, .project-storage-btn, .gfx-reset-btn,
14424
- .skin-upload-btn, .ocp-history-clear-btn, .stg-mx-add-btn, .conn-add-btn, .conn-action-btn, .ocp-srv-btn, .cc-explore-btn, .cc-trust-btn,
14329
+ .skin-upload-btn, .ocp-history-clear-btn, .conn-add-btn, .conn-action-btn, .ocp-srv-btn, .cc-explore-btn, .cc-trust-btn,
14425
14330
  .cc-enable-btn, .cc-disable-btn, .cc-remove-panel-btn, .skin-activate, .skin-remove) {
14426
14331
  min-height: 28px; padding: 4px 12px;
14427
14332
  font-family: inherit; font-size: 13px; font-weight: 400; line-height: 1.25;
@@ -14430,7 +14335,7 @@
14430
14335
  transition: background-color 0.15s ease, color 0.15s ease;
14431
14336
  }
14432
14337
  .settings-panel .settings-content :is(.stg-action-btn, .cc-copy-btn, .cli-detect-btn, .bc-action-btn, .wa-btn, .project-storage-btn, .gfx-reset-btn,
14433
- .skin-upload-btn, .ocp-history-clear-btn, .stg-mx-add-btn, .conn-add-btn, .conn-action-btn, .ocp-srv-btn, .cc-explore-btn, .cc-trust-btn,
14338
+ .skin-upload-btn, .ocp-history-clear-btn, .conn-add-btn, .conn-action-btn, .ocp-srv-btn, .cc-explore-btn, .cc-trust-btn,
14434
14339
  .cc-enable-btn, .cc-disable-btn, .cc-remove-panel-btn, .skin-activate, .skin-remove):hover:not(:disabled) {
14435
14340
  color: #fff; background: var(--stg-control-hover); border-color: var(--stg-field-line); transform: none;
14436
14341
  }
@@ -14510,11 +14415,11 @@
14510
14415
  .settings-panel .settings-content .stg-badge-warn { color: var(--stg-warn); }
14511
14416
  .settings-panel .settings-content .stg-badge-err { color: var(--stg-err); }
14512
14417
  .settings-panel .settings-content :is(.stg-badge-ok, .stg-badge-warn, .stg-badge-err, .cc-panel-status.active, .skin-active-badge, .stg-provider-status-connected)::before { background: currentColor; }
14513
- /* toggle chips (a skill's targets, a server's profiles): small 6px-corner buttons, the accent when on */
14514
- .settings-panel .settings-content :is(.cc-skill-target, .stg-mx-ext-toggle) {
14418
+ /* toggle chips (a skill's targets): small 6px-corner buttons, the accent when on */
14419
+ .settings-panel .settings-content :is(.cc-skill-target) {
14515
14420
  border-radius: 6px; font-size: 12px; letter-spacing: 0;
14516
14421
  }
14517
- .settings-panel .settings-content :is(.cc-skill-target, .stg-mx-ext-toggle).on { color: #fff; background: var(--stg-accent-fill); border-color: transparent; }
14422
+ .settings-panel .settings-content :is(.cc-skill-target).on { color: #fff; background: var(--stg-accent-fill); border-color: transparent; }
14518
14423
 
14519
14424
  /* Boxes inside a group (callouts, server bars, choice cards): one radius, a hairline, no tint or glow */
14520
14425
  .settings-panel .settings-content :is(.stg-mcp-note, .ocp-server-bar, .stg-mcp-add-form, .stg-callout, .wa-callout, .wa-mode-card, .wa-level-card,
@@ -14659,6 +14564,7 @@
14659
14564
  }
14660
14565
  .settings-panel .stg-card-status .ocp-status-dot[data-state="ok"] { background: var(--stg-ok); }
14661
14566
  .settings-panel .stg-card-status .ocp-status-dot[data-state="warn"] { background: var(--stg-warn); }
14567
+ .settings-panel .settings-content .ocp-install-note[data-tone="warn"] { color: var(--stg-warn); }
14662
14568
  .settings-panel .stg-card-status .ocp-status-dot[data-state="err"] { background: var(--stg-err); }
14663
14569
  .settings-panel .stg-card-status .ocp-server-bar-status { font-size: 12px; font-weight: 400; color: var(--stg-help); }
14664
14570
 
@@ -14882,17 +14788,8 @@
14882
14788
  min-width: 0; padding: 0; overflow-wrap: anywhere;
14883
14789
  font-family: var(--ff-mono, 'JetBrains Mono', 'SF Mono', monospace); font-size: 12px; color: var(--stg-text);
14884
14790
  }
14885
- .settings-panel .settings-content .stg-tool-row .stg-tool-select {
14886
- appearance: none; -webkit-appearance: none; flex-shrink: 0;
14887
- width: 110px; min-height: 24px; padding: 2px 24px 2px 9px;
14888
- font-family: var(--stg-font); font-size: 13px; line-height: 1.3; color: var(--stg-text);
14889
- background-color: var(--stg-control);
14890
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 12'%3E%3Cpath d='M1.2 4.4 4 1.6l2.8 2.8M1.2 7.6 4 10.4l2.8-2.8' fill='none' stroke='%23a1a1a6' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
14891
- background-repeat: no-repeat; background-position: right 8px center; background-size: 8px 12px;
14892
- border: 1px solid var(--stg-field-line); border-radius: 6px; box-shadow: none; cursor: pointer;
14893
- }
14894
- .settings-panel .settings-content .stg-tool-row .stg-tool-select:hover { background-color: var(--stg-control-hover); }
14895
- .settings-panel .settings-content .stg-tool-row .stg-tool-select option { color: #111; }
14791
+ /* the permission is a .cc-dropdown of its own width, at the end of the row */
14792
+ .settings-panel .settings-content .stg-tool-row .stg-ocp-tool-perm { flex: 0 0 110px; width: 110px; }
14896
14793
 
14897
14794
  /* H. History: label and help, the size as secondary text, the clear button */
14898
14795
  .settings-panel .settings-content .ocp-danger-row { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 16px; }
@@ -14934,6 +14831,7 @@
14934
14831
  ═══════════════════════════════════════════ */
14935
14832
  .settings-panel,
14936
14833
  .command-runner-panel,
14834
+ .schedules-studio-panel,
14937
14835
  .styleguide-panel {
14938
14836
  --stg-help: rgba(255,255,255,0.55);
14939
14837
  --stg-line: rgba(255,255,255,0.07);
@@ -14985,12 +14883,11 @@
14985
14883
  /* every row label is regular weight; titles above groups keep the semibold */
14986
14884
  .settings-panel .settings-content :is(.stg-field > label, .stg-toggle-label, .settings-field > label, .cc-integration-label, .cli-path-label, .recall-control-label,
14987
14885
  .gfx-label, .cc-panel-title, .stg-provider-name, .stg-row-label, .db-stat-label, .ocp-danger-title, .cc-greeting-label, .iface-accent-info .label,
14988
- .stg-mx-ext-name, .stg-mx-ext-toggle-name, .stg-mx-profile-name, .wa-title, .wa-radio > span > :first-child, .cc-skill-name, .skin-name,
14886
+ .stg-mx-ext-name, .wa-title, .wa-radio > span > :first-child, .cc-skill-name, .skin-name,
14989
14887
  .stg-model-toggle-name, .stg-tool-name, .project-storage-item-title-row strong, .bc-profile-name) { font-weight: 400; }
14990
14888
  .settings-panel .settings-content :is(.stg-field > label, .stg-toggle-label, .settings-field > label, .cli-path-label, .db-stat-label, .gfx-label) { font-size: 13px; color: var(--stg-text); }
14991
14889
  /* sub-headings inside a group, the names on choice cards and the matrix headers: medium, never bold */
14992
- .settings-panel .settings-content :is(.stg-subhead, .stg-subhead-status, .cc-tool-category-label, .cc-tool-group-header, .stg-mcp-section-header, .stg-mx-corner-head,
14993
- .recall-profile-name, .gfx-preset-name, .wa-mode-head, .wa-confirm-who, .wa-stages li.current) { font-weight: 500; }
14890
+ .settings-panel .settings-content :is(.stg-subhead, .stg-subhead-status, .cc-tool-category-label, .cc-tool-group-header, .stg-mcp-section-header, .recall-profile-name, .gfx-preset-name, .wa-mode-head, .wa-confirm-who, .wa-stages li.current) { font-weight: 500; }
14994
14891
  .settings-panel .settings-content :is(strong, b) { font-weight: 500; }
14995
14892
  .settings-panel .settings-content :is([style*="font-weight:600"], [style*="font-weight: 600"], [style*="font-weight:700"], [style*="font-weight: 700"],
14996
14893
  [style*="font-weight:650"], [style*="font-weight: 650"]) { font-weight: 500 !important; }
@@ -15027,9 +14924,9 @@
15027
14924
 
15028
14925
  /* ── Push button: 22px, 12px / 500, 5px corners, a faint fill and a hairline. Nothing in the panel is bigger. ── */
15029
14926
  .settings-panel .settings-content :is(.stg-action-btn, .cc-copy-btn, .cli-detect-btn, .bc-action-btn, .wa-btn, .wa-primary, .project-storage-btn, .gfx-reset-btn,
15030
- .skin-upload-btn, .stg-mx-add-btn, .conn-add-btn, .conn-action-btn, .ocp-srv-btn, .cc-explore-btn, .cc-trust-btn, .cc-enable-btn, .cc-disable-btn,
14927
+ .skin-upload-btn, .conn-add-btn, .conn-action-btn, .ocp-srv-btn, .cc-explore-btn, .cc-trust-btn, .cc-enable-btn, .cc-disable-btn,
15031
14928
  .cc-remove-panel-btn, .skin-activate, .skin-remove, .db-reindex-btn, .stg-save-btn, .settings-toggle-vis, .stg-push-btn, .cc-tool-category-all,
15032
- .stg-mx-ext-toggle, .cc-skill-target),
14929
+ .cc-skill-target),
15033
14930
  .settings-panel .settings-content .stg-card :is(.stg-action-btn, .cc-copy-btn, .cli-detect-btn, .stg-save-btn, .gfx-reset-btn, .cc-skill-target),
15034
14931
  .settings-panel .settings-content .ocp-server-bar .ocp-srv-btn,
15035
14932
  .settings-panel .settings-content .stg-provider-card .stg-action-btn.compact,
@@ -15043,9 +14940,9 @@
15043
14940
  cursor: pointer; transition: background-color 0.15s ease, color 0.15s ease;
15044
14941
  }
15045
14942
  .settings-panel .settings-content :is(.stg-action-btn, .cc-copy-btn, .cli-detect-btn, .bc-action-btn, .wa-btn, .wa-primary, .project-storage-btn, .gfx-reset-btn,
15046
- .skin-upload-btn, .stg-mx-add-btn, .conn-add-btn, .conn-action-btn, .ocp-srv-btn, .cc-explore-btn, .cc-trust-btn, .cc-enable-btn, .cc-disable-btn,
14943
+ .skin-upload-btn, .conn-add-btn, .conn-action-btn, .ocp-srv-btn, .cc-explore-btn, .cc-trust-btn, .cc-enable-btn, .cc-disable-btn,
15047
14944
  .cc-remove-panel-btn, .skin-activate, .skin-remove, .db-reindex-btn, .stg-save-btn, .settings-toggle-vis, .stg-push-btn, .cc-tool-category-all,
15048
- .stg-mx-ext-toggle, .cc-skill-target):hover:not(:disabled) { color: #fff; background: rgba(255,255,255,0.11); border-color: rgba(255,255,255,0.10); transform: none; filter: none; }
14945
+ .cc-skill-target):hover:not(:disabled) { color: #fff; background: rgba(255,255,255,0.11); border-color: rgba(255,255,255,0.10); transform: none; filter: none; }
15049
14946
  .settings-panel .settings-content :is(.stg-action-btn, .cc-copy-btn, .bc-action-btn, .wa-btn, .wa-primary, .conn-add-btn, .ocp-srv-btn, .stg-save-btn):active { transform: none; }
15050
14947
  .settings-panel .settings-content :is(.stg-action-btn, .cc-copy-btn, .cli-detect-btn, .bc-action-btn, .wa-btn, .conn-add-btn, .conn-action-btn, .ocp-srv-btn,
15051
14948
  .project-storage-btn, .skin-upload-btn, .gfx-reset-btn, .stg-push-btn, .db-reindex-btn) svg { width: 12px; height: 12px; flex-shrink: 0; }
@@ -15053,15 +14950,15 @@
15053
14950
  .settings-panel .settings-content :is(.stg-save-btn, .wa-btn-accent, .wa-primary, .bc-action-save),
15054
14951
  .settings-panel .stg-pane-actions .bc-action-btn.bc-action-save { color: #fff; background: var(--stg-accent-fill); border-color: transparent; }
15055
14952
  .settings-panel .settings-content :is(.stg-save-btn, .wa-btn-accent, .wa-primary, .bc-action-save):hover:not(:disabled) { color: #fff; background: var(--stg-accent-fill-hover); border-color: transparent; }
15056
- /* toggle chips (a skill's targets, a server's profiles, a category's "All"): the push button, filled when on */
15057
- .settings-panel .settings-content :is(.cc-skill-target, .stg-mx-ext-toggle, .cc-tool-category-all) { padding: 0 8px; font-weight: 400; }
15058
- .settings-panel .settings-content :is(.cc-skill-target, .stg-mx-ext-toggle, .cc-tool-category-all).on { color: #fff; background: var(--stg-accent-fill); border-color: transparent; }
14953
+ /* toggle chips (a skill's targets, a category's "All"): the push button, filled when on */
14954
+ .settings-panel .settings-content :is(.cc-skill-target, .cc-tool-category-all) { padding: 0 8px; font-weight: 400; }
14955
+ .settings-panel .settings-content :is(.cc-skill-target, .cc-tool-category-all).on { color: #fff; background: var(--stg-accent-fill); border-color: transparent; }
15059
14956
  .settings-panel .settings-content :is(.wa-btn-danger, .ocp-srv-btn-stop, .project-storage-btn.danger, .cc-remove-panel-btn) { color: var(--stg-text); }
15060
14957
  .settings-panel .settings-content :is(.wa-btn-danger, .project-storage-btn.danger, .cc-remove-panel-btn):hover:not(:disabled) { color: var(--stg-err); }
15061
14958
  .settings-panel .settings-content .cc-trust-btn { color: var(--stg-warn); }
15062
14959
  .settings-panel .settings-content :is(button, .stg-action-btn):disabled { opacity: 0.45; cursor: default; }
15063
14960
  /* icon-only buttons: 22×22 */
15064
- .settings-panel .settings-content :is(.ocp-srv-btn-icon, .settings-toggle-vis, .discord-eye-btn, .stg-mx-add-btn, .stg-ocp-key-cancel),
14961
+ .settings-panel .settings-content :is(.ocp-srv-btn-icon, .settings-toggle-vis, .discord-eye-btn, .stg-ocp-key-cancel),
15065
14962
  .settings-panel .settings-content .ocp-server-bar .ocp-srv-btn.ocp-srv-btn-icon,
15066
14963
  .settings-panel .settings-content .stg-card :is(.stg-action-btn.discord-eye-btn, .stg-action-btn.stg-ocp-key-cancel, .conn-add-btn.settings-toggle-vis, .settings-toggle-vis) { width: 22px; min-width: 22px; padding: 0; }
15067
14964
  .settings-panel .settings-content :is(.ocp-srv-btn-icon, .settings-toggle-vis, .discord-eye-btn) svg { width: 12px; height: 12px; }
@@ -15210,8 +15107,7 @@
15210
15107
  .settings-panel :is(.stg-dropdown, .bc-dropdown) .cc-dropdown-item { padding: 3px 9px; font-size: 12px; }
15211
15108
  .settings-panel .settings-content .cc-dropdown-item { font-size: 12px; }
15212
15109
  .settings-panel .settings-content select,
15213
- .settings-panel .settings-content .stg-card select.stg-input,
15214
- .settings-panel .settings-content .stg-tool-row .stg-tool-select {
15110
+ .settings-panel .settings-content .stg-card select.stg-input {
15215
15111
  appearance: none; -webkit-appearance: none;
15216
15112
  height: 22px; min-height: 22px; box-sizing: border-box; width: auto; min-width: 110px; padding: 0 22px 0 8px;
15217
15113
  font-family: var(--stg-font); font-size: 12px; line-height: 20px; color: var(--stg-text);
@@ -15220,7 +15116,6 @@
15220
15116
  background-repeat: no-repeat; background-position: right 7px center; background-size: 7px 10px;
15221
15117
  border: 1px solid rgba(255,255,255,0.10); border-radius: 5px; box-shadow: none; cursor: pointer;
15222
15118
  }
15223
- .settings-panel .settings-content .stg-tool-row .stg-tool-select { width: 110px; }
15224
15119
  /* controls that carry their old size inline (AI decisions, Automations): the scale wins */
15225
15120
  .settings-panel .settings-content select[style] {
15226
15121
  height: 22px !important; padding: 0 22px 0 8px !important; line-height: 20px !important;
@@ -15332,6 +15227,8 @@
15332
15227
  .settings-panel .settings-content .uc-save-status { margin: 0 0 8px; max-width: none; color: var(--stg-err); }
15333
15228
  .settings-panel .settings-content .uc-applies { margin: 0 0 2px; max-width: none; }
15334
15229
  .settings-panel .settings-content :is(.uc-status-note, .uc-save-status, .uc-applies)[hidden] { display: none; }
15230
+ /* SynaBun hooks in Claude Code: Repair, a text action under the switch's notes (its text in line with theirs) */
15231
+ .settings-panel .settings-content .stg-card .cc-copy-btn.ch-repair { margin: 4px 0 0 -4px; }
15335
15232
  .settings-panel .settings-content .uc-digest { margin: 14px 0 16px; }
15336
15233
  /* Settings → Automations → Greeting: the preview is the card every panel shows (shared/greeting/), set left in the section. */
15337
15234
  .settings-panel .settings-content .gr-preview { margin-bottom: 4px; }
@@ -16152,7 +16049,7 @@
16152
16049
  color: var(--t-dimmed);
16153
16050
  flex-shrink: 0;
16154
16051
  }
16155
- .explorer-memory[draggable="true"] { cursor: grab; }
16052
+ .explorer-memory[draggable="true"] { cursor: move; }
16156
16053
  .explorer-memory.dragging { opacity: 0.4; }
16157
16054
 
16158
16055
  /* Label — truncated */
@@ -16330,7 +16227,7 @@
16330
16227
  font-size: 11px;
16331
16228
  text-align: center;
16332
16229
  color: rgba(255,255,255,0.15);
16333
- cursor: grab;
16230
+ cursor: move;
16334
16231
  opacity: 0;
16335
16232
  transition: opacity 0.15s;
16336
16233
  flex-shrink: 0;
@@ -16966,7 +16863,7 @@
16966
16863
  outline-offset: -1px;
16967
16864
  border-radius: 4px;
16968
16865
  }
16969
- .fe-tree--dragging .fe-row { cursor: grabbing; }
16866
+ .fe-tree--dragging .fe-row { cursor: move; }
16970
16867
 
16971
16868
  /* Chevron */
16972
16869
  .fe-chevron {
@@ -17632,12 +17529,14 @@
17632
17529
  --ed-menu-hover: var(--s-hover);
17633
17530
  --ed-menu-radius: 8px;
17634
17531
  --ed-menu-shadow: 0 12px 32px rgba(0,0,0,0.4);
17532
+ /* Fills the app frame (flush, so the frame's 16px corners are its own) beside a docked right sidepanel */
17635
17533
  position: fixed;
17636
- top: var(--navbar-height, 48px);
17637
- left: calc(var(--sidebar-total-width, 0px));
17638
- right: var(--right-panel-width, var(--claude-panel-width, 0px));
17534
+ top: var(--frame-top);
17535
+ left: var(--frame-left);
17536
+ right: max(var(--frame-gap), var(--right-panel-width, var(--claude-panel-width, 0px)));
17639
17537
  margin-right: var(--right-panel-gap, var(--claude-panel-gap, 0px));
17640
- height: calc(100dvh - var(--navbar-height, 48px));
17538
+ height: calc(100dvh - var(--frame-top) - var(--frame-gap));
17539
+ border-radius: var(--frame-radius);
17641
17540
  z-index: 198;
17642
17541
  display: flex;
17643
17542
  flex-direction: column;
@@ -18365,7 +18264,7 @@
18365
18264
  /* ── Multi-select bar (shared) ── */
18366
18265
  #multi-select-bar {
18367
18266
  position: fixed;
18368
- top: 62px;
18267
+ top: calc(var(--frame-top) + 6px); /* 62px under the 48px bar, inside the app frame under a taller one */
18369
18268
  left: calc(var(--sidebar-total-width, 0px) + (100% - var(--sidebar-total-width, 0px) - var(--right-panel-width, var(--claude-panel-width, 0px))) / 2);
18370
18269
  transform: translateX(-50%);
18371
18270
  transition: left 0.3s cubic-bezier(0.22, 1, 0.36, 1);
@@ -18944,7 +18843,7 @@
18944
18843
  border-radius: 6px;
18945
18844
  background: hsla(210, 20%, 20%, 0.35);
18946
18845
  border: 1px solid transparent;
18947
- cursor: grab;
18846
+ cursor: move;
18948
18847
  transition: background 0.15s, border-color 0.15s;
18949
18848
  }
18950
18849
  .awiz-rule-item:hover { background: hsla(210, 20%, 25%, 0.45); }
@@ -18958,7 +18857,7 @@
18958
18857
  .awiz-rule-grip {
18959
18858
  font-size: 16px;
18960
18859
  color: var(--t-faint);
18961
- cursor: grab;
18860
+ cursor: move;
18962
18861
  user-select: none;
18963
18862
  line-height: 1;
18964
18863
  }
@@ -19149,720 +19048,1063 @@
19149
19048
  }
19150
19049
 
19151
19050
  /* ══════════════════════════════════════════════
19152
- SKILLS STUDIO PANEL
19153
- ══════════════════════════════════════════════ */
19154
-
19155
- /* Disable native tooltips in Skills Studio — use custom tooltips */
19156
- .skills-studio-panel [data-tooltip] {
19157
- position: relative;
19158
- }
19159
- /* Hide title attribute tooltips on any element within Skills Studio */
19160
- .skills-studio-panel [title] {
19161
- position: relative;
19162
- }
19163
-
19164
-
19165
- .skills-studio-panel {
19166
- --accent-hue: 215;
19167
- --accent-saturation: 16%;
19168
- --accent-lightness: 65%;
19169
- position: fixed; z-index: 300000;
19170
- width: 900px; max-width: 95vw; min-width: 380px;
19171
- height: 520px; max-height: 88vh; min-height: 320px;
19172
- display: flex; flex-direction: column;
19173
- overflow: hidden;
19174
- opacity: 0; transform: scale(0.97);
19175
- transition: opacity 0.15s ease, transform 0.15s ease;
19176
- container-type: inline-size;
19177
- container-name: ss;
19178
- }
19179
- .skills-studio-panel.open { opacity: 1; transform: scale(1); }
19180
-
19181
- /* ── Header ── */
19182
- .ss-header {
19183
- display: flex; align-items: center; gap: 10px;
19184
- padding: 8px 14px;
19185
- border-bottom: 1px solid rgba(255,255,255,0.04);
19186
- background: linear-gradient(to bottom, rgba(255,255,255,0.025), transparent);
19187
- flex-shrink: 0; user-select: none;
19188
- }
19189
- .ss-header-left {
19190
- display: flex; align-items: center; gap: 8px; flex: 1; min-width: 0;
19191
- }
19192
- .ss-header h3 { margin: 0; font-family: var(--ff-heading); font-size: var(--fs-base); font-weight: 500; color: var(--t-bright); white-space: nowrap; letter-spacing: 0.02em; }
19193
- .ss-count {
19194
- font-size: 10px; color: rgba(255,255,255,0.35);
19195
- background: rgba(255,255,255,0.02); padding: 2px 8px; border-radius: var(--r-pill);
19196
- font-weight: 500; letter-spacing: 0.02em;
19197
- border: 1px solid rgba(255,255,255,0.05);
19198
- }
19199
- .ss-header-actions { display: flex; gap: 6px; flex-shrink: 0; }
19200
- .ss-header-btn {
19201
- padding: 5px 12px; border-radius: 8px;
19202
- font-size: var(--fs-xs); font-weight: 500;
19203
- background: transparent; border: 1px solid transparent;
19204
- color: var(--t-secondary); cursor: pointer;
19205
- transition: all 0.15s ease;
19206
- letter-spacing: 0.01em;
19207
- }
19208
- .ss-header-btn:hover {
19209
- background: rgba(255,255,255,0.06);
19210
- color: var(--t-bright);
19211
- border-color: rgba(255,255,255,0.08);
19212
- }
19213
- .ss-header-btn:active {
19214
- background: rgba(255,255,255,0.1);
19215
- }
19216
- .ss-header-btn:disabled { opacity: 0.3; cursor: default; pointer-events: none; }
19217
- .ss-close {
19218
- width: 26px; height: 26px; display: flex; align-items: center; justify-content: center;
19219
- font-size: 16px; color: var(--t-muted); background: none; border: none;
19220
- cursor: pointer; border-radius: 8px; flex-shrink: 0;
19221
- transition: all 0.15s ease;
19222
- }
19223
- .ss-close:hover { background: rgba(255,82,82,0.1); color: rgba(255,100,100,0.9); }
19224
-
19225
-
19226
- /* ── Body layout ── */
19227
- .ss-body { display: flex; flex: 1; min-height: 0; overflow: hidden; }
19228
-
19229
- /* ── Sidebar ── */
19230
- .ss-sidebar {
19231
- width: 300px; flex-shrink: 0;
19232
- border-right: 1px solid var(--b-subtle);
19233
- display: flex; flex-direction: column; overflow: hidden;
19234
- }
19235
- .ss-search-wrap { padding: 10px 12px 4px; }
19236
- .ss-search {
19237
- width: 100%; padding: 7px 10px;
19238
- background: rgba(255,255,255,0.04); border: 1px solid rgba(255,255,255,0.08);
19239
- border-radius: var(--r-small); font-size: var(--fs-xs);
19240
- color: var(--t-bright); outline: none;
19241
- transition: all 0.15s ease;
19242
- }
19243
- .ss-search:hover { border-color: rgba(255,255,255,0.12); }
19244
- .ss-search:focus {
19245
- border-color: rgba(148, 163, 184, 0.4);
19246
- background: rgba(148, 163, 184, 0.05);
19247
- box-shadow: 0 0 0 2px rgba(148, 163, 184, 0.08);
19248
- }
19249
- .ss-search::placeholder { color: var(--t-faint); }
19250
- .ss-filters {
19251
- display: flex; gap: 5px; padding: 8px 10px; flex-wrap: wrap;
19252
- }
19253
- .ss-filter {
19254
- display: inline-flex; align-items: center; gap: 5px;
19255
- padding: 4px 10px; border-radius: var(--r-pill);
19256
- font-size: 10px; font-weight: 500;
19257
- background: transparent; border: 1px solid rgba(255,255,255,0.1);
19258
- color: var(--t-muted); cursor: pointer;
19259
- transition: all 0.15s ease;
19260
- letter-spacing: 0.01em;
19261
- }
19262
- .ss-filter:hover {
19263
- border-color: rgba(255,255,255,0.16);
19264
- color: var(--t-secondary);
19265
- background: rgba(255,255,255,0.05);
19266
- }
19267
- .ss-filter.active {
19268
- background: rgba(148, 163, 184, 0.12);
19269
- border-color: rgba(148, 163, 184, 0.3);
19270
- color: rgba(148, 163, 184, 0.9);
19271
- }
19272
- /* ── Filter/type color dots ── */
19273
- .ss-filter-dot {
19274
- display: inline-block; width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0;
19275
- }
19276
- .ss-filter-dot.skill { background: hsla(210, 20%, 62%, 1); box-shadow: none; }
19277
- .ss-filter-dot.command { background: hsla(40, 25%, 58%, 1); box-shadow: none; }
19278
- .ss-filter-dot.agent { background: hsla(18, 25%, 58%, 1); box-shadow: none; }
19279
- .ss-library { flex: 1; overflow-y: auto; overflow-x: hidden; padding-bottom: 8px; }
19280
-
19281
- /* ── Library groups ── */
19282
- .ss-group { margin-top: 2px; }
19283
- .ss-group-header {
19284
- display: flex; align-items: center; gap: 6px;
19285
- padding: 8px 14px 5px; font-size: 10px; font-weight: 600;
19286
- text-transform: uppercase; letter-spacing: 0.06em;
19287
- color: var(--t-faint); user-select: none;
19288
- }
19289
- .ss-group-count {
19290
- font-size: 9px; background: var(--s-subtle);
19291
- padding: 1px 6px; border-radius: var(--r-pill); color: var(--t-muted);
19292
- font-weight: 500;
19293
- }
19294
- .ss-item {
19295
- display: flex; align-items: center; gap: 10px;
19296
- padding: 7px 14px; cursor: pointer;
19297
- border-left: 2px solid transparent;
19298
- transition: background 0.12s ease;
19299
- }
19300
- .ss-item:hover { background: var(--s-subtle); }
19301
- .ss-item.active {
19302
- background: var(--s-light);
19303
- border-left-color: hsla(var(--accent-hue, 174), 60%, 55%, 0.8);
19304
- }
19305
- .ss-item-icon {
19306
- width: 28px; height: 28px; border-radius: 7px;
19307
- display: flex; align-items: center; justify-content: center;
19308
- flex-shrink: 0; line-height: 1;
19309
- }
19310
- .ss-item-icon svg { width: 14px; height: 14px; }
19311
- .ss-item-icon.skill { background: hsla(210, 15%, 50%, 0.12); color: hsla(210, 18%, 68%, 1); }
19312
- .ss-item-icon.command { background: hsla(40, 18%, 48%, 0.12); color: hsla(40, 22%, 65%, 1); }
19313
- .ss-item-icon.agent { background: hsla(18, 18%, 48%, 0.12); color: hsla(18, 22%, 65%, 1); }
19314
- .ss-item-icon.has-custom { background: transparent; padding: 2px; }
19315
- .ss-item-custom-icon { width: 24px; height: 24px; object-fit: contain; border-radius: 4px; }
19316
- .ss-item-info { flex: 1; min-width: 0; }
19317
- .ss-item-name {
19318
- font-size: var(--fs-xs); font-weight: 600; color: var(--t-primary);
19319
- white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
19320
- display: flex; align-items: center; gap: 6px;
19321
- }
19322
- .ss-item-desc {
19323
- font-size: 10px; color: var(--t-faint); margin-top: 2px;
19324
- white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
19325
- line-height: 1.3;
19326
- }
19327
- .ss-empty { padding: 24px 16px; text-align: center; color: var(--t-muted); font-size: var(--fs-xs); }
19328
- .ss-item-name .ss-badge { font-size: 8px; padding: 1px 5px; vertical-align: middle; }
19329
-
19330
- /* ── Badges ── */
19331
- .ss-badge {
19332
- display: inline-flex; align-items: center; gap: 5px;
19333
- font-size: 10px; padding: 2px 8px; border-radius: var(--r-pill);
19334
- font-weight: 500; white-space: nowrap;
19335
- border: 1px solid transparent; letter-spacing: 0.01em;
19336
- }
19337
- .ss-badge--skill { background: hsla(210, 12%, 50%, 0.08); color: hsla(210, 16%, 65%, 1); border-color: hsla(210, 12%, 50%, 0.12); }
19338
- .ss-badge--command { background: hsla(40, 15%, 48%, 0.08); color: hsla(40, 20%, 62%, 1); border-color: hsla(40, 15%, 48%, 0.12); }
19339
- .ss-badge--agent { background: hsla(18, 15%, 48%, 0.08); color: hsla(18, 20%, 62%, 1); border-color: hsla(18, 15%, 48%, 0.12); }
19340
- .ss-badge--scope { background: var(--s-subtle); color: var(--t-muted); border-color: var(--b-subtle); }
19341
- .ss-badge--muted { background: var(--s-subtle); color: var(--t-faint); border-color: var(--b-subtle); }
19342
- .ss-badge--blue { background: hsla(210, 12%, 50%, 0.06); color: hsla(210, 14%, 62%, 0.85); border-color: hsla(210, 12%, 50%, 0.1); }
19343
-
19344
- /* ── Main area ── */
19345
- .ss-main { flex: 1; min-width: 0; overflow: hidden; display: flex; flex-direction: column; }
19346
- .ss-loading {
19347
- flex: 1; display: flex; align-items: center; justify-content: center;
19348
- color: var(--t-muted); font-size: var(--fs-sm);
19349
- }
19350
-
19351
- /* ── Welcome / overview ── */
19352
- .ss-welcome {
19353
- flex: 1; display: flex; flex-direction: column;
19354
- align-items: center; justify-content: center; gap: 16px;
19355
- padding: 48px 48px 40px; text-align: center;
19356
- background: linear-gradient(180deg, rgba(148,163,184,0.03) 0%, transparent 60%);
19357
- }
19358
- .ss-welcome-hero {
19359
- display: flex; flex-direction: column;
19360
- align-items: center; gap: 2px; position: relative;
19361
- }
19362
- .ss-welcome-logo {
19363
- width: 260px; height: auto;
19364
- opacity: 0.88;
19365
- filter: drop-shadow(0 1px 4px rgba(0, 0, 0, 0.3));
19366
- animation: ss-logo-float 3s ease-in-out infinite;
19367
- }
19368
- @keyframes ss-logo-float {
19369
- 0%, 100% { transform: translateY(0px); }
19370
- 50% { transform: translateY(-4px); }
19371
- }
19372
- .ss-welcome-hero h2 {
19373
- margin: 0;
19374
- font-family: 'Disket Mono', 'JetBrains Mono', monospace;
19375
- font-size: 1.55rem; font-weight: 600;
19376
- color: rgba(255,255,255,0.88);
19377
- letter-spacing: -0.02em; line-height: 1.2;
19378
- text-shadow: 0 1px 3px rgba(0,0,0,0.25);
19379
- }
19380
- .ss-welcome-sub {
19381
- font-family: 'JetBrains Mono', monospace;
19382
- color: rgba(255,255,255,0.35); font-size: 0.75rem; margin: 0; max-width: 380px;
19383
- line-height: 1.6; font-weight: 400; letter-spacing: 0.03em;
19384
- }
19385
- .ss-stats-row {
19386
- display: flex; gap: 0; margin-top: 16px;
19387
- animation: ss-stats-in 0.5s ease 0.2s both;
19388
- }
19389
- @keyframes ss-stats-in {
19390
- from { opacity: 0; transform: translateY(8px); }
19391
- to { opacity: 1; transform: translateY(0); }
19392
- }
19393
- .ss-stat {
19394
- display: flex; flex-direction: column; align-items: center; gap: 4px;
19395
- padding: 14px 28px; position: relative;
19396
- transition: opacity 0.2s ease;
19397
- }
19398
- .ss-stat + .ss-stat::before {
19399
- content: ''; position: absolute; left: 0; top: 18%;
19400
- width: 1px; height: 64%;
19401
- background: rgba(255,255,255,0.06);
19402
- }
19403
- .ss-stat:hover { opacity: 0.7; }
19404
- .ss-stat-num {
19405
- font-size: 26px; font-weight: 600; color: rgba(255,255,255,0.85);
19406
- letter-spacing: -0.02em; line-height: 1;
19407
- font-family: 'JetBrains Mono', monospace;
19408
- }
19409
- .ss-stat-label {
19410
- display: inline-flex; align-items: center; gap: 5px;
19411
- font-size: 10px; color: rgba(255,255,255,0.38); font-weight: 500;
19412
- text-transform: uppercase; letter-spacing: 1.2px;
19413
- }
19414
- .ss-welcome-hint {
19415
- color: rgba(255,255,255,0.35); font-size: 12px; margin-top: 8px;
19416
- font-weight: 400; letter-spacing: 0.01em;
19417
- }
19418
-
19419
- /* ── Editor header ── */
19420
- .ss-editor-header {
19421
- display: flex; align-items: center; gap: 8px;
19422
- padding: 8px 14px; border-bottom: 1px solid rgba(255,255,255,0.04);
19423
- background: linear-gradient(to bottom, rgba(255,255,255,0.02), transparent);
19424
- flex-shrink: 0;
19425
- }
19426
- .ss-back-btn {
19427
- padding: 3px 10px; border-radius: var(--r-button);
19428
- font-size: var(--fs-xs); background: none; border: 1px solid var(--b-subtle);
19429
- color: var(--t-muted); cursor: pointer; transition: all 0.15s ease;
19430
- }
19431
- .ss-back-btn:hover { border-color: var(--b-light); color: var(--t-secondary); }
19432
- .ss-editor-name { font-family: var(--ff-heading); font-size: var(--fs-sm); font-weight: 600; color: var(--t-bright); letter-spacing: 0.02em; }
19433
- .ss-editor-spacer { flex: 1; }
19434
- .ss-save-btn.dirty {
19435
- background: hsla(var(--accent-hue, 174), 50%, 42%, 0.15) !important;
19436
- border-color: hsla(var(--accent-hue, 174), 50%, 45%, 0.35) !important;
19437
- color: hsla(var(--accent-hue, 174), 60%, 60%, 1) !important;
19438
- box-shadow: none;
19439
- }
19440
- .ss-export-btn:hover { background: hsla(var(--accent-hue, 174), 40%, 38%, 0.12); color: hsla(var(--accent-hue, 174), 55%, 58%, 1); border-color: hsla(var(--accent-hue, 174), 40%, 38%, 0.2); }
19441
- .ss-delete-btn { color: var(--t-faint); }
19442
- .ss-delete-btn:hover { background: hsla(0, 45%, 45%, 0.15) !important; color: hsla(0, 65%, 68%, 1) !important; border-color: hsla(0, 45%, 45%, 0.25) !important; }
19443
- .ss-discard-btn:hover:not(:disabled) { background: hsla(35, 45%, 45%, 0.12); color: hsla(35, 60%, 65%, 1); border-color: hsla(35, 45%, 45%, 0.2); }
19444
- .ss-install-btn { background: hsla(140, 35%, 40%, 0.1); border-color: hsla(140, 35%, 40%, 0.18); color: hsla(140, 45%, 62%, 1); }
19445
- .ss-install-btn:hover { background: hsla(140, 35%, 40%, 0.18); border-color: hsla(140, 35%, 40%, 0.25); }
19446
-
19447
- /* ── Editor body (2-column) ── */
19448
- .ss-editor-body { display: flex; flex: 1; min-height: 0; overflow: hidden; }
19449
- .ss-editor-meta {
19450
- width: 250px; flex-shrink: 0;
19451
- border-right: 1px solid var(--b-subtle);
19452
- overflow-y: auto; padding: 12px;
19453
- display: flex; flex-direction: column; gap: 2px;
19454
- }
19455
- .ss-editor-content { flex: 1; display: flex; flex-direction: column; min-width: 0; }
19456
- .ss-content-toolbar {
19457
- display: flex; align-items: center; justify-content: space-between;
19458
- padding: 5px 12px; border-bottom: 1px solid var(--b-subtle);
19459
- flex-shrink: 0;
19460
- }
19461
- .ss-content-label { font-size: 10px; color: var(--t-faint); text-transform: uppercase; letter-spacing: 0.5px; }
19462
- .ss-wrap-btn {
19463
- font-size: 10px; padding: 2px 8px; border-radius: var(--r-pill);
19464
- background: none; border: 1px solid var(--b-subtle);
19465
- color: var(--t-muted); cursor: pointer;
19466
- transition: all 0.15s ease;
19467
- }
19468
- .ss-wrap-btn:hover { border-color: var(--b-light); color: var(--t-secondary); }
19469
- .ss-md-editor {
19470
- flex: 1; background: rgba(0,0,0,0.15); border: none; border-radius: 0;
19471
- padding: 12px 14px;
19472
- font-family: 'JetBrains Mono', 'SF Mono', 'Consolas', monospace;
19473
- font-size: 12px; line-height: 1.65; color: var(--t-bright);
19474
- resize: none; outline: none; tab-size: 2;
19475
- white-space: pre; overflow-wrap: normal; overflow-x: auto;
19476
- }
19477
- .ss-md-editor.wrap { white-space: pre-wrap; overflow-wrap: break-word; overflow-x: hidden; }
19478
-
19479
- /* ── Markdown toolbar ── */
19480
- .ss-md-toolbar {
19481
- display: flex; align-items: center; gap: 1px;
19482
- padding: 3px 6px; border-bottom: 1px solid var(--b-subtle);
19483
- background: rgba(0,0,0,0.08); flex-shrink: 0;
19484
- }
19485
- .ss-md-toolbar-sep {
19486
- width: 1px; height: 16px; background: var(--b-subtle); margin: 0 4px;
19487
- }
19488
- .ss-md-tool {
19489
- width: 26px; height: 24px; display: flex; align-items: center; justify-content: center;
19490
- background: none; border: 1px solid transparent; border-radius: var(--r-small);
19491
- color: var(--t-muted); cursor: pointer; font-size: 13px; padding: 0;
19492
- transition: all 0.12s ease; font-weight: 600;
19493
- }
19494
- .ss-md-tool:hover { background: var(--s-hover); border-color: var(--b-subtle); color: var(--t-bright); }
19495
- .ss-md-tool:active { background: var(--s-light); }
19496
- .ss-md-tool svg { width: 14px; height: 14px; stroke: currentColor; fill: none; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }
19497
- .ss-md-tool[data-active="true"] { background: var(--s-light); color: var(--t-bright); border-color: var(--b-light); }
19498
-
19499
- /* ── Preview/Raw toggle in toolbar ── */
19500
- .ss-view-toggle {
19501
- display: flex; margin-left: auto; border: 1px solid var(--b-subtle); border-radius: var(--r-small); overflow: hidden;
19502
- }
19503
- .ss-view-toggle-btn {
19504
- padding: 2px 10px; font-size: 10px; font-weight: 500;
19505
- background: none; border: none; color: var(--t-muted);
19506
- cursor: pointer; transition: all 0.12s ease;
19507
- text-transform: uppercase; letter-spacing: 0.3px;
19508
- }
19509
- .ss-view-toggle-btn:hover { color: var(--t-secondary); }
19510
- .ss-view-toggle-btn.active {
19511
- background: var(--s-light); color: var(--t-bright);
19512
- }
19513
-
19514
- /* ── Markdown preview pane ── */
19515
- .ss-md-preview {
19516
- flex: 1; padding: 16px 18px; overflow-y: auto;
19517
- font-family: inherit; font-size: 13px; line-height: 1.7;
19518
- color: var(--t-primary); display: none;
19519
- }
19520
- .ss-md-preview.visible { display: block; }
19521
- .ss-md-preview h1 { font-size: 20px; font-weight: 700; color: var(--t-bright); margin: 0 0 12px; padding-bottom: 8px; border-bottom: 1px solid var(--b-subtle); }
19522
- .ss-md-preview h2 { font-size: 16px; font-weight: 600; color: var(--t-bright); margin: 20px 0 8px; padding-bottom: 6px; border-bottom: 1px solid var(--b-subtle); }
19523
- .ss-md-preview h3 { font-size: 14px; font-weight: 600; color: var(--t-bright); margin: 16px 0 6px; }
19524
- .ss-md-preview h4 { font-size: 12px; font-weight: 600; color: var(--t-secondary); margin: 12px 0 4px; text-transform: uppercase; letter-spacing: 0.3px; }
19525
- .ss-md-preview p { margin: 0 0 10px; }
19526
- .ss-md-preview ul, .ss-md-preview ol { margin: 0 0 10px; padding-left: 22px; }
19527
- .ss-md-preview li { margin-bottom: 4px; }
19528
- .ss-md-preview strong { font-weight: 600; color: var(--t-bright); }
19529
- .ss-md-preview em { font-style: italic; color: var(--t-secondary); }
19530
- .ss-md-preview code {
19531
- font-family: 'JetBrains Mono', monospace; font-size: 11.5px;
19532
- background: rgba(0,0,0,0.25); padding: 2px 5px; border-radius: 3px;
19533
- color: hsla(var(--accent-hue, 174), 50%, 72%, 1);
19534
- }
19535
- .ss-md-preview pre {
19536
- background: rgba(0,0,0,0.3); border: 1px solid var(--b-subtle);
19537
- border-radius: var(--r-small); padding: 12px 14px; margin: 8px 0 12px;
19538
- overflow-x: auto;
19539
- }
19540
- .ss-md-preview pre code { background: none; padding: 0; color: var(--t-primary); font-size: 11.5px; }
19541
- .ss-md-preview blockquote {
19542
- border-left: 3px solid hsla(var(--accent-hue, 174), 50%, 55%, 0.4);
19543
- margin: 8px 0; padding: 4px 14px; color: var(--t-muted); font-style: italic;
19544
- }
19545
- .ss-md-preview a { color: hsla(var(--accent-hue, 174), 60%, 65%, 1); text-decoration: none; }
19546
- .ss-md-preview a:hover { text-decoration: underline; }
19547
- .ss-md-preview hr { border: none; border-top: 1px solid var(--b-subtle); margin: 16px 0; }
19548
- .ss-md-preview table { border-collapse: collapse; width: 100%; margin: 8px 0 12px; font-size: 12px; }
19549
- .ss-md-preview th, .ss-md-preview td { padding: 6px 10px; border: 1px solid var(--b-subtle); text-align: left; }
19550
- .ss-md-preview th { background: rgba(0,0,0,0.15); font-weight: 600; color: var(--t-bright); }
19551
- .ss-md-preview img { max-width: 100%; border-radius: var(--r-small); }
19552
-
19553
- /* ── Mermaid diagrams ── */
19554
- .ss-mermaid {
19555
- margin: 12px 0; padding: 16px;
19556
- background: rgba(0,0,0,0.12); border: 1px solid var(--b-subtle);
19557
- border-radius: var(--r-base); overflow-x: auto; text-align: center;
19558
- }
19559
- .ss-mermaid svg { max-width: 100%; height: auto; }
19560
- .ss-mermaid-loading { font-size: 11px; color: var(--t-muted); font-style: italic; }
19561
- .ss-mermaid-error { font-size: 11px; color: #f87171; margin-bottom: 8px; }
19562
- .ss-mermaid-src {
19563
- text-align: left; font-size: 11px; padding: 8px; margin: 4px 0 0;
19564
- background: rgba(0,0,0,0.2); border-radius: var(--r-small);
19565
- color: var(--t-muted); white-space: pre-wrap; overflow-x: auto;
19566
- }
19567
-
19568
- /* ── Metadata form ── */
19569
- .ss-meta-section { display: flex; flex-direction: column; gap: 12px; }
19570
- .ss-field { display: flex; flex-direction: column; gap: 3px; }
19571
- .ss-field > label {
19572
- font-size: 10px; font-weight: 600; color: var(--t-muted);
19573
- text-transform: uppercase; letter-spacing: 0.4px;
19574
- }
19575
- .ss-field-hint { font-weight: 400; text-transform: none; letter-spacing: 0; opacity: 0.6; }
19576
-
19577
- /* ── Icon upload widget ── */
19578
- .ss-icon-field { margin-bottom: 2px; }
19579
- .ss-icon-upload { display: flex; align-items: center; gap: 10px; }
19580
- .ss-icon-preview {
19581
- width: 40px; height: 40px; border-radius: 8px;
19582
- border: 1px dashed var(--b-light);
19583
- display: flex; align-items: center; justify-content: center;
19584
- overflow: hidden; flex-shrink: 0; background: var(--s-subtle);
19585
- }
19586
- .ss-icon-preview-img { width: 100%; height: 100%; object-fit: contain; }
19587
- .ss-icon-placeholder {
19588
- display: flex; align-items: center; justify-content: center;
19589
- width: 100%; height: 100%; opacity: 0.4;
19590
- }
19591
- .ss-icon-placeholder svg { width: 18px; height: 18px; }
19592
- .ss-icon-placeholder.skill { color: hsla(210, 18%, 65%, 1); }
19593
- .ss-icon-placeholder.command { color: hsla(40, 22%, 62%, 1); }
19594
- .ss-icon-placeholder.agent { color: hsla(18, 22%, 62%, 1); }
19595
- .ss-icon-actions { display: flex; flex-direction: column; gap: 4px; }
19596
- .ss-icon-upload-btn {
19597
- font-size: 10px; padding: 3px 10px;
19598
- background: var(--s-subtle); border: 1px solid var(--b-light);
19599
- border-radius: var(--r-small); color: var(--t-secondary);
19600
- cursor: pointer; text-align: center;
19601
- transition: background 0.15s, color 0.15s;
19602
- }
19603
- .ss-icon-upload-btn:hover { background: var(--s-light); color: var(--t-bright); }
19604
- .ss-icon-remove-btn {
19605
- font-size: 10px; padding: 2px 10px;
19606
- background: transparent; border: 1px solid transparent;
19607
- border-radius: var(--r-small); color: var(--t-faint);
19608
- cursor: pointer;
19609
- }
19610
- .ss-icon-remove-btn:hover { color: hsla(0, 65%, 68%, 1); border-color: hsla(0, 45%, 45%, 0.2); }
19611
- .ss-input {
19612
- width: 100%; padding: 6px 10px;
19613
- background: rgba(255,255,255,0.04); border: 1px solid rgba(255,255,255,0.08);
19614
- border-radius: var(--r-small); font-size: var(--fs-xs);
19615
- color: var(--t-bright); outline: none;
19616
- transition: all 0.15s ease;
19617
- }
19618
- .ss-input:hover { border-color: rgba(255,255,255,0.12); }
19619
- .ss-input:focus {
19620
- border-color: rgba(148, 163, 184, 0.4);
19621
- background: rgba(148, 163, 184, 0.05);
19622
- box-shadow: 0 0 0 2px rgba(148, 163, 184, 0.08);
19623
- }
19624
- .ss-textarea {
19625
- width: 100%; padding: 8px 10px;
19626
- background: rgba(255,255,255,0.04); border: 1px solid rgba(255,255,255,0.08);
19627
- border-radius: var(--r-small); font-size: 11px;
19628
- color: var(--t-primary); outline: none;
19629
- resize: vertical; line-height: 1.5;
19630
- font-family: inherit;
19631
- transition: all 0.15s ease;
19632
- }
19633
- .ss-textarea:hover { border-color: rgba(255,255,255,0.12); }
19634
- .ss-textarea:focus {
19635
- border-color: rgba(148, 163, 184, 0.4);
19636
- background: rgba(148, 163, 184, 0.05);
19637
- box-shadow: 0 0 0 2px rgba(148, 163, 184, 0.08);
19051
+ SKILLS STUDIO 2.0 (public/shared/skills/studio/)
19052
+ ══════════════════════════════════════════════
19053
+ A window with a rail (Library · Review · Create) and one workspace per skill (Edit · Test · Versions ·
19054
+ Publish). Every colour is an app token (--t-*, --s-*, --b-*, --r-*, --fs-*) or an --sx-* variable declared
19055
+ just below with the value DESIGN.md gives that role (Status, Semantic roles). The code editor inside it takes
19056
+ the --ed-* colours of the File Explorer's editor (.fe-editor-panel), the same values (a test keeps them equal).
19057
+ Readable secondary text is --t-secondary or brighter (AA on the panel); never smaller than 11px. The width of
19058
+ the window decides the layout (container queries at 900 / 760 / 560px). Dragging uses the move cursor. */
19059
+
19060
+ .skills-studio-panel.sx {
19061
+ --sx-ok: #86efac;
19062
+ --sx-warn: #fbbf24;
19063
+ --sx-err: #fca5a5;
19064
+ --sx-info: #cccccc;
19065
+ --sx-focus: #93c5fd;
19066
+ --sx-primary: #636363;
19067
+ --sx-primary-hover: #717171;
19068
+ --sx-field: rgba(0,0,0,0.25);
19069
+ --sx-raised: rgba(22,22,26,0.95);
19070
+ --sx-menu: #16161a;
19071
+ --sx-gold: rgba(255,215,0,0.85);
19072
+ --sx-meta: calc(11px * var(--font-scale, 1));
19073
+ --sx-rail: 220px;
19074
+ --ed-bg: rgb(16, 16, 18);
19075
+ --ed-fg: #8a8ea0;
19076
+ --ed-caret: var(--t-bright);
19077
+ --ed-selection: rgba(99,102,241,0.25);
19078
+ --ed-line-active: rgba(255,255,255,0.03);
19079
+ --ed-gutter-bg: rgba(0,0,0,0.1);
19080
+ --ed-gutter-fg: rgba(255,255,255,0.15);
19081
+ --ed-gutter-fg-active: rgba(255,255,255,0.5);
19082
+ --ed-gutter-border: rgba(255,255,255,0.04);
19083
+ --ed-kw: #cccdd6;
19084
+ --ed-str: #6e7a86;
19085
+ --ed-cm: #5a6a5a;
19086
+ --ed-num: #8c94a8;
19087
+ --ed-fn: #b0b4c4;
19088
+ --ed-op: #585c6c;
19089
+ --ed-tag: #a0a4b4;
19090
+ --ed-attr: #787c8c;
19091
+ --ed-prop: #9498a8;
19092
+ --ed-br: #8a7a50;
19093
+ --ed-match: rgba(255,255,255,0.10);
19094
+ --ed-match-current: rgba(99,102,241,0.35);
19095
+ --ed-ghost: rgba(255,255,255,0.28);
19096
+ --ed-add: #9fe3b4;
19097
+ --ed-add-bg: rgba(95,207,131,0.10);
19098
+ --ed-del: #f0a3a3;
19099
+ --ed-del-bg: rgba(239,112,112,0.10);
19100
+ --ed-error: var(--stg-err, #fca5a5);
19101
+ --ed-warn: #fbbf24;
19102
+ --ed-whitespace: rgba(255,255,255,0.2);
19103
+ --ed-minimap-box: rgba(255,255,255,0.06);
19104
+ --ed-minimap-box-active: rgba(255,255,255,0.1);
19105
+ --ed-minimap-edge: var(--b-hover);
19106
+ --ed-minimap-match: var(--fw-focus);
19107
+ --ed-guide: var(--b-light);
19108
+ --ed-guide-active: var(--b-visible);
19109
+ --ed-menu-bg: #16161a;
19110
+ --ed-menu-fg: var(--t-primary);
19111
+ --ed-menu-fg-active: var(--t-bright);
19112
+ --ed-menu-border: rgba(255,255,255,0.10);
19113
+ --ed-menu-hover: var(--s-hover);
19114
+ --ed-menu-radius: 8px;
19115
+ --ed-menu-shadow: 0 12px 32px rgba(0,0,0,0.4);
19116
+ position: fixed; z-index: 300000;
19117
+ width: min(1180px, 94vw); height: min(760px, 86vh);
19118
+ min-width: 380px; min-height: 320px; max-width: 100vw;
19119
+ display: flex; flex-direction: column;
19120
+ overflow: hidden;
19121
+ border-radius: 10px;
19122
+ color: var(--t-primary);
19123
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif;
19124
+ font-size: var(--fs-sm);
19125
+ line-height: 1.45;
19126
+ opacity: 0; transform: scale(0.985);
19127
+ transition: opacity 0.15s ease, transform 0.15s ease;
19128
+ container: ss / inline-size;
19129
+ }
19130
+ .skills-studio-panel.sx.open { opacity: 1; transform: none; }
19131
+ .skills-studio-panel.sx > .resize-handle-t,
19132
+ .skills-studio-panel.sx > .resize-handle-tl,
19133
+ .skills-studio-panel.sx > .resize-handle-tr { top: 0; z-index: 25; }
19134
+ /* Docked: the work area beside the side panels (as the code editor sits), not modal, not moved or resized. */
19135
+ .skills-studio-panel.sx.sx-docked {
19136
+ top: var(--frame-top) !important;
19137
+ left: var(--frame-left) !important;
19138
+ right: max(var(--frame-gap), calc(var(--right-panel-width, var(--claude-panel-width, 0px)) + var(--right-panel-gap, var(--claude-panel-gap, 0px)))) !important;
19139
+ bottom: var(--frame-gap) !important;
19140
+ width: auto !important; height: auto !important; max-height: none !important;
19141
+ min-width: 0;
19142
+ border-radius: var(--frame-radius); /* flush in the app frame: its corners are the frame's */
19143
+ z-index: 197;
19144
+ }
19145
+ .skills-studio-panel.sx.sx-docked > .resize-handle { display: none; }
19146
+ body.sx-studio-docked #topright-controls { display: none; }
19147
+ /* Settings → Skills: the way into Skills Studio. */
19148
+ .cc-skill-studio { display: flex; align-items: center; flex-wrap: wrap; gap: 10px; margin: 14px 0 6px; }
19149
+ .skills-studio-panel.sx :focus-visible { outline: 2px solid var(--sx-focus); outline-offset: 2px; }
19150
+ .skills-studio-panel.sx [hidden] { display: none !important; }
19151
+ .sx-sr {
19152
+ position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden;
19153
+ clip: rect(0 0 0 0); clip-path: inset(50%); white-space: nowrap; border: 0;
19154
+ }
19155
+ .sx .sx-i { flex: none; stroke: currentColor; fill: none; stroke-width: 1.5; stroke-linecap: round; stroke-linejoin: round; }
19156
+ .sx .sx-spacer { flex: 1 1 auto; }
19157
+ .sx .sx-dim { color: var(--t-secondary); }
19158
+ .sx .sx-mono { font-family: var(--ff-mono, 'JetBrains Mono', ui-monospace, monospace); font-size: var(--sx-meta); }
19159
+ .sx .sx-block { display: block; }
19160
+ .sx .sx-ok-text { color: var(--sx-ok); }
19161
+ .sx .sx-warn-text { color: var(--sx-warn); }
19162
+ .sx .sx-err-text { color: var(--sx-err); }
19163
+ .sx kbd {
19164
+ font: 400 var(--sx-meta)/1 var(--ff-mono, 'JetBrains Mono', ui-monospace, monospace); color: var(--t-secondary);
19165
+ padding: 2px 4px; border: 1px solid var(--b-light); border-radius: 4px;
19638
19166
  }
19639
- .ss-textarea-sm { min-height: 120px; }
19640
19167
 
19641
- /* ── Custom checkbox toggle ── */
19642
- .ss-checkbox-row { display: flex; align-items: center; gap: 8px; padding: 3px 0; }
19643
- .ss-checkbox-row input[type="checkbox"] {
19644
- -webkit-appearance: none; appearance: none;
19645
- width: 32px; height: 17px; border-radius: 10px;
19646
- background: var(--s-light); border: 1px solid var(--b-light);
19647
- position: relative; cursor: pointer; flex-shrink: 0;
19648
- transition: background 0.2s ease, border-color 0.2s ease;
19649
- }
19650
- .ss-checkbox-row input[type="checkbox"]::after {
19651
- content: ''; position: absolute; top: 2px; left: 2px;
19652
- width: 11px; height: 11px; border-radius: 50%;
19653
- background: var(--t-muted);
19654
- transition: transform 0.2s ease, background 0.2s ease;
19655
- }
19656
- .ss-checkbox-row input[type="checkbox"]:checked {
19657
- background: hsla(var(--accent-hue, 174), 60%, 45%, 0.6);
19658
- border-color: hsla(var(--accent-hue, 174), 60%, 55%, 0.5);
19659
- }
19660
- .ss-checkbox-row input[type="checkbox"]:checked::after {
19661
- transform: translateX(15px);
19662
- background: hsla(var(--accent-hue, 174), 70%, 75%, 1);
19168
+ /* ── Header ── */
19169
+ .sx-head {
19170
+ flex: none; min-height: max(44px, var(--fw-header-min-height, 44px));
19171
+ display: flex; align-items: center; gap: 8px;
19172
+ padding: 0 10px 0 14px;
19173
+ background: var(--fw-header, var(--sx-raised));
19174
+ border-bottom: 1px solid var(--fw-separator, var(--b-subtle));
19175
+ user-select: none;
19663
19176
  }
19664
- .ss-checkbox-row label { font-size: var(--fs-xs); color: var(--t-secondary); cursor: pointer; text-transform: none; letter-spacing: 0; font-weight: 400; }
19177
+ .sx-head.drag-handle { cursor: move; }
19178
+ .sx-head-mark { display: inline-flex; color: var(--t-primary); }
19179
+ .sx-title { margin: 0; font: 600 calc(15px * var(--font-scale, 1))/1.3 var(--ff-heading); color: var(--t-bright); white-space: nowrap; }
19180
+ .sx-head-note { min-width: 0; font-size: var(--fs-xs); color: var(--t-secondary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
19181
+ .sx-note-warn { color: var(--sx-warn); }
19665
19182
 
19666
- /* ── Custom radio buttons ── */
19667
- .ss-radio-group { display: flex; flex-direction: column; gap: 6px; }
19668
- .ss-radio { display: flex; align-items: center; gap: 8px; font-size: var(--fs-xs); color: var(--t-secondary); cursor: pointer; }
19669
- .ss-radio input[type="radio"] {
19670
- -webkit-appearance: none; appearance: none;
19671
- width: 15px; height: 15px; border-radius: 50%;
19672
- background: var(--s-light); border: 1px solid var(--b-light);
19673
- position: relative; cursor: pointer; flex-shrink: 0;
19674
- transition: all 0.2s ease;
19675
- }
19676
- .ss-radio input[type="radio"]::after {
19677
- content: ''; position: absolute; top: 50%; left: 50%;
19678
- transform: translate(-50%, -50%) scale(0);
19679
- width: 7px; height: 7px; border-radius: 50%;
19680
- background: hsla(var(--accent-hue, 174), 70%, 70%, 1);
19681
- transition: transform 0.15s ease;
19183
+ /* ── Buttons ── */
19184
+ .sx .sx-btn {
19185
+ height: 28px; padding: 0 12px;
19186
+ display: inline-flex; align-items: center; justify-content: center; gap: 6px;
19187
+ border-radius: 5px; border: 1px solid var(--b-light);
19188
+ background: var(--s-light); color: var(--t-bright);
19189
+ font-weight: 500; font-size: var(--fs-xs); line-height: 1; font-family: inherit;
19190
+ white-space: nowrap; cursor: pointer; text-decoration: none;
19191
+ transition: background 0.15s ease, border-color 0.15s ease, color 0.15s ease;
19192
+ }
19193
+ .sx .sx-btn:hover:not(:disabled) { background: var(--s-hover); border-color: var(--b-hover); }
19194
+ .sx .sx-btn:disabled { opacity: 0.5; cursor: default; }
19195
+ .sx .sx-btn--primary { background: var(--sx-primary); border-color: transparent; color: #ffffff; }
19196
+ .sx .sx-btn--primary:hover:not(:disabled) { background: var(--sx-primary-hover); border-color: transparent; }
19197
+ .sx .sx-btn--primary kbd { color: #ffffff; border-color: var(--b-visible); }
19198
+ .sx .sx-btn--ghost { background: transparent; border-color: transparent; color: var(--t-primary); }
19199
+ .sx .sx-btn--ghost:hover:not(:disabled) { color: var(--t-bright); background: var(--s-subtle); }
19200
+ .sx .sx-btn--danger:hover:not(:disabled) { color: var(--sx-err); border-color: color-mix(in oklab, var(--sx-err) 40%, transparent); }
19201
+ .sx .sx-btn--sm { height: 24px; padding: 0 9px; }
19202
+ .sx .sx-btn--soon { border-style: dashed; }
19203
+ .sx .sx-soon {
19204
+ margin-left: 2px; padding: 1px 6px; border-radius: 6px;
19205
+ font-size: var(--sx-meta); font-weight: 500; color: var(--sx-gold);
19206
+ border: 1px solid color-mix(in oklab, var(--sx-gold) 45%, transparent);
19207
+ }
19208
+ .sx .sx-icon-btn {
19209
+ width: 28px; height: 28px; padding: 0; flex: none;
19210
+ display: inline-flex; align-items: center; justify-content: center;
19211
+ border: 1px solid transparent; border-radius: 5px;
19212
+ background: transparent; color: var(--t-primary); cursor: pointer;
19213
+ }
19214
+ .sx .sx-icon-btn:hover:not(:disabled) { background: var(--s-hover); color: var(--t-bright); }
19215
+ .sx .sx-icon-btn[aria-pressed="true"] { background: var(--s-active); color: var(--t-bright); border-color: var(--b-light); }
19216
+ .sx .sx-icon-btn:disabled { opacity: 0.4; cursor: default; }
19217
+ .sx .sx-icon-btn--sm { width: 22px; height: 22px; }
19218
+ .sx .sx-close:hover:not(:disabled) { color: var(--sx-err); }
19219
+ .sx .sx-link {
19220
+ display: inline-flex; align-items: center; gap: 4px; padding: 0;
19221
+ border: 0; background: none; color: var(--t-primary); font: inherit; cursor: pointer;
19222
+ text-decoration: underline; text-underline-offset: 3px; text-decoration-color: var(--b-visible);
19223
+ }
19224
+ .sx .sx-link:hover { color: var(--t-bright); }
19225
+
19226
+ /* ── Body, rail ── */
19227
+ .sx-body { flex: 1; min-height: 0; display: flex; }
19228
+ .sx-rail {
19229
+ flex: none; width: var(--sx-rail);
19230
+ display: flex; flex-direction: column; gap: 12px;
19231
+ padding: 8px; overflow-y: auto;
19232
+ border-right: 1px solid var(--b-subtle);
19682
19233
  }
19683
- .ss-radio input[type="radio"]:checked {
19684
- border-color: hsla(var(--accent-hue, 174), 60%, 55%, 0.6);
19685
- background: hsla(var(--accent-hue, 174), 60%, 45%, 0.3);
19234
+ .sx-rail-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 2px; }
19235
+ .sx .sx-rail-item {
19236
+ width: 100%; height: 32px; padding: 0 10px;
19237
+ display: flex; align-items: center; gap: 10px;
19238
+ border: 0; border-radius: 8px; background: transparent;
19239
+ color: var(--t-primary); font-weight: 500; font-size: var(--fs-sm); line-height: 1; font-family: inherit; text-align: left; cursor: pointer;
19240
+ }
19241
+ .sx .sx-rail-item:hover { background: var(--s-hover); color: var(--t-bright); }
19242
+ .sx .sx-rail-item[aria-current="page"] { background: var(--s-active); color: var(--t-bright); }
19243
+ .sx-rail-icon { display: inline-flex; }
19244
+ .sx-rail-label { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
19245
+ .sx-rail-count { margin-left: auto; font: 500 var(--sx-meta)/1 var(--ff-mono, 'JetBrains Mono', monospace); color: var(--t-secondary); }
19246
+ .sx-rail-group-label { margin: 8px 10px 4px; font-size: var(--sx-meta); font-weight: 600; letter-spacing: 0.02em; color: var(--t-secondary); }
19247
+ .sx .sx-rail-view {
19248
+ width: 100%; height: 28px; padding: 0 10px;
19249
+ display: flex; align-items: center; gap: 8px;
19250
+ border: 0; border-radius: 5px; background: transparent;
19251
+ color: var(--t-secondary); font-size: var(--fs-xs); font-family: inherit; text-align: left; cursor: pointer;
19252
+ }
19253
+ .sx .sx-rail-view:hover { background: var(--s-subtle); color: var(--t-bright); }
19254
+ .sx .sx-rail-view[aria-current="true"] { background: var(--s-light); color: var(--t-bright); }
19255
+ .sx-rail-foot { margin-top: auto; padding: 8px 4px 2px; border-top: 1px solid var(--b-subtle); display: grid; gap: 2px; }
19256
+ .sx .sx-rt-row {
19257
+ display: flex; align-items: center; gap: 8px; height: 26px; padding: 0 6px;
19258
+ border: 0; border-radius: 5px; background: transparent; cursor: pointer;
19259
+ font-size: var(--fs-xs); font-family: inherit; color: var(--t-secondary); text-align: left;
19260
+ }
19261
+ .sx .sx-rt-row:hover { background: var(--s-subtle); color: var(--t-bright); }
19262
+ .sx-rt-dot { width: 8px; height: 8px; border-radius: 50%; flex: none; border: 1px solid var(--b-visible); }
19263
+ .sx-rt-dot.sx-rt-ready { background: var(--sx-ok); border-color: transparent; }
19264
+ .sx-rt-dot.sx-rt-bridge { background: var(--sx-warn); border-color: transparent; border-radius: 1px; transform: rotate(45deg) scale(0.85); }
19265
+ .sx-rt-dot.sx-rt-empty, .sx-rt-dot.sx-rt-unknown { background: transparent; }
19266
+ .sx-rt-state { margin-left: auto; font-size: var(--sx-meta); }
19267
+ .sx.sx-rail-collapsed .sx-rail { --sx-rail: 56px; padding: 8px 6px; }
19268
+ .sx.sx-rail-collapsed .sx-rail :is(.sx-rail-label, .sx-rail-count, .sx-rail-groups, .sx-rt-name, .sx-rt-state) { display: none; }
19269
+ .sx.sx-rail-collapsed .sx-rail-item { justify-content: center; padding: 0; }
19270
+ .sx.sx-rail-collapsed .sx-rt-row { justify-content: center; }
19271
+
19272
+ /* ── Main and places ──
19273
+ min-height: 0 keeps the main area inside the window when the body is a column (a narrow window): without it a
19274
+ flex item is as tall as its content, the window clips it (overflow: hidden) and nothing in it scrolls. */
19275
+ .sx-main { flex: 1; min-width: 0; min-height: 0; display: flex; flex-direction: column; position: relative; }
19276
+ .sx-place { flex: 1; min-height: 0; display: flex; flex-direction: column; }
19277
+ .sx-place-head {
19278
+ flex: none; padding: 12px 16px;
19279
+ display: flex; flex-wrap: wrap; align-items: center; gap: 8px;
19280
+ border-bottom: 1px solid var(--b-subtle);
19686
19281
  }
19687
- .ss-radio input[type="radio"]:checked::after { transform: translate(-50%, -50%) scale(1); }
19688
-
19689
- /* ── Custom select dropdown ── */
19690
- select.ss-input, .ss-input[id*="model"] {
19691
- -webkit-appearance: none; appearance: none;
19692
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M0 0l5 6 5-6z' fill='%23666'/%3E%3C/svg%3E");
19693
- background-repeat: no-repeat;
19694
- background-position: right 8px center;
19695
- padding-right: 24px;
19696
- cursor: pointer;
19282
+ .sx-place-title { margin: 0 8px 0 0; font: 600 calc(15px * var(--font-scale, 1))/1.3 var(--ff-heading); color: var(--t-bright); }
19283
+ .sx-place-title:focus { outline: none; }
19284
+ .sx-place-sub { margin: 0; font-size: var(--fs-xs); color: var(--t-secondary); }
19285
+ .sx-place-scroll { flex: 1; min-height: 0; overflow: auto; }
19286
+ .sx-place-notices:empty { display: none; }
19287
+ .sx-place-notices { padding: 8px 16px 0; display: grid; gap: 6px; }
19288
+ .sx-section-title { margin: 0; font: 600 var(--fs-sm)/1.3 var(--ff-heading); color: var(--t-bright); }
19289
+ .sx .sx-help { margin: 0; font-size: var(--fs-xs); color: var(--t-secondary); line-height: 1.45; }
19290
+ .sx .sx-explain { margin: 0; font-size: var(--fs-xs); color: var(--t-secondary); max-width: 68ch; }
19291
+ .sx .sx-row { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
19292
+ .sx .sx-plain-list { margin: 0; padding-left: 18px; font-size: var(--fs-xs); color: var(--t-primary); }
19293
+ .sx .sx-plain-list li + li { margin-top: 2px; }
19294
+ .sx .sx-note {
19295
+ margin: 0; padding: 8px 10px; border-radius: 8px;
19296
+ font-size: var(--fs-xs); line-height: 1.45; color: var(--t-primary);
19297
+ background: var(--s-subtle); border: 1px solid var(--b-subtle);
19697
19298
  }
19698
- select.ss-input option, .ss-tools-add select option {
19699
- background: #1a1a1a; color: var(--t-secondary); padding: 4px 8px;
19299
+ .sx .sx-note--warn { border-color: color-mix(in oklab, var(--sx-warn) 35%, transparent); background: color-mix(in oklab, var(--sx-warn) 6%, transparent); }
19300
+ .sx .sx-notice {
19301
+ display: flex; flex-wrap: wrap; align-items: center; gap: 8px 12px;
19302
+ padding: 8px 12px; border-radius: 8px; font-size: var(--fs-xs);
19303
+ border: 1px solid var(--b-light); background: var(--s-subtle); color: var(--t-primary);
19304
+ }
19305
+ .sx .sx-notice--info > .sx-i { color: var(--sx-info); }
19306
+ .sx-notice-text { flex: 1 1 260px; }
19307
+ .sx .sx-notice--warn > .sx-i { color: var(--sx-warn); }
19308
+ /* Publish: an OpenCode tile that sees the skill through Claude Code's folder (no second copy unless ticked). */
19309
+ .sx .sx-tile.is-via { border-style: dashed; }
19310
+ .sx-tile-state--via-claude { color: var(--sx-info); }
19311
+ /* A plan line whose runtime turns the skill off in its settings: the reason, and the owner's one-click fix. */
19312
+ .sx .sx-eligibility .sx-btn { margin-left: 6px; vertical-align: baseline; }
19313
+ /* Review: one tile per runtime, where the card's install goes. */
19314
+ .sx .sx-dest-tiles { display: flex; flex-wrap: wrap; gap: 6px; padding: 2px 0 0; }
19315
+ .sx .sx-dest-tile {
19316
+ display: inline-flex; align-items: center; gap: 4px; padding: 2px 8px; border-radius: 999px;
19317
+ border: 1px solid var(--b-light); font-size: var(--sx-meta); color: var(--t-secondary); line-height: 1.4;
19318
+ }
19319
+ .sx .sx-dest-tile.is-on { color: var(--sx-ok); border-color: color-mix(in oklab, var(--sx-ok) 40%, transparent); }
19320
+ .sx .sx-dest-tile > .sx-i { width: 12px; height: 12px; }
19321
+ /* Settings → Skills → Skill folders: a bridge file offered to the owner (ticked, it moves too). */
19322
+ .stg-skill-folders-offer { display: flex; align-items: flex-start; gap: 8px; cursor: pointer; }
19323
+ .stg-skill-folders-offer > input { margin-top: 2px; flex: 0 0 auto; }
19324
+ #stg-skill-folders-plan li[data-tone="offer"] { color: var(--t-primary); }
19325
+ .sx .sx-empty {
19326
+ margin: auto; padding: 32px 24px; max-width: 520px;
19327
+ display: flex; flex-direction: column; align-items: center; gap: 10px; text-align: center;
19328
+ color: var(--t-primary); font-size: var(--fs-xs);
19700
19329
  }
19701
- select.ss-input option:disabled { color: var(--t-faint); }
19330
+ .sx .sx-empty p { margin: 0; }
19331
+ .sx-empty-title { margin: 0; font: 600 var(--fs-sm)/1.3 var(--ff-heading); color: var(--t-bright); }
19332
+ .sx .sx-placeholder { margin: 32px auto; padding: 0 24px; max-width: 560px; display: grid; gap: 10px; justify-items: start; font-size: var(--fs-xs); color: var(--t-primary); }
19333
+ .sx .sx-placeholder p { margin: 0; }
19334
+ .sx-placeholder-icon { display: inline-flex; padding: 8px; border-radius: 8px; border: 1px solid var(--b-light); color: var(--t-primary); }
19335
+ .sx-placeholder-title { margin: 0; font: 600 calc(15px * var(--font-scale, 1))/1.3 var(--ff-heading); color: var(--t-bright); }
19336
+ .sx-placeholder-list { color: var(--t-primary); }
19702
19337
 
19703
- .ss-hidden { display: none !important; }
19704
-
19705
- /* ── Tool chips ── */
19706
- .ss-tools-list { display: flex; flex-wrap: wrap; gap: 6px; }
19707
- .ss-chip {
19708
- display: inline-flex; align-items: center; gap: 6px;
19709
- padding: 5px 12px; border-radius: var(--r-pill);
19710
- font-size: 11px; font-weight: 500;
19711
- background: rgba(148, 163, 184, 0.12);
19712
- border: 1px solid rgba(148, 163, 184, 0.22);
19713
- color: rgba(148, 163, 184, 0.8);
19714
- letter-spacing: 0.02em;
19715
- transition: all 0.15s ease;
19716
- position: relative;
19717
- }
19718
- .ss-chip:hover {
19719
- background: rgba(148, 163, 184, 0.18);
19720
- border-color: rgba(148, 163, 184, 0.32);
19721
- }
19722
- .ss-chip-x {
19723
- background: none; border: none; color: rgba(148, 163, 184, 0.45);
19724
- cursor: pointer; font-size: 13px; padding: 0; line-height: 1;
19725
- transition: color 0.12s ease;
19726
- display: flex; align-items: center; justify-content: center;
19727
- }
19728
- .ss-chip-x:hover {
19729
- color: rgba(255, 82, 82, 0.7);
19730
- }
19731
- /* ── Custom dropdown (tools picker) ── */
19732
- .ss-dropdown { position: relative; margin-top: 6px; }
19733
- .ss-dropdown-trigger {
19734
- display: flex; align-items: center; justify-content: space-between; gap: 8px;
19735
- width: 100%; padding: 7px 12px;
19736
- background: rgba(148, 163, 184, 0.08);
19737
- border: 1px solid rgba(148, 163, 184, 0.18);
19738
- border-radius: var(--r-small); font-size: 11px; font-weight: 500;
19739
- color: rgba(148, 163, 184, 0.65); cursor: pointer; outline: none;
19740
- transition: all 0.15s ease;
19741
- font-family: inherit;
19338
+ /* ── Fields ── */
19339
+ .sx .sx-input {
19340
+ width: 100%; padding: 6px 8px; box-sizing: border-box;
19341
+ background: var(--sx-field); border: 1px solid var(--b-light); border-radius: 5px;
19342
+ color: var(--t-bright); font-weight: 400; font-size: var(--fs-xs); line-height: 1.45; font-family: inherit;
19343
+ }
19344
+ .sx .sx-input::placeholder { color: var(--t-secondary); }
19345
+ .sx .sx-input:focus { border-color: var(--b-visible); outline: none; }
19346
+ .sx .sx-input:focus-visible { outline: 2px solid var(--sx-focus); outline-offset: 1px; }
19347
+ .sx .sx-input[aria-invalid="true"] { border-color: color-mix(in oklab, var(--sx-err) 60%, transparent); }
19348
+ .sx .sx-input:disabled { opacity: 0.6; }
19349
+ .sx .sx-input--sm { padding: 4px 8px; }
19350
+ .sx .sx-textarea { resize: vertical; min-height: 60px; }
19351
+ .sx .sx-field { display: grid; gap: 4px; margin: 0; padding: 0; border: 0; min-width: 0; }
19352
+ .sx .sx-field-label { display: flex; justify-content: space-between; gap: 8px; font-size: var(--fs-xs); font-weight: 500; color: var(--t-primary); padding: 0; }
19353
+ .sx .sx-field-note { margin: 0; font-size: var(--fs-xs); color: var(--t-secondary); }
19354
+ /* A note that says what is wrong keeps its colour (the note's grey above would win over .sx-err-text otherwise). */
19355
+ .sx .sx-field-note.sx-err-text { color: var(--sx-err); }
19356
+ .sx .sx-field-note.sx-warn-text { color: var(--sx-warn); }
19357
+ .sx .sx-count { font: 400 var(--sx-meta)/1.4 var(--ff-mono, 'JetBrains Mono', monospace); color: var(--t-secondary); }
19358
+ .sx .sx-choices { display: grid; gap: 4px; }
19359
+ .sx .sx-choice { display: inline-flex; align-items: center; gap: 6px; font-size: var(--fs-xs); color: var(--t-primary); cursor: pointer; }
19360
+ .sx .sx-choice input { accent-color: var(--sx-primary); margin: 0; }
19361
+ .sx .sx-check { width: 14px; height: 14px; accent-color: var(--sx-primary); margin: 0; cursor: pointer; }
19362
+ .sx .sx-dd .cc-dropdown-trigger { min-height: 28px; }
19363
+ .sx .sx-filter { display: inline-flex; align-items: center; gap: 6px; }
19364
+ .sx .sx-filter-key { font-size: var(--fs-xs); color: var(--t-secondary); white-space: nowrap; }
19365
+ .sx .sx-search { position: relative; flex: 1 1 200px; max-width: 320px; }
19366
+ .sx .sx-search > .sx-i { position: absolute; left: 9px; top: 7px; color: var(--t-secondary); pointer-events: none; }
19367
+ .sx .sx-search input {
19368
+ width: 100%; height: 28px; padding: 0 10px 0 30px; box-sizing: border-box;
19369
+ background: var(--sx-field); border: 1px solid var(--b-light); border-radius: 5px;
19370
+ color: var(--t-bright); font-size: var(--fs-xs); font-family: inherit;
19371
+ }
19372
+ .sx .sx-search input::placeholder { color: var(--t-secondary); }
19373
+ .sx .sx-seg { display: inline-flex; border: 1px solid var(--b-light); border-radius: 5px; overflow: hidden; width: max-content; }
19374
+ .sx .sx-seg button {
19375
+ height: 26px; padding: 0 12px; border: 0; background: transparent;
19376
+ font-size: var(--fs-xs); font-family: inherit; color: var(--t-secondary); cursor: pointer;
19377
+ }
19378
+ .sx .sx-seg button[aria-pressed="true"] { background: var(--s-active); color: var(--t-bright); }
19379
+ .sx .sx-details > summary { cursor: pointer; font-size: var(--fs-xs); color: var(--t-primary); }
19380
+ .sx .sx-details > summary:hover { color: var(--t-bright); }
19381
+ .sx .sx-pre {
19382
+ margin: 0; padding: 8px 10px; border-radius: 5px; overflow: auto; max-height: 260px;
19383
+ background: var(--sx-field); border: 1px solid var(--b-subtle);
19384
+ font: 400 var(--fs-xs)/1.55 var(--ff-mono, 'JetBrains Mono', monospace); color: var(--t-bright);
19385
+ white-space: pre-wrap; overflow-wrap: anywhere;
19386
+ }
19387
+ .sx .sx-pre--sm { max-height: 120px; padding: 6px 8px; }
19388
+ .sx .sx-meter { display: inline-block; width: 56px; height: 6px; border-radius: 3px; background: var(--s-medium); vertical-align: middle; overflow: hidden; }
19389
+ .sx .sx-meter > i { display: block; height: 100%; background: var(--t-secondary); }
19390
+ .sx .is-over .sx-meter > i { background: var(--sx-warn); }
19391
+ .sx .sx-dot { display: inline-block; width: 6px; height: 6px; border-radius: 50%; background: var(--sx-gold); flex: none; }
19392
+
19393
+ /* ── Library ── */
19394
+ .sx-summary { margin: 0; padding: 8px 16px 0; font-size: var(--fs-xs); color: var(--t-secondary); }
19395
+ .sx-lib { width: 100%; table-layout: fixed; border-collapse: separate; border-spacing: 0; margin-top: 8px; font-size: var(--fs-xs); }
19396
+ .sx-lib th {
19397
+ position: sticky; top: 0; z-index: 1;
19398
+ padding: 8px 10px; text-align: left;
19399
+ font-size: var(--sx-meta); font-weight: 600; letter-spacing: 0.02em; color: var(--t-secondary);
19400
+ background: var(--sx-raised); border-bottom: 1px solid var(--b-subtle);
19401
+ }
19402
+ .sx-lib td { padding: 8px 10px; border-bottom: 1px solid var(--b-subtle); vertical-align: middle; overflow-wrap: anywhere; }
19403
+ .sx-lib tbody tr:hover td { background: var(--s-subtle); }
19404
+ .sx-lib tbody tr.is-selected td { background: var(--s-light); }
19405
+ .sx-lib .sx-col-check { width: 40px; padding-left: 16px; }
19406
+ .sx-lib th.sx-col-kind { width: 96px; }
19407
+ .sx-lib th.sx-col-source { width: 150px; }
19408
+ .sx-lib th.sx-col-health { width: 190px; }
19409
+ .sx-lib th.sx-col-rt { width: 96px; }
19410
+ .sx-lib th.sx-col-updated { width: 84px; }
19411
+ .sx-col-name { min-width: 0; }
19412
+ .sx .sx-name-btn {
19413
+ display: block; max-width: 100%; padding: 0; border: 0; background: none; cursor: pointer;
19414
+ font-weight: 600; font-size: var(--fs-sm); line-height: 1.3; font-family: inherit; color: var(--t-bright); text-align: left;
19415
+ overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
19742
19416
  }
19743
- .ss-dropdown-trigger svg {
19744
- opacity: 0.45; transition: transform 0.2s ease, opacity 0.15s ease;
19745
- flex-shrink: 0; width: 10px; height: 10px;
19417
+ .sx .sx-name-btn:hover { text-decoration: underline; text-underline-offset: 3px; }
19418
+ .sx-desc { display: block; margin-top: 2px; color: var(--t-secondary); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
19419
+ .sx-source { display: block; color: var(--t-primary); }
19420
+ .sx-source-detail { display: block; color: var(--t-secondary); font-size: var(--sx-meta); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
19421
+ .sx .sx-health {
19422
+ display: inline-flex; align-items: center; gap: 6px; max-width: 100%;
19423
+ min-height: 22px; padding: 2px 8px; line-height: 1.3; box-sizing: border-box;
19424
+ border: 1px solid var(--b-light); border-radius: 6px;
19425
+ font-size: var(--fs-xs); font-weight: 500;
19746
19426
  }
19747
- .ss-dropdown-trigger:hover {
19748
- border-color: rgba(148, 163, 184, 0.26);
19749
- color: rgba(148, 163, 184, 0.75);
19750
- background: rgba(148, 163, 184, 0.13);
19427
+ .sx .sx-health > span:first-of-type { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
19428
+ .sx .sx-health--err { color: var(--sx-err); border-color: color-mix(in oklab, var(--sx-err) 40%, transparent); background: color-mix(in oklab, var(--sx-err) 10%, transparent); }
19429
+ .sx .sx-health--warn { color: var(--sx-warn); border-color: color-mix(in oklab, var(--sx-warn) 40%, transparent); background: color-mix(in oklab, var(--sx-warn) 8%, transparent); }
19430
+ .sx .sx-health--ok { color: var(--sx-ok); border-color: color-mix(in oklab, var(--sx-ok) 35%, transparent); background: color-mix(in oklab, var(--sx-ok) 8%, transparent); }
19431
+ .sx .sx-health--info { color: var(--sx-info); border-color: var(--b-visible); background: var(--s-light); }
19432
+ .sx .sx-health--off { color: var(--t-secondary); }
19433
+ .sx-health-more { margin-left: 2px; font: 500 var(--sx-meta)/1 var(--ff-mono, 'JetBrains Mono', monospace); opacity: 0.85; }
19434
+ .sx-rts { display: inline-flex; gap: 4px; }
19435
+ .sx .sx-rt {
19436
+ width: 24px; height: 22px; display: inline-grid; place-items: center;
19437
+ border: 1px solid var(--b-light); border-radius: 5px;
19438
+ font: 500 var(--sx-meta)/1 var(--ff-mono, 'JetBrains Mono', monospace); color: var(--t-secondary);
19439
+ }
19440
+ .sx .sx-rt--installed { color: var(--t-bright); border-color: var(--b-visible); background: var(--s-light); }
19441
+ .sx .sx-rt--present { color: var(--t-primary); border-color: var(--b-hover); }
19442
+ .sx .sx-rt--outdated { color: var(--sx-warn); border-color: color-mix(in oklab, var(--sx-warn) 45%, transparent); }
19443
+ .sx .sx-rt--bridge { color: var(--sx-warn); border-style: dashed; border-color: color-mix(in oklab, var(--sx-warn) 45%, transparent); }
19444
+ .sx .sx-rt--none { border-style: dashed; color: var(--t-secondary); opacity: 0.8; }
19445
+ .sx-bulk {
19446
+ flex: none; display: flex; flex-wrap: wrap; align-items: center; gap: 8px;
19447
+ padding: 8px 16px; background: var(--sx-raised); border-top: 1px solid var(--b-light);
19448
+ }
19449
+ .sx-bulk-count { font-weight: 600; margin-right: 8px; color: var(--t-bright); font-size: var(--fs-xs); }
19450
+
19451
+ /* ── Menus ── */
19452
+ .sx .sx-menu {
19453
+ position: absolute; right: 16px; z-index: 30; margin-top: 34px; min-width: 200px;
19454
+ padding: 6px; display: grid; gap: 1px;
19455
+ background: var(--sx-menu); border: 1px solid var(--b-light); border-radius: 8px;
19456
+ box-shadow: 0 12px 32px rgba(0,0,0,0.4);
19457
+ }
19458
+ .sx .sx-menu-item {
19459
+ padding: 7px 10px; border: 0; border-radius: 5px; background: transparent; text-align: left;
19460
+ font-size: var(--fs-xs); font-family: inherit; color: var(--t-primary); cursor: pointer;
19461
+ }
19462
+ .sx .sx-menu-item:hover, .sx .sx-menu-item:focus-visible { background: var(--s-hover); color: var(--t-bright); }
19463
+ .sx .sx-menu-item--danger:hover { color: var(--sx-err); }
19464
+
19465
+ /* ── Workspace ── */
19466
+ .sx-ws-head { flex: none; padding: 8px 16px 0; display: grid; gap: 8px; position: relative; }
19467
+ .sx-crumb { display: flex; align-items: center; gap: 6px; font-size: var(--fs-xs); color: var(--t-secondary); }
19468
+ .sx-ws-title { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
19469
+ .sx-ws-name { margin: 0; font: 600 calc(18px * var(--font-scale, 1))/1.3 var(--ff-heading); color: var(--t-bright); overflow-wrap: anywhere; }
19470
+ .sx-ws-name:focus { outline: none; }
19471
+ .sx .sx-tag { font-size: var(--fs-xs); color: var(--t-primary); padding: 2px 8px; border: 1px solid var(--b-light); border-radius: 6px; max-width: 340px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
19472
+ .sx-tabs { display: flex; gap: 4px; border-bottom: 1px solid var(--b-subtle); overflow-x: auto; }
19473
+ .sx .sx-tab {
19474
+ height: 32px; padding: 0 12px; display: inline-flex; align-items: center; gap: 6px;
19475
+ border: 0; border-bottom: 2px solid transparent; margin-bottom: -1px; background: none; cursor: pointer;
19476
+ font-weight: 500; font-size: var(--fs-xs); line-height: 1; font-family: inherit; color: var(--t-secondary); white-space: nowrap;
19477
+ }
19478
+ .sx .sx-tab:hover { color: var(--t-bright); }
19479
+ .sx .sx-tab[aria-selected="true"] { color: var(--t-bright); border-bottom-color: var(--t-bright); }
19480
+ .sx-banners:empty { display: none; }
19481
+ .sx-banners { display: grid; gap: 6px; padding: 8px 16px 0; }
19482
+ .sx .sx-banner {
19483
+ display: flex; flex-wrap: wrap; align-items: center; gap: 8px 12px;
19484
+ padding: 8px 12px; border-radius: 8px; font-size: var(--fs-xs); color: var(--t-primary);
19485
+ border: 1px solid var(--b-light); background: var(--s-subtle);
19486
+ }
19487
+ .sx .sx-banner > .sx-i { color: var(--t-primary); }
19488
+ .sx .sx-banner--warn, .sx .sx-banner--update { border-color: color-mix(in oklab, var(--sx-warn) 35%, transparent); background: color-mix(in oklab, var(--sx-warn) 7%, transparent); }
19489
+ .sx .sx-banner--warn > .sx-i, .sx .sx-banner--update > .sx-i { color: var(--sx-warn); }
19490
+ .sx .sx-banner--draft > .sx-i { color: var(--sx-gold); }
19491
+ .sx-banner-text { flex: 1 1 260px; }
19492
+ .sx-tabpanel { flex: 1; min-height: 0; display: flex; flex-direction: column; overflow: hidden; }
19493
+ .sx-tabpanel:focus { outline: none; }
19494
+
19495
+ /* ── Edit ── */
19496
+ .sx-edit { flex: 1; min-height: 0; display: flex; flex-direction: column; }
19497
+ .sx-pane-switch { display: none; margin: 8px 16px 0; border: 1px solid var(--b-light); border-radius: 5px; overflow: hidden; width: max-content; }
19498
+ .sx-pane-switch button { height: 28px; padding: 0 12px; border: 0; background: transparent; font-size: var(--fs-xs); font-family: inherit; color: var(--t-secondary); cursor: pointer; }
19499
+ .sx-pane-switch button[aria-pressed="true"] { background: var(--s-active); color: var(--t-bright); }
19500
+ .sx-panes { flex: 1; min-height: 0; display: grid; grid-template-columns: 200px minmax(0, 1fr) 300px; margin-top: 8px; border-top: 1px solid var(--b-subtle); }
19501
+ .sx-pane { min-height: 0; min-width: 0; overflow: auto; }
19502
+ .sx-pane + .sx-pane { border-left: 1px solid var(--b-subtle); }
19503
+ .sx-pane--doc { display: flex; flex-direction: column; overflow: hidden; }
19504
+ .sx-pane-label { margin: 0; padding: 8px 12px 4px; font-size: var(--sx-meta); font-weight: 600; letter-spacing: 0.02em; color: var(--t-secondary); }
19505
+ .sx-tree { list-style: none; margin: 0; padding: 0 4px 8px; }
19506
+ .sx-tree-group { list-style: none; margin: 0; padding: 0; }
19507
+ .sx-tree-row { display: flex; align-items: center; padding-left: calc(var(--depth, 0) * 14px); border-radius: 5px; }
19508
+ .sx-tree-row:hover { background: var(--s-hover); }
19509
+ .sx-tree-row.is-current { background: var(--s-active); }
19510
+ .sx .sx-tree-item {
19511
+ flex: 1; min-width: 0; height: 28px; padding: 0 8px;
19512
+ display: flex; align-items: center; gap: 6px;
19513
+ border: 0; background: transparent; text-align: left; cursor: pointer;
19514
+ font: 400 var(--fs-xs)/1 var(--ff-mono, 'JetBrains Mono', monospace); color: var(--t-primary);
19515
+ }
19516
+ .sx .sx-tree-dir { cursor: default; color: var(--t-secondary); }
19517
+ .sx-tree-row.is-current .sx-tree-item { color: var(--t-bright); }
19518
+ .sx-tree-name { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
19519
+ .sx-tree-badge { margin-left: auto; font-weight: 500; font-size: var(--sx-meta); line-height: 1; font-family: inherit; font-family: 'Inter', sans-serif; color: var(--t-secondary); }
19520
+ .sx-tree-badge--warn { color: var(--sx-warn); }
19521
+ .sx-tree-actions { display: none; gap: 2px; padding-right: 4px; }
19522
+ .sx-tree-row:hover .sx-tree-actions, .sx-tree-row:focus-within .sx-tree-actions { display: inline-flex; }
19523
+ .sx-tree-tools { display: flex; flex-wrap: wrap; gap: 6px; padding: 4px 8px 12px; }
19524
+ .sx-doc-bar { flex: none; display: flex; align-items: center; gap: 6px; padding: 4px 8px 0; border-bottom: 1px solid var(--b-subtle); }
19525
+ .sx-doc-tabs { display: flex; gap: 2px; min-width: 0; overflow-x: auto; }
19526
+ .sx-doc-tab { display: inline-flex; align-items: center; border-radius: 5px 5px 0 0; }
19527
+ .sx-doc-tab.is-active { background: var(--s-light); }
19528
+ .sx .sx-doc-tab-btn {
19529
+ height: 28px; padding: 0 10px; display: inline-flex; align-items: center; gap: 6px;
19530
+ border: 0; background: transparent; cursor: pointer;
19531
+ font: 400 var(--fs-xs)/1 var(--ff-mono, 'JetBrains Mono', monospace); color: var(--t-secondary); white-space: nowrap;
19532
+ }
19533
+ .sx-doc-tab.is-active .sx-doc-tab-btn { color: var(--t-bright); }
19534
+ .sx .sx-doc-tab-close { width: 20px; height: 20px; margin-right: 4px; padding: 0; display: inline-grid; place-items: center; border: 0; border-radius: 4px; background: transparent; color: var(--t-secondary); cursor: pointer; }
19535
+ .sx .sx-doc-tab-close:hover { background: var(--s-hover); color: var(--t-bright); }
19536
+ .sx-doc-body { flex: 1; min-height: 0; display: flex; position: relative; }
19537
+ .sx-ed-host { flex: 1; min-width: 0; min-height: 0; display: flex; background: var(--ed-bg); }
19538
+ .sx-ed-host .cm-editor { flex: 1; min-width: 0; height: 100%; }
19539
+ .sx-ed-loading { margin: 16px; }
19540
+ .sx-preview { flex: 1; min-height: 0; overflow: auto; padding: 16px 20px; }
19541
+ .sx-md { font-size: var(--fs-sm); line-height: 1.6; color: var(--t-primary); max-width: 78ch; }
19542
+ .sx-md :is(h1, h2, h3, h4) { font-family: var(--ff-heading); color: var(--t-bright); margin: 16px 0 8px; line-height: 1.3; }
19543
+ .sx-md h1 { font-size: calc(20px * var(--font-scale, 1)); }
19544
+ .sx-md h2 { font-size: calc(17px * var(--font-scale, 1)); }
19545
+ .sx-md h3 { font-size: calc(15px * var(--font-scale, 1)); }
19546
+ .sx-md p { margin: 0 0 10px; }
19547
+ .sx-md a { color: var(--t-bright); }
19548
+ .sx-md code { font: 400 var(--fs-xs)/1.5 var(--ff-mono, 'JetBrains Mono', monospace); padding: 1px 4px; border-radius: 4px; background: var(--s-light); color: var(--t-bright); }
19549
+ .sx-md pre { padding: 10px 12px; border-radius: 6px; background: var(--sx-field); border: 1px solid var(--b-subtle); overflow: auto; }
19550
+ .sx-md pre code { padding: 0; background: none; }
19551
+ .sx-md blockquote { margin: 0 0 10px; padding: 4px 12px; border-left: 2px solid var(--b-visible); color: var(--t-primary); }
19552
+ .sx-md table { border-collapse: collapse; margin: 0 0 10px; font-size: var(--fs-xs); }
19553
+ .sx-md :is(th, td) { padding: 4px 8px; border: 1px solid var(--b-light); text-align: left; }
19554
+ .sx-mermaid svg { max-width: 100%; height: auto; }
19555
+ .sx-binary { flex: 1; min-height: 0; overflow: auto; display: flex; }
19556
+ .sx-binary-view { margin: auto; padding: 24px; display: grid; justify-items: center; gap: 8px; text-align: center; font-size: var(--fs-xs); }
19557
+ .sx-binary-view p { margin: 0; }
19558
+ .sx-binary-img { max-width: min(480px, 100%); max-height: 320px; border-radius: 6px; border: 1px solid var(--b-light); background: var(--s-subtle); }
19559
+ .sx-binary-icon { display: inline-flex; padding: 12px; border: 1px solid var(--b-light); border-radius: 8px; }
19560
+ .sx-binary-name { font-family: var(--ff-mono, 'JetBrains Mono', monospace); color: var(--t-bright); overflow-wrap: anywhere; }
19561
+ .sx-fallback { flex: 1; display: flex; flex-direction: column; gap: 8px; padding: 8px; }
19562
+ .sx .sx-fallback-text { flex: 1; min-height: 240px; font-family: var(--ff-mono, 'JetBrains Mono', monospace); resize: none; }
19563
+ .sx-statusbar {
19564
+ flex: none; min-height: 28px; display: flex; flex-wrap: wrap; align-items: center; gap: 4px 14px;
19565
+ padding: 4px 16px; border-top: 1px solid var(--b-subtle);
19566
+ font: 400 var(--sx-meta)/1.4 var(--ff-mono, 'JetBrains Mono', monospace); color: var(--t-secondary);
19567
+ }
19568
+ .sx-statusbar > span { white-space: nowrap; display: inline-flex; align-items: center; gap: 6px; }
19569
+ .sx-statusbar .sx-state { color: var(--t-primary); }
19570
+ .sx-guidance.is-over { color: var(--sx-warn); }
19571
+
19572
+ /* ── Inspector ── */
19573
+ .sx-inspector { padding: 8px 12px 16px; display: grid; gap: 12px; align-content: start; }
19574
+ .sx-form { display: grid; gap: 10px; }
19575
+ .sx-chips { display: flex; flex-wrap: wrap; gap: 4px; }
19576
+ .sx .sx-chip {
19577
+ display: inline-flex; align-items: center; gap: 4px; padding: 2px 4px 2px 8px; border-radius: 6px;
19578
+ border: 1px solid var(--b-light); background: var(--s-light); font: 400 var(--fs-xs)/1.4 var(--ff-mono, 'JetBrains Mono', monospace); color: var(--t-bright);
19579
+ }
19580
+ .sx .sx-chip-x { width: 18px; height: 18px; padding: 0; display: inline-grid; place-items: center; border: 0; border-radius: 4px; background: transparent; color: var(--t-secondary); cursor: pointer; }
19581
+ .sx .sx-chip-x:hover { color: var(--sx-err); background: var(--s-hover); }
19582
+ .sx-tools-add { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; }
19583
+ .sx-tools-add .sx-input { flex: 1 1 120px; width: auto; }
19584
+ .sx-helper { display: grid; gap: 6px; }
19585
+ .sx-budgets, .sx-checks { list-style: none; margin: 0; padding: 0; display: grid; gap: 4px; }
19586
+ .sx-budget { display: grid; grid-template-columns: minmax(70px, auto) 56px auto; gap: 8px; align-items: center; font-size: var(--fs-xs); color: var(--t-secondary); }
19587
+ .sx-budget.is-over { color: var(--sx-warn); }
19588
+ .sx-budget-count { font: 400 var(--sx-meta)/1.4 var(--ff-mono, 'JetBrains Mono', monospace); }
19589
+ .sx-checks li { display: flex; align-items: center; gap: 6px; font-size: var(--fs-xs); }
19590
+ .sx-checks .is-ok { color: var(--sx-ok); }
19591
+ .sx-checks .is-warn { color: var(--sx-warn); }
19592
+ .sx-insp-section { display: grid; gap: 6px; }
19593
+ .sx-insp-h { margin: 0; display: flex; align-items: center; gap: 6px; font-size: var(--fs-xs); font-weight: 600; color: var(--t-primary); }
19594
+ .sx-problems { list-style: none; margin: 0; padding: 0; display: grid; gap: 4px; }
19595
+ .sx .sx-problem {
19596
+ width: 100%; padding: 6px 8px; display: flex; gap: 6px; align-items: flex-start; text-align: left;
19597
+ border: 1px solid var(--b-subtle); border-radius: 5px; background: var(--s-subtle); cursor: pointer;
19598
+ font-size: var(--fs-xs); font-family: inherit; color: var(--t-primary);
19599
+ }
19600
+ .sx .sx-problem:hover { border-color: var(--b-hover); }
19601
+ .sx .sx-problem--error > .sx-i { color: var(--sx-err); }
19602
+ .sx .sx-problem--warning > .sx-i { color: var(--sx-warn); }
19603
+ .sx-problem-text { flex: 1; overflow-wrap: anywhere; }
19604
+ .sx-problem-line { color: var(--t-secondary); font-family: var(--ff-mono, 'JetBrains Mono', monospace); font-size: var(--sx-meta); }
19605
+ .sx-problem-tag { font-size: var(--sx-meta); color: var(--t-secondary); white-space: nowrap; }
19606
+ .sx-advanced { display: grid; gap: 6px; }
19607
+ .sx-kept { list-style: none; margin: 0; padding: 0; display: grid; gap: 6px; }
19608
+ .sx-snip-group { margin: 6px 0 2px; font-size: var(--sx-meta); font-weight: 600; letter-spacing: 0.02em; color: var(--t-secondary); }
19609
+ .sx-snippets { list-style: none; margin: 0; padding: 0; display: grid; gap: 4px; }
19610
+ .sx .sx-snippet {
19611
+ display: flex; align-items: center; gap: 8px; padding: 8px;
19612
+ border: 1px solid var(--b-light); border-radius: 5px; background: var(--s-subtle);
19613
+ cursor: move;
19751
19614
  }
19752
- .ss-dropdown-trigger:hover svg { opacity: 0.6; }
19753
- .ss-dropdown-trigger.open {
19754
- border-color: rgba(148, 163, 184, 0.3);
19755
- color: rgba(148, 163, 184, 0.85);
19756
- background: rgba(148, 163, 184, 0.14);
19615
+ .sx .sx-snippet .sx-btn { cursor: pointer; }
19616
+ .sx-snippet-text { flex: 1; min-width: 0; }
19617
+ .sx-snippet-name { display: block; font-size: var(--fs-xs); font-weight: 500; color: var(--t-bright); }
19618
+ .sx-snippet-where { display: block; font-size: var(--sx-meta); color: var(--t-secondary); }
19619
+
19620
+ /* ── Versions ── */
19621
+ .sx-versions { flex: 1; min-height: 0; overflow: auto; padding: 12px 16px 16px; display: grid; gap: 12px; align-content: start; }
19622
+ .sx-versions-head { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
19623
+ .sx-compare-pick { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; }
19624
+ .sx-timeline { list-style: none; margin: 0; padding: 0; display: grid; gap: 6px; }
19625
+ .sx-version { padding: 8px 12px; border: 1px solid var(--b-light); border-radius: 8px; background: var(--s-subtle); display: grid; gap: 4px; }
19626
+ .sx-version--draft { border-style: dashed; }
19627
+ .sx-version-main { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; }
19628
+ .sx-version-id { font: 600 var(--fs-xs)/1.3 var(--ff-mono, 'JetBrains Mono', monospace); color: var(--t-bright); }
19629
+ .sx-version-meta { margin: 0; font-size: var(--fs-xs); color: var(--t-secondary); }
19630
+ .sx-version-note { color: var(--t-primary); }
19631
+ .sx-version-actions { display: flex; flex-wrap: wrap; gap: 6px; }
19632
+ .sx .sx-label { padding: 1px 7px; border-radius: 6px; border: 1px solid var(--b-light); font-size: var(--sx-meta); font-weight: 500; color: var(--t-primary); white-space: nowrap; }
19633
+ .sx .sx-label--latest { color: var(--t-bright); border-color: var(--b-visible); }
19634
+ .sx .sx-label--approved { color: var(--sx-ok); border-color: color-mix(in oklab, var(--sx-ok) 40%, transparent); }
19635
+ .sx .sx-label--upstream { color: var(--sx-info); }
19636
+ .sx .sx-label--installed { color: var(--sx-ok); border-style: dashed; border-color: color-mix(in oklab, var(--sx-ok) 40%, transparent); }
19637
+ .sx .sx-label--draft, .sx .sx-label--candidate { color: var(--sx-gold); border-color: color-mix(in oklab, var(--sx-gold) 40%, transparent); }
19638
+ .sx .sx-label--best { color: var(--t-bright); border-color: var(--b-visible); background: var(--s-light); }
19639
+
19640
+ /* ── Differences ── */
19641
+ .sx-diff-box:empty { display: none; }
19642
+ .sx-diff { display: grid; gap: 8px; }
19643
+ .sx-diff-file { border: 1px solid var(--b-light); border-radius: 6px; overflow: hidden; }
19644
+ .sx-diff-file > summary { display: flex; align-items: center; gap: 8px; padding: 6px 10px; background: var(--s-subtle); cursor: pointer; font-size: var(--fs-xs); }
19645
+ .sx-diff-status { font-size: var(--sx-meta); font-weight: 600; color: var(--t-primary); }
19646
+ .sx-diff-status--added { color: var(--sx-ok); }
19647
+ .sx-diff-status--removed { color: var(--sx-err); }
19648
+ .sx-diff-status--modified, .sx-diff-status--mode { color: var(--sx-warn); }
19649
+ .sx-diff-path { font-family: var(--ff-mono, 'JetBrains Mono', monospace); color: var(--t-bright); overflow-wrap: anywhere; }
19650
+ .sx-diff-counts { margin-left: auto; font: 500 var(--sx-meta)/1 var(--ff-mono, 'JetBrains Mono', monospace); }
19651
+ .sx-diff-plus { color: var(--sx-ok); }
19652
+ .sx-diff-minus { color: var(--sx-err); }
19653
+ .sx-diff-hunk { width: 100%; border-collapse: collapse; font: 400 var(--fs-xs)/1.55 var(--ff-mono, 'JetBrains Mono', monospace); }
19654
+ .sx-diff-head { padding: 4px 10px; text-align: left; color: var(--t-secondary); background: var(--sx-field); }
19655
+ .sx-diff-num { width: 40px; padding: 0 6px; text-align: right; color: var(--t-secondary); user-select: none; vertical-align: top; }
19656
+ .sx-diff-sign { width: 16px; padding: 0 4px; color: var(--t-secondary); vertical-align: top; }
19657
+ .sx-diff-text { padding: 0 8px; white-space: pre-wrap; overflow-wrap: anywhere; color: var(--t-bright); }
19658
+ .sx-diff-row--add td { background: color-mix(in oklab, var(--sx-ok) 9%, transparent); }
19659
+ .sx-diff-row--del td { background: color-mix(in oklab, var(--sx-err) 9%, transparent); }
19660
+ .sx-diff-row--add .sx-diff-sign { color: var(--sx-ok); }
19661
+ .sx-diff-row--del .sx-diff-sign { color: var(--sx-err); }
19662
+
19663
+ /* ── Publish: one choice (the tiles), one line per target (the plan), one button (the foot, always in sight) ── */
19664
+ .sx-publish { flex: 1; min-height: 0; display: flex; flex-direction: column; }
19665
+ .sx-pub-scroll { flex: 1; min-height: 0; overflow: auto; padding: 12px 16px 16px; display: grid; gap: 16px; align-content: start; }
19666
+ .sx-pub-section { display: grid; gap: 8px; }
19667
+ .sx-pub-section:empty { display: none; }
19668
+ .sx .sx-pub-status { margin: 0; display: flex; align-items: flex-start; gap: 8px; font-size: var(--fs-sm); line-height: 1.45; color: var(--t-bright); }
19669
+ .sx .sx-pub-status > .sx-i { flex: none; margin-top: 3px; color: var(--sx-ok); }
19670
+ .sx-tiles { display: grid; grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); gap: 8px; }
19671
+ .sx .sx-tile {
19672
+ position: relative; display: grid; grid-template-columns: auto minmax(0, 1fr); grid-template-rows: auto auto; column-gap: 10px; row-gap: 2px; align-items: center;
19673
+ min-height: 56px; padding: 10px 12px; border: 1px solid var(--b-light); border-radius: 8px; background: var(--s-subtle); cursor: pointer;
19674
+ transition: background 0.15s ease, border-color 0.15s ease;
19757
19675
  }
19758
- .ss-dropdown-trigger.open svg {
19759
- transform: rotate(180deg);
19760
- opacity: 0.7;
19676
+ .sx .sx-tile:hover { border-color: var(--b-hover); background: var(--s-light); }
19677
+ .sx .sx-tile.is-on { border-color: var(--b-visible); background: var(--s-light); }
19678
+ .sx .sx-tile.is-off { opacity: 0.6; cursor: default; }
19679
+ .sx .sx-tile:focus-within { outline: 2px solid var(--sx-focus); outline-offset: 1px; }
19680
+ .sx .sx-tile > input { grid-row: 1 / span 2; width: 16px; height: 16px; }
19681
+ .sx-tile-name { font-weight: 600; font-size: var(--fs-sm); color: var(--t-bright); line-height: 1.3; }
19682
+ .sx-tile-state { font-size: var(--sx-meta); color: var(--t-secondary); line-height: 1.3; }
19683
+ .sx-tile-state--installed { color: var(--sx-ok); }
19684
+ .sx-tile-state--outdated, .sx-tile-state--bridge { color: var(--sx-warn); }
19685
+ .sx-pub-scope .sx-seg button { height: 26px; }
19686
+ .sx-plan-lines { list-style: none; margin: 0; padding: 0; display: grid; gap: 6px; }
19687
+ .sx-plan-line { display: flex; align-items: flex-start; gap: 8px; padding: 8px 10px; border: 1px solid var(--b-light); border-radius: 6px; background: var(--s-subtle); font-size: var(--fs-xs); color: var(--t-primary); line-height: 1.45; }
19688
+ .sx-plan-line-icon { flex: none; display: inline-flex; margin-top: 2px; color: var(--t-secondary); }
19689
+ .sx-plan-line-text { min-width: 0; overflow-wrap: anywhere; }
19690
+ .sx-plan-line-text strong { color: var(--t-bright); font-weight: 600; }
19691
+ .sx-plan-line--ok .sx-plan-line-icon { color: var(--sx-ok); }
19692
+ .sx-plan-line--warn { border-color: color-mix(in oklab, var(--sx-warn) 35%, transparent); }
19693
+ .sx-plan-line--warn .sx-plan-line-icon { color: var(--sx-warn); }
19694
+ .sx-plan-line--err { border-color: color-mix(in oklab, var(--sx-err) 35%, transparent); }
19695
+ .sx-plan-line--err .sx-plan-line-icon { color: var(--sx-err); }
19696
+ .sx .sx-pub-checking { display: inline-flex; align-items: center; gap: 8px; }
19697
+ .sx .sx-pub-checking::before { content: ''; width: 10px; height: 10px; border-radius: 50%; border: 2px solid var(--b-visible); border-top-color: var(--t-bright); animation: sx-spin 0.9s linear infinite; }
19698
+ @keyframes sx-spin { to { transform: rotate(360deg); } }
19699
+ .sx-outcome { display: grid; gap: 6px; padding: 10px 12px; border: 1px solid color-mix(in oklab, var(--sx-ok) 40%, transparent); border-radius: 8px; background: color-mix(in oklab, var(--sx-ok) 7%, transparent); font-size: var(--fs-xs); color: var(--t-primary); }
19700
+ .sx-outcome--error { border-color: color-mix(in oklab, var(--sx-warn) 40%, transparent); background: color-mix(in oklab, var(--sx-warn) 7%, transparent); }
19701
+ .sx .sx-outcome-line { margin: 0; display: flex; align-items: flex-start; gap: 8px; font-size: var(--fs-sm); color: var(--t-bright); }
19702
+ .sx .sx-outcome-line > .sx-i { flex: none; margin-top: 3px; color: var(--sx-ok); }
19703
+ .sx-outcome--error .sx-outcome-line > .sx-i { color: var(--sx-warn); }
19704
+ .sx .sx-outcome-notes { display: grid; gap: 2px; padding-left: 22px; }
19705
+ .sx-installs { list-style: none; margin: 0; padding: 0; display: grid; gap: 6px; }
19706
+ .sx-install-row { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; padding: 8px 10px; border: 1px solid var(--b-light); border-radius: 6px; font-size: var(--fs-xs); }
19707
+ .sx-install-where { font-weight: 600; color: var(--t-bright); }
19708
+ .sx-install-actions { display: inline-flex; flex-wrap: wrap; gap: 4px; margin-left: auto; }
19709
+ .sx-install-facts { flex-basis: 100%; }
19710
+ .sx .sx-pub-advanced > summary { padding: 6px 0; }
19711
+ .sx-pub-advanced-body { display: grid; gap: 10px; padding: 8px 0 4px; }
19712
+ .sx-pub-bar {
19713
+ flex: none; position: sticky; bottom: 0; z-index: 2;
19714
+ display: flex; flex-wrap: wrap; align-items: center; gap: 8px 16px;
19715
+ padding: 10px 16px; background: var(--sx-raised); border-top: 1px solid var(--b-light);
19716
+ }
19717
+ .sx-pub-bar-text { flex: 1 1 240px; min-width: 0; display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px 12px; font-size: var(--fs-xs); color: var(--t-primary); }
19718
+ .sx-pub-bar-where { font-weight: 600; color: var(--t-bright); overflow-wrap: anywhere; }
19719
+ .sx-pub-bar-version { font-size: var(--sx-meta); }
19720
+ .sx .sx-btn--lg { height: 36px; padding: 0 20px; font-size: var(--fs-sm); font-weight: 600; }
19721
+ .sx .sx-btn--lg[data-state="installed"] { color: var(--sx-ok); background: transparent; border-color: color-mix(in oklab, var(--sx-ok) 40%, transparent); opacity: 1; }
19722
+ .sx .sx-btn--lg[data-state="installed"] .sx-i { color: var(--sx-ok); }
19723
+ .sx-confirm-list { display: grid; gap: 8px; margin-top: 4px; }
19724
+ .sx .sx-confirm-item { margin: 0; font-size: var(--fs-xs); color: var(--t-primary); line-height: 1.45; overflow-wrap: anywhere; }
19725
+ .sx .sx-confirm-item p { margin: 0 0 6px; }
19726
+ /* The one status of a library skill: the same pill in the workspace head and the Library row. */
19727
+ .sx .sx-status {
19728
+ display: inline-flex; align-items: center; gap: 6px; max-width: 100%;
19729
+ min-height: 22px; padding: 2px 8px; line-height: 1.3; box-sizing: border-box;
19730
+ border: 1px solid var(--b-light); border-radius: 6px; background: transparent;
19731
+ font-size: var(--fs-xs); font-weight: 500; font-family: inherit; color: var(--t-primary); white-space: nowrap;
19732
+ }
19733
+ .sx .sx-status > span { overflow: hidden; text-overflow: ellipsis; }
19734
+ .sx button.sx-status { cursor: pointer; }
19735
+ .sx button.sx-status:hover { border-color: var(--b-hover); color: var(--t-bright); }
19736
+ .sx .sx-status--installed { color: var(--sx-ok); border-color: color-mix(in oklab, var(--sx-ok) 40%, transparent); background: color-mix(in oklab, var(--sx-ok) 8%, transparent); }
19737
+ .sx .sx-status--outdated { color: var(--sx-warn); border-color: color-mix(in oklab, var(--sx-warn) 40%, transparent); background: color-mix(in oklab, var(--sx-warn) 8%, transparent); }
19738
+ .sx .sx-status--approved { color: var(--t-bright); border-color: var(--b-visible); background: var(--s-light); }
19739
+ .sx .sx-status--review, .sx .sx-status--changes { color: var(--sx-info); border-color: var(--b-visible); }
19740
+ .sx .sx-status--draft { color: var(--sx-gold); border-color: color-mix(in oklab, var(--sx-gold) 40%, transparent); }
19741
+ .sx .sx-status--none { color: var(--t-secondary); }
19742
+ .sx-health-cell { display: inline-flex; flex-wrap: wrap; align-items: center; gap: 4px; max-width: 100%; }
19743
+ .sx-health-cell .sx-status { white-space: normal; }
19744
+ .sx-health-cell .sx-status > span { white-space: normal; overflow: visible; }
19745
+ .sx .sx-banner-lines { display: grid; gap: 2px; margin-top: 4px; color: var(--t-primary); }
19746
+ .sx .sx-banner--ok { border-color: color-mix(in oklab, var(--sx-ok) 35%, transparent); background: color-mix(in oklab, var(--sx-ok) 7%, transparent); }
19747
+ .sx .sx-banner--ok > .sx-i { color: var(--sx-ok); }
19748
+ .sx .sx-rt-row--fix .sx-rt-state { color: var(--sx-warn); text-align: right; line-height: 1.25; }
19749
+ .sx-grid { width: 100%; border-collapse: separate; border-spacing: 0; font-size: var(--fs-xs); }
19750
+ .sx-grid th { text-align: left; padding: 8px; color: var(--t-secondary); font-size: var(--sx-meta); font-weight: 600; border-bottom: 1px solid var(--b-subtle); }
19751
+ .sx-grid td { padding: 8px; border-bottom: 1px solid var(--b-subtle); vertical-align: top; }
19752
+ .sx-grid .sx-path { max-width: 280px; overflow-wrap: anywhere; color: var(--t-secondary); }
19753
+ .sx-actions-cell { display: flex; flex-wrap: wrap; gap: 4px; }
19754
+ .sx .sx-state-chip { display: inline-block; padding: 1px 7px; border-radius: 6px; border: 1px solid var(--b-light); font-size: var(--sx-meta); font-weight: 500; color: var(--t-primary); white-space: nowrap; }
19755
+ .sx .sx-state-chip--installed, .sx .sx-state-chip--ready, .sx .sx-state-chip--review-approved, .sx .sx-state-chip--review-published { color: var(--sx-ok); border-color: color-mix(in oklab, var(--sx-ok) 40%, transparent); }
19756
+ .sx .sx-state-chip--outdated, .sx .sx-state-chip--bridge, .sx .sx-state-chip--needs, .sx .sx-state-chip--review-pending, .sx .sx-state-chip--review-partial { color: var(--sx-warn); border-color: color-mix(in oklab, var(--sx-warn) 40%, transparent); }
19757
+ .sx .sx-state-chip--blocked, .sx .sx-state-chip--review-rejected, .sx .sx-state-chip--review-publish_failed { color: var(--sx-err); border-color: color-mix(in oklab, var(--sx-err) 40%, transparent); }
19758
+ .sx .sx-state-chip--none, .sx .sx-state-chip--off, .sx .sx-state-chip--present { color: var(--t-secondary); }
19759
+ .sx-facts { list-style: none; margin: 4px 0 0; padding: 0; display: grid; gap: 2px; font-size: var(--fs-xs); color: var(--t-primary); }
19760
+ .sx-plan { display: grid; gap: 8px; }
19761
+ .sx-plan-row { padding: 10px 12px; border: 1px solid var(--b-light); border-radius: 8px; background: var(--s-subtle); display: grid; gap: 6px; }
19762
+ .sx-plan-row--blocked { border-color: color-mix(in oklab, var(--sx-err) 35%, transparent); }
19763
+ .sx-plan-row--needs { border-color: color-mix(in oklab, var(--sx-warn) 35%, transparent); }
19764
+ .sx-plan-head { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
19765
+ .sx-plan-target { font-weight: 600; color: var(--t-bright); font-size: var(--fs-xs); }
19766
+ .sx .sx-confirm { display: flex; align-items: flex-start; gap: 8px; font-size: var(--fs-xs); color: var(--t-bright); cursor: pointer; }
19767
+ .sx .sx-confirm input { margin-top: 2px; accent-color: var(--sx-primary); }
19768
+ .sx-findings { list-style: none; margin: 0; padding: 0; display: grid; gap: 4px; }
19769
+ .sx-finding { padding: 6px 8px; border-radius: 5px; background: var(--s-subtle); border-left: 2px solid var(--b-light); font-size: var(--fs-xs); }
19770
+ .sx-finding--critical, .sx-finding--high { border-left-color: var(--sx-err); }
19771
+ .sx-finding--medium { border-left-color: var(--sx-warn); }
19772
+ .sx-finding-sev { font-weight: 600; color: var(--t-bright); }
19773
+ .sx-results { list-style: none; margin: 0; padding: 0; display: grid; gap: 4px; }
19774
+ .sx-result { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; font-size: var(--fs-xs); }
19775
+
19776
+ /* ── Review ── */
19777
+ .sx-cards { padding: 16px; display: grid; gap: 12px; max-width: 880px; }
19778
+ .sx-card { padding: 12px 16px; display: grid; gap: 8px; background: var(--s-subtle); border: 1px solid var(--b-light); border-radius: 8px; }
19779
+ .sx-card:focus { outline: none; }
19780
+ .sx-card.is-focused { border-color: var(--b-visible); }
19781
+ .sx-card-top { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
19782
+ .sx-card-kind { margin: 0; display: inline-flex; align-items: center; gap: 6px; font-weight: 600; font-size: var(--fs-sm); line-height: 1.3; font-family: inherit; color: var(--t-bright); }
19783
+ .sx-card-mark { display: inline-flex; color: var(--sx-gold); }
19784
+ .sx-card-from { font-size: var(--fs-xs); color: var(--t-secondary); }
19785
+ .sx-card-notes { margin: 0; color: var(--t-primary); font-size: var(--fs-xs); overflow-wrap: anywhere; white-space: pre-wrap; }
19786
+ .sx-card-actions { display: flex; flex-wrap: wrap; gap: 8px; }
19787
+ .sx-card .sx-scan-err { color: var(--sx-err); }
19788
+ .sx-card .sx-scan-warn { color: var(--sx-warn); }
19789
+ .sx-card .sx-scan-ok { color: var(--sx-ok); }
19790
+ .sx-authority { display: grid; gap: 4px; }
19791
+
19792
+ /* ── Create ── */
19793
+ .sx-create { padding: 24px 24px 16px; display: grid; gap: 16px; max-width: 820px; }
19794
+ .sx-ai { display: grid; gap: 8px; padding: 12px; border: 1px solid var(--b-light); border-radius: 8px; background: var(--s-subtle); }
19795
+ .sx .sx-prompt { min-height: 110px; font-size: var(--fs-sm); line-height: 1.5; padding: 12px 14px; border-radius: 8px; }
19796
+ .sx-sources { gap: 6px; }
19797
+ .sx-blank { display: grid; gap: 12px; padding: 12px; border: 1px solid var(--b-light); border-radius: 8px; }
19798
+ .sx-layouts { display: grid; grid-template-columns: repeat(auto-fill, minmax(170px, 1fr)); gap: 6px; }
19799
+ .sx .sx-layout {
19800
+ position: relative; /* the hidden radio stays inside its card (focusing it never scrolls elsewhere) */
19801
+ display: grid; gap: 2px; padding: 8px 10px; border: 1px solid var(--b-light); border-radius: 6px; cursor: pointer;
19802
+ background: transparent;
19761
19803
  }
19762
-
19763
- .ss-dropdown-menu {
19764
- position: absolute; z-index: 400;
19765
- top: calc(100% + 6px); left: 0; right: 0;
19766
- display: none; flex-direction: column;
19767
- background: rgba(18, 20, 28, 0.92);
19768
- border: 1px solid rgba(148, 163, 184, 0.16);
19769
- border-radius: var(--r-button);
19770
- box-shadow: var(--shadow-md);
19771
- padding: 8px 0;
19772
- backdrop-filter: blur(12px);
19773
- max-height: 240px; overflow-y: auto;
19774
- scrollbar-width: thin; scrollbar-color: rgba(148, 163, 184, 0.12) transparent;
19775
- animation: ss-dropdown-in 0.2s ease;
19804
+ .sx .sx-layout.is-on { border-color: var(--b-visible); background: var(--s-light); }
19805
+ .sx .sx-layout input { position: absolute; opacity: 0; pointer-events: none; }
19806
+ .sx .sx-layout:focus-within { outline: 2px solid var(--sx-focus); outline-offset: 1px; }
19807
+ .sx-layout-name { font-size: var(--fs-xs); font-weight: 600; color: var(--t-bright); }
19808
+ .sx-layout-desc { font-size: var(--sx-meta); color: var(--t-secondary); }
19809
+ .sx-examples { color: var(--t-primary); }
19810
+ /* ── Create: drafting with AI (P3, shared/skills/studio/sx-create-ai-view.js) ── */
19811
+ .sx-ai #sx-ai-main, .sx-ai-form, .sx-ai-job { display: grid; gap: 10px; min-width: 0; }
19812
+ .sx-ai .sx-section-title { display: inline-flex; align-items: center; gap: 6px; }
19813
+ .sx .sx-ai-example-toggle { justify-self: start; }
19814
+ .sx-ai-chips { margin: 0; padding: 0; list-style: none; display: flex; flex-wrap: wrap; gap: 6px; }
19815
+ .sx-ai-chip {
19816
+ display: inline-flex; align-items: center; gap: 6px; max-width: 100%; padding: 2px 2px 2px 8px;
19817
+ border: 1px solid var(--b-light); border-radius: 5px; background: var(--s-light); font-size: var(--fs-xs); color: var(--t-bright);
19818
+ }
19819
+ .sx-ai-chip-kind { color: var(--t-secondary); white-space: nowrap; }
19820
+ .sx-ai-chip-label { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
19821
+ .sx .sx-ai-chip-x { width: 22px; height: 22px; }
19822
+ .sx .sx-sources .sx-btn.is-on { border-color: var(--b-visible); background: var(--s-active); }
19823
+ .sx-ai-editor { display: grid; gap: 8px; padding: 10px 12px; border: 1px solid var(--b-light); border-radius: 8px; background: var(--sx-field); }
19824
+ .sx-ai-editor-title { margin: 0; font: 600 var(--fs-xs)/1.3 var(--ff-heading); color: var(--t-bright); }
19825
+ .sx-ai-editor-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 8px; }
19826
+ .sx-ai-wide { grid-column: 1 / -1; }
19827
+ .sx-ai-editor-actions { justify-content: flex-end; }
19828
+ .sx-ai-sessions { display: grid; gap: 2px; max-height: 240px; overflow: auto; padding: 2px; }
19829
+ .sx .sx-ai-session {
19830
+ display: grid; gap: 2px; padding: 6px 10px; text-align: left; border: 1px solid transparent; border-radius: 5px;
19831
+ background: transparent; color: var(--t-bright); font: inherit; font-size: var(--fs-xs); cursor: pointer;
19832
+ }
19833
+ .sx .sx-ai-session:hover { background: var(--s-hover); }
19834
+ .sx .sx-ai-session.is-on { border-color: var(--b-visible); background: var(--s-active); }
19835
+ .sx .sx-ai-session:focus-visible { outline: 2px solid var(--sx-focus); outline-offset: 1px; }
19836
+ .sx-ai-session-title { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
19837
+ .sx-ai-session-meta { font-size: var(--sx-meta); color: var(--t-secondary); }
19838
+ .sx-ai-options { display: grid; gap: 8px; margin: 0; padding: 10px 0 0; border: 0; border-top: 1px solid var(--b-subtle); min-width: 0; }
19839
+ .sx-ai-options .sx-choices { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 14px; }
19840
+ .sx-ai-go .sx-help { flex: 1 1 260px; }
19841
+ .sx-ai-job-head { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
19842
+ .sx-ai-job-head .sx-spacer { flex: 1; }
19843
+ .sx-ai-job .sx-section-title:focus { outline: none; }
19844
+ .sx-ai-steps { margin: 0; padding: 0; list-style: none; display: flex; flex-wrap: wrap; gap: 6px 16px; font-size: var(--fs-xs); color: var(--t-secondary); }
19845
+ .sx-ai-step { display: inline-flex; align-items: center; gap: 6px; }
19846
+ .sx-ai-step-n {
19847
+ width: 20px; height: 20px; flex: none; display: inline-flex; align-items: center; justify-content: center;
19848
+ border-radius: 50%; border: 1px solid var(--b-light); font-size: var(--sx-meta); color: var(--t-secondary);
19849
+ }
19850
+ .sx-ai-step.is-done { color: var(--t-primary); }
19851
+ .sx-ai-step.is-done .sx-ai-step-n { border-color: color-mix(in oklab, var(--sx-ok) 50%, transparent); color: var(--sx-ok); }
19852
+ .sx-ai-step.is-active { color: var(--t-bright); }
19853
+ .sx-ai-step.is-active .sx-ai-step-n { border-color: var(--b-visible); color: var(--t-bright); animation: sx-ai-pulse 1.6s ease-in-out infinite; }
19854
+ .sx-ai-step.is-failed { color: var(--sx-err); }
19855
+ .sx-ai-step.is-failed .sx-ai-step-n { border-color: color-mix(in oklab, var(--sx-err) 50%, transparent); color: var(--sx-err); }
19856
+ .sx-ai-step.is-skipped { text-decoration: line-through; }
19857
+ @keyframes sx-ai-pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.45; } }
19858
+ .sx-ai-facts { margin: 0; display: grid; gap: 6px; font-size: var(--fs-xs); }
19859
+ .sx-ai-facts > div { display: grid; grid-template-columns: 90px minmax(0, 1fr); gap: 8px; }
19860
+ .sx-ai-facts dt { color: var(--t-secondary); }
19861
+ .sx-ai-facts dd { margin: 0; color: var(--t-primary); min-width: 0; overflow-wrap: anywhere; }
19862
+ .sx-ai-written, .sx-ai-activity, .sx-ai-result { display: grid; gap: 6px; }
19863
+ .sx-ai-activity pre {
19864
+ margin: 0; padding: 8px 10px; max-height: 160px; overflow: auto; border-radius: 6px;
19865
+ background: var(--sx-field); border: 1px solid var(--b-subtle); color: var(--t-primary); white-space: pre-wrap; overflow-wrap: anywhere;
19866
+ }
19867
+ .sx-ai-result p { margin: 0; font-size: var(--fs-xs); color: var(--t-primary); }
19868
+ .sx .sx-ai-checks { padding-left: 0; list-style: none; }
19869
+ .sx-ai-checks .sx-scan-ok { color: var(--sx-ok); }
19870
+ .sx-ai-checks .sx-scan-warn { color: var(--sx-warn); }
19871
+ .sx-ai-checks .sx-scan-err { color: var(--sx-err); }
19872
+ .sx-ai-details summary { cursor: pointer; font-size: var(--fs-xs); color: var(--t-primary); }
19873
+ .sx-ai-details[open] summary { margin-bottom: 4px; }
19874
+ .sx-ai-error {
19875
+ display: grid; gap: 4px; padding: 8px 10px; border-radius: 8px;
19876
+ border: 1px solid color-mix(in oklab, var(--sx-err) 35%, transparent); background: color-mix(in oklab, var(--sx-err) 6%, transparent);
19877
+ }
19878
+ .sx-ai-error p { margin: 0; font-size: var(--fs-xs); }
19879
+ .sx-ai-recent { display: grid; gap: 6px; padding-top: 10px; border-top: 1px solid var(--b-subtle); }
19880
+ .sx-ai-recent-list { margin: 0; padding: 0; list-style: none; display: grid; gap: 2px; }
19881
+ .sx .sx-ai-recent-row {
19882
+ width: 100%; display: grid; grid-template-columns: 10px minmax(0, 1fr) auto auto; align-items: center; gap: 8px; padding: 5px 8px;
19883
+ border: 1px solid transparent; border-radius: 5px; background: transparent; color: var(--t-bright); font: inherit; font-size: var(--fs-xs); text-align: left; cursor: pointer;
19884
+ }
19885
+ .sx .sx-ai-recent-row:hover { background: var(--s-hover); }
19886
+ .sx .sx-ai-recent-row.is-on { border-color: var(--b-light); background: var(--s-light); }
19887
+ .sx .sx-ai-recent-row:focus-visible { outline: 2px solid var(--sx-focus); outline-offset: 1px; }
19888
+ .sx-ai-recent-name { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
19889
+ .sx-ai-recent-state { color: var(--t-secondary); white-space: nowrap; }
19890
+ .sx-ai-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--t-secondary); }
19891
+ .sx-ai-dot--done { background: var(--sx-ok); }
19892
+ .sx-ai-dot--failed, .sx-ai-dot--interrupted { background: var(--sx-err); }
19893
+ .sx-ai-dot--cancelled { background: var(--sx-warn); }
19894
+ .sx-ai-dot--queued, .sx-ai-dot--gathering, .sx-ai-dot--drafting, .sx-ai-dot--checking, .sx-ai-dot--submitting { background: var(--sx-info); animation: sx-ai-pulse 1.6s ease-in-out infinite; }
19895
+ @container ss (max-width: 560px) {
19896
+ .sx-ai-facts > div { grid-template-columns: minmax(0, 1fr); gap: 0; }
19897
+ .sx .sx-ai-recent-row { grid-template-columns: 10px minmax(0, 1fr) auto; }
19898
+ .sx-ai-recent-row time { display: none; }
19776
19899
  }
19777
- .ss-dropdown-menu.open { display: flex; }
19778
- @keyframes ss-dropdown-in {
19779
- from { opacity: 0; transform: translateY(-8px) scale(0.98); }
19780
- to { opacity: 1; transform: translateY(0) scale(1); }
19900
+ @media (prefers-reduced-motion: reduce) {
19901
+ .sx-ai-step.is-active .sx-ai-step-n, .sx-ai-dot { animation: none; }
19902
+ }
19903
+
19904
+ /* ── Test: evaluations (P4, shared/skills/studio/sx-test-view.js) ──
19905
+ One scroll area (the head, the setup, the open run, a trial beside its request, the history) over one foot bar
19906
+ (Run evals, always in sight, as Publish's). Every colour is a token or a --sx-* status variable of the Studio. */
19907
+ .sx-test { flex: 1; min-height: 0; display: flex; flex-direction: column; }
19908
+ .sx-test-scroll { flex: 1; min-height: 0; overflow: auto; padding: 12px 16px 16px; display: grid; gap: 16px; align-content: start; }
19909
+ .sx-test-section { display: grid; gap: 8px; min-width: 0; }
19910
+ .sx-test-section:empty { display: none; }
19911
+ .sx-test-headline { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
19912
+ .sx-test-headline .sx-section-title { display: inline-flex; align-items: center; gap: 6px; }
19913
+ .sx-test-headline .sx-spacer { flex: 1; }
19914
+ .sx-test-queue { font-size: var(--sx-meta); color: var(--sx-info); }
19915
+ .sx .sx-test-safety { display: flex; align-items: flex-start; gap: 6px; }
19916
+ .sx .sx-test-safety > .sx-i { flex: none; margin-top: 2px; }
19917
+ .sx-test-safety-box { display: grid; gap: 2px; }
19918
+ .sx .sx-test-safety--warn > .sx-i { color: var(--sx-warn); }
19919
+ #sx-test-codex-box:empty { display: none; }
19920
+ .sx-test-codex { display: grid; gap: 6px; }
19921
+ .sx .sx-test-codex-line { margin: 0; display: flex; align-items: flex-start; gap: 6px; color: var(--t-bright); }
19922
+ .sx .sx-test-codex-line > .sx-i { flex: none; margin-top: 2px; color: var(--sx-warn); }
19923
+ .sx-test-codex .sx-help { margin: 0; }
19924
+ .sx-test-setup { padding: 12px 14px; border: 1px solid var(--b-light); border-radius: 8px; background: var(--s-subtle); }
19925
+ .sx-test-setup-box { display: grid; gap: 10px; }
19926
+ .sx-test-setup-box[open] > .sx-test-setup-summary { margin-bottom: 8px; }
19927
+ .sx-test-setup-summary { display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px 10px; cursor: pointer; list-style: none; }
19928
+ .sx-test-setup-summary::-webkit-details-marker { display: none; }
19929
+ .sx-test-setup-summary::before { content: '▸'; color: var(--t-secondary); font-size: var(--fs-xs); transition: transform 0.15s ease; }
19930
+ .sx-test-setup-box[open] > .sx-test-setup-summary::before { transform: rotate(90deg); }
19931
+ .sx-test-setup-summary:focus-visible { outline: 2px solid var(--sx-focus); outline-offset: 2px; border-radius: 4px; }
19932
+ .sx .sx-test-setup-line { font-size: var(--fs-xs); min-width: 0; overflow-wrap: anywhere; }
19933
+ .sx-test-setup-box[open] .sx-test-setup-line { display: none; }
19934
+ .sx-test-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 10px 16px; align-items: start; }
19935
+ /* A field of the setup grid never grows past its column: its own content fits it instead. */
19936
+ .sx-test-grid > .sx-field { min-width: 0; grid-template-columns: minmax(0, 1fr); }
19937
+ /* The segment fits its cell in every language: one row, a long label wraps inside its own button (pt-BR "Tarefas e acionamentos"). */
19938
+ .sx .sx-test .sx-seg { display: inline-grid; grid-auto-flow: column; grid-auto-columns: minmax(0, auto); max-width: 100%; }
19939
+ .sx .sx-test .sx-seg button { height: auto; min-height: 26px; min-width: 0; padding: 3px 10px; line-height: 1.25; white-space: normal; overflow-wrap: anywhere; text-align: center; }
19940
+ .sx-test-runtimes { gap: 6px; }
19941
+ .sx-test-runtime { display: flex; align-items: center; gap: 6px; min-width: 0; }
19942
+ .sx-test-runtime .cc-dropdown { flex: 1; min-width: 0; }
19943
+ .sx .sx-test-add { justify-self: start; font-size: var(--fs-xs); }
19944
+ .sx-test-more > summary { margin-top: 2px; }
19945
+ .sx-test-more[open] > .sx-test-grid { margin-top: 8px; }
19946
+ .sx .sx-test-judge { align-self: end; padding-bottom: 6px; }
19947
+ .sx-test-estimate { display: grid; gap: 4px; padding-top: 8px; border-top: 1px solid var(--b-subtle); }
19948
+ .sx .sx-test-estimate-line { margin: 0; display: flex; align-items: flex-start; gap: 6px; font-size: var(--fs-xs); color: var(--t-bright); }
19949
+ .sx .sx-test-estimate-line > .sx-i { flex: none; margin-top: 2px; color: var(--sx-info); }
19950
+ .sx .sx-test-notes { color: var(--t-secondary); }
19951
+ .sx-test-bar {
19952
+ flex: none; position: sticky; bottom: 0; z-index: 2;
19953
+ display: flex; flex-wrap: wrap; align-items: center; gap: 8px 12px;
19954
+ padding: 10px 16px; background: var(--sx-raised); border-top: 1px solid var(--b-light);
19955
+ }
19956
+ .sx .sx-test-bar-text { flex: 1 1 240px; min-width: 0; }
19957
+ .sx-test-run, .sx-test-trial { display: grid; gap: 10px; padding: 12px 14px; border: 1px solid var(--b-light); border-radius: 8px; background: var(--s-subtle); min-width: 0; }
19958
+ .sx-test-trial:focus { outline: none; border-color: var(--b-visible); }
19959
+ .sx-test-run-head { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
19960
+ .sx-test-run-head .sx-spacer { flex: 1; }
19961
+ .sx-test-run-head .sx-section-title:focus { outline: none; }
19962
+ .sx-test-state { display: inline-flex; align-items: center; gap: 6px; font-size: var(--sx-meta); color: var(--t-secondary); }
19963
+ .sx-test-state::before { content: ''; width: 8px; height: 8px; border-radius: 50%; background: var(--t-secondary); }
19964
+ .sx-test-state--done::before { background: var(--sx-ok); }
19965
+ .sx-test-state--failed::before, .sx-test-state--interrupted::before { background: var(--sx-err); }
19966
+ .sx-test-state--cancelled::before, .sx-test-state--stopped::before { background: var(--sx-warn); }
19967
+ .sx-test-state--queued::before, .sx-test-state--preparing::before, .sx-test-state--running::before, .sx-test-state--grading::before { background: var(--sx-info); animation: sx-ai-pulse 1.6s ease-in-out infinite; }
19968
+ .sx-test-spend { white-space: nowrap; }
19969
+ .sx-test-spend.is-over .sx-meter > i { background: var(--sx-warn); }
19970
+ .sx .sx-test-progress-line { margin: 0; font-size: var(--fs-xs); color: var(--t-bright); }
19971
+ .sx-test-live { margin: 0; padding: 0; list-style: none; display: grid; gap: 4px; }
19972
+ .sx-test-live-case { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 8px; font-size: var(--fs-xs); }
19973
+ .sx-test-case-id { font: 500 var(--fs-xs)/1.4 var(--ff-mono, 'JetBrains Mono', monospace); color: var(--t-bright); overflow-wrap: anywhere; }
19974
+ .sx .sx-tag--train, .sx .sx-tag--validation, .sx .sx-tag--test { font-size: var(--sx-meta); padding: 0 6px; }
19975
+ .sx .sx-tag--test { color: var(--sx-gold); border-color: color-mix(in oklab, var(--sx-gold) 40%, transparent); }
19976
+ .sx-test-dots { display: inline-flex; flex-wrap: wrap; gap: 3px; }
19977
+ .sx-test-dot { width: 10px; height: 10px; border-radius: 3px; background: var(--s-medium); border: 1px solid var(--b-light); }
19978
+ .sx-test-dot--running { background: var(--sx-info); animation: sx-ai-pulse 1.6s ease-in-out infinite; }
19979
+ .sx-test-dot--pass { background: var(--sx-ok); border-color: transparent; }
19980
+ .sx-test-dot--partial { background: color-mix(in oklab, var(--sx-ok) 45%, var(--sx-warn)); border-color: transparent; }
19981
+ .sx-test-dot--fail { background: var(--sx-err); border-color: transparent; }
19982
+ .sx-test-dot--error { background: transparent; border-color: var(--sx-err); }
19983
+ .sx-test-dot--skipped { background: transparent; border-style: dashed; }
19984
+ .sx-test-export { display: inline-flex; align-items: center; gap: 6px; }
19985
+ .sx-test-runtime-report { display: grid; gap: 8px; padding-top: 8px; border-top: 1px solid var(--b-subtle); min-width: 0; }
19986
+ .sx-test-runtime-name { margin: 0; font: 600 var(--fs-xs)/1.4 var(--ff-heading); color: var(--t-bright); }
19987
+ .sx-test-stats { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 8px; }
19988
+ .sx-test-stat { display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px 8px; padding: 8px 10px; border: 1px solid var(--b-light); border-radius: 6px; background: var(--sx-field); font-size: var(--fs-xs); }
19989
+ .sx-test-stat-label { flex-basis: 100%; font-size: var(--sx-meta); color: var(--t-secondary); text-transform: none; }
19990
+ .sx-test-stat-value { font: 600 calc(18px * var(--font-scale, 1))/1.2 var(--ff-heading); color: var(--t-bright); }
19991
+ .sx-test-stat-vs { color: var(--t-primary); }
19992
+ .sx-test-delta { font-weight: 600; white-space: nowrap; }
19993
+ .sx-test-delta--up { color: var(--sx-ok); }
19994
+ .sx-test-delta--down { color: var(--sx-err); }
19995
+ .sx-test-delta--flat, .sx-test-delta--none { color: var(--t-secondary); }
19996
+ .sx-test-table { width: 100%; border-collapse: collapse; font-size: var(--fs-xs); }
19997
+ .sx-test-table th, .sx-test-table td { padding: 6px 8px; text-align: left; vertical-align: top; border-bottom: 1px solid var(--b-subtle); }
19998
+ .sx-test-table thead th { font-weight: 500; color: var(--t-secondary); border-bottom-color: var(--b-light); }
19999
+ .sx-test-table tbody th { font-weight: 400; }
20000
+ .sx-test-table tr.is-best td, .sx-test-table tr.is-best th { background: var(--s-light); }
20001
+ .sx-test-desc { max-width: 52ch; overflow-wrap: anywhere; color: var(--t-primary); }
20002
+ .sx-test-pass { display: inline-flex; align-items: center; gap: 4px; white-space: nowrap; }
20003
+ .sx-test-pass--yes { color: var(--sx-ok); }
20004
+ .sx-test-pass--no { color: var(--sx-err); }
20005
+ .sx-test-pass--maybe { color: var(--sx-warn); }
20006
+ .sx-test-optimise { display: grid; gap: 8px; }
20007
+ .sx-test-side { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; }
20008
+ .sx-test-pane { display: grid; gap: 6px; align-content: start; min-width: 0; }
20009
+ .sx-test-pane-title { margin: 0; font: 600 var(--sx-meta)/1.4 var(--ff-heading); color: var(--t-secondary); }
20010
+ .sx .sx-test-pane .sx-pre { max-height: 320px; }
20011
+ .sx .sx-test-files { padding-left: 0; list-style: none; }
20012
+ .sx-test-files .sx-link { font-size: var(--fs-xs); }
20013
+ .sx .sx-test-next .sx-i { transform: scaleX(-1); }
20014
+ .sx-test-assertions { margin: 8px 0 0; padding: 0; list-style: none; display: grid; gap: 6px; }
20015
+ .sx-test-assertion { display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px 8px; font-size: var(--fs-xs); color: var(--t-primary); }
20016
+ .sx-test-assertion-text { color: var(--t-bright); }
20017
+ .sx .sx-test-evidence { flex-basis: 100%; margin: 0; padding-left: 18px; color: var(--t-secondary); overflow-wrap: anywhere; }
20018
+ .sx .sx-test-feedback .sx-field-label { align-items: baseline; }
20019
+ .sx-test-history { margin: 0; padding: 0; list-style: none; display: grid; gap: 2px; }
20020
+ .sx-test-history-row { display: flex; align-items: center; gap: 8px; padding: 0 0 0 8px; border: 1px solid transparent; border-radius: 5px; }
20021
+ .sx-test-history-row.is-on { border-color: var(--b-light); background: var(--s-light); }
20022
+ .sx .sx-test-history-open {
20023
+ flex: 1; min-width: 0; display: flex; flex-wrap: wrap; align-items: center; gap: 4px 10px; padding: 6px 8px;
20024
+ border: 0; border-radius: 5px; background: transparent; color: var(--t-primary); font: inherit; font-size: var(--fs-xs); text-align: left; cursor: pointer;
20025
+ }
20026
+ .sx .sx-test-history-open:hover { background: var(--s-hover); color: var(--t-bright); }
20027
+ .sx .sx-test-history-open:focus-visible { outline: 2px solid var(--sx-focus); outline-offset: 1px; }
20028
+ .sx-test-history-what { min-width: 0; flex: 1 1 200px; color: var(--t-bright); overflow-wrap: anywhere; }
20029
+ .sx-test-history-numbers { font: 500 var(--fs-xs)/1.4 var(--ff-mono, 'JetBrains Mono', monospace); color: var(--t-bright); }
20030
+ .sx-test-comparison { display: grid; gap: 8px; padding-top: 8px; border-top: 1px solid var(--b-subtle); }
20031
+ .sx-test-empty { max-width: 620px; }
20032
+ .sx-test-empty-actions { justify-content: center; }
20033
+ .sx-test-import { width: 100%; text-align: left; }
20034
+ .sx .sx-visually-hidden { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; }
20035
+ @container ss (max-width: 760px) {
20036
+ .sx-test-side { grid-template-columns: minmax(0, 1fr); }
20037
+ .sx-test-stats { grid-template-columns: minmax(0, 1fr); }
19781
20038
  }
19782
-
19783
- .ss-dropdown-item {
19784
- padding: 9px 14px; font-size: 11px; font-weight: 500;
19785
- color: rgba(255,255,255,0.6); cursor: pointer;
19786
- transition: all 0.12s ease;
19787
- white-space: nowrap;
20039
+ @container ss (max-width: 560px) {
20040
+ .sx-test-grid { grid-template-columns: minmax(0, 1fr); }
20041
+ .sx-test-scroll { padding: 12px 12px 16px; }
20042
+ .sx-test-bar { padding: 8px 12px; }
20043
+ .sx .sx-test-bar-text { flex-basis: 100%; }
20044
+ .sx .sx-test-bar .sx-btn--lg { width: 100%; }
20045
+ .sx-test-table thead { display: none; }
20046
+ .sx-test-table, .sx-test-table tbody, .sx-test-table tr, .sx-test-table th, .sx-test-table td { display: block; width: auto; }
20047
+ .sx-test-table tr { padding: 6px 0; border-bottom: 1px solid var(--b-subtle); }
20048
+ .sx-test-table th, .sx-test-table td { border: 0; padding: 2px 0; }
19788
20049
  }
19789
- .ss-dropdown-item:hover {
19790
- background: rgba(148, 163, 184, 0.15);
19791
- color: rgba(148, 163, 184, 0.95);
20050
+ @media (prefers-reduced-motion: reduce) {
20051
+ .sx-test-state::before, .sx-test-dot--running { animation: none; }
20052
+ .sx-test-setup-summary::before { transition: none; }
20053
+ }
20054
+
20055
+ /* ── Narrow windows: fold, never shrink the text ── */
20056
+ @container ss (max-width: 900px) {
20057
+ .sx-rail { --sx-rail: 56px; padding: 8px 6px; }
20058
+ .sx-rail :is(.sx-rail-label, .sx-rail-count, .sx-rail-groups, .sx-rt-name, .sx-rt-state) { display: none; }
20059
+ .sx .sx-rail-item { justify-content: center; padding: 0; }
20060
+ .sx .sx-rt-row { justify-content: center; }
20061
+ .sx-panes { grid-template-columns: 180px minmax(0, 1fr) 260px; }
20062
+ .sx-lib .sx-col-updated { display: none; }
20063
+ }
20064
+ @container ss (max-width: 760px) {
20065
+ .sx-pane-switch { display: inline-flex; }
20066
+ .sx-tiles { grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); }
20067
+ .sx-panes { grid-template-columns: minmax(0, 1fr); }
20068
+ .sx-pane + .sx-pane { border-left: 0; }
20069
+ .sx-edit[data-pane="files"] .sx-pane:not(.sx-pane--files),
20070
+ .sx-edit[data-pane="doc"] .sx-pane:not(.sx-pane--doc),
20071
+ .sx-edit[data-pane="details"] .sx-pane:not(.sx-pane--details) { display: none; }
20072
+ .sx-lib .sx-col-kind { display: none; }
20073
+ .sx-grid .sx-path { max-width: 160px; }
19792
20074
  }
19793
- .ss-dropdown-item.disabled {
19794
- color: rgba(255,255,255,0.25); cursor: default;
19795
- pointer-events: none;
20075
+ @container ss (max-width: 560px) {
20076
+ .sx-body { flex-direction: column; }
20077
+ .sx-rail { --sx-rail: auto; width: auto; flex-direction: row; align-items: center; padding: 4px 8px; border-right: 0; border-bottom: 1px solid var(--b-subtle); overflow-x: auto; overflow-y: hidden; }
20078
+ .sx-rail .sx-rail-list { flex-direction: row; }
20079
+ .sx .sx-rail-item { width: auto; padding: 0 10px; }
20080
+ .sx-rail .sx-rail-item .sx-rail-label, .sx-rail .sx-rail-item .sx-rail-count { display: inline; }
20081
+ .sx-rail-foot { display: none; }
20082
+ .sx-lib thead { display: none; }
20083
+ .sx-lib, .sx-lib tbody, .sx-lib tr, .sx-lib td { display: block; width: auto; }
20084
+ .sx-lib tr { position: relative; margin: 0 12px 8px; padding: 8px 12px; border: 1px solid var(--b-light); border-radius: 8px; }
20085
+ .sx-lib td { border: 0; padding: 2px 0; }
20086
+ .sx-lib .sx-col-check { position: absolute; right: 12px; top: 8px; width: auto; padding: 0; }
20087
+ .sx-lib .sx-col-name { padding-right: 28px; }
20088
+ .sx-desc { white-space: normal; }
20089
+ .sx-search { max-width: none; flex-basis: 100%; }
20090
+ .sx-ws-title .sx-tag { max-width: 100%; }
20091
+ .sx-create { padding: 16px; }
20092
+ .sx-cards { padding: 12px; }
20093
+ .sx-tiles { grid-template-columns: 1fr; }
20094
+ .sx-pub-bar { padding: 8px 12px; }
20095
+ .sx-pub-bar-text { flex-basis: 100%; }
20096
+ .sx .sx-pub-bar .sx-btn--lg { width: 100%; }
20097
+ .sx-pub-scroll { padding: 12px 12px 16px; }
20098
+ .sx-install-actions { margin-left: 0; flex-basis: 100%; }
19796
20099
  }
19797
-
19798
- /* ── Section label ── */
19799
- .ss-section-label {
19800
- font-size: 10px; font-weight: 600; color: var(--t-faint);
19801
- text-transform: uppercase; letter-spacing: 0.5px;
19802
- margin-top: 14px; margin-bottom: 6px;
19803
- padding-bottom: 4px; border-bottom: 1px solid var(--b-subtle);
20100
+ @media (prefers-reduced-motion: reduce) {
20101
+ .skills-studio-panel.sx, .sx .sx-btn, .sx .sx-icon-btn { transition: none; }
20102
+ .skills-studio-panel.sx { transform: none; }
19804
20103
  }
19805
20104
 
19806
- /* ── File tree ── */
19807
- .ss-file-tree { display: flex; flex-direction: column; gap: 1px; }
19808
- .ss-file-item {
19809
- display: flex; align-items: center; gap: 6px;
19810
- padding: 6px 8px; font-size: 11px;
19811
- cursor: pointer; border-radius: var(--r-small);
19812
- transition: all 0.1s ease;
19813
- color: var(--t-secondary);
19814
- }
19815
- .ss-file-item:hover {
19816
- background: rgba(255,255,255,0.05);
19817
- color: var(--t-primary);
19818
- }
19819
- .ss-file-dir:hover { background: rgba(148,163,184,0.08); }
19820
- .ss-file-icon {
19821
- display: flex; align-items: center; justify-content: center;
19822
- width: 16px; height: 16px; flex-shrink: 0;
19823
- color: var(--t-muted); transition: color 0.1s ease;
19824
- }
19825
- .ss-file-icon-svg { display: block; }
19826
- .ss-file-item:hover .ss-file-icon {
19827
- color: rgba(148, 163, 184, 0.7);
19828
- }
19829
- .ss-file-dir:hover .ss-file-icon {
19830
- color: rgba(255, 183, 77, 0.7);
19831
- }
19832
- .ss-file-name {
19833
- flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis;
19834
- white-space: nowrap; font-weight: 400;
19835
- }
19836
- .ss-file-size {
19837
- font-size: 9px; color: var(--t-faint); flex-shrink: 0;
19838
- font-weight: 400; letter-spacing: 0.3px;
19839
- }
19840
- .ss-file-actions { display: none; gap: 3px; flex-shrink: 0; }
19841
- .ss-file-item:hover .ss-file-actions { display: flex; }
19842
- .ss-file-del-btn {
19843
- width: 18px; height: 18px; border-radius: var(--r-small);
19844
- background: none; border: 1px solid transparent;
19845
- color: var(--t-faint); cursor: pointer; font-size: 11px;
19846
- display: flex; align-items: center; justify-content: center;
19847
- transition: all 0.12s ease;
19848
- }
19849
- .ss-file-del-btn:hover {
19850
- background: hsla(0, 70%, 45%, 0.15);
19851
- border-color: hsla(0, 70%, 45%, 0.25);
19852
- color: hsla(0, 70%, 65%, 1);
19853
- }
19854
- .ss-add-file-btn {
19855
- margin-top: 8px; padding: 6px 10px;
19856
- font-size: var(--fs-xs); color: var(--t-muted);
19857
- background: none; border: 1px solid var(--b-light);
19858
- border-radius: var(--r-small); cursor: pointer;
19859
- transition: all 0.15s ease; width: 100%;
19860
- }
19861
- .ss-add-file-btn:hover {
19862
- border-color: rgba(148, 163, 184, 0.4);
19863
- color: rgba(148, 163, 184, 0.7);
19864
- background: rgba(148, 163, 184, 0.05);
19865
- }
20105
+ /* ── Kept from the Studio before 2.0 ──
20106
+ The questions inside the panel (shared/skills/ss-dialog.js), an import's review, the toasts, and the
20107
+ Markdown toolbar the Automation Studio's editor uses (.ss-md-toolbar, .ss-view-toggle). */
19866
20108
 
19867
20109
  /* ── File browser dialog ── */
19868
20110
  .ss-file-dialog-overlay {
@@ -19880,439 +20122,97 @@
19880
20122
  border: 1px solid var(--b-light);
19881
20123
  border-radius: var(--r-base);
19882
20124
  box-shadow: var(--shadow-lg);
19883
- display: flex; flex-direction: column;
19884
- overflow: hidden;
19885
- }
19886
- .ss-fd-body {
19887
- padding: 14px 16px; overflow-y: auto; flex: 1;
19888
- display: flex; flex-direction: column; gap: 10px;
19889
- }
19890
- .ss-fd-section-label {
19891
- font-size: 10px; text-transform: uppercase; letter-spacing: 0.06em;
19892
- color: var(--t-faint); margin-bottom: 4px;
19893
- }
19894
- .ss-fd-dirs {
19895
- display: flex; flex-direction: column; gap: 0;
19896
- max-height: 120px; overflow-y: auto;
19897
- border: 1px solid var(--b-subtle); border-radius: var(--r-small);
19898
- background: rgba(0,0,0,0.12); margin-bottom: 2px;
19899
- }
19900
- .ss-fd-dir {
19901
- display: flex; align-items: center; gap: 6px;
19902
- padding: 5px 8px; cursor: pointer;
19903
- font-size: 11px; color: var(--t-muted);
19904
- transition: background 0.1s;
19905
- }
19906
- .ss-fd-dir:hover { background: rgba(255,255,255,0.04); color: var(--t-secondary); }
19907
- .ss-fd-dir.selected {
19908
- background: rgba(255,255,255,0.06);
19909
- color: var(--t-bright);
19910
- }
19911
- .ss-fd-dir svg { opacity: 0.4; }
19912
- .ss-fd-dir.selected svg { opacity: 0.7; }
19913
- .ss-fd-new-folder-trigger {
19914
- background: none; border: none;
19915
- font-size: 10px; color: var(--t-faint);
19916
- cursor: pointer; padding: 2px 0;
19917
- transition: color 0.15s;
19918
- }
19919
- .ss-fd-new-folder-trigger:hover { color: var(--t-secondary); }
19920
-
19921
- /* ── Inline create row ── */
19922
- .ss-fd-inline-create {
19923
- display: flex; gap: 8px; align-items: stretch;
19924
- }
19925
- .ss-fd-create-btn {
19926
- padding: 0 14px; flex-shrink: 0;
19927
- background: rgba(255,255,255,0.06);
19928
- border: 1px solid rgba(255,255,255,0.1);
19929
- border-radius: var(--r-small);
19930
- color: var(--t-secondary);
19931
- font-size: 11px; font-weight: 500;
19932
- cursor: pointer; transition: all 0.15s ease;
19933
- white-space: nowrap;
19934
- }
19935
- .ss-fd-create-btn:hover {
19936
- background: rgba(255,255,255,0.1);
19937
- border-color: rgba(255,255,255,0.16);
19938
- color: var(--t-bright);
19939
- }
19940
-
19941
- /* ── Or divider ── */
19942
- .ss-fd-or {
19943
- text-align: center; font-size: 10px;
19944
- color: var(--t-faint); letter-spacing: 0.1em;
19945
- text-transform: uppercase;
19946
- }
19947
-
19948
- /* ── Upload link ── */
19949
- .ss-fd-inline-upload { text-align: center; }
19950
- .ss-fd-upload-link {
19951
- background: none; border: none;
19952
- color: var(--t-muted); font-size: 11px;
19953
- cursor: pointer; padding: 4px 0;
19954
- transition: color 0.15s;
19955
- text-decoration: underline;
19956
- text-decoration-color: rgba(255,255,255,0.12);
19957
- text-underline-offset: 3px;
19958
- }
19959
- .ss-fd-upload-link:hover {
19960
- color: var(--t-secondary);
19961
- text-decoration-color: rgba(255,255,255,0.25);
19962
- }
19963
-
19964
- .ss-fd-new-folder {
19965
- display: flex; align-items: center; gap: 4px;
19966
- margin-bottom: 2px;
19967
- }
19968
- .ss-fd-btn {
19969
- background: none; border: 1px solid var(--b-subtle);
19970
- color: var(--t-secondary); font-size: 11px;
19971
- padding: 3px 8px; border-radius: var(--r-small);
19972
- cursor: pointer;
19973
- }
19974
- .ss-fd-btn--ok { border-color: rgba(255,255,255,0.15); color: var(--t-secondary); }
19975
- .ss-fd-btn--ok:hover { border-color: rgba(255,255,255,0.25); color: var(--t-bright); }
19976
- .ss-fd-btn--cancel { border: none; color: var(--t-muted); font-size: 14px; }
19977
- .ss-fd-input {
19978
- font-size: var(--fs-xs) !important;
19979
- padding: 5px 8px !important;
19980
- height: auto !important;
19981
- }
19982
- .ss-fd-filename-row {
19983
- display: flex; align-items: center;
19984
- border: 1px solid var(--b-subtle); border-radius: var(--r-small);
19985
- background: rgba(0,0,0,0.15); overflow: hidden;
19986
- }
19987
- .ss-fd-path-prefix {
19988
- font-size: 11px; color: var(--t-muted);
19989
- padding: 5px 0 5px 8px; white-space: nowrap;
19990
- font-family: var(--ff-mono, monospace);
19991
- }
19992
- .ss-fd-filename-input {
19993
- border: none !important; background: none !important;
19994
- border-radius: 0 !important;
19995
- flex: 1; min-width: 0;
19996
- font-family: var(--ff-mono, monospace) !important;
19997
- }
19998
- .ss-fd-footer {
19999
- display: flex; justify-content: flex-end; gap: 8px;
20000
- padding: 10px 16px;
20001
- border-top: 1px solid var(--b-subtle);
20002
- }
20003
-
20004
- /* ── Tab bar ── */
20005
- .ss-tab-bar {
20006
- display: flex; align-items: stretch; gap: 0;
20007
- padding: 0 4px; background: rgba(0,0,0,0.12);
20008
- border-bottom: 1px solid var(--b-subtle); flex-shrink: 0;
20009
- min-height: 32px; overflow-x: auto; overflow-y: hidden;
20010
- scrollbar-width: none;
20011
- }
20012
- .ss-tab-bar::-webkit-scrollbar { display: none; }
20013
-
20014
- .ss-tab {
20015
- display: flex; align-items: center; gap: 5px;
20016
- padding: 0 12px; height: 32px;
20017
- font-size: 11px; font-weight: 500; color: var(--t-muted);
20018
- cursor: pointer; white-space: nowrap; flex-shrink: 0;
20019
- border-bottom: 2px solid transparent;
20020
- transition: color 0.15s ease, border-color 0.15s ease, background 0.15s ease;
20021
- position: relative;
20022
- }
20023
- .ss-tab:hover { color: var(--t-secondary); background: rgba(255,255,255,0.03); }
20024
- .ss-tab.active {
20025
- color: var(--t-bright);
20026
- border-bottom-color: var(--accent-blue, #94a3b8);
20027
- background: rgba(255,255,255,0.04);
20028
- }
20029
- .ss-tab.dirty .ss-tab-label { font-style: italic; }
20030
-
20031
- .ss-tab-label {
20032
- max-width: 140px; overflow: hidden; text-overflow: ellipsis;
20033
- }
20034
- .ss-tab-dot {
20035
- width: 5px; height: 5px; border-radius: 50%;
20036
- background: var(--accent-blue, #94a3b8);
20037
- flex-shrink: 0;
20038
- animation: ss-tab-dot-in 0.2s ease;
20039
- }
20040
- @keyframes ss-tab-dot-in {
20041
- from { transform: scale(0); opacity: 0; }
20042
- to { transform: scale(1); opacity: 1; }
20043
- }
20044
- .ss-tab-close {
20045
- width: 16px; height: 16px; display: flex; align-items: center; justify-content: center;
20046
- background: none; border: none; color: var(--t-faint); cursor: pointer;
20047
- border-radius: var(--r-small); font-size: 12px; line-height: 1;
20048
- padding: 0; margin-left: 2px; flex-shrink: 0;
20049
- opacity: 0; transition: opacity 0.12s ease, background 0.12s ease, color 0.12s ease;
20050
- }
20051
- .ss-tab:hover .ss-tab-close { opacity: 1; }
20052
- .ss-tab-close:hover { background: rgba(255,80,80,0.2); color: #f87171; }
20053
-
20054
- /* Tab type dot indicator */
20055
- .ss-tab-type-dot {
20056
- width: 6px; height: 6px; border-radius: 50%; flex-shrink: 0;
20057
- }
20058
- .ss-tab-type-dot.skill { background: hsla(210, 18%, 60%, 0.8); }
20059
- .ss-tab-type-dot.command { background: hsla(40, 20%, 56%, 0.8); }
20060
- .ss-tab-type-dot.agent { background: hsla(18, 20%, 56%, 0.8); }
20061
-
20062
- /* Tab type styling */
20063
- .ss-tab.type-skill.active { border-bottom-color: hsla(210, 18%, 60%, 0.8); }
20064
- .ss-tab.type-command.active { border-bottom-color: hsla(40, 20%, 56%, 0.8); }
20065
- .ss-tab.type-agent.active { border-bottom-color: hsla(18, 20%, 56%, 0.8); }
20066
- .ss-tab.subfile .ss-tab-label { font-size: 10px; opacity: 0.85; }
20067
-
20068
- /* ── Wizard ── */
20069
- .ss-wizard {
20070
- flex: 1; display: flex; flex-direction: column;
20071
- padding: 16px 20px; overflow: hidden;
20072
- }
20073
- .ss-wizard-steps {
20074
- display: flex; gap: 0; margin-bottom: 14px; flex-shrink: 0;
20075
- }
20076
- .ss-wizard-step {
20077
- flex: 1; text-align: center; font-size: var(--fs-xs);
20078
- color: var(--t-faint); padding: 6px 4px;
20079
- border-bottom: 2px solid var(--b-subtle);
20080
- transition: all 0.15s ease;
20081
- }
20082
- .ss-wizard-step.active {
20083
- color: hsla(var(--accent-hue, 174), 60%, 70%, 1);
20084
- border-bottom-color: hsla(var(--accent-hue, 174), 60%, 55%, 1);
20085
- }
20086
- .ss-wizard-step.done { color: var(--t-secondary); }
20087
- .ss-wizard-content { flex: 1; overflow-y: auto; overflow-x: hidden; display: flex; flex-direction: column; }
20088
- .ss-wizard-content h3 { margin: 0 0 12px; font-size: var(--fs-base); color: var(--t-bright); }
20089
- .ss-wizard-hint { font-size: var(--fs-xs); color: var(--t-muted); margin: 0 0 10px; flex-shrink: 0; }
20090
- .ss-wizard-nav {
20091
- display: flex; justify-content: space-between; align-items: center;
20092
- padding-top: 12px; border-top: 1px solid var(--b-subtle);
20093
- flex-shrink: 0; margin-top: 12px;
20094
- }
20095
- .ss-wizard-editor { min-height: 0; flex: 1; }
20096
- .ss-wiz-editor-wrap {
20097
- flex: 1; display: flex; flex-direction: column;
20098
- border: 1px solid var(--b-subtle); border-radius: var(--r-small);
20099
- overflow: hidden; min-height: 0;
20100
- }
20101
- .ss-wiz-editor-wrap .ss-md-toolbar { border-radius: 0; }
20102
- .ss-wiz-editor-wrap .ss-md-editor { border-radius: 0; }
20103
- .ss-wizard-preview { flex: 1; min-height: 0; }
20104
-
20105
- /* ── Wizard step 4 layout (editor + preset panel) ── */
20106
- .ss-wiz-step4-hdr {
20107
- display: flex; align-items: center; gap: 8px;
20108
- margin: 0 0 12px; flex-shrink: 0;
20109
- }
20110
- .ss-wiz-step4-hdr h3 { margin: 0; font-size: var(--fs-base); color: var(--t-bright); }
20111
- .ss-wiz-step4-body {
20112
- flex: 1; display: flex; gap: 0; min-height: 0; overflow: hidden;
20113
- }
20114
- .ss-wiz-step4-body .ss-wiz-editor-wrap { flex: 1; min-width: 0; }
20115
-
20116
- /* ── Preset toggle button ── */
20117
- .ss-preset-toggle {
20118
- margin-left: auto; padding: 2px 10px;
20119
- font-size: 10px; font-weight: 500;
20120
- background: none; border: 1px solid var(--b-subtle);
20121
- border-radius: var(--r-small); color: var(--t-muted);
20122
- cursor: pointer; transition: all 0.15s ease;
20123
- text-transform: uppercase; letter-spacing: 0.3px;
20124
- }
20125
- .ss-preset-toggle:hover { color: var(--t-secondary); border-color: var(--b-light); }
20126
- .ss-preset-toggle.active {
20127
- background: hsla(var(--accent-hue, 215), var(--accent-saturation, 16%), 50%, 0.1);
20128
- border-color: hsla(var(--accent-hue, 215), var(--accent-saturation, 16%), var(--accent-lightness, 65%), 0.35);
20129
- color: hsla(var(--accent-hue, 215), var(--accent-saturation, 16%), var(--accent-lightness, 65%), 1);
20130
- }
20131
-
20132
- /* ── Preset side panel ── */
20133
- .ss-preset-panel {
20134
- width: 210px; flex-shrink: 0;
20135
- overflow-y: auto; overflow-x: hidden;
20136
- display: flex; flex-direction: column;
20137
- background: rgba(0,0,0,0.04);
20138
- transition: width 0.2s ease, opacity 0.2s ease;
20139
- }
20140
- .ss-preset-panel.hidden {
20141
- width: 0; opacity: 0; overflow: hidden;
20142
- }
20143
-
20144
- /* ── Preset category accordion ── */
20145
- .ss-preset-cat-hdr {
20146
- display: flex; align-items: center; gap: 4px;
20147
- padding: 6px 8px; cursor: pointer;
20148
- font-size: 10px; font-weight: 600; text-transform: uppercase;
20149
- letter-spacing: 0.4px; color: var(--t-muted);
20150
- border-bottom: 1px solid var(--b-subtle);
20151
- user-select: none; flex-shrink: 0;
20152
- }
20153
- .ss-preset-cat-hdr:hover { color: var(--t-secondary); background: var(--s-hover); }
20154
- .ss-preset-chevron { font-size: 8px; width: 12px; text-align: center; }
20155
- .ss-preset-cat-name { flex: 1; }
20156
- .ss-preset-cat-count {
20157
- font-size: 9px; color: var(--t-faint);
20158
- background: var(--s-subtle); padding: 1px 5px;
20159
- border-radius: var(--r-pill);
20160
- }
20161
- .ss-preset-cat-body {
20162
- display: flex; flex-direction: column; gap: 2px; padding: 4px;
20163
- }
20164
- .ss-preset-category.collapsed .ss-preset-cat-body { display: none; }
20165
-
20166
- /* ── Preset card ── */
20167
- .ss-preset-card {
20168
- padding: 6px 8px; border-radius: var(--r-small);
20169
- border: 1px solid transparent; cursor: grab;
20170
- transition: all 0.15s ease; position: relative;
20171
- }
20172
- .ss-preset-card:hover {
20173
- background: var(--s-hover); border-color: var(--b-subtle);
20174
- }
20175
- .ss-preset-card:active { cursor: grabbing; }
20176
- .ss-preset-card.dragging { opacity: 0.4; }
20177
- .ss-preset-card.ss-preset-inserted {
20178
- background: hsla(var(--accent-hue, 215), var(--accent-saturation, 16%), 50%, 0.12);
20179
- border-color: hsla(var(--accent-hue, 215), var(--accent-saturation, 16%), var(--accent-lightness, 65%), 0.3);
20180
- }
20181
- .ss-preset-card-name {
20182
- font-size: 11px; font-weight: 500; color: var(--t-bright); line-height: 1.3;
20183
- }
20184
- .ss-preset-card-desc {
20185
- font-size: 10px; color: var(--t-faint); line-height: 1.3; margin-top: 1px;
20186
- overflow: hidden; text-overflow: ellipsis;
20187
- display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
20188
- }
20189
- .ss-preset-card-actions {
20190
- position: absolute; top: 4px; right: 4px;
20191
- display: none; gap: 2px;
20192
- }
20193
- .ss-preset-card:hover .ss-preset-card-actions { display: flex; }
20194
-
20195
- /* ── Custom category action buttons (add/import/export) ── */
20196
- .ss-preset-custom-actions {
20197
- display: flex; gap: 3px; margin-left: auto;
20198
- }
20199
- .ss-preset-act-btn {
20200
- width: 22px; height: 22px; display: flex; align-items: center; justify-content: center;
20201
- background: var(--s-subtle); border: 1px solid var(--b-subtle); border-radius: var(--r-small);
20202
- color: var(--t-secondary); cursor: pointer; padding: 0;
20203
- transition: all 0.12s ease;
20204
- }
20205
- .ss-preset-act-btn:hover {
20206
- background: var(--s-hover); color: var(--t-bright); border-color: var(--b-light);
20207
- }
20208
- .ss-preset-act-add {
20209
- color: hsla(var(--accent-hue, 215), var(--accent-saturation, 16%), var(--accent-lightness, 65%), 1);
20210
- }
20211
- .ss-preset-act-add:hover {
20212
- background: hsla(var(--accent-hue, 215), var(--accent-saturation, 16%), var(--accent-lightness, 65%), 0.15);
20213
- border-color: hsla(var(--accent-hue, 215), var(--accent-saturation, 16%), var(--accent-lightness, 65%), 0.4);
20214
- color: var(--t-bright);
20215
- }
20216
-
20217
- /* ── Preset card edit/delete buttons ── */
20218
- .ss-preset-edit-btn,
20219
- .ss-preset-del-btn {
20220
- width: 18px; height: 18px; display: flex; align-items: center; justify-content: center;
20221
- background: none; border: 1px solid transparent; border-radius: var(--r-small);
20222
- color: var(--t-faint); cursor: pointer; font-size: 11px; padding: 0;
20223
- transition: all 0.12s ease;
20224
- }
20225
- .ss-preset-edit-btn:hover,
20226
- .ss-preset-del-btn:hover {
20227
- background: var(--s-hover); color: var(--t-bright); border-color: var(--b-subtle);
20228
- }
20229
-
20230
- /* ── Drag ghost ── */
20231
- .ss-preset-drag-ghost {
20232
- position: absolute; top: -9999px; left: -9999px;
20233
- padding: 4px 10px; border-radius: var(--r-small);
20234
- background: var(--s-panel, rgba(30,30,40,0.95)); border: 1px solid var(--b-light);
20235
- color: var(--t-bright); font-size: 11px; font-weight: 500;
20236
- white-space: nowrap; pointer-events: none; z-index: 99999;
20237
- }
20238
-
20239
- /* ── Drop target highlight ── */
20240
- .ss-md-editor.ss-drop-target {
20241
- outline: 2px dashed hsla(var(--accent-hue, 215), var(--accent-saturation, 16%), var(--accent-lightness, 65%), 0.5);
20242
- outline-offset: -2px;
20243
- background: rgba(0, 0, 0, 0.25);
20244
- }
20245
-
20246
- /* ── Custom preset inline form ── */
20247
- .ss-preset-form { display: flex; flex-direction: column; gap: 4px; padding: 4px; margin-bottom: 4px; }
20248
- .ss-preset-form input,
20249
- .ss-preset-form textarea {
20250
- font-size: 10px; padding: 4px 6px;
20251
- background: rgba(0,0,0,0.15); border: 1px solid var(--b-subtle);
20252
- border-radius: var(--r-small); color: var(--t-bright);
20253
- font-family: inherit; outline: none;
20254
- }
20255
- .ss-preset-form input:focus,
20256
- .ss-preset-form textarea:focus { border-color: var(--b-light); }
20257
- .ss-preset-form textarea {
20258
- min-height: 60px; resize: vertical;
20259
- font-family: 'JetBrains Mono', 'SF Mono', 'Consolas', monospace; font-size: 10px;
20125
+ display: flex; flex-direction: column;
20126
+ overflow: hidden;
20260
20127
  }
20261
- .ss-preset-form-actions { display: flex; gap: 4px; justify-content: flex-end; }
20262
- .ss-preset-form-actions button { padding: 2px 8px; font-size: 10px; }
20263
-
20264
- /* ── Preset empty state ── */
20265
- .ss-preset-empty {
20266
- font-size: 10px; color: var(--t-faint); padding: 8px;
20267
- text-align: center; font-style: italic;
20128
+ /* ── Questions inside the panel (shared/skills/ss-dialog.js) ──
20129
+ Drawn over the panel's content in the file dialog's overlay; a modal alertdialog. */
20130
+ .ss-dlg { width: min(400px, calc(100% - 32px)); padding: 16px 18px; gap: 0; }
20131
+ .ss-dlg--wide { width: min(620px, calc(100% - 32px)); max-height: calc(100% - 40px); }
20132
+ .ss-dlg-title {
20133
+ font-family: var(--ff-heading); font-size: var(--fs-sm); font-weight: 600;
20134
+ color: var(--t-bright); margin-bottom: 8px; overflow-wrap: anywhere;
20135
+ }
20136
+ .ss-dlg-body {
20137
+ font-size: var(--fs-xs); line-height: 1.5; color: var(--t-primary);
20138
+ overflow-y: auto; min-height: 0; flex: 1; overflow-wrap: anywhere;
20139
+ }
20140
+ .ss-dlg-body p { margin: 0 0 6px; }
20141
+ .ss-dlg-actions { display: flex; justify-content: flex-end; flex-wrap: wrap; gap: 8px; margin-top: 14px; }
20142
+ .ss-dlg-btn {
20143
+ padding: 6px 14px; border-radius: var(--r-small);
20144
+ font-size: var(--fs-xs); font-family: inherit; font-weight: 500;
20145
+ background: var(--s-light); color: var(--t-primary);
20146
+ border: 1px solid var(--b-subtle); cursor: pointer;
20147
+ transition: background 0.12s, color 0.12s, border-color 0.12s;
20268
20148
  }
20149
+ .ss-dlg-btn:hover:not(:disabled) { background: var(--s-medium); color: var(--t-bright); }
20150
+ .ss-dlg-btn:focus-visible { outline: 2px solid var(--accent-blue); outline-offset: 1px; }
20151
+ .ss-dlg-btn:disabled { opacity: 0.4; cursor: default; }
20152
+ .ss-dlg-btn--primary { background: var(--s-medium); color: var(--t-bright); border-color: var(--b-light); }
20153
+ .ss-dlg-btn--primary:hover:not(:disabled) { background: var(--s-active); }
20154
+ .ss-dlg-btn--danger { background: var(--accent-red-bg); color: hsla(0, 70%, 72%, 1); border-color: hsla(0, 45%, 45%, 0.25); }
20155
+ .ss-dlg-btn--danger:hover:not(:disabled) { background: var(--accent-red-hover); color: var(--t-bright); }
20156
+ .ss-dlg-form { display: flex; flex-direction: column; gap: 10px; margin-top: 8px; }
20157
+ .ss-dlg-error { margin: 4px 0 0; min-height: 1em; color: hsla(0, 70%, 72%, 1); font-size: var(--fs-xs); }
20158
+ .ss-dlg-error:empty { display: none; }
20159
+
20160
+ /* ── An import's review ── */
20161
+ .ss-review { display: flex; flex-direction: column; gap: 8px; }
20162
+ .ss-review-row { display: flex; gap: 10px; align-items: baseline; }
20163
+ .ss-review-label { flex: 0 0 64px; color: var(--t-secondary); }
20164
+ .ss-review-value { color: var(--t-bright); overflow-wrap: anywhere; }
20165
+ code.ss-review-value, .ss-review-evidence { font-family: var(--ff-mono, monospace); font-size: 11px; }
20166
+ .ss-review-files summary { cursor: pointer; color: var(--t-secondary); }
20167
+ .ss-review-files ul, .ss-review-list, .ss-review-facts { margin: 4px 0 0; padding-left: 18px; }
20168
+ .ss-review-files li, .ss-review-facts li { margin: 2px 0; }
20169
+ .ss-review-section { border-top: 1px solid var(--b-subtle); padding-top: 8px; }
20170
+ .ss-review-head { color: var(--t-bright); font-weight: 600; margin-bottom: 4px; }
20171
+ .ss-review-list { list-style: none; padding-left: 0; display: flex; flex-direction: column; gap: 6px; }
20172
+ .ss-review-item { padding: 6px 8px; border-radius: var(--r-small); background: var(--s-subtle); border-left: 2px solid var(--b-light); }
20173
+ .ss-review-item--critical, .ss-review-item--high { border-left-color: var(--accent-red); }
20174
+ .ss-review-item--medium { border-left-color: var(--accent-orange); }
20175
+ .ss-review-sev { color: var(--t-bright); font-weight: 600; text-transform: capitalize; }
20176
+ .ss-review-where { color: var(--t-secondary); font-family: var(--ff-mono, monospace); font-size: 11px; }
20177
+ .ss-review-evidence { display: block; margin-top: 4px; color: var(--t-primary); white-space: pre-wrap; overflow-wrap: anywhere; }
20178
+ .ss-review-muted { color: var(--t-secondary); }
20179
+ .ss-review-warn { margin: 0; color: var(--accent-orange); }
20180
+ .ss-review-check { display: flex; gap: 8px; align-items: flex-start; color: var(--t-bright); cursor: pointer; }
20181
+ .ss-review-check input { margin-top: 2px; }
20269
20182
 
20270
- /* ── Type cards (wizard step 1) ── */
20271
- .ss-type-cards { display: flex; gap: 12px; }
20272
- .ss-type-card {
20273
- flex: 1; display: flex; flex-direction: column;
20274
- align-items: center; gap: 8px;
20275
- padding: 20px 14px; border: 1px solid var(--b-light);
20276
- border-radius: var(--r-card); cursor: pointer;
20277
- background: var(--s-subtle);
20278
- transition: all 0.15s ease;
20183
+ /* ── Markdown toolbar ── */
20184
+ .ss-md-toolbar {
20185
+ display: flex; align-items: center; gap: 1px;
20186
+ padding: 3px 6px; border-bottom: 1px solid var(--b-subtle);
20187
+ background: rgba(0,0,0,0.08); flex-shrink: 0;
20279
20188
  }
20280
- .ss-type-card:hover { background: var(--s-hover); border-color: var(--b-hover); }
20281
- .ss-type-card.selected {
20282
- background: hsla(var(--accent-hue, 174), 50%, 50%, 0.1);
20283
- border-color: hsla(var(--accent-hue, 174), 50%, 55%, 0.35);
20189
+ .ss-md-toolbar-sep {
20190
+ width: 1px; height: 16px; background: var(--b-subtle); margin: 0 4px;
20284
20191
  }
20285
- .ss-type-card-icon {
20286
- width: 48px; height: 48px; border-radius: 12px;
20287
- display: flex; align-items: center; justify-content: center;
20288
- line-height: 1;
20192
+ .ss-md-tool {
20193
+ width: 26px; height: 24px; display: flex; align-items: center; justify-content: center;
20194
+ background: none; border: 1px solid transparent; border-radius: var(--r-small);
20195
+ color: var(--t-muted); cursor: pointer; font-size: 13px; padding: 0;
20196
+ transition: all 0.12s ease; font-weight: 600;
20289
20197
  }
20290
- .ss-type-card-icon.skill { background: hsla(210, 12%, 50%, 0.08); color: hsla(210, 16%, 65%, 1); }
20291
- .ss-type-card-icon.command { background: hsla(40, 12%, 48%, 0.08); color: hsla(40, 18%, 62%, 1); }
20292
- .ss-type-card-icon.agent { background: hsla(18, 12%, 48%, 0.08); color: hsla(18, 18%, 62%, 1); }
20293
- .ss-type-card-name { font-size: var(--fs-sm); font-weight: 600; color: var(--t-bright); }
20294
- .ss-type-card-desc { font-size: 11px; color: var(--t-muted); text-align: center; line-height: 1.4; }
20295
-
20296
- /* ── Template list (wizard step 2) ── */
20297
- .ss-template-list { display: flex; flex-direction: column; gap: 6px; }
20298
- .ss-template-item {
20299
- padding: 10px 14px; border: 1px solid var(--b-light);
20300
- border-radius: var(--r-card); cursor: pointer;
20301
- background: var(--s-subtle);
20302
- transition: all 0.15s ease;
20198
+ .ss-md-tool:hover { background: var(--s-hover); border-color: var(--b-subtle); color: var(--t-bright); }
20199
+ .ss-md-tool:active { background: var(--s-light); }
20200
+ .ss-md-tool svg { width: 14px; height: 14px; stroke: currentColor; fill: none; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }
20201
+ .ss-md-tool[data-active="true"] { background: var(--s-light); color: var(--t-bright); border-color: var(--b-light); }
20202
+
20203
+ /* ── Preview/Raw toggle in toolbar ── */
20204
+ .ss-view-toggle {
20205
+ display: flex; margin-left: auto; border: 1px solid var(--b-subtle); border-radius: var(--r-small); overflow: hidden;
20303
20206
  }
20304
- .ss-template-item:hover { background: var(--s-hover); }
20305
- .ss-template-item.selected {
20306
- background: hsla(var(--accent-hue, 174), 50%, 50%, 0.1);
20307
- border-color: hsla(var(--accent-hue, 174), 50%, 55%, 0.35);
20207
+ .ss-view-toggle-btn {
20208
+ padding: 2px 10px; font-size: 10px; font-weight: 500;
20209
+ background: none; border: none; color: var(--t-muted);
20210
+ cursor: pointer; transition: all 0.12s ease;
20211
+ text-transform: uppercase; letter-spacing: 0.3px;
20308
20212
  }
20309
- .ss-template-name { font-size: var(--fs-sm); font-weight: 600; color: var(--t-bright); }
20310
- .ss-template-desc { font-size: 11px; color: var(--t-muted); margin-top: 2px; }
20311
-
20312
- /* ── Wizard name preview ── */
20313
- .ss-wiz-name-preview {
20314
- font-size: var(--fs-xs); color: var(--t-faint);
20315
- font-family: 'JetBrains Mono', monospace; margin-top: 2px;
20213
+ .ss-view-toggle-btn:hover { color: var(--t-secondary); }
20214
+ .ss-view-toggle-btn.active {
20215
+ background: var(--s-light); color: var(--t-bright);
20316
20216
  }
20317
20217
 
20318
20218
  /* ── Toast notifications ── */
@@ -20329,36 +20229,6 @@
20329
20229
  .ss-toast--error { border-color: hsla(0, 50%, 45%, 0.4); color: hsla(0, 70%, 70%, 1); }
20330
20230
  .ss-toast--info { border-color: hsla(var(--accent-hue, 174), 50%, 55%, 0.3); }
20331
20231
 
20332
- /* ── Skills Studio responsive (container queries) ── */
20333
- @container ss (max-width: 680px) {
20334
- .ss-welcome { padding: 32px 32px 28px; gap: 12px; }
20335
- .ss-welcome-logo { width: 200px; }
20336
- .ss-welcome-hero h2 { font-size: 1.3rem; }
20337
- .ss-welcome-sub { font-size: 0.7rem; }
20338
- .ss-stat { padding: 10px 20px; }
20339
- .ss-stat-num { font-size: 22px; }
20340
- .ss-stat-label { font-size: 9px; }
20341
- }
20342
- @container ss (max-width: 560px) {
20343
- .ss-welcome { padding: 24px 20px 20px; gap: 10px; }
20344
- .ss-welcome-logo { width: 150px; }
20345
- .ss-welcome-hero h2 { font-size: 1.1rem; }
20346
- .ss-welcome-sub { font-size: 0.65rem; max-width: 280px; }
20347
- .ss-stat { padding: 8px 14px; }
20348
- .ss-stat-num { font-size: 18px; }
20349
- .ss-stat-label { font-size: 8px; letter-spacing: 0.8px; }
20350
- .ss-welcome-hint { font-size: 10px; }
20351
- }
20352
- @container ss (max-width: 440px) {
20353
- .ss-welcome { padding: 16px 14px 14px; gap: 8px; }
20354
- .ss-welcome-logo { width: 110px; }
20355
- .ss-welcome-hero h2 { font-size: 0.95rem; }
20356
- .ss-welcome-sub { font-size: 0.6rem; max-width: 220px; line-height: 1.4; }
20357
- .ss-stat { padding: 6px 10px; }
20358
- .ss-stat-num { font-size: 16px; }
20359
- .ss-stat-label { font-size: 7px; }
20360
- .ss-welcome-hint { font-size: 9px; }
20361
- }
20362
20232
 
20363
20233
  /* ══════════════════════════════════════════════
20364
20234
  AUTOMATION STUDIO PANEL
@@ -22306,55 +22176,6 @@
22306
22176
  color: var(--t-secondary);
22307
22177
  }
22308
22178
 
22309
- /* ── MCP Profile selector (Codex/Gemini) ── */
22310
- .as-launch-mcp-profiles {
22311
- display: flex; flex-wrap: wrap; gap: 4px;
22312
- width: 100%; min-width: 0;
22313
- }
22314
- .as-launch-mcp-loading {
22315
- font-size: 10px; color: var(--t-tertiary); padding: 6px 0;
22316
- }
22317
- .as-launch-mcp-profile {
22318
- flex: 1 1 0; min-width: 0;
22319
- display: flex; flex-direction: column; align-items: center; gap: 2px;
22320
- padding: 7px 6px 6px;
22321
- background: rgba(255,255,255,0.03);
22322
- border: 1px solid rgba(255,255,255,0.06);
22323
- border-radius: 12px;
22324
- cursor: pointer; transition: all 0.18s ease;
22325
- backdrop-filter: blur(6px); -webkit-backdrop-filter: blur(6px);
22326
- overflow: hidden;
22327
- }
22328
- .as-launch-mcp-profile:hover {
22329
- background: rgba(255,255,255,0.06);
22330
- border-color: rgba(255,255,255,0.10);
22331
- }
22332
- .as-launch-mcp-profile.active {
22333
- background: rgba(255,255,255,0.08);
22334
- border-color: rgba(255,255,255,0.14);
22335
- box-shadow: var(--shadow-xs), var(--shadow-highlight);
22336
- }
22337
- .as-launch-mcp-profile.active .as-launch-mcp-profile-name {
22338
- color: hsla(210, 45%, 80%, 0.95);
22339
- }
22340
- .as-launch-mcp-profile.active .as-launch-mcp-profile-tools {
22341
- color: var(--t-secondary);
22342
- }
22343
- .as-launch-mcp-profile-name {
22344
- font-size: 11px; font-weight: 600;
22345
- color: var(--t-secondary);
22346
- transition: color 0.15s;
22347
- max-width: 100%; text-align: center; line-height: 1.2;
22348
- white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
22349
- }
22350
- .as-launch-mcp-profile-tools {
22351
- font-size: 9px; font-weight: 400;
22352
- color: var(--t-faint);
22353
- font-family: var(--ff-mono);
22354
- transition: color 0.15s;
22355
- max-width: 100%; text-align: center; line-height: 1.2;
22356
- white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
22357
- }
22358
22179
 
22359
22180
  /* ── Launch select — scalable dropdown for long model/MCP lists ── */
22360
22181
  .as-launch-select {
@@ -23232,137 +23053,513 @@
23232
23053
  #as-schedules-btn svg { flex-shrink: 0; }
23233
23054
 
23234
23055
  /* ═══════════════════════════════════════════
23235
- SCHEDULES STUDIO - dedicated window
23056
+ SCHEDULES — the dedicated window (ui-schedules-studio.js; what it shows: schedules-view.js)
23057
+ A sibling of Command Runner and Settings: the shared --stg-* roles, native type, a rail of
23058
+ views and groups, grouped inset lists of rows, details on demand, editors in place.
23059
+ Monochrome glass: colour only where it carries meaning (a failed run, a group's dot).
23236
23060
  ═══════════════════════════════════════════ */
23237
23061
 
23238
23062
  .schedules-studio-panel {
23239
23063
  position: fixed; z-index: 300001;
23240
- width: 980px; max-width: 96vw; min-width: 520px;
23241
- height: 620px; max-height: 90vh; min-height: 420px;
23242
- display: flex; flex-direction: column;
23243
- overflow: hidden;
23244
- opacity: 0; transform: scale(0.97);
23245
- transition: opacity 0.15s ease, transform 0.15s ease;
23246
- container-type: inline-size;
23247
- container-name: sched;
23064
+ width: 1040px; height: 720px;
23065
+ max-width: calc(100vw - 16px);
23066
+ max-height: calc(100dvh - var(--navbar-height, 48px) - 16px);
23067
+ min-width: min(360px, calc(100vw - 16px));
23068
+ min-height: min(420px, calc(100dvh - var(--navbar-height, 48px) - 16px));
23069
+ display: flex; flex-direction: column; overflow: hidden;
23070
+ container-type: inline-size; container-name: sched;
23071
+ color: var(--stg-text); font-family: var(--stg-font); font-size: var(--fs-sm); line-height: 1.4;
23072
+ opacity: 0; transform: scale(.97);
23073
+ transition: opacity 150ms ease, transform 150ms ease;
23074
+ --sched-control-h: calc(22px * var(--font-scale, 1));
23075
+ --sched-search-h: calc(30px * var(--font-scale, 1));
23076
+ --sched-control-radius: var(--radius-control, 5px);
23077
+ --sched-group-radius: var(--radius-group, 9px);
23078
+ }
23079
+ body .schedules-studio-panel {
23080
+ --fw-focus: var(--stg-focus);
23081
+ /* Secondary text stays readable over whatever glass the user picked (as in Command Runner). */
23082
+ --stg-help: var(--t-primary);
23248
23083
  }
23249
23084
  .schedules-studio-panel.open { opacity: 1; transform: scale(1); }
23250
-
23251
- .sched-header {
23252
- display: flex; align-items: center; gap: 10px;
23253
- padding: 8px 14px;
23254
- border-bottom: 1px solid rgba(255,255,255,0.06);
23255
- background: linear-gradient(to bottom, rgba(255,255,255,0.025), transparent);
23256
- flex-shrink: 0; user-select: none;
23085
+ .schedules-studio-panel.dragging { transition: none; }
23086
+ .schedules-studio-panel [hidden] { display: none !important; }
23087
+ .schedules-studio-panel :is(button, input):disabled { opacity: .45; cursor: default; }
23088
+ .schedules-studio-panel .sched-sr {
23089
+ position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden;
23090
+ clip-path: inset(50%); white-space: nowrap; border: 0;
23257
23091
  }
23092
+
23093
+ /* The menubar stays usable while Schedules is open: its Schedules button closes the window and its
23094
+ menus open above this window's backdrop, which starts under the bar. */
23095
+ .studio-backdrop.sched-backdrop { top: var(--navbar-height, 48px); }
23096
+ body.schedules-window-open #title-bar { z-index: 300002; }
23097
+
23098
+ /* ── Title bar (the shared floating-window chrome sizes its controls) ── */
23099
+ .sched-header { display: flex; align-items: center; user-select: none; }
23258
23100
  .sched-header-left { display: flex; align-items: center; gap: 8px; flex: 1; min-width: 0; }
23259
- .sched-header-icon {
23260
- width: 24px; height: 24px; display: inline-flex; align-items: center; justify-content: center;
23261
- color: var(--t-secondary);
23262
- }
23263
- .sched-header h3 {
23264
- margin: 0; font-family: var(--ff-heading); font-size: var(--fs-base);
23265
- color: var(--t-bright); font-weight: 600; letter-spacing: 0;
23266
- }
23267
- .sched-count {
23268
- font-size: 10px; color: rgba(255,255,255,0.42);
23269
- background: rgba(255,255,255,0.04); border: 1px solid rgba(255,255,255,0.06);
23270
- border-radius: var(--r-pill); padding: 2px 8px;
23271
- }
23272
- .sched-header-actions { display: flex; align-items: center; gap: 6px; }
23273
- .sched-header-btn,
23274
- .sched-primary,
23275
- .sched-secondary {
23276
- display: inline-flex; align-items: center; justify-content: center; gap: 6px;
23277
- border-radius: 8px; font-size: var(--fs-xs); font-family: inherit; font-weight: 600;
23278
- min-height: 28px; padding: 5px 12px; cursor: pointer; transition: all 0.15s ease;
23279
- letter-spacing: 0;
23280
- }
23281
- .sched-header-btn {
23282
- color: var(--t-secondary); background: transparent; border: 1px solid transparent;
23283
- }
23284
- .sched-header-btn:hover { background: rgba(255,255,255,0.06); color: var(--t-bright); }
23285
- .sched-primary {
23286
- color: var(--t-bright); background: rgba(79,195,247,0.12); border: 1px solid rgba(79,195,247,0.24);
23287
- }
23288
- .sched-primary:hover { background: rgba(79,195,247,0.18); border-color: rgba(79,195,247,0.34); }
23289
- .sched-secondary {
23290
- color: var(--t-secondary); background: rgba(255,255,255,0.035); border: 1px solid rgba(255,255,255,0.08);
23101
+ .sched-header-icon { display: inline-flex; color: var(--stg-help); }
23102
+ .sched-header h3 { margin: 0; white-space: nowrap; }
23103
+ .sched-count { font-size: var(--fs-xs); font-variant-numeric: tabular-nums; color: var(--stg-help); }
23104
+ .sched-close { display: inline-flex; align-items: center; justify-content: center; border: 0; background: transparent; cursor: pointer; }
23105
+ .sched-close svg { width: 14px; height: 14px; }
23106
+
23107
+ .sched-body { position: relative; flex: 1; min-height: 0; display: grid; grid-template-columns: 216px minmax(0, 1fr); }
23108
+
23109
+ /* ── Rail: views, then groups (a group is also a drop target) ── */
23110
+ .sched-rail {
23111
+ display: flex; flex-direction: column; gap: 1px; min-height: 0; overflow-y: auto; overscroll-behavior: contain;
23112
+ padding: 10px 10px 14px; border-right: 1px solid var(--stg-line); background: rgba(0,0,0,0.14);
23113
+ scrollbar-width: thin; scrollbar-color: var(--b-hover) transparent;
23291
23114
  }
23292
- .sched-secondary:hover { background: rgba(255,255,255,0.07); color: var(--t-bright); }
23293
- .sched-close {
23294
- width: 28px; height: 28px; border: 0; background: transparent; color: var(--t-dim);
23295
- border-radius: 8px; cursor: pointer; font-size: 20px; line-height: 1;
23115
+ .sched-nav-item {
23116
+ display: flex; align-items: center; gap: 8px; width: 100%; min-height: 28px; padding: 3px 8px;
23117
+ border: 0; border-radius: 6px; background: transparent; color: var(--stg-text);
23118
+ font-family: var(--stg-font); font-size: var(--fs-sm); line-height: 1.3; text-align: start; cursor: pointer;
23119
+ transition: background-color 150ms ease, box-shadow 150ms ease;
23120
+ }
23121
+ .sched-nav-item:hover { background: rgba(255,255,255,0.06); }
23122
+ .sched-nav-item[aria-current="page"] { background: var(--stg-control-hover); box-shadow: var(--shadow-highlight); }
23123
+ .sched-nav-item.drop-target { background: var(--stg-control-hover); box-shadow: inset 0 0 0 1px var(--b-visible); }
23124
+ .sched-nav-icon { display: inline-flex; align-items: center; justify-content: center; width: 15px; flex-shrink: 0; color: var(--stg-help); }
23125
+ .sched-nav-icon svg { width: 15px; height: 15px; }
23126
+ .sched-nav-label { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
23127
+ .sched-nav-count { flex-shrink: 0; color: var(--stg-help); font-size: var(--fs-xs); font-variant-numeric: tabular-nums; }
23128
+ .sched-nav-count--alert { color: var(--stg-err); }
23129
+ .sched-nav-flag { display: inline-flex; align-items: center; gap: 2px; flex-shrink: 0; color: var(--stg-help); font-size: var(--fs-xs); font-variant-numeric: tabular-nums; }
23130
+ .sched-nav-flag svg { width: 11px; height: 11px; }
23131
+ .sched-nav-flag--alert { color: var(--stg-err); }
23132
+ .sched-rail-sep { flex-shrink: 0; height: 1px; margin: 6px 8px; background: var(--stg-sep); }
23133
+ .sched-rail-head {
23134
+ display: flex; align-items: center; justify-content: space-between; gap: 6px; padding: 12px 2px 4px 8px;
23135
+ color: var(--stg-help); font-size: 11.5px; font-weight: 600; letter-spacing: .02em;
23136
+ }
23137
+ .sched-rail-empty { padding: 4px 8px; color: var(--stg-help); font-size: var(--fs-xs); line-height: 1.45; }
23138
+ .sched-dot {
23139
+ display: inline-block; width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0;
23140
+ background: var(--dot, var(--stg-off)); box-shadow: inset 0 0 0 1px rgba(255,255,255,0.18);
23141
+ }
23142
+
23143
+ /* ── Main: view head, toolbar, list, status line ── */
23144
+ .sched-main { position: relative; display: flex; flex-direction: column; min-width: 0; min-height: 0; --sched-inset: 22px; }
23145
+ /* What each view or editor replaces; the narrow strip above it stays. */
23146
+ .sched-frame { position: relative; display: flex; flex-direction: column; flex: 1; min-width: 0; min-height: 0; }
23147
+ .sched-narrow-nav { display: none; }
23148
+ .sched-view-head {
23149
+ display: flex; align-items: flex-end; justify-content: space-between; flex-wrap: wrap;
23150
+ gap: 10px 16px; padding: 18px var(--sched-inset) 12px; flex-shrink: 0;
23151
+ }
23152
+ .sched-view-titles { flex: 1 1 260px; min-width: 0; }
23153
+ .sched-view-head h2 {
23154
+ display: flex; align-items: center; gap: 8px; margin: 0; min-width: 0;
23155
+ font-family: var(--stg-font); font-size: calc(20px * var(--font-scale, 1)); font-weight: 600;
23156
+ line-height: 1.25; letter-spacing: 0; color: var(--stg-text); overflow-wrap: anywhere;
23157
+ }
23158
+ .sched-view-head h2 .sched-dot { width: 10px; height: 10px; }
23159
+ .sched-view-sub, .sched-view-meta { margin: 3px 0 0; max-width: 76ch; color: var(--stg-help); font-size: var(--fs-xs); line-height: 1.45; }
23160
+ .sched-view-meta { margin-top: 1px; }
23161
+ .sched-view-actions { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; }
23162
+
23163
+ .sched-toolbar { display: flex; align-items: center; gap: 8px; padding: 0 var(--sched-inset) 10px; flex-shrink: 0; }
23164
+ .sched-search {
23165
+ display: flex; align-items: center; gap: 8px; flex: 1; min-width: 0; height: var(--sched-search-h);
23166
+ padding: 0 4px 0 10px; border: 1px solid var(--stg-field-line); border-radius: var(--sched-group-radius);
23167
+ background: var(--stg-control); color: var(--stg-help);
23168
+ }
23169
+ .sched-search > svg { width: 14px; height: 14px; flex-shrink: 0; }
23170
+ .sched-search:has(input:focus-visible) { outline: 2px solid var(--stg-focus); outline-offset: 2px; }
23171
+ body .schedules-studio-panel #sched-search:focus-visible { outline: none; }
23172
+ .sched-search input {
23173
+ flex: 1; min-width: 0; height: 100%; padding: 0; border: 0; background: transparent; outline: 0;
23174
+ color: var(--stg-text); font-family: var(--stg-font); font-size: var(--fs-sm);
23296
23175
  }
23297
- .sched-close:hover { background: rgba(255,255,255,0.06); color: var(--t-bright); }
23176
+ .sched-search input::placeholder { color: var(--stg-help); opacity: 1; }
23177
+ .sched-search input::-webkit-search-cancel-button { display: none; }
23178
+ .sched-search kbd { flex-shrink: 0; padding-inline-end: 6px; font-family: var(--stg-mono); font-size: var(--fs-xs); color: var(--stg-help); }
23298
23179
 
23299
- .sched-body { display: flex; flex: 1; min-height: 0; }
23300
- .sched-sidebar {
23301
- width: 230px; flex-shrink: 0; border-right: 1px solid rgba(255,255,255,0.06);
23302
- padding: 14px 12px; display: flex; flex-direction: column; gap: 8px;
23303
- background: rgba(255,255,255,0.015); overflow-y: auto;
23180
+ .sched-list {
23181
+ position: relative; flex: 1; min-height: 0; overflow-y: auto; overscroll-behavior: contain;
23182
+ padding: 2px var(--sched-inset) 24px; scrollbar-gutter: stable;
23183
+ scrollbar-width: thin; scrollbar-color: var(--b-hover) transparent;
23304
23184
  }
23305
- .sched-sidebar-summary {
23306
- display: grid; grid-template-columns: 1fr 1fr; gap: 6px; margin-bottom: 6px;
23185
+ .sched-list:focus { outline: none; }
23186
+ .sched-footer {
23187
+ display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 4px 12px;
23188
+ padding: 7px var(--sched-inset); border-top: 1px solid var(--stg-line); flex-shrink: 0;
23189
+ color: var(--stg-help); font-size: var(--fs-xs); line-height: 1.45;
23307
23190
  }
23308
- .sched-sidebar-summary div {
23309
- border: 1px solid rgba(255,255,255,0.07); border-radius: 8px;
23310
- background: rgba(255,255,255,0.03); padding: 8px;
23191
+ .sched-footer-hint { display: inline-flex; align-items: center; gap: 6px; }
23192
+ .sched-footer-hint svg { width: 12px; height: 12px; }
23193
+
23194
+ /* ── Controls: the Settings push button, popup, field and switch ── */
23195
+ .sched-btn {
23196
+ display: inline-flex; align-items: center; justify-content: center; gap: 4px; flex-shrink: 0;
23197
+ min-height: var(--sched-control-h); max-width: 100%; padding: 2px 10px;
23198
+ border: 1px solid var(--stg-field-line); border-radius: var(--sched-control-radius); box-shadow: none;
23199
+ background: var(--stg-control); color: var(--stg-text); cursor: pointer;
23200
+ font-family: var(--stg-font); font-size: var(--fs-xs); font-weight: 500; line-height: 1.2; white-space: nowrap;
23201
+ transition: background-color 150ms ease, color 150ms ease;
23311
23202
  }
23312
- .sched-sidebar-summary span { display: block; color: var(--t-bright); font-size: 18px; font-weight: 700; }
23313
- .sched-sidebar-summary label { display: block; color: var(--t-muted); font-size: 10px; margin-top: 2px; }
23314
- .sched-sidebar-label {
23315
- margin: 8px 4px 2px; color: var(--t-muted); font-size: 10px; font-weight: 700;
23316
- text-transform: uppercase; letter-spacing: 0.08em;
23203
+ .sched-btn svg { width: 12px; height: 12px; flex-shrink: 0; }
23204
+ .sched-btn:hover:not(:disabled) { background: var(--stg-control-hover); }
23205
+ .sched-btn--primary { color: #fff; background: var(--stg-accent-fill); border-color: transparent; }
23206
+ .sched-btn--primary:hover:not(:disabled) { background: var(--stg-accent-fill-hover); }
23207
+ .sched-btn--text { color: var(--stg-link); background: transparent; border-color: transparent; padding-inline: 4px; font-weight: 400; }
23208
+ .sched-btn--text:hover:not(:disabled) { color: var(--accent-blue); background: transparent; }
23209
+ .sched-btn--danger:hover:not(:disabled) { color: var(--stg-err); }
23210
+ .sched-icon-btn {
23211
+ display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0;
23212
+ width: var(--sched-control-h); height: var(--sched-control-h); padding: 0; border: 0;
23213
+ border-radius: var(--sched-control-radius); background: transparent; color: var(--stg-help); cursor: pointer;
23214
+ transition: background-color 150ms ease, color 150ms ease;
23317
23215
  }
23318
- .sched-group-list { display: flex; flex-direction: column; gap: 4px; }
23319
- .sched-group-row {
23320
- display: flex; align-items: center; gap: 8px; width: 100%; min-height: 34px;
23321
- background: transparent; border: 1px solid transparent; border-radius: 8px;
23322
- color: var(--t-secondary); cursor: pointer; padding: 6px 8px; text-align: left;
23323
- font-family: inherit; transition: all 0.15s ease;
23216
+ .sched-icon-btn svg { width: 12px; height: 12px; }
23217
+ .sched-icon-btn:hover:not(:disabled) { color: var(--stg-text); background: var(--stg-control-hover); }
23218
+ .sched-icon-btn--danger:hover:not(:disabled) { color: var(--stg-err); }
23219
+ /* Popups: the app's custom dropdown (cc-dropdown.js), drawn as Settings draws it (settings-redesign:
23220
+ elegance): a 22px popup button with the up-down chevron, an opaque menu, the selected choice in
23221
+ 600, the highlighted one on the accent fill. The script places an open menu `fixed` against its
23222
+ trigger, so the scrolling panes never cut it off. */
23223
+ .schedules-studio-panel .cc-dropdown { display: inline-flex; min-width: 110px; max-width: 100%; vertical-align: middle; }
23224
+ .schedules-studio-panel .cc-dropdown-trigger {
23225
+ width: 100%; min-width: 0; height: var(--sched-control-h); padding: 0 7px 0 9px; gap: 6px;
23226
+ border: 1px solid var(--stg-field-line); border-radius: var(--sched-control-radius); box-shadow: none;
23227
+ color: var(--stg-text); background: var(--stg-control);
23228
+ font-family: var(--stg-font); font-size: var(--fs-xs); line-height: calc(20px * var(--font-scale, 1)); letter-spacing: 0;
23229
+ }
23230
+ .schedules-studio-panel .cc-dropdown-trigger:hover:not(:disabled),
23231
+ .schedules-studio-panel .cc-dropdown.open .cc-dropdown-trigger { background: var(--stg-control-hover); border-color: var(--stg-field-line); color: var(--stg-text); }
23232
+ .schedules-studio-panel .cc-dropdown-trigger[aria-invalid="true"] { border-color: var(--stg-err); }
23233
+ .schedules-studio-panel .cc-dropdown-value { min-width: 0; text-align: left; } /* a long choice ends in an ellipsis */
23234
+ .schedules-studio-panel .cc-dropdown-arrow { display: none; }
23235
+ .schedules-studio-panel .cc-dropdown-trigger::after {
23236
+ content: ''; flex-shrink: 0; width: 7px; height: 10px; background: var(--stg-help);
23237
+ -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 12'%3E%3Cpath d='M1.2 4.4 4 1.6l2.8 2.8M1.2 7.6 4 10.4l2.8-2.8' fill='none' stroke='%23000' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") center / contain no-repeat;
23238
+ mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 12'%3E%3Cpath d='M1.2 4.4 4 1.6l2.8 2.8M1.2 7.6 4 10.4l2.8-2.8' fill='none' stroke='%23000' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") center / contain no-repeat;
23324
23239
  }
23325
- .sched-group-row:hover,
23326
- .sched-group-row.drop-target { background: rgba(255,255,255,0.045); border-color: rgba(255,255,255,0.08); }
23327
- .sched-group-row.active {
23328
- background: rgba(255,255,255,0.07); border-color: rgba(255,255,255,0.12); color: var(--t-bright);
23240
+ .schedules-studio-panel .cc-dropdown-menu {
23241
+ z-index: 20; overflow-y: auto; overscroll-behavior: contain;
23242
+ padding: 5px; background: rgb(40,40,44); border: 1px solid rgba(255,255,255,0.12); border-radius: 8px;
23243
+ box-shadow: 0 12px 32px rgba(0,0,0,0.5);
23329
23244
  }
23330
- .sched-group-color {
23331
- width: 9px; height: 9px; border-radius: 50%; flex-shrink: 0;
23332
- box-shadow: 0 0 0 1px rgba(255,255,255,0.12);
23245
+ .schedules-studio-panel .cc-dropdown-item {
23246
+ padding: 3px 9px; border-radius: 5px; color: var(--stg-text); font-family: var(--stg-font); font-size: var(--fs-xs);
23247
+ white-space: nowrap; overflow: hidden; text-overflow: ellipsis; transition: none;
23248
+ }
23249
+ .schedules-studio-panel .cc-dropdown-item:hover { background: none; color: var(--stg-text); }
23250
+ .schedules-studio-panel .cc-dropdown-item.active { background: none; color: var(--stg-text); font-weight: 600; }
23251
+ .schedules-studio-panel .cc-dropdown-item.highlight { background: var(--stg-accent-fill); color: #fff; }
23252
+ .schedules-studio-panel .cc-dropdown-item[aria-disabled="true"] { opacity: .45; cursor: default; background: none; color: var(--stg-text); }
23253
+ .schedules-studio-panel .cc-dropdown-group { padding: 4px 9px 2px; color: var(--stg-help); font-size: var(--fs-xs); font-weight: 600; }
23254
+ .schedules-studio-panel .cc-dropdown-optgroup + .cc-dropdown-optgroup { margin-top: 4px; }
23255
+ .sched-input {
23256
+ width: 100%; min-width: 0; height: var(--sched-control-h); padding: 0 8px;
23257
+ border: 1px solid var(--stg-field-line); border-radius: var(--sched-control-radius);
23258
+ background: var(--stg-field-bg); color: var(--stg-text); color-scheme: dark;
23259
+ font-family: var(--stg-font); font-size: var(--fs-xs); line-height: calc(20px * var(--font-scale, 1));
23333
23260
  }
23334
- .sched-group-color.large { width: 14px; height: 14px; }
23335
- .sched-group-icon { width: 16px; display: inline-flex; color: var(--t-muted); }
23336
- .sched-group-name { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
23337
- .sched-group-count {
23338
- font-size: 10px; color: var(--t-muted); background: rgba(255,255,255,0.045);
23339
- border-radius: var(--r-pill); padding: 1px 6px;
23261
+ .sched-input::placeholder { color: var(--stg-help); }
23262
+ .sched-input[aria-invalid="true"] { border-color: var(--stg-err); }
23263
+ .sched-input[type="number"] { width: 72px; flex: 0 0 auto; text-align: right; font-family: var(--stg-mono); }
23264
+ .sched-input[type="color"] { width: 44px; flex: 0 0 auto; padding: 2px; cursor: pointer; }
23265
+ .sched-mono { font-family: var(--stg-mono); }
23266
+ /* Day themes: prose that may span lines (Settings multiline field, system font). */
23267
+ .sched-textarea { height: auto; min-height: calc(44px * var(--font-scale, 1)); padding: 4px 8px; line-height: 1.45; resize: vertical; white-space: pre-wrap; }
23268
+
23269
+ /* The switch: a 26×15 Settings capsule. A row's is a button (role="switch"), a form's a checkbox. */
23270
+ .sched-switch, .sched-toggle-track {
23271
+ position: relative; display: inline-block; flex-shrink: 0; width: 26px; height: 15px; padding: 0;
23272
+ border: 0; border-radius: 999px; background: rgba(255,255,255,0.16); box-shadow: inset 0 0 0 1px rgba(255,255,255,0.22);
23273
+ transition: background-color 150ms ease;
23274
+ }
23275
+ .sched-switch { cursor: pointer; }
23276
+ .sched-switch::before { content: ''; position: absolute; inset: -5px -4px; }
23277
+ .sched-switch::after, .sched-toggle-track::after {
23278
+ content: ''; position: absolute; top: 1px; left: 1px; width: 13px; height: 13px; border-radius: 50%;
23279
+ background: #e8e8ea; box-shadow: 0 1px 2px rgba(0,0,0,0.35); transition: transform 150ms ease;
23280
+ }
23281
+ .sched-switch[aria-checked="true"], .sched-toggle input:checked + .sched-toggle-track { background: var(--stg-accent-fill); box-shadow: none; }
23282
+ .sched-switch[aria-checked="true"]::after, .sched-toggle input:checked + .sched-toggle-track::after { transform: translateX(11px); background: #fff; }
23283
+ .sched-switch[aria-busy="true"] { opacity: .6; cursor: progress; }
23284
+ body .schedules-studio-panel .sched-switch:focus-visible { outline-offset: 3px; border-radius: 999px; }
23285
+ .sched-toggle { position: relative; display: inline-flex; align-items: center; flex-shrink: 0; padding: 4px 0; cursor: pointer; }
23286
+ .sched-toggle input { position: absolute; inset: 0; width: 100%; height: 100%; margin: 0; opacity: 0; cursor: pointer; }
23287
+ .sched-toggle input:focus-visible + .sched-toggle-track { outline: 2px solid var(--stg-focus); outline-offset: 3px; }
23288
+
23289
+ /* ── Grouped inset lists ── */
23290
+ .sched-section + .sched-section { margin-top: 16px; }
23291
+ .sched-section-title {
23292
+ display: flex; align-items: baseline; gap: 8px; margin: 0 0 6px; padding: 0 4px;
23293
+ font-family: var(--stg-font); font-size: var(--fs-xs); font-weight: 600; color: var(--stg-help);
23294
+ }
23295
+ .sched-box { min-width: 0; background: var(--stg-group); border: 1px solid var(--stg-line); border-radius: var(--sched-group-radius); }
23296
+ .sched-box + .sched-box { margin-top: 8px; }
23297
+ .sched-group-head { display: flex; align-items: center; gap: 8px; min-height: 36px; padding: 4px 8px 4px 12px; border-radius: var(--sched-group-radius); }
23298
+ .sched-group-head.drop-target { background: var(--stg-control); box-shadow: inset 0 0 0 1px var(--b-visible); }
23299
+ .sched-group-toggle {
23300
+ display: flex; align-items: center; gap: 8px; flex: 1; min-width: 0; min-height: var(--sched-control-h);
23301
+ padding: 0; border: 0; border-radius: var(--sched-control-radius); background: transparent;
23302
+ color: var(--stg-text); font-family: var(--stg-font); text-align: start; cursor: pointer;
23303
+ }
23304
+ .sched-group-chevron { display: inline-flex; color: var(--stg-help); transform: rotate(90deg); transition: transform 150ms ease; }
23305
+ .sched-group-chevron svg { width: 10px; height: 10px; }
23306
+ .sched-box.is-collapsed .sched-group-chevron { transform: rotate(0deg); }
23307
+ .sched-group-name { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: var(--fs-sm); font-weight: 600; line-height: 1.35; }
23308
+ .sched-group-count { color: var(--stg-help); font-size: var(--fs-xs); font-variant-numeric: tabular-nums; }
23309
+ .sched-group-meta { display: flex; align-items: center; justify-content: flex-end; gap: 6px; min-width: 0; color: var(--stg-help); font-size: var(--fs-xs); white-space: nowrap; overflow: hidden; }
23310
+ .sched-group-meta svg { width: 11px; height: 11px; flex-shrink: 0; }
23311
+ .sched-group-meta .is-alert { color: var(--stg-err); }
23312
+ .sched-rows { list-style: none; margin: 0; padding: 0; }
23313
+ .sched-group-head + .sched-rows { border-top: 1px solid var(--stg-sep); }
23314
+
23315
+ /* ── A schedule: switch · name and cadence · next run · last run ── */
23316
+ .sched-row { position: relative; }
23317
+ .sched-row + .sched-row::before {
23318
+ content: ''; position: absolute; top: 0; left: 50px; right: 12px; height: 1px; background: var(--stg-sep);
23319
+ }
23320
+ .sched-row-line {
23321
+ display: grid; grid-template-columns: 30px minmax(0, 1fr) minmax(0, 8.5em) minmax(0, 11em) 10px;
23322
+ grid-template-areas: "switch main next last chev";
23323
+ align-items: center; column-gap: 12px; min-height: 46px; padding: 6px 12px 6px 10px;
23324
+ cursor: pointer; transition: background-color 120ms ease;
23325
+ }
23326
+ .sched-row:first-child > .sched-row-line { border-radius: var(--sched-group-radius) var(--sched-group-radius) 0 0; }
23327
+ .sched-row:last-child > .sched-row-line { border-radius: 0 0 var(--sched-group-radius) var(--sched-group-radius); }
23328
+ .sched-row:only-child > .sched-row-line { border-radius: var(--sched-group-radius); }
23329
+ .sched-group-head + .sched-rows .sched-row:first-child > .sched-row-line { border-radius: 0; }
23330
+ .sched-row-line:hover { background: rgba(255,255,255,0.025); }
23331
+ .sched-row.is-open > .sched-row-line { background: rgba(255,255,255,0.04); }
23332
+ .sched-row.is-dragging { opacity: .45; }
23333
+ .sched-switch-cell { grid-area: switch; display: flex; justify-content: center; }
23334
+ .sched-row-toggle {
23335
+ grid-area: main; display: flex; flex-direction: column; align-items: flex-start; gap: 1px; min-width: 0;
23336
+ padding: 2px 0; border: 0; border-radius: var(--sched-control-radius); background: transparent;
23337
+ color: inherit; font-family: var(--stg-font); text-align: start; cursor: pointer;
23338
+ }
23339
+ .sched-row-name {
23340
+ max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
23341
+ font-size: var(--fs-sm); font-weight: 500; line-height: 1.35; color: var(--stg-text);
23342
+ }
23343
+ .sched-row.is-paused .sched-row-name { color: var(--stg-body); }
23344
+ .sched-row-sub {
23345
+ display: flex; align-items: center; gap: 6px; max-width: 100%; min-width: 0;
23346
+ font-size: var(--fs-xs); line-height: 1.4; color: var(--stg-help); white-space: nowrap;
23347
+ }
23348
+ .sched-row-sub > span { min-width: 0; overflow: hidden; text-overflow: ellipsis; }
23349
+ .sched-row-sub > .sched-row-group { display: inline-flex; align-items: center; gap: 5px; flex-shrink: 1; }
23350
+ .sched-row-reason {
23351
+ max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
23352
+ font-size: var(--fs-xs); line-height: 1.4; color: var(--stg-body);
23353
+ }
23354
+ .sched-next, .sched-last {
23355
+ display: flex; flex-direction: column; min-width: 0; font-size: var(--fs-xs); line-height: 1.4; font-variant-numeric: tabular-nums;
23356
+ }
23357
+ .sched-next { grid-area: next; }
23358
+ .sched-last { grid-area: last; }
23359
+ .sched-next-rel { color: var(--stg-text); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
23360
+ .sched-next-abs, .sched-last-ago { color: var(--stg-help); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
23361
+ .sched-next:is([data-state="paused"], [data-state="none"]) .sched-next-rel { color: var(--stg-help); }
23362
+ .sched-next[data-state="overdue"] .sched-next-rel { color: var(--stg-warn); }
23363
+ .sched-last-word { display: inline-flex; align-items: center; gap: 5px; min-width: 0; color: var(--stg-body); white-space: nowrap; }
23364
+ .sched-last-word > span { overflow: hidden; text-overflow: ellipsis; }
23365
+ .sched-last-word svg { width: 12px; height: 12px; flex-shrink: 0; color: var(--stg-help); }
23366
+ .sched-last[data-kind="failed"] .sched-last-word,
23367
+ .sched-last[data-kind="failed"] .sched-last-word svg { color: var(--stg-err); }
23368
+ .sched-last[data-kind="interrupted"] .sched-last-word svg { color: var(--stg-warn); }
23369
+ .sched-last:is([data-kind="never"], [data-kind="stopped"]) .sched-last-word { color: var(--stg-help); }
23370
+ .sched-row-chevron { grid-area: chev; display: inline-flex; color: var(--stg-help); transition: transform 150ms ease; }
23371
+ .sched-row-chevron svg { width: 10px; height: 10px; }
23372
+ .sched-row.is-open .sched-row-chevron { transform: rotate(90deg); }
23373
+
23374
+ /* ── Row details: what it runs and with what, then its actions ── */
23375
+ .sched-detail { padding: 2px 14px 12px 52px; }
23376
+ .sched-detail-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 6px 32px; }
23377
+ .sched-facts { display: grid; grid-template-columns: max-content minmax(0, 1fr); align-content: start; column-gap: 14px; row-gap: 3px; margin: 0; }
23378
+ .sched-fact { display: contents; }
23379
+ .sched-facts-block { min-width: 0; }
23380
+ .sched-facts-title { margin: 6px 0 4px; font-family: var(--stg-font); font-size: var(--fs-xs); font-weight: 600; line-height: 1.4; color: var(--stg-help); }
23381
+ .sched-facts dt { color: var(--stg-help); font-size: var(--fs-xs); line-height: 1.5; }
23382
+ .sched-facts dd { min-width: 0; margin: 0; color: var(--stg-body); font-size: var(--fs-xs); line-height: 1.5; overflow-wrap: anywhere; }
23383
+ .sched-facts dd.sched-mono { font-size: calc(11.5px * var(--font-scale, 1)); }
23384
+ .sched-facts .is-failed { color: var(--stg-err); }
23385
+ .sched-source { color: var(--stg-help); }
23386
+ .sched-detail-bar { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; margin-top: 12px; padding-top: 10px; border-top: 1px solid var(--stg-sep); }
23387
+ .sched-detail-group { display: inline-flex; align-items: center; gap: 8px; color: var(--stg-help); font-size: var(--fs-xs); }
23388
+ .sched-detail-spacer { flex: 1 1 0; }
23389
+
23390
+ /* ── Empty, loading and error states ── */
23391
+ .sched-empty {
23392
+ display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 6px;
23393
+ min-height: 220px; padding: 24px 12px; text-align: center;
23394
+ }
23395
+ .sched-empty-icon { display: grid; place-items: center; width: 32px; height: 32px; color: var(--stg-help); }
23396
+ .sched-empty-icon svg { width: 22px; height: 22px; }
23397
+ .sched-empty h3 { margin: 0; font-family: var(--stg-font); font-size: var(--fs-base); font-weight: 600; line-height: 1.3; color: var(--stg-text); }
23398
+ .sched-empty p { margin: 0 0 8px; max-width: 46ch; color: var(--stg-help); font-size: var(--fs-xs); line-height: 1.45; }
23399
+ .sched-empty-actions { display: flex; flex-wrap: wrap; justify-content: center; gap: 8px; }
23400
+ /* A load that failed while an earlier copy shows: one line above it, with a way to load again. */
23401
+ .sched-load-note {
23402
+ display: flex; align-items: center; flex-wrap: wrap; gap: 6px 10px; flex-shrink: 0;
23403
+ margin: 0 var(--sched-inset) 10px; padding: 5px 6px 5px 10px;
23404
+ border: 1px solid var(--stg-line); border-radius: var(--sched-group-radius); background: var(--stg-group);
23405
+ color: var(--stg-body); font-size: var(--fs-xs); line-height: 1.45;
23406
+ }
23407
+ .sched-load-note:empty { display: none; }
23408
+ .sched-load-note > svg { width: 12px; height: 12px; flex-shrink: 0; color: var(--stg-warn); }
23409
+ .sched-load-note--ok > svg { color: var(--stg-ok); }
23410
+ .sched-load-note--busy > svg { color: var(--stg-help); }
23411
+ .sched-load-note > span { flex: 1 1 240px; min-width: 0; }
23412
+ #sched-active-timers .sched-load-note { margin: 0 0 8px; }
23413
+
23414
+ /* ── Editors (schedule, group) and the Timers forms: Settings grouped rows ── */
23415
+ .sched-editor { display: flex; flex-direction: column; flex: 1; min-height: 0; }
23416
+ .sched-editor-head { display: flex; align-items: center; gap: 10px; padding: 14px var(--sched-inset) 10px 14px; flex-shrink: 0; }
23417
+ .sched-editor-head h2 {
23418
+ margin: 0; font-family: var(--stg-font); font-size: calc(20px * var(--font-scale, 1)); font-weight: 600;
23419
+ line-height: 1.25; letter-spacing: 0; color: var(--stg-text); overflow-wrap: anywhere;
23420
+ }
23421
+ .sched-editor-head p { margin: 2px 0 0; color: var(--stg-help); font-size: var(--fs-xs); line-height: 1.45; overflow-wrap: anywhere; }
23422
+ .sched-editor-titles { min-width: 0; }
23423
+ .sched-editor-body {
23424
+ flex: 1; min-height: 0; overflow-y: auto; overscroll-behavior: contain; padding: 4px var(--sched-inset) 24px;
23425
+ scrollbar-gutter: stable; scrollbar-width: thin; scrollbar-color: var(--b-hover) transparent;
23340
23426
  }
23341
- .sched-sidebar-new {
23342
- display: inline-flex; align-items: center; justify-content: center; gap: 6px;
23343
- border: 1px solid rgba(255,255,255,0.08); border-radius: 8px; background: rgba(255,255,255,0.035);
23344
- color: var(--t-secondary); min-height: 32px; cursor: pointer; font-family: inherit;
23345
- margin-top: 6px;
23427
+ .sched-editor-actions {
23428
+ display: flex; align-items: center; justify-content: flex-end; flex-wrap: wrap; gap: 8px;
23429
+ padding: 10px var(--sched-inset); border-top: 1px solid var(--stg-line); flex-shrink: 0;
23430
+ }
23431
+ .sched-form { max-width: 760px; }
23432
+ .sched-form-section + .sched-form-section { margin-top: 18px; }
23433
+ .sched-form-title {
23434
+ display: flex; align-items: baseline; gap: 8px; margin: 0 0 6px; padding: 0 4px;
23435
+ font-family: var(--stg-font); font-size: var(--fs-sm); font-weight: 600; line-height: 1.35; color: var(--stg-text);
23436
+ }
23437
+ .sched-form-title small { color: var(--stg-help); font-size: var(--fs-xs); font-weight: 400; }
23438
+ .sched-form-intro { margin: -2px 0 8px; padding: 0 4px; max-width: 72ch; color: var(--stg-help); font-size: var(--fs-xs); line-height: 1.45; }
23439
+ .sched-form-group { padding: 0 var(--stg-row-x); background: var(--stg-group); border: 1px solid var(--stg-line); border-radius: var(--sched-group-radius); }
23440
+ .sched-form-row {
23441
+ display: grid; grid-template-columns: minmax(0, 168px) minmax(0, 1fr); align-items: center;
23442
+ gap: 6px 14px; min-height: 38px; padding: var(--stg-row-y) 0;
23443
+ }
23444
+ .sched-form-row + .sched-form-row { border-top: 1px solid var(--stg-sep); }
23445
+ .sched-form-row--top { align-items: start; }
23446
+ .sched-form-row--switch { grid-template-columns: minmax(0, 1fr) auto; }
23447
+ .sched-form-row--switch .sched-help { max-width: 60ch; }
23448
+ .sched-form-label { color: var(--stg-text); font-size: var(--fs-sm); line-height: 1.4; overflow-wrap: anywhere; }
23449
+ .sched-form-row--top > .sched-form-label { padding-top: 2px; }
23450
+ .sched-form-control { display: flex; align-items: center; flex-wrap: wrap; justify-content: flex-end; gap: 8px; min-width: 0; }
23451
+ .sched-form-control > .cc-dropdown, .sched-form-control > .sched-input:not([type="color"]):not([type="number"]) { flex: 1 1 220px; }
23452
+ .sched-form-control--start { justify-content: flex-start; }
23453
+ .sched-form-stack { display: flex; flex-direction: column; align-items: stretch; gap: 4px; min-width: 0; }
23454
+ .sched-help { margin: 0; color: var(--stg-help); font-size: var(--fs-xs); line-height: 1.45; }
23455
+ details.sched-form-section > summary { list-style: none; cursor: pointer; border-radius: var(--sched-control-radius); }
23456
+ details.sched-form-section > summary::-webkit-details-marker { display: none; }
23457
+ details.sched-form-section > summary::before {
23458
+ content: ''; width: 6px; height: 6px; margin-inline-end: 2px; align-self: center; flex-shrink: 0;
23459
+ border-right: 1.5px solid var(--stg-help); border-bottom: 1.5px solid var(--stg-help);
23460
+ transform: rotate(-45deg); transition: transform 150ms ease;
23461
+ }
23462
+ details.sched-form-section[open] > summary::before { transform: rotate(45deg); }
23463
+
23464
+ .sched-presets { display: flex; flex-direction: column; gap: 8px; }
23465
+ .sched-preset-group { display: grid; grid-template-columns: 72px minmax(0, 1fr); align-items: start; gap: 8px; }
23466
+ .sched-preset-group > span { padding-top: 3px; color: var(--stg-help); font-size: var(--fs-xs); }
23467
+ .sched-chip-list { display: flex; flex-wrap: wrap; gap: 4px; }
23468
+ .sched-chip {
23469
+ min-height: var(--sched-control-h); padding: 2px 8px; border: 1px solid var(--stg-field-line);
23470
+ border-radius: var(--sched-control-radius); background: transparent; color: var(--stg-body); cursor: pointer;
23471
+ font-family: var(--stg-font); font-size: var(--fs-xs); line-height: 1.2; white-space: nowrap;
23472
+ transition: background-color 150ms ease, color 150ms ease;
23346
23473
  }
23347
- .sched-sidebar-new:hover { background: rgba(255,255,255,0.07); color: var(--t-bright); }
23348
- .sched-sidebar-empty { color: var(--t-muted); font-size: 11px; padding: 8px 6px; }
23349
- .sched-sidebar-prompt {
23350
- margin-top: auto; display: inline-flex; align-items: center; justify-content: center; gap: 6px;
23351
- border: 1px solid rgba(255,255,255,0.09); border-radius: 8px;
23352
- background: rgba(255,255,255,0.04);
23353
- color: var(--t-secondary); min-height: 34px; cursor: pointer; font-family: inherit;
23354
- font-size: 12px; font-weight: 600; letter-spacing: 0;
23355
- box-shadow: var(--shadow-highlight);
23356
- transition: border-color 160ms ease, color 160ms ease, background 160ms ease, transform 120ms ease;
23474
+ .sched-chip:hover { background: var(--stg-control); color: var(--stg-text); }
23475
+ .sched-chip[aria-pressed="true"] { background: var(--stg-control-hover); color: var(--stg-text); box-shadow: var(--shadow-highlight); }
23476
+ .sched-day-label { display: inline-flex; flex-direction: column; }
23477
+ .sched-day-remove { align-self: flex-start; margin-top: 3px; }
23478
+ .sched-day-remove--room { visibility: hidden; }
23479
+
23480
+ /* ── Timers ── */
23481
+ .sched-timer-row { display: grid; grid-template-columns: minmax(0, 1fr) auto auto; align-items: center; gap: 12px; min-height: 40px; padding: 6px 0; }
23482
+ .sched-timer-row + .sched-timer-row { border-top: 1px solid var(--stg-sep); }
23483
+ .sched-timer-name { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: var(--fs-sm); color: var(--stg-text); }
23484
+ .sched-timer-meta { display: block; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: var(--fs-xs); color: var(--stg-help); }
23485
+ .sched-timer-count { font-family: var(--stg-mono); font-size: var(--fs-xs); font-variant-numeric: tabular-nums; color: var(--stg-text); }
23486
+ .sched-form-actions { display: flex; align-items: center; justify-content: flex-end; flex-wrap: wrap; gap: 8px; margin-top: 10px; }
23487
+
23488
+ /* ── Activity: the latest run of each schedule ── */
23489
+ .sched-activity-btn {
23490
+ display: grid; grid-template-columns: minmax(0, 10em) minmax(0, 1fr) minmax(0, 9em) minmax(0, 8.5em) 10px;
23491
+ align-items: center; column-gap: 12px; width: 100%; min-height: 46px; padding: 6px 12px;
23492
+ border: 0; background: transparent; color: inherit; font-family: var(--stg-font); text-align: start; cursor: pointer;
23493
+ transition: background-color 120ms ease;
23494
+ }
23495
+ .sched-activity-btn:hover { background: rgba(255,255,255,0.025); }
23496
+ .sched-rows--activity .sched-row + .sched-row::before { left: 12px; }
23497
+ .sched-rows--activity .sched-row:first-child .sched-activity-btn { border-radius: var(--sched-group-radius) var(--sched-group-radius) 0 0; }
23498
+ .sched-rows--activity .sched-row:last-child .sched-activity-btn { border-radius: 0 0 var(--sched-group-radius) var(--sched-group-radius); }
23499
+ .sched-activity-btn :is(.sched-last, .sched-row-chevron) { grid-area: auto; }
23500
+ .sched-activity-main { display: flex; flex-direction: column; gap: 1px; min-width: 0; }
23501
+ .sched-activity-when { display: flex; flex-direction: column; min-width: 0; font-size: var(--fs-xs); line-height: 1.4; }
23502
+ .sched-activity-when > span:first-child { color: var(--stg-text); }
23503
+ .sched-activity-when > span + span { color: var(--stg-help); }
23504
+
23505
+ /* ── Confirmation dialog, inside the window ── */
23506
+ .sched-dialog-layer {
23507
+ position: absolute; inset: 0; z-index: 30; display: flex; align-items: center; justify-content: center;
23508
+ padding: 12px; background: var(--s-panel); backdrop-filter: blur(4px); -webkit-backdrop-filter: blur(4px);
23509
+ }
23510
+ .sched-dialog {
23511
+ width: 420px; max-width: 100%; max-height: 100%; overflow-y: auto;
23512
+ color: var(--stg-text); background: var(--s-panel); border: 1px solid var(--fw-border);
23513
+ border-radius: var(--fw-radius); box-shadow: var(--fw-shadow);
23514
+ }
23515
+ .sched-dialog h4 { margin: 0; padding: 14px 18px 0; font-family: var(--stg-font); font-size: var(--fs-sm); font-weight: 600; line-height: 1.4; }
23516
+ .sched-dialog-body { padding: 8px 18px 2px; }
23517
+ .sched-dialog-name { margin: 0 0 6px; font-size: var(--fs-sm); line-height: 1.4; overflow-wrap: anywhere; }
23518
+ .sched-dialog-body .sched-help { max-width: 52ch; }
23519
+ .sched-dialog-actions { display: flex; align-items: center; justify-content: flex-end; flex-wrap: wrap; gap: 8px; padding: 14px 18px 16px; }
23520
+
23521
+ /* ── Narrow windows ── */
23522
+ @container sched (max-width: 780px) {
23523
+ .sched-body { grid-template-columns: minmax(0, 1fr); }
23524
+ .sched-rail { display: none; }
23525
+ .sched-narrow-nav { display: flex; align-items: center; gap: 8px; padding: 12px var(--sched-inset) 0; flex-shrink: 0; }
23526
+ .sched-narrow-nav .sched-scope-select { flex: 1 1 auto; min-width: 0; }
23527
+ .sched-footer-hint { display: none; }
23528
+ }
23529
+ @container sched (max-width: 600px) {
23530
+ .sched-main { --sched-inset: 14px; }
23531
+ .sched-view-head { padding-top: 14px; }
23532
+ .sched-toolbar { flex-wrap: wrap; }
23533
+ .sched-search { flex-basis: 100%; }
23534
+ .sched-search kbd { display: none; }
23535
+ .sched-row-line {
23536
+ grid-template-columns: 30px minmax(0, 1fr) auto 10px;
23537
+ grid-template-areas: "switch main main chev" ". next last chev";
23538
+ row-gap: 2px;
23539
+ }
23540
+ .sched-next, .sched-last { flex-direction: row; flex-wrap: wrap; column-gap: 6px; }
23541
+ .sched-last { justify-self: end; }
23542
+ .sched-row + .sched-row::before { left: 12px; }
23543
+ .sched-detail { padding-left: 14px; }
23544
+ .sched-group-meta { display: none; }
23545
+ .sched-form-row { grid-template-columns: minmax(0, 1fr); gap: 4px; }
23546
+ .sched-form-control { justify-content: flex-start; }
23547
+ .sched-activity-btn { grid-template-columns: minmax(0, 1fr) auto; row-gap: 2px; }
23548
+ .sched-activity-btn > :is(.sched-activity-next, .sched-row-chevron) { display: none; }
23549
+ }
23550
+
23551
+ /* Touch: room for a fingertip; desktop keeps the native small scale. */
23552
+ @media (pointer: coarse) {
23553
+ .schedules-studio-panel :is(.sched-btn, .sched-icon-btn, .sched-nav-item, .cc-dropdown-trigger, .sched-input, .sched-chip, .sched-group-toggle) { min-height: 44px; }
23554
+ .schedules-studio-panel .sched-icon-btn { width: 44px; }
23555
+ .schedules-studio-panel .sched-search { height: 44px; }
23556
+ .schedules-studio-panel .sched-row-line { min-height: 56px; }
23357
23557
  }
23358
- .sched-sidebar-prompt:hover {
23359
- background: rgba(255,255,255,0.075);
23360
- border-color: rgba(255,255,255,0.14);
23361
- color: var(--t-bright);
23362
- transform: translateY(-1px);
23558
+ @media (prefers-reduced-motion: reduce) {
23559
+ .schedules-studio-panel *, .schedules-studio-panel *::before, .schedules-studio-panel *::after { transition: none !important; animation: none !important; }
23363
23560
  }
23364
- .sched-sidebar-prompt svg { width: 13px; height: 13px; color: var(--t-muted); }
23365
23561
 
23562
+ /* ── Prompt a Schedule (modal over the window) ── */
23366
23563
  .sched-prompt-backdrop {
23367
23564
  position: fixed; inset: 0; background: rgba(5,7,12,0.58);
23368
23565
  backdrop-filter: blur(7px); -webkit-backdrop-filter: blur(7px);
@@ -23491,266 +23688,6 @@
23491
23688
  color: var(--t-secondary);
23492
23689
  }
23493
23690
 
23494
- .sched-main { flex: 1; min-width: 0; min-height: 0; display: flex; flex-direction: column; }
23495
- .sched-tabs {
23496
- display: flex; align-items: center; gap: 4px; padding: 10px 14px 0;
23497
- border-bottom: 1px solid rgba(255,255,255,0.05);
23498
- }
23499
- .sched-tab {
23500
- min-height: 30px; padding: 6px 12px; border: 1px solid transparent;
23501
- border-bottom: 0; border-radius: 8px 8px 0 0; background: transparent;
23502
- color: var(--t-muted); font-family: inherit; font-size: 12px; font-weight: 600;
23503
- cursor: pointer; letter-spacing: 0;
23504
- }
23505
- .sched-tab:hover { color: var(--t-secondary); background: rgba(255,255,255,0.035); }
23506
- .sched-tab.active { color: var(--t-bright); background: rgba(255,255,255,0.06); border-color: rgba(255,255,255,0.08); }
23507
- .sched-content {
23508
- flex: 1; min-height: 0; overflow-y: auto; padding: 14px;
23509
- display: flex; flex-direction: column; gap: 12px;
23510
- }
23511
-
23512
- .sched-stat-strip {
23513
- display: grid; grid-template-columns: repeat(3, minmax(80px, 1fr)) auto; gap: 8px;
23514
- align-items: stretch;
23515
- }
23516
- .sched-stat-strip div {
23517
- border: 1px solid rgba(255,255,255,0.07); border-radius: 8px;
23518
- background: rgba(255,255,255,0.03); padding: 9px 10px;
23519
- }
23520
- .sched-stat-strip span { display: block; color: var(--t-bright); font-size: 18px; font-weight: 700; }
23521
- .sched-stat-strip label { color: var(--t-muted); font-size: 10px; }
23522
- .sched-section-head {
23523
- display: flex; align-items: baseline; justify-content: space-between; gap: 12px;
23524
- margin-top: 2px;
23525
- }
23526
- .sched-section-head h4 {
23527
- margin: 0; color: var(--t-bright); font-family: var(--ff-heading);
23528
- font-size: 14px; font-weight: 650; letter-spacing: 0;
23529
- }
23530
- .sched-section-head span { color: var(--t-muted); font-size: 11px; }
23531
- .sched-card-list,
23532
- .sched-group-card-list,
23533
- .sched-activity-list { display: flex; flex-direction: column; gap: 8px; }
23534
-
23535
- .sched-card {
23536
- display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 12px;
23537
- align-items: center; border: 1px solid rgba(255,255,255,0.075);
23538
- border-radius: 8px; background: rgba(255,255,255,0.025);
23539
- padding: 11px 12px; transition: border-color 0.15s, background 0.15s, opacity 0.15s;
23540
- }
23541
- .sched-card:hover { background: rgba(255,255,255,0.04); border-color: rgba(255,255,255,0.12); }
23542
- .sched-card.is-paused { opacity: 0.58; }
23543
- .sched-card.dragging { opacity: 0.42; }
23544
- .sched-card-main { min-width: 0; }
23545
- .sched-card-title-row { display: flex; align-items: center; gap: 8px; min-width: 0; }
23546
- .sched-card h4 {
23547
- margin: 0; color: var(--t-bright); font-size: 14px; font-weight: 700;
23548
- overflow: hidden; text-overflow: ellipsis; white-space: nowrap; letter-spacing: 0;
23549
- }
23550
- .sched-card-meta { margin-top: 3px; color: var(--t-secondary); font-size: 12px; line-height: 1.35; }
23551
- .sched-card-sub {
23552
- display: flex; flex-wrap: wrap; gap: 8px; margin-top: 4px;
23553
- color: var(--t-muted); font-size: 10px;
23554
- }
23555
- .sched-countdown {
23556
- font-variant-numeric: tabular-nums;
23557
- color: var(--t-secondary);
23558
- font-weight: 600;
23559
- }
23560
- .sched-card-controls { display: flex; align-items: center; gap: 5px; }
23561
- .sched-card-group-select {
23562
- width: 128px; min-height: 28px; border-radius: 7px; background: rgba(255,255,255,0.035);
23563
- border: 1px solid rgba(255,255,255,0.08); color: var(--t-secondary);
23564
- font-size: 11px; font-family: inherit; padding: 4px 8px;
23565
- }
23566
- .sched-icon-btn {
23567
- min-width: 28px; height: 28px; display: inline-flex; align-items: center; justify-content: center; gap: 4px;
23568
- border-radius: 7px; border: 1px solid transparent; background: transparent;
23569
- color: var(--t-dim); cursor: pointer; font-family: inherit; font-size: 11px;
23570
- }
23571
- .sched-icon-btn:hover:not(:disabled) { background: rgba(255,255,255,0.06); color: var(--t-bright); border-color: rgba(255,255,255,0.08); }
23572
- .sched-icon-btn:disabled { opacity: 0.35; cursor: default; }
23573
- .sched-icon-btn.danger:hover { color: rgba(244,67,54,0.9); border-color: rgba(244,67,54,0.22); }
23574
- .sched-badge {
23575
- font-size: 9px; font-weight: 700; padding: 2px 6px; border-radius: 5px;
23576
- text-transform: uppercase; letter-spacing: 0.04em; white-space: nowrap;
23577
- }
23578
- .sched-badge--ok { background: rgba(76,175,80,0.12); color: rgba(102,210,120,0.95); }
23579
- .sched-badge--paused { background: rgba(255,255,255,0.06); color: var(--t-muted); }
23580
- .sched-badge--error { background: rgba(244,67,54,0.12); color: rgba(244,67,54,0.95); }
23581
- .sched-empty {
23582
- border: 1px dashed rgba(255,255,255,0.09); border-radius: 8px;
23583
- color: var(--t-muted); padding: 28px; text-align: center;
23584
- }
23585
- .sched-empty .sched-primary { margin-top: 12px; }
23586
-
23587
- .sched-tool-section,
23588
- .sched-active-timers {
23589
- border: 1px solid rgba(255,255,255,0.075); border-radius: 8px;
23590
- background: rgba(255,255,255,0.025); padding: 12px;
23591
- display: flex; flex-direction: column; gap: 12px;
23592
- }
23593
- .sched-active-timers { gap: 6px; }
23594
- .sched-active-timer {
23595
- display: grid; grid-template-columns: minmax(0, 1fr) auto auto; align-items: center; gap: 10px;
23596
- border: 1px solid rgba(255,255,255,0.06); border-radius: 7px;
23597
- background: rgba(0,0,0,0.12); padding: 7px 9px;
23598
- }
23599
- .sched-active-timer span { color: var(--t-secondary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
23600
- .sched-active-timer strong { color: var(--t-bright); font-size: 13px; font-variant-numeric: tabular-nums; }
23601
- .sched-form-grid {
23602
- display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px;
23603
- }
23604
- .sched-form-grid.compact { grid-template-columns: minmax(0, 1fr) 120px auto; align-items: end; }
23605
- .sched-field { display: flex; flex-direction: column; gap: 5px; min-width: 0; }
23606
- .sched-field.wide { grid-column: span 2; }
23607
- .sched-field span {
23608
- color: var(--t-secondary); font-size: 11px; font-weight: 650;
23609
- }
23610
- .sched-field input,
23611
- .sched-field select,
23612
- .sched-cron-input {
23613
- width: 100%; min-height: 34px; border-radius: 7px;
23614
- border: 1px solid rgba(255,255,255,0.08); background: rgba(0,0,0,0.18);
23615
- color: var(--t-bright); font-size: 12px; font-family: inherit; padding: 7px 9px;
23616
- outline: none; letter-spacing: 0;
23617
- }
23618
- .sched-cron-input { font-family: 'SF Mono', 'Fira Code', monospace; }
23619
- .sched-field input:focus,
23620
- .sched-field select:focus,
23621
- .sched-cron-input:focus { border-color: rgba(79,195,247,0.35); }
23622
- .sched-toggle {
23623
- display: inline-flex; align-items: center; gap: 8px; min-height: 34px;
23624
- color: var(--t-secondary); font-size: 12px; cursor: pointer;
23625
- }
23626
- .sched-time-row { display: flex; flex-wrap: wrap; align-items: center; gap: 7px; }
23627
- .sched-time-chip {
23628
- min-width: 46px; min-height: 30px; border-radius: 8px;
23629
- border: 1px solid rgba(255,255,255,0.08); background: rgba(255,255,255,0.035);
23630
- color: var(--t-secondary); font-family: inherit; cursor: pointer;
23631
- }
23632
- .sched-time-chip:hover,
23633
- .sched-time-chip.active { background: rgba(255,255,255,0.08); color: var(--t-bright); border-color: rgba(255,255,255,0.13); }
23634
- .sched-min-input {
23635
- width: 58px; min-height: 30px; border-radius: 8px;
23636
- border: 1px solid rgba(255,255,255,0.08); background: rgba(0,0,0,0.18);
23637
- color: var(--t-bright); padding: 5px 8px; font-family: inherit;
23638
- }
23639
- .align-end { align-self: end; }
23640
-
23641
- .sched-group-card {
23642
- display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 12px;
23643
- border: 1px solid rgba(255,255,255,0.075); border-radius: 8px;
23644
- background: rgba(255,255,255,0.025); padding: 11px 12px;
23645
- }
23646
- .sched-group-card.editing { border-color: rgba(255,255,255,0.15); background: rgba(255,255,255,0.04); }
23647
- .sched-group-card-main { display: flex; align-items: center; gap: 10px; min-width: 0; }
23648
- .sched-group-card-main h4 { margin: 0; color: var(--t-bright); font-size: 13px; letter-spacing: 0; }
23649
- .sched-group-card-main span:not(.sched-group-color) { color: var(--t-muted); font-size: 11px; }
23650
- .sched-group-overrides { color: var(--t-secondary); }
23651
- .sched-group-card-actions { display: flex; align-items: center; gap: 5px; }
23652
- .sched-group-editor-body { width: 100%; border-top: 1px solid rgba(255,255,255,0.075); padding-top: 10px; margin-top: 2px; }
23653
- .sched-group-editor-actions { display: flex; gap: 8px; justify-content: flex-end; margin-top: 10px; }
23654
-
23655
- .sched-mutex-toggle {
23656
- display: inline-flex; align-items: center; gap: 4px; cursor: pointer;
23657
- padding: 3px 8px; border-radius: 6px; font-size: 11px;
23658
- background: rgba(255,255,255,0.04); border: 1px solid rgba(255,255,255,0.08);
23659
- color: var(--t-muted); transition: all 0.15s;
23660
- position: relative;
23661
- }
23662
- .sched-mutex-toggle:hover { background: rgba(255,255,255,0.07); color: var(--t-secondary); }
23663
- .sched-mutex-toggle:has(input:checked) { background: rgba(255,160,0,0.12); border-color: rgba(255,160,0,0.3); color: #ffa040; }
23664
- .sched-mutex-toggle input { display: none; }
23665
- .sched-mutex-toggle.sched-mutex-create { align-self: end; margin-bottom: 2px; }
23666
- .sched-mutex-label { display: inline-flex; align-items: center; gap: 3px; pointer-events: none; }
23667
- .sched-mutex-label svg { width: 12px; height: 12px; }
23668
- .sched-mutex-toggle[data-tooltip]:hover::after {
23669
- content: attr(data-tooltip); position: absolute; bottom: calc(100% + 6px); left: 50%;
23670
- transform: translateX(-50%); white-space: normal; width: max-content; max-width: 260px;
23671
- padding: 6px 10px; border-radius: 6px; font-size: 11px; line-height: 1.35;
23672
- background: rgba(20,20,20,0.95); color: var(--t-bright); border: 1px solid rgba(255,255,255,0.1);
23673
- z-index: 100; pointer-events: none;
23674
- }
23675
-
23676
- .sched-group-mutex-icon {
23677
- display: inline-flex; align-items: center; color: #ffa040; opacity: 0.7; flex-shrink: 0;
23678
- }
23679
- .sched-group-mutex-icon svg { width: 11px; height: 11px; }
23680
- .sched-group-mutex-icon[data-tooltip] { position: relative; }
23681
- .sched-group-mutex-icon[data-tooltip]:hover::after {
23682
- content: attr(data-tooltip); position: absolute; bottom: calc(100% + 4px); right: 0;
23683
- white-space: nowrap; padding: 4px 8px; border-radius: 5px;
23684
- font-size: 10px; background: rgba(20,20,20,0.95); color: var(--t-bright);
23685
- border: 1px solid rgba(255,255,255,0.1); z-index: 100; pointer-events: none;
23686
- }
23687
-
23688
- .sched-activity-row {
23689
- display: grid; grid-template-columns: minmax(180px, 1fr) auto minmax(80px, auto) minmax(140px, auto) minmax(80px, auto);
23690
- align-items: center; gap: 10px; border: 1px solid rgba(255,255,255,0.07);
23691
- border-radius: 8px; background: rgba(255,255,255,0.025); padding: 9px 10px;
23692
- color: var(--t-secondary); font-size: 11px;
23693
- }
23694
- .sched-activity-row strong { display: block; color: var(--t-bright); font-size: 12px; }
23695
- .sched-activity-row div span { color: var(--t-muted); }
23696
-
23697
- .sched-editor { display: flex; flex-direction: column; min-height: 0; height: 100%; }
23698
- .sched-editor-head {
23699
- display: flex; align-items: center; gap: 10px; padding: 12px 14px;
23700
- border-bottom: 1px solid rgba(255,255,255,0.06);
23701
- }
23702
- .sched-editor-head h3 {
23703
- margin: 0; color: var(--t-bright); font-size: 15px; font-family: var(--ff-heading); letter-spacing: 0;
23704
- }
23705
- .sched-editor-head span { color: var(--t-muted); font-size: 11px; }
23706
- .sched-editor-body {
23707
- flex: 1; min-height: 0; overflow-y: auto; padding: 14px;
23708
- display: flex; flex-direction: column; gap: 14px;
23709
- }
23710
- .sched-editor-section {
23711
- border: 1px solid rgba(255,255,255,0.075); border-radius: 8px;
23712
- background: rgba(255,255,255,0.025); padding: 12px; display: flex; flex-direction: column; gap: 10px;
23713
- }
23714
- .sched-presets { display: flex; flex-direction: column; gap: 8px; }
23715
- .sched-preset-group { display: flex; flex-direction: column; gap: 5px; }
23716
- .sched-preset-group > span {
23717
- color: var(--t-muted); font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.08em;
23718
- }
23719
- .sched-preset-group > div { display: flex; flex-wrap: wrap; gap: 5px; }
23720
- .sched-preset {
23721
- min-height: 26px; border-radius: 7px; border: 1px solid rgba(79,195,247,0.16);
23722
- background: rgba(79,195,247,0.06); color: rgba(150,220,255,0.92);
23723
- font-size: 11px; font-family: inherit; padding: 4px 8px; cursor: pointer;
23724
- }
23725
- .sched-preset:hover { background: rgba(79,195,247,0.12); border-color: rgba(79,195,247,0.28); }
23726
- .sched-day-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 7px 10px; }
23727
- .sched-day-field { display: grid; grid-template-columns: 38px minmax(0, 1fr); align-items: center; gap: 7px; }
23728
- .sched-day-field span { color: var(--t-muted); font-size: 10px; text-align: right; }
23729
- .sched-day-field input {
23730
- min-height: 30px; border-radius: 6px; border: 1px solid rgba(255,255,255,0.08);
23731
- background: rgba(0,0,0,0.18); color: var(--t-bright); font-size: 11px; padding: 6px 8px;
23732
- }
23733
- .sched-editor-actions {
23734
- display: flex; justify-content: flex-end; gap: 8px; padding: 10px 14px;
23735
- border-top: 1px solid rgba(255,255,255,0.06);
23736
- }
23737
-
23738
- @container sched (max-width: 760px) {
23739
- .sched-body { flex-direction: column; }
23740
- .sched-sidebar { width: auto; max-height: 160px; border-right: 0; border-bottom: 1px solid rgba(255,255,255,0.06); }
23741
- .sched-sidebar-summary { display: none; }
23742
- .sched-stat-strip { grid-template-columns: repeat(3, 1fr); }
23743
- .sched-stat-strip .sched-primary { grid-column: 1 / -1; }
23744
- .sched-card { grid-template-columns: 1fr; }
23745
- .sched-card-controls { flex-wrap: wrap; }
23746
- .sched-card-group-select { width: 100%; }
23747
- .sched-form-grid,
23748
- .sched-form-grid.compact { grid-template-columns: 1fr; }
23749
- .sched-field.wide { grid-column: span 1; }
23750
- .sched-activity-row { grid-template-columns: 1fr; }
23751
- .sched-day-grid { grid-template-columns: 1fr; }
23752
- }
23753
-
23754
23691
  /* ═══════════════════════════════════════════
23755
23692
  SCHEDULE QUEUE DROPDOWN
23756
23693
  ═══════════════════════════════════════════ */
@@ -24246,83 +24183,6 @@
24246
24183
  transform: scale(1.15);
24247
24184
  }
24248
24185
 
24249
- /* MCP profile dropdown in floating terminal header */
24250
- .term-float-profile-dd {
24251
- position: relative;
24252
- flex-shrink: 0;
24253
- margin-left: 4px;
24254
- }
24255
- .term-float-profile-btn {
24256
- display: flex;
24257
- align-items: center;
24258
- gap: 3px;
24259
- background: rgba(255,255,255,0.06);
24260
- border: 1px solid rgba(255,255,255,0.08);
24261
- border-radius: 4px;
24262
- padding: 2px 6px;
24263
- cursor: pointer !important;
24264
- color: rgba(255,255,255,0.55);
24265
- font-size: 10px;
24266
- font-family: var(--ff-heading);
24267
- line-height: 1;
24268
- white-space: nowrap;
24269
- transition: color 0.15s, background 0.15s, border-color 0.15s;
24270
- }
24271
- .term-float-profile-btn:hover {
24272
- color: rgba(255,255,255,0.85);
24273
- background: rgba(255,255,255,0.1);
24274
- border-color: rgba(255,255,255,0.15);
24275
- }
24276
- .term-float-profile-arrow {
24277
- font-size: 8px;
24278
- opacity: 0.5;
24279
- }
24280
- .term-float-profile-menu {
24281
- display: none;
24282
- position: absolute;
24283
- top: calc(100% + 4px);
24284
- left: 0;
24285
- min-width: 160px;
24286
- max-height: 320px;
24287
- overflow-y: auto;
24288
- background: rgba(18, 18, 24, 0.97);
24289
- border: 1px solid rgba(255,255,255,0.1);
24290
- border-radius: 8px;
24291
- padding: 4px;
24292
- z-index: 10010;
24293
- backdrop-filter: blur(12px);
24294
- box-shadow: 0 8px 24px rgba(0,0,0,0.5);
24295
- }
24296
- .term-float-profile-menu.open { display: block; }
24297
- .term-float-profile-option {
24298
- display: flex;
24299
- align-items: center;
24300
- justify-content: space-between;
24301
- gap: 8px;
24302
- padding: 6px 8px;
24303
- border-radius: 5px;
24304
- cursor: pointer;
24305
- transition: background 0.12s;
24306
- }
24307
- .term-float-profile-option:hover {
24308
- background: rgba(255,255,255,0.08);
24309
- }
24310
- .term-float-profile-option.selected {
24311
- background: rgba(79, 195, 247, 0.12);
24312
- }
24313
- .term-float-profile-option .tfp-name {
24314
- font-size: 11px;
24315
- color: rgba(255,255,255,0.85);
24316
- font-family: var(--ff-heading);
24317
- }
24318
- .term-float-profile-option.selected .tfp-name {
24319
- color: #4FC3F7;
24320
- }
24321
- .term-float-profile-option .tfp-hint {
24322
- font-size: 9px;
24323
- color: rgba(255,255,255,0.3);
24324
- font-family: var(--ff-mono);
24325
- }
24326
24186
 
24327
24187
  /* Recall profile dropdown in floating terminal header */
24328
24188
  .term-float-recall-dd {
@@ -26054,7 +25914,7 @@
26054
25914
 
26055
25915
  .link-panel {
26056
25916
  position: fixed;
26057
- z-index: 50100;
25917
+ z-index: 49900; /* under the app frame (49990) */
26058
25918
  display: flex;
26059
25919
  flex-direction: column;
26060
25920
  border: 1px solid rgba(255,255,255,0.12);
@@ -26794,7 +26654,7 @@
26794
26654
  .as-launch-inline-header, .as-unsaved-dialog-header) > button,
26795
26655
  body :is(.ecm-close, .awiz-close, .sched-prompt-close),
26796
26656
  body .as-header .as-sidebar-toggle,
26797
- body .term-float-tab-header :is(.term-float-profile-btn, .term-float-recall-btn) { min-width: 44px; min-height: 44px; }
26657
+ body .term-float-tab-header :is(.term-float-recall-btn) { min-width: 44px; min-height: 44px; }
26798
26658
  }
26799
26659
 
26800
26660
  /* ═══════════════════════════════════════════
@@ -26802,7 +26662,7 @@
26802
26662
  Uses the shared Settings roles above; shell/glass preferences stay shared.
26803
26663
  ═══════════════════════════════════════════ */
26804
26664
  .command-runner-panel {
26805
- position: fixed; z-index: 50100;
26665
+ position: fixed; z-index: 49900; /* under the app frame (49990) */
26806
26666
  width: 720px; max-width: calc(100vw - 16px); min-width: min(320px, calc(100vw - 16px));
26807
26667
  height: 680px; max-height: calc(100dvh - var(--navbar-height, 48px) - 16px);
26808
26668
  min-height: min(360px, calc(100dvh - var(--navbar-height, 48px) - 16px));
@@ -28537,9 +28397,9 @@
28537
28397
  border-bottom: 1px solid var(--b-subtle);
28538
28398
  flex-shrink: 0;
28539
28399
  user-select: none;
28540
- cursor: grab;
28400
+ cursor: move;
28541
28401
  }
28542
- .ig-header:active { cursor: grabbing; }
28402
+ .ig-header:active { cursor: move; }
28543
28403
  .ig-header-left {
28544
28404
  display: flex;
28545
28405
  align-items: center;
@@ -28889,6 +28749,25 @@
28889
28749
  outline: 2px solid var(--stg-focus, #93c5fd);
28890
28750
  outline-offset: 2px;
28891
28751
  }
28752
+ /* The notice after an automatic restart (ui-crash-notice.js): the same toast, until it is dismissed. It moves to
28753
+ the top right while another update toast (the desktop app's update notice, a check's answer) holds the bottom right. */
28754
+ .crash-notice { max-height: calc(100vh - 120px); overflow-y: auto; }
28755
+ .crash-notice .utc-sub { overflow-wrap: anywhere; margin-top: 2px; }
28756
+ .crash-notice-lost-title {
28757
+ margin-top: 8px;
28758
+ font-weight: 600;
28759
+ color: var(--t-primary);
28760
+ }
28761
+ .crash-notice .crash-notice-lost { margin-top: 2px; }
28762
+ .crash-notice .crash-notice-lost li { overflow-wrap: anywhere; }
28763
+ .crash-notice-note { margin-top: 6px; }
28764
+ .crash-notice-note[hidden] { display: none; }
28765
+ .crash-notice .action-btn:focus-visible {
28766
+ outline: 2px solid var(--stg-focus, #93c5fd);
28767
+ outline-offset: 2px;
28768
+ }
28769
+ body:has(.update-check-toast:not(.crash-notice)) .crash-notice { bottom: auto; top: 64px; }
28770
+ @media (prefers-reduced-motion: reduce) { .crash-notice { transition: none; } }
28892
28771
 
28893
28772
  .update-channel-pill {
28894
28773
  display: inline-block;
@@ -29289,3 +29168,39 @@ body .styleguide-panel {
29289
29168
  @media (prefers-reduced-motion: reduce) {
29290
29169
  .wa-primary, .wa-btn, .wa-mode-card, .wa-level-card { transition: none; }
29291
29170
  }
29171
+
29172
+ /* Skills Studio: Health and Discover reuse the existing shell tokens. */
29173
+ .sx .sx-ops-grid { display: grid; align-items: stretch; grid-auto-rows: 1fr; grid-template-columns: repeat(auto-fit, minmax(min(260px, 100%), 1fr)); gap: 12px; margin: 12px 0; }
29174
+ .sx .sx-ops-card { padding: 12px; border: 1px solid var(--b-light); border-radius: var(--r-card); background: var(--s-subtle); min-width: 0; overflow-wrap: anywhere; }
29175
+ .sx .sx-ops-card[hidden] { display: none; }
29176
+ .sx .sx-ops-card code { font-family: var(--ff-mono, 'JetBrains Mono', monospace); font-size: var(--sx-meta); }
29177
+
29178
+ /* Tool-list multiple mode: the Settings control/check tokens, within the existing dropdown. */
29179
+ .cc-dropdown[data-multiple="true"] .cc-dropdown-trigger {
29180
+ height: 22px; max-width: 100%; font-family: inherit; font-size: var(--fs-xs);
29181
+ border-radius: var(--radius-control, 5px);
29182
+ }
29183
+ .cc-dropdown[data-multiple="true"] .cc-dropdown-trigger:focus-visible { outline: 2px solid var(--stg-focus, var(--accent-blue)); outline-offset: 2px; }
29184
+ .cc-dropdown[data-multiple="true"] .cc-dropdown-item { display: flex; align-items: center; gap: 8px; white-space: normal; }
29185
+ .cc-dropdown[data-multiple="true"] .cc-dropdown-item.highlight { outline: 1px solid var(--stg-focus, var(--accent-blue)); outline-offset: -1px; }
29186
+ .cc-dropdown[data-multiple="true"] .cc-dropdown-item[aria-disabled="true"] { cursor: default; }
29187
+ .cc-dropdown-check { width: 14px; height: 14px; flex: 0 0 14px; border: 1px solid var(--b-visible); border-radius: var(--radius-check, 3px); background: var(--s-subtle); }
29188
+ .cc-dropdown-item.active > .cc-dropdown-check { background: var(--stg-accent-fill, var(--accent-blue)); border-color: var(--stg-accent-fill, var(--accent-blue)); }
29189
+ .cc-dropdown-item.active > .cc-dropdown-check::after { content: '✓'; display: block; text-align: center; line-height: 12px; color: var(--t-bright); }
29190
+ .cc-dropdown-caption { display: block; font-size: inherit; font-weight: 400; color: var(--t-muted); }
29191
+ .cc-dropdown-group { padding: 4px 8px; color: var(--t-muted); font-size: var(--fs-xs); }
29192
+ .tool-list-picker { max-width: 100%; min-width: 0; }
29193
+
29194
+ .tool-list-picker .cc-dropdown-menu { background: var(--color-surface-raised, #16161a); min-width: 240px; max-width: 360px; overflow-y: auto; border-radius: var(--radius-md, var(--r-card)); box-shadow: var(--shadow-popover, var(--shadow-lg)); }
29195
+ .asst-tools-picker { min-width: 0; max-width: 180px; flex: 0 1 180px; }
29196
+ .asst-tools-picker .cc-dropdown { width: 100%; }
29197
+ .asst-tools-picker .cc-dropdown-trigger { position: relative; isolation: isolate; width: 100%; min-width: 0; height: var(--asst-pill-h-sm); background: var(--asst-field); color: var(--asst-text-2); border-color: var(--asst-line); }
29198
+ /* The same invisible hit margin as the Assistant's other compact toolbar controls. */
29199
+ .asst-tools-picker .cc-dropdown-trigger::after { content: ''; position: absolute; inset: calc((var(--asst-pill-h-sm) - var(--asst-pill-h-md)) / 2); z-index: -1; border-radius: inherit; }
29200
+ .asst-tools-picker .cc-dropdown-menu { background: var(--asst-popover); border-color: var(--asst-popover-ring); box-shadow: var(--asst-popover-shadow); }
29201
+ .asst-tools-picker .cc-dropdown-caption { color: var(--asst-text-3); }
29202
+ .ocpv2-tools-picker { min-width: 0; max-width: 160px; }
29203
+ .ocpv2-tools-picker .ocpv2-dropdown { padding: 0; max-width: 160px; }
29204
+ .ocpv2-tools-picker .cc-dropdown-trigger { min-width: 0; max-width: 160px; border: none; background: transparent; color: var(--t-primary); font-family: inherit; }
29205
+
29206
+ .ocpv2-tools-picker .tool-list-picker .cc-dropdown-menu { background: rgba(22,22,26,0.98); }