synabun 2.0.10 → 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 (517) hide show
  1. package/CHANGELOG.md +86 -0
  2. package/README.md +25 -2
  3. package/THIRD-PARTY-LICENSES.md +22 -0
  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/lib/claude-hooks.js +172 -18
  10. package/lib/client-config-repair.js +17 -8
  11. package/lib/desktop-app.js +7 -1
  12. package/lib/external-tools.js +1 -1
  13. package/lib/first-launch-protection.js +57 -12
  14. package/lib/mcp-dist.js +176 -0
  15. package/lib/release-npm-ci.mjs +138 -0
  16. package/lib/release-publish.mjs +91 -0
  17. package/lib/release-scan.mjs +50 -0
  18. package/lib/server-crash-record.js +123 -0
  19. package/lib/server-exit.js +318 -0
  20. package/lib/server-supervisor.js +508 -0
  21. package/lib/start-launcher.js +37 -4
  22. package/lib/tools-cli.js +45 -0
  23. package/lib/update-snapshot.js +228 -0
  24. package/lib/virustotal.mjs +192 -0
  25. package/lib/windows-crash-event.js +269 -0
  26. package/mcp-server/dist/http.d.ts +20 -1
  27. package/mcp-server/dist/http.d.ts.map +1 -1
  28. package/mcp-server/dist/http.js +59 -12
  29. package/mcp-server/dist/http.js.map +1 -1
  30. package/mcp-server/dist/index.d.ts +33 -27
  31. package/mcp-server/dist/index.d.ts.map +1 -1
  32. package/mcp-server/dist/index.js +128 -143
  33. package/mcp-server/dist/index.js.map +1 -1
  34. package/mcp-server/dist/preload.js +1 -1
  35. package/mcp-server/dist/preload.js.map +1 -1
  36. package/mcp-server/dist/services/codex-config-heal.d.ts +6 -2
  37. package/mcp-server/dist/services/codex-config-heal.d.ts.map +1 -1
  38. package/mcp-server/dist/services/codex-config-heal.js +81 -28
  39. package/mcp-server/dist/services/codex-config-heal.js.map +1 -1
  40. package/mcp-server/dist/services/memory-judge-backfill.d.ts +6 -0
  41. package/mcp-server/dist/services/memory-judge-backfill.d.ts.map +1 -1
  42. package/mcp-server/dist/services/memory-judge-backfill.js +7 -1
  43. package/mcp-server/dist/services/memory-judge-backfill.js.map +1 -1
  44. package/mcp-server/dist/services/neural-interface.d.ts +16 -10
  45. package/mcp-server/dist/services/neural-interface.d.ts.map +1 -1
  46. package/mcp-server/dist/services/neural-interface.js +67 -11
  47. package/mcp-server/dist/services/neural-interface.js.map +1 -1
  48. package/mcp-server/dist/services/server-instructions.d.ts +7 -2
  49. package/mcp-server/dist/services/server-instructions.d.ts.map +1 -1
  50. package/mcp-server/dist/services/server-instructions.js +20 -62
  51. package/mcp-server/dist/services/server-instructions.js.map +1 -1
  52. package/mcp-server/dist/services/tool-catalog.d.ts +120 -0
  53. package/mcp-server/dist/services/tool-catalog.d.ts.map +1 -0
  54. package/mcp-server/dist/services/tool-catalog.js +339 -0
  55. package/mcp-server/dist/services/tool-catalog.js.map +1 -0
  56. package/mcp-server/dist/services/tool-list-refresh-barrier.d.ts +12 -0
  57. package/mcp-server/dist/services/tool-list-refresh-barrier.d.ts.map +1 -0
  58. package/mcp-server/dist/services/tool-list-refresh-barrier.js +40 -0
  59. package/mcp-server/dist/services/tool-list-refresh-barrier.js.map +1 -0
  60. package/mcp-server/dist/services/tool-list.d.ts +108 -0
  61. package/mcp-server/dist/services/tool-list.d.ts.map +1 -0
  62. package/mcp-server/dist/services/tool-list.js +334 -0
  63. package/mcp-server/dist/services/tool-list.js.map +1 -0
  64. package/mcp-server/dist/services/tool-runtime.d.ts +161 -0
  65. package/mcp-server/dist/services/tool-runtime.d.ts.map +1 -0
  66. package/mcp-server/dist/services/tool-runtime.js +400 -0
  67. package/mcp-server/dist/services/tool-runtime.js.map +1 -0
  68. package/mcp-server/dist/services/whiteboard-geometry.d.ts +26 -2
  69. package/mcp-server/dist/services/whiteboard-geometry.d.ts.map +1 -1
  70. package/mcp-server/dist/services/whiteboard-geometry.js +91 -8
  71. package/mcp-server/dist/services/whiteboard-geometry.js.map +1 -1
  72. package/mcp-server/dist/tools/agents.d.ts +10 -10
  73. package/mcp-server/dist/tools/agents.d.ts.map +1 -1
  74. package/mcp-server/dist/tools/agents.js +22 -13
  75. package/mcp-server/dist/tools/agents.js.map +1 -1
  76. package/mcp-server/dist/tools/browser-batch.d.ts +3 -3
  77. package/mcp-server/dist/tools/image-tools.d.ts +1 -1
  78. package/mcp-server/dist/tools/image-tools.js +1 -1
  79. package/mcp-server/dist/tools/skill-tools.d.ts +505 -0
  80. package/mcp-server/dist/tools/skill-tools.d.ts.map +1 -0
  81. package/mcp-server/dist/tools/skill-tools.js +639 -0
  82. package/mcp-server/dist/tools/skill-tools.js.map +1 -0
  83. package/mcp-server/dist/tools/skill.d.ts +7 -0
  84. package/mcp-server/dist/tools/skill.d.ts.map +1 -0
  85. package/mcp-server/dist/tools/skill.js +11 -0
  86. package/mcp-server/dist/tools/skill.js.map +1 -0
  87. package/mcp-server/dist/tools/tool-groups.d.ts +68 -0
  88. package/mcp-server/dist/tools/tool-groups.d.ts.map +1 -0
  89. package/mcp-server/dist/tools/tool-groups.js +147 -0
  90. package/mcp-server/dist/tools/tool-groups.js.map +1 -0
  91. package/mcp-server/dist/tools/whiteboard-format.d.ts.map +1 -1
  92. package/mcp-server/dist/tools/whiteboard-format.js +7 -4
  93. package/mcp-server/dist/tools/whiteboard-format.js.map +1 -1
  94. package/mcp-server/dist/tools/whiteboard-tools.d.ts +64 -13
  95. package/mcp-server/dist/tools/whiteboard-tools.d.ts.map +1 -1
  96. package/mcp-server/dist/tools/whiteboard-tools.js +30 -5
  97. package/mcp-server/dist/tools/whiteboard-tools.js.map +1 -1
  98. package/mcp-server/package-lock.json +2 -2
  99. package/mcp-server/package.json +1 -1
  100. package/mcp-server/src/http.ts +75 -12
  101. package/mcp-server/src/index.ts +147 -154
  102. package/mcp-server/src/preload.ts +12 -12
  103. package/mcp-server/src/services/codex-config-heal.ts +80 -29
  104. package/mcp-server/src/services/memory-judge-backfill.ts +7 -1
  105. package/mcp-server/src/services/neural-interface.ts +79 -20
  106. package/mcp-server/src/services/server-instructions.ts +27 -63
  107. package/mcp-server/src/services/tool-catalog.ts +403 -0
  108. package/mcp-server/src/services/tool-list-refresh-barrier.ts +33 -0
  109. package/mcp-server/src/services/tool-list.ts +410 -0
  110. package/mcp-server/src/services/tool-runtime.ts +457 -0
  111. package/mcp-server/src/services/whiteboard-geometry.ts +94 -9
  112. package/mcp-server/src/tools/agents.ts +22 -14
  113. package/mcp-server/src/tools/image-tools.ts +1 -1
  114. package/mcp-server/src/tools/skill-tools.ts +589 -0
  115. package/mcp-server/src/tools/skill.ts +13 -0
  116. package/mcp-server/src/tools/tool-groups.ts +164 -0
  117. package/mcp-server/src/tools/whiteboard-format.ts +9 -3
  118. package/mcp-server/src/tools/whiteboard-tools.ts +39 -5
  119. package/neural-interface/i18n/en.json +3463 -200
  120. package/neural-interface/i18n/pt-BR.json +3411 -151
  121. package/neural-interface/lib/assistant-api.js +127 -28
  122. package/neural-interface/lib/assistant-brains/claude.js +4 -3
  123. package/neural-interface/lib/assistant-brains/codex-browser-policy-hook.mjs +12 -2
  124. package/neural-interface/lib/assistant-brains/codex-route-gate-hook.mjs +32 -9
  125. package/neural-interface/lib/assistant-brains/codex.js +9 -5
  126. package/neural-interface/lib/assistant-brains/opencode.js +120 -54
  127. package/neural-interface/lib/assistant-brains/opencode2-browser-policy/index.js +28 -13
  128. package/neural-interface/lib/assistant-brains/opencode2-route-gate/index.js +59 -19
  129. package/neural-interface/lib/assistant-catalog.js +6 -7
  130. package/neural-interface/lib/assistant-dispatch.js +871 -156
  131. package/neural-interface/lib/assistant-envelope.js +3 -1
  132. package/neural-interface/lib/assistant-persona.js +80 -11
  133. package/neural-interface/lib/assistant-plan-permissions.js +10 -9
  134. package/neural-interface/lib/assistant-route-gate-codex.js +3 -0
  135. package/neural-interface/lib/assistant-route-gate.js +6 -4
  136. package/neural-interface/lib/assistant-router.js +13 -8
  137. package/neural-interface/lib/assistant-runtime.js +56 -18
  138. package/neural-interface/lib/assistant-task-prompt.js +78 -14
  139. package/neural-interface/lib/assistant-tools.js +51 -0
  140. package/neural-interface/lib/backup-service.js +620 -3
  141. package/neural-interface/lib/backup-zip-reader.js +10 -5
  142. package/neural-interface/lib/backup-zip-writer.js +257 -0
  143. package/neural-interface/lib/browser-execution.js +10 -2
  144. package/neural-interface/lib/browser-guard-cdp.js +83 -0
  145. package/neural-interface/lib/browser-network-guard.js +284 -0
  146. package/neural-interface/lib/browser-policy-roots.js +64 -0
  147. package/neural-interface/lib/browser-tool-policy.js +186 -31
  148. package/neural-interface/lib/claude-agent-bridge.js +4 -2
  149. package/neural-interface/lib/claude-hooks-status.js +103 -0
  150. package/neural-interface/lib/claude-temporary.js +5 -11
  151. package/neural-interface/lib/cli-install.js +18 -138
  152. package/neural-interface/lib/cli-resolver.js +4 -1
  153. package/neural-interface/lib/cli-update-planner.js +32 -31
  154. package/neural-interface/lib/cloudflared/tunnel.js +42 -2
  155. package/neural-interface/lib/codex-mcp-approvals.js +11 -0
  156. package/neural-interface/lib/codex-worker-app-server.js +172 -0
  157. package/neural-interface/lib/confined-fs.js +30 -3
  158. package/neural-interface/lib/crash-notice-api.js +98 -0
  159. package/neural-interface/lib/editor-completion-opencode.js +68 -68
  160. package/neural-interface/lib/exec-loop-command.js +4 -8
  161. package/neural-interface/lib/http-guards.js +8 -2
  162. package/neural-interface/lib/install-details.js +4 -1
  163. package/neural-interface/lib/mcp-agent-servers.js +67 -0
  164. package/neural-interface/lib/mcp-client-config.js +0 -29
  165. package/neural-interface/lib/mcp-external-servers.js +323 -0
  166. package/neural-interface/lib/{mcp-profile-refresh-coordinator.js → mcp-tools-refresh-coordinator.js} +4 -4
  167. package/neural-interface/lib/morelogin.js +30 -0
  168. package/neural-interface/lib/native-loop-providers.js +547 -47
  169. package/neural-interface/lib/native-loop-runtime.js +268 -41
  170. package/neural-interface/lib/opencode-config.js +557 -0
  171. package/neural-interface/lib/opencode-db-schema.js +17 -34
  172. package/neural-interface/lib/opencode-history.js +48 -218
  173. package/neural-interface/lib/opencode-mcp-ready.js +108 -0
  174. package/neural-interface/lib/opencode-native-boundary.js +44 -0
  175. package/neural-interface/lib/opencode-protocol.js +249 -112
  176. package/neural-interface/lib/opencode-runtime-config.js +32 -22
  177. package/neural-interface/lib/opencode-serve-records.js +39 -21
  178. package/neural-interface/lib/opencode-v2-client.js +48 -153
  179. package/neural-interface/lib/opencode-v2-ws-requests.js +36 -210
  180. package/neural-interface/lib/opencode-worker-data.js +27 -0
  181. package/neural-interface/lib/opencode2-client.js +73 -37
  182. package/neural-interface/lib/opencode2-proxy.js +23 -63
  183. package/neural-interface/lib/opencode2-translate.js +51 -2
  184. package/neural-interface/lib/owner-authority.js +249 -0
  185. package/neural-interface/lib/page-session.js +275 -0
  186. package/neural-interface/lib/peer-identity.js +763 -0
  187. package/neural-interface/lib/request-gate.js +17 -2
  188. package/neural-interface/lib/rulesets/api.js +1 -1
  189. package/neural-interface/lib/rulesets/fs-safe.js +1 -1
  190. package/neural-interface/lib/rulesets/installer.js +92 -27
  191. package/neural-interface/lib/rulesets/json-edit.js +1 -1
  192. package/neural-interface/lib/session-cache-builder.js +17 -30
  193. package/neural-interface/lib/session-title-generator.js +58 -36
  194. package/neural-interface/lib/skills/api-v2.js +495 -0
  195. package/neural-interface/lib/skills/bundle.js +418 -0
  196. package/neural-interface/lib/skills/catalog.js +294 -0
  197. package/neural-interface/lib/skills/creation-api.js +191 -0
  198. package/neural-interface/lib/skills/creation-brief.js +247 -0
  199. package/neural-interface/lib/skills/creation-sources.js +267 -0
  200. package/neural-interface/lib/skills/creation.js +843 -0
  201. package/neural-interface/lib/skills/deploy.js +564 -0
  202. package/neural-interface/lib/skills/digest.js +119 -0
  203. package/neural-interface/lib/skills/discover.js +111 -0
  204. package/neural-interface/lib/skills/draft-confinement.js +214 -0
  205. package/neural-interface/lib/skills/eval-confinement.js +397 -0
  206. package/neural-interface/lib/skills/eval-sandbox.js +280 -0
  207. package/neural-interface/lib/skills/eval-trace.js +119 -0
  208. package/neural-interface/lib/skills/evals-api.js +212 -0
  209. package/neural-interface/lib/skills/evals.js +1573 -0
  210. package/neural-interface/lib/skills/export.js +200 -0
  211. package/neural-interface/lib/skills/frontmatter.js +64 -0
  212. package/neural-interface/lib/skills/health.js +75 -0
  213. package/neural-interface/lib/skills/json-edit.js +165 -0
  214. package/neural-interface/lib/skills/known-bridge-digests.json +387 -0
  215. package/neural-interface/lib/skills/known-bridges.js +96 -0
  216. package/neural-interface/lib/skills/library.js +823 -0
  217. package/neural-interface/lib/skills/local-store.js +21 -0
  218. package/neural-interface/lib/skills/migration.js +433 -0
  219. package/neural-interface/lib/skills/operations.js +45 -0
  220. package/neural-interface/lib/skills/ownership.js +427 -0
  221. package/neural-interface/lib/skills/packages.js +88 -0
  222. package/neural-interface/lib/skills/reviews.js +212 -0
  223. package/neural-interface/lib/skills/revision.js +80 -0
  224. package/neural-interface/lib/skills/roots.js +262 -0
  225. package/neural-interface/lib/skills/runtime-checks.js +355 -0
  226. package/neural-interface/lib/skills/scan-assets.js +252 -0
  227. package/neural-interface/lib/skills/scan-context.js +26 -0
  228. package/neural-interface/lib/skills/scan-shell.js +324 -0
  229. package/neural-interface/lib/skills/scan.js +364 -0
  230. package/neural-interface/lib/skills/scanners.js +54 -0
  231. package/neural-interface/lib/skills/service.js +522 -0
  232. package/neural-interface/lib/skills/telemetry.js +113 -0
  233. package/neural-interface/lib/sqlite-integrity-worker.js +22 -0
  234. package/neural-interface/lib/tool-lists.js +124 -0
  235. package/neural-interface/lib/whatsapp/bridge.js +6 -3
  236. package/neural-interface/lib/worker-confinement.js +1192 -0
  237. package/neural-interface/lib/worker-guard-setting.js +56 -0
  238. package/neural-interface/lib/worker-mcp-channel.js +175 -0
  239. package/neural-interface/lib/worker-relay-ports.js +227 -0
  240. package/neural-interface/lib/worker-resume.js +229 -0
  241. package/neural-interface/lib/worker-sandbox.js +299 -0
  242. package/neural-interface/package-lock.json +18 -12
  243. package/neural-interface/package.json +2 -2
  244. package/neural-interface/public/index.html +3 -1
  245. package/neural-interface/public/index2d.html +19 -11
  246. package/neural-interface/public/onboarding.html +2 -2
  247. package/neural-interface/public/shared/account-menu.js +8 -5
  248. package/neural-interface/public/shared/agent-runtime-options.js +35 -19
  249. package/neural-interface/public/shared/api.js +1527 -1336
  250. package/neural-interface/public/shared/app-frame.js +192 -0
  251. package/neural-interface/public/shared/assistant/asst-agents-dock.js +33 -2
  252. package/neural-interface/public/shared/assistant/asst-ask-styles.js +270 -0
  253. package/neural-interface/public/shared/assistant/asst-ask-tail.js +118 -0
  254. package/neural-interface/public/shared/assistant/asst-ask.js +397 -0
  255. package/neural-interface/public/shared/assistant/asst-brain-picker.js +49 -35
  256. package/neural-interface/public/shared/assistant/asst-control.js +157 -26
  257. package/neural-interface/public/shared/assistant/asst-followups-card.js +383 -0
  258. package/neural-interface/public/shared/assistant/asst-followups.js +417 -0
  259. package/neural-interface/public/shared/assistant/asst-limit-dock.js +40 -0
  260. package/neural-interface/public/shared/assistant/asst-limit-wait.js +294 -0
  261. package/neural-interface/public/shared/assistant/asst-limit.js +168 -0
  262. package/neural-interface/public/shared/assistant/asst-mascot.js +49 -12
  263. package/neural-interface/public/shared/assistant/asst-menu.js +7 -6
  264. package/neural-interface/public/shared/assistant/asst-panel.js +106 -11
  265. package/neural-interface/public/shared/assistant/asst-rack-styles.js +66 -49
  266. package/neural-interface/public/shared/assistant/asst-render.js +401 -77
  267. package/neural-interface/public/shared/assistant/asst-route.js +83 -12
  268. package/neural-interface/public/shared/assistant/asst-scenes.js +2 -0
  269. package/neural-interface/public/shared/assistant/asst-sidepanel.js +67 -4
  270. package/neural-interface/public/shared/assistant/asst-slash.js +9 -7
  271. package/neural-interface/public/shared/assistant/asst-state.js +11 -15
  272. package/neural-interface/public/shared/assistant/asst-stop.js +127 -0
  273. package/neural-interface/public/shared/assistant/asst-styles.js +59 -21
  274. package/neural-interface/public/shared/assistant/asst-tool-kinds.js +156 -16
  275. package/neural-interface/public/shared/automation-context.js +5 -2
  276. package/neural-interface/public/shared/cc-dropdown.js +89 -19
  277. package/neural-interface/public/shared/cdx/cdx-context-menu.js +10 -9
  278. package/neural-interface/public/shared/cdx/cdx-copy.js +16 -0
  279. package/neural-interface/public/shared/cdx/cdx-output-model.js +22 -1
  280. package/neural-interface/public/shared/cdx/cdx-output.js +8 -7
  281. package/neural-interface/public/shared/cdx/cdx-panel.js +45 -149
  282. package/neural-interface/public/shared/cdx/cdx-protocol.js +28 -1
  283. package/neural-interface/public/shared/cdx/cdx-render.js +47 -29
  284. package/neural-interface/public/shared/cdx/cdx-requests.js +3 -3
  285. package/neural-interface/public/shared/cdx/cdx-skill-hints.js +54 -0
  286. package/neural-interface/public/shared/cdx/cdx-styles.js +11 -3
  287. package/neural-interface/public/shared/cdx/cdx-tabs.js +52 -39
  288. package/neural-interface/public/shared/cdx/cdx-ws.js +0 -1
  289. package/neural-interface/public/shared/cli-install-view.js +4 -8
  290. package/neural-interface/public/shared/cli-status.js +2 -2
  291. package/neural-interface/public/shared/constants.js +2 -2
  292. package/neural-interface/public/shared/context-menu-areas.js +34 -0
  293. package/neural-interface/public/shared/context-menu-logic.js +243 -0
  294. package/neural-interface/public/shared/context-menu-model.js +366 -0
  295. package/neural-interface/public/shared/context-menu.js +372 -0
  296. package/neural-interface/public/shared/cp/cp-context-menu.js +10 -9
  297. package/neural-interface/public/shared/crash-notice-view.js +168 -0
  298. package/neural-interface/public/shared/desktop-update-view.js +20 -0
  299. package/neural-interface/public/shared/editor/editor-panel-logic.js +2 -2
  300. package/neural-interface/public/shared/html-shell.js +9 -11
  301. package/neural-interface/public/shared/i18n.js +2 -0
  302. package/neural-interface/public/shared/ocp-v2/ocp-v2-approvals.js +7 -7
  303. package/neural-interface/public/shared/ocp-v2/ocp-v2-binding.js +4 -4
  304. package/neural-interface/public/shared/ocp-v2/ocp-v2-changes-logic.js +3 -101
  305. package/neural-interface/public/shared/ocp-v2/ocp-v2-childpanel.js +2 -0
  306. package/neural-interface/public/shared/ocp-v2/ocp-v2-compact-button.js +1 -3
  307. package/neural-interface/public/shared/ocp-v2/ocp-v2-composer-logic.js +2 -6
  308. package/neural-interface/public/shared/ocp-v2/ocp-v2-context-menu.js +11 -11
  309. package/neural-interface/public/shared/ocp-v2/ocp-v2-context-model.js +0 -3
  310. package/neural-interface/public/shared/ocp-v2/ocp-v2-events.js +8 -4
  311. package/neural-interface/public/shared/ocp-v2/ocp-v2-manager.js +7 -7
  312. package/neural-interface/public/shared/ocp-v2/ocp-v2-outcome-notifications.js +16 -0
  313. package/neural-interface/public/shared/ocp-v2/ocp-v2-panel.js +47 -252
  314. package/neural-interface/public/shared/ocp-v2/ocp-v2-plan.js +1 -2
  315. package/neural-interface/public/shared/ocp-v2/ocp-v2-projectbar.js +95 -202
  316. package/neural-interface/public/shared/ocp-v2/ocp-v2-render.js +6 -21
  317. package/neural-interface/public/shared/ocp-v2/ocp-v2-send.js +4 -4
  318. package/neural-interface/public/shared/ocp-v2/ocp-v2-session-actions.js +8 -61
  319. package/neural-interface/public/shared/ocp-v2/ocp-v2-sessions-logic.js +2 -91
  320. package/neural-interface/public/shared/ocp-v2/ocp-v2-slash-hints.js +16 -15
  321. package/neural-interface/public/shared/ocp-v2/ocp-v2-state.js +8 -21
  322. package/neural-interface/public/shared/ocp-v2/ocp-v2-status-logic.js +1 -99
  323. package/neural-interface/public/shared/ocp-v2/ocp-v2-status.js +5 -35
  324. package/neural-interface/public/shared/ocp-v2/ocp-v2-styles.js +0 -21
  325. package/neural-interface/public/shared/ocp-v2/{ocp-v2-profile-inheritance.js → ocp-v2-tools-inheritance.js} +16 -16
  326. package/neural-interface/public/shared/ocp-v2/ocp-v2-ws.js +14 -47
  327. package/neural-interface/public/shared/page-session.js +96 -0
  328. package/neural-interface/public/shared/registry.js +5 -3
  329. package/neural-interface/public/shared/retired-2d.js +3 -0
  330. package/neural-interface/public/shared/schedules-view.js +195 -61
  331. package/neural-interface/public/shared/settings/settings-claude-hooks.js +135 -0
  332. package/neural-interface/public/shared/settings/settings-data.js +3 -1
  333. package/neural-interface/public/shared/settings/settings-ia.js +6 -6
  334. package/neural-interface/public/shared/settings/settings-opencode.js +89 -0
  335. package/neural-interface/public/shared/settings/settings-skill-folders-pane.js +265 -0
  336. package/neural-interface/public/shared/settings/settings-skill-folders.js +130 -0
  337. package/neural-interface/public/shared/settings/settings-worker-guard.js +72 -0
  338. package/neural-interface/public/shared/skills/ss-args.js +96 -0
  339. package/neural-interface/public/shared/skills/ss-creation.js +219 -0
  340. package/neural-interface/public/shared/skills/ss-dialog.js +130 -0
  341. package/neural-interface/public/shared/skills/ss-doc.js +173 -0
  342. package/neural-interface/public/shared/skills/ss-eval-adapters.js +269 -0
  343. package/neural-interface/public/shared/skills/ss-eval-grade.js +359 -0
  344. package/neural-interface/public/shared/skills/ss-eval-optimise.js +153 -0
  345. package/neural-interface/public/shared/skills/ss-eval-plan.js +315 -0
  346. package/neural-interface/public/shared/skills/ss-evals.js +417 -0
  347. package/neural-interface/public/shared/skills/ss-form.js +159 -0
  348. package/neural-interface/public/shared/skills/ss-frontmatter.js +376 -0
  349. package/neural-interface/public/shared/skills/ss-ids.js +32 -0
  350. package/neural-interface/public/shared/skills/ss-lint.js +141 -0
  351. package/neural-interface/public/shared/skills/ss-presets.js +117 -0
  352. package/neural-interface/public/shared/skills/ss-profiles.js +475 -0
  353. package/neural-interface/public/shared/skills/ss-resources.js +165 -0
  354. package/neural-interface/public/shared/skills/ss-review-view.js +190 -0
  355. package/neural-interface/public/shared/skills/ss-tabs.js +79 -0
  356. package/neural-interface/public/shared/skills/ss-unicode.js +135 -0
  357. package/neural-interface/public/shared/skills/studio/sx-actions.js +222 -0
  358. package/neural-interface/public/shared/skills/studio/sx-cm.js +101 -0
  359. package/neural-interface/public/shared/skills/studio/sx-create-ai-view.js +749 -0
  360. package/neural-interface/public/shared/skills/studio/sx-create-ai.js +236 -0
  361. package/neural-interface/public/shared/skills/studio/sx-create-view.js +254 -0
  362. package/neural-interface/public/shared/skills/studio/sx-create.js +126 -0
  363. package/neural-interface/public/shared/skills/studio/sx-diff-view.js +43 -0
  364. package/neural-interface/public/shared/skills/studio/sx-diff.js +133 -0
  365. package/neural-interface/public/shared/skills/studio/sx-docs.js +480 -0
  366. package/neural-interface/public/shared/skills/studio/sx-dom.js +229 -0
  367. package/neural-interface/public/shared/skills/studio/sx-edit-view.js +848 -0
  368. package/neural-interface/public/shared/skills/studio/sx-editor-model.js +193 -0
  369. package/neural-interface/public/shared/skills/studio/sx-errors.js +22 -0
  370. package/neural-interface/public/shared/skills/studio/sx-geometry.js +82 -0
  371. package/neural-interface/public/shared/skills/studio/sx-import.js +262 -0
  372. package/neural-interface/public/shared/skills/studio/sx-inspector.js +308 -0
  373. package/neural-interface/public/shared/skills/studio/sx-install-flow.js +279 -0
  374. package/neural-interface/public/shared/skills/studio/sx-install.js +296 -0
  375. package/neural-interface/public/shared/skills/studio/sx-library-view.js +639 -0
  376. package/neural-interface/public/shared/skills/studio/sx-library.js +475 -0
  377. package/neural-interface/public/shared/skills/studio/sx-main.js +681 -0
  378. package/neural-interface/public/shared/skills/studio/sx-operations-view.js +98 -0
  379. package/neural-interface/public/shared/skills/studio/sx-operations.js +11 -0
  380. package/neural-interface/public/shared/skills/studio/sx-plan.js +158 -0
  381. package/neural-interface/public/shared/skills/studio/sx-publish-view.js +621 -0
  382. package/neural-interface/public/shared/skills/studio/sx-review-view.js +369 -0
  383. package/neural-interface/public/shared/skills/studio/sx-review.js +148 -0
  384. package/neural-interface/public/shared/skills/studio/sx-scan.js +35 -0
  385. package/neural-interface/public/shared/skills/studio/sx-snippets.js +96 -0
  386. package/neural-interface/public/shared/skills/studio/sx-subject.js +248 -0
  387. package/neural-interface/public/shared/skills/studio/sx-test-view.js +994 -0
  388. package/neural-interface/public/shared/skills/studio/sx-test.js +328 -0
  389. package/neural-interface/public/shared/skills/studio/sx-versions-view.js +241 -0
  390. package/neural-interface/public/shared/skills/studio/sx-workspace-view.js +425 -0
  391. package/neural-interface/public/shared/styleguide/sg-panel.js +4 -2
  392. package/neural-interface/public/shared/styles.css +1525 -1779
  393. package/neural-interface/public/shared/synabun-mascot.js +1115 -9
  394. package/neural-interface/public/shared/tool-list-picker.js +55 -0
  395. package/neural-interface/public/shared/tool-list-storage.js +24 -0
  396. package/neural-interface/public/shared/tool-list-view.js +112 -0
  397. package/neural-interface/public/shared/tour/tour-actor.js +268 -0
  398. package/neural-interface/public/shared/tour/tour-beats.js +336 -0
  399. package/neural-interface/public/shared/tour/tour-engine.js +884 -0
  400. package/neural-interface/public/shared/tour/tour-ink.js +390 -0
  401. package/neural-interface/public/shared/tour/tour-stage.js +440 -0
  402. package/neural-interface/public/shared/tour/tour-state.js +40 -0
  403. package/neural-interface/public/shared/tour/tour-tips.js +99 -0
  404. package/neural-interface/public/shared/tour/tour.css +144 -0
  405. package/neural-interface/public/shared/ui-automation-studio.js +91 -128
  406. package/neural-interface/public/shared/ui-claude-panel.js +77 -5
  407. package/neural-interface/public/shared/ui-command-runner.js +6 -3
  408. package/neural-interface/public/shared/ui-context-menu.js +295 -0
  409. package/neural-interface/public/shared/ui-cost-widget.js +57 -59
  410. package/neural-interface/public/shared/ui-crash-notice.js +187 -0
  411. package/neural-interface/public/shared/ui-detail.js +15 -3
  412. package/neural-interface/public/shared/ui-image-gallery.js +50 -47
  413. package/neural-interface/public/shared/ui-keybinds.js +26 -1
  414. package/neural-interface/public/shared/ui-menubar.js +8 -18
  415. package/neural-interface/public/shared/ui-native-loop-router-state.js +5 -0
  416. package/neural-interface/public/shared/ui-native-loop-router.js +7 -1
  417. package/neural-interface/public/shared/ui-navbar.js +4 -24
  418. package/neural-interface/public/shared/ui-panels.js +96 -65
  419. package/neural-interface/public/shared/ui-schedules-studio.js +507 -423
  420. package/neural-interface/public/shared/ui-sessions.js +5 -3
  421. package/neural-interface/public/shared/ui-settings.js +594 -462
  422. package/neural-interface/public/shared/ui-sidepanel-sessions.js +1 -1
  423. package/neural-interface/public/shared/ui-sidepanel-state.js +23 -12
  424. package/neural-interface/public/shared/ui-sidepanel-windows.js +16 -11
  425. package/neural-interface/public/shared/ui-skills.js +33 -2830
  426. package/neural-interface/public/shared/ui-styleguide.js +5 -2
  427. package/neural-interface/public/shared/ui-sync.js +15 -5
  428. package/neural-interface/public/shared/ui-terminal.js +124 -180
  429. package/neural-interface/public/shared/ui-tool-updates.js +3 -1
  430. package/neural-interface/public/shared/ui-tooltip.js +10 -5
  431. package/neural-interface/public/shared/ui-trash.js +6 -4
  432. package/neural-interface/public/shared/ui-tutorial-layout.js +3 -117
  433. package/neural-interface/public/shared/ui-tutorial-preview.js +103 -0
  434. package/neural-interface/public/shared/ui-tutorial-steps.js +3 -65
  435. package/neural-interface/public/shared/ui-tutorial.css +47 -100
  436. package/neural-interface/public/shared/ui-tutorial.js +285 -509
  437. package/neural-interface/public/shared/ui-update.js +38 -2
  438. package/neural-interface/public/shared/ui-whiteboard.js +311 -58
  439. package/neural-interface/public/shared/ui-worker-end.js +4 -0
  440. package/neural-interface/public/shared/ui-workspaces.js +3 -2
  441. package/neural-interface/public/shared/view-variant.js +66 -0
  442. package/neural-interface/public/shared/whatsapp/wa-view.js +1 -1
  443. package/neural-interface/public/shared/whiteboard-list.js +172 -0
  444. package/neural-interface/public/shared/worker-end.js +10 -3
  445. package/neural-interface/public/shared/worker-restart.js +12 -0
  446. package/neural-interface/public/sidepanel-session.html +1 -1
  447. package/neural-interface/public/variant/2d/background.js +2 -1
  448. package/neural-interface/public/variant/2d/context-menu.js +8 -2
  449. package/neural-interface/public/variant/2d/graph.js +42 -20
  450. package/neural-interface/public/variant/2d/hulls.js +14 -9
  451. package/neural-interface/public/variant/2d/lasso.js +11 -7
  452. package/neural-interface/public/variant/2d/main.js +32 -1
  453. package/neural-interface/public/variant/2d/minimap.js +11 -13
  454. package/neural-interface/public/variant/3d/main.js +69 -6
  455. package/neural-interface/public/variant/3d/map-controls.js +24 -9
  456. package/neural-interface/public/vendor/caveat/OFL.txt +93 -0
  457. package/neural-interface/public/vendor/caveat/caveat-latin-400-normal.woff2 +0 -0
  458. package/neural-interface/public/vendor/caveat/caveat-latin-700-normal.woff2 +0 -0
  459. package/neural-interface/public/vendor/caveat/caveat.css +17 -0
  460. package/neural-interface/public/vendor/caveat/manifest.json +12 -0
  461. package/neural-interface/public/vendor/yaml/LICENSE +13 -0
  462. package/neural-interface/public/vendor/yaml/manifest.json +4 -0
  463. package/neural-interface/public/vendor/yaml/yaml-2.9.1.min.js +137 -0
  464. package/neural-interface/scripts/build-vendor.mjs +32 -0
  465. package/neural-interface/server.js +3934 -2454
  466. package/neural-interface/templates/rulesets/core.md +1 -1
  467. package/neural-interface/templates/rulesets/legacy-hashes.json +18 -0
  468. package/neural-interface/templates/rulesets/manifest.json +8 -8
  469. package/npm-shrinkwrap.json +18 -12
  470. package/package.json +16 -3
  471. package/postinstall.js +9 -4
  472. package/preuninstall.js +1 -1
  473. package/setup.js +97 -322
  474. package/skills/skill-forge/SKILL.md +177 -0
  475. package/skills/skill-forge/evals/evals.json +54 -0
  476. package/skills/skill-forge/references/package.md +105 -0
  477. package/skills/skill-forge/references/review-and-recovery.md +63 -0
  478. package/skills/skill-forge/references/runtime-profiles.md +20 -0
  479. package/skills/skill-forge/references/sources-and-capabilities.md +51 -0
  480. package/skills/synabun/SKILL.md +10 -7
  481. package/skills/synabun/modules/audit.md +1 -5
  482. package/skills/synabun/modules/changelog.md +1 -5
  483. package/skills/synabun/modules/idea.md +1 -1
  484. package/skills/synabun/modules/memorize.md +6 -9
  485. package/skills/synabun/modules/schedule.md +4 -4
  486. package/mcp-server/dist/services/profiles.d.ts +0 -120
  487. package/mcp-server/dist/services/profiles.d.ts.map +0 -1
  488. package/mcp-server/dist/services/profiles.js +0 -387
  489. package/mcp-server/dist/services/profiles.js.map +0 -1
  490. package/mcp-server/dist/tools/leonardo-browser-tools.d.ts +0 -97
  491. package/mcp-server/dist/tools/leonardo-browser-tools.d.ts.map +0 -1
  492. package/mcp-server/dist/tools/leonardo-browser-tools.js +0 -228
  493. package/mcp-server/dist/tools/leonardo-browser-tools.js.map +0 -1
  494. package/mcp-server/dist/tools/leonardo.d.ts +0 -13
  495. package/mcp-server/dist/tools/leonardo.d.ts.map +0 -1
  496. package/mcp-server/dist/tools/leonardo.js +0 -21
  497. package/mcp-server/dist/tools/leonardo.js.map +0 -1
  498. package/mcp-server/dist/tools/profile.d.ts +0 -17
  499. package/mcp-server/dist/tools/profile.d.ts.map +0 -1
  500. package/mcp-server/dist/tools/profile.js +0 -114
  501. package/mcp-server/dist/tools/profile.js.map +0 -1
  502. package/mcp-server/src/services/profiles.ts +0 -428
  503. package/mcp-server/src/tools/leonardo-browser-tools.ts +0 -291
  504. package/mcp-server/src/tools/leonardo.ts +0 -30
  505. package/mcp-server/src/tools/profile.ts +0 -122
  506. package/neural-interface/lib/assistant-brains/opencode-browser-policy.js +0 -47
  507. package/neural-interface/lib/assistant-brains/opencode-route-gate.js +0 -62
  508. package/neural-interface/lib/mcp-profile-servers.js +0 -120
  509. package/neural-interface/public/shared/ui-tutorial-draw.js +0 -311
  510. package/skills/leonardo/SKILL.md +0 -168
  511. package/skills/leonardo/icon.svg +0 -1
  512. package/skills/leonardo/modules/browser-guide.md +0 -378
  513. package/skills/leonardo/modules/image-prompter.md +0 -283
  514. package/skills/leonardo/modules/model-advisor.md +0 -100
  515. package/skills/leonardo/modules/prompt-library.md +0 -110
  516. package/skills/leonardo/modules/style-guide.md +0 -186
  517. 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;
@@ -1710,6 +1850,47 @@
1710
1850
  to { opacity: 1; }
1711
1851
  }
1712
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
+
1713
1894
  /* ── Resume Dropdown ── */
1714
1895
 
1715
1896
  .menubar-dropdown--resume {
@@ -2863,7 +3044,7 @@
2863
3044
  .kb-backdrop {
2864
3045
  position: fixed;
2865
3046
  inset: 0;
2866
- z-index: 9998;
3047
+ z-index: 50200; /* a modal backdrop: over the app frame (49990) and the bar, the whole window */
2867
3048
  background: rgba(0, 0, 0, 0.4);
2868
3049
  backdrop-filter: blur(8px);
2869
3050
  -webkit-backdrop-filter: blur(8px);
@@ -2876,7 +3057,7 @@
2876
3057
 
2877
3058
  .keybinds-panel {
2878
3059
  position: fixed;
2879
- z-index: 9999;
3060
+ z-index: 50201;
2880
3061
  top: 50%;
2881
3062
  left: 50%;
2882
3063
  transform: translate(-50%, -50%) scale(0.95);
@@ -5352,7 +5533,7 @@
5352
5533
 
5353
5534
  .tw {
5354
5535
  position: fixed;
5355
- z-index: 50100;
5536
+ z-index: 49900; /* under the app frame (49990): its rounded corners cut a window that reaches them */
5356
5537
  width: 640px;
5357
5538
  max-width: 92vw;
5358
5539
  min-width: 420px;
@@ -6160,6 +6341,32 @@
6160
6341
  .topright-icon-btn:hover svg {
6161
6342
  filter: drop-shadow(0 0 4px rgba(255, 255, 255, 0.2));
6162
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
+ }
6163
6370
  #topright-assistant-panel-btn svg,
6164
6371
  #topright-codex-panel-btn svg,
6165
6372
  #topright-opencode-panel-btn svg {
@@ -8388,13 +8595,13 @@
8388
8595
  }
8389
8596
  /* Drag-to-terminal grip */
8390
8597
  .detail-drag-to-term {
8391
- cursor: grab;
8598
+ cursor: move;
8392
8599
  color: var(--accent-blue);
8393
8600
  opacity: 0.5;
8394
8601
  transition: opacity 0.15s;
8395
8602
  }
8396
8603
  .detail-drag-to-term:hover { opacity: 1; }
8397
- .detail-drag-to-term:active { cursor: grabbing; }
8604
+ .detail-drag-to-term:active { cursor: move; }
8398
8605
  .detail-card.detail-dragging-to-term { opacity: 0.45; }
8399
8606
 
8400
8607
  /* ── Compact mode ── */
@@ -11565,19 +11772,6 @@
11565
11772
  color: rgba(255,255,255,0.64);
11566
11773
  padding: 3px 0;
11567
11774
  }
11568
- .stg-tool-select {
11569
- width: 78px;
11570
- padding: 3px 6px;
11571
- font-size: 11.5px;
11572
- background: rgba(0,0,0,0.2);
11573
- border: 1px solid rgba(255,255,255,0.07);
11574
- border-radius: 5px;
11575
- color: var(--t-primary);
11576
- font-family: inherit;
11577
- outline: none;
11578
- cursor: pointer;
11579
- }
11580
- .stg-tool-select:focus { border-color: rgba(79,195,247,0.4); }
11581
11775
 
11582
11776
  /* MCP server rows */
11583
11777
  .stg-mcp-row {
@@ -11648,382 +11842,93 @@
11648
11842
  margin: 0;
11649
11843
  max-width: 420px;
11650
11844
  }
11651
- .stg-mcp-matrix-wrap {
11652
- position: relative;
11653
- overflow: hidden;
11654
- border: 1px solid rgba(148,163,184,0.08);
11655
- border-radius: 14px;
11656
- background:
11657
- linear-gradient(180deg, rgba(255,255,255,0.02) 0%, rgba(255,255,255,0.008) 100%),
11658
- rgba(0,0,0,0.14);
11659
- box-shadow: inset 0 1px 0 rgba(255,255,255,0.035);
11660
- }
11661
- .stg-mcp-matrix-wrap::after {
11662
- content: '';
11663
- position: absolute;
11664
- top: 0;
11665
- bottom: 0;
11666
- left: 148px;
11667
- width: 18px;
11668
- background: linear-gradient(90deg, rgba(10,13,17,0.36) 0%, rgba(10,13,17,0) 100%);
11669
- pointer-events: none;
11670
- z-index: 4;
11671
- }
11672
- .stg-mcp-matrix-scroll {
11673
- overflow-x: auto;
11674
- overflow-y: hidden;
11675
- border-radius: inherit;
11676
- scrollbar-gutter: stable;
11677
- }
11678
- .stg-mcp-matrix-empty,
11679
- .stg-mcp-empty-note {
11680
- padding: 12px 14px;
11681
- font-size: 11px;
11682
- color: rgba(148,163,184,0.52);
11683
- line-height: 1.5;
11684
- }
11685
- #stg-mcp-matrix {
11686
- border-collapse: separate;
11687
- border-spacing: 0;
11688
- width: max-content;
11689
- min-width: 100%;
11690
- }
11691
- #stg-mcp-matrix th, #stg-mcp-matrix td {
11692
- padding: 0;
11693
- margin: 0;
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;
11694
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;
11695
11858
  }
11859
+ .stg-mx-srv-del:hover { color: rgba(255,82,82,0.72); }
11696
11860
 
11697
- /* Row label column (sticky) */
11698
- .stg-mx-label-th, .stg-mx-label-td {
11699
- position: sticky;
11700
- left: 0;
11701
- backdrop-filter: blur(12px);
11702
- }
11703
- .stg-mx-label-th {
11704
- width: 148px;
11705
- min-width: 148px;
11706
- z-index: 6;
11707
- background:
11708
- linear-gradient(180deg, rgba(255,255,255,0.022) 0%, rgba(255,255,255,0.01) 100%),
11709
- linear-gradient(90deg, rgba(16,19,25,0.985) 0%, rgba(16,19,25,0.965) 86%, rgba(16,19,25,0.9) 100%);
11710
- border-bottom: 1px solid rgba(148,163,184,0.08);
11711
- box-shadow:
11712
- inset -1px 0 0 rgba(148,163,184,0.05),
11713
- 10px 0 18px -16px rgba(0,0,0,0.55);
11714
- }
11715
- #stg-mcp-matrix .stg-mx-label-td {
11716
- z-index: 5;
11717
- padding: 5px 14px;
11718
- min-width: 148px;
11719
- background:
11720
- linear-gradient(90deg, rgba(18,21,27,0.985) 0%, rgba(18,21,27,0.965) 86%, rgba(18,21,27,0.92) 100%);
11721
- border-bottom: 1px solid rgba(148,163,184,0.04);
11722
- box-shadow:
11723
- inset -1px 0 0 rgba(148,163,184,0.04),
11724
- 10px 0 18px -16px rgba(0,0,0,0.52);
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;
11725
11870
  }
11726
- .stg-mx-label-inner {
11871
+ .stg-mx-always-on-row {
11727
11872
  display: flex;
11728
- align-items: center;
11873
+ flex-wrap: wrap;
11729
11874
  gap: 6px;
11730
11875
  }
11731
- .stg-mx-corner-head {
11732
- display: flex;
11733
- align-items: center;
11734
- padding: 0 14px;
11735
- font-size: 8px;
11736
- font-weight: 700;
11737
- letter-spacing: 0.12em;
11738
- text-transform: uppercase;
11739
- color: rgba(148,163,184,0.34);
11740
- white-space: nowrap;
11741
- }
11742
- .stg-mx-grp-name {
11743
- font-size: 11px;
11744
- color: rgba(255,255,255,0.62);
11745
- font-weight: 500;
11746
- white-space: nowrap;
11747
- overflow: hidden;
11748
- text-overflow: ellipsis;
11749
- flex: 1;
11750
- letter-spacing: 0.01em;
11751
- }
11752
- .stg-mx-grp-count {
11753
- font-size: 8px;
11754
- color: rgba(148,163,184,0.34);
11755
- font-family: 'JetBrains Mono', 'SF Mono', monospace;
11756
- flex-shrink: 0;
11876
+ .stg-mx-always-chip {
11757
11877
  display: inline-flex;
11758
11878
  align-items: center;
11759
- justify-content: center;
11760
- min-width: 16px;
11761
- padding: 1px 4px;
11762
- border-radius: 3px;
11763
- background: rgba(148,163,184,0.04);
11764
- border: 1px solid rgba(148,163,184,0.05);
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;
11765
11889
  }
11766
11890
 
11767
- /* Profile column headers */
11768
- .stg-mx-profile-th {
11769
- padding: 6px 4px;
11770
- text-align: center;
11771
- vertical-align: middle;
11772
- min-width: 68px;
11773
- max-width: 92px;
11774
- border-bottom: 1px solid rgba(148,163,184,0.06);
11775
- background: transparent;
11776
- transition: background 0.15s ease, border-color 0.15s ease;
11891
+ /* External server list below matrix */
11892
+ #stg-mcp-ext-servers {
11893
+ display: flex;
11894
+ flex-direction: column;
11895
+ gap: 10px;
11777
11896
  }
11778
- .stg-mx-profile-th.active {
11779
- border-bottom-color: rgba(148,163,184,0.12);
11780
- background: rgba(148,163,184,0.02);
11897
+ .stg-mx-ext-row {
11898
+ padding: 10px 11px;
11899
+ border: 1px solid rgba(148,163,184,0.08);
11900
+ border-radius: 12px;
11901
+ background:
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);
11781
11905
  }
11782
- .stg-mx-profile-head {
11906
+ .stg-mx-ext-main {
11783
11907
  display: flex;
11784
- flex-direction: column;
11785
11908
  align-items: center;
11786
- gap: 3px;
11787
- cursor: pointer;
11788
- user-select: none;
11789
- position: relative;
11790
- padding: 2px 4px;
11791
- border-radius: 6px;
11792
- transition: background 0.15s ease;
11909
+ gap: 10px;
11793
11910
  }
11794
- .stg-mx-profile-head:hover { background: rgba(148,163,184,0.05); }
11795
- .stg-mx-profile-head:hover .stg-mx-profile-name { color: rgba(255,255,255,0.82); }
11796
- .stg-mx-profile-dot {
11797
- width: 4px;
11798
- height: 4px;
11911
+ .stg-mx-ext-dot {
11912
+ width: 6px;
11913
+ height: 6px;
11799
11914
  border-radius: 50%;
11800
- background: rgba(148,163,184,0.18);
11801
- transition: background 0.2s ease, box-shadow 0.2s ease;
11915
+ background: rgba(148,163,184,0.52);
11916
+ flex-shrink: 0;
11802
11917
  }
11803
- .stg-mx-profile-dot.on {
11804
- background: rgba(226,232,240,0.7);
11805
- box-shadow: 0 0 6px rgba(148,163,184,0.16);
11918
+ .stg-mx-ext-copy {
11919
+ flex: 1;
11920
+ min-width: 0;
11806
11921
  }
11807
- .stg-mx-profile-name {
11808
- font-size: 10px;
11809
- color: rgba(255,255,255,0.5);
11922
+ .stg-mx-ext-head {
11923
+ display: flex;
11924
+ align-items: center;
11925
+ gap: 8px;
11926
+ flex-wrap: wrap;
11927
+ }
11928
+ .stg-mx-ext-name {
11929
+ font-size: 11.5px;
11810
11930
  font-weight: 600;
11811
- white-space: nowrap;
11812
- overflow: hidden;
11813
- text-overflow: ellipsis;
11814
- max-width: 74px;
11815
- letter-spacing: 0.01em;
11816
- transition: color 0.12s ease;
11817
- }
11818
- .stg-mx-profile-th.active .stg-mx-profile-name { color: rgba(255,255,255,0.72); }
11819
- .stg-mx-profile-del {
11820
- position: absolute;
11821
- top: -3px;
11822
- right: -1px;
11823
- background: none;
11824
- border: none;
11825
- color: rgba(148,163,184,0.22);
11826
- cursor: pointer;
11827
- font-size: 10px;
11828
- padding: 0;
11829
- line-height: 1;
11830
- transition: color 0.12s ease;
11831
- display: none;
11832
- }
11833
- .stg-mx-profile-head:hover .stg-mx-profile-del { display: block; }
11834
- .stg-mx-profile-del:hover { color: rgba(255,82,82,0.72); }
11835
- .stg-mx-tool-count {
11836
- display: block;
11837
- font-size: 8.5px;
11838
- color: rgba(148,163,184,0.36);
11839
- font-family: 'JetBrains Mono', 'SF Mono', monospace;
11840
- margin-top: 2px;
11841
- }
11842
-
11843
- /* Toggle cells */
11844
- .stg-mx-cell {
11845
- text-align: center;
11846
- padding: 6px 0;
11847
- cursor: pointer;
11848
- border-bottom: 1px solid rgba(148,163,184,0.03);
11849
- transition: background 0.18s ease;
11850
- }
11851
- .stg-mx-cell:hover {
11852
- background: rgba(148,163,184,0.04);
11853
- }
11854
- .stg-mx-toggle {
11855
- display: inline-block;
11856
- width: 16px;
11857
- height: 16px;
11858
- border-radius: 4px;
11859
- border: 1.5px solid rgba(148,163,184,0.12);
11860
- background: rgba(255,255,255,0.01);
11861
- position: relative;
11862
- transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
11863
- }
11864
- .stg-mx-toggle.on {
11865
- background: rgba(148,163,184,0.14);
11866
- border-color: rgba(148,163,184,0.32);
11867
- box-shadow: 0 0 8px rgba(148,163,184,0.08), inset 0 0 4px rgba(148,163,184,0.06);
11868
- }
11869
- .stg-mx-toggle.on::after {
11870
- content: '';
11871
- position: absolute;
11872
- top: 3px;
11873
- left: 3px;
11874
- width: 7px;
11875
- height: 4px;
11876
- border-left: 1.5px solid rgba(226,232,240,0.82);
11877
- border-bottom: 1.5px solid rgba(226,232,240,0.82);
11878
- transform: rotate(-45deg);
11879
- transform-origin: center;
11880
- }
11881
- .stg-mx-cell:hover .stg-mx-toggle:not(.on) {
11882
- border-color: rgba(148,163,184,0.24);
11883
- background: rgba(148,163,184,0.04);
11884
- }
11885
- .stg-mx-cell:active .stg-mx-toggle {
11886
- transform: scale(0.9);
11887
- }
11888
-
11889
- /* Add profile column (sticky right) */
11890
- .stg-mx-add-th, .stg-mx-add-spacer {
11891
- position: sticky;
11892
- right: 0;
11893
- z-index: 4;
11894
- 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%);
11895
- }
11896
- .stg-mx-add-th {
11897
- padding: 4px 6px 4px;
11898
- text-align: center;
11899
- vertical-align: bottom;
11900
- min-width: 34px;
11901
- border-bottom: 1px solid rgba(148,163,184,0.06);
11902
- }
11903
- .stg-mx-add-btn {
11904
- background: rgba(148,163,184,0.08);
11905
- border: 1px dashed rgba(148,163,184,0.18);
11906
- color: rgba(148,163,184,0.42);
11907
- cursor: pointer;
11908
- width: 28px;
11909
- height: 28px;
11910
- border-radius: 50%;
11911
- font-size: 15px;
11912
- line-height: 1;
11913
- display: inline-flex;
11914
- align-items: center;
11915
- justify-content: center;
11916
- box-shadow: inset 0 1px 0 rgba(255,255,255,0.03);
11917
- transition: all 0.15s ease;
11918
- }
11919
- .stg-mx-add-btn:hover {
11920
- background: rgba(148,163,184,0.12);
11921
- border-color: rgba(148,163,184,0.26);
11922
- color: rgba(255,255,255,0.62);
11923
- transform: translateY(-1px);
11924
- }
11925
- .stg-mx-add-spacer {
11926
- min-width: 34px;
11927
- border-bottom: 1px solid rgba(148,163,184,0.04);
11928
- }
11929
- .stg-mx-inline-input {
11930
- width: 64px;
11931
- padding: 5px 7px;
11932
- font-size: 10px;
11933
- background: rgba(0,0,0,0.3);
11934
- border: 1px solid rgba(148,163,184,0.2);
11935
- border-radius: 8px;
11936
- color: rgba(255,255,255,0.8);
11937
- outline: none;
11938
- font-family: inherit;
11939
- }
11940
- .stg-mx-inline-input:focus { border-color: rgba(148,163,184,0.4); }
11941
-
11942
- /* Shared small actions */
11943
- .stg-mx-srv-del {
11944
- background: none;
11945
- border: none;
11946
- color: rgba(148,163,184,0.24);
11947
- cursor: pointer;
11948
- font-size: 12px;
11949
- padding: 0 2px;
11950
- line-height: 1;
11951
- transition: color 0.12s ease;
11952
- flex-shrink: 0;
11953
- }
11954
- .stg-mx-srv-del:hover { color: rgba(255,82,82,0.72); }
11955
-
11956
- /* Always-on footer */
11957
- .stg-mcp-section-header {
11958
- display: block;
11959
- font-size: 9.5px;
11960
- text-transform: uppercase;
11961
- letter-spacing: 0.09em;
11962
- color: rgba(148,163,184,0.46);
11963
- font-weight: 700;
11964
- margin-bottom: 6px;
11965
- }
11966
- .stg-mx-always-on-row {
11967
- display: flex;
11968
- flex-wrap: wrap;
11969
- gap: 6px;
11970
- }
11971
- .stg-mx-always-chip {
11972
- display: inline-flex;
11973
- align-items: center;
11974
- gap: 5px;
11975
- padding: 3px 8px;
11976
- border-radius: 5px;
11977
- font-size: 10px;
11978
- font-weight: 600;
11979
- background: rgba(148,163,184,0.05);
11980
- border: 1px solid rgba(148,163,184,0.07);
11981
- box-shadow: inset 0 1px 0 rgba(255,255,255,0.02);
11982
- color: rgba(203,213,225,0.54);
11983
- user-select: none;
11984
- }
11985
-
11986
- /* External server list below matrix */
11987
- #stg-mcp-ext-servers {
11988
- display: flex;
11989
- flex-direction: column;
11990
- gap: 10px;
11991
- }
11992
- .stg-mx-ext-row {
11993
- padding: 10px 11px;
11994
- border: 1px solid rgba(148,163,184,0.08);
11995
- border-radius: 12px;
11996
- background:
11997
- linear-gradient(180deg, rgba(255,255,255,0.018) 0%, rgba(255,255,255,0.008) 100%),
11998
- rgba(255,255,255,0.012);
11999
- box-shadow: inset 0 1px 0 rgba(255,255,255,0.025);
12000
- }
12001
- .stg-mx-ext-main {
12002
- display: flex;
12003
- align-items: center;
12004
- gap: 10px;
12005
- }
12006
- .stg-mx-ext-dot {
12007
- width: 6px;
12008
- height: 6px;
12009
- border-radius: 50%;
12010
- background: rgba(148,163,184,0.52);
12011
- flex-shrink: 0;
12012
- }
12013
- .stg-mx-ext-copy {
12014
- flex: 1;
12015
- min-width: 0;
12016
- }
12017
- .stg-mx-ext-head {
12018
- display: flex;
12019
- align-items: center;
12020
- gap: 8px;
12021
- flex-wrap: wrap;
12022
- }
12023
- .stg-mx-ext-name {
12024
- font-size: 11.5px;
12025
- font-weight: 600;
12026
- color: rgba(255,255,255,0.72);
11931
+ color: rgba(255,255,255,0.72);
12027
11932
  }
12028
11933
  .stg-mx-ext-type {
12029
11934
  display: inline-flex;
@@ -12046,46 +11951,6 @@
12046
11951
  .stg-mx-ext-remove {
12047
11952
  margin-left: auto;
12048
11953
  }
12049
- .stg-mx-ext-profiles {
12050
- display: flex;
12051
- flex-wrap: wrap;
12052
- gap: 6px;
12053
- margin-top: 9px;
12054
- }
12055
- .stg-mx-ext-toggle {
12056
- display: inline-flex;
12057
- align-items: center;
12058
- justify-content: center;
12059
- min-height: 28px;
12060
- padding: 0 10px;
12061
- border-radius: 999px;
12062
- border: 1px solid rgba(148,163,184,0.1);
12063
- background: rgba(255,255,255,0.02);
12064
- color: rgba(255,255,255,0.5);
12065
- cursor: pointer;
12066
- transition: background 0.15s ease, border-color 0.15s ease, color 0.15s ease, box-shadow 0.15s ease;
12067
- }
12068
- .stg-mx-ext-toggle:hover {
12069
- background: rgba(148,163,184,0.055);
12070
- border-color: rgba(148,163,184,0.16);
12071
- color: rgba(255,255,255,0.68);
12072
- }
12073
- .stg-mx-ext-toggle.on {
12074
- background: rgba(148,163,184,0.11);
12075
- border-color: rgba(148,163,184,0.24);
12076
- box-shadow: inset 0 1px 0 rgba(255,255,255,0.03);
12077
- color: rgba(226,232,240,0.84);
12078
- }
12079
- .stg-mx-ext-toggle-name {
12080
- max-width: 130px;
12081
- overflow: hidden;
12082
- text-overflow: ellipsis;
12083
- white-space: nowrap;
12084
- font-size: 10px;
12085
- font-weight: 600;
12086
- letter-spacing: 0.01em;
12087
- }
12088
-
12089
11954
  /* Add-server form */
12090
11955
  .stg-mcp-add-form {
12091
11956
  margin-top: 10px;
@@ -12325,7 +12190,7 @@
12325
12190
  display: none;
12326
12191
  }
12327
12192
 
12328
- /* Top-level page tabs (Profiles / Installed) inside the MCP settings page */
12193
+ /* Top-level page tabs (Default tools / Installed) inside the MCP settings page */
12329
12194
  .stg-mcp-page-tabs {
12330
12195
  display: inline-flex;
12331
12196
  gap: 2px;
@@ -14231,13 +14096,13 @@
14231
14096
  .settings-panel .settings-content :is(
14232
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,
14233
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,
14234
- .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,
14235
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,
14236
14101
  .project-storage-intro, .project-storage-stat span, .project-storage-stat strong, .project-storage-loading strong, .project-storage-loading small,
14237
14102
  .project-storage-safety-note, .project-storage-btn, .project-storage-placeholder, .project-storage-feedback,
14238
14103
  .cc-dropdown-item, .browser-cfg-range-val, .bc-profile-name, .bc-profile-divider, .stg-mcp-note strong, .stg-mcp-note span,
14239
- .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,
14240
- .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,
14241
14106
  .stg-mcp-page-tab, .cc-cheatsheet-table code, .wa-mode-notes li, .recall-control-scale span,
14242
14107
  select option
14243
14108
  ) { font-size: 12px; }
@@ -14253,8 +14118,7 @@
14253
14118
  Census: tools/literals.js contrast(). Dimmed-by-state text (disabled buttons, hidden models, a provider that is
14254
14119
  not connected) and buttons drawn on a gradient are the exceptions, recorded in SPEC.md. */
14255
14120
  .settings-panel .settings-content :is(
14256
- .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,
14257
- .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,
14258
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,
14259
14123
  .stg-callout-note, .project-storage-path, .project-storage-item-meta, .project-storage-protection, .project-storage-group-path, .project-storage-group-total,
14260
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,
@@ -14338,11 +14202,6 @@
14338
14202
  .stg-mcp-note strong { font-size: 9px; }
14339
14203
  .stg-mcp-note span { font-size: 10.5px; }
14340
14204
  .stg-mcp-section-head { align-items: flex-start; flex-direction: column; gap: 6px; }
14341
- .stg-mcp-matrix-wrap::after { left: 134px; }
14342
- .stg-mx-label-th,
14343
- .stg-mx-label-td { width: 134px; min-width: 134px; }
14344
- .stg-mx-profile-th { min-width: 62px; max-width: 78px; }
14345
- .stg-mx-profile-name { max-width: 64px; font-size: 9.5px; }
14346
14205
  .stg-mcp-form-grid { grid-template-columns: 1fr; }
14347
14206
  /* Permissions — tighter items at medium width */
14348
14207
  .cc-tool-category .cc-integration-item { padding: 5px 8px; }
@@ -14377,14 +14236,8 @@
14377
14236
  .stg-toggle-row label { font-size: 11px; }
14378
14237
  .stg-mcp-note { flex-direction: column; }
14379
14238
  .stg-mcp-section-head { gap: 5px; }
14380
- .stg-mcp-matrix-wrap::after { left: 120px; }
14381
- .stg-mx-label-th,
14382
- .stg-mx-label-td { width: 120px; min-width: 120px; }
14383
- .stg-mx-corner-head { min-height: 48px; padding-bottom: 8px; }
14384
14239
  .stg-mx-ext-main { align-items: flex-start; flex-wrap: wrap; }
14385
14240
  .stg-mx-ext-remove { margin-left: 0; }
14386
- .stg-mx-ext-profiles { gap: 5px; }
14387
- .stg-mx-ext-toggle { min-height: 26px; }
14388
14241
  /* OpenCode responsive — narrow */
14389
14242
  .ocp-server-bar { flex-direction: column; align-items: stretch; gap: 8px; }
14390
14243
  .ocp-server-bar-right { justify-content: flex-start; }
@@ -14473,7 +14326,7 @@
14473
14326
 
14474
14327
  /* ── Buttons: 13px, 6px corners, a neutral fill with a hairline ── */
14475
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,
14476
- .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,
14477
14330
  .cc-enable-btn, .cc-disable-btn, .cc-remove-panel-btn, .skin-activate, .skin-remove) {
14478
14331
  min-height: 28px; padding: 4px 12px;
14479
14332
  font-family: inherit; font-size: 13px; font-weight: 400; line-height: 1.25;
@@ -14482,7 +14335,7 @@
14482
14335
  transition: background-color 0.15s ease, color 0.15s ease;
14483
14336
  }
14484
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,
14485
- .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,
14486
14339
  .cc-enable-btn, .cc-disable-btn, .cc-remove-panel-btn, .skin-activate, .skin-remove):hover:not(:disabled) {
14487
14340
  color: #fff; background: var(--stg-control-hover); border-color: var(--stg-field-line); transform: none;
14488
14341
  }
@@ -14562,11 +14415,11 @@
14562
14415
  .settings-panel .settings-content .stg-badge-warn { color: var(--stg-warn); }
14563
14416
  .settings-panel .settings-content .stg-badge-err { color: var(--stg-err); }
14564
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; }
14565
- /* toggle chips (a skill's targets, a server's profiles): small 6px-corner buttons, the accent when on */
14566
- .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) {
14567
14420
  border-radius: 6px; font-size: 12px; letter-spacing: 0;
14568
14421
  }
14569
- .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; }
14570
14423
 
14571
14424
  /* Boxes inside a group (callouts, server bars, choice cards): one radius, a hairline, no tint or glow */
14572
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,
@@ -14711,6 +14564,7 @@
14711
14564
  }
14712
14565
  .settings-panel .stg-card-status .ocp-status-dot[data-state="ok"] { background: var(--stg-ok); }
14713
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); }
14714
14568
  .settings-panel .stg-card-status .ocp-status-dot[data-state="err"] { background: var(--stg-err); }
14715
14569
  .settings-panel .stg-card-status .ocp-server-bar-status { font-size: 12px; font-weight: 400; color: var(--stg-help); }
14716
14570
 
@@ -14934,17 +14788,8 @@
14934
14788
  min-width: 0; padding: 0; overflow-wrap: anywhere;
14935
14789
  font-family: var(--ff-mono, 'JetBrains Mono', 'SF Mono', monospace); font-size: 12px; color: var(--stg-text);
14936
14790
  }
14937
- .settings-panel .settings-content .stg-tool-row .stg-tool-select {
14938
- appearance: none; -webkit-appearance: none; flex-shrink: 0;
14939
- width: 110px; min-height: 24px; padding: 2px 24px 2px 9px;
14940
- font-family: var(--stg-font); font-size: 13px; line-height: 1.3; color: var(--stg-text);
14941
- background-color: var(--stg-control);
14942
- 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");
14943
- background-repeat: no-repeat; background-position: right 8px center; background-size: 8px 12px;
14944
- border: 1px solid var(--stg-field-line); border-radius: 6px; box-shadow: none; cursor: pointer;
14945
- }
14946
- .settings-panel .settings-content .stg-tool-row .stg-tool-select:hover { background-color: var(--stg-control-hover); }
14947
- .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; }
14948
14793
 
14949
14794
  /* H. History: label and help, the size as secondary text, the clear button */
14950
14795
  .settings-panel .settings-content .ocp-danger-row { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 16px; }
@@ -15038,12 +14883,11 @@
15038
14883
  /* every row label is regular weight; titles above groups keep the semibold */
15039
14884
  .settings-panel .settings-content :is(.stg-field > label, .stg-toggle-label, .settings-field > label, .cc-integration-label, .cli-path-label, .recall-control-label,
15040
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,
15041
- .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,
15042
14887
  .stg-model-toggle-name, .stg-tool-name, .project-storage-item-title-row strong, .bc-profile-name) { font-weight: 400; }
15043
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); }
15044
14889
  /* sub-headings inside a group, the names on choice cards and the matrix headers: medium, never bold */
15045
- .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,
15046
- .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; }
15047
14891
  .settings-panel .settings-content :is(strong, b) { font-weight: 500; }
15048
14892
  .settings-panel .settings-content :is([style*="font-weight:600"], [style*="font-weight: 600"], [style*="font-weight:700"], [style*="font-weight: 700"],
15049
14893
  [style*="font-weight:650"], [style*="font-weight: 650"]) { font-weight: 500 !important; }
@@ -15080,9 +14924,9 @@
15080
14924
 
15081
14925
  /* ── Push button: 22px, 12px / 500, 5px corners, a faint fill and a hairline. Nothing in the panel is bigger. ── */
15082
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,
15083
- .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,
15084
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,
15085
- .stg-mx-ext-toggle, .cc-skill-target),
14929
+ .cc-skill-target),
15086
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),
15087
14931
  .settings-panel .settings-content .ocp-server-bar .ocp-srv-btn,
15088
14932
  .settings-panel .settings-content .stg-provider-card .stg-action-btn.compact,
@@ -15096,9 +14940,9 @@
15096
14940
  cursor: pointer; transition: background-color 0.15s ease, color 0.15s ease;
15097
14941
  }
15098
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,
15099
- .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,
15100
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,
15101
- .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; }
15102
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; }
15103
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,
15104
14948
  .project-storage-btn, .skin-upload-btn, .gfx-reset-btn, .stg-push-btn, .db-reindex-btn) svg { width: 12px; height: 12px; flex-shrink: 0; }
@@ -15106,15 +14950,15 @@
15106
14950
  .settings-panel .settings-content :is(.stg-save-btn, .wa-btn-accent, .wa-primary, .bc-action-save),
15107
14951
  .settings-panel .stg-pane-actions .bc-action-btn.bc-action-save { color: #fff; background: var(--stg-accent-fill); border-color: transparent; }
15108
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; }
15109
- /* toggle chips (a skill's targets, a server's profiles, a category's "All"): the push button, filled when on */
15110
- .settings-panel .settings-content :is(.cc-skill-target, .stg-mx-ext-toggle, .cc-tool-category-all) { padding: 0 8px; font-weight: 400; }
15111
- .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; }
15112
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); }
15113
14957
  .settings-panel .settings-content :is(.wa-btn-danger, .project-storage-btn.danger, .cc-remove-panel-btn):hover:not(:disabled) { color: var(--stg-err); }
15114
14958
  .settings-panel .settings-content .cc-trust-btn { color: var(--stg-warn); }
15115
14959
  .settings-panel .settings-content :is(button, .stg-action-btn):disabled { opacity: 0.45; cursor: default; }
15116
14960
  /* icon-only buttons: 22×22 */
15117
- .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),
15118
14962
  .settings-panel .settings-content .ocp-server-bar .ocp-srv-btn.ocp-srv-btn-icon,
15119
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; }
15120
14964
  .settings-panel .settings-content :is(.ocp-srv-btn-icon, .settings-toggle-vis, .discord-eye-btn) svg { width: 12px; height: 12px; }
@@ -15263,8 +15107,7 @@
15263
15107
  .settings-panel :is(.stg-dropdown, .bc-dropdown) .cc-dropdown-item { padding: 3px 9px; font-size: 12px; }
15264
15108
  .settings-panel .settings-content .cc-dropdown-item { font-size: 12px; }
15265
15109
  .settings-panel .settings-content select,
15266
- .settings-panel .settings-content .stg-card select.stg-input,
15267
- .settings-panel .settings-content .stg-tool-row .stg-tool-select {
15110
+ .settings-panel .settings-content .stg-card select.stg-input {
15268
15111
  appearance: none; -webkit-appearance: none;
15269
15112
  height: 22px; min-height: 22px; box-sizing: border-box; width: auto; min-width: 110px; padding: 0 22px 0 8px;
15270
15113
  font-family: var(--stg-font); font-size: 12px; line-height: 20px; color: var(--stg-text);
@@ -15273,7 +15116,6 @@
15273
15116
  background-repeat: no-repeat; background-position: right 7px center; background-size: 7px 10px;
15274
15117
  border: 1px solid rgba(255,255,255,0.10); border-radius: 5px; box-shadow: none; cursor: pointer;
15275
15118
  }
15276
- .settings-panel .settings-content .stg-tool-row .stg-tool-select { width: 110px; }
15277
15119
  /* controls that carry their old size inline (AI decisions, Automations): the scale wins */
15278
15120
  .settings-panel .settings-content select[style] {
15279
15121
  height: 22px !important; padding: 0 22px 0 8px !important; line-height: 20px !important;
@@ -15385,6 +15227,8 @@
15385
15227
  .settings-panel .settings-content .uc-save-status { margin: 0 0 8px; max-width: none; color: var(--stg-err); }
15386
15228
  .settings-panel .settings-content .uc-applies { margin: 0 0 2px; max-width: none; }
15387
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; }
15388
15232
  .settings-panel .settings-content .uc-digest { margin: 14px 0 16px; }
15389
15233
  /* Settings → Automations → Greeting: the preview is the card every panel shows (shared/greeting/), set left in the section. */
15390
15234
  .settings-panel .settings-content .gr-preview { margin-bottom: 4px; }
@@ -16205,7 +16049,7 @@
16205
16049
  color: var(--t-dimmed);
16206
16050
  flex-shrink: 0;
16207
16051
  }
16208
- .explorer-memory[draggable="true"] { cursor: grab; }
16052
+ .explorer-memory[draggable="true"] { cursor: move; }
16209
16053
  .explorer-memory.dragging { opacity: 0.4; }
16210
16054
 
16211
16055
  /* Label — truncated */
@@ -16383,7 +16227,7 @@
16383
16227
  font-size: 11px;
16384
16228
  text-align: center;
16385
16229
  color: rgba(255,255,255,0.15);
16386
- cursor: grab;
16230
+ cursor: move;
16387
16231
  opacity: 0;
16388
16232
  transition: opacity 0.15s;
16389
16233
  flex-shrink: 0;
@@ -17019,7 +16863,7 @@
17019
16863
  outline-offset: -1px;
17020
16864
  border-radius: 4px;
17021
16865
  }
17022
- .fe-tree--dragging .fe-row { cursor: grabbing; }
16866
+ .fe-tree--dragging .fe-row { cursor: move; }
17023
16867
 
17024
16868
  /* Chevron */
17025
16869
  .fe-chevron {
@@ -17685,12 +17529,14 @@
17685
17529
  --ed-menu-hover: var(--s-hover);
17686
17530
  --ed-menu-radius: 8px;
17687
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 */
17688
17533
  position: fixed;
17689
- top: var(--navbar-height, 48px);
17690
- left: calc(var(--sidebar-total-width, 0px));
17691
- 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)));
17692
17537
  margin-right: var(--right-panel-gap, var(--claude-panel-gap, 0px));
17693
- height: calc(100dvh - var(--navbar-height, 48px));
17538
+ height: calc(100dvh - var(--frame-top) - var(--frame-gap));
17539
+ border-radius: var(--frame-radius);
17694
17540
  z-index: 198;
17695
17541
  display: flex;
17696
17542
  flex-direction: column;
@@ -18418,7 +18264,7 @@
18418
18264
  /* ── Multi-select bar (shared) ── */
18419
18265
  #multi-select-bar {
18420
18266
  position: fixed;
18421
- top: 62px;
18267
+ top: calc(var(--frame-top) + 6px); /* 62px under the 48px bar, inside the app frame under a taller one */
18422
18268
  left: calc(var(--sidebar-total-width, 0px) + (100% - var(--sidebar-total-width, 0px) - var(--right-panel-width, var(--claude-panel-width, 0px))) / 2);
18423
18269
  transform: translateX(-50%);
18424
18270
  transition: left 0.3s cubic-bezier(0.22, 1, 0.36, 1);
@@ -18997,7 +18843,7 @@
18997
18843
  border-radius: 6px;
18998
18844
  background: hsla(210, 20%, 20%, 0.35);
18999
18845
  border: 1px solid transparent;
19000
- cursor: grab;
18846
+ cursor: move;
19001
18847
  transition: background 0.15s, border-color 0.15s;
19002
18848
  }
19003
18849
  .awiz-rule-item:hover { background: hsla(210, 20%, 25%, 0.45); }
@@ -19011,7 +18857,7 @@
19011
18857
  .awiz-rule-grip {
19012
18858
  font-size: 16px;
19013
18859
  color: var(--t-faint);
19014
- cursor: grab;
18860
+ cursor: move;
19015
18861
  user-select: none;
19016
18862
  line-height: 1;
19017
18863
  }
@@ -19202,1170 +19048,1171 @@
19202
19048
  }
19203
19049
 
19204
19050
  /* ══════════════════════════════════════════════
19205
- SKILLS STUDIO PANEL
19206
- ══════════════════════════════════════════════ */
19207
-
19208
- /* Disable native tooltips in Skills Studio — use custom tooltips */
19209
- .skills-studio-panel [data-tooltip] {
19210
- position: relative;
19211
- }
19212
- /* Hide title attribute tooltips on any element within Skills Studio */
19213
- .skills-studio-panel [title] {
19214
- position: relative;
19215
- }
19216
-
19217
-
19218
- .skills-studio-panel {
19219
- --accent-hue: 215;
19220
- --accent-saturation: 16%;
19221
- --accent-lightness: 65%;
19222
- position: fixed; z-index: 300000;
19223
- width: 900px; max-width: 95vw; min-width: 380px;
19224
- height: 520px; max-height: 88vh; min-height: 320px;
19225
- display: flex; flex-direction: column;
19226
- overflow: hidden;
19227
- opacity: 0; transform: scale(0.97);
19228
- transition: opacity 0.15s ease, transform 0.15s ease;
19229
- container-type: inline-size;
19230
- container-name: ss;
19231
- }
19232
- .skills-studio-panel.open { opacity: 1; transform: scale(1); }
19233
-
19234
- /* ── Header ── */
19235
- .ss-header {
19236
- display: flex; align-items: center; gap: 10px;
19237
- padding: 8px 14px;
19238
- border-bottom: 1px solid rgba(255,255,255,0.04);
19239
- background: linear-gradient(to bottom, rgba(255,255,255,0.025), transparent);
19240
- flex-shrink: 0; user-select: none;
19241
- }
19242
- .ss-header-left {
19243
- display: flex; align-items: center; gap: 8px; flex: 1; min-width: 0;
19244
- }
19245
- .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; }
19246
- .ss-count {
19247
- font-size: 10px; color: rgba(255,255,255,0.35);
19248
- background: rgba(255,255,255,0.02); padding: 2px 8px; border-radius: var(--r-pill);
19249
- font-weight: 500; letter-spacing: 0.02em;
19250
- border: 1px solid rgba(255,255,255,0.05);
19251
- }
19252
- .ss-header-actions { display: flex; gap: 6px; flex-shrink: 0; }
19253
- .ss-header-btn {
19254
- padding: 5px 12px; border-radius: 8px;
19255
- font-size: var(--fs-xs); font-weight: 500;
19256
- background: transparent; border: 1px solid transparent;
19257
- color: var(--t-secondary); cursor: pointer;
19258
- transition: all 0.15s ease;
19259
- letter-spacing: 0.01em;
19260
- }
19261
- .ss-header-btn:hover {
19262
- background: rgba(255,255,255,0.06);
19263
- color: var(--t-bright);
19264
- border-color: rgba(255,255,255,0.08);
19265
- }
19266
- .ss-header-btn:active {
19267
- background: rgba(255,255,255,0.1);
19268
- }
19269
- .ss-header-btn:disabled { opacity: 0.3; cursor: default; pointer-events: none; }
19270
- .ss-close {
19271
- width: 26px; height: 26px; display: flex; align-items: center; justify-content: center;
19272
- font-size: 16px; color: var(--t-muted); background: none; border: none;
19273
- cursor: pointer; border-radius: 8px; flex-shrink: 0;
19274
- transition: all 0.15s ease;
19275
- }
19276
- .ss-close:hover { background: rgba(255,82,82,0.1); color: rgba(255,100,100,0.9); }
19277
-
19278
-
19279
- /* ── Body layout ── */
19280
- .ss-body { display: flex; flex: 1; min-height: 0; overflow: hidden; }
19281
-
19282
- /* ── Sidebar ── */
19283
- .ss-sidebar {
19284
- width: 300px; flex-shrink: 0;
19285
- border-right: 1px solid var(--b-subtle);
19286
- display: flex; flex-direction: column; overflow: hidden;
19287
- }
19288
- .ss-search-wrap { padding: 10px 12px 4px; }
19289
- .ss-search {
19290
- width: 100%; padding: 7px 10px;
19291
- background: rgba(255,255,255,0.04); border: 1px solid rgba(255,255,255,0.08);
19292
- border-radius: var(--r-small); font-size: var(--fs-xs);
19293
- color: var(--t-bright); outline: none;
19294
- transition: all 0.15s ease;
19295
- }
19296
- .ss-search:hover { border-color: rgba(255,255,255,0.12); }
19297
- .ss-search:focus {
19298
- border-color: rgba(148, 163, 184, 0.4);
19299
- background: rgba(148, 163, 184, 0.05);
19300
- box-shadow: 0 0 0 2px rgba(148, 163, 184, 0.08);
19301
- }
19302
- .ss-search::placeholder { color: var(--t-faint); }
19303
- .ss-filters {
19304
- display: flex; gap: 5px; padding: 8px 10px; flex-wrap: wrap;
19305
- }
19306
- .ss-filter {
19307
- display: inline-flex; align-items: center; gap: 5px;
19308
- padding: 4px 10px; border-radius: var(--r-pill);
19309
- font-size: 10px; font-weight: 500;
19310
- background: transparent; border: 1px solid rgba(255,255,255,0.1);
19311
- color: var(--t-muted); cursor: pointer;
19312
- transition: all 0.15s ease;
19313
- letter-spacing: 0.01em;
19314
- }
19315
- .ss-filter:hover {
19316
- border-color: rgba(255,255,255,0.16);
19317
- color: var(--t-secondary);
19318
- background: rgba(255,255,255,0.05);
19319
- }
19320
- .ss-filter.active {
19321
- background: rgba(148, 163, 184, 0.12);
19322
- border-color: rgba(148, 163, 184, 0.3);
19323
- color: rgba(148, 163, 184, 0.9);
19324
- }
19325
- /* ── Filter/type color dots ── */
19326
- .ss-filter-dot {
19327
- display: inline-block; width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0;
19328
- }
19329
- .ss-filter-dot.skill { background: hsla(210, 20%, 62%, 1); box-shadow: none; }
19330
- .ss-filter-dot.command { background: hsla(40, 25%, 58%, 1); box-shadow: none; }
19331
- .ss-filter-dot.agent { background: hsla(18, 25%, 58%, 1); box-shadow: none; }
19332
- .ss-library { flex: 1; overflow-y: auto; overflow-x: hidden; padding-bottom: 8px; }
19333
-
19334
- /* ── Library groups ── */
19335
- .ss-group { margin-top: 2px; }
19336
- .ss-group-header {
19337
- display: flex; align-items: center; gap: 6px;
19338
- padding: 8px 14px 5px; font-size: 10px; font-weight: 600;
19339
- text-transform: uppercase; letter-spacing: 0.06em;
19340
- color: var(--t-faint); user-select: none;
19341
- }
19342
- .ss-group-count {
19343
- font-size: 9px; background: var(--s-subtle);
19344
- padding: 1px 6px; border-radius: var(--r-pill); color: var(--t-muted);
19345
- font-weight: 500;
19346
- }
19347
- .ss-item {
19348
- display: flex; align-items: center; gap: 10px;
19349
- padding: 7px 14px; cursor: pointer;
19350
- border-left: 2px solid transparent;
19351
- transition: background 0.12s ease;
19352
- }
19353
- .ss-item:hover { background: var(--s-subtle); }
19354
- .ss-item.active {
19355
- background: var(--s-light);
19356
- border-left-color: hsla(var(--accent-hue, 174), 60%, 55%, 0.8);
19357
- }
19358
- .ss-item-icon {
19359
- width: 28px; height: 28px; border-radius: 7px;
19360
- display: flex; align-items: center; justify-content: center;
19361
- flex-shrink: 0; line-height: 1;
19362
- }
19363
- .ss-item-icon svg { width: 14px; height: 14px; }
19364
- .ss-item-icon.skill { background: hsla(210, 15%, 50%, 0.12); color: hsla(210, 18%, 68%, 1); }
19365
- .ss-item-icon.command { background: hsla(40, 18%, 48%, 0.12); color: hsla(40, 22%, 65%, 1); }
19366
- .ss-item-icon.agent { background: hsla(18, 18%, 48%, 0.12); color: hsla(18, 22%, 65%, 1); }
19367
- .ss-item-icon.has-custom { background: transparent; padding: 2px; }
19368
- .ss-item-custom-icon { width: 24px; height: 24px; object-fit: contain; border-radius: 4px; }
19369
- .ss-item-info { flex: 1; min-width: 0; }
19370
- .ss-item-name {
19371
- font-size: var(--fs-xs); font-weight: 600; color: var(--t-primary);
19372
- white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
19373
- display: flex; align-items: center; gap: 6px;
19374
- }
19375
- .ss-item-desc {
19376
- font-size: 10px; color: var(--t-faint); margin-top: 2px;
19377
- white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
19378
- line-height: 1.3;
19379
- }
19380
- .ss-empty { padding: 24px 16px; text-align: center; color: var(--t-muted); font-size: var(--fs-xs); }
19381
- .ss-item-name .ss-badge { font-size: 8px; padding: 1px 5px; vertical-align: middle; }
19382
-
19383
- /* ── Badges ── */
19384
- .ss-badge {
19385
- display: inline-flex; align-items: center; gap: 5px;
19386
- font-size: 10px; padding: 2px 8px; border-radius: var(--r-pill);
19387
- font-weight: 500; white-space: nowrap;
19388
- border: 1px solid transparent; letter-spacing: 0.01em;
19389
- }
19390
- .ss-badge--skill { background: hsla(210, 12%, 50%, 0.08); color: hsla(210, 16%, 65%, 1); border-color: hsla(210, 12%, 50%, 0.12); }
19391
- .ss-badge--command { background: hsla(40, 15%, 48%, 0.08); color: hsla(40, 20%, 62%, 1); border-color: hsla(40, 15%, 48%, 0.12); }
19392
- .ss-badge--agent { background: hsla(18, 15%, 48%, 0.08); color: hsla(18, 20%, 62%, 1); border-color: hsla(18, 15%, 48%, 0.12); }
19393
- .ss-badge--scope { background: var(--s-subtle); color: var(--t-muted); border-color: var(--b-subtle); }
19394
- .ss-badge--muted { background: var(--s-subtle); color: var(--t-faint); border-color: var(--b-subtle); }
19395
- .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); }
19396
-
19397
- /* ── Main area ── */
19398
- .ss-main { flex: 1; min-width: 0; overflow: hidden; display: flex; flex-direction: column; }
19399
- .ss-loading {
19400
- flex: 1; display: flex; align-items: center; justify-content: center;
19401
- color: var(--t-muted); font-size: var(--fs-sm);
19402
- }
19403
-
19404
- /* ── Welcome / overview ── */
19405
- .ss-welcome {
19406
- flex: 1; display: flex; flex-direction: column;
19407
- align-items: center; justify-content: center; gap: 16px;
19408
- padding: 48px 48px 40px; text-align: center;
19409
- background: linear-gradient(180deg, rgba(148,163,184,0.03) 0%, transparent 60%);
19410
- }
19411
- .ss-welcome-hero {
19412
- display: flex; flex-direction: column;
19413
- align-items: center; gap: 2px; position: relative;
19414
- }
19415
- .ss-welcome-logo {
19416
- width: 260px; height: auto;
19417
- opacity: 0.88;
19418
- filter: drop-shadow(0 1px 4px rgba(0, 0, 0, 0.3));
19419
- animation: ss-logo-float 3s ease-in-out infinite;
19420
- }
19421
- @keyframes ss-logo-float {
19422
- 0%, 100% { transform: translateY(0px); }
19423
- 50% { transform: translateY(-4px); }
19424
- }
19425
- .ss-welcome-hero h2 {
19426
- margin: 0;
19427
- font-family: 'Disket Mono', 'JetBrains Mono', monospace;
19428
- font-size: 1.55rem; font-weight: 600;
19429
- color: rgba(255,255,255,0.88);
19430
- letter-spacing: -0.02em; line-height: 1.2;
19431
- text-shadow: 0 1px 3px rgba(0,0,0,0.25);
19432
- }
19433
- .ss-welcome-sub {
19434
- font-family: 'JetBrains Mono', monospace;
19435
- color: rgba(255,255,255,0.35); font-size: 0.75rem; margin: 0; max-width: 380px;
19436
- line-height: 1.6; font-weight: 400; letter-spacing: 0.03em;
19437
- }
19438
- .ss-stats-row {
19439
- display: flex; gap: 0; margin-top: 16px;
19440
- animation: ss-stats-in 0.5s ease 0.2s both;
19441
- }
19442
- @keyframes ss-stats-in {
19443
- from { opacity: 0; transform: translateY(8px); }
19444
- to { opacity: 1; transform: translateY(0); }
19445
- }
19446
- .ss-stat {
19447
- display: flex; flex-direction: column; align-items: center; gap: 4px;
19448
- padding: 14px 28px; position: relative;
19449
- transition: opacity 0.2s ease;
19450
- }
19451
- .ss-stat + .ss-stat::before {
19452
- content: ''; position: absolute; left: 0; top: 18%;
19453
- width: 1px; height: 64%;
19454
- background: rgba(255,255,255,0.06);
19455
- }
19456
- .ss-stat:hover { opacity: 0.7; }
19457
- .ss-stat-num {
19458
- font-size: 26px; font-weight: 600; color: rgba(255,255,255,0.85);
19459
- letter-spacing: -0.02em; line-height: 1;
19460
- font-family: 'JetBrains Mono', monospace;
19461
- }
19462
- .ss-stat-label {
19463
- display: inline-flex; align-items: center; gap: 5px;
19464
- font-size: 10px; color: rgba(255,255,255,0.38); font-weight: 500;
19465
- text-transform: uppercase; letter-spacing: 1.2px;
19466
- }
19467
- .ss-welcome-hint {
19468
- color: rgba(255,255,255,0.35); font-size: 12px; margin-top: 8px;
19469
- font-weight: 400; letter-spacing: 0.01em;
19470
- }
19471
-
19472
- /* ── Editor header ── */
19473
- .ss-editor-header {
19474
- display: flex; align-items: center; gap: 8px;
19475
- padding: 8px 14px; border-bottom: 1px solid rgba(255,255,255,0.04);
19476
- background: linear-gradient(to bottom, rgba(255,255,255,0.02), transparent);
19477
- flex-shrink: 0;
19478
- }
19479
- .ss-back-btn {
19480
- padding: 3px 10px; border-radius: var(--r-button);
19481
- font-size: var(--fs-xs); background: none; border: 1px solid var(--b-subtle);
19482
- color: var(--t-muted); cursor: pointer; transition: all 0.15s ease;
19483
- }
19484
- .ss-back-btn:hover { border-color: var(--b-light); color: var(--t-secondary); }
19485
- .ss-editor-name { font-family: var(--ff-heading); font-size: var(--fs-sm); font-weight: 600; color: var(--t-bright); letter-spacing: 0.02em; }
19486
- .ss-editor-spacer { flex: 1; }
19487
- .ss-save-btn.dirty {
19488
- background: hsla(var(--accent-hue, 174), 50%, 42%, 0.15) !important;
19489
- border-color: hsla(var(--accent-hue, 174), 50%, 45%, 0.35) !important;
19490
- color: hsla(var(--accent-hue, 174), 60%, 60%, 1) !important;
19491
- box-shadow: none;
19492
- }
19493
- .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); }
19494
- .ss-delete-btn { color: var(--t-faint); }
19495
- .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; }
19496
- .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); }
19497
- .ss-install-btn { background: hsla(140, 35%, 40%, 0.1); border-color: hsla(140, 35%, 40%, 0.18); color: hsla(140, 45%, 62%, 1); }
19498
- .ss-install-btn:hover { background: hsla(140, 35%, 40%, 0.18); border-color: hsla(140, 35%, 40%, 0.25); }
19499
-
19500
- /* ── Editor body (2-column) ── */
19501
- .ss-editor-body { display: flex; flex: 1; min-height: 0; overflow: hidden; }
19502
- .ss-editor-meta {
19503
- width: 250px; flex-shrink: 0;
19504
- border-right: 1px solid var(--b-subtle);
19505
- overflow-y: auto; padding: 12px;
19506
- display: flex; flex-direction: column; gap: 2px;
19507
- }
19508
- .ss-editor-content { flex: 1; display: flex; flex-direction: column; min-width: 0; }
19509
- .ss-content-toolbar {
19510
- display: flex; align-items: center; justify-content: space-between;
19511
- padding: 5px 12px; border-bottom: 1px solid var(--b-subtle);
19512
- flex-shrink: 0;
19513
- }
19514
- .ss-content-label { font-size: 10px; color: var(--t-faint); text-transform: uppercase; letter-spacing: 0.5px; }
19515
- .ss-wrap-btn {
19516
- font-size: 10px; padding: 2px 8px; border-radius: var(--r-pill);
19517
- background: none; border: 1px solid var(--b-subtle);
19518
- color: var(--t-muted); cursor: pointer;
19519
- transition: all 0.15s ease;
19520
- }
19521
- .ss-wrap-btn:hover { border-color: var(--b-light); color: var(--t-secondary); }
19522
- .ss-md-editor {
19523
- flex: 1; background: rgba(0,0,0,0.15); border: none; border-radius: 0;
19524
- padding: 12px 14px;
19525
- font-family: 'JetBrains Mono', 'SF Mono', 'Consolas', monospace;
19526
- font-size: 12px; line-height: 1.65; color: var(--t-bright);
19527
- resize: none; outline: none; tab-size: 2;
19528
- white-space: pre; overflow-wrap: normal; overflow-x: auto;
19529
- }
19530
- .ss-md-editor.wrap { white-space: pre-wrap; overflow-wrap: break-word; overflow-x: hidden; }
19531
-
19532
- /* ── Markdown toolbar ── */
19533
- .ss-md-toolbar {
19534
- display: flex; align-items: center; gap: 1px;
19535
- padding: 3px 6px; border-bottom: 1px solid var(--b-subtle);
19536
- background: rgba(0,0,0,0.08); flex-shrink: 0;
19537
- }
19538
- .ss-md-toolbar-sep {
19539
- width: 1px; height: 16px; background: var(--b-subtle); margin: 0 4px;
19540
- }
19541
- .ss-md-tool {
19542
- width: 26px; height: 24px; display: flex; align-items: center; justify-content: center;
19543
- background: none; border: 1px solid transparent; border-radius: var(--r-small);
19544
- color: var(--t-muted); cursor: pointer; font-size: 13px; padding: 0;
19545
- transition: all 0.12s ease; font-weight: 600;
19546
- }
19547
- .ss-md-tool:hover { background: var(--s-hover); border-color: var(--b-subtle); color: var(--t-bright); }
19548
- .ss-md-tool:active { background: var(--s-light); }
19549
- .ss-md-tool svg { width: 14px; height: 14px; stroke: currentColor; fill: none; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }
19550
- .ss-md-tool[data-active="true"] { background: var(--s-light); color: var(--t-bright); border-color: var(--b-light); }
19551
-
19552
- /* ── Preview/Raw toggle in toolbar ── */
19553
- .ss-view-toggle {
19554
- display: flex; margin-left: auto; border: 1px solid var(--b-subtle); border-radius: var(--r-small); overflow: hidden;
19555
- }
19556
- .ss-view-toggle-btn {
19557
- padding: 2px 10px; font-size: 10px; font-weight: 500;
19558
- background: none; border: none; color: var(--t-muted);
19559
- cursor: pointer; transition: all 0.12s ease;
19560
- text-transform: uppercase; letter-spacing: 0.3px;
19561
- }
19562
- .ss-view-toggle-btn:hover { color: var(--t-secondary); }
19563
- .ss-view-toggle-btn.active {
19564
- background: var(--s-light); color: var(--t-bright);
19565
- }
19566
-
19567
- /* ── Markdown preview pane ── */
19568
- .ss-md-preview {
19569
- flex: 1; padding: 16px 18px; overflow-y: auto;
19570
- font-family: inherit; font-size: 13px; line-height: 1.7;
19571
- color: var(--t-primary); display: none;
19572
- }
19573
- .ss-md-preview.visible { display: block; }
19574
- .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); }
19575
- .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); }
19576
- .ss-md-preview h3 { font-size: 14px; font-weight: 600; color: var(--t-bright); margin: 16px 0 6px; }
19577
- .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; }
19578
- .ss-md-preview p { margin: 0 0 10px; }
19579
- .ss-md-preview ul, .ss-md-preview ol { margin: 0 0 10px; padding-left: 22px; }
19580
- .ss-md-preview li { margin-bottom: 4px; }
19581
- .ss-md-preview strong { font-weight: 600; color: var(--t-bright); }
19582
- .ss-md-preview em { font-style: italic; color: var(--t-secondary); }
19583
- .ss-md-preview code {
19584
- font-family: 'JetBrains Mono', monospace; font-size: 11.5px;
19585
- background: rgba(0,0,0,0.25); padding: 2px 5px; border-radius: 3px;
19586
- color: hsla(var(--accent-hue, 174), 50%, 72%, 1);
19587
- }
19588
- .ss-md-preview pre {
19589
- background: rgba(0,0,0,0.3); border: 1px solid var(--b-subtle);
19590
- border-radius: var(--r-small); padding: 12px 14px; margin: 8px 0 12px;
19591
- overflow-x: auto;
19592
- }
19593
- .ss-md-preview pre code { background: none; padding: 0; color: var(--t-primary); font-size: 11.5px; }
19594
- .ss-md-preview blockquote {
19595
- border-left: 3px solid hsla(var(--accent-hue, 174), 50%, 55%, 0.4);
19596
- margin: 8px 0; padding: 4px 14px; color: var(--t-muted); font-style: italic;
19597
- }
19598
- .ss-md-preview a { color: hsla(var(--accent-hue, 174), 60%, 65%, 1); text-decoration: none; }
19599
- .ss-md-preview a:hover { text-decoration: underline; }
19600
- .ss-md-preview hr { border: none; border-top: 1px solid var(--b-subtle); margin: 16px 0; }
19601
- .ss-md-preview table { border-collapse: collapse; width: 100%; margin: 8px 0 12px; font-size: 12px; }
19602
- .ss-md-preview th, .ss-md-preview td { padding: 6px 10px; border: 1px solid var(--b-subtle); text-align: left; }
19603
- .ss-md-preview th { background: rgba(0,0,0,0.15); font-weight: 600; color: var(--t-bright); }
19604
- .ss-md-preview img { max-width: 100%; border-radius: var(--r-small); }
19605
-
19606
- /* ── Mermaid diagrams ── */
19607
- .ss-mermaid {
19608
- margin: 12px 0; padding: 16px;
19609
- background: rgba(0,0,0,0.12); border: 1px solid var(--b-subtle);
19610
- border-radius: var(--r-base); overflow-x: auto; text-align: center;
19611
- }
19612
- .ss-mermaid svg { max-width: 100%; height: auto; }
19613
- .ss-mermaid-loading { font-size: 11px; color: var(--t-muted); font-style: italic; }
19614
- .ss-mermaid-error { font-size: 11px; color: #f87171; margin-bottom: 8px; }
19615
- .ss-mermaid-src {
19616
- text-align: left; font-size: 11px; padding: 8px; margin: 4px 0 0;
19617
- background: rgba(0,0,0,0.2); border-radius: var(--r-small);
19618
- color: var(--t-muted); white-space: pre-wrap; overflow-x: auto;
19619
- }
19620
-
19621
- /* ── Metadata form ── */
19622
- .ss-meta-section { display: flex; flex-direction: column; gap: 12px; }
19623
- .ss-field { display: flex; flex-direction: column; gap: 3px; }
19624
- .ss-field > label {
19625
- font-size: 10px; font-weight: 600; color: var(--t-muted);
19626
- text-transform: uppercase; letter-spacing: 0.4px;
19627
- }
19628
- .ss-field-hint { font-weight: 400; text-transform: none; letter-spacing: 0; opacity: 0.6; }
19629
-
19630
- /* ── Icon upload widget ── */
19631
- .ss-icon-field { margin-bottom: 2px; }
19632
- .ss-icon-upload { display: flex; align-items: center; gap: 10px; }
19633
- .ss-icon-preview {
19634
- width: 40px; height: 40px; border-radius: 8px;
19635
- border: 1px dashed var(--b-light);
19636
- display: flex; align-items: center; justify-content: center;
19637
- overflow: hidden; flex-shrink: 0; background: var(--s-subtle);
19638
- }
19639
- .ss-icon-preview-img { width: 100%; height: 100%; object-fit: contain; }
19640
- .ss-icon-placeholder {
19641
- display: flex; align-items: center; justify-content: center;
19642
- width: 100%; height: 100%; opacity: 0.4;
19643
- }
19644
- .ss-icon-placeholder svg { width: 18px; height: 18px; }
19645
- .ss-icon-placeholder.skill { color: hsla(210, 18%, 65%, 1); }
19646
- .ss-icon-placeholder.command { color: hsla(40, 22%, 62%, 1); }
19647
- .ss-icon-placeholder.agent { color: hsla(18, 22%, 62%, 1); }
19648
- .ss-icon-actions { display: flex; flex-direction: column; gap: 4px; }
19649
- .ss-icon-upload-btn {
19650
- font-size: 10px; padding: 3px 10px;
19651
- background: var(--s-subtle); border: 1px solid var(--b-light);
19652
- border-radius: var(--r-small); color: var(--t-secondary);
19653
- cursor: pointer; text-align: center;
19654
- transition: background 0.15s, color 0.15s;
19655
- }
19656
- .ss-icon-upload-btn:hover { background: var(--s-light); color: var(--t-bright); }
19657
- .ss-icon-remove-btn {
19658
- font-size: 10px; padding: 2px 10px;
19659
- background: transparent; border: 1px solid transparent;
19660
- border-radius: var(--r-small); color: var(--t-faint);
19661
- cursor: pointer;
19662
- }
19663
- .ss-icon-remove-btn:hover { color: hsla(0, 65%, 68%, 1); border-color: hsla(0, 45%, 45%, 0.2); }
19664
- .ss-input {
19665
- width: 100%; padding: 6px 10px;
19666
- background: rgba(255,255,255,0.04); border: 1px solid rgba(255,255,255,0.08);
19667
- border-radius: var(--r-small); font-size: var(--fs-xs);
19668
- color: var(--t-bright); outline: none;
19669
- transition: all 0.15s ease;
19670
- }
19671
- .ss-input:hover { border-color: rgba(255,255,255,0.12); }
19672
- .ss-input:focus {
19673
- border-color: rgba(148, 163, 184, 0.4);
19674
- background: rgba(148, 163, 184, 0.05);
19675
- box-shadow: 0 0 0 2px rgba(148, 163, 184, 0.08);
19676
- }
19677
- .ss-textarea {
19678
- width: 100%; padding: 8px 10px;
19679
- background: rgba(255,255,255,0.04); border: 1px solid rgba(255,255,255,0.08);
19680
- border-radius: var(--r-small); font-size: 11px;
19681
- color: var(--t-primary); outline: none;
19682
- resize: vertical; line-height: 1.5;
19683
- font-family: inherit;
19684
- transition: all 0.15s ease;
19685
- }
19686
- .ss-textarea:hover { border-color: rgba(255,255,255,0.12); }
19687
- .ss-textarea:focus {
19688
- border-color: rgba(148, 163, 184, 0.4);
19689
- background: rgba(148, 163, 184, 0.05);
19690
- box-shadow: 0 0 0 2px rgba(148, 163, 184, 0.08);
19691
- }
19692
- .ss-textarea-sm { min-height: 120px; }
19693
-
19694
- /* ── Custom checkbox toggle ── */
19695
- .ss-checkbox-row { display: flex; align-items: center; gap: 8px; padding: 3px 0; }
19696
- .ss-checkbox-row input[type="checkbox"] {
19697
- -webkit-appearance: none; appearance: none;
19698
- width: 32px; height: 17px; border-radius: 10px;
19699
- background: var(--s-light); border: 1px solid var(--b-light);
19700
- position: relative; cursor: pointer; flex-shrink: 0;
19701
- transition: background 0.2s ease, border-color 0.2s ease;
19702
- }
19703
- .ss-checkbox-row input[type="checkbox"]::after {
19704
- content: ''; position: absolute; top: 2px; left: 2px;
19705
- width: 11px; height: 11px; border-radius: 50%;
19706
- background: var(--t-muted);
19707
- transition: transform 0.2s ease, background 0.2s ease;
19708
- }
19709
- .ss-checkbox-row input[type="checkbox"]:checked {
19710
- background: hsla(var(--accent-hue, 174), 60%, 45%, 0.6);
19711
- border-color: hsla(var(--accent-hue, 174), 60%, 55%, 0.5);
19712
- }
19713
- .ss-checkbox-row input[type="checkbox"]:checked::after {
19714
- transform: translateX(15px);
19715
- background: hsla(var(--accent-hue, 174), 70%, 75%, 1);
19716
- }
19717
- .ss-checkbox-row label { font-size: var(--fs-xs); color: var(--t-secondary); cursor: pointer; text-transform: none; letter-spacing: 0; font-weight: 400; }
19718
-
19719
- /* ── Custom radio buttons ── */
19720
- .ss-radio-group { display: flex; flex-direction: column; gap: 6px; }
19721
- .ss-radio { display: flex; align-items: center; gap: 8px; font-size: var(--fs-xs); color: var(--t-secondary); cursor: pointer; }
19722
- .ss-radio input[type="radio"] {
19723
- -webkit-appearance: none; appearance: none;
19724
- width: 15px; height: 15px; border-radius: 50%;
19725
- background: var(--s-light); border: 1px solid var(--b-light);
19726
- position: relative; cursor: pointer; flex-shrink: 0;
19727
- transition: all 0.2s ease;
19728
- }
19729
- .ss-radio input[type="radio"]::after {
19730
- content: ''; position: absolute; top: 50%; left: 50%;
19731
- transform: translate(-50%, -50%) scale(0);
19732
- width: 7px; height: 7px; border-radius: 50%;
19733
- background: hsla(var(--accent-hue, 174), 70%, 70%, 1);
19734
- transition: transform 0.15s ease;
19735
- }
19736
- .ss-radio input[type="radio"]:checked {
19737
- border-color: hsla(var(--accent-hue, 174), 60%, 55%, 0.6);
19738
- background: hsla(var(--accent-hue, 174), 60%, 45%, 0.3);
19739
- }
19740
- .ss-radio input[type="radio"]:checked::after { transform: translate(-50%, -50%) scale(1); }
19741
-
19742
- /* ── Custom select dropdown ── */
19743
- select.ss-input, .ss-input[id*="model"] {
19744
- -webkit-appearance: none; appearance: none;
19745
- 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");
19746
- background-repeat: no-repeat;
19747
- background-position: right 8px center;
19748
- padding-right: 24px;
19749
- cursor: pointer;
19750
- }
19751
- select.ss-input option, .ss-tools-add select option {
19752
- background: #1a1a1a; color: var(--t-secondary); padding: 4px 8px;
19753
- }
19754
- select.ss-input option:disabled { color: var(--t-faint); }
19755
-
19756
- .ss-hidden { display: none !important; }
19757
-
19758
- /* ── Tool chips ── */
19759
- .ss-tools-list { display: flex; flex-wrap: wrap; gap: 6px; }
19760
- .ss-chip {
19761
- display: inline-flex; align-items: center; gap: 6px;
19762
- padding: 5px 12px; border-radius: var(--r-pill);
19763
- font-size: 11px; font-weight: 500;
19764
- background: rgba(148, 163, 184, 0.12);
19765
- border: 1px solid rgba(148, 163, 184, 0.22);
19766
- color: rgba(148, 163, 184, 0.8);
19767
- letter-spacing: 0.02em;
19768
- transition: all 0.15s ease;
19769
- position: relative;
19770
- }
19771
- .ss-chip:hover {
19772
- background: rgba(148, 163, 184, 0.18);
19773
- border-color: rgba(148, 163, 184, 0.32);
19774
- }
19775
- .ss-chip-x {
19776
- background: none; border: none; color: rgba(148, 163, 184, 0.45);
19777
- cursor: pointer; font-size: 13px; padding: 0; line-height: 1;
19778
- transition: color 0.12s ease;
19779
- display: flex; align-items: center; justify-content: center;
19780
- }
19781
- .ss-chip-x:hover {
19782
- color: rgba(255, 82, 82, 0.7);
19783
- }
19784
- /* ── Custom dropdown (tools picker) ── */
19785
- .ss-dropdown { position: relative; margin-top: 6px; }
19786
- .ss-dropdown-trigger {
19787
- display: flex; align-items: center; justify-content: space-between; gap: 8px;
19788
- width: 100%; padding: 7px 12px;
19789
- background: rgba(148, 163, 184, 0.08);
19790
- border: 1px solid rgba(148, 163, 184, 0.18);
19791
- border-radius: var(--r-small); font-size: 11px; font-weight: 500;
19792
- color: rgba(148, 163, 184, 0.65); cursor: pointer; outline: none;
19793
- transition: all 0.15s ease;
19794
- font-family: inherit;
19795
- }
19796
- .ss-dropdown-trigger svg {
19797
- opacity: 0.45; transition: transform 0.2s ease, opacity 0.15s ease;
19798
- flex-shrink: 0; width: 10px; height: 10px;
19799
- }
19800
- .ss-dropdown-trigger:hover {
19801
- border-color: rgba(148, 163, 184, 0.26);
19802
- color: rgba(148, 163, 184, 0.75);
19803
- background: rgba(148, 163, 184, 0.13);
19804
- }
19805
- .ss-dropdown-trigger:hover svg { opacity: 0.6; }
19806
- .ss-dropdown-trigger.open {
19807
- border-color: rgba(148, 163, 184, 0.3);
19808
- color: rgba(148, 163, 184, 0.85);
19809
- background: rgba(148, 163, 184, 0.14);
19810
- }
19811
- .ss-dropdown-trigger.open svg {
19812
- transform: rotate(180deg);
19813
- opacity: 0.7;
19814
- }
19815
-
19816
- .ss-dropdown-menu {
19817
- position: absolute; z-index: 400;
19818
- top: calc(100% + 6px); left: 0; right: 0;
19819
- display: none; flex-direction: column;
19820
- background: rgba(18, 20, 28, 0.92);
19821
- border: 1px solid rgba(148, 163, 184, 0.16);
19822
- border-radius: var(--r-button);
19823
- box-shadow: var(--shadow-md);
19824
- padding: 8px 0;
19825
- backdrop-filter: blur(12px);
19826
- max-height: 240px; overflow-y: auto;
19827
- scrollbar-width: thin; scrollbar-color: rgba(148, 163, 184, 0.12) transparent;
19828
- animation: ss-dropdown-in 0.2s ease;
19829
- }
19830
- .ss-dropdown-menu.open { display: flex; }
19831
- @keyframes ss-dropdown-in {
19832
- from { opacity: 0; transform: translateY(-8px) scale(0.98); }
19833
- to { opacity: 1; transform: translateY(0) scale(1); }
19834
- }
19835
-
19836
- .ss-dropdown-item {
19837
- padding: 9px 14px; font-size: 11px; font-weight: 500;
19838
- color: rgba(255,255,255,0.6); cursor: pointer;
19839
- transition: all 0.12s ease;
19840
- white-space: nowrap;
19841
- }
19842
- .ss-dropdown-item:hover {
19843
- background: rgba(148, 163, 184, 0.15);
19844
- color: rgba(148, 163, 184, 0.95);
19845
- }
19846
- .ss-dropdown-item.disabled {
19847
- color: rgba(255,255,255,0.25); cursor: default;
19848
- pointer-events: none;
19849
- }
19850
-
19851
- /* ── Section label ── */
19852
- .ss-section-label {
19853
- font-size: 10px; font-weight: 600; color: var(--t-faint);
19854
- text-transform: uppercase; letter-spacing: 0.5px;
19855
- margin-top: 14px; margin-bottom: 6px;
19856
- padding-bottom: 4px; border-bottom: 1px solid var(--b-subtle);
19857
- }
19858
-
19859
- /* ── File tree ── */
19860
- .ss-file-tree { display: flex; flex-direction: column; gap: 1px; }
19861
- .ss-file-item {
19862
- display: flex; align-items: center; gap: 6px;
19863
- padding: 6px 8px; font-size: 11px;
19864
- cursor: pointer; border-radius: var(--r-small);
19865
- transition: all 0.1s ease;
19866
- color: var(--t-secondary);
19867
- }
19868
- .ss-file-item:hover {
19869
- background: rgba(255,255,255,0.05);
19870
- color: var(--t-primary);
19871
- }
19872
- .ss-file-dir:hover { background: rgba(148,163,184,0.08); }
19873
- .ss-file-icon {
19874
- display: flex; align-items: center; justify-content: center;
19875
- width: 16px; height: 16px; flex-shrink: 0;
19876
- color: var(--t-muted); transition: color 0.1s ease;
19877
- }
19878
- .ss-file-icon-svg { display: block; }
19879
- .ss-file-item:hover .ss-file-icon {
19880
- color: rgba(148, 163, 184, 0.7);
19881
- }
19882
- .ss-file-dir:hover .ss-file-icon {
19883
- color: rgba(255, 183, 77, 0.7);
19884
- }
19885
- .ss-file-name {
19886
- flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis;
19887
- white-space: nowrap; font-weight: 400;
19888
- }
19889
- .ss-file-size {
19890
- font-size: 9px; color: var(--t-faint); flex-shrink: 0;
19891
- font-weight: 400; letter-spacing: 0.3px;
19892
- }
19893
- .ss-file-actions { display: none; gap: 3px; flex-shrink: 0; }
19894
- .ss-file-item:hover .ss-file-actions { display: flex; }
19895
- .ss-file-del-btn {
19896
- width: 18px; height: 18px; border-radius: var(--r-small);
19897
- background: none; border: 1px solid transparent;
19898
- color: var(--t-faint); cursor: pointer; font-size: 11px;
19899
- display: flex; align-items: center; justify-content: center;
19900
- transition: all 0.12s ease;
19901
- }
19902
- .ss-file-del-btn:hover {
19903
- background: hsla(0, 70%, 45%, 0.15);
19904
- border-color: hsla(0, 70%, 45%, 0.25);
19905
- color: hsla(0, 70%, 65%, 1);
19906
- }
19907
- .ss-add-file-btn {
19908
- margin-top: 8px; padding: 6px 10px;
19909
- font-size: var(--fs-xs); color: var(--t-muted);
19910
- background: none; border: 1px solid var(--b-light);
19911
- border-radius: var(--r-small); cursor: pointer;
19912
- transition: all 0.15s ease; width: 100%;
19913
- }
19914
- .ss-add-file-btn:hover {
19915
- border-color: rgba(148, 163, 184, 0.4);
19916
- color: rgba(148, 163, 184, 0.7);
19917
- background: rgba(148, 163, 184, 0.05);
19918
- }
19919
-
19920
- /* ── File browser dialog ── */
19921
- .ss-file-dialog-overlay {
19922
- position: absolute; inset: 0; z-index: 200;
19923
- display: flex; align-items: center; justify-content: center;
19924
- }
19925
- .ss-fd-backdrop {
19926
- position: absolute; inset: 0;
19927
- background: rgba(0,0,0,0.5); backdrop-filter: blur(2px);
19928
- }
19929
- .ss-file-dialog {
19930
- position: relative; z-index: 1;
19931
- width: 340px;
19932
- background: var(--s-glass-bg, rgba(18,18,28,0.96));
19933
- border: 1px solid var(--b-light);
19934
- border-radius: var(--r-base);
19935
- box-shadow: var(--shadow-lg);
19936
- display: flex; flex-direction: column;
19937
- overflow: hidden;
19938
- }
19939
- .ss-fd-body {
19940
- padding: 14px 16px; overflow-y: auto; flex: 1;
19941
- display: flex; flex-direction: column; gap: 10px;
19942
- }
19943
- .ss-fd-section-label {
19944
- font-size: 10px; text-transform: uppercase; letter-spacing: 0.06em;
19945
- color: var(--t-faint); margin-bottom: 4px;
19946
- }
19947
- .ss-fd-dirs {
19948
- display: flex; flex-direction: column; gap: 0;
19949
- max-height: 120px; overflow-y: auto;
19950
- border: 1px solid var(--b-subtle); border-radius: var(--r-small);
19951
- background: rgba(0,0,0,0.12); margin-bottom: 2px;
19952
- }
19953
- .ss-fd-dir {
19954
- display: flex; align-items: center; gap: 6px;
19955
- padding: 5px 8px; cursor: pointer;
19956
- font-size: 11px; color: var(--t-muted);
19957
- transition: background 0.1s;
19958
- }
19959
- .ss-fd-dir:hover { background: rgba(255,255,255,0.04); color: var(--t-secondary); }
19960
- .ss-fd-dir.selected {
19961
- background: rgba(255,255,255,0.06);
19962
- color: var(--t-bright);
19963
- }
19964
- .ss-fd-dir svg { opacity: 0.4; }
19965
- .ss-fd-dir.selected svg { opacity: 0.7; }
19966
- .ss-fd-new-folder-trigger {
19967
- background: none; border: none;
19968
- font-size: 10px; color: var(--t-faint);
19969
- cursor: pointer; padding: 2px 0;
19970
- transition: color 0.15s;
19971
- }
19972
- .ss-fd-new-folder-trigger:hover { color: var(--t-secondary); }
19973
-
19974
- /* ── Inline create row ── */
19975
- .ss-fd-inline-create {
19976
- display: flex; gap: 8px; align-items: stretch;
19977
- }
19978
- .ss-fd-create-btn {
19979
- padding: 0 14px; flex-shrink: 0;
19980
- background: rgba(255,255,255,0.06);
19981
- border: 1px solid rgba(255,255,255,0.1);
19982
- border-radius: var(--r-small);
19983
- color: var(--t-secondary);
19984
- font-size: 11px; font-weight: 500;
19985
- cursor: pointer; transition: all 0.15s ease;
19986
- white-space: nowrap;
19987
- }
19988
- .ss-fd-create-btn:hover {
19989
- background: rgba(255,255,255,0.1);
19990
- border-color: rgba(255,255,255,0.16);
19991
- color: var(--t-bright);
19992
- }
19993
-
19994
- /* ── Or divider ── */
19995
- .ss-fd-or {
19996
- text-align: center; font-size: 10px;
19997
- color: var(--t-faint); letter-spacing: 0.1em;
19998
- text-transform: uppercase;
19999
- }
20000
-
20001
- /* ── Upload link ── */
20002
- .ss-fd-inline-upload { text-align: center; }
20003
- .ss-fd-upload-link {
20004
- background: none; border: none;
20005
- color: var(--t-muted); font-size: 11px;
20006
- cursor: pointer; padding: 4px 0;
20007
- transition: color 0.15s;
20008
- text-decoration: underline;
20009
- text-decoration-color: rgba(255,255,255,0.12);
20010
- text-underline-offset: 3px;
20011
- }
20012
- .ss-fd-upload-link:hover {
20013
- color: var(--t-secondary);
20014
- text-decoration-color: rgba(255,255,255,0.25);
20015
- }
20016
-
20017
- .ss-fd-new-folder {
20018
- display: flex; align-items: center; gap: 4px;
20019
- margin-bottom: 2px;
20020
- }
20021
- .ss-fd-btn {
20022
- background: none; border: 1px solid var(--b-subtle);
20023
- color: var(--t-secondary); font-size: 11px;
20024
- padding: 3px 8px; border-radius: var(--r-small);
20025
- cursor: pointer;
20026
- }
20027
- .ss-fd-btn--ok { border-color: rgba(255,255,255,0.15); color: var(--t-secondary); }
20028
- .ss-fd-btn--ok:hover { border-color: rgba(255,255,255,0.25); color: var(--t-bright); }
20029
- .ss-fd-btn--cancel { border: none; color: var(--t-muted); font-size: 14px; }
20030
- .ss-fd-input {
20031
- font-size: var(--fs-xs) !important;
20032
- padding: 5px 8px !important;
20033
- height: auto !important;
20034
- }
20035
- .ss-fd-filename-row {
20036
- display: flex; align-items: center;
20037
- border: 1px solid var(--b-subtle); border-radius: var(--r-small);
20038
- background: rgba(0,0,0,0.15); overflow: hidden;
20039
- }
20040
- .ss-fd-path-prefix {
20041
- font-size: 11px; color: var(--t-muted);
20042
- padding: 5px 0 5px 8px; white-space: nowrap;
20043
- font-family: var(--ff-mono, monospace);
20044
- }
20045
- .ss-fd-filename-input {
20046
- border: none !important; background: none !important;
20047
- border-radius: 0 !important;
20048
- flex: 1; min-width: 0;
20049
- font-family: var(--ff-mono, monospace) !important;
20050
- }
20051
- .ss-fd-footer {
20052
- display: flex; justify-content: flex-end; gap: 8px;
20053
- padding: 10px 16px;
20054
- border-top: 1px solid var(--b-subtle);
20055
- }
20056
-
20057
- /* ── Tab bar ── */
20058
- .ss-tab-bar {
20059
- display: flex; align-items: stretch; gap: 0;
20060
- padding: 0 4px; background: rgba(0,0,0,0.12);
20061
- border-bottom: 1px solid var(--b-subtle); flex-shrink: 0;
20062
- min-height: 32px; overflow-x: auto; overflow-y: hidden;
20063
- scrollbar-width: none;
20064
- }
20065
- .ss-tab-bar::-webkit-scrollbar { display: none; }
20066
-
20067
- .ss-tab {
20068
- display: flex; align-items: center; gap: 5px;
20069
- padding: 0 12px; height: 32px;
20070
- font-size: 11px; font-weight: 500; color: var(--t-muted);
20071
- cursor: pointer; white-space: nowrap; flex-shrink: 0;
20072
- border-bottom: 2px solid transparent;
20073
- transition: color 0.15s ease, border-color 0.15s ease, background 0.15s ease;
20074
- position: relative;
20075
- }
20076
- .ss-tab:hover { color: var(--t-secondary); background: rgba(255,255,255,0.03); }
20077
- .ss-tab.active {
20078
- color: var(--t-bright);
20079
- border-bottom-color: var(--accent-blue, #94a3b8);
20080
- background: rgba(255,255,255,0.04);
20081
- }
20082
- .ss-tab.dirty .ss-tab-label { font-style: italic; }
20083
-
20084
- .ss-tab-label {
20085
- max-width: 140px; overflow: hidden; text-overflow: ellipsis;
20086
- }
20087
- .ss-tab-dot {
20088
- width: 5px; height: 5px; border-radius: 50%;
20089
- background: var(--accent-blue, #94a3b8);
20090
- flex-shrink: 0;
20091
- animation: ss-tab-dot-in 0.2s ease;
20092
- }
20093
- @keyframes ss-tab-dot-in {
20094
- from { transform: scale(0); opacity: 0; }
20095
- to { transform: scale(1); opacity: 1; }
20096
- }
20097
- .ss-tab-close {
20098
- width: 16px; height: 16px; display: flex; align-items: center; justify-content: center;
20099
- background: none; border: none; color: var(--t-faint); cursor: pointer;
20100
- border-radius: var(--r-small); font-size: 12px; line-height: 1;
20101
- padding: 0; margin-left: 2px; flex-shrink: 0;
20102
- opacity: 0; transition: opacity 0.12s ease, background 0.12s ease, color 0.12s ease;
20103
- }
20104
- .ss-tab:hover .ss-tab-close { opacity: 1; }
20105
- .ss-tab-close:hover { background: rgba(255,80,80,0.2); color: #f87171; }
20106
-
20107
- /* Tab type dot indicator */
20108
- .ss-tab-type-dot {
20109
- width: 6px; height: 6px; border-radius: 50%; flex-shrink: 0;
20110
- }
20111
- .ss-tab-type-dot.skill { background: hsla(210, 18%, 60%, 0.8); }
20112
- .ss-tab-type-dot.command { background: hsla(40, 20%, 56%, 0.8); }
20113
- .ss-tab-type-dot.agent { background: hsla(18, 20%, 56%, 0.8); }
20114
-
20115
- /* Tab type styling */
20116
- .ss-tab.type-skill.active { border-bottom-color: hsla(210, 18%, 60%, 0.8); }
20117
- .ss-tab.type-command.active { border-bottom-color: hsla(40, 20%, 56%, 0.8); }
20118
- .ss-tab.type-agent.active { border-bottom-color: hsla(18, 20%, 56%, 0.8); }
20119
- .ss-tab.subfile .ss-tab-label { font-size: 10px; opacity: 0.85; }
20120
-
20121
- /* ── Wizard ── */
20122
- .ss-wizard {
20123
- flex: 1; display: flex; flex-direction: column;
20124
- padding: 16px 20px; overflow: hidden;
20125
- }
20126
- .ss-wizard-steps {
20127
- display: flex; gap: 0; margin-bottom: 14px; flex-shrink: 0;
20128
- }
20129
- .ss-wizard-step {
20130
- flex: 1; text-align: center; font-size: var(--fs-xs);
20131
- color: var(--t-faint); padding: 6px 4px;
20132
- border-bottom: 2px solid var(--b-subtle);
20133
- transition: all 0.15s ease;
20134
- }
20135
- .ss-wizard-step.active {
20136
- color: hsla(var(--accent-hue, 174), 60%, 70%, 1);
20137
- border-bottom-color: hsla(var(--accent-hue, 174), 60%, 55%, 1);
20138
- }
20139
- .ss-wizard-step.done { color: var(--t-secondary); }
20140
- .ss-wizard-content { flex: 1; overflow-y: auto; overflow-x: hidden; display: flex; flex-direction: column; }
20141
- .ss-wizard-content h3 { margin: 0 0 12px; font-size: var(--fs-base); color: var(--t-bright); }
20142
- .ss-wizard-hint { font-size: var(--fs-xs); color: var(--t-muted); margin: 0 0 10px; flex-shrink: 0; }
20143
- .ss-wizard-nav {
20144
- display: flex; justify-content: space-between; align-items: center;
20145
- padding-top: 12px; border-top: 1px solid var(--b-subtle);
20146
- flex-shrink: 0; margin-top: 12px;
20147
- }
20148
- .ss-wizard-editor { min-height: 0; flex: 1; }
20149
- .ss-wiz-editor-wrap {
20150
- flex: 1; display: flex; flex-direction: column;
20151
- border: 1px solid var(--b-subtle); border-radius: var(--r-small);
20152
- overflow: hidden; min-height: 0;
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;
20153
19166
  }
20154
- .ss-wiz-editor-wrap .ss-md-toolbar { border-radius: 0; }
20155
- .ss-wiz-editor-wrap .ss-md-editor { border-radius: 0; }
20156
- .ss-wizard-preview { flex: 1; min-height: 0; }
20157
19167
 
20158
- /* ── Wizard step 4 layout (editor + preset panel) ── */
20159
- .ss-wiz-step4-hdr {
19168
+ /* ── Header ── */
19169
+ .sx-head {
19170
+ flex: none; min-height: max(44px, var(--fw-header-min-height, 44px));
20160
19171
  display: flex; align-items: center; gap: 8px;
20161
- margin: 0 0 12px; flex-shrink: 0;
20162
- }
20163
- .ss-wiz-step4-hdr h3 { margin: 0; font-size: var(--fs-base); color: var(--t-bright); }
20164
- .ss-wiz-step4-body {
20165
- flex: 1; display: flex; gap: 0; min-height: 0; overflow: hidden;
20166
- }
20167
- .ss-wiz-step4-body .ss-wiz-editor-wrap { flex: 1; min-width: 0; }
20168
-
20169
- /* ── Preset toggle button ── */
20170
- .ss-preset-toggle {
20171
- margin-left: auto; padding: 2px 10px;
20172
- font-size: 10px; font-weight: 500;
20173
- background: none; border: 1px solid var(--b-subtle);
20174
- border-radius: var(--r-small); color: var(--t-muted);
20175
- cursor: pointer; transition: all 0.15s ease;
20176
- text-transform: uppercase; letter-spacing: 0.3px;
20177
- }
20178
- .ss-preset-toggle:hover { color: var(--t-secondary); border-color: var(--b-light); }
20179
- .ss-preset-toggle.active {
20180
- background: hsla(var(--accent-hue, 215), var(--accent-saturation, 16%), 50%, 0.1);
20181
- border-color: hsla(var(--accent-hue, 215), var(--accent-saturation, 16%), var(--accent-lightness, 65%), 0.35);
20182
- color: hsla(var(--accent-hue, 215), var(--accent-saturation, 16%), var(--accent-lightness, 65%), 1);
20183
- }
20184
-
20185
- /* ── Preset side panel ── */
20186
- .ss-preset-panel {
20187
- width: 210px; flex-shrink: 0;
20188
- overflow-y: auto; overflow-x: hidden;
20189
- display: flex; flex-direction: column;
20190
- background: rgba(0,0,0,0.04);
20191
- transition: width 0.2s ease, opacity 0.2s ease;
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;
20192
19176
  }
20193
- .ss-preset-panel.hidden {
20194
- width: 0; opacity: 0; overflow: hidden;
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); }
19182
+
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);
20195
19233
  }
20196
-
20197
- /* ── Preset category accordion ── */
20198
- .ss-preset-cat-hdr {
20199
- display: flex; align-items: center; gap: 4px;
20200
- padding: 6px 8px; cursor: pointer;
20201
- font-size: 10px; font-weight: 600; text-transform: uppercase;
20202
- letter-spacing: 0.4px; color: var(--t-muted);
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;
20203
19280
  border-bottom: 1px solid var(--b-subtle);
20204
- user-select: none; flex-shrink: 0;
20205
19281
  }
20206
- .ss-preset-cat-hdr:hover { color: var(--t-secondary); background: var(--s-hover); }
20207
- .ss-preset-chevron { font-size: 8px; width: 12px; text-align: center; }
20208
- .ss-preset-cat-name { flex: 1; }
20209
- .ss-preset-cat-count {
20210
- font-size: 9px; color: var(--t-faint);
20211
- background: var(--s-subtle); padding: 1px 5px;
20212
- border-radius: var(--r-pill);
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);
20213
19298
  }
20214
- .ss-preset-cat-body {
20215
- display: flex; flex-direction: column; gap: 2px; padding: 4px;
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);
20216
19329
  }
20217
- .ss-preset-category.collapsed .ss-preset-cat-body { display: none; }
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); }
20218
19337
 
20219
- /* ── Preset card ── */
20220
- .ss-preset-card {
20221
- padding: 6px 8px; border-radius: var(--r-small);
20222
- border: 1px solid transparent; cursor: grab;
20223
- transition: all 0.15s ease; position: relative;
20224
- }
20225
- .ss-preset-card:hover {
20226
- background: var(--s-hover); border-color: var(--b-subtle);
20227
- }
20228
- .ss-preset-card:active { cursor: grabbing; }
20229
- .ss-preset-card.dragging { opacity: 0.4; }
20230
- .ss-preset-card.ss-preset-inserted {
20231
- background: hsla(var(--accent-hue, 215), var(--accent-saturation, 16%), 50%, 0.12);
20232
- border-color: hsla(var(--accent-hue, 215), var(--accent-saturation, 16%), var(--accent-lightness, 65%), 0.3);
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;
20233
19416
  }
20234
- .ss-preset-card-name {
20235
- font-size: 11px; font-weight: 500; color: var(--t-bright); line-height: 1.3;
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;
20236
19426
  }
20237
- .ss-preset-card-desc {
20238
- font-size: 10px; color: var(--t-faint); line-height: 1.3; margin-top: 1px;
20239
- overflow: hidden; text-overflow: ellipsis;
20240
- display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
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;
20241
19614
  }
20242
- .ss-preset-card-actions {
20243
- position: absolute; top: 4px; right: 4px;
20244
- display: none; gap: 2px;
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;
20245
19675
  }
20246
- .ss-preset-card:hover .ss-preset-card-actions { display: flex; }
20247
-
20248
- /* ── Custom category action buttons (add/import/export) ── */
20249
- .ss-preset-custom-actions {
20250
- display: flex; gap: 3px; margin-left: auto;
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;
20251
19803
  }
20252
- .ss-preset-act-btn {
20253
- width: 22px; height: 22px; display: flex; align-items: center; justify-content: center;
20254
- background: var(--s-subtle); border: 1px solid var(--b-subtle); border-radius: var(--r-small);
20255
- color: var(--t-secondary); cursor: pointer; padding: 0;
20256
- transition: all 0.12s 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; }
20257
19899
  }
20258
- .ss-preset-act-btn:hover {
20259
- background: var(--s-hover); color: var(--t-bright); border-color: var(--b-light);
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); }
20260
20038
  }
20261
- .ss-preset-act-add {
20262
- color: hsla(var(--accent-hue, 215), var(--accent-saturation, 16%), var(--accent-lightness, 65%), 1);
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; }
20263
20049
  }
20264
- .ss-preset-act-add:hover {
20265
- background: hsla(var(--accent-hue, 215), var(--accent-saturation, 16%), var(--accent-lightness, 65%), 0.15);
20266
- border-color: hsla(var(--accent-hue, 215), var(--accent-saturation, 16%), var(--accent-lightness, 65%), 0.4);
20267
- color: var(--t-bright);
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; }
20268
20074
  }
20269
-
20270
- /* ── Preset card edit/delete buttons ── */
20271
- .ss-preset-edit-btn,
20272
- .ss-preset-del-btn {
20273
- width: 18px; height: 18px; display: flex; align-items: center; justify-content: center;
20274
- background: none; border: 1px solid transparent; border-radius: var(--r-small);
20275
- color: var(--t-faint); cursor: pointer; font-size: 11px; padding: 0;
20276
- transition: all 0.12s ease;
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%; }
20277
20099
  }
20278
- .ss-preset-edit-btn:hover,
20279
- .ss-preset-del-btn:hover {
20280
- background: var(--s-hover); color: var(--t-bright); border-color: 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; }
20281
20103
  }
20282
20104
 
20283
- /* ── Drag ghost ── */
20284
- .ss-preset-drag-ghost {
20285
- position: absolute; top: -9999px; left: -9999px;
20286
- padding: 4px 10px; border-radius: var(--r-small);
20287
- background: var(--s-panel, rgba(30,30,40,0.95)); border: 1px solid var(--b-light);
20288
- color: var(--t-bright); font-size: 11px; font-weight: 500;
20289
- white-space: nowrap; pointer-events: none; z-index: 99999;
20290
- }
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). */
20291
20108
 
20292
- /* ── Drop target highlight ── */
20293
- .ss-md-editor.ss-drop-target {
20294
- outline: 2px dashed hsla(var(--accent-hue, 215), var(--accent-saturation, 16%), var(--accent-lightness, 65%), 0.5);
20295
- outline-offset: -2px;
20296
- background: rgba(0, 0, 0, 0.25);
20109
+ /* ── File browser dialog ── */
20110
+ .ss-file-dialog-overlay {
20111
+ position: absolute; inset: 0; z-index: 200;
20112
+ display: flex; align-items: center; justify-content: center;
20297
20113
  }
20298
-
20299
- /* ── Custom preset inline form ── */
20300
- .ss-preset-form { display: flex; flex-direction: column; gap: 4px; padding: 4px; margin-bottom: 4px; }
20301
- .ss-preset-form input,
20302
- .ss-preset-form textarea {
20303
- font-size: 10px; padding: 4px 6px;
20304
- background: rgba(0,0,0,0.15); border: 1px solid var(--b-subtle);
20305
- border-radius: var(--r-small); color: var(--t-bright);
20306
- font-family: inherit; outline: none;
20114
+ .ss-fd-backdrop {
20115
+ position: absolute; inset: 0;
20116
+ background: rgba(0,0,0,0.5); backdrop-filter: blur(2px);
20307
20117
  }
20308
- .ss-preset-form input:focus,
20309
- .ss-preset-form textarea:focus { border-color: var(--b-light); }
20310
- .ss-preset-form textarea {
20311
- min-height: 60px; resize: vertical;
20312
- font-family: 'JetBrains Mono', 'SF Mono', 'Consolas', monospace; font-size: 10px;
20118
+ .ss-file-dialog {
20119
+ position: relative; z-index: 1;
20120
+ width: 340px;
20121
+ background: var(--s-glass-bg, rgba(18,18,28,0.96));
20122
+ border: 1px solid var(--b-light);
20123
+ border-radius: var(--r-base);
20124
+ box-shadow: var(--shadow-lg);
20125
+ display: flex; flex-direction: column;
20126
+ overflow: hidden;
20313
20127
  }
20314
- .ss-preset-form-actions { display: flex; gap: 4px; justify-content: flex-end; }
20315
- .ss-preset-form-actions button { padding: 2px 8px; font-size: 10px; }
20316
-
20317
- /* ── Preset empty state ── */
20318
- .ss-preset-empty {
20319
- font-size: 10px; color: var(--t-faint); padding: 8px;
20320
- 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;
20321
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; }
20322
20182
 
20323
- /* ── Type cards (wizard step 1) ── */
20324
- .ss-type-cards { display: flex; gap: 12px; }
20325
- .ss-type-card {
20326
- flex: 1; display: flex; flex-direction: column;
20327
- align-items: center; gap: 8px;
20328
- padding: 20px 14px; border: 1px solid var(--b-light);
20329
- border-radius: var(--r-card); cursor: pointer;
20330
- background: var(--s-subtle);
20331
- 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;
20332
20188
  }
20333
- .ss-type-card:hover { background: var(--s-hover); border-color: var(--b-hover); }
20334
- .ss-type-card.selected {
20335
- background: hsla(var(--accent-hue, 174), 50%, 50%, 0.1);
20336
- 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;
20337
20191
  }
20338
- .ss-type-card-icon {
20339
- width: 48px; height: 48px; border-radius: 12px;
20340
- display: flex; align-items: center; justify-content: center;
20341
- 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;
20342
20197
  }
20343
- .ss-type-card-icon.skill { background: hsla(210, 12%, 50%, 0.08); color: hsla(210, 16%, 65%, 1); }
20344
- .ss-type-card-icon.command { background: hsla(40, 12%, 48%, 0.08); color: hsla(40, 18%, 62%, 1); }
20345
- .ss-type-card-icon.agent { background: hsla(18, 12%, 48%, 0.08); color: hsla(18, 18%, 62%, 1); }
20346
- .ss-type-card-name { font-size: var(--fs-sm); font-weight: 600; color: var(--t-bright); }
20347
- .ss-type-card-desc { font-size: 11px; color: var(--t-muted); text-align: center; line-height: 1.4; }
20348
-
20349
- /* ── Template list (wizard step 2) ── */
20350
- .ss-template-list { display: flex; flex-direction: column; gap: 6px; }
20351
- .ss-template-item {
20352
- padding: 10px 14px; border: 1px solid var(--b-light);
20353
- border-radius: var(--r-card); cursor: pointer;
20354
- background: var(--s-subtle);
20355
- 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;
20356
20206
  }
20357
- .ss-template-item:hover { background: var(--s-hover); }
20358
- .ss-template-item.selected {
20359
- background: hsla(var(--accent-hue, 174), 50%, 50%, 0.1);
20360
- 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;
20361
20212
  }
20362
- .ss-template-name { font-size: var(--fs-sm); font-weight: 600; color: var(--t-bright); }
20363
- .ss-template-desc { font-size: 11px; color: var(--t-muted); margin-top: 2px; }
20364
-
20365
- /* ── Wizard name preview ── */
20366
- .ss-wiz-name-preview {
20367
- font-size: var(--fs-xs); color: var(--t-faint);
20368
- 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);
20369
20216
  }
20370
20217
 
20371
20218
  /* ── Toast notifications ── */
@@ -20382,36 +20229,6 @@
20382
20229
  .ss-toast--error { border-color: hsla(0, 50%, 45%, 0.4); color: hsla(0, 70%, 70%, 1); }
20383
20230
  .ss-toast--info { border-color: hsla(var(--accent-hue, 174), 50%, 55%, 0.3); }
20384
20231
 
20385
- /* ── Skills Studio responsive (container queries) ── */
20386
- @container ss (max-width: 680px) {
20387
- .ss-welcome { padding: 32px 32px 28px; gap: 12px; }
20388
- .ss-welcome-logo { width: 200px; }
20389
- .ss-welcome-hero h2 { font-size: 1.3rem; }
20390
- .ss-welcome-sub { font-size: 0.7rem; }
20391
- .ss-stat { padding: 10px 20px; }
20392
- .ss-stat-num { font-size: 22px; }
20393
- .ss-stat-label { font-size: 9px; }
20394
- }
20395
- @container ss (max-width: 560px) {
20396
- .ss-welcome { padding: 24px 20px 20px; gap: 10px; }
20397
- .ss-welcome-logo { width: 150px; }
20398
- .ss-welcome-hero h2 { font-size: 1.1rem; }
20399
- .ss-welcome-sub { font-size: 0.65rem; max-width: 280px; }
20400
- .ss-stat { padding: 8px 14px; }
20401
- .ss-stat-num { font-size: 18px; }
20402
- .ss-stat-label { font-size: 8px; letter-spacing: 0.8px; }
20403
- .ss-welcome-hint { font-size: 10px; }
20404
- }
20405
- @container ss (max-width: 440px) {
20406
- .ss-welcome { padding: 16px 14px 14px; gap: 8px; }
20407
- .ss-welcome-logo { width: 110px; }
20408
- .ss-welcome-hero h2 { font-size: 0.95rem; }
20409
- .ss-welcome-sub { font-size: 0.6rem; max-width: 220px; line-height: 1.4; }
20410
- .ss-stat { padding: 6px 10px; }
20411
- .ss-stat-num { font-size: 16px; }
20412
- .ss-stat-label { font-size: 7px; }
20413
- .ss-welcome-hint { font-size: 9px; }
20414
- }
20415
20232
 
20416
20233
  /* ══════════════════════════════════════════════
20417
20234
  AUTOMATION STUDIO PANEL
@@ -22359,55 +22176,6 @@
22359
22176
  color: var(--t-secondary);
22360
22177
  }
22361
22178
 
22362
- /* ── MCP Profile selector (Codex/Gemini) ── */
22363
- .as-launch-mcp-profiles {
22364
- display: flex; flex-wrap: wrap; gap: 4px;
22365
- width: 100%; min-width: 0;
22366
- }
22367
- .as-launch-mcp-loading {
22368
- font-size: 10px; color: var(--t-tertiary); padding: 6px 0;
22369
- }
22370
- .as-launch-mcp-profile {
22371
- flex: 1 1 0; min-width: 0;
22372
- display: flex; flex-direction: column; align-items: center; gap: 2px;
22373
- padding: 7px 6px 6px;
22374
- background: rgba(255,255,255,0.03);
22375
- border: 1px solid rgba(255,255,255,0.06);
22376
- border-radius: 12px;
22377
- cursor: pointer; transition: all 0.18s ease;
22378
- backdrop-filter: blur(6px); -webkit-backdrop-filter: blur(6px);
22379
- overflow: hidden;
22380
- }
22381
- .as-launch-mcp-profile:hover {
22382
- background: rgba(255,255,255,0.06);
22383
- border-color: rgba(255,255,255,0.10);
22384
- }
22385
- .as-launch-mcp-profile.active {
22386
- background: rgba(255,255,255,0.08);
22387
- border-color: rgba(255,255,255,0.14);
22388
- box-shadow: var(--shadow-xs), var(--shadow-highlight);
22389
- }
22390
- .as-launch-mcp-profile.active .as-launch-mcp-profile-name {
22391
- color: hsla(210, 45%, 80%, 0.95);
22392
- }
22393
- .as-launch-mcp-profile.active .as-launch-mcp-profile-tools {
22394
- color: var(--t-secondary);
22395
- }
22396
- .as-launch-mcp-profile-name {
22397
- font-size: 11px; font-weight: 600;
22398
- color: var(--t-secondary);
22399
- transition: color 0.15s;
22400
- max-width: 100%; text-align: center; line-height: 1.2;
22401
- white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
22402
- }
22403
- .as-launch-mcp-profile-tools {
22404
- font-size: 9px; font-weight: 400;
22405
- color: var(--t-faint);
22406
- font-family: var(--ff-mono);
22407
- transition: color 0.15s;
22408
- max-width: 100%; text-align: center; line-height: 1.2;
22409
- white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
22410
- }
22411
22179
 
22412
22180
  /* ── Launch select — scalable dropdown for long model/MCP lists ── */
22413
22181
  .as-launch-select {
@@ -24415,83 +24183,6 @@
24415
24183
  transform: scale(1.15);
24416
24184
  }
24417
24185
 
24418
- /* MCP profile dropdown in floating terminal header */
24419
- .term-float-profile-dd {
24420
- position: relative;
24421
- flex-shrink: 0;
24422
- margin-left: 4px;
24423
- }
24424
- .term-float-profile-btn {
24425
- display: flex;
24426
- align-items: center;
24427
- gap: 3px;
24428
- background: rgba(255,255,255,0.06);
24429
- border: 1px solid rgba(255,255,255,0.08);
24430
- border-radius: 4px;
24431
- padding: 2px 6px;
24432
- cursor: pointer !important;
24433
- color: rgba(255,255,255,0.55);
24434
- font-size: 10px;
24435
- font-family: var(--ff-heading);
24436
- line-height: 1;
24437
- white-space: nowrap;
24438
- transition: color 0.15s, background 0.15s, border-color 0.15s;
24439
- }
24440
- .term-float-profile-btn:hover {
24441
- color: rgba(255,255,255,0.85);
24442
- background: rgba(255,255,255,0.1);
24443
- border-color: rgba(255,255,255,0.15);
24444
- }
24445
- .term-float-profile-arrow {
24446
- font-size: 8px;
24447
- opacity: 0.5;
24448
- }
24449
- .term-float-profile-menu {
24450
- display: none;
24451
- position: absolute;
24452
- top: calc(100% + 4px);
24453
- left: 0;
24454
- min-width: 160px;
24455
- max-height: 320px;
24456
- overflow-y: auto;
24457
- background: rgba(18, 18, 24, 0.97);
24458
- border: 1px solid rgba(255,255,255,0.1);
24459
- border-radius: 8px;
24460
- padding: 4px;
24461
- z-index: 10010;
24462
- backdrop-filter: blur(12px);
24463
- box-shadow: 0 8px 24px rgba(0,0,0,0.5);
24464
- }
24465
- .term-float-profile-menu.open { display: block; }
24466
- .term-float-profile-option {
24467
- display: flex;
24468
- align-items: center;
24469
- justify-content: space-between;
24470
- gap: 8px;
24471
- padding: 6px 8px;
24472
- border-radius: 5px;
24473
- cursor: pointer;
24474
- transition: background 0.12s;
24475
- }
24476
- .term-float-profile-option:hover {
24477
- background: rgba(255,255,255,0.08);
24478
- }
24479
- .term-float-profile-option.selected {
24480
- background: rgba(79, 195, 247, 0.12);
24481
- }
24482
- .term-float-profile-option .tfp-name {
24483
- font-size: 11px;
24484
- color: rgba(255,255,255,0.85);
24485
- font-family: var(--ff-heading);
24486
- }
24487
- .term-float-profile-option.selected .tfp-name {
24488
- color: #4FC3F7;
24489
- }
24490
- .term-float-profile-option .tfp-hint {
24491
- font-size: 9px;
24492
- color: rgba(255,255,255,0.3);
24493
- font-family: var(--ff-mono);
24494
- }
24495
24186
 
24496
24187
  /* Recall profile dropdown in floating terminal header */
24497
24188
  .term-float-recall-dd {
@@ -26223,7 +25914,7 @@
26223
25914
 
26224
25915
  .link-panel {
26225
25916
  position: fixed;
26226
- z-index: 50100;
25917
+ z-index: 49900; /* under the app frame (49990) */
26227
25918
  display: flex;
26228
25919
  flex-direction: column;
26229
25920
  border: 1px solid rgba(255,255,255,0.12);
@@ -26963,7 +26654,7 @@
26963
26654
  .as-launch-inline-header, .as-unsaved-dialog-header) > button,
26964
26655
  body :is(.ecm-close, .awiz-close, .sched-prompt-close),
26965
26656
  body .as-header .as-sidebar-toggle,
26966
- 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; }
26967
26658
  }
26968
26659
 
26969
26660
  /* ═══════════════════════════════════════════
@@ -26971,7 +26662,7 @@
26971
26662
  Uses the shared Settings roles above; shell/glass preferences stay shared.
26972
26663
  ═══════════════════════════════════════════ */
26973
26664
  .command-runner-panel {
26974
- position: fixed; z-index: 50100;
26665
+ position: fixed; z-index: 49900; /* under the app frame (49990) */
26975
26666
  width: 720px; max-width: calc(100vw - 16px); min-width: min(320px, calc(100vw - 16px));
26976
26667
  height: 680px; max-height: calc(100dvh - var(--navbar-height, 48px) - 16px);
26977
26668
  min-height: min(360px, calc(100dvh - var(--navbar-height, 48px) - 16px));
@@ -28706,9 +28397,9 @@
28706
28397
  border-bottom: 1px solid var(--b-subtle);
28707
28398
  flex-shrink: 0;
28708
28399
  user-select: none;
28709
- cursor: grab;
28400
+ cursor: move;
28710
28401
  }
28711
- .ig-header:active { cursor: grabbing; }
28402
+ .ig-header:active { cursor: move; }
28712
28403
  .ig-header-left {
28713
28404
  display: flex;
28714
28405
  align-items: center;
@@ -29058,6 +28749,25 @@
29058
28749
  outline: 2px solid var(--stg-focus, #93c5fd);
29059
28750
  outline-offset: 2px;
29060
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; } }
29061
28771
 
29062
28772
  .update-channel-pill {
29063
28773
  display: inline-block;
@@ -29458,3 +29168,39 @@ body .styleguide-panel {
29458
29168
  @media (prefers-reduced-motion: reduce) {
29459
29169
  .wa-primary, .wa-btn, .wa-mode-card, .wa-level-card { transition: none; }
29460
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); }