synabun 2.0.10 → 2.2.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 (656) hide show
  1. package/CHANGELOG.md +207 -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 +13 -13
  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 +30 -17
  11. package/lib/desktop-app.js +7 -1
  12. package/lib/external-tools.js +7 -6
  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 +302 -0
  24. package/lib/virustotal.mjs +203 -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/budget-judgments.d.ts +1 -1
  37. package/mcp-server/dist/services/budget-judgments.d.ts.map +1 -1
  38. package/mcp-server/dist/services/budget-judgments.js +5 -3
  39. package/mcp-server/dist/services/budget-judgments.js.map +1 -1
  40. package/mcp-server/dist/services/codex-config-heal.d.ts +6 -2
  41. package/mcp-server/dist/services/codex-config-heal.d.ts.map +1 -1
  42. package/mcp-server/dist/services/codex-config-heal.js +81 -28
  43. package/mcp-server/dist/services/codex-config-heal.js.map +1 -1
  44. package/mcp-server/dist/services/identity.d.ts +2 -2
  45. package/mcp-server/dist/services/identity.js +2 -2
  46. package/mcp-server/dist/services/memory-judge-backfill.d.ts +6 -0
  47. package/mcp-server/dist/services/memory-judge-backfill.d.ts.map +1 -1
  48. package/mcp-server/dist/services/memory-judge-backfill.js +7 -1
  49. package/mcp-server/dist/services/memory-judge-backfill.js.map +1 -1
  50. package/mcp-server/dist/services/memory-sessions.d.ts +1 -1
  51. package/mcp-server/dist/services/memory-sessions.d.ts.map +1 -1
  52. package/mcp-server/dist/services/memory-sessions.js +28 -2
  53. package/mcp-server/dist/services/memory-sessions.js.map +1 -1
  54. package/mcp-server/dist/services/neural-interface.d.ts +18 -11
  55. package/mcp-server/dist/services/neural-interface.d.ts.map +1 -1
  56. package/mcp-server/dist/services/neural-interface.js +67 -11
  57. package/mcp-server/dist/services/neural-interface.js.map +1 -1
  58. package/mcp-server/dist/services/server-instructions.d.ts +7 -2
  59. package/mcp-server/dist/services/server-instructions.d.ts.map +1 -1
  60. package/mcp-server/dist/services/server-instructions.js +22 -63
  61. package/mcp-server/dist/services/server-instructions.js.map +1 -1
  62. package/mcp-server/dist/services/tool-catalog.d.ts +120 -0
  63. package/mcp-server/dist/services/tool-catalog.d.ts.map +1 -0
  64. package/mcp-server/dist/services/tool-catalog.js +339 -0
  65. package/mcp-server/dist/services/tool-catalog.js.map +1 -0
  66. package/mcp-server/dist/services/tool-list-refresh-barrier.d.ts +12 -0
  67. package/mcp-server/dist/services/tool-list-refresh-barrier.d.ts.map +1 -0
  68. package/mcp-server/dist/services/tool-list-refresh-barrier.js +40 -0
  69. package/mcp-server/dist/services/tool-list-refresh-barrier.js.map +1 -0
  70. package/mcp-server/dist/services/tool-list.d.ts +108 -0
  71. package/mcp-server/dist/services/tool-list.d.ts.map +1 -0
  72. package/mcp-server/dist/services/tool-list.js +334 -0
  73. package/mcp-server/dist/services/tool-list.js.map +1 -0
  74. package/mcp-server/dist/services/tool-runtime.d.ts +161 -0
  75. package/mcp-server/dist/services/tool-runtime.d.ts.map +1 -0
  76. package/mcp-server/dist/services/tool-runtime.js +400 -0
  77. package/mcp-server/dist/services/tool-runtime.js.map +1 -0
  78. package/mcp-server/dist/services/typesafe-config.js +1 -1
  79. package/mcp-server/dist/services/typesafe-config.js.map +1 -1
  80. package/mcp-server/dist/services/whiteboard-geometry.d.ts +26 -2
  81. package/mcp-server/dist/services/whiteboard-geometry.d.ts.map +1 -1
  82. package/mcp-server/dist/services/whiteboard-geometry.js +91 -8
  83. package/mcp-server/dist/services/whiteboard-geometry.js.map +1 -1
  84. package/mcp-server/dist/tools/agents.d.ts +14 -14
  85. package/mcp-server/dist/tools/agents.d.ts.map +1 -1
  86. package/mcp-server/dist/tools/agents.js +29 -19
  87. package/mcp-server/dist/tools/agents.js.map +1 -1
  88. package/mcp-server/dist/tools/browser-batch.d.ts +3 -3
  89. package/mcp-server/dist/tools/choice.d.ts +6 -0
  90. package/mcp-server/dist/tools/choice.d.ts.map +1 -1
  91. package/mcp-server/dist/tools/choice.js +18 -13
  92. package/mcp-server/dist/tools/choice.js.map +1 -1
  93. package/mcp-server/dist/tools/git-tools.js +2 -2
  94. package/mcp-server/dist/tools/git-tools.js.map +1 -1
  95. package/mcp-server/dist/tools/image-tools.d.ts +1 -1
  96. package/mcp-server/dist/tools/image-tools.js +1 -1
  97. package/mcp-server/dist/tools/morelogin.d.ts.map +1 -1
  98. package/mcp-server/dist/tools/morelogin.js +9 -6
  99. package/mcp-server/dist/tools/morelogin.js.map +1 -1
  100. package/mcp-server/dist/tools/skill-tools.d.ts +505 -0
  101. package/mcp-server/dist/tools/skill-tools.d.ts.map +1 -0
  102. package/mcp-server/dist/tools/skill-tools.js +642 -0
  103. package/mcp-server/dist/tools/skill-tools.js.map +1 -0
  104. package/mcp-server/dist/tools/skill.d.ts +7 -0
  105. package/mcp-server/dist/tools/skill.d.ts.map +1 -0
  106. package/mcp-server/dist/tools/skill.js +11 -0
  107. package/mcp-server/dist/tools/skill.js.map +1 -0
  108. package/mcp-server/dist/tools/tool-groups.d.ts +68 -0
  109. package/mcp-server/dist/tools/tool-groups.d.ts.map +1 -0
  110. package/mcp-server/dist/tools/tool-groups.js +147 -0
  111. package/mcp-server/dist/tools/tool-groups.js.map +1 -0
  112. package/mcp-server/dist/tools/whiteboard-format.d.ts.map +1 -1
  113. package/mcp-server/dist/tools/whiteboard-format.js +7 -4
  114. package/mcp-server/dist/tools/whiteboard-format.js.map +1 -1
  115. package/mcp-server/dist/tools/whiteboard-tools.d.ts +64 -13
  116. package/mcp-server/dist/tools/whiteboard-tools.d.ts.map +1 -1
  117. package/mcp-server/dist/tools/whiteboard-tools.js +30 -5
  118. package/mcp-server/dist/tools/whiteboard-tools.js.map +1 -1
  119. package/mcp-server/package-lock.json +2 -2
  120. package/mcp-server/package.json +1 -1
  121. package/mcp-server/src/http.ts +75 -12
  122. package/mcp-server/src/index.ts +147 -154
  123. package/mcp-server/src/preload.ts +12 -12
  124. package/mcp-server/src/services/budget-judgments.ts +5 -3
  125. package/mcp-server/src/services/codex-config-heal.ts +80 -29
  126. package/mcp-server/src/services/identity.ts +2 -2
  127. package/mcp-server/src/services/memory-judge-backfill.ts +7 -1
  128. package/mcp-server/src/services/memory-sessions.ts +24 -3
  129. package/mcp-server/src/services/neural-interface.ts +81 -21
  130. package/mcp-server/src/services/server-instructions.ts +29 -64
  131. package/mcp-server/src/services/tool-catalog.ts +403 -0
  132. package/mcp-server/src/services/tool-list-refresh-barrier.ts +33 -0
  133. package/mcp-server/src/services/tool-list.ts +410 -0
  134. package/mcp-server/src/services/tool-runtime.ts +457 -0
  135. package/mcp-server/src/services/typesafe-config.ts +1 -1
  136. package/mcp-server/src/services/whiteboard-geometry.ts +94 -9
  137. package/mcp-server/src/tools/agents.ts +29 -20
  138. package/mcp-server/src/tools/choice.ts +17 -12
  139. package/mcp-server/src/tools/git-tools.ts +2 -2
  140. package/mcp-server/src/tools/image-tools.ts +1 -1
  141. package/mcp-server/src/tools/morelogin.ts +6 -4
  142. package/mcp-server/src/tools/skill-tools.ts +592 -0
  143. package/mcp-server/src/tools/skill.ts +13 -0
  144. package/mcp-server/src/tools/tool-groups.ts +164 -0
  145. package/mcp-server/src/tools/whiteboard-format.ts +9 -3
  146. package/mcp-server/src/tools/whiteboard-tools.ts +39 -5
  147. package/neural-interface/i18n/en.json +3953 -228
  148. package/neural-interface/i18n/pt-BR.json +3901 -179
  149. package/neural-interface/lib/agent-sandbox-elevation.js +6 -0
  150. package/neural-interface/lib/antigravity/acp-client-host.js +554 -0
  151. package/neural-interface/lib/antigravity/acp-connection.js +299 -0
  152. package/neural-interface/lib/antigravity/bypass.js +100 -0
  153. package/neural-interface/lib/antigravity/catalog.js +273 -0
  154. package/neural-interface/lib/antigravity/home.js +260 -0
  155. package/neural-interface/lib/antigravity/migrate-gemini.js +139 -0
  156. package/neural-interface/lib/antigravity/panel-bridge.js +1058 -0
  157. package/neural-interface/lib/antigravity/policy-hook.mjs +78 -0
  158. package/neural-interface/lib/antigravity/policy.js +74 -0
  159. package/neural-interface/lib/antigravity/tool-call.js +178 -0
  160. package/neural-interface/lib/antigravity/transcripts.js +252 -0
  161. package/neural-interface/lib/antigravity/usage.js +43 -0
  162. package/neural-interface/lib/assistant-api.js +128 -28
  163. package/neural-interface/lib/assistant-brains/antigravity.js +423 -0
  164. package/neural-interface/lib/assistant-brains/claude.js +4 -3
  165. package/neural-interface/lib/assistant-brains/codex-browser-policy-hook.mjs +12 -2
  166. package/neural-interface/lib/assistant-brains/codex-route-gate-hook.mjs +32 -9
  167. package/neural-interface/lib/assistant-brains/codex.js +9 -5
  168. package/neural-interface/lib/assistant-brains/opencode.js +120 -54
  169. package/neural-interface/lib/assistant-brains/opencode2-browser-policy/index.js +28 -13
  170. package/neural-interface/lib/assistant-brains/opencode2-route-gate/index.js +59 -19
  171. package/neural-interface/lib/assistant-budget-planner.js +7 -3
  172. package/neural-interface/lib/assistant-budget-split.js +42 -15
  173. package/neural-interface/lib/assistant-catalog.js +81 -15
  174. package/neural-interface/lib/assistant-config.js +6 -3
  175. package/neural-interface/lib/assistant-dispatch.js +1073 -200
  176. package/neural-interface/lib/assistant-envelope.js +156 -2
  177. package/neural-interface/lib/assistant-evidence.js +80 -0
  178. package/neural-interface/lib/assistant-hidden-models.js +7 -5
  179. package/neural-interface/lib/assistant-persona.js +93 -19
  180. package/neural-interface/lib/assistant-plan-permissions.js +25 -9
  181. package/neural-interface/lib/assistant-route-gate-codex.js +3 -0
  182. package/neural-interface/lib/assistant-route-gate.js +6 -4
  183. package/neural-interface/lib/assistant-router.js +245 -38
  184. package/neural-interface/lib/assistant-runtime.js +214 -30
  185. package/neural-interface/lib/assistant-task-prompt.js +87 -21
  186. package/neural-interface/lib/assistant-tools.js +51 -0
  187. package/neural-interface/lib/assistant-usage.js +29 -0
  188. package/neural-interface/lib/backup-service.js +626 -4
  189. package/neural-interface/lib/backup-zip-reader.js +10 -5
  190. package/neural-interface/lib/backup-zip-writer.js +257 -0
  191. package/neural-interface/lib/browser-execution.js +10 -2
  192. package/neural-interface/lib/browser-guard-cdp.js +84 -0
  193. package/neural-interface/lib/browser-network-guard.js +476 -0
  194. package/neural-interface/lib/browser-policy-roots.js +64 -0
  195. package/neural-interface/lib/browser-tool-policy.js +198 -38
  196. package/neural-interface/lib/claude-agent-bridge.js +11 -2
  197. package/neural-interface/lib/claude-history-cache.js +210 -0
  198. package/neural-interface/lib/claude-hooks-status.js +103 -0
  199. package/neural-interface/lib/claude-model-catalog.js +5 -1
  200. package/neural-interface/lib/claude-temporary.js +5 -11
  201. package/neural-interface/lib/cli-install-api.js +1 -1
  202. package/neural-interface/lib/cli-install.js +163 -154
  203. package/neural-interface/lib/cli-resolver.js +13 -3
  204. package/neural-interface/lib/cli-update-planner.js +52 -41
  205. package/neural-interface/lib/cloudflared/tunnel.js +42 -2
  206. package/neural-interface/lib/codex-mcp-approvals.js +11 -0
  207. package/neural-interface/lib/codex-rollout-reader.js +52 -0
  208. package/neural-interface/lib/codex-worker-app-server.js +191 -0
  209. package/neural-interface/lib/confined-fs.js +30 -3
  210. package/neural-interface/lib/crash-notice-api.js +98 -0
  211. package/neural-interface/lib/editor-completion-opencode.js +68 -68
  212. package/neural-interface/lib/editor-git-api.js +3 -20
  213. package/neural-interface/lib/exec-loop-command.js +13 -10
  214. package/neural-interface/lib/file-explorer-api.js +74 -40
  215. package/neural-interface/lib/file-explorer-watch.js +9 -3
  216. package/neural-interface/lib/git-bash/install.js +52 -6
  217. package/neural-interface/lib/git-bash/manager.js +59 -17
  218. package/neural-interface/lib/git-bash/pins.js +12 -0
  219. package/neural-interface/lib/git-read.js +2 -2
  220. package/neural-interface/lib/git-status-runner.js +390 -0
  221. package/neural-interface/lib/git-status-watchdog.js +40 -0
  222. package/neural-interface/lib/greeting/budgets.js +1 -0
  223. package/neural-interface/lib/greeting/engine.js +2 -2
  224. package/neural-interface/lib/greeting/sources.js +10 -12
  225. package/neural-interface/lib/greeting/writer.js +1 -1
  226. package/neural-interface/lib/http-guards.js +8 -2
  227. package/neural-interface/lib/install-details.js +4 -1
  228. package/neural-interface/lib/mcp-agent-servers.js +67 -0
  229. package/neural-interface/lib/mcp-client-config.js +35 -33
  230. package/neural-interface/lib/mcp-external-servers.js +332 -0
  231. package/neural-interface/lib/mcp-installer.js +2 -1
  232. package/neural-interface/lib/{mcp-profile-refresh-coordinator.js → mcp-tools-refresh-coordinator.js} +4 -4
  233. package/neural-interface/lib/memory-session-capture.js +17 -3
  234. package/neural-interface/lib/morelogin.js +177 -25
  235. package/neural-interface/lib/native-loop-providers.js +965 -66
  236. package/neural-interface/lib/native-loop-runtime.js +290 -42
  237. package/neural-interface/lib/opencode-config.js +557 -0
  238. package/neural-interface/lib/opencode-db-schema.js +17 -34
  239. package/neural-interface/lib/opencode-history.js +48 -218
  240. package/neural-interface/lib/opencode-mcp-ready.js +108 -0
  241. package/neural-interface/lib/opencode-native-boundary.js +53 -0
  242. package/neural-interface/lib/opencode-protocol.js +249 -112
  243. package/neural-interface/lib/opencode-runtime-config.js +32 -22
  244. package/neural-interface/lib/opencode-serve-records.js +39 -21
  245. package/neural-interface/lib/opencode-v2-client.js +48 -153
  246. package/neural-interface/lib/opencode-v2-ws-requests.js +36 -210
  247. package/neural-interface/lib/opencode-worker-data.js +27 -0
  248. package/neural-interface/lib/opencode2-client.js +73 -37
  249. package/neural-interface/lib/opencode2-proxy.js +23 -63
  250. package/neural-interface/lib/opencode2-translate.js +51 -2
  251. package/neural-interface/lib/owner-authority.js +249 -0
  252. package/neural-interface/lib/page-session.js +275 -0
  253. package/neural-interface/lib/path-confine.js +12 -9
  254. package/neural-interface/lib/peer-identity.js +793 -0
  255. package/neural-interface/lib/pty-host/core.js +28 -1
  256. package/neural-interface/lib/pty-host/lifetime.js +12 -0
  257. package/neural-interface/lib/pty-host/manager.js +12 -1
  258. package/neural-interface/lib/remote-policy.js +1 -1
  259. package/neural-interface/lib/request-gate.js +20 -2
  260. package/neural-interface/lib/rulesets/api.js +7 -6
  261. package/neural-interface/lib/rulesets/fs-safe.js +1 -1
  262. package/neural-interface/lib/rulesets/installer.js +180 -36
  263. package/neural-interface/lib/rulesets/json-edit.js +1 -1
  264. package/neural-interface/lib/rulesets/render.js +1 -1
  265. package/neural-interface/lib/session-cache-builder.js +81 -31
  266. package/neural-interface/lib/session-title-generator.js +58 -36
  267. package/neural-interface/lib/skills/api-v2.js +495 -0
  268. package/neural-interface/lib/skills/bundle.js +418 -0
  269. package/neural-interface/lib/skills/catalog.js +298 -0
  270. package/neural-interface/lib/skills/creation-api.js +191 -0
  271. package/neural-interface/lib/skills/creation-brief.js +247 -0
  272. package/neural-interface/lib/skills/creation-sources.js +285 -0
  273. package/neural-interface/lib/skills/creation.js +843 -0
  274. package/neural-interface/lib/skills/deploy.js +569 -0
  275. package/neural-interface/lib/skills/digest.js +119 -0
  276. package/neural-interface/lib/skills/discover.js +111 -0
  277. package/neural-interface/lib/skills/draft-confinement.js +216 -0
  278. package/neural-interface/lib/skills/eval-confinement.js +399 -0
  279. package/neural-interface/lib/skills/eval-sandbox.js +280 -0
  280. package/neural-interface/lib/skills/eval-trace.js +135 -0
  281. package/neural-interface/lib/skills/evals-api.js +212 -0
  282. package/neural-interface/lib/skills/evals.js +1573 -0
  283. package/neural-interface/lib/skills/export.js +203 -0
  284. package/neural-interface/lib/skills/frontmatter.js +64 -0
  285. package/neural-interface/lib/skills/health.js +75 -0
  286. package/neural-interface/lib/skills/json-edit.js +165 -0
  287. package/neural-interface/lib/skills/known-bridge-digests.json +441 -0
  288. package/neural-interface/lib/skills/known-bridges.js +96 -0
  289. package/neural-interface/lib/skills/library.js +823 -0
  290. package/neural-interface/lib/skills/local-store.js +21 -0
  291. package/neural-interface/lib/skills/migration.js +433 -0
  292. package/neural-interface/lib/skills/operations.js +45 -0
  293. package/neural-interface/lib/skills/ownership.js +427 -0
  294. package/neural-interface/lib/skills/packages.js +88 -0
  295. package/neural-interface/lib/skills/reviews.js +212 -0
  296. package/neural-interface/lib/skills/revision.js +80 -0
  297. package/neural-interface/lib/skills/roots.js +269 -0
  298. package/neural-interface/lib/skills/runtime-checks.js +358 -0
  299. package/neural-interface/lib/skills/scan-assets.js +252 -0
  300. package/neural-interface/lib/skills/scan-context.js +26 -0
  301. package/neural-interface/lib/skills/scan-shell.js +324 -0
  302. package/neural-interface/lib/skills/scan.js +364 -0
  303. package/neural-interface/lib/skills/scanners.js +54 -0
  304. package/neural-interface/lib/skills/service.js +530 -0
  305. package/neural-interface/lib/skills/telemetry.js +119 -0
  306. package/neural-interface/lib/sqlite-integrity-worker.js +22 -0
  307. package/neural-interface/lib/synabun-version.js +1 -1
  308. package/neural-interface/lib/system-activity.js +1 -1
  309. package/neural-interface/lib/tool-lists.js +124 -0
  310. package/neural-interface/lib/whatsapp/brain.js +7 -3
  311. package/neural-interface/lib/whatsapp/bridge.js +6 -3
  312. package/neural-interface/lib/whatsapp/cards.js +22 -9
  313. package/neural-interface/lib/whatsapp/config.js +1 -1
  314. package/neural-interface/lib/worker-confinement.js +1268 -0
  315. package/neural-interface/lib/worker-guard-setting.js +56 -0
  316. package/neural-interface/lib/worker-mcp-channel.js +175 -0
  317. package/neural-interface/lib/worker-question.js +74 -0
  318. package/neural-interface/lib/worker-relay-ports.js +227 -0
  319. package/neural-interface/lib/worker-resume.js +238 -0
  320. package/neural-interface/lib/worker-sandbox.js +329 -0
  321. package/neural-interface/package-lock.json +34 -12
  322. package/neural-interface/package.json +3 -2
  323. package/neural-interface/public/index.html +3 -1
  324. package/neural-interface/public/index2d.html +19 -11
  325. package/neural-interface/public/onboarding.html +3 -3
  326. package/neural-interface/public/shared/account-menu.js +8 -5
  327. package/neural-interface/public/shared/agent-runtime-options.js +125 -31
  328. package/neural-interface/public/shared/agy/agy-bypass.js +47 -0
  329. package/neural-interface/public/shared/agy/agy-client.js +266 -0
  330. package/neural-interface/public/shared/agy/agy-commands.js +120 -0
  331. package/neural-interface/public/shared/agy/agy-copy.js +326 -0
  332. package/neural-interface/public/shared/agy/agy-diff.js +161 -0
  333. package/neural-interface/public/shared/agy/agy-events.js +469 -0
  334. package/neural-interface/public/shared/agy/agy-greeting.js +26 -0
  335. package/neural-interface/public/shared/agy/agy-options.js +232 -0
  336. package/neural-interface/public/shared/agy/agy-panel.js +2543 -0
  337. package/neural-interface/public/shared/agy/agy-render.js +392 -0
  338. package/neural-interface/public/shared/agy/agy-setup.js +149 -0
  339. package/neural-interface/public/shared/agy/agy-styles.js +604 -0
  340. package/neural-interface/public/shared/agy/agy-tabs-logic.js +181 -0
  341. package/neural-interface/public/shared/api.js +1527 -1336
  342. package/neural-interface/public/shared/app-frame.js +192 -0
  343. package/neural-interface/public/shared/assistant/asst-agents-dock.js +36 -6
  344. package/neural-interface/public/shared/assistant/asst-api.js +1 -1
  345. package/neural-interface/public/shared/assistant/asst-ask-styles.js +270 -0
  346. package/neural-interface/public/shared/assistant/asst-ask-tail.js +118 -0
  347. package/neural-interface/public/shared/assistant/asst-ask.js +397 -0
  348. package/neural-interface/public/shared/assistant/asst-brain-picker.js +105 -44
  349. package/neural-interface/public/shared/assistant/asst-budget.js +5 -4
  350. package/neural-interface/public/shared/assistant/asst-control.js +205 -26
  351. package/neural-interface/public/shared/assistant/asst-followups-card.js +383 -0
  352. package/neural-interface/public/shared/assistant/asst-followups.js +417 -0
  353. package/neural-interface/public/shared/assistant/asst-hosts.js +16 -7
  354. package/neural-interface/public/shared/assistant/asst-limit-dock.js +45 -0
  355. package/neural-interface/public/shared/assistant/asst-limit-wait.js +327 -0
  356. package/neural-interface/public/shared/assistant/asst-limit.js +168 -0
  357. package/neural-interface/public/shared/assistant/asst-mascot.js +49 -12
  358. package/neural-interface/public/shared/assistant/asst-menu.js +7 -6
  359. package/neural-interface/public/shared/assistant/asst-panel.js +151 -19
  360. package/neural-interface/public/shared/assistant/asst-rack-styles.js +66 -49
  361. package/neural-interface/public/shared/assistant/asst-render.js +445 -82
  362. package/neural-interface/public/shared/assistant/asst-route.js +304 -53
  363. package/neural-interface/public/shared/assistant/asst-routes-editor.js +9 -8
  364. package/neural-interface/public/shared/assistant/asst-scenes.js +56 -1
  365. package/neural-interface/public/shared/assistant/asst-sidepanel.js +117 -10
  366. package/neural-interface/public/shared/assistant/asst-slash.js +17 -9
  367. package/neural-interface/public/shared/assistant/asst-state.js +87 -24
  368. package/neural-interface/public/shared/assistant/asst-stop.js +127 -0
  369. package/neural-interface/public/shared/assistant/asst-styles.js +93 -21
  370. package/neural-interface/public/shared/assistant/asst-tool-kinds.js +190 -23
  371. package/neural-interface/public/shared/assistant/asst-usage.js +2 -1
  372. package/neural-interface/public/shared/automation-context.js +5 -2
  373. package/neural-interface/public/shared/cc-dropdown.js +89 -19
  374. package/neural-interface/public/shared/cdx/cdx-context-menu.js +10 -9
  375. package/neural-interface/public/shared/cdx/cdx-copy.js +16 -0
  376. package/neural-interface/public/shared/cdx/cdx-output-model.js +22 -1
  377. package/neural-interface/public/shared/cdx/cdx-output.js +34 -10
  378. package/neural-interface/public/shared/cdx/cdx-panel.js +59 -151
  379. package/neural-interface/public/shared/cdx/cdx-preview.js +12 -0
  380. package/neural-interface/public/shared/cdx/cdx-protocol.js +39 -11
  381. package/neural-interface/public/shared/cdx/cdx-render.js +57 -38
  382. package/neural-interface/public/shared/cdx/cdx-requests.js +14 -4
  383. package/neural-interface/public/shared/cdx/cdx-skill-hints.js +54 -0
  384. package/neural-interface/public/shared/cdx/cdx-styles.js +15 -3
  385. package/neural-interface/public/shared/cdx/cdx-tabs.js +127 -44
  386. package/neural-interface/public/shared/cdx/cdx-ws.js +0 -1
  387. package/neural-interface/public/shared/cli-install-controller.js +218 -0
  388. package/neural-interface/public/shared/cli-install-view.js +11 -12
  389. package/neural-interface/public/shared/cli-status.js +11 -10
  390. package/neural-interface/public/shared/constants.js +5 -4
  391. package/neural-interface/public/shared/context-menu-areas.js +34 -0
  392. package/neural-interface/public/shared/context-menu-logic.js +243 -0
  393. package/neural-interface/public/shared/context-menu-model.js +367 -0
  394. package/neural-interface/public/shared/context-menu.js +372 -0
  395. package/neural-interface/public/shared/cp/cp-context-menu.js +10 -9
  396. package/neural-interface/public/shared/cp/cp-restore.js +162 -0
  397. package/neural-interface/public/shared/cp/cp-tool-cards.js +10 -3
  398. package/neural-interface/public/shared/crash-notice-view.js +168 -0
  399. package/neural-interface/public/shared/desktop-bridge.js +17 -0
  400. package/neural-interface/public/shared/desktop-titlebar-view.js +12 -0
  401. package/neural-interface/public/shared/desktop-titlebar.js +13 -4
  402. package/neural-interface/public/shared/desktop-update-view.js +21 -0
  403. package/neural-interface/public/shared/editor/editor-panel-logic.js +2 -2
  404. package/neural-interface/public/shared/explorer/fx-api.js +4 -4
  405. package/neural-interface/public/shared/explorer/fx-links.js +3 -3
  406. package/neural-interface/public/shared/explorer/fx-logic.js +1 -1
  407. package/neural-interface/public/shared/explorer/fx-main.js +48 -16
  408. package/neural-interface/public/shared/explorer/fx-tree.js +1 -0
  409. package/neural-interface/public/shared/greeting/greeting-card.js +2 -2
  410. package/neural-interface/public/shared/greeting/greeting-view.js +1 -0
  411. package/neural-interface/public/shared/html-shell.js +30 -15
  412. package/neural-interface/public/shared/i18n.js +2 -0
  413. package/neural-interface/public/shared/ocp-v2/ocp-v2-approvals.js +7 -7
  414. package/neural-interface/public/shared/ocp-v2/ocp-v2-binding.js +4 -4
  415. package/neural-interface/public/shared/ocp-v2/ocp-v2-changes-logic.js +3 -101
  416. package/neural-interface/public/shared/ocp-v2/ocp-v2-childpanel.js +2 -0
  417. package/neural-interface/public/shared/ocp-v2/ocp-v2-compact-button.js +1 -3
  418. package/neural-interface/public/shared/ocp-v2/ocp-v2-composer-logic.js +2 -6
  419. package/neural-interface/public/shared/ocp-v2/ocp-v2-context-menu.js +11 -11
  420. package/neural-interface/public/shared/ocp-v2/ocp-v2-context-model.js +0 -3
  421. package/neural-interface/public/shared/ocp-v2/ocp-v2-events.js +8 -4
  422. package/neural-interface/public/shared/ocp-v2/ocp-v2-manager.js +7 -7
  423. package/neural-interface/public/shared/ocp-v2/ocp-v2-outcome-notifications.js +16 -0
  424. package/neural-interface/public/shared/ocp-v2/ocp-v2-panel.js +74 -259
  425. package/neural-interface/public/shared/ocp-v2/ocp-v2-plan.js +1 -2
  426. package/neural-interface/public/shared/ocp-v2/ocp-v2-projectbar.js +95 -202
  427. package/neural-interface/public/shared/ocp-v2/ocp-v2-rehydrate.js +13 -4
  428. package/neural-interface/public/shared/ocp-v2/ocp-v2-render.js +13 -22
  429. package/neural-interface/public/shared/ocp-v2/ocp-v2-send.js +4 -4
  430. package/neural-interface/public/shared/ocp-v2/ocp-v2-session-actions.js +8 -61
  431. package/neural-interface/public/shared/ocp-v2/ocp-v2-sessions-logic.js +2 -91
  432. package/neural-interface/public/shared/ocp-v2/ocp-v2-slash-hints.js +16 -15
  433. package/neural-interface/public/shared/ocp-v2/ocp-v2-state.js +8 -21
  434. package/neural-interface/public/shared/ocp-v2/ocp-v2-status-logic.js +1 -99
  435. package/neural-interface/public/shared/ocp-v2/ocp-v2-status.js +5 -35
  436. package/neural-interface/public/shared/ocp-v2/ocp-v2-styles.js +17 -21
  437. package/neural-interface/public/shared/ocp-v2/{ocp-v2-profile-inheritance.js → ocp-v2-tools-inheritance.js} +16 -16
  438. package/neural-interface/public/shared/ocp-v2/ocp-v2-ws.js +60 -50
  439. package/neural-interface/public/shared/page-session.js +96 -0
  440. package/neural-interface/public/shared/provider-icons.js +4 -2
  441. package/neural-interface/public/shared/registry.js +5 -3
  442. package/neural-interface/public/shared/retired-2d.js +3 -0
  443. package/neural-interface/public/shared/schedules-view.js +195 -61
  444. package/neural-interface/public/shared/settings/settings-claude-hooks.js +135 -0
  445. package/neural-interface/public/shared/settings/settings-data.js +3 -1
  446. package/neural-interface/public/shared/settings/settings-ia.js +6 -6
  447. package/neural-interface/public/shared/settings/settings-opencode.js +89 -0
  448. package/neural-interface/public/shared/settings/settings-rules.js +2 -2
  449. package/neural-interface/public/shared/settings/settings-skill-folders-pane.js +265 -0
  450. package/neural-interface/public/shared/settings/settings-skill-folders.js +130 -0
  451. package/neural-interface/public/shared/settings/settings-worker-guard.js +72 -0
  452. package/neural-interface/public/shared/showcase-privacy.js +6 -1
  453. package/neural-interface/public/shared/sidepanel-session-status.js +3 -3
  454. package/neural-interface/public/shared/skills/ss-args.js +96 -0
  455. package/neural-interface/public/shared/skills/ss-creation.js +222 -0
  456. package/neural-interface/public/shared/skills/ss-dialog.js +133 -0
  457. package/neural-interface/public/shared/skills/ss-doc.js +173 -0
  458. package/neural-interface/public/shared/skills/ss-eval-adapters.js +269 -0
  459. package/neural-interface/public/shared/skills/ss-eval-grade.js +359 -0
  460. package/neural-interface/public/shared/skills/ss-eval-optimise.js +153 -0
  461. package/neural-interface/public/shared/skills/ss-eval-plan.js +315 -0
  462. package/neural-interface/public/shared/skills/ss-evals.js +417 -0
  463. package/neural-interface/public/shared/skills/ss-form.js +159 -0
  464. package/neural-interface/public/shared/skills/ss-frontmatter.js +376 -0
  465. package/neural-interface/public/shared/skills/ss-ids.js +32 -0
  466. package/neural-interface/public/shared/skills/ss-lint.js +149 -0
  467. package/neural-interface/public/shared/skills/ss-presets.js +117 -0
  468. package/neural-interface/public/shared/skills/ss-profiles.js +513 -0
  469. package/neural-interface/public/shared/skills/ss-resources.js +165 -0
  470. package/neural-interface/public/shared/skills/ss-review-view.js +190 -0
  471. package/neural-interface/public/shared/skills/ss-tabs.js +79 -0
  472. package/neural-interface/public/shared/skills/ss-unicode.js +135 -0
  473. package/neural-interface/public/shared/skills/studio/sx-actions.js +222 -0
  474. package/neural-interface/public/shared/skills/studio/sx-cm.js +101 -0
  475. package/neural-interface/public/shared/skills/studio/sx-create-ai-view.js +749 -0
  476. package/neural-interface/public/shared/skills/studio/sx-create-ai.js +237 -0
  477. package/neural-interface/public/shared/skills/studio/sx-create-view.js +254 -0
  478. package/neural-interface/public/shared/skills/studio/sx-create.js +126 -0
  479. package/neural-interface/public/shared/skills/studio/sx-diff-view.js +43 -0
  480. package/neural-interface/public/shared/skills/studio/sx-diff.js +133 -0
  481. package/neural-interface/public/shared/skills/studio/sx-docs.js +480 -0
  482. package/neural-interface/public/shared/skills/studio/sx-dom.js +230 -0
  483. package/neural-interface/public/shared/skills/studio/sx-edit-view.js +848 -0
  484. package/neural-interface/public/shared/skills/studio/sx-editor-model.js +193 -0
  485. package/neural-interface/public/shared/skills/studio/sx-errors.js +22 -0
  486. package/neural-interface/public/shared/skills/studio/sx-fixes-view.js +359 -0
  487. package/neural-interface/public/shared/skills/studio/sx-fixes.js +327 -0
  488. package/neural-interface/public/shared/skills/studio/sx-geometry.js +82 -0
  489. package/neural-interface/public/shared/skills/studio/sx-import.js +262 -0
  490. package/neural-interface/public/shared/skills/studio/sx-inspector.js +308 -0
  491. package/neural-interface/public/shared/skills/studio/sx-install-flow.js +282 -0
  492. package/neural-interface/public/shared/skills/studio/sx-install.js +313 -0
  493. package/neural-interface/public/shared/skills/studio/sx-library-view.js +748 -0
  494. package/neural-interface/public/shared/skills/studio/sx-library.js +479 -0
  495. package/neural-interface/public/shared/skills/studio/sx-main.js +690 -0
  496. package/neural-interface/public/shared/skills/studio/sx-operations-view.js +98 -0
  497. package/neural-interface/public/shared/skills/studio/sx-operations.js +11 -0
  498. package/neural-interface/public/shared/skills/studio/sx-plan.js +158 -0
  499. package/neural-interface/public/shared/skills/studio/sx-publish-view.js +621 -0
  500. package/neural-interface/public/shared/skills/studio/sx-review-view.js +369 -0
  501. package/neural-interface/public/shared/skills/studio/sx-review.js +148 -0
  502. package/neural-interface/public/shared/skills/studio/sx-scan.js +35 -0
  503. package/neural-interface/public/shared/skills/studio/sx-snippets.js +96 -0
  504. package/neural-interface/public/shared/skills/studio/sx-subject.js +249 -0
  505. package/neural-interface/public/shared/skills/studio/sx-test-view.js +994 -0
  506. package/neural-interface/public/shared/skills/studio/sx-test.js +328 -0
  507. package/neural-interface/public/shared/skills/studio/sx-versions-view.js +241 -0
  508. package/neural-interface/public/shared/skills/studio/sx-workspace-view.js +426 -0
  509. package/neural-interface/public/shared/state.js +1 -1
  510. package/neural-interface/public/shared/streaming-markdown.js +58 -0
  511. package/neural-interface/public/shared/styleguide/sg-panel.js +4 -2
  512. package/neural-interface/public/shared/styles.css +1822 -1756
  513. package/neural-interface/public/shared/synabun-mascot.js +1115 -9
  514. package/neural-interface/public/shared/text-cache.js +29 -0
  515. package/neural-interface/public/shared/tool-list-picker.js +55 -0
  516. package/neural-interface/public/shared/tool-list-storage.js +24 -0
  517. package/neural-interface/public/shared/tool-list-view.js +112 -0
  518. package/neural-interface/public/shared/topright-overflow-logic.js +54 -0
  519. package/neural-interface/public/shared/tour/tour-actor.js +268 -0
  520. package/neural-interface/public/shared/tour/tour-beats.js +336 -0
  521. package/neural-interface/public/shared/tour/tour-engine.js +884 -0
  522. package/neural-interface/public/shared/tour/tour-ink.js +390 -0
  523. package/neural-interface/public/shared/tour/tour-stage.js +440 -0
  524. package/neural-interface/public/shared/tour/tour-state.js +40 -0
  525. package/neural-interface/public/shared/tour/tour-tips.js +99 -0
  526. package/neural-interface/public/shared/tour/tour.css +144 -0
  527. package/neural-interface/public/shared/ui-antigravity-panel.js +19 -0
  528. package/neural-interface/public/shared/ui-assistant.js +2 -0
  529. package/neural-interface/public/shared/ui-automation-studio.js +111 -140
  530. package/neural-interface/public/shared/ui-claude-panel.js +376 -82
  531. package/neural-interface/public/shared/ui-cli-banner.js +23 -167
  532. package/neural-interface/public/shared/ui-command-runner.js +6 -3
  533. package/neural-interface/public/shared/ui-context-menu.js +295 -0
  534. package/neural-interface/public/shared/ui-cost-widget.js +57 -59
  535. package/neural-interface/public/shared/ui-crash-notice.js +187 -0
  536. package/neural-interface/public/shared/ui-detail.js +15 -3
  537. package/neural-interface/public/shared/ui-file-explorer.js +48 -6
  538. package/neural-interface/public/shared/ui-file-links.js +2 -2
  539. package/neural-interface/public/shared/ui-games.js +2 -2
  540. package/neural-interface/public/shared/ui-image-gallery.js +50 -47
  541. package/neural-interface/public/shared/ui-judgments.js +1 -1
  542. package/neural-interface/public/shared/ui-keybinds.js +33 -2
  543. package/neural-interface/public/shared/ui-link.js +3 -3
  544. package/neural-interface/public/shared/ui-menubar.js +10 -20
  545. package/neural-interface/public/shared/ui-native-loop-router-state.js +5 -0
  546. package/neural-interface/public/shared/ui-native-loop-router.js +11 -1
  547. package/neural-interface/public/shared/ui-navbar.js +49 -24
  548. package/neural-interface/public/shared/ui-notifications.js +1 -0
  549. package/neural-interface/public/shared/ui-panels.js +96 -65
  550. package/neural-interface/public/shared/ui-resume.js +9 -7
  551. package/neural-interface/public/shared/ui-schedules-studio.js +546 -431
  552. package/neural-interface/public/shared/ui-scroll-follow.js +16 -5
  553. package/neural-interface/public/shared/ui-sessions.js +27 -15
  554. package/neural-interface/public/shared/ui-settings.js +683 -526
  555. package/neural-interface/public/shared/ui-sidepanel-session-entry.js +9 -2
  556. package/neural-interface/public/shared/ui-sidepanel-sessions.js +4 -4
  557. package/neural-interface/public/shared/ui-sidepanel-state.js +23 -12
  558. package/neural-interface/public/shared/ui-sidepanel-tray.js +48 -7
  559. package/neural-interface/public/shared/ui-sidepanel-windows.js +18 -13
  560. package/neural-interface/public/shared/ui-skills.js +33 -2830
  561. package/neural-interface/public/shared/ui-styleguide.js +5 -2
  562. package/neural-interface/public/shared/ui-sync.js +15 -5
  563. package/neural-interface/public/shared/ui-terminal.js +270 -190
  564. package/neural-interface/public/shared/ui-tool-updates.js +6 -4
  565. package/neural-interface/public/shared/ui-tooltip.js +81 -51
  566. package/neural-interface/public/shared/ui-topright-overflow.js +233 -0
  567. package/neural-interface/public/shared/ui-trash.js +6 -4
  568. package/neural-interface/public/shared/ui-tutorial-layout.js +3 -117
  569. package/neural-interface/public/shared/ui-tutorial-preview.js +103 -0
  570. package/neural-interface/public/shared/ui-tutorial-steps.js +3 -65
  571. package/neural-interface/public/shared/ui-tutorial.css +47 -100
  572. package/neural-interface/public/shared/ui-tutorial.js +285 -509
  573. package/neural-interface/public/shared/ui-update.js +38 -2
  574. package/neural-interface/public/shared/ui-whiteboard.js +312 -59
  575. package/neural-interface/public/shared/ui-worker-end.js +5 -1
  576. package/neural-interface/public/shared/ui-workspaces.js +3 -2
  577. package/neural-interface/public/shared/view-variant.js +66 -0
  578. package/neural-interface/public/shared/whatsapp/wa-view.js +3 -3
  579. package/neural-interface/public/shared/whiteboard-list.js +172 -0
  580. package/neural-interface/public/shared/worker-end.js +10 -3
  581. package/neural-interface/public/shared/worker-questions.js +34 -0
  582. package/neural-interface/public/shared/worker-restart.js +12 -0
  583. package/neural-interface/public/sidepanel-session.html +2 -2
  584. package/neural-interface/public/variant/2d/background.js +2 -1
  585. package/neural-interface/public/variant/2d/context-menu.js +8 -2
  586. package/neural-interface/public/variant/2d/graph.js +42 -20
  587. package/neural-interface/public/variant/2d/hulls.js +14 -9
  588. package/neural-interface/public/variant/2d/lasso.js +11 -7
  589. package/neural-interface/public/variant/2d/main.js +32 -1
  590. package/neural-interface/public/variant/2d/minimap.js +11 -13
  591. package/neural-interface/public/variant/3d/main.js +69 -6
  592. package/neural-interface/public/variant/3d/map-controls.js +24 -9
  593. package/neural-interface/public/vendor/caveat/OFL.txt +93 -0
  594. package/neural-interface/public/vendor/caveat/caveat-latin-400-normal.woff2 +0 -0
  595. package/neural-interface/public/vendor/caveat/caveat-latin-700-normal.woff2 +0 -0
  596. package/neural-interface/public/vendor/caveat/caveat.css +17 -0
  597. package/neural-interface/public/vendor/caveat/manifest.json +12 -0
  598. package/neural-interface/public/vendor/yaml/LICENSE +13 -0
  599. package/neural-interface/public/vendor/yaml/manifest.json +4 -0
  600. package/neural-interface/public/vendor/yaml/yaml-2.9.1.min.js +137 -0
  601. package/neural-interface/scripts/build-vendor.mjs +32 -0
  602. package/neural-interface/server.js +4553 -2855
  603. package/neural-interface/templates/rulesets/README.md +1 -1
  604. package/neural-interface/templates/rulesets/core.md +1 -1
  605. package/neural-interface/templates/rulesets/legacy-hashes.json +23 -5
  606. package/neural-interface/templates/rulesets/manifest.json +8 -8
  607. package/npm-shrinkwrap.json +34 -12
  608. package/package.json +17 -3
  609. package/postinstall.js +9 -4
  610. package/preuninstall.js +1 -1
  611. package/setup.js +97 -322
  612. package/skills/skill-forge/SKILL.md +177 -0
  613. package/skills/skill-forge/evals/evals.json +54 -0
  614. package/skills/skill-forge/references/package.md +105 -0
  615. package/skills/skill-forge/references/review-and-recovery.md +63 -0
  616. package/skills/skill-forge/references/runtime-profiles.md +20 -0
  617. package/skills/skill-forge/references/sources-and-capabilities.md +51 -0
  618. package/skills/synabun/SKILL.md +10 -7
  619. package/skills/synabun/modules/audit.md +1 -5
  620. package/skills/synabun/modules/changelog.md +1 -5
  621. package/skills/synabun/modules/idea.md +1 -1
  622. package/skills/synabun/modules/memorize.md +6 -9
  623. package/skills/synabun/modules/schedule.md +6 -6
  624. package/mcp-server/dist/services/profiles.d.ts +0 -120
  625. package/mcp-server/dist/services/profiles.d.ts.map +0 -1
  626. package/mcp-server/dist/services/profiles.js +0 -387
  627. package/mcp-server/dist/services/profiles.js.map +0 -1
  628. package/mcp-server/dist/tools/leonardo-browser-tools.d.ts +0 -97
  629. package/mcp-server/dist/tools/leonardo-browser-tools.d.ts.map +0 -1
  630. package/mcp-server/dist/tools/leonardo-browser-tools.js +0 -228
  631. package/mcp-server/dist/tools/leonardo-browser-tools.js.map +0 -1
  632. package/mcp-server/dist/tools/leonardo.d.ts +0 -13
  633. package/mcp-server/dist/tools/leonardo.d.ts.map +0 -1
  634. package/mcp-server/dist/tools/leonardo.js +0 -21
  635. package/mcp-server/dist/tools/leonardo.js.map +0 -1
  636. package/mcp-server/dist/tools/profile.d.ts +0 -17
  637. package/mcp-server/dist/tools/profile.d.ts.map +0 -1
  638. package/mcp-server/dist/tools/profile.js +0 -114
  639. package/mcp-server/dist/tools/profile.js.map +0 -1
  640. package/mcp-server/src/services/profiles.ts +0 -428
  641. package/mcp-server/src/tools/leonardo-browser-tools.ts +0 -291
  642. package/mcp-server/src/tools/leonardo.ts +0 -30
  643. package/mcp-server/src/tools/profile.ts +0 -122
  644. package/neural-interface/lib/assistant-brains/opencode-browser-policy.js +0 -47
  645. package/neural-interface/lib/assistant-brains/opencode-route-gate.js +0 -62
  646. package/neural-interface/lib/mcp-profile-servers.js +0 -120
  647. package/neural-interface/public/shared/ui-tutorial-draw.js +0 -311
  648. package/skills/leonardo/SKILL.md +0 -168
  649. package/skills/leonardo/icon.svg +0 -1
  650. package/skills/leonardo/modules/browser-guide.md +0 -378
  651. package/skills/leonardo/modules/image-prompter.md +0 -283
  652. package/skills/leonardo/modules/model-advisor.md +0 -100
  653. package/skills/leonardo/modules/prompt-library.md +0 -110
  654. package/skills/leonardo/modules/style-guide.md +0 -186
  655. package/skills/leonardo/modules/video-prompter.md +0 -317
  656. /package/neural-interface/templates/rulesets/{gemini.md → antigravity.md} +0 -0
@@ -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;
@@ -1659,6 +1799,12 @@
1659
1799
  0 8px 20px rgba(0,0,0,0.25),
1660
1800
  0 24px 48px rgba(0,0,0,0.18);
1661
1801
  }
1802
+ html.platform-win32 .menubar-dropdown,
1803
+ html.platform-win32 .menubar-submenu {
1804
+ background: rgba(28, 28, 32, 0.98);
1805
+ backdrop-filter: none;
1806
+ -webkit-backdrop-filter: none;
1807
+ }
1662
1808
 
1663
1809
  /* Arrow caret — seamless extension of the container */
1664
1810
  .menubar-dropdown::before {
@@ -1710,6 +1856,47 @@
1710
1856
  to { opacity: 1; }
1711
1857
  }
1712
1858
 
1859
+ /* ── App context menu (shared/context-menu.js, opened by ui-context-menu.js) ──
1860
+ The dropdown's box and rows at body level, where the right-click was. Above every window, the floating
1861
+ terminals' focus counter (10000-12000), the Settings / Schedules windows (300000+) and the help overlay
1862
+ (999999); below the loading / restart screen, which opts out of the menu. */
1863
+ .app-ctx-menu {
1864
+ position: fixed;
1865
+ left: 0;
1866
+ top: 0;
1867
+ z-index: 1000000;
1868
+ min-width: 200px;
1869
+ max-width: min(360px, calc(100vw - 16px));
1870
+ max-height: calc(100vh - 16px);
1871
+ overflow-y: auto;
1872
+ overscroll-behavior: contain;
1873
+ scrollbar-width: thin;
1874
+ padding: 5px;
1875
+ background: rgba(32, 32, 36, 0.96);
1876
+ backdrop-filter: blur(var(--blur-heavy)) saturate(1.6);
1877
+ -webkit-backdrop-filter: blur(var(--blur-heavy)) saturate(1.6);
1878
+ border: 1px solid rgba(255,255,255,0.14);
1879
+ border-radius: 10px;
1880
+ box-shadow: 0 1px 3px rgba(0,0,0,0.3),
1881
+ 0 8px 20px rgba(0,0,0,0.25),
1882
+ 0 24px 48px rgba(0,0,0,0.18);
1883
+ animation: menuSubIn 0.14s ease-out;
1884
+ user-select: none;
1885
+ -webkit-user-select: none;
1886
+ outline: none;
1887
+ }
1888
+
1889
+ /* The highlighted row is the focus mark, as in the menubar's dropdowns. */
1890
+ .app-ctx-menu .menu-item:focus { outline: none; }
1891
+
1892
+ /* A long label (the selection being searched for) is cut, its shortcut stays. */
1893
+ .app-ctx-menu .menu-text { min-width: 0; }
1894
+ .app-ctx-menu .app-ctx-label { overflow: hidden; text-overflow: ellipsis; }
1895
+
1896
+ @media (prefers-reduced-motion: reduce) {
1897
+ .app-ctx-menu { animation: none; }
1898
+ }
1899
+
1713
1900
  /* ── Resume Dropdown ── */
1714
1901
 
1715
1902
  .menubar-dropdown--resume {
@@ -2863,7 +3050,7 @@
2863
3050
  .kb-backdrop {
2864
3051
  position: fixed;
2865
3052
  inset: 0;
2866
- z-index: 9998;
3053
+ z-index: 50200; /* a modal backdrop: over the app frame (49990) and the bar, the whole window */
2867
3054
  background: rgba(0, 0, 0, 0.4);
2868
3055
  backdrop-filter: blur(8px);
2869
3056
  -webkit-backdrop-filter: blur(8px);
@@ -2876,7 +3063,7 @@
2876
3063
 
2877
3064
  .keybinds-panel {
2878
3065
  position: fixed;
2879
- z-index: 9999;
3066
+ z-index: 50201;
2880
3067
  top: 50%;
2881
3068
  left: 50%;
2882
3069
  transform: translate(-50%, -50%) scale(0.95);
@@ -2984,7 +3171,7 @@
2984
3171
  }
2985
3172
  .kb-cli-claude { color: #D4A27F; }
2986
3173
  .kb-cli-codex { color: #74c7a5; }
2987
- .kb-cli-gemini { color: #669DF6; }
3174
+ .kb-cli-antigravity { color: #669DF6; }
2988
3175
 
2989
3176
  /* Keycap-style buttons */
2990
3177
  .kb-key-btn {
@@ -4267,7 +4454,7 @@
4267
4454
 
4268
4455
  /* Setup tab: provider icon accents when section expanded */
4269
4456
  #setup-claude:not(.collapsed) .gfx-group-title .cc-provider-icon { color: #d97757; }
4270
- #setup-gemini:not(.collapsed) .gfx-group-title .cc-provider-icon { color: #4285f4; }
4457
+ #setup-antigravity:not(.collapsed) .gfx-group-title .cc-provider-icon { color: #4285f4; }
4271
4458
  #setup-codex:not(.collapsed) .gfx-group-title .cc-provider-icon { color: #10a37f; }
4272
4459
 
4273
4460
  /* Setup tab: status badge */
@@ -5352,7 +5539,7 @@
5352
5539
 
5353
5540
  .tw {
5354
5541
  position: fixed;
5355
- z-index: 50100;
5542
+ z-index: 49900; /* under the app frame (49990): its rounded corners cut a window that reaches them */
5356
5543
  width: 640px;
5357
5544
  max-width: 92vw;
5358
5545
  min-width: 420px;
@@ -5937,7 +6124,8 @@
5937
6124
  html.sp-resizing .claude-panel,
5938
6125
  html.sp-resizing .codex-panel,
5939
6126
  html.sp-resizing .ocp-panel,
5940
- html.sp-resizing .ocpv2-panel {
6127
+ html.sp-resizing .ocpv2-panel,
6128
+ html.sp-resizing .agy-panel {
5941
6129
  backdrop-filter: none !important;
5942
6130
  -webkit-backdrop-filter: none !important;
5943
6131
  background: rgba(18, 18, 20, 0.985) !important;
@@ -5949,18 +6137,18 @@
5949
6137
  top: calc(var(--navbar-height, 48px) + 20px);
5950
6138
  right: calc(20px + var(--right-panel-width, var(--claude-panel-width, 0px)));
5951
6139
  /* One row in the band between the left panels (Memory Explorer, File Explorer) and the right one, 20px clear of
5952
- each, never over a left panel: where the band is narrower than the row, the dock takes a line of its own under
5953
- the buttons (wrap-reverse: the buttons' line stays on top; see "Fit" below). What still reaches left of the
6140
+ each, never over a left panel: where the band is narrower than the row, the lowest-priority buttons leave it
6141
+ for the ⋯ menu (ui-topright-overflow.js; see "Fit" below), so the row never wraps. What still reaches left of the
5954
6142
  band (no band at all between wide panels, a dropdown that opens leftwards) is cut off at the band's edge:
5955
6143
  nothing of the toolbar is drawn, or takes a click, over a left panel. */
5956
- max-width: var(--topright-band);
6144
+ max-width: calc(var(--topright-band) - var(--topright-tray-inset));
5957
6145
  min-height: 40px; /* the dock's height: the buttons and the pills stay where they are when it hides */
5958
6146
  justify-content: flex-end;
5959
6147
  clip-path: inset(-100vh -100vw -200vh calc(var(--sidebar-total-width, 0px) + var(--right-panel-width, var(--claude-panel-width, 0px)) + 40px + 100% - 100vw));
5960
6148
  transition: right 0.3s cubic-bezier(0.22, 1, 0.36, 1);
5961
6149
  z-index: 400;
5962
6150
  display: flex;
5963
- flex-wrap: wrap-reverse;
6151
+ flex-wrap: nowrap;
5964
6152
  align-items: center;
5965
6153
  gap: 6px;
5966
6154
  font-family: inherit;
@@ -5991,6 +6179,8 @@
5991
6179
  display: flex;
5992
6180
  align-items: center;
5993
6181
  flex-shrink: 0;
6182
+ /* One line, always: what does not fit the band goes into the ⋯ menu (ui-topright-overflow.js). */
6183
+ flex-wrap: nowrap;
5994
6184
  gap: 2px;
5995
6185
  overflow: visible;
5996
6186
  background: rgba(18, 18, 22, 0.65);
@@ -6008,13 +6198,123 @@
6008
6198
  box-shadow: var(--shadow-lg), var(--shadow-highlight);
6009
6199
  }
6010
6200
 
6011
- /* The tools toggle and the agent side panels: one row of their own that never wraps, at the bar's right edge. */
6201
+ /* The ⋯, the tools toggle and the agent side panels: one row at the bar's right edge that never wraps. */
6012
6202
  #topright-buttons {
6203
+ position: relative;
6013
6204
  display: flex;
6014
6205
  align-items: center;
6015
6206
  flex-shrink: 0;
6207
+ flex-wrap: nowrap;
6016
6208
  gap: 6px;
6017
- min-height: 40px; /* the dock's height: a bar that wraps keeps its lines 40px apart, the buttons where they were */
6209
+ min-height: 40px; /* the dock's height: the buttons stay where they are when it hides */
6210
+ }
6211
+
6212
+ /* ── Overflow: a button that does not fit the band leaves the row for the ⋯ menu (ui-topright-overflow.js) ── */
6213
+ #topright-controls .tr-overflowed {
6214
+ display: none !important;
6215
+ }
6216
+ #topright-overflow-btn {
6217
+ display: none;
6218
+ }
6219
+ #topright-controls.has-overflow #topright-overflow-btn {
6220
+ display: flex;
6221
+ }
6222
+ /* The menu hangs from the bar's right edge, over the session pills (z-index inside the row's stacking context),
6223
+ opaque like the dock's other menus since its blur cannot reach the pills. */
6224
+ #topright-overflow-menu {
6225
+ position: absolute;
6226
+ top: calc(100% + 6px);
6227
+ right: 0;
6228
+ z-index: 3;
6229
+ min-width: 200px;
6230
+ max-width: calc(var(--topright-band) - var(--topright-tray-inset));
6231
+ max-height: calc(100vh - var(--navbar-height, 48px) - 90px);
6232
+ overflow-y: auto;
6233
+ display: flex;
6234
+ flex-direction: column;
6235
+ gap: 2px;
6236
+ padding: 4px;
6237
+ box-sizing: border-box;
6238
+ background: rgb(18, 18, 22);
6239
+ border: 1px solid var(--b-subtle, rgba(255, 255, 255, 0.06));
6240
+ border-radius: 10px;
6241
+ box-shadow: var(--shadow-lg), var(--shadow-highlight);
6242
+ }
6243
+ #topright-overflow-menu[hidden] {
6244
+ display: none;
6245
+ }
6246
+ .topright-overflow-item {
6247
+ position: relative;
6248
+ display: flex;
6249
+ align-items: center;
6250
+ gap: 8px;
6251
+ width: 100%;
6252
+ min-height: 30px;
6253
+ padding: 0 10px 0 8px;
6254
+ background: transparent;
6255
+ border: none;
6256
+ border-radius: 5px;
6257
+ color: var(--t-muted);
6258
+ font: 400 13px/1.45 inherit;
6259
+ font-family: inherit;
6260
+ text-align: left;
6261
+ cursor: pointer;
6262
+ white-space: nowrap;
6263
+ }
6264
+ .topright-overflow-item:hover,
6265
+ .topright-overflow-item:focus-visible {
6266
+ background: rgba(255, 255, 255, 0.08);
6267
+ color: var(--t-bright);
6268
+ outline: none;
6269
+ }
6270
+ .topright-overflow-item.active {
6271
+ color: var(--t-bright);
6272
+ }
6273
+ .topright-overflow-item.active::before {
6274
+ content: '';
6275
+ position: absolute;
6276
+ left: 2px;
6277
+ top: 50%;
6278
+ transform: translateY(-50%);
6279
+ width: 2.5px;
6280
+ height: 12px;
6281
+ border-radius: 2px;
6282
+ background: var(--accent-blue);
6283
+ }
6284
+ .topright-overflow-icon {
6285
+ display: flex;
6286
+ align-items: center;
6287
+ justify-content: center;
6288
+ width: 16px;
6289
+ flex-shrink: 0;
6290
+ }
6291
+ .topright-overflow-icon svg {
6292
+ width: 14px;
6293
+ height: 14px;
6294
+ stroke: currentColor;
6295
+ stroke-width: 1.7;
6296
+ fill: none;
6297
+ }
6298
+ .topright-overflow-icon svg[fill="currentColor"] {
6299
+ fill: currentColor;
6300
+ stroke: none;
6301
+ }
6302
+ .topright-overflow-label {
6303
+ flex: 1;
6304
+ min-width: 0;
6305
+ overflow: hidden;
6306
+ text-overflow: ellipsis;
6307
+ }
6308
+ .topright-overflow-item .topright-overflow-badge {
6309
+ position: static;
6310
+ font-size: 10px;
6311
+ min-width: 16px;
6312
+ height: 16px;
6313
+ line-height: 16px;
6314
+ padding: 0 4px;
6315
+ border-radius: 8px;
6316
+ text-align: center;
6317
+ font-weight: 600;
6018
6318
  }
6019
6319
 
6020
6320
  /* Hidden by the tools toggle (#topright-tools-btn, ui-navbar.js): the buttons and the pills stay where they are. */
@@ -6022,14 +6322,82 @@
6022
6322
  display: none;
6023
6323
  }
6024
6324
 
6025
- /* ── Fit: the buttons one row in any band, nothing hidden, nothing over a left panel ──
6325
+ /* ── The whiteboard rail toggle (ui-navbar.js): #wb-hide-btn at the rail's foot hides the rail (#wb-toolbar,
6326
+ pickers included: they are its children); the SynaBun logo button (#toolbar-show-btn) above the console button
6327
+ (#term-peek-dock) brings it back. Shown only while the whiteboard is (#static-bg.visible, Focus Mode). The
6328
+ workspace toolbar and the session pills are never touched. ── */
6329
+ #wb-toolbar {
6330
+ transition: opacity 0.22s ease, translate 0.22s cubic-bezier(0.22, 1, 0.36, 1), visibility 0s linear 0s;
6331
+ }
6332
+ #wb-toolbar.wb-rail-hidden {
6333
+ opacity: 0;
6334
+ visibility: hidden;
6335
+ pointer-events: none;
6336
+ translate: -12px 0;
6337
+ transition: opacity 0.22s ease, translate 0.22s cubic-bezier(0.22, 1, 0.36, 1), visibility 0s linear 0.22s;
6338
+ }
6339
+ #toolbar-show-btn {
6340
+ position: fixed;
6341
+ left: calc(var(--sidebar-total-width, 0px) + 16px);
6342
+ bottom: 64px; /* directly above the console button (#term-peek-dock: 40px at bottom 16px), 8px between */
6343
+ z-index: 149;
6344
+ display: flex;
6345
+ align-items: center;
6346
+ justify-content: center;
6347
+ width: 40px;
6348
+ height: 40px;
6349
+ padding: 0;
6350
+ background: rgba(18, 18, 20, 0.85);
6351
+ backdrop-filter: blur(var(--blur-heavy)) saturate(1.4);
6352
+ -webkit-backdrop-filter: blur(var(--blur-heavy)) saturate(1.4);
6353
+ border: 1px solid rgba(255, 255, 255, 0.08);
6354
+ border-radius: 10px;
6355
+ box-shadow: var(--shadow-md), var(--shadow-highlight);
6356
+ cursor: pointer;
6357
+ animation: toolbar-show-in 0.22s cubic-bezier(0.22, 1, 0.36, 1);
6358
+ transition: background 0.2s, border-color 0.2s;
6359
+ }
6360
+ #toolbar-show-btn[hidden],
6361
+ body:not(:has(#static-bg.visible)) #toolbar-show-btn,
6362
+ body.fe-editor-open #toolbar-show-btn {
6363
+ display: none;
6364
+ }
6365
+ #toolbar-show-btn img {
6366
+ width: 22px;
6367
+ height: 22px;
6368
+ object-fit: contain;
6369
+ opacity: 0.75;
6370
+ pointer-events: none;
6371
+ transition: opacity 0.2s;
6372
+ }
6373
+ #toolbar-show-btn:hover {
6374
+ background: rgba(24, 24, 28, 0.95);
6375
+ border-color: rgba(255, 255, 255, 0.16);
6376
+ }
6377
+ #toolbar-show-btn:hover img,
6378
+ #toolbar-show-btn:focus-visible img {
6379
+ opacity: 1;
6380
+ }
6381
+ #toolbar-show-btn:focus-visible {
6382
+ outline: 1px solid rgba(255, 255, 255, 0.4);
6383
+ outline-offset: 2px;
6384
+ }
6385
+ @keyframes toolbar-show-in {
6386
+ from { opacity: 0; transform: translateY(6px) scale(0.92); }
6387
+ to { opacity: 1; transform: none; }
6388
+ }
6389
+ #wb-hide-btn svg {
6390
+ stroke-width: 2;
6391
+ }
6392
+
6393
+ /* ── Fit: one row in any band, nothing out of reach, nothing over a left panel ──
6026
6394
  --topright-row is the row at its widest without the workspace name: the dock (the switcher with its save button,
6027
6395
  50px; seven tools of 30px and the update button; two dividers; the dock's gaps and edges: 298px in all, 266px
6028
6396
  while the update button is hidden), then --topright-buttons, the tools toggle and the four agent buttons with
6029
- the gaps before them (190px). Below row + 45px of band the workspace name goes into the switcher's tooltip
6397
+ the gaps before them (222px: six 32px buttons, five 6px gaps). Below row + 45px of band the workspace name goes into the switcher's tooltip
6030
6398
  (--topright-compact; it shows from 40px on, up to 120px, and takes what the band leaves it). Below the row itself
6031
- the bar wraps (#topright-controls: flex-wrap: wrap-reverse): the toggle and the agent buttons stay on top, in one
6032
- row, and the dock takes a line of its own right under them, right-aligned, still one row. --topright-compact is
6399
+ nothing wraps: the buttons that do not fit leave the row for the ⋯ menu, lowest priority first
6400
+ (ui-topright-overflow.js OVERFLOW_ORDER, measured live). --topright-compact is
6033
6401
  1 below its width and 0 from it up (tan(atan2()) divides a length by a length); it lives on :root so that a
6034
6402
  style query reaches the name. Change --topright-row (or --topright-buttons) with the controls of the row. */
6035
6403
  @property --topright-compact {
@@ -6039,7 +6407,7 @@
6039
6407
  }
6040
6408
  :root {
6041
6409
  --topright-band: calc(100vw - var(--sidebar-total-width, 0px) - var(--right-panel-width, var(--claude-panel-width, 0px)) - 40px);
6042
- --topright-buttons: 190px;
6410
+ --topright-buttons: 222px;
6043
6411
  --topright-row: calc(298px + var(--topright-buttons));
6044
6412
  --topright-compact: clamp(0, tan(atan2(calc(var(--topright-row) + 45px - var(--topright-band)), 0.01px)), 1);
6045
6413
  }
@@ -6086,6 +6454,7 @@
6086
6454
  #topright-controls > #term-minimized-tray > .term-minimized-pill .term-minimized-pill-label,
6087
6455
  #topright-controls > #term-minimized-tray > .term-minimized-pill:hover .term-minimized-pill-label {
6088
6456
  max-width: clamp(28px, calc(var(--topright-band) - var(--topright-tray-inset) - 62px), 100px);
6457
+ transition: none;
6089
6458
  }
6090
6459
 
6091
6460
  /* ── Thin divider between groups ── */
@@ -6160,6 +6529,32 @@
6160
6529
  .topright-icon-btn:hover svg {
6161
6530
  filter: drop-shadow(0 0 4px rgba(255, 255, 255, 0.2));
6162
6531
  }
6532
+
6533
+ /* The desktop app's Restart to update (ui-update.js desktopRestartButton): while a downloaded update waits for a
6534
+ restart, the update button grows into a pill with its words, in the update badge's own green, as Discord's
6535
+ green button does. */
6536
+ #topright-update-btn.update-ready {
6537
+ width: auto;
6538
+ gap: 6px;
6539
+ padding: 0 10px 0 8px;
6540
+ color: #34c759;
6541
+ background: rgba(52, 199, 89, 0.14);
6542
+ box-shadow: inset 0 0 0 1px rgba(52, 199, 89, 0.25);
6543
+ }
6544
+ #topright-update-btn.update-ready:hover {
6545
+ color: #34c759;
6546
+ background: rgba(52, 199, 89, 0.22);
6547
+ transform: none;
6548
+ }
6549
+ #topright-update-btn.update-ready .count-badge { display: none; }
6550
+ #topright-update-btn.update-ready--asked { opacity: 0.8; }
6551
+ #topright-update-btn[aria-busy="true"] { cursor: progress; }
6552
+ #topright-update-btn .update-ready-label {
6553
+ font-size: 12px;
6554
+ font-weight: 500;
6555
+ line-height: 1;
6556
+ white-space: nowrap;
6557
+ }
6163
6558
  #topright-assistant-panel-btn svg,
6164
6559
  #topright-codex-panel-btn svg,
6165
6560
  #topright-opencode-panel-btn svg {
@@ -6182,11 +6577,13 @@
6182
6577
  }
6183
6578
 
6184
6579
  /* ── Standalone buttons outside the unified bar (the tools toggle, the side panels) ── */
6580
+ #topright-overflow-btn,
6185
6581
  #topright-tools-btn,
6186
6582
  #topright-assistant-panel-btn,
6187
6583
  #topright-claude-panel-btn,
6188
6584
  #topright-codex-panel-btn,
6189
- #topright-opencode-panel-btn {
6585
+ #topright-opencode-panel-btn,
6586
+ #topright-antigravity-panel-btn {
6190
6587
  background: rgba(18, 18, 22, 0.65);
6191
6588
  backdrop-filter: blur(var(--blur-heavy)) saturate(1.3);
6192
6589
  -webkit-backdrop-filter: blur(var(--blur-heavy)) saturate(1.3);
@@ -6196,11 +6593,13 @@
6196
6593
  width: 32px;
6197
6594
  height: 32px;
6198
6595
  }
6596
+ #topright-overflow-btn:hover,
6199
6597
  #topright-tools-btn:hover,
6200
6598
  #topright-assistant-panel-btn:hover,
6201
6599
  #topright-claude-panel-btn:hover,
6202
6600
  #topright-codex-panel-btn:hover,
6203
- #topright-opencode-panel-btn:hover {
6601
+ #topright-opencode-panel-btn:hover,
6602
+ #topright-antigravity-panel-btn:hover {
6204
6603
  background: rgba(24, 24, 30, 0.8);
6205
6604
  border-color: rgba(255, 255, 255, 0.1);
6206
6605
  }
@@ -7459,7 +7858,7 @@
7459
7858
  .ocpv2-session-pill, .ocpv2-part-tool, .ocpv2-input-wrap, .ocpv2-compose-btn,
7460
7859
  .ocp-session-pill, .ocp-tool-card, .ocp-input-shell, .term-minimized-pill-label)::before,
7461
7860
  body.ui-interacting :is(.wb-tool.locked, .cp-session-pill,
7462
- .cxp-session-pill, .ocpv2-session-pill,
7861
+ .cxp-session-pill, .ocpv2-session-pill, .agy-session-pill,
7463
7862
  .ocp-session-pill, .term-minimized-pill-label)::after { animation-play-state: paused !important; }
7464
7863
 
7465
7864
  /* Hidden tab: freeze the 30+ infinite glow/pulse animations so a background
@@ -8313,9 +8712,8 @@
8313
8712
  z-index: 500000;
8314
8713
  padding: 5px 10px;
8315
8714
  border-radius: 6px;
8316
- background: rgba(30, 34, 44, 0.92);
8715
+ background: rgba(26, 30, 40, 0.96);
8317
8716
  border: 1px solid rgba(255,255,255,0.08);
8318
- backdrop-filter: blur(12px);
8319
8717
  color: rgba(255,255,255,0.85);
8320
8718
  font-size: 12.5px;
8321
8719
  font-family: inherit;
@@ -8388,13 +8786,13 @@
8388
8786
  }
8389
8787
  /* Drag-to-terminal grip */
8390
8788
  .detail-drag-to-term {
8391
- cursor: grab;
8789
+ cursor: move;
8392
8790
  color: var(--accent-blue);
8393
8791
  opacity: 0.5;
8394
8792
  transition: opacity 0.15s;
8395
8793
  }
8396
8794
  .detail-drag-to-term:hover { opacity: 1; }
8397
- .detail-drag-to-term:active { cursor: grabbing; }
8795
+ .detail-drag-to-term:active { cursor: move; }
8398
8796
  .detail-card.detail-dragging-to-term { opacity: 0.45; }
8399
8797
 
8400
8798
  /* ── Compact mode ── */
@@ -9582,8 +9980,15 @@
9582
9980
  .sm-backdrop.backdrop-hidden,
9583
9981
  .ig-backdrop.backdrop-hidden {
9584
9982
  opacity: 0 !important;
9983
+ backdrop-filter: none !important;
9984
+ -webkit-backdrop-filter: none !important;
9585
9985
  pointer-events: none;
9586
9986
  }
9987
+ html.platform-win32 .studio-backdrop {
9988
+ background: rgba(5, 5, 8, 0.62);
9989
+ backdrop-filter: none;
9990
+ -webkit-backdrop-filter: none;
9991
+ }
9587
9992
 
9588
9993
  /* ── Settings Panel (draggable/pinnable) ── */
9589
9994
  .settings-panel {
@@ -11565,19 +11970,6 @@
11565
11970
  color: rgba(255,255,255,0.64);
11566
11971
  padding: 3px 0;
11567
11972
  }
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
11973
 
11582
11974
  /* MCP server rows */
11583
11975
  .stg-mcp-row {
@@ -11648,308 +12040,19 @@
11648
12040
  margin: 0;
11649
12041
  max-width: 420px;
11650
12042
  }
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;
11694
- border: none;
11695
- }
11696
-
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);
11725
- }
11726
- .stg-mx-label-inner {
11727
- display: flex;
11728
- align-items: center;
11729
- gap: 6px;
11730
- }
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;
11757
- display: inline-flex;
11758
- 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);
11765
- }
11766
-
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;
11777
- }
11778
- .stg-mx-profile-th.active {
11779
- border-bottom-color: rgba(148,163,184,0.12);
11780
- background: rgba(148,163,184,0.02);
11781
- }
11782
- .stg-mx-profile-head {
11783
- display: flex;
11784
- flex-direction: column;
11785
- 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;
11793
- }
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;
11799
- border-radius: 50%;
11800
- background: rgba(148,163,184,0.18);
11801
- transition: background 0.2s ease, box-shadow 0.2s ease;
11802
- }
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);
11806
- }
11807
- .stg-mx-profile-name {
11808
- font-size: 10px;
11809
- color: rgba(255,255,255,0.5);
11810
- 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;
12043
+ .stg-mcp-empty-note { padding: 12px 14px; font-size: 11px; color: var(--t-secondary); line-height: 1.5; }
12044
+
12045
+ /* Shared small actions */
12046
+ .stg-mx-srv-del {
12047
+ background: none;
12048
+ border: none;
12049
+ color: rgba(148,163,184,0.24);
12050
+ cursor: pointer;
12051
+ font-size: 12px;
12052
+ padding: 0 2px;
12053
+ line-height: 1;
12054
+ transition: color 0.12s ease;
12055
+ flex-shrink: 0;
11953
12056
  }
11954
12057
  .stg-mx-srv-del:hover { color: rgba(255,82,82,0.72); }
11955
12058
 
@@ -12046,46 +12149,6 @@
12046
12149
  .stg-mx-ext-remove {
12047
12150
  margin-left: auto;
12048
12151
  }
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
12152
  /* Add-server form */
12090
12153
  .stg-mcp-add-form {
12091
12154
  margin-top: 10px;
@@ -12325,7 +12388,7 @@
12325
12388
  display: none;
12326
12389
  }
12327
12390
 
12328
- /* Top-level page tabs (Profiles / Installed) inside the MCP settings page */
12391
+ /* Top-level page tabs (Default tools / Installed) inside the MCP settings page */
12329
12392
  .stg-mcp-page-tabs {
12330
12393
  display: inline-flex;
12331
12394
  gap: 2px;
@@ -14146,8 +14209,8 @@
14146
14209
  .settings-panel .stg-card .stg-mcp-form-grid .stg-field { margin-bottom: 0; }
14147
14210
  /* a field of the Add-a-server form is half the form wide: a popup or a number stacks under its label like the text
14148
14211
  fields beside it, instead of taking the label's line and squeezing the label and the help into what is left */
14149
- .settings-panel .stg-card .stg-mcp-form-grid .stg-field:has(> :is(select, input[type="number"])) { display: block; }
14150
- .settings-panel .stg-card .stg-mcp-form-grid .stg-field:has(> :is(select, input[type="number"])) > label { margin: 0 0 6px; }
14212
+ .settings-panel .stg-card .stg-mcp-form-grid .stg-field:has(> :is(select, .cc-dropdown, input[type="number"])) { display: block; }
14213
+ .settings-panel .stg-card .stg-mcp-form-grid .stg-field:has(> :is(select, .cc-dropdown, input[type="number"])) > label { margin: 0 0 6px; }
14151
14214
  .settings-panel .stg-card .stg-mcp-form-label { font-size: 12px; color: var(--stg-help); }
14152
14215
  .settings-panel .stg-card .stg-mcp-env-add { font-size: 12px; color: var(--stg-body); }
14153
14216
  .settings-panel .stg-card .stg-mcp-gh-optrun { font-size: 13px; color: var(--stg-text); }
@@ -14231,13 +14294,13 @@
14231
14294
  .settings-panel .settings-content :is(
14232
14295
  .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
14296
  .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,
14297
+ .ocp-danger-meta, .stg-callout-copy, .stg-callout-note, .db-model-footer, .settings-status, .settings-status span,
14235
14298
  .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
14299
  .project-storage-intro, .project-storage-stat span, .project-storage-stat strong, .project-storage-loading strong, .project-storage-loading small,
14237
14300
  .project-storage-safety-note, .project-storage-btn, .project-storage-placeholder, .project-storage-feedback,
14238
14301
  .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,
14302
+ .stg-mcp-section-header, .stg-mx-always-chip,
14303
+ .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
14304
  .stg-mcp-page-tab, .cc-cheatsheet-table code, .wa-mode-notes li, .recall-control-scale span,
14242
14305
  select option
14243
14306
  ) { font-size: 12px; }
@@ -14253,8 +14316,7 @@
14253
14316
  Census: tools/literals.js contrast(). Dimmed-by-state text (disabled buttons, hidden models, a provider that is
14254
14317
  not connected) and buttons drawn on a gradient are the exceptions, recorded in SPEC.md. */
14255
14318
  .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,
14319
+ .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
14320
  .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
14321
  .stg-callout-note, .project-storage-path, .project-storage-item-meta, .project-storage-protection, .project-storage-group-path, .project-storage-group-total,
14260
14322
  .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 +14400,6 @@
14338
14400
  .stg-mcp-note strong { font-size: 9px; }
14339
14401
  .stg-mcp-note span { font-size: 10.5px; }
14340
14402
  .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
14403
  .stg-mcp-form-grid { grid-template-columns: 1fr; }
14347
14404
  /* Permissions — tighter items at medium width */
14348
14405
  .cc-tool-category .cc-integration-item { padding: 5px 8px; }
@@ -14377,14 +14434,8 @@
14377
14434
  .stg-toggle-row label { font-size: 11px; }
14378
14435
  .stg-mcp-note { flex-direction: column; }
14379
14436
  .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
14437
  .stg-mx-ext-main { align-items: flex-start; flex-wrap: wrap; }
14385
14438
  .stg-mx-ext-remove { margin-left: 0; }
14386
- .stg-mx-ext-profiles { gap: 5px; }
14387
- .stg-mx-ext-toggle { min-height: 26px; }
14388
14439
  /* OpenCode responsive — narrow */
14389
14440
  .ocp-server-bar { flex-direction: column; align-items: stretch; gap: 8px; }
14390
14441
  .ocp-server-bar-right { justify-content: flex-start; }
@@ -14473,7 +14524,7 @@
14473
14524
 
14474
14525
  /* ── Buttons: 13px, 6px corners, a neutral fill with a hairline ── */
14475
14526
  .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,
14527
+ .skin-upload-btn, .ocp-history-clear-btn, .conn-add-btn, .conn-action-btn, .ocp-srv-btn, .cc-explore-btn, .cc-trust-btn,
14477
14528
  .cc-enable-btn, .cc-disable-btn, .cc-remove-panel-btn, .skin-activate, .skin-remove) {
14478
14529
  min-height: 28px; padding: 4px 12px;
14479
14530
  font-family: inherit; font-size: 13px; font-weight: 400; line-height: 1.25;
@@ -14482,7 +14533,7 @@
14482
14533
  transition: background-color 0.15s ease, color 0.15s ease;
14483
14534
  }
14484
14535
  .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,
14536
+ .skin-upload-btn, .ocp-history-clear-btn, .conn-add-btn, .conn-action-btn, .ocp-srv-btn, .cc-explore-btn, .cc-trust-btn,
14486
14537
  .cc-enable-btn, .cc-disable-btn, .cc-remove-panel-btn, .skin-activate, .skin-remove):hover:not(:disabled) {
14487
14538
  color: #fff; background: var(--stg-control-hover); border-color: var(--stg-field-line); transform: none;
14488
14539
  }
@@ -14562,11 +14613,11 @@
14562
14613
  .settings-panel .settings-content .stg-badge-warn { color: var(--stg-warn); }
14563
14614
  .settings-panel .settings-content .stg-badge-err { color: var(--stg-err); }
14564
14615
  .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) {
14616
+ /* toggle chips (a skill's targets): small 6px-corner buttons, the accent when on */
14617
+ .settings-panel .settings-content :is(.cc-skill-target) {
14567
14618
  border-radius: 6px; font-size: 12px; letter-spacing: 0;
14568
14619
  }
14569
- .settings-panel .settings-content :is(.cc-skill-target, .stg-mx-ext-toggle).on { color: #fff; background: var(--stg-accent-fill); border-color: transparent; }
14620
+ .settings-panel .settings-content :is(.cc-skill-target).on { color: #fff; background: var(--stg-accent-fill); border-color: transparent; }
14570
14621
 
14571
14622
  /* Boxes inside a group (callouts, server bars, choice cards): one radius, a hairline, no tint or glow */
14572
14623
  .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 +14762,7 @@
14711
14762
  }
14712
14763
  .settings-panel .stg-card-status .ocp-status-dot[data-state="ok"] { background: var(--stg-ok); }
14713
14764
  .settings-panel .stg-card-status .ocp-status-dot[data-state="warn"] { background: var(--stg-warn); }
14765
+ .settings-panel .settings-content .ocp-install-note[data-tone="warn"] { color: var(--stg-warn); }
14714
14766
  .settings-panel .stg-card-status .ocp-status-dot[data-state="err"] { background: var(--stg-err); }
14715
14767
  .settings-panel .stg-card-status .ocp-server-bar-status { font-size: 12px; font-weight: 400; color: var(--stg-help); }
14716
14768
 
@@ -14934,17 +14986,8 @@
14934
14986
  min-width: 0; padding: 0; overflow-wrap: anywhere;
14935
14987
  font-family: var(--ff-mono, 'JetBrains Mono', 'SF Mono', monospace); font-size: 12px; color: var(--stg-text);
14936
14988
  }
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; }
14989
+ /* the permission is a .cc-dropdown of its own width, at the end of the row */
14990
+ .settings-panel .settings-content .stg-tool-row .stg-ocp-tool-perm { flex: 0 0 110px; width: 110px; }
14948
14991
 
14949
14992
  /* H. History: label and help, the size as secondary text, the clear button */
14950
14993
  .settings-panel .settings-content .ocp-danger-row { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 16px; }
@@ -15038,12 +15081,11 @@
15038
15081
  /* every row label is regular weight; titles above groups keep the semibold */
15039
15082
  .settings-panel .settings-content :is(.stg-field > label, .stg-toggle-label, .settings-field > label, .cc-integration-label, .cli-path-label, .recall-control-label,
15040
15083
  .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,
15084
+ .stg-mx-ext-name, .wa-title, .wa-radio > span > :first-child, .cc-skill-name, .skin-name,
15042
15085
  .stg-model-toggle-name, .stg-tool-name, .project-storage-item-title-row strong, .bc-profile-name) { font-weight: 400; }
15043
15086
  .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
15087
  /* 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; }
15088
+ .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
15089
  .settings-panel .settings-content :is(strong, b) { font-weight: 500; }
15048
15090
  .settings-panel .settings-content :is([style*="font-weight:600"], [style*="font-weight: 600"], [style*="font-weight:700"], [style*="font-weight: 700"],
15049
15091
  [style*="font-weight:650"], [style*="font-weight: 650"]) { font-weight: 500 !important; }
@@ -15080,9 +15122,9 @@
15080
15122
 
15081
15123
  /* ── Push button: 22px, 12px / 500, 5px corners, a faint fill and a hairline. Nothing in the panel is bigger. ── */
15082
15124
  .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,
15125
+ .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
15126
  .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),
15127
+ .cc-skill-target),
15086
15128
  .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
15129
  .settings-panel .settings-content .ocp-server-bar .ocp-srv-btn,
15088
15130
  .settings-panel .settings-content .stg-provider-card .stg-action-btn.compact,
@@ -15096,9 +15138,9 @@
15096
15138
  cursor: pointer; transition: background-color 0.15s ease, color 0.15s ease;
15097
15139
  }
15098
15140
  .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,
15141
+ .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
15142
  .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; }
15143
+ .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
15144
  .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
15145
  .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
15146
  .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 +15148,15 @@
15106
15148
  .settings-panel .settings-content :is(.stg-save-btn, .wa-btn-accent, .wa-primary, .bc-action-save),
15107
15149
  .settings-panel .stg-pane-actions .bc-action-btn.bc-action-save { color: #fff; background: var(--stg-accent-fill); border-color: transparent; }
15108
15150
  .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; }
15151
+ /* toggle chips (a skill's targets, a category's "All"): the push button, filled when on */
15152
+ .settings-panel .settings-content :is(.cc-skill-target, .cc-tool-category-all) { padding: 0 8px; font-weight: 400; }
15153
+ .settings-panel .settings-content :is(.cc-skill-target, .cc-tool-category-all).on { color: #fff; background: var(--stg-accent-fill); border-color: transparent; }
15112
15154
  .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
15155
  .settings-panel .settings-content :is(.wa-btn-danger, .project-storage-btn.danger, .cc-remove-panel-btn):hover:not(:disabled) { color: var(--stg-err); }
15114
15156
  .settings-panel .settings-content .cc-trust-btn { color: var(--stg-warn); }
15115
15157
  .settings-panel .settings-content :is(button, .stg-action-btn):disabled { opacity: 0.45; cursor: default; }
15116
15158
  /* 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),
15159
+ .settings-panel .settings-content :is(.ocp-srv-btn-icon, .settings-toggle-vis, .discord-eye-btn, .stg-ocp-key-cancel),
15118
15160
  .settings-panel .settings-content .ocp-server-bar .ocp-srv-btn.ocp-srv-btn-icon,
15119
15161
  .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
15162
  .settings-panel .settings-content :is(.ocp-srv-btn-icon, .settings-toggle-vis, .discord-eye-btn) svg { width: 12px; height: 12px; }
@@ -15263,8 +15305,7 @@
15263
15305
  .settings-panel :is(.stg-dropdown, .bc-dropdown) .cc-dropdown-item { padding: 3px 9px; font-size: 12px; }
15264
15306
  .settings-panel .settings-content .cc-dropdown-item { font-size: 12px; }
15265
15307
  .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 {
15308
+ .settings-panel .settings-content .stg-card select.stg-input {
15268
15309
  appearance: none; -webkit-appearance: none;
15269
15310
  height: 22px; min-height: 22px; box-sizing: border-box; width: auto; min-width: 110px; padding: 0 22px 0 8px;
15270
15311
  font-family: var(--stg-font); font-size: 12px; line-height: 20px; color: var(--stg-text);
@@ -15273,7 +15314,6 @@
15273
15314
  background-repeat: no-repeat; background-position: right 7px center; background-size: 7px 10px;
15274
15315
  border: 1px solid rgba(255,255,255,0.10); border-radius: 5px; box-shadow: none; cursor: pointer;
15275
15316
  }
15276
- .settings-panel .settings-content .stg-tool-row .stg-tool-select { width: 110px; }
15277
15317
  /* controls that carry their old size inline (AI decisions, Automations): the scale wins */
15278
15318
  .settings-panel .settings-content select[style] {
15279
15319
  height: 22px !important; padding: 0 22px 0 8px !important; line-height: 20px !important;
@@ -15385,6 +15425,8 @@
15385
15425
  .settings-panel .settings-content .uc-save-status { margin: 0 0 8px; max-width: none; color: var(--stg-err); }
15386
15426
  .settings-panel .settings-content .uc-applies { margin: 0 0 2px; max-width: none; }
15387
15427
  .settings-panel .settings-content :is(.uc-status-note, .uc-save-status, .uc-applies)[hidden] { display: none; }
15428
+ /* SynaBun hooks in Claude Code: Repair, a text action under the switch's notes (its text in line with theirs) */
15429
+ .settings-panel .settings-content .stg-card .cc-copy-btn.ch-repair { margin: 4px 0 0 -4px; }
15388
15430
  .settings-panel .settings-content .uc-digest { margin: 14px 0 16px; }
15389
15431
  /* Settings → Automations → Greeting: the preview is the card every panel shows (shared/greeting/), set left in the section. */
15390
15432
  .settings-panel .settings-content .gr-preview { margin-bottom: 4px; }
@@ -16205,7 +16247,7 @@
16205
16247
  color: var(--t-dimmed);
16206
16248
  flex-shrink: 0;
16207
16249
  }
16208
- .explorer-memory[draggable="true"] { cursor: grab; }
16250
+ .explorer-memory[draggable="true"] { cursor: move; }
16209
16251
  .explorer-memory.dragging { opacity: 0.4; }
16210
16252
 
16211
16253
  /* Label — truncated */
@@ -16383,7 +16425,7 @@
16383
16425
  font-size: 11px;
16384
16426
  text-align: center;
16385
16427
  color: rgba(255,255,255,0.15);
16386
- cursor: grab;
16428
+ cursor: move;
16387
16429
  opacity: 0;
16388
16430
  transition: opacity 0.15s;
16389
16431
  flex-shrink: 0;
@@ -16670,6 +16712,28 @@
16670
16712
  flex-shrink: 0;
16671
16713
  }
16672
16714
  .fe-branch-btn-badge:empty { display: none; }
16715
+ /* Scan state: a dot in the corner, out of the flow, so no state moves the row (words: tooltip, label, popover). */
16716
+ .fe-branch-btn-state {
16717
+ position: absolute;
16718
+ top: 2px;
16719
+ right: 2px;
16720
+ width: 4px;
16721
+ height: 4px;
16722
+ border-radius: 50%;
16723
+ background: transparent;
16724
+ pointer-events: none;
16725
+ }
16726
+ .fe-branch-btn[data-scan-state="scanning"] .fe-branch-btn-state { background: var(--t-secondary); }
16727
+ .fe-branch-btn[data-scan-state="timed-out"] .fe-branch-btn-state { background: var(--fe-git-modified); }
16728
+ .fe-branch-btn[data-scan-state="failed"] .fe-branch-btn-state { background: var(--fe-git-deleted); }
16729
+ .fe-branch-btn[data-scan-state="scanning"] > svg { opacity: 0.5; }
16730
+ .fe-branch-btn--placeholder .fe-branch-btn-name { color: var(--t-secondary); }
16731
+ @media (prefers-reduced-motion: no-preference) {
16732
+ .fe-branch-btn[data-scan-state="scanning"] .fe-branch-btn-state { animation: fe-git-scan-pulse 1.2s ease-in-out infinite; }
16733
+ }
16734
+ @keyframes fe-git-scan-pulse { 50% { opacity: 0.3; } }
16735
+ /* Read out by screen readers only; takes no room in the row. */
16736
+ .fe-git-scan-live { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; }
16673
16737
 
16674
16738
  /* ── Git popover ── */
16675
16739
  .fe-git-popover {
@@ -16824,6 +16888,15 @@
16824
16888
  line-height: 1.5;
16825
16889
  }
16826
16890
  .fe-git-summary:empty { display: none; }
16891
+ .fe-git-scan-state {
16892
+ font-size: 10.5px;
16893
+ font-family: var(--ff-mono);
16894
+ color: var(--t-secondary);
16895
+ line-height: 1.5;
16896
+ }
16897
+ .fe-git-scan-state[hidden] { display: none; }
16898
+ .fe-git-scan-state[data-tone="timed-out"] { color: var(--fe-git-modified); }
16899
+ .fe-git-scan-state[data-tone="failed"] { color: var(--fe-git-deleted); }
16827
16900
  .fe-git-summary .gs-m { color: var(--fe-git-modified); }
16828
16901
  .fe-git-summary .gs-a { color: var(--fe-git-new); }
16829
16902
  .fe-git-summary .gs-d { color: var(--fe-git-deleted); }
@@ -17019,7 +17092,7 @@
17019
17092
  outline-offset: -1px;
17020
17093
  border-radius: 4px;
17021
17094
  }
17022
- .fe-tree--dragging .fe-row { cursor: grabbing; }
17095
+ .fe-tree--dragging .fe-row { cursor: move; }
17023
17096
 
17024
17097
  /* Chevron */
17025
17098
  .fe-chevron {
@@ -17685,12 +17758,14 @@
17685
17758
  --ed-menu-hover: var(--s-hover);
17686
17759
  --ed-menu-radius: 8px;
17687
17760
  --ed-menu-shadow: 0 12px 32px rgba(0,0,0,0.4);
17761
+ /* Fills the app frame (flush, so the frame's 16px corners are its own) beside a docked right sidepanel */
17688
17762
  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));
17763
+ top: var(--frame-top);
17764
+ left: var(--frame-left);
17765
+ right: max(var(--frame-gap), var(--right-panel-width, var(--claude-panel-width, 0px)));
17692
17766
  margin-right: var(--right-panel-gap, var(--claude-panel-gap, 0px));
17693
- height: calc(100dvh - var(--navbar-height, 48px));
17767
+ height: calc(100dvh - var(--frame-top) - var(--frame-gap));
17768
+ border-radius: var(--frame-radius);
17694
17769
  z-index: 198;
17695
17770
  display: flex;
17696
17771
  flex-direction: column;
@@ -18418,7 +18493,7 @@
18418
18493
  /* ── Multi-select bar (shared) ── */
18419
18494
  #multi-select-bar {
18420
18495
  position: fixed;
18421
- top: 62px;
18496
+ top: calc(var(--frame-top) + 6px); /* 62px under the 48px bar, inside the app frame under a taller one */
18422
18497
  left: calc(var(--sidebar-total-width, 0px) + (100% - var(--sidebar-total-width, 0px) - var(--right-panel-width, var(--claude-panel-width, 0px))) / 2);
18423
18498
  transform: translateX(-50%);
18424
18499
  transition: left 0.3s cubic-bezier(0.22, 1, 0.36, 1);
@@ -18997,7 +19072,7 @@
18997
19072
  border-radius: 6px;
18998
19073
  background: hsla(210, 20%, 20%, 0.35);
18999
19074
  border: 1px solid transparent;
19000
- cursor: grab;
19075
+ cursor: move;
19001
19076
  transition: background 0.15s, border-color 0.15s;
19002
19077
  }
19003
19078
  .awiz-rule-item:hover { background: hsla(210, 20%, 25%, 0.45); }
@@ -19011,7 +19086,7 @@
19011
19086
  .awiz-rule-grip {
19012
19087
  font-size: 16px;
19013
19088
  color: var(--t-faint);
19014
- cursor: grab;
19089
+ cursor: move;
19015
19090
  user-select: none;
19016
19091
  line-height: 1;
19017
19092
  }
@@ -19202,1170 +19277,1259 @@
19202
19277
  }
19203
19278
 
19204
19279
  /* ══════════════════════════════════════════════
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;
19280
+ SKILLS STUDIO 2.0 (public/shared/skills/studio/)
19281
+ ══════════════════════════════════════════════
19282
+ A window with a rail (Library · Review · Create) and one workspace per skill (Edit · Test · Versions ·
19283
+ Publish). Every colour is an app token (--t-*, --s-*, --b-*, --r-*, --fs-*) or an --sx-* variable declared
19284
+ just below with the value DESIGN.md gives that role (Status, Semantic roles). The code editor inside it takes
19285
+ the --ed-* colours of the File Explorer's editor (.fe-editor-panel), the same values (a test keeps them equal).
19286
+ Readable secondary text is --t-secondary or brighter (AA on the panel); never smaller than 11px. The width of
19287
+ the window decides the layout (container queries at 900 / 760 / 560px). Dragging uses the move cursor. */
19288
+
19289
+ .skills-studio-panel.sx {
19290
+ --sx-ok: #86efac;
19291
+ --sx-warn: #fbbf24;
19292
+ --sx-err: #fca5a5;
19293
+ --sx-info: #cccccc;
19294
+ --sx-focus: #93c5fd;
19295
+ --sx-primary: #636363;
19296
+ --sx-primary-hover: #717171;
19297
+ --sx-field: rgba(0,0,0,0.25);
19298
+ --sx-raised: rgba(22,22,26,0.95);
19299
+ --sx-menu: #16161a;
19300
+ --sx-gold: rgba(255,215,0,0.85);
19301
+ --sx-meta: calc(11px * var(--font-scale, 1));
19302
+ --sx-rail: 220px;
19303
+ --ed-bg: rgb(16, 16, 18);
19304
+ --ed-fg: #8a8ea0;
19305
+ --ed-caret: var(--t-bright);
19306
+ --ed-selection: rgba(99,102,241,0.25);
19307
+ --ed-line-active: rgba(255,255,255,0.03);
19308
+ --ed-gutter-bg: rgba(0,0,0,0.1);
19309
+ --ed-gutter-fg: rgba(255,255,255,0.15);
19310
+ --ed-gutter-fg-active: rgba(255,255,255,0.5);
19311
+ --ed-gutter-border: rgba(255,255,255,0.04);
19312
+ --ed-kw: #cccdd6;
19313
+ --ed-str: #6e7a86;
19314
+ --ed-cm: #5a6a5a;
19315
+ --ed-num: #8c94a8;
19316
+ --ed-fn: #b0b4c4;
19317
+ --ed-op: #585c6c;
19318
+ --ed-tag: #a0a4b4;
19319
+ --ed-attr: #787c8c;
19320
+ --ed-prop: #9498a8;
19321
+ --ed-br: #8a7a50;
19322
+ --ed-match: rgba(255,255,255,0.10);
19323
+ --ed-match-current: rgba(99,102,241,0.35);
19324
+ --ed-ghost: rgba(255,255,255,0.28);
19325
+ --ed-add: #9fe3b4;
19326
+ --ed-add-bg: rgba(95,207,131,0.10);
19327
+ --ed-del: #f0a3a3;
19328
+ --ed-del-bg: rgba(239,112,112,0.10);
19329
+ --ed-error: var(--stg-err, #fca5a5);
19330
+ --ed-warn: #fbbf24;
19331
+ --ed-whitespace: rgba(255,255,255,0.2);
19332
+ --ed-minimap-box: rgba(255,255,255,0.06);
19333
+ --ed-minimap-box-active: rgba(255,255,255,0.1);
19334
+ --ed-minimap-edge: var(--b-hover);
19335
+ --ed-minimap-match: var(--fw-focus);
19336
+ --ed-guide: var(--b-light);
19337
+ --ed-guide-active: var(--b-visible);
19338
+ --ed-menu-bg: #16161a;
19339
+ --ed-menu-fg: var(--t-primary);
19340
+ --ed-menu-fg-active: var(--t-bright);
19341
+ --ed-menu-border: rgba(255,255,255,0.10);
19342
+ --ed-menu-hover: var(--s-hover);
19343
+ --ed-menu-radius: 8px;
19344
+ --ed-menu-shadow: 0 12px 32px rgba(0,0,0,0.4);
19345
+ position: fixed; z-index: 300000;
19346
+ width: min(1180px, 94vw); height: min(760px, 86vh);
19347
+ min-width: 380px; min-height: 320px; max-width: 100vw;
19348
+ display: flex; flex-direction: column;
19349
+ overflow: hidden;
19350
+ border-radius: 10px;
19351
+ color: var(--t-primary);
19352
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif;
19353
+ font-size: var(--fs-sm);
19354
+ line-height: 1.45;
19355
+ opacity: 0; transform: scale(0.985);
19356
+ transition: opacity 0.15s ease, transform 0.15s ease;
19357
+ container: ss / inline-size;
19358
+ }
19359
+ .skills-studio-panel.sx.open { opacity: 1; transform: none; }
19360
+ .skills-studio-panel.sx > .resize-handle-t,
19361
+ .skills-studio-panel.sx > .resize-handle-tl,
19362
+ .skills-studio-panel.sx > .resize-handle-tr { top: 0; z-index: 25; }
19363
+ /* Docked: the work area beside the side panels (as the code editor sits), not modal, not moved or resized. */
19364
+ .skills-studio-panel.sx.sx-docked {
19365
+ top: var(--frame-top) !important;
19366
+ left: var(--frame-left) !important;
19367
+ 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;
19368
+ bottom: var(--frame-gap) !important;
19369
+ width: auto !important; height: auto !important; max-height: none !important;
19370
+ min-width: 0;
19371
+ border-radius: var(--frame-radius); /* flush in the app frame: its corners are the frame's */
19372
+ z-index: 197;
19373
+ }
19374
+ .skills-studio-panel.sx.sx-docked > .resize-handle { display: none; }
19375
+ body.sx-studio-docked #topright-controls { display: none; }
19376
+ /* Settings → Skills: the way into Skills Studio. */
19377
+ .cc-skill-studio { display: flex; align-items: center; flex-wrap: wrap; gap: 10px; margin: 14px 0 6px; }
19378
+ .skills-studio-panel.sx :focus-visible { outline: 2px solid var(--sx-focus); outline-offset: 2px; }
19379
+ .skills-studio-panel.sx [hidden] { display: none !important; }
19380
+ .sx-sr {
19381
+ position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden;
19382
+ clip: rect(0 0 0 0); clip-path: inset(50%); white-space: nowrap; border: 0;
19383
+ }
19384
+ .sx .sx-i { flex: none; stroke: currentColor; fill: none; stroke-width: 1.5; stroke-linecap: round; stroke-linejoin: round; }
19385
+ .sx .sx-spacer { flex: 1 1 auto; }
19386
+ .sx .sx-dim { color: var(--t-secondary); }
19387
+ .sx .sx-mono { font-family: var(--ff-mono, 'JetBrains Mono', ui-monospace, monospace); font-size: var(--sx-meta); }
19388
+ .sx .sx-block { display: block; }
19389
+ .sx .sx-ok-text { color: var(--sx-ok); }
19390
+ .sx .sx-warn-text { color: var(--sx-warn); }
19391
+ .sx .sx-err-text { color: var(--sx-err); }
19392
+ .sx kbd {
19393
+ font: 400 var(--sx-meta)/1 var(--ff-mono, 'JetBrains Mono', ui-monospace, monospace); color: var(--t-secondary);
19394
+ padding: 2px 4px; border: 1px solid var(--b-light); border-radius: 4px;
20153
19395
  }
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
19396
 
20158
- /* ── Wizard step 4 layout (editor + preset panel) ── */
20159
- .ss-wiz-step4-hdr {
19397
+ /* ── Header ── */
19398
+ .sx-head {
19399
+ flex: none; min-height: max(44px, var(--fw-header-min-height, 44px));
20160
19400
  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;
19401
+ padding: 0 10px 0 14px;
19402
+ background: var(--fw-header, var(--sx-raised));
19403
+ border-bottom: 1px solid var(--fw-separator, var(--b-subtle));
19404
+ user-select: none;
20192
19405
  }
20193
- .ss-preset-panel.hidden {
20194
- width: 0; opacity: 0; overflow: hidden;
19406
+ .sx-head.drag-handle { cursor: move; }
19407
+ .sx-head-mark { display: inline-flex; color: var(--t-primary); }
19408
+ .sx-title { margin: 0; font: 600 calc(15px * var(--font-scale, 1))/1.3 var(--ff-heading); color: var(--t-bright); white-space: nowrap; }
19409
+ .sx-head-note { min-width: 0; font-size: var(--fs-xs); color: var(--t-secondary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
19410
+ .sx-note-warn { color: var(--sx-warn); }
19411
+
19412
+ /* ── Buttons ── */
19413
+ .sx .sx-btn {
19414
+ height: 28px; padding: 0 12px;
19415
+ display: inline-flex; align-items: center; justify-content: center; gap: 6px;
19416
+ border-radius: 5px; border: 1px solid var(--b-light);
19417
+ background: var(--s-light); color: var(--t-bright);
19418
+ font-weight: 500; font-size: var(--fs-xs); line-height: 1; font-family: inherit;
19419
+ white-space: nowrap; cursor: pointer; text-decoration: none;
19420
+ transition: background 0.15s ease, border-color 0.15s ease, color 0.15s ease;
19421
+ }
19422
+ .sx .sx-btn:hover:not(:disabled) { background: var(--s-hover); border-color: var(--b-hover); }
19423
+ .sx .sx-btn:disabled { opacity: 0.5; cursor: default; }
19424
+ .sx .sx-btn--primary { background: var(--sx-primary); border-color: transparent; color: #ffffff; }
19425
+ .sx .sx-btn--primary:hover:not(:disabled) { background: var(--sx-primary-hover); border-color: transparent; }
19426
+ .sx .sx-btn--primary kbd { color: #ffffff; border-color: var(--b-visible); }
19427
+ .sx .sx-btn--ghost { background: transparent; border-color: transparent; color: var(--t-primary); }
19428
+ .sx .sx-btn--ghost:hover:not(:disabled) { color: var(--t-bright); background: var(--s-subtle); }
19429
+ .sx .sx-btn--danger:hover:not(:disabled) { color: var(--sx-err); border-color: color-mix(in oklab, var(--sx-err) 40%, transparent); }
19430
+ .sx .sx-btn--sm { height: 24px; padding: 0 9px; }
19431
+ .sx .sx-btn--soon { border-style: dashed; }
19432
+ .sx .sx-soon {
19433
+ margin-left: 2px; padding: 1px 6px; border-radius: 6px;
19434
+ font-size: var(--sx-meta); font-weight: 500; color: var(--sx-gold);
19435
+ border: 1px solid color-mix(in oklab, var(--sx-gold) 45%, transparent);
19436
+ }
19437
+ .sx .sx-icon-btn {
19438
+ width: 28px; height: 28px; padding: 0; flex: none;
19439
+ display: inline-flex; align-items: center; justify-content: center;
19440
+ border: 1px solid transparent; border-radius: 5px;
19441
+ background: transparent; color: var(--t-primary); cursor: pointer;
19442
+ }
19443
+ .sx .sx-icon-btn:hover:not(:disabled) { background: var(--s-hover); color: var(--t-bright); }
19444
+ .sx .sx-icon-btn[aria-pressed="true"] { background: var(--s-active); color: var(--t-bright); border-color: var(--b-light); }
19445
+ .sx .sx-icon-btn:disabled { opacity: 0.4; cursor: default; }
19446
+ .sx .sx-icon-btn--sm { width: 22px; height: 22px; }
19447
+ .sx .sx-close:hover:not(:disabled) { color: var(--sx-err); }
19448
+ .sx .sx-link {
19449
+ display: inline-flex; align-items: center; gap: 4px; padding: 0;
19450
+ border: 0; background: none; color: var(--t-primary); font: inherit; cursor: pointer;
19451
+ text-decoration: underline; text-underline-offset: 3px; text-decoration-color: var(--b-visible);
19452
+ }
19453
+ .sx .sx-link:hover { color: var(--t-bright); }
19454
+
19455
+ /* ── Body, rail ── */
19456
+ .sx-body { flex: 1; min-height: 0; display: flex; }
19457
+ .sx-rail {
19458
+ flex: none; width: var(--sx-rail);
19459
+ display: flex; flex-direction: column; gap: 12px;
19460
+ padding: 8px; overflow-y: auto;
19461
+ border-right: 1px solid var(--b-subtle);
20195
19462
  }
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);
19463
+ .sx-rail-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 2px; }
19464
+ .sx .sx-rail-item {
19465
+ width: 100%; height: 32px; padding: 0 10px;
19466
+ display: flex; align-items: center; gap: 10px;
19467
+ border: 0; border-radius: 8px; background: transparent;
19468
+ color: var(--t-primary); font-weight: 500; font-size: var(--fs-sm); line-height: 1; font-family: inherit; text-align: left; cursor: pointer;
19469
+ }
19470
+ .sx .sx-rail-item:hover { background: var(--s-hover); color: var(--t-bright); }
19471
+ .sx .sx-rail-item[aria-current="page"] { background: var(--s-active); color: var(--t-bright); }
19472
+ .sx-rail-icon { display: inline-flex; }
19473
+ .sx-rail-label { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
19474
+ .sx-rail-count { margin-left: auto; font: 500 var(--sx-meta)/1 var(--ff-mono, 'JetBrains Mono', monospace); color: var(--t-secondary); }
19475
+ .sx-rail-group-label { margin: 8px 10px 4px; font-size: var(--sx-meta); font-weight: 600; letter-spacing: 0.02em; color: var(--t-secondary); }
19476
+ .sx .sx-rail-view {
19477
+ width: 100%; height: 28px; padding: 0 10px;
19478
+ display: flex; align-items: center; gap: 8px;
19479
+ border: 0; border-radius: 5px; background: transparent;
19480
+ color: var(--t-secondary); font-size: var(--fs-xs); font-family: inherit; text-align: left; cursor: pointer;
19481
+ }
19482
+ .sx .sx-rail-view:hover { background: var(--s-subtle); color: var(--t-bright); }
19483
+ .sx .sx-rail-view[aria-current="true"] { background: var(--s-light); color: var(--t-bright); }
19484
+ .sx-rail-foot { margin-top: auto; padding: 8px 4px 2px; border-top: 1px solid var(--b-subtle); display: grid; gap: 2px; }
19485
+ .sx .sx-rt-row {
19486
+ display: flex; align-items: center; gap: 8px; height: 26px; padding: 0 6px;
19487
+ border: 0; border-radius: 5px; background: transparent; cursor: pointer;
19488
+ font-size: var(--fs-xs); font-family: inherit; color: var(--t-secondary); text-align: left;
19489
+ }
19490
+ .sx .sx-rt-row:hover { background: var(--s-subtle); color: var(--t-bright); }
19491
+ .sx-rt-dot { width: 8px; height: 8px; border-radius: 50%; flex: none; border: 1px solid var(--b-visible); }
19492
+ .sx-rt-dot.sx-rt-ready { background: var(--sx-ok); border-color: transparent; }
19493
+ .sx-rt-dot.sx-rt-bridge { background: var(--sx-warn); border-color: transparent; border-radius: 1px; transform: rotate(45deg) scale(0.85); }
19494
+ .sx-rt-dot.sx-rt-empty, .sx-rt-dot.sx-rt-unknown { background: transparent; }
19495
+ .sx-rt-state { margin-left: auto; font-size: var(--sx-meta); }
19496
+ .sx.sx-rail-collapsed .sx-rail { --sx-rail: 56px; padding: 8px 6px; }
19497
+ .sx.sx-rail-collapsed .sx-rail :is(.sx-rail-label, .sx-rail-count, .sx-rail-groups, .sx-rt-name, .sx-rt-state) { display: none; }
19498
+ .sx.sx-rail-collapsed .sx-rail-item { justify-content: center; padding: 0; }
19499
+ .sx.sx-rail-collapsed .sx-rt-row { justify-content: center; }
19500
+
19501
+ /* ── Main and places ──
19502
+ min-height: 0 keeps the main area inside the window when the body is a column (a narrow window): without it a
19503
+ flex item is as tall as its content, the window clips it (overflow: hidden) and nothing in it scrolls. */
19504
+ .sx-main { flex: 1; min-width: 0; min-height: 0; display: flex; flex-direction: column; position: relative; }
19505
+ .sx-place { flex: 1; min-height: 0; display: flex; flex-direction: column; }
19506
+ .sx-place-head {
19507
+ flex: none; padding: 12px 16px;
19508
+ display: flex; flex-wrap: wrap; align-items: center; gap: 8px;
20203
19509
  border-bottom: 1px solid var(--b-subtle);
20204
- user-select: none; flex-shrink: 0;
20205
19510
  }
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);
19511
+ .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); }
19512
+ .sx-place-title:focus { outline: none; }
19513
+ .sx-place-sub { margin: 0; font-size: var(--fs-xs); color: var(--t-secondary); }
19514
+ .sx-place-scroll { flex: 1; min-height: 0; overflow: auto; }
19515
+ .sx-place-notices:empty { display: none; }
19516
+ .sx-place-notices { padding: 8px 16px 0; display: grid; gap: 6px; }
19517
+ .sx-section-title { margin: 0; font: 600 var(--fs-sm)/1.3 var(--ff-heading); color: var(--t-bright); }
19518
+ .sx .sx-help { margin: 0; font-size: var(--fs-xs); color: var(--t-secondary); line-height: 1.45; }
19519
+ .sx .sx-explain { margin: 0; font-size: var(--fs-xs); color: var(--t-secondary); max-width: 68ch; }
19520
+ .sx .sx-row { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
19521
+ .sx .sx-plain-list { margin: 0; padding-left: 18px; font-size: var(--fs-xs); color: var(--t-primary); }
19522
+ .sx .sx-plain-list li + li { margin-top: 2px; }
19523
+ .sx .sx-note {
19524
+ margin: 0; padding: 8px 10px; border-radius: 8px;
19525
+ font-size: var(--fs-xs); line-height: 1.45; color: var(--t-primary);
19526
+ background: var(--s-subtle); border: 1px solid var(--b-subtle);
20213
19527
  }
20214
- .ss-preset-cat-body {
20215
- display: flex; flex-direction: column; gap: 2px; padding: 4px;
19528
+ .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); }
19529
+ .sx .sx-notice {
19530
+ display: flex; flex-wrap: wrap; align-items: center; gap: 8px 12px;
19531
+ padding: 8px 12px; border-radius: 8px; font-size: var(--fs-xs);
19532
+ border: 1px solid var(--b-light); background: var(--s-subtle); color: var(--t-primary);
19533
+ }
19534
+ .sx .sx-notice--info > .sx-i { color: var(--sx-info); }
19535
+ .sx-notice-text { flex: 1 1 260px; }
19536
+ .sx .sx-notice--warn > .sx-i { color: var(--sx-warn); }
19537
+ /* Publish: an OpenCode tile that sees the skill through Claude Code's folder (no second copy unless ticked). */
19538
+ .sx .sx-tile.is-via { border-style: dashed; }
19539
+ .sx-tile-state--via-claude { color: var(--sx-info); }
19540
+ /* A plan line whose runtime turns the skill off in its settings: the reason, and the owner's one-click fix. */
19541
+ .sx .sx-eligibility .sx-btn { margin-left: 6px; vertical-align: baseline; }
19542
+ /* Review: one tile per runtime, where the card's install goes. */
19543
+ .sx .sx-dest-tiles { display: flex; flex-wrap: wrap; gap: 6px; padding: 2px 0 0; }
19544
+ .sx .sx-dest-tile {
19545
+ display: inline-flex; align-items: center; gap: 4px; padding: 2px 8px; border-radius: 999px;
19546
+ border: 1px solid var(--b-light); font-size: var(--sx-meta); color: var(--t-secondary); line-height: 1.4;
19547
+ }
19548
+ .sx .sx-dest-tile.is-on { color: var(--sx-ok); border-color: color-mix(in oklab, var(--sx-ok) 40%, transparent); }
19549
+ .sx .sx-dest-tile > .sx-i { width: 12px; height: 12px; }
19550
+ /* Settings → Skills → Skill folders: a bridge file offered to the owner (ticked, it moves too). */
19551
+ .stg-skill-folders-offer { display: flex; align-items: flex-start; gap: 8px; cursor: pointer; }
19552
+ .stg-skill-folders-offer > input { margin-top: 2px; flex: 0 0 auto; }
19553
+ #stg-skill-folders-plan li[data-tone="offer"] { color: var(--t-primary); }
19554
+ .sx .sx-empty {
19555
+ margin: auto; padding: 32px 24px; max-width: 520px;
19556
+ display: flex; flex-direction: column; align-items: center; gap: 10px; text-align: center;
19557
+ color: var(--t-primary); font-size: var(--fs-xs);
20216
19558
  }
20217
- .ss-preset-category.collapsed .ss-preset-cat-body { display: none; }
19559
+ .sx .sx-empty p { margin: 0; }
19560
+ .sx-empty-title { margin: 0; font: 600 var(--fs-sm)/1.3 var(--ff-heading); color: var(--t-bright); }
19561
+ .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); }
19562
+ .sx .sx-placeholder p { margin: 0; }
19563
+ .sx-placeholder-icon { display: inline-flex; padding: 8px; border-radius: 8px; border: 1px solid var(--b-light); color: var(--t-primary); }
19564
+ .sx-placeholder-title { margin: 0; font: 600 calc(15px * var(--font-scale, 1))/1.3 var(--ff-heading); color: var(--t-bright); }
19565
+ .sx-placeholder-list { color: var(--t-primary); }
20218
19566
 
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;
19567
+ /* ── Fields ── */
19568
+ .sx .sx-input {
19569
+ width: 100%; padding: 6px 8px; box-sizing: border-box;
19570
+ background: var(--sx-field); border: 1px solid var(--b-light); border-radius: 5px;
19571
+ color: var(--t-bright); font-weight: 400; font-size: var(--fs-xs); line-height: 1.45; font-family: inherit;
19572
+ }
19573
+ .sx .sx-input::placeholder { color: var(--t-secondary); }
19574
+ .sx .sx-input:focus { border-color: var(--b-visible); outline: none; }
19575
+ .sx .sx-input:focus-visible { outline: 2px solid var(--sx-focus); outline-offset: 1px; }
19576
+ .sx .sx-input[aria-invalid="true"] { border-color: color-mix(in oklab, var(--sx-err) 60%, transparent); }
19577
+ .sx .sx-input:disabled { opacity: 0.6; }
19578
+ .sx .sx-input--sm { padding: 4px 8px; }
19579
+ .sx .sx-textarea { resize: vertical; min-height: 60px; }
19580
+ .sx .sx-field { display: grid; gap: 4px; margin: 0; padding: 0; border: 0; min-width: 0; }
19581
+ .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; }
19582
+ .sx .sx-field-note { margin: 0; font-size: var(--fs-xs); color: var(--t-secondary); }
19583
+ /* A note that says what is wrong keeps its colour (the note's grey above would win over .sx-err-text otherwise). */
19584
+ .sx .sx-field-note.sx-err-text { color: var(--sx-err); }
19585
+ .sx .sx-field-note.sx-warn-text { color: var(--sx-warn); }
19586
+ .sx .sx-count { font: 400 var(--sx-meta)/1.4 var(--ff-mono, 'JetBrains Mono', monospace); color: var(--t-secondary); }
19587
+ .sx .sx-choices { display: grid; gap: 4px; }
19588
+ .sx .sx-choice { display: inline-flex; align-items: center; gap: 6px; font-size: var(--fs-xs); color: var(--t-primary); cursor: pointer; }
19589
+ .sx .sx-choice input { accent-color: var(--sx-primary); margin: 0; }
19590
+ .sx .sx-check { width: 14px; height: 14px; accent-color: var(--sx-primary); margin: 0; cursor: pointer; }
19591
+ .sx .sx-dd .cc-dropdown-trigger { min-height: 28px; }
19592
+ .sx .sx-filter { display: inline-flex; align-items: center; gap: 6px; }
19593
+ .sx .sx-filter-key { font-size: var(--fs-xs); color: var(--t-secondary); white-space: nowrap; }
19594
+ .sx .sx-search { position: relative; flex: 1 1 200px; max-width: 320px; }
19595
+ .sx .sx-search > .sx-i { position: absolute; left: 9px; top: 7px; color: var(--t-secondary); pointer-events: none; }
19596
+ .sx .sx-search input {
19597
+ width: 100%; height: 28px; padding: 0 10px 0 30px; box-sizing: border-box;
19598
+ background: var(--sx-field); border: 1px solid var(--b-light); border-radius: 5px;
19599
+ color: var(--t-bright); font-size: var(--fs-xs); font-family: inherit;
19600
+ }
19601
+ .sx .sx-search input::placeholder { color: var(--t-secondary); }
19602
+ .sx .sx-seg { display: inline-flex; border: 1px solid var(--b-light); border-radius: 5px; overflow: hidden; width: max-content; }
19603
+ .sx .sx-seg button {
19604
+ height: 26px; padding: 0 12px; border: 0; background: transparent;
19605
+ font-size: var(--fs-xs); font-family: inherit; color: var(--t-secondary); cursor: pointer;
19606
+ }
19607
+ .sx .sx-seg button[aria-pressed="true"] { background: var(--s-active); color: var(--t-bright); }
19608
+ .sx .sx-details > summary { cursor: pointer; font-size: var(--fs-xs); color: var(--t-primary); }
19609
+ .sx .sx-details > summary:hover { color: var(--t-bright); }
19610
+ .sx .sx-pre {
19611
+ margin: 0; padding: 8px 10px; border-radius: 5px; overflow: auto; max-height: 260px;
19612
+ background: var(--sx-field); border: 1px solid var(--b-subtle);
19613
+ font: 400 var(--fs-xs)/1.55 var(--ff-mono, 'JetBrains Mono', monospace); color: var(--t-bright);
19614
+ white-space: pre-wrap; overflow-wrap: anywhere;
19615
+ }
19616
+ .sx .sx-pre--sm { max-height: 120px; padding: 6px 8px; }
19617
+ .sx .sx-meter { display: inline-block; width: 56px; height: 6px; border-radius: 3px; background: var(--s-medium); vertical-align: middle; overflow: hidden; }
19618
+ .sx .sx-meter > i { display: block; height: 100%; background: var(--t-secondary); }
19619
+ .sx .is-over .sx-meter > i { background: var(--sx-warn); }
19620
+ .sx .sx-dot { display: inline-block; width: 6px; height: 6px; border-radius: 50%; background: var(--sx-gold); flex: none; }
19621
+
19622
+ /* ── Library ── */
19623
+ .sx-summary { margin: 0; padding: 8px 16px 0; font-size: var(--fs-xs); color: var(--t-secondary); }
19624
+ .sx-lib { width: 100%; table-layout: fixed; border-collapse: separate; border-spacing: 0; margin-top: 8px; font-size: var(--fs-xs); }
19625
+ .sx-lib th {
19626
+ position: sticky; top: 0; z-index: 1;
19627
+ padding: 8px 10px; text-align: left;
19628
+ font-size: var(--sx-meta); font-weight: 600; letter-spacing: 0.02em; color: var(--t-secondary);
19629
+ background: var(--sx-raised); border-bottom: 1px solid var(--b-subtle);
19630
+ }
19631
+ .sx-lib td { padding: 8px 10px; border-bottom: 1px solid var(--b-subtle); vertical-align: middle; overflow-wrap: anywhere; }
19632
+ .sx-lib tbody tr:hover td { background: var(--s-subtle); }
19633
+ .sx-lib tbody tr.is-selected td { background: var(--s-light); }
19634
+ .sx-lib .sx-col-check { width: 40px; padding-left: 16px; }
19635
+ .sx-lib th.sx-col-kind { width: 96px; }
19636
+ .sx-lib th.sx-col-source { width: 150px; }
19637
+ .sx-lib th.sx-col-health { width: 190px; }
19638
+ .sx-lib th.sx-col-rt { width: 96px; }
19639
+ .sx-lib th.sx-col-updated { width: 84px; }
19640
+ .sx-col-name { min-width: 0; }
19641
+ .sx .sx-name-btn {
19642
+ display: block; max-width: 100%; padding: 0; border: 0; background: none; cursor: pointer;
19643
+ font-weight: 600; font-size: var(--fs-sm); line-height: 1.3; font-family: inherit; color: var(--t-bright); text-align: left;
19644
+ overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
20224
19645
  }
20225
- .ss-preset-card:hover {
20226
- background: var(--s-hover); border-color: var(--b-subtle);
19646
+ .sx .sx-name-btn:hover { text-decoration: underline; text-underline-offset: 3px; }
19647
+ .sx-desc { display: block; margin-top: 2px; color: var(--t-secondary); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
19648
+ .sx-source { display: block; color: var(--t-primary); }
19649
+ .sx-source-detail { display: block; color: var(--t-secondary); font-size: var(--sx-meta); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
19650
+ .sx .sx-health {
19651
+ display: inline-flex; align-items: center; gap: 6px; max-width: 100%;
19652
+ min-height: 22px; padding: 2px 8px; line-height: 1.3; box-sizing: border-box;
19653
+ border: 1px solid var(--b-light); border-radius: 6px;
19654
+ font-size: var(--fs-xs); font-weight: 500;
20227
19655
  }
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);
19656
+ .sx .sx-health > span:first-of-type { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
19657
+ .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); }
19658
+ .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); }
19659
+ .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); }
19660
+ .sx .sx-health--info { color: var(--sx-info); border-color: var(--b-visible); background: var(--s-light); }
19661
+ .sx .sx-health--off { color: var(--t-secondary); }
19662
+ .sx-health-more { margin-left: 2px; font: 500 var(--sx-meta)/1 var(--ff-mono, 'JetBrains Mono', monospace); opacity: 0.85; }
19663
+ .sx-rts { display: inline-flex; gap: 4px; }
19664
+ .sx .sx-rt {
19665
+ width: 24px; height: 22px; display: inline-grid; place-items: center;
19666
+ border: 1px solid var(--b-light); border-radius: 5px;
19667
+ font: 500 var(--sx-meta)/1 var(--ff-mono, 'JetBrains Mono', monospace); color: var(--t-secondary);
19668
+ }
19669
+ .sx .sx-rt--installed { color: var(--t-bright); border-color: var(--b-visible); background: var(--s-light); }
19670
+ .sx .sx-rt--present { color: var(--t-primary); border-color: var(--b-hover); }
19671
+ .sx .sx-rt--outdated { color: var(--sx-warn); border-color: color-mix(in oklab, var(--sx-warn) 45%, transparent); }
19672
+ .sx .sx-rt--bridge { color: var(--sx-warn); border-style: dashed; border-color: color-mix(in oklab, var(--sx-warn) 45%, transparent); }
19673
+ .sx .sx-rt--none { border-style: dashed; color: var(--t-secondary); opacity: 0.8; }
19674
+ .sx-bulk {
19675
+ flex: none; display: flex; flex-wrap: wrap; align-items: center; gap: 8px;
19676
+ padding: 8px 16px; background: var(--sx-raised); border-top: 1px solid var(--b-light);
19677
+ }
19678
+ .sx-bulk-count { font-weight: 600; margin-right: 8px; color: var(--t-bright); font-size: var(--fs-xs); }
19679
+
19680
+ /* ── Menus ── */
19681
+ .sx .sx-menu {
19682
+ position: absolute; right: 16px; z-index: 30; margin-top: 34px; min-width: 200px;
19683
+ padding: 6px; display: grid; gap: 1px;
19684
+ background: var(--sx-menu); border: 1px solid var(--b-light); border-radius: 8px;
19685
+ box-shadow: 0 12px 32px rgba(0,0,0,0.4);
19686
+ }
19687
+ .sx .sx-menu-item {
19688
+ padding: 7px 10px; border: 0; border-radius: 5px; background: transparent; text-align: left;
19689
+ font-size: var(--fs-xs); font-family: inherit; color: var(--t-primary); cursor: pointer;
19690
+ }
19691
+ .sx .sx-menu-item:hover, .sx .sx-menu-item:focus-visible { background: var(--s-hover); color: var(--t-bright); }
19692
+ .sx .sx-menu-item--danger:hover { color: var(--sx-err); }
19693
+
19694
+ /* ── Workspace ── */
19695
+ .sx-ws-head { flex: none; padding: 12px 16px 0; display: grid; gap: 8px; position: relative; }
19696
+ .sx-crumb { display: flex; align-items: center; gap: 6px; font-size: var(--fs-xs); color: var(--t-secondary); }
19697
+ .sx-ws-title { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
19698
+ .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; }
19699
+ .sx-ws-name:focus { outline: none; }
19700
+ .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; }
19701
+ .sx-tabs { display: flex; gap: 4px; border-bottom: 1px solid var(--b-subtle); overflow-x: auto; }
19702
+ .sx .sx-tab {
19703
+ height: 32px; padding: 0 12px; display: inline-flex; align-items: center; gap: 6px;
19704
+ border: 0; border-bottom: 2px solid transparent; margin-bottom: -1px; background: none; cursor: pointer;
19705
+ font-weight: 500; font-size: var(--fs-xs); line-height: 1; font-family: inherit; color: var(--t-secondary); white-space: nowrap;
19706
+ }
19707
+ .sx .sx-tab:hover { color: var(--t-bright); }
19708
+ .sx .sx-tab[aria-selected="true"] { color: var(--t-bright); border-bottom-color: var(--t-bright); }
19709
+ .sx-banners:empty { display: none; }
19710
+ .sx-banners { display: grid; gap: 6px; padding: 8px 16px 0; }
19711
+ .sx .sx-banner {
19712
+ display: flex; flex-wrap: wrap; align-items: center; gap: 8px 12px;
19713
+ padding: 8px 12px; border-radius: 8px; font-size: var(--fs-xs); color: var(--t-primary);
19714
+ border: 1px solid var(--b-light); background: var(--s-subtle);
19715
+ }
19716
+ .sx .sx-banner > .sx-i { color: var(--t-primary); }
19717
+ .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); }
19718
+ .sx .sx-banner--warn > .sx-i, .sx .sx-banner--update > .sx-i { color: var(--sx-warn); }
19719
+ .sx .sx-banner--draft > .sx-i { color: var(--sx-gold); }
19720
+ .sx-banner-text { flex: 1 1 260px; }
19721
+ .sx-tabpanel { flex: 1; min-height: 0; display: flex; flex-direction: column; overflow: hidden; }
19722
+ .sx-tabpanel:focus { outline: none; }
19723
+
19724
+ /* ── Edit ── */
19725
+ .sx-edit { flex: 1; min-height: 0; display: flex; flex-direction: column; }
19726
+ .sx-pane-switch { display: none; margin: 8px 16px 0; border: 1px solid var(--b-light); border-radius: 5px; overflow: hidden; width: max-content; }
19727
+ .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; }
19728
+ .sx-pane-switch button[aria-pressed="true"] { background: var(--s-active); color: var(--t-bright); }
19729
+ .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); }
19730
+ .sx-pane { min-height: 0; min-width: 0; overflow: auto; }
19731
+ .sx-pane + .sx-pane { border-left: 1px solid var(--b-subtle); }
19732
+ .sx-pane--doc { display: flex; flex-direction: column; overflow: hidden; }
19733
+ .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); }
19734
+ .sx-tree { list-style: none; margin: 0; padding: 0 4px 8px; }
19735
+ .sx-tree-group { list-style: none; margin: 0; padding: 0; }
19736
+ .sx-tree-row { display: flex; align-items: center; padding-left: calc(var(--depth, 0) * 14px); border-radius: 5px; }
19737
+ .sx-tree-row:hover { background: var(--s-hover); }
19738
+ .sx-tree-row.is-current { background: var(--s-active); }
19739
+ .sx .sx-tree-item {
19740
+ flex: 1; min-width: 0; height: 28px; padding: 0 8px;
19741
+ display: flex; align-items: center; gap: 6px;
19742
+ border: 0; background: transparent; text-align: left; cursor: pointer;
19743
+ font: 400 var(--fs-xs)/1 var(--ff-mono, 'JetBrains Mono', monospace); color: var(--t-primary);
19744
+ }
19745
+ .sx .sx-tree-dir { cursor: default; color: var(--t-secondary); }
19746
+ .sx-tree-row.is-current .sx-tree-item { color: var(--t-bright); }
19747
+ .sx-tree-name { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
19748
+ .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); }
19749
+ .sx-tree-badge--warn { color: var(--sx-warn); }
19750
+ .sx-tree-actions { display: none; gap: 2px; padding-right: 4px; }
19751
+ .sx-tree-row:hover .sx-tree-actions, .sx-tree-row:focus-within .sx-tree-actions { display: inline-flex; }
19752
+ .sx-tree-tools { display: flex; flex-wrap: wrap; gap: 6px; padding: 4px 8px 12px; }
19753
+ .sx-doc-bar { flex: none; display: flex; align-items: center; gap: 6px; padding: 4px 8px 0; border-bottom: 1px solid var(--b-subtle); }
19754
+ .sx-doc-tabs { display: flex; gap: 2px; min-width: 0; overflow-x: auto; }
19755
+ .sx-doc-tab { display: inline-flex; align-items: center; border-radius: 5px 5px 0 0; }
19756
+ .sx-doc-tab.is-active { background: var(--s-light); }
19757
+ .sx .sx-doc-tab-btn {
19758
+ height: 28px; padding: 0 10px; display: inline-flex; align-items: center; gap: 6px;
19759
+ border: 0; background: transparent; cursor: pointer;
19760
+ font: 400 var(--fs-xs)/1 var(--ff-mono, 'JetBrains Mono', monospace); color: var(--t-secondary); white-space: nowrap;
19761
+ }
19762
+ .sx-doc-tab.is-active .sx-doc-tab-btn { color: var(--t-bright); }
19763
+ .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; }
19764
+ .sx .sx-doc-tab-close:hover { background: var(--s-hover); color: var(--t-bright); }
19765
+ .sx-doc-body { flex: 1; min-height: 0; display: flex; position: relative; }
19766
+ .sx-ed-host { flex: 1; min-width: 0; min-height: 0; display: flex; background: var(--ed-bg); }
19767
+ .sx-ed-host .cm-editor { flex: 1; min-width: 0; height: 100%; }
19768
+ .sx-ed-loading { margin: 16px; }
19769
+ .sx-preview { flex: 1; min-height: 0; overflow: auto; padding: 16px 20px; }
19770
+ .sx-md { font-size: var(--fs-sm); line-height: 1.6; color: var(--t-primary); max-width: 78ch; }
19771
+ .sx-md :is(h1, h2, h3, h4) { font-family: var(--ff-heading); color: var(--t-bright); margin: 16px 0 8px; line-height: 1.3; }
19772
+ .sx-md h1 { font-size: calc(20px * var(--font-scale, 1)); }
19773
+ .sx-md h2 { font-size: calc(17px * var(--font-scale, 1)); }
19774
+ .sx-md h3 { font-size: calc(15px * var(--font-scale, 1)); }
19775
+ .sx-md p { margin: 0 0 10px; }
19776
+ .sx-md a { color: var(--t-bright); }
19777
+ .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); }
19778
+ .sx-md pre { padding: 10px 12px; border-radius: 6px; background: var(--sx-field); border: 1px solid var(--b-subtle); overflow: auto; }
19779
+ .sx-md pre code { padding: 0; background: none; }
19780
+ .sx-md blockquote { margin: 0 0 10px; padding: 4px 12px; border-left: 2px solid var(--b-visible); color: var(--t-primary); }
19781
+ .sx-md table { border-collapse: collapse; margin: 0 0 10px; font-size: var(--fs-xs); }
19782
+ .sx-md :is(th, td) { padding: 4px 8px; border: 1px solid var(--b-light); text-align: left; }
19783
+ .sx-mermaid svg { max-width: 100%; height: auto; }
19784
+ .sx-binary { flex: 1; min-height: 0; overflow: auto; display: flex; }
19785
+ .sx-binary-view { margin: auto; padding: 24px; display: grid; justify-items: center; gap: 8px; text-align: center; font-size: var(--fs-xs); }
19786
+ .sx-binary-view p { margin: 0; }
19787
+ .sx-binary-img { max-width: min(480px, 100%); max-height: 320px; border-radius: 6px; border: 1px solid var(--b-light); background: var(--s-subtle); }
19788
+ .sx-binary-icon { display: inline-flex; padding: 12px; border: 1px solid var(--b-light); border-radius: 8px; }
19789
+ .sx-binary-name { font-family: var(--ff-mono, 'JetBrains Mono', monospace); color: var(--t-bright); overflow-wrap: anywhere; }
19790
+ .sx-fallback { flex: 1; display: flex; flex-direction: column; gap: 8px; padding: 8px; }
19791
+ .sx .sx-fallback-text { flex: 1; min-height: 240px; font-family: var(--ff-mono, 'JetBrains Mono', monospace); resize: none; }
19792
+ .sx-statusbar {
19793
+ flex: none; min-height: 28px; display: flex; flex-wrap: wrap; align-items: center; gap: 4px 14px;
19794
+ padding: 4px 16px; border-top: 1px solid var(--b-subtle);
19795
+ font: 400 var(--sx-meta)/1.4 var(--ff-mono, 'JetBrains Mono', monospace); color: var(--t-secondary);
19796
+ }
19797
+ .sx-statusbar > span { white-space: nowrap; display: inline-flex; align-items: center; gap: 6px; }
19798
+ .sx-statusbar .sx-state { color: var(--t-primary); }
19799
+ .sx-guidance.is-over { color: var(--sx-warn); }
19800
+
19801
+ /* ── Inspector ── */
19802
+ .sx-inspector { padding: 8px 12px 16px; display: grid; gap: 12px; align-content: start; }
19803
+ .sx-form { display: grid; gap: 10px; }
19804
+ .sx-chips { display: flex; flex-wrap: wrap; gap: 4px; }
19805
+ .sx .sx-chip {
19806
+ display: inline-flex; align-items: center; gap: 4px; padding: 2px 4px 2px 8px; border-radius: 6px;
19807
+ 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);
19808
+ }
19809
+ .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; }
19810
+ .sx .sx-chip-x:hover { color: var(--sx-err); background: var(--s-hover); }
19811
+ .sx-tools-add { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; }
19812
+ .sx-tools-add .sx-input { flex: 1 1 120px; width: auto; }
19813
+ .sx-helper { display: grid; gap: 6px; }
19814
+ .sx-budgets, .sx-checks { list-style: none; margin: 0; padding: 0; display: grid; gap: 4px; }
19815
+ .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); }
19816
+ .sx-budget.is-over { color: var(--sx-warn); }
19817
+ .sx-budget-count { font: 400 var(--sx-meta)/1.4 var(--ff-mono, 'JetBrains Mono', monospace); }
19818
+ .sx-checks li { display: flex; align-items: center; gap: 6px; font-size: var(--fs-xs); }
19819
+ .sx-checks .is-ok { color: var(--sx-ok); }
19820
+ .sx-checks .is-warn { color: var(--sx-warn); }
19821
+ .sx-insp-section { display: grid; gap: 6px; }
19822
+ .sx-insp-h { margin: 0; display: flex; align-items: center; gap: 6px; font-size: var(--fs-xs); font-weight: 600; color: var(--t-primary); }
19823
+ .sx-problems { list-style: none; margin: 0; padding: 0; display: grid; gap: 4px; }
19824
+ .sx .sx-problem {
19825
+ width: 100%; padding: 6px 8px; display: flex; gap: 6px; align-items: flex-start; text-align: left;
19826
+ border: 1px solid var(--b-subtle); border-radius: 5px; background: var(--s-subtle); cursor: pointer;
19827
+ font-size: var(--fs-xs); font-family: inherit; color: var(--t-primary);
19828
+ }
19829
+ .sx .sx-problem:hover { border-color: var(--b-hover); }
19830
+ .sx .sx-problem--error > .sx-i { color: var(--sx-err); }
19831
+ .sx .sx-problem--warning > .sx-i { color: var(--sx-warn); }
19832
+ .sx-problem-text { flex: 1; overflow-wrap: anywhere; }
19833
+ .sx-problem-line { color: var(--t-secondary); font-family: var(--ff-mono, 'JetBrains Mono', monospace); font-size: var(--sx-meta); }
19834
+ .sx-problem-tag { font-size: var(--sx-meta); color: var(--t-secondary); white-space: nowrap; }
19835
+ .sx-advanced { display: grid; gap: 6px; }
19836
+ .sx-kept { list-style: none; margin: 0; padding: 0; display: grid; gap: 6px; }
19837
+ .sx-snip-group { margin: 6px 0 2px; font-size: var(--sx-meta); font-weight: 600; letter-spacing: 0.02em; color: var(--t-secondary); }
19838
+ .sx-snippets { list-style: none; margin: 0; padding: 0; display: grid; gap: 4px; }
19839
+ .sx .sx-snippet {
19840
+ display: flex; align-items: center; gap: 8px; padding: 8px;
19841
+ border: 1px solid var(--b-light); border-radius: 5px; background: var(--s-subtle);
19842
+ cursor: move;
20233
19843
  }
20234
- .ss-preset-card-name {
20235
- font-size: 11px; font-weight: 500; color: var(--t-bright); line-height: 1.3;
19844
+ .sx .sx-snippet .sx-btn { cursor: pointer; }
19845
+ .sx-snippet-text { flex: 1; min-width: 0; }
19846
+ .sx-snippet-name { display: block; font-size: var(--fs-xs); font-weight: 500; color: var(--t-bright); }
19847
+ .sx-snippet-where { display: block; font-size: var(--sx-meta); color: var(--t-secondary); }
19848
+
19849
+ /* ── Versions ── */
19850
+ .sx-versions { flex: 1; min-height: 0; overflow: auto; padding: 12px 16px 16px; display: grid; gap: 12px; align-content: start; }
19851
+ .sx-versions-head { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
19852
+ .sx-compare-pick { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; }
19853
+ .sx-timeline { list-style: none; margin: 0; padding: 0; display: grid; gap: 6px; }
19854
+ .sx-version { padding: 8px 12px; border: 1px solid var(--b-light); border-radius: 8px; background: var(--s-subtle); display: grid; gap: 4px; }
19855
+ .sx-version--draft { border-style: dashed; }
19856
+ .sx-version-main { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; }
19857
+ .sx-version-id { font: 600 var(--fs-xs)/1.3 var(--ff-mono, 'JetBrains Mono', monospace); color: var(--t-bright); }
19858
+ .sx-version-meta { margin: 0; font-size: var(--fs-xs); color: var(--t-secondary); }
19859
+ .sx-version-note { color: var(--t-primary); }
19860
+ .sx-version-actions { display: flex; flex-wrap: wrap; gap: 6px; }
19861
+ .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; }
19862
+ .sx .sx-label--latest { color: var(--t-bright); border-color: var(--b-visible); }
19863
+ .sx .sx-label--approved { color: var(--sx-ok); border-color: color-mix(in oklab, var(--sx-ok) 40%, transparent); }
19864
+ .sx .sx-label--upstream { color: var(--sx-info); }
19865
+ .sx .sx-label--installed { color: var(--sx-ok); border-style: dashed; border-color: color-mix(in oklab, var(--sx-ok) 40%, transparent); }
19866
+ .sx .sx-label--draft, .sx .sx-label--candidate { color: var(--sx-gold); border-color: color-mix(in oklab, var(--sx-gold) 40%, transparent); }
19867
+ .sx .sx-label--best { color: var(--t-bright); border-color: var(--b-visible); background: var(--s-light); }
19868
+
19869
+ /* ── Differences ── */
19870
+ .sx-diff-box:empty { display: none; }
19871
+ .sx-diff { display: grid; gap: 8px; }
19872
+ .sx-diff-file { border: 1px solid var(--b-light); border-radius: 6px; overflow: hidden; }
19873
+ .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); }
19874
+ .sx-diff-status { font-size: var(--sx-meta); font-weight: 600; color: var(--t-primary); }
19875
+ .sx-diff-status--added { color: var(--sx-ok); }
19876
+ .sx-diff-status--removed { color: var(--sx-err); }
19877
+ .sx-diff-status--modified, .sx-diff-status--mode { color: var(--sx-warn); }
19878
+ .sx-diff-path { font-family: var(--ff-mono, 'JetBrains Mono', monospace); color: var(--t-bright); overflow-wrap: anywhere; }
19879
+ .sx-diff-counts { margin-left: auto; font: 500 var(--sx-meta)/1 var(--ff-mono, 'JetBrains Mono', monospace); }
19880
+ .sx-diff-plus { color: var(--sx-ok); }
19881
+ .sx-diff-minus { color: var(--sx-err); }
19882
+ .sx-diff-hunk { width: 100%; border-collapse: collapse; font: 400 var(--fs-xs)/1.55 var(--ff-mono, 'JetBrains Mono', monospace); }
19883
+ .sx-diff-head { padding: 4px 10px; text-align: left; color: var(--t-secondary); background: var(--sx-field); }
19884
+ .sx-diff-num { width: 40px; padding: 0 6px; text-align: right; color: var(--t-secondary); user-select: none; vertical-align: top; }
19885
+ .sx-diff-sign { width: 16px; padding: 0 4px; color: var(--t-secondary); vertical-align: top; }
19886
+ .sx-diff-text { padding: 0 8px; white-space: pre-wrap; overflow-wrap: anywhere; color: var(--t-bright); }
19887
+ .sx-diff-row--add td { background: color-mix(in oklab, var(--sx-ok) 9%, transparent); }
19888
+ .sx-diff-row--del td { background: color-mix(in oklab, var(--sx-err) 9%, transparent); }
19889
+ .sx-diff-row--add .sx-diff-sign { color: var(--sx-ok); }
19890
+ .sx-diff-row--del .sx-diff-sign { color: var(--sx-err); }
19891
+
19892
+ /* ── Publish: one choice (the tiles), one line per target (the plan), one button (the foot, always in sight) ── */
19893
+ .sx-publish { flex: 1; min-height: 0; display: flex; flex-direction: column; }
19894
+ .sx-pub-scroll { flex: 1; min-height: 0; overflow: auto; padding: 12px 16px 16px; display: grid; gap: 16px; align-content: start; }
19895
+ .sx-pub-section { display: grid; gap: 8px; }
19896
+ .sx-pub-section:empty { display: none; }
19897
+ .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); }
19898
+ .sx .sx-pub-status > .sx-i { flex: none; margin-top: 3px; color: var(--sx-ok); }
19899
+ .sx-tiles { display: grid; grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); gap: 8px; }
19900
+ .sx .sx-tile {
19901
+ 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;
19902
+ min-height: 56px; padding: 10px 12px; border: 1px solid var(--b-light); border-radius: 8px; background: var(--s-subtle); cursor: pointer;
19903
+ transition: background 0.15s ease, border-color 0.15s ease;
20236
19904
  }
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;
19905
+ .sx .sx-tile:hover { border-color: var(--b-hover); background: var(--s-light); }
19906
+ .sx .sx-tile.is-on { border-color: var(--b-visible); background: var(--s-light); }
19907
+ .sx .sx-tile.is-off { opacity: 0.6; cursor: default; }
19908
+ .sx .sx-tile:focus-within { outline: 2px solid var(--sx-focus); outline-offset: 1px; }
19909
+ .sx .sx-tile > input { grid-row: 1 / span 2; width: 16px; height: 16px; }
19910
+ .sx-tile-name { font-weight: 600; font-size: var(--fs-sm); color: var(--t-bright); line-height: 1.3; }
19911
+ .sx-tile-state { font-size: var(--sx-meta); color: var(--t-secondary); line-height: 1.3; }
19912
+ .sx-tile-state--installed { color: var(--sx-ok); }
19913
+ .sx-tile-state--outdated, .sx-tile-state--bridge { color: var(--sx-warn); }
19914
+ .sx-pub-scope .sx-seg button { height: 26px; }
19915
+ .sx-plan-lines { list-style: none; margin: 0; padding: 0; display: grid; gap: 6px; }
19916
+ .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; }
19917
+ .sx-plan-line-icon { flex: none; display: inline-flex; margin-top: 2px; color: var(--t-secondary); }
19918
+ .sx-plan-line-text { min-width: 0; overflow-wrap: anywhere; }
19919
+ .sx-plan-line-text strong { color: var(--t-bright); font-weight: 600; }
19920
+ .sx-plan-line--ok .sx-plan-line-icon { color: var(--sx-ok); }
19921
+ .sx-plan-line--warn { border-color: color-mix(in oklab, var(--sx-warn) 35%, transparent); }
19922
+ .sx-plan-line--warn .sx-plan-line-icon { color: var(--sx-warn); }
19923
+ .sx-plan-line--err { border-color: color-mix(in oklab, var(--sx-err) 35%, transparent); }
19924
+ .sx-plan-line--err .sx-plan-line-icon { color: var(--sx-err); }
19925
+ .sx .sx-pub-checking { display: inline-flex; align-items: center; gap: 8px; }
19926
+ .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; }
19927
+ @keyframes sx-spin { to { transform: rotate(360deg); } }
19928
+ .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); }
19929
+ .sx-outcome--error { border-color: color-mix(in oklab, var(--sx-warn) 40%, transparent); background: color-mix(in oklab, var(--sx-warn) 7%, transparent); }
19930
+ .sx .sx-outcome-line { margin: 0; display: flex; align-items: flex-start; gap: 8px; font-size: var(--fs-sm); color: var(--t-bright); }
19931
+ .sx .sx-outcome-line > .sx-i { flex: none; margin-top: 3px; color: var(--sx-ok); }
19932
+ .sx-outcome--error .sx-outcome-line > .sx-i { color: var(--sx-warn); }
19933
+ .sx .sx-outcome-notes { display: grid; gap: 2px; padding-left: 22px; }
19934
+ .sx-installs { list-style: none; margin: 0; padding: 0; display: grid; gap: 6px; }
19935
+ .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); }
19936
+ .sx-install-where { font-weight: 600; color: var(--t-bright); }
19937
+ .sx-install-actions { display: inline-flex; flex-wrap: wrap; gap: 4px; margin-left: auto; }
19938
+ .sx-install-facts { flex-basis: 100%; }
19939
+ .sx .sx-pub-advanced > summary { padding: 6px 0; }
19940
+ .sx-pub-advanced-body { display: grid; gap: 10px; padding: 8px 0 4px; }
19941
+ .sx-pub-bar {
19942
+ flex: none; position: sticky; bottom: 0; z-index: 2;
19943
+ display: flex; flex-wrap: wrap; align-items: center; gap: 8px 16px;
19944
+ padding: 10px 16px; background: var(--sx-raised); border-top: 1px solid var(--b-light);
19945
+ }
19946
+ .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); }
19947
+ .sx-pub-bar-where { font-weight: 600; color: var(--t-bright); overflow-wrap: anywhere; }
19948
+ .sx-pub-bar-version { font-size: var(--sx-meta); }
19949
+ .sx .sx-btn--lg { height: 36px; padding: 0 20px; font-size: var(--fs-sm); font-weight: 600; }
19950
+ .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; }
19951
+ .sx .sx-btn--lg[data-state="installed"] .sx-i { color: var(--sx-ok); }
19952
+ .sx-confirm-list { display: grid; gap: 8px; margin-top: 4px; }
19953
+ .sx .sx-confirm-item { margin: 0; font-size: var(--fs-xs); color: var(--t-primary); line-height: 1.45; overflow-wrap: anywhere; }
19954
+ .sx .sx-confirm-item p { margin: 0 0 6px; }
19955
+ /* The one status of a library skill: the same pill in the workspace head and the Library row. */
19956
+ .sx .sx-status {
19957
+ display: inline-flex; align-items: center; gap: 6px; max-width: 100%;
19958
+ min-height: 22px; padding: 2px 8px; line-height: 1.3; box-sizing: border-box;
19959
+ border: 1px solid var(--b-light); border-radius: 6px; background: transparent;
19960
+ font-size: var(--fs-xs); font-weight: 500; font-family: inherit; color: var(--t-primary); white-space: nowrap;
19961
+ }
19962
+ .sx .sx-status > span { overflow: hidden; text-overflow: ellipsis; }
19963
+ .sx button.sx-status { cursor: pointer; }
19964
+ .sx button.sx-status:hover { border-color: var(--b-hover); color: var(--t-bright); }
19965
+ .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); }
19966
+ .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); }
19967
+ .sx .sx-status--approved { color: var(--t-bright); border-color: var(--b-visible); background: var(--s-light); }
19968
+ .sx .sx-status--review, .sx .sx-status--changes { color: var(--sx-info); border-color: var(--b-visible); }
19969
+ .sx .sx-status--draft { color: var(--sx-gold); border-color: color-mix(in oklab, var(--sx-gold) 40%, transparent); }
19970
+ .sx .sx-status--none { color: var(--t-secondary); }
19971
+ /* One pill box for every pill of the Studio (kind tag, status, health): the same height as a small button, so a
19972
+ row of pills and buttons lines up in the Library cell and in the workspace head. */
19973
+ .sx .sx-tag, .sx .sx-status, .sx .sx-health {
19974
+ display: inline-flex; align-items: center; gap: 6px; box-sizing: border-box;
19975
+ min-height: 24px; padding: 2px 8px; border-radius: 6px; line-height: 1.3;
19976
+ }
19977
+ .sx .sx-tag { display: inline-block; line-height: 18px; }
19978
+ .sx-health-cell { display: inline-flex; flex-wrap: wrap; align-items: center; gap: 6px; max-width: 100%; }
19979
+ .sx-health-cell .sx-status { white-space: normal; }
19980
+ .sx-health-cell .sx-status > span { white-space: normal; overflow: visible; }
19981
+ .sx .sx-banner-lines { display: grid; gap: 2px; margin-top: 4px; color: var(--t-primary); }
19982
+ .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); }
19983
+ .sx .sx-banner--ok > .sx-i { color: var(--sx-ok); }
19984
+ .sx .sx-rt-row--fix .sx-rt-state { color: var(--sx-warn); text-align: right; line-height: 1.25; }
19985
+ .sx-grid { width: 100%; border-collapse: separate; border-spacing: 0; font-size: var(--fs-xs); }
19986
+ .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); }
19987
+ .sx-grid td { padding: 8px; border-bottom: 1px solid var(--b-subtle); vertical-align: top; }
19988
+ .sx-grid .sx-path { max-width: 280px; overflow-wrap: anywhere; color: var(--t-secondary); }
19989
+ .sx-actions-cell { display: flex; flex-wrap: wrap; gap: 4px; }
19990
+ .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; }
19991
+ .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); }
19992
+ .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); }
19993
+ .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); }
19994
+ .sx .sx-state-chip--none, .sx .sx-state-chip--off, .sx .sx-state-chip--present { color: var(--t-secondary); }
19995
+ .sx-facts { list-style: none; margin: 4px 0 0; padding: 0; display: grid; gap: 2px; font-size: var(--fs-xs); color: var(--t-primary); }
19996
+ .sx-plan { display: grid; gap: 8px; }
19997
+ .sx-plan-row { padding: 10px 12px; border: 1px solid var(--b-light); border-radius: 8px; background: var(--s-subtle); display: grid; gap: 6px; }
19998
+ .sx-plan-row--blocked { border-color: color-mix(in oklab, var(--sx-err) 35%, transparent); }
19999
+ .sx-plan-row--needs { border-color: color-mix(in oklab, var(--sx-warn) 35%, transparent); }
20000
+ .sx-plan-head { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
20001
+ .sx-plan-target { font-weight: 600; color: var(--t-bright); font-size: var(--fs-xs); }
20002
+ .sx .sx-confirm { display: flex; align-items: flex-start; gap: 8px; font-size: var(--fs-xs); color: var(--t-bright); cursor: pointer; }
20003
+ .sx .sx-confirm input { margin-top: 2px; accent-color: var(--sx-primary); }
20004
+ .sx-findings { list-style: none; margin: 0; padding: 0; display: grid; gap: 4px; }
20005
+ .sx-finding { padding: 6px 8px; border-radius: 5px; background: var(--s-subtle); border-left: 2px solid var(--b-light); font-size: var(--fs-xs); }
20006
+ .sx-finding--critical, .sx-finding--high { border-left-color: var(--sx-err); }
20007
+ .sx-finding--medium { border-left-color: var(--sx-warn); }
20008
+ .sx-finding-sev { font-weight: 600; color: var(--t-bright); }
20009
+ .sx-results { list-style: none; margin: 0; padding: 0; display: grid; gap: 4px; }
20010
+ .sx-result { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; font-size: var(--fs-xs); }
20011
+
20012
+ /* ── Review ── */
20013
+ .sx-cards { padding: 16px; display: grid; gap: 12px; max-width: 880px; }
20014
+ .sx-card { padding: 12px 16px; display: grid; gap: 8px; background: var(--s-subtle); border: 1px solid var(--b-light); border-radius: 8px; }
20015
+ .sx-card:focus { outline: none; }
20016
+ .sx-card.is-focused { border-color: var(--b-visible); }
20017
+ .sx-card-top { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
20018
+ .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); }
20019
+ .sx-card-mark { display: inline-flex; color: var(--sx-gold); }
20020
+ .sx-card-from { font-size: var(--fs-xs); color: var(--t-secondary); }
20021
+ .sx-card-notes { margin: 0; color: var(--t-primary); font-size: var(--fs-xs); overflow-wrap: anywhere; white-space: pre-wrap; }
20022
+ .sx-card-actions { display: flex; flex-wrap: wrap; gap: 8px; }
20023
+ .sx-card .sx-scan-err { color: var(--sx-err); }
20024
+ .sx-card .sx-scan-warn { color: var(--sx-warn); }
20025
+ .sx-card .sx-scan-ok { color: var(--sx-ok); }
20026
+ .sx-authority { display: grid; gap: 4px; }
20027
+
20028
+ /* ── Create ── */
20029
+ .sx-create { padding: 24px 24px 16px; display: grid; gap: 16px; max-width: 820px; }
20030
+ .sx-ai { display: grid; gap: 8px; padding: 12px; border: 1px solid var(--b-light); border-radius: 8px; background: var(--s-subtle); }
20031
+ .sx .sx-prompt { min-height: 110px; font-size: var(--fs-sm); line-height: 1.5; padding: 12px 14px; border-radius: 8px; }
20032
+ .sx-sources { gap: 6px; }
20033
+ .sx-blank { display: grid; gap: 12px; padding: 12px; border: 1px solid var(--b-light); border-radius: 8px; }
20034
+ .sx-layouts { display: grid; grid-template-columns: repeat(auto-fill, minmax(170px, 1fr)); gap: 6px; }
20035
+ .sx .sx-layout {
20036
+ position: relative; /* the hidden radio stays inside its card (focusing it never scrolls elsewhere) */
20037
+ display: grid; gap: 2px; padding: 8px 10px; border: 1px solid var(--b-light); border-radius: 6px; cursor: pointer;
20038
+ background: transparent;
20241
20039
  }
20242
- .ss-preset-card-actions {
20243
- position: absolute; top: 4px; right: 4px;
20244
- display: none; gap: 2px;
20040
+ .sx .sx-layout.is-on { border-color: var(--b-visible); background: var(--s-light); }
20041
+ .sx .sx-layout input { position: absolute; opacity: 0; pointer-events: none; }
20042
+ .sx .sx-layout:focus-within { outline: 2px solid var(--sx-focus); outline-offset: 1px; }
20043
+ .sx-layout-name { font-size: var(--fs-xs); font-weight: 600; color: var(--t-bright); }
20044
+ .sx-layout-desc { font-size: var(--sx-meta); color: var(--t-secondary); }
20045
+ .sx-examples { color: var(--t-primary); }
20046
+ /* ── Create: drafting with AI (P3, shared/skills/studio/sx-create-ai-view.js) ── */
20047
+ .sx-ai #sx-ai-main, .sx-ai-form, .sx-ai-job { display: grid; gap: 10px; min-width: 0; }
20048
+ .sx-ai .sx-section-title { display: inline-flex; align-items: center; gap: 6px; }
20049
+ .sx .sx-ai-example-toggle { justify-self: start; }
20050
+ .sx-ai-chips { margin: 0; padding: 0; list-style: none; display: flex; flex-wrap: wrap; gap: 6px; }
20051
+ .sx-ai-chip {
20052
+ display: inline-flex; align-items: center; gap: 6px; max-width: 100%; padding: 2px 2px 2px 8px;
20053
+ border: 1px solid var(--b-light); border-radius: 5px; background: var(--s-light); font-size: var(--fs-xs); color: var(--t-bright);
20054
+ }
20055
+ .sx-ai-chip-kind { color: var(--t-secondary); white-space: nowrap; }
20056
+ .sx-ai-chip-label { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
20057
+ .sx .sx-ai-chip-x { width: 22px; height: 22px; }
20058
+ .sx .sx-sources .sx-btn.is-on { border-color: var(--b-visible); background: var(--s-active); }
20059
+ .sx-ai-editor { display: grid; gap: 8px; padding: 10px 12px; border: 1px solid var(--b-light); border-radius: 8px; background: var(--sx-field); }
20060
+ .sx-ai-editor-title { margin: 0; font: 600 var(--fs-xs)/1.3 var(--ff-heading); color: var(--t-bright); }
20061
+ .sx-ai-editor-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 8px; }
20062
+ .sx-ai-wide { grid-column: 1 / -1; }
20063
+ .sx-ai-editor-actions { justify-content: flex-end; }
20064
+ .sx-ai-sessions { display: grid; gap: 2px; max-height: 240px; overflow: auto; padding: 2px; }
20065
+ .sx .sx-ai-session {
20066
+ display: grid; gap: 2px; padding: 6px 10px; text-align: left; border: 1px solid transparent; border-radius: 5px;
20067
+ background: transparent; color: var(--t-bright); font: inherit; font-size: var(--fs-xs); cursor: pointer;
20068
+ }
20069
+ .sx .sx-ai-session:hover { background: var(--s-hover); }
20070
+ .sx .sx-ai-session.is-on { border-color: var(--b-visible); background: var(--s-active); }
20071
+ .sx .sx-ai-session:focus-visible { outline: 2px solid var(--sx-focus); outline-offset: 1px; }
20072
+ .sx-ai-session-title { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
20073
+ .sx-ai-session-meta { font-size: var(--sx-meta); color: var(--t-secondary); }
20074
+ .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; }
20075
+ .sx-ai-options .sx-choices { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 14px; }
20076
+ .sx-ai-go .sx-help { flex: 1 1 260px; }
20077
+ .sx-ai-job-head { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
20078
+ .sx-ai-job-head .sx-spacer { flex: 1; }
20079
+ .sx-ai-job .sx-section-title:focus { outline: none; }
20080
+ .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); }
20081
+ .sx-ai-step { display: inline-flex; align-items: center; gap: 6px; }
20082
+ .sx-ai-step-n {
20083
+ width: 20px; height: 20px; flex: none; display: inline-flex; align-items: center; justify-content: center;
20084
+ border-radius: 50%; border: 1px solid var(--b-light); font-size: var(--sx-meta); color: var(--t-secondary);
20085
+ }
20086
+ .sx-ai-step.is-done { color: var(--t-primary); }
20087
+ .sx-ai-step.is-done .sx-ai-step-n { border-color: color-mix(in oklab, var(--sx-ok) 50%, transparent); color: var(--sx-ok); }
20088
+ .sx-ai-step.is-active { color: var(--t-bright); }
20089
+ .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; }
20090
+ .sx-ai-step.is-failed { color: var(--sx-err); }
20091
+ .sx-ai-step.is-failed .sx-ai-step-n { border-color: color-mix(in oklab, var(--sx-err) 50%, transparent); color: var(--sx-err); }
20092
+ .sx-ai-step.is-skipped { text-decoration: line-through; }
20093
+ @keyframes sx-ai-pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.45; } }
20094
+ .sx-ai-facts { margin: 0; display: grid; gap: 6px; font-size: var(--fs-xs); }
20095
+ .sx-ai-facts > div { display: grid; grid-template-columns: 90px minmax(0, 1fr); gap: 8px; }
20096
+ .sx-ai-facts dt { color: var(--t-secondary); }
20097
+ .sx-ai-facts dd { margin: 0; color: var(--t-primary); min-width: 0; overflow-wrap: anywhere; }
20098
+ .sx-ai-written, .sx-ai-activity, .sx-ai-result { display: grid; gap: 6px; }
20099
+ .sx-ai-activity pre {
20100
+ margin: 0; padding: 8px 10px; max-height: 160px; overflow: auto; border-radius: 6px;
20101
+ background: var(--sx-field); border: 1px solid var(--b-subtle); color: var(--t-primary); white-space: pre-wrap; overflow-wrap: anywhere;
20102
+ }
20103
+ .sx-ai-result p { margin: 0; font-size: var(--fs-xs); color: var(--t-primary); }
20104
+ .sx .sx-ai-checks { padding-left: 0; list-style: none; }
20105
+ .sx-ai-checks .sx-scan-ok { color: var(--sx-ok); }
20106
+ .sx-ai-checks .sx-scan-warn { color: var(--sx-warn); }
20107
+ .sx-ai-checks .sx-scan-err { color: var(--sx-err); }
20108
+ .sx-ai-details summary { cursor: pointer; font-size: var(--fs-xs); color: var(--t-primary); }
20109
+ .sx-ai-details[open] summary { margin-bottom: 4px; }
20110
+ .sx-ai-error {
20111
+ display: grid; gap: 4px; padding: 8px 10px; border-radius: 8px;
20112
+ border: 1px solid color-mix(in oklab, var(--sx-err) 35%, transparent); background: color-mix(in oklab, var(--sx-err) 6%, transparent);
20113
+ }
20114
+ .sx-ai-error p { margin: 0; font-size: var(--fs-xs); }
20115
+ .sx-ai-recent { display: grid; gap: 6px; padding-top: 10px; border-top: 1px solid var(--b-subtle); }
20116
+ .sx-ai-recent-list { margin: 0; padding: 0; list-style: none; display: grid; gap: 2px; }
20117
+ .sx .sx-ai-recent-row {
20118
+ width: 100%; display: grid; grid-template-columns: 10px minmax(0, 1fr) auto auto; align-items: center; gap: 8px; padding: 5px 8px;
20119
+ 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;
20120
+ }
20121
+ .sx .sx-ai-recent-row:hover { background: var(--s-hover); }
20122
+ .sx .sx-ai-recent-row.is-on { border-color: var(--b-light); background: var(--s-light); }
20123
+ .sx .sx-ai-recent-row:focus-visible { outline: 2px solid var(--sx-focus); outline-offset: 1px; }
20124
+ .sx-ai-recent-name { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
20125
+ .sx-ai-recent-state { color: var(--t-secondary); white-space: nowrap; }
20126
+ .sx-ai-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--t-secondary); }
20127
+ .sx-ai-dot--done { background: var(--sx-ok); }
20128
+ .sx-ai-dot--failed, .sx-ai-dot--interrupted { background: var(--sx-err); }
20129
+ .sx-ai-dot--cancelled { background: var(--sx-warn); }
20130
+ .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; }
20131
+ @container ss (max-width: 560px) {
20132
+ .sx-ai-facts > div { grid-template-columns: minmax(0, 1fr); gap: 0; }
20133
+ .sx .sx-ai-recent-row { grid-template-columns: 10px minmax(0, 1fr) auto; }
20134
+ .sx-ai-recent-row time { display: none; }
20245
20135
  }
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;
20136
+ @media (prefers-reduced-motion: reduce) {
20137
+ .sx-ai-step.is-active .sx-ai-step-n, .sx-ai-dot { animation: none; }
20138
+ }
20139
+
20140
+ /* ── Test: evaluations (P4, shared/skills/studio/sx-test-view.js) ──
20141
+ One scroll area (the head, the setup, the open run, a trial beside its request, the history) over one foot bar
20142
+ (Run evals, always in sight, as Publish's). Every colour is a token or a --sx-* status variable of the Studio. */
20143
+ .sx-test { flex: 1; min-height: 0; display: flex; flex-direction: column; }
20144
+ .sx-test-scroll { flex: 1; min-height: 0; overflow: auto; padding: 12px 16px 16px; display: grid; gap: 16px; align-content: start; }
20145
+ .sx-test-section { display: grid; gap: 8px; min-width: 0; }
20146
+ .sx-test-section:empty { display: none; }
20147
+ .sx-test-headline { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
20148
+ .sx-test-headline .sx-section-title { display: inline-flex; align-items: center; gap: 6px; }
20149
+ .sx-test-headline .sx-spacer { flex: 1; }
20150
+ .sx-test-queue { font-size: var(--sx-meta); color: var(--sx-info); }
20151
+ .sx .sx-test-safety { display: flex; align-items: flex-start; gap: 6px; }
20152
+ .sx .sx-test-safety > .sx-i { flex: none; margin-top: 2px; }
20153
+ .sx-test-safety-box { display: grid; gap: 2px; }
20154
+ .sx .sx-test-safety--warn > .sx-i { color: var(--sx-warn); }
20155
+ #sx-test-codex-box:empty { display: none; }
20156
+ .sx-test-codex { display: grid; gap: 6px; }
20157
+ .sx .sx-test-codex-line { margin: 0; display: flex; align-items: flex-start; gap: 6px; color: var(--t-bright); }
20158
+ .sx .sx-test-codex-line > .sx-i { flex: none; margin-top: 2px; color: var(--sx-warn); }
20159
+ .sx-test-codex .sx-help { margin: 0; }
20160
+ .sx-test-setup { padding: 12px 14px; border: 1px solid var(--b-light); border-radius: 8px; background: var(--s-subtle); }
20161
+ .sx-test-setup-box { display: grid; gap: 10px; }
20162
+ .sx-test-setup-box[open] > .sx-test-setup-summary { margin-bottom: 8px; }
20163
+ .sx-test-setup-summary { display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px 10px; cursor: pointer; list-style: none; }
20164
+ .sx-test-setup-summary::-webkit-details-marker { display: none; }
20165
+ .sx-test-setup-summary::before { content: '▸'; color: var(--t-secondary); font-size: var(--fs-xs); transition: transform 0.15s ease; }
20166
+ .sx-test-setup-box[open] > .sx-test-setup-summary::before { transform: rotate(90deg); }
20167
+ .sx-test-setup-summary:focus-visible { outline: 2px solid var(--sx-focus); outline-offset: 2px; border-radius: 4px; }
20168
+ .sx .sx-test-setup-line { font-size: var(--fs-xs); min-width: 0; overflow-wrap: anywhere; }
20169
+ .sx-test-setup-box[open] .sx-test-setup-line { display: none; }
20170
+ .sx-test-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 10px 16px; align-items: start; }
20171
+ /* A field of the setup grid never grows past its column: its own content fits it instead. */
20172
+ .sx-test-grid > .sx-field { min-width: 0; grid-template-columns: minmax(0, 1fr); }
20173
+ /* The segment fits its cell in every language: one row, a long label wraps inside its own button (pt-BR "Tarefas e acionamentos"). */
20174
+ .sx .sx-test .sx-seg { display: inline-grid; grid-auto-flow: column; grid-auto-columns: minmax(0, auto); max-width: 100%; }
20175
+ .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; }
20176
+ .sx-test-runtimes { gap: 6px; }
20177
+ .sx-test-runtime { display: flex; align-items: center; gap: 6px; min-width: 0; }
20178
+ .sx-test-runtime .cc-dropdown { flex: 1; min-width: 0; }
20179
+ .sx .sx-test-add { justify-self: start; font-size: var(--fs-xs); }
20180
+ .sx-test-more > summary { margin-top: 2px; }
20181
+ .sx-test-more[open] > .sx-test-grid { margin-top: 8px; }
20182
+ .sx .sx-test-judge { align-self: end; padding-bottom: 6px; }
20183
+ .sx-test-estimate { display: grid; gap: 4px; padding-top: 8px; border-top: 1px solid var(--b-subtle); }
20184
+ .sx .sx-test-estimate-line { margin: 0; display: flex; align-items: flex-start; gap: 6px; font-size: var(--fs-xs); color: var(--t-bright); }
20185
+ .sx .sx-test-estimate-line > .sx-i { flex: none; margin-top: 2px; color: var(--sx-info); }
20186
+ .sx .sx-test-notes { color: var(--t-secondary); }
20187
+ .sx-test-bar {
20188
+ flex: none; position: sticky; bottom: 0; z-index: 2;
20189
+ display: flex; flex-wrap: wrap; align-items: center; gap: 8px 12px;
20190
+ padding: 10px 16px; background: var(--sx-raised); border-top: 1px solid var(--b-light);
20191
+ }
20192
+ .sx .sx-test-bar-text { flex: 1 1 240px; min-width: 0; }
20193
+ .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; }
20194
+ .sx-test-trial:focus { outline: none; border-color: var(--b-visible); }
20195
+ .sx-test-run-head { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
20196
+ .sx-test-run-head .sx-spacer { flex: 1; }
20197
+ .sx-test-run-head .sx-section-title:focus { outline: none; }
20198
+ .sx-test-state { display: inline-flex; align-items: center; gap: 6px; font-size: var(--sx-meta); color: var(--t-secondary); }
20199
+ .sx-test-state::before { content: ''; width: 8px; height: 8px; border-radius: 50%; background: var(--t-secondary); }
20200
+ .sx-test-state--done::before { background: var(--sx-ok); }
20201
+ .sx-test-state--failed::before, .sx-test-state--interrupted::before { background: var(--sx-err); }
20202
+ .sx-test-state--cancelled::before, .sx-test-state--stopped::before { background: var(--sx-warn); }
20203
+ .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; }
20204
+ .sx-test-spend { white-space: nowrap; }
20205
+ .sx-test-spend.is-over .sx-meter > i { background: var(--sx-warn); }
20206
+ .sx .sx-test-progress-line { margin: 0; font-size: var(--fs-xs); color: var(--t-bright); }
20207
+ .sx-test-live { margin: 0; padding: 0; list-style: none; display: grid; gap: 4px; }
20208
+ .sx-test-live-case { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 8px; font-size: var(--fs-xs); }
20209
+ .sx-test-case-id { font: 500 var(--fs-xs)/1.4 var(--ff-mono, 'JetBrains Mono', monospace); color: var(--t-bright); overflow-wrap: anywhere; }
20210
+ .sx .sx-tag--train, .sx .sx-tag--validation, .sx .sx-tag--test { font-size: var(--sx-meta); padding: 0 6px; }
20211
+ .sx .sx-tag--test { color: var(--sx-gold); border-color: color-mix(in oklab, var(--sx-gold) 40%, transparent); }
20212
+ .sx-test-dots { display: inline-flex; flex-wrap: wrap; gap: 3px; }
20213
+ .sx-test-dot { width: 10px; height: 10px; border-radius: 3px; background: var(--s-medium); border: 1px solid var(--b-light); }
20214
+ .sx-test-dot--running { background: var(--sx-info); animation: sx-ai-pulse 1.6s ease-in-out infinite; }
20215
+ .sx-test-dot--pass { background: var(--sx-ok); border-color: transparent; }
20216
+ .sx-test-dot--partial { background: color-mix(in oklab, var(--sx-ok) 45%, var(--sx-warn)); border-color: transparent; }
20217
+ .sx-test-dot--fail { background: var(--sx-err); border-color: transparent; }
20218
+ .sx-test-dot--error { background: transparent; border-color: var(--sx-err); }
20219
+ .sx-test-dot--skipped { background: transparent; border-style: dashed; }
20220
+ .sx-test-export { display: inline-flex; align-items: center; gap: 6px; }
20221
+ .sx-test-runtime-report { display: grid; gap: 8px; padding-top: 8px; border-top: 1px solid var(--b-subtle); min-width: 0; }
20222
+ .sx-test-runtime-name { margin: 0; font: 600 var(--fs-xs)/1.4 var(--ff-heading); color: var(--t-bright); }
20223
+ .sx-test-stats { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 8px; }
20224
+ .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); }
20225
+ .sx-test-stat-label { flex-basis: 100%; font-size: var(--sx-meta); color: var(--t-secondary); text-transform: none; }
20226
+ .sx-test-stat-value { font: 600 calc(18px * var(--font-scale, 1))/1.2 var(--ff-heading); color: var(--t-bright); }
20227
+ .sx-test-stat-vs { color: var(--t-primary); }
20228
+ .sx-test-delta { font-weight: 600; white-space: nowrap; }
20229
+ .sx-test-delta--up { color: var(--sx-ok); }
20230
+ .sx-test-delta--down { color: var(--sx-err); }
20231
+ .sx-test-delta--flat, .sx-test-delta--none { color: var(--t-secondary); }
20232
+ .sx-test-table { width: 100%; border-collapse: collapse; font-size: var(--fs-xs); }
20233
+ .sx-test-table th, .sx-test-table td { padding: 6px 8px; text-align: left; vertical-align: top; border-bottom: 1px solid var(--b-subtle); }
20234
+ .sx-test-table thead th { font-weight: 500; color: var(--t-secondary); border-bottom-color: var(--b-light); }
20235
+ .sx-test-table tbody th { font-weight: 400; }
20236
+ .sx-test-table tr.is-best td, .sx-test-table tr.is-best th { background: var(--s-light); }
20237
+ .sx-test-desc { max-width: 52ch; overflow-wrap: anywhere; color: var(--t-primary); }
20238
+ .sx-test-pass { display: inline-flex; align-items: center; gap: 4px; white-space: nowrap; }
20239
+ .sx-test-pass--yes { color: var(--sx-ok); }
20240
+ .sx-test-pass--no { color: var(--sx-err); }
20241
+ .sx-test-pass--maybe { color: var(--sx-warn); }
20242
+ .sx-test-optimise { display: grid; gap: 8px; }
20243
+ .sx-test-side { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; }
20244
+ .sx-test-pane { display: grid; gap: 6px; align-content: start; min-width: 0; }
20245
+ .sx-test-pane-title { margin: 0; font: 600 var(--sx-meta)/1.4 var(--ff-heading); color: var(--t-secondary); }
20246
+ .sx .sx-test-pane .sx-pre { max-height: 320px; }
20247
+ .sx .sx-test-files { padding-left: 0; list-style: none; }
20248
+ .sx-test-files .sx-link { font-size: var(--fs-xs); }
20249
+ .sx .sx-test-next .sx-i { transform: scaleX(-1); }
20250
+ .sx-test-assertions { margin: 8px 0 0; padding: 0; list-style: none; display: grid; gap: 6px; }
20251
+ .sx-test-assertion { display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px 8px; font-size: var(--fs-xs); color: var(--t-primary); }
20252
+ .sx-test-assertion-text { color: var(--t-bright); }
20253
+ .sx .sx-test-evidence { flex-basis: 100%; margin: 0; padding-left: 18px; color: var(--t-secondary); overflow-wrap: anywhere; }
20254
+ .sx .sx-test-feedback .sx-field-label { align-items: baseline; }
20255
+ .sx-test-history { margin: 0; padding: 0; list-style: none; display: grid; gap: 2px; }
20256
+ .sx-test-history-row { display: flex; align-items: center; gap: 8px; padding: 0 0 0 8px; border: 1px solid transparent; border-radius: 5px; }
20257
+ .sx-test-history-row.is-on { border-color: var(--b-light); background: var(--s-light); }
20258
+ .sx .sx-test-history-open {
20259
+ flex: 1; min-width: 0; display: flex; flex-wrap: wrap; align-items: center; gap: 4px 10px; padding: 6px 8px;
20260
+ border: 0; border-radius: 5px; background: transparent; color: var(--t-primary); font: inherit; font-size: var(--fs-xs); text-align: left; cursor: pointer;
20261
+ }
20262
+ .sx .sx-test-history-open:hover { background: var(--s-hover); color: var(--t-bright); }
20263
+ .sx .sx-test-history-open:focus-visible { outline: 2px solid var(--sx-focus); outline-offset: 1px; }
20264
+ .sx-test-history-what { min-width: 0; flex: 1 1 200px; color: var(--t-bright); overflow-wrap: anywhere; }
20265
+ .sx-test-history-numbers { font: 500 var(--fs-xs)/1.4 var(--ff-mono, 'JetBrains Mono', monospace); color: var(--t-bright); }
20266
+ .sx-test-comparison { display: grid; gap: 8px; padding-top: 8px; border-top: 1px solid var(--b-subtle); }
20267
+ .sx-test-empty { max-width: 620px; }
20268
+ .sx-test-empty-actions { justify-content: center; }
20269
+ .sx-test-import { width: 100%; text-align: left; }
20270
+ .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; }
20271
+ @container ss (max-width: 760px) {
20272
+ .sx-test-side { grid-template-columns: minmax(0, 1fr); }
20273
+ .sx-test-stats { grid-template-columns: minmax(0, 1fr); }
20251
20274
  }
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;
20275
+ @container ss (max-width: 560px) {
20276
+ .sx-test-grid { grid-template-columns: minmax(0, 1fr); }
20277
+ .sx-test-scroll { padding: 12px 12px 16px; }
20278
+ .sx-test-bar { padding: 8px 12px; }
20279
+ .sx .sx-test-bar-text { flex-basis: 100%; }
20280
+ .sx .sx-test-bar .sx-btn--lg { width: 100%; }
20281
+ .sx-test-table thead { display: none; }
20282
+ .sx-test-table, .sx-test-table tbody, .sx-test-table tr, .sx-test-table th, .sx-test-table td { display: block; width: auto; }
20283
+ .sx-test-table tr { padding: 6px 0; border-bottom: 1px solid var(--b-subtle); }
20284
+ .sx-test-table th, .sx-test-table td { border: 0; padding: 2px 0; }
20257
20285
  }
20258
- .ss-preset-act-btn:hover {
20259
- background: var(--s-hover); color: var(--t-bright); border-color: var(--b-light);
20286
+ @media (prefers-reduced-motion: reduce) {
20287
+ .sx-test-state::before, .sx-test-dot--running { animation: none; }
20288
+ .sx-test-setup-summary::before { transition: none; }
20289
+ }
20290
+
20291
+ /* ── Narrow windows: fold, never shrink the text ── */
20292
+ @container ss (max-width: 900px) {
20293
+ .sx-rail { --sx-rail: 56px; padding: 8px 6px; }
20294
+ .sx-rail :is(.sx-rail-label, .sx-rail-count, .sx-rail-groups, .sx-rt-name, .sx-rt-state) { display: none; }
20295
+ .sx .sx-rail-item { justify-content: center; padding: 0; }
20296
+ .sx .sx-rt-row { justify-content: center; }
20297
+ .sx-panes { grid-template-columns: 180px minmax(0, 1fr) 260px; }
20298
+ .sx-lib .sx-col-updated { display: none; }
20299
+ }
20300
+ @container ss (max-width: 760px) {
20301
+ .sx-pane-switch { display: inline-flex; }
20302
+ .sx-tiles { grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); }
20303
+ .sx-panes { grid-template-columns: minmax(0, 1fr); }
20304
+ .sx-pane + .sx-pane { border-left: 0; }
20305
+ .sx-edit[data-pane="files"] .sx-pane:not(.sx-pane--files),
20306
+ .sx-edit[data-pane="doc"] .sx-pane:not(.sx-pane--doc),
20307
+ .sx-edit[data-pane="details"] .sx-pane:not(.sx-pane--details) { display: none; }
20308
+ .sx-lib .sx-col-kind { display: none; }
20309
+ .sx-grid .sx-path { max-width: 160px; }
20260
20310
  }
20261
- .ss-preset-act-add {
20262
- color: hsla(var(--accent-hue, 215), var(--accent-saturation, 16%), var(--accent-lightness, 65%), 1);
20311
+ @container ss (max-width: 560px) {
20312
+ .sx-body { flex-direction: column; }
20313
+ .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; }
20314
+ .sx-rail .sx-rail-list { flex-direction: row; }
20315
+ .sx .sx-rail-item { width: auto; padding: 0 10px; }
20316
+ .sx-rail .sx-rail-item .sx-rail-label, .sx-rail .sx-rail-item .sx-rail-count { display: inline; }
20317
+ .sx-rail-foot { display: none; }
20318
+ .sx-lib thead { display: none; }
20319
+ .sx-lib, .sx-lib tbody, .sx-lib tr, .sx-lib td { display: block; width: auto; }
20320
+ .sx-lib tr { position: relative; margin: 0 12px 8px; padding: 8px 12px; border: 1px solid var(--b-light); border-radius: 8px; }
20321
+ .sx-lib td { border: 0; padding: 2px 0; }
20322
+ .sx-lib .sx-col-check { position: absolute; right: 12px; top: 8px; width: auto; padding: 0; }
20323
+ .sx-lib .sx-col-name { padding-right: 28px; }
20324
+ .sx-desc { white-space: normal; }
20325
+ .sx-search { max-width: none; flex-basis: 100%; }
20326
+ .sx-ws-title .sx-tag { max-width: 100%; }
20327
+ .sx-create { padding: 16px; }
20328
+ .sx-cards { padding: 12px; }
20329
+ .sx-tiles { grid-template-columns: 1fr; }
20330
+ .sx-pub-bar { padding: 8px 12px; }
20331
+ .sx-pub-bar-text { flex-basis: 100%; }
20332
+ .sx .sx-pub-bar .sx-btn--lg { width: 100%; }
20333
+ .sx-pub-scroll { padding: 12px 12px 16px; }
20334
+ .sx-install-actions { margin-left: 0; flex-basis: 100%; }
20263
20335
  }
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);
20336
+ @media (prefers-reduced-motion: reduce) {
20337
+ .skills-studio-panel.sx, .sx .sx-btn, .sx .sx-icon-btn { transition: none; }
20338
+ .skills-studio-panel.sx { transform: none; }
20268
20339
  }
20269
20340
 
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;
20277
- }
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);
20281
- }
20341
+ /* ── Kept from the Studio before 2.0 ──
20342
+ The questions inside the panel (shared/skills/ss-dialog.js), an import's review, the toasts, and the
20343
+ Markdown toolbar the Automation Studio's editor uses (.ss-md-toolbar, .ss-view-toggle). */
20282
20344
 
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;
20345
+ /* ── File browser dialog ── */
20346
+ .ss-file-dialog-overlay {
20347
+ position: absolute; inset: 0; z-index: 200;
20348
+ display: flex; align-items: center; justify-content: center;
20290
20349
  }
20291
-
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);
20350
+ .ss-fd-backdrop {
20351
+ position: absolute; inset: 0;
20352
+ background: rgba(0,0,0,0.5); backdrop-filter: blur(2px);
20297
20353
  }
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;
20354
+ .ss-file-dialog {
20355
+ position: relative; z-index: 1;
20356
+ width: 340px;
20357
+ background: var(--s-glass-bg, rgba(18,18,28,0.96));
20358
+ border: 1px solid var(--b-light);
20359
+ border-radius: var(--r-base);
20360
+ box-shadow: var(--shadow-lg);
20361
+ display: flex; flex-direction: column;
20362
+ overflow: hidden;
20307
20363
  }
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;
20364
+ /* ── Questions inside the panel (shared/skills/ss-dialog.js) ──
20365
+ Drawn over the panel's content in the file dialog's overlay; a modal alertdialog. */
20366
+ .ss-dlg { width: min(400px, calc(100% - 32px)); padding: 16px 18px; gap: 0; }
20367
+ .ss-dlg--wide { width: min(620px, calc(100% - 32px)); max-height: calc(100% - 40px); }
20368
+ .ss-dlg-title {
20369
+ font-family: var(--ff-heading); font-size: var(--fs-sm); font-weight: 600;
20370
+ color: var(--t-bright); margin-bottom: 8px; overflow-wrap: anywhere;
20371
+ }
20372
+ .ss-dlg-body {
20373
+ font-size: var(--fs-xs); line-height: 1.5; color: var(--t-primary);
20374
+ overflow-y: auto; min-height: 0; flex: 1; overflow-wrap: anywhere;
20375
+ }
20376
+ .ss-dlg-body p { margin: 0 0 6px; }
20377
+ .ss-dlg-actions { display: flex; justify-content: flex-end; flex-wrap: wrap; gap: 8px; margin-top: 14px; }
20378
+ .ss-dlg-btn {
20379
+ padding: 6px 14px; border-radius: var(--r-small);
20380
+ font-size: var(--fs-xs); font-family: inherit; font-weight: 500;
20381
+ background: var(--s-light); color: var(--t-primary);
20382
+ border: 1px solid var(--b-subtle); cursor: pointer;
20383
+ transition: background 0.12s, color 0.12s, border-color 0.12s;
20313
20384
  }
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;
20385
+ .ss-dlg-btn:hover:not(:disabled) { background: var(--s-medium); color: var(--t-bright); }
20386
+ .ss-dlg-btn:focus-visible { outline: 2px solid var(--accent-blue); outline-offset: 1px; }
20387
+ .ss-dlg-btn:disabled { opacity: 0.4; cursor: default; }
20388
+ .ss-dlg-btn--primary { background: var(--s-medium); color: var(--t-bright); border-color: var(--b-light); }
20389
+ .ss-dlg-btn--primary:hover:not(:disabled) { background: var(--s-active); }
20390
+ .ss-dlg-btn--danger { background: var(--accent-red-bg); color: hsla(0, 70%, 72%, 1); border-color: hsla(0, 45%, 45%, 0.25); }
20391
+ .ss-dlg-btn--danger:hover:not(:disabled) { background: var(--accent-red-hover); color: var(--t-bright); }
20392
+ .ss-dlg-form { display: flex; flex-direction: column; gap: 10px; margin-top: 8px; }
20393
+ .ss-dlg-error { margin: 4px 0 0; min-height: 1em; color: hsla(0, 70%, 72%, 1); font-size: var(--fs-xs); }
20394
+ .ss-dlg-error:empty { display: none; }
20395
+
20396
+ /* ── A delete that is typed to confirm (sx-library-view.js deleteConfirmBox) ──
20397
+ One row per item, the consequence, then the field; Delete stays off until the word matches. */
20398
+ .ss-dlg.ss-dlg--confirm { width: min(480px, calc(100% - 32px)); max-height: calc(100% - 40px); padding: 20px 20px 16px; }
20399
+ .ss-dlg--confirm .ss-dlg-title { font-size: var(--fs-md, 15px); margin-bottom: 12px; }
20400
+ .ss-dlg--confirm .ss-dlg-actions { margin-top: 16px; gap: 8px; align-items: stretch; }
20401
+ .ss-dlg--confirm .ss-dlg-btn { min-width: 88px; height: 30px; padding: 0 14px; display: inline-flex; align-items: center; justify-content: center; }
20402
+ .ss-dlg--confirm .ss-dlg-btn--danger:disabled { opacity: 0.45; }
20403
+ .sx-del { display: flex; flex-direction: column; gap: 12px; }
20404
+ .sx-del-list {
20405
+ list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column;
20406
+ border: 1px solid var(--b-subtle); border-radius: 9px; background: var(--s-light); overflow: hidden;
20407
+ }
20408
+ .sx-del-item {
20409
+ display: grid; grid-template-columns: 18px minmax(0, 1fr) auto auto; align-items: center; gap: 4px 10px;
20410
+ padding: 8px 12px; min-height: 40px; box-sizing: border-box;
20411
+ }
20412
+ .sx-del-item + .sx-del-item, .sx-del-more { border-top: 1px solid var(--b-subtle); }
20413
+ .sx-del-icon { display: inline-grid; place-items: center; color: var(--t-secondary); }
20414
+ .sx-del-icon svg { width: 15px; height: 15px; }
20415
+ .sx-del-main { display: flex; flex-direction: column; min-width: 0; }
20416
+ .sx-del-name { color: var(--t-bright); font-weight: 500; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
20417
+ .sx-del-path {
20418
+ color: var(--t-secondary); font: 400 var(--sx-meta, 11px)/1.4 var(--ff-mono, 'JetBrains Mono', monospace);
20419
+ overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
20321
20420
  }
20421
+ .sx-del-kind, .sx-del-effect {
20422
+ font-size: var(--sx-meta, 11px); line-height: 1; padding: 4px 7px; border-radius: 5px; white-space: nowrap;
20423
+ border: 1px solid var(--b-light); color: var(--t-primary);
20424
+ }
20425
+ .sx-del-effect--disk { color: var(--sx-err); border-color: color-mix(in oklab, var(--sx-err) 35%, transparent); background: color-mix(in oklab, var(--sx-err) 8%, transparent); }
20426
+ .sx-del-effect--library { color: var(--t-primary); background: var(--s-medium); }
20427
+ .sx-del-more { padding: 6px 12px 8px 40px; color: var(--t-secondary); font-size: var(--sx-meta, 11px); }
20428
+ .ss-dlg-body p.sx-del-note { display: flex; gap: 8px; align-items: flex-start; margin: 0; color: var(--t-primary); }
20429
+ .sx-del-note svg { flex: none; width: 14px; height: 14px; margin-top: 2px; color: var(--t-secondary); }
20430
+ .sx-del-note--danger svg { color: var(--sx-err); }
20431
+ .sx-del-field { display: flex; flex-direction: column; gap: 6px; padding-top: 4px; }
20432
+ .sx-del-label { color: var(--t-primary); }
20433
+ .sx-del-word {
20434
+ font: 500 var(--fs-xs)/1 var(--ff-mono, 'JetBrains Mono', monospace); color: var(--t-bright);
20435
+ padding: 2px 6px; margin: 0 2px; border-radius: 4px; background: var(--s-medium); border: 1px solid var(--b-light);
20436
+ }
20437
+ .sx-del-input {
20438
+ width: 100%; height: 32px; padding: 0 10px; box-sizing: border-box;
20439
+ background: var(--sx-field, rgba(255,255,255,0.04)); border: 1px solid var(--b-light); border-radius: 5px;
20440
+ color: var(--t-bright); font: 400 var(--fs-xs)/1 var(--ff-mono, 'JetBrains Mono', monospace);
20441
+ transition: border-color 0.12s, box-shadow 0.12s;
20442
+ }
20443
+ .sx-del-input:hover { border-color: var(--b-visible); }
20444
+ .sx-del-input:focus { outline: none; border-color: color-mix(in oklab, var(--sx-err) 55%, transparent); box-shadow: 0 0 0 3px color-mix(in oklab, var(--sx-err) 14%, transparent); }
20445
+ @media (max-width: 520px) {
20446
+ .sx-del-item { grid-template-columns: 18px minmax(0, 1fr) auto; }
20447
+ .sx-del-kind { display: none; }
20448
+ }
20449
+
20450
+ /* ── The fix panel (sx-fixes-view.js): a card per problem, its meaning and its buttons ── */
20451
+ .sx .sx-health--fix { cursor: pointer; font-family: inherit; transition: filter 0.12s, border-color 0.12s; }
20452
+ .sx .sx-health--fix:hover { filter: brightness(1.15); border-color: currentColor; }
20453
+ .sx .sx-health--fix:focus-visible { outline: 2px solid var(--sx-focus); outline-offset: 1px; }
20454
+ .sx-fix-panel { display: flex; flex-direction: column; gap: 8px; margin-top: 4px; }
20455
+ .sx-fix-card { padding: 10px 12px; border: 1px solid var(--b-subtle); border-left-width: 3px; border-radius: 9px; background: var(--s-light); }
20456
+ .sx-fix-card--err { border-left-color: var(--sx-err); }
20457
+ .sx-fix-card--warn { border-left-color: var(--sx-warn); }
20458
+ .sx-fix-card--info { border-left-color: var(--b-visible); }
20459
+ .sx-fix-card-head { display: flex; align-items: center; gap: 8px; color: var(--t-bright); }
20460
+ .sx-fix-card-head svg { width: 14px; height: 14px; flex: none; }
20461
+ .sx-fix-card--err .sx-fix-card-head svg { color: var(--sx-err); }
20462
+ .sx-fix-card--warn .sx-fix-card-head svg { color: var(--sx-warn); }
20463
+ .sx-fix-mode { margin-left: auto; font-size: var(--sx-meta, 11px); line-height: 1; padding: 4px 7px; border-radius: 5px; border: 1px solid var(--b-light); color: var(--t-secondary); white-space: nowrap; }
20464
+ .sx-fix-mode--auto { color: var(--sx-ok); border-color: color-mix(in oklab, var(--sx-ok) 35%, transparent); }
20465
+ .ss-dlg-body p.sx-fix-explain { margin: 6px 0 8px; color: var(--t-primary); }
20466
+ .sx-fix-actions { display: flex; flex-wrap: wrap; gap: 6px; }
20467
+ .sx-fix-actions .sx-dim { margin: 0; }
20468
+ .sx-fix-preview { margin: 4px 0 0; padding: 0; list-style: none; border: 1px solid var(--b-subtle); border-radius: 9px; background: var(--s-light); }
20469
+ .sx-fix-preview-row { padding: 7px 12px; color: var(--t-primary); }
20470
+ .sx-fix-preview-row + .sx-fix-preview-row { border-top: 1px solid var(--b-subtle); }
20471
+ .sx-fix-choose { display: flex; flex-direction: column; gap: 6px; margin-top: 6px; }
20472
+ .sx-fix-choice { display: flex; align-items: center; gap: 8px; padding: 8px 10px; border: 1px solid var(--b-subtle); border-radius: 9px; cursor: pointer; }
20473
+ .sx-fix-choice:has(input:checked) { border-color: var(--b-visible); background: var(--s-light); }
20474
+ .sx-fix-choice:has(input:disabled) { opacity: 0.5; cursor: default; }
20475
+ .sx .sx-fix-notice .sx-btn { flex: none; }
20476
+
20477
+ /* ── An import's review ── */
20478
+ .ss-review { display: flex; flex-direction: column; gap: 8px; }
20479
+ .ss-review-row { display: flex; gap: 10px; align-items: baseline; }
20480
+ .ss-review-label { flex: 0 0 64px; color: var(--t-secondary); }
20481
+ .ss-review-value { color: var(--t-bright); overflow-wrap: anywhere; }
20482
+ code.ss-review-value, .ss-review-evidence { font-family: var(--ff-mono, monospace); font-size: 11px; }
20483
+ .ss-review-files summary { cursor: pointer; color: var(--t-secondary); }
20484
+ .ss-review-files ul, .ss-review-list, .ss-review-facts { margin: 4px 0 0; padding-left: 18px; }
20485
+ .ss-review-files li, .ss-review-facts li { margin: 2px 0; }
20486
+ .ss-review-section { border-top: 1px solid var(--b-subtle); padding-top: 8px; }
20487
+ .ss-review-head { color: var(--t-bright); font-weight: 600; margin-bottom: 4px; }
20488
+ .ss-review-list { list-style: none; padding-left: 0; display: flex; flex-direction: column; gap: 6px; }
20489
+ .ss-review-item { padding: 6px 8px; border-radius: var(--r-small); background: var(--s-subtle); border-left: 2px solid var(--b-light); }
20490
+ .ss-review-item--critical, .ss-review-item--high { border-left-color: var(--accent-red); }
20491
+ .ss-review-item--medium { border-left-color: var(--accent-orange); }
20492
+ .ss-review-sev { color: var(--t-bright); font-weight: 600; text-transform: capitalize; }
20493
+ .ss-review-where { color: var(--t-secondary); font-family: var(--ff-mono, monospace); font-size: 11px; }
20494
+ .ss-review-evidence { display: block; margin-top: 4px; color: var(--t-primary); white-space: pre-wrap; overflow-wrap: anywhere; }
20495
+ .ss-review-muted { color: var(--t-secondary); }
20496
+ .ss-review-warn { margin: 0; color: var(--accent-orange); }
20497
+ .ss-review-check { display: flex; gap: 8px; align-items: flex-start; color: var(--t-bright); cursor: pointer; }
20498
+ .ss-review-check input { margin-top: 2px; }
20322
20499
 
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;
20500
+ /* ── Markdown toolbar ── */
20501
+ .ss-md-toolbar {
20502
+ display: flex; align-items: center; gap: 1px;
20503
+ padding: 3px 6px; border-bottom: 1px solid var(--b-subtle);
20504
+ background: rgba(0,0,0,0.08); flex-shrink: 0;
20332
20505
  }
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);
20506
+ .ss-md-toolbar-sep {
20507
+ width: 1px; height: 16px; background: var(--b-subtle); margin: 0 4px;
20337
20508
  }
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;
20509
+ .ss-md-tool {
20510
+ width: 26px; height: 24px; display: flex; align-items: center; justify-content: center;
20511
+ background: none; border: 1px solid transparent; border-radius: var(--r-small);
20512
+ color: var(--t-muted); cursor: pointer; font-size: 13px; padding: 0;
20513
+ transition: all 0.12s ease; font-weight: 600;
20342
20514
  }
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;
20515
+ .ss-md-tool:hover { background: var(--s-hover); border-color: var(--b-subtle); color: var(--t-bright); }
20516
+ .ss-md-tool:active { background: var(--s-light); }
20517
+ .ss-md-tool svg { width: 14px; height: 14px; stroke: currentColor; fill: none; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }
20518
+ .ss-md-tool[data-active="true"] { background: var(--s-light); color: var(--t-bright); border-color: var(--b-light); }
20519
+
20520
+ /* ── Preview/Raw toggle in toolbar ── */
20521
+ .ss-view-toggle {
20522
+ display: flex; margin-left: auto; border: 1px solid var(--b-subtle); border-radius: var(--r-small); overflow: hidden;
20356
20523
  }
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);
20524
+ .ss-view-toggle-btn {
20525
+ padding: 2px 10px; font-size: 10px; font-weight: 500;
20526
+ background: none; border: none; color: var(--t-muted);
20527
+ cursor: pointer; transition: all 0.12s ease;
20528
+ text-transform: uppercase; letter-spacing: 0.3px;
20361
20529
  }
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;
20530
+ .ss-view-toggle-btn:hover { color: var(--t-secondary); }
20531
+ .ss-view-toggle-btn.active {
20532
+ background: var(--s-light); color: var(--t-bright);
20369
20533
  }
20370
20534
 
20371
20535
  /* ── Toast notifications ── */
@@ -20382,36 +20546,6 @@
20382
20546
  .ss-toast--error { border-color: hsla(0, 50%, 45%, 0.4); color: hsla(0, 70%, 70%, 1); }
20383
20547
  .ss-toast--info { border-color: hsla(var(--accent-hue, 174), 50%, 55%, 0.3); }
20384
20548
 
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
20549
 
20416
20550
  /* ══════════════════════════════════════════════
20417
20551
  AUTOMATION STUDIO PANEL
@@ -22192,7 +22326,7 @@
22192
22326
  .as-launch-profile[data-profile="codex"].active .as-launch-profile-name {
22193
22327
  color: hsla(160, 45%, 72%, 0.95);
22194
22328
  }
22195
- .as-launch-profile[data-profile="gemini"].active .as-launch-profile-name {
22329
+ .as-launch-profile[data-profile="antigravity"].active .as-launch-profile-name {
22196
22330
  color: hsla(210, 55%, 78%, 0.95);
22197
22331
  }
22198
22332
  .as-launch-profile-name {
@@ -22359,55 +22493,6 @@
22359
22493
  color: var(--t-secondary);
22360
22494
  }
22361
22495
 
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
22496
 
22412
22497
  /* ── Launch select — scalable dropdown for long model/MCP lists ── */
22413
22498
  .as-launch-select {
@@ -24415,83 +24500,6 @@
24415
24500
  transform: scale(1.15);
24416
24501
  }
24417
24502
 
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
24503
 
24496
24504
  /* Recall profile dropdown in floating terminal header */
24497
24505
  .term-float-recall-dd {
@@ -24880,6 +24888,16 @@
24880
24888
  transition: none !important;
24881
24889
  }
24882
24890
  }
24891
+ html.platform-win32 .term-minimized-pill,
24892
+ html.desktop-titlebar--win32 .term-minimized-pill {
24893
+ background: rgba(20, 20, 26, 0.94);
24894
+ backdrop-filter: none;
24895
+ -webkit-backdrop-filter: none;
24896
+ }
24897
+ html.platform-win32 .term-minimized-pill:hover,
24898
+ html.desktop-titlebar--win32 .term-minimized-pill:hover {
24899
+ background: rgba(30, 30, 38, 0.96);
24900
+ }
24883
24901
 
24884
24902
  /* Genie minimize/restore animation on floating tabs (class toggled by
24885
24903
  ui-terminal.js minimizeTab/restoreTab only while it runs) */
@@ -26223,7 +26241,7 @@
26223
26241
 
26224
26242
  .link-panel {
26225
26243
  position: fixed;
26226
- z-index: 50100;
26244
+ z-index: 49900; /* under the app frame (49990) */
26227
26245
  display: flex;
26228
26246
  flex-direction: column;
26229
26247
  border: 1px solid rgba(255,255,255,0.12);
@@ -26963,7 +26981,7 @@
26963
26981
  .as-launch-inline-header, .as-unsaved-dialog-header) > button,
26964
26982
  body :is(.ecm-close, .awiz-close, .sched-prompt-close),
26965
26983
  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; }
26984
+ body .term-float-tab-header :is(.term-float-recall-btn) { min-width: 44px; min-height: 44px; }
26967
26985
  }
26968
26986
 
26969
26987
  /* ═══════════════════════════════════════════
@@ -26971,7 +26989,7 @@
26971
26989
  Uses the shared Settings roles above; shell/glass preferences stay shared.
26972
26990
  ═══════════════════════════════════════════ */
26973
26991
  .command-runner-panel {
26974
- position: fixed; z-index: 50100;
26992
+ position: fixed; z-index: 49900; /* under the app frame (49990) */
26975
26993
  width: 720px; max-width: calc(100vw - 16px); min-width: min(320px, calc(100vw - 16px));
26976
26994
  height: 680px; max-height: calc(100dvh - var(--navbar-height, 48px) - 16px);
26977
26995
  min-height: min(360px, calc(100dvh - var(--navbar-height, 48px) - 16px));
@@ -28338,16 +28356,8 @@
28338
28356
  color: #000;
28339
28357
  border-color: var(--c-accent, #6aa9ff);
28340
28358
  }
28341
- .sm-pr-select {
28342
- flex: 1;
28343
- background: var(--s-subtle, rgba(255,255,255,0.04));
28344
- color: var(--t-primary, #fff);
28345
- border: 1px solid var(--b-subtle, rgba(255,255,255,0.1));
28346
- border-radius: var(--r-small, 6px);
28347
- padding: 6px 8px;
28348
- font-size: 11px;
28349
- }
28350
- .sm-pr-select:disabled { opacity: 0.5; }
28359
+ /* The model list is the app's styled dropdown (cc-dropdown.js): it takes the row's width. */
28360
+ .sm-pr-row > .cc-dropdown.sm-pr-dropdown { flex: 1; min-width: 0; }
28351
28361
 
28352
28362
  /* ── Section labels ── */
28353
28363
  .sm-section-label {
@@ -28706,9 +28716,9 @@
28706
28716
  border-bottom: 1px solid var(--b-subtle);
28707
28717
  flex-shrink: 0;
28708
28718
  user-select: none;
28709
- cursor: grab;
28719
+ cursor: move;
28710
28720
  }
28711
- .ig-header:active { cursor: grabbing; }
28721
+ .ig-header:active { cursor: move; }
28712
28722
  .ig-header-left {
28713
28723
  display: flex;
28714
28724
  align-items: center;
@@ -29058,6 +29068,25 @@
29058
29068
  outline: 2px solid var(--stg-focus, #93c5fd);
29059
29069
  outline-offset: 2px;
29060
29070
  }
29071
+ /* The notice after an automatic restart (ui-crash-notice.js): the same toast, until it is dismissed. It moves to
29072
+ the top right while another update toast (the desktop app's update notice, a check's answer) holds the bottom right. */
29073
+ .crash-notice { max-height: calc(100vh - 120px); overflow-y: auto; }
29074
+ .crash-notice .utc-sub { overflow-wrap: anywhere; margin-top: 2px; }
29075
+ .crash-notice-lost-title {
29076
+ margin-top: 8px;
29077
+ font-weight: 600;
29078
+ color: var(--t-primary);
29079
+ }
29080
+ .crash-notice .crash-notice-lost { margin-top: 2px; }
29081
+ .crash-notice .crash-notice-lost li { overflow-wrap: anywhere; }
29082
+ .crash-notice-note { margin-top: 6px; }
29083
+ .crash-notice-note[hidden] { display: none; }
29084
+ .crash-notice .action-btn:focus-visible {
29085
+ outline: 2px solid var(--stg-focus, #93c5fd);
29086
+ outline-offset: 2px;
29087
+ }
29088
+ body:has(.update-check-toast:not(.crash-notice)) .crash-notice { bottom: auto; top: 64px; }
29089
+ @media (prefers-reduced-motion: reduce) { .crash-notice { transition: none; } }
29061
29090
 
29062
29091
  .update-channel-pill {
29063
29092
  display: inline-block;
@@ -29458,3 +29487,40 @@ body .styleguide-panel {
29458
29487
  @media (prefers-reduced-motion: reduce) {
29459
29488
  .wa-primary, .wa-btn, .wa-mode-card, .wa-level-card { transition: none; }
29460
29489
  }
29490
+
29491
+ /* Skills Studio: Health and Discover reuse the existing shell tokens. */
29492
+ .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; }
29493
+ .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; }
29494
+ .sx .sx-ops-card[hidden] { display: none; }
29495
+ .sx .sx-ops-card code { font-family: var(--ff-mono, 'JetBrains Mono', monospace); font-size: var(--sx-meta); }
29496
+
29497
+ /* Tool-list multiple mode: the Settings control/check tokens, within the existing dropdown. */
29498
+ .cc-dropdown[data-multiple="true"] .cc-dropdown-trigger {
29499
+ height: 22px; max-width: 100%; font-family: inherit; font-size: var(--fs-xs);
29500
+ border-radius: var(--radius-control, 5px);
29501
+ }
29502
+ .cc-dropdown[data-multiple="true"] .cc-dropdown-trigger:focus-visible { outline: 2px solid var(--stg-focus, var(--accent-blue)); outline-offset: 2px; }
29503
+ .cc-dropdown[data-multiple="true"] .cc-dropdown-item { display: flex; align-items: center; gap: 8px; white-space: normal; }
29504
+ .cc-dropdown[data-multiple="true"] .cc-dropdown-item.highlight { outline: 1px solid var(--stg-focus, var(--accent-blue)); outline-offset: -1px; }
29505
+ .cc-dropdown[data-multiple="true"] .cc-dropdown-item[aria-disabled="true"] { cursor: default; }
29506
+ .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); }
29507
+ .cc-dropdown-item.active > .cc-dropdown-check { background: var(--stg-accent-fill, var(--accent-blue)); border-color: var(--stg-accent-fill, var(--accent-blue)); }
29508
+ .cc-dropdown-item.active > .cc-dropdown-check::after { content: '✓'; display: block; text-align: center; line-height: 12px; color: var(--t-bright); }
29509
+ .cc-dropdown-caption { display: block; font-size: inherit; font-weight: 400; color: var(--t-muted); }
29510
+ .cc-dropdown-group { padding: 4px 8px; color: var(--t-muted); font-size: var(--fs-xs); }
29511
+ .tool-list-picker { max-width: 100%; min-width: 0; }
29512
+
29513
+ .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)); }
29514
+ .asst-tools-picker { min-width: 0; max-width: 180px; flex: 0 1 180px; }
29515
+ .asst-tools-picker .cc-dropdown { width: 100%; }
29516
+ .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); }
29517
+ /* The same invisible hit margin as the Assistant's other compact toolbar controls. */
29518
+ .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; }
29519
+ .asst-tools-picker .cc-dropdown-menu { background: var(--asst-popover); border-color: var(--asst-popover-ring); box-shadow: var(--asst-popover-shadow); }
29520
+ .asst-tools-picker .cc-dropdown-caption { color: var(--asst-text-3); }
29521
+ .ocpv2-tools-picker { min-width: 0; max-width: 160px; }
29522
+ .ocpv2-tools-picker .ocpv2-dropdown { padding: 0; max-width: 160px; }
29523
+ .ocpv2-tools-picker .cc-dropdown-trigger { min-width: 0; max-width: 160px; border: none; background: transparent; color: var(--t-primary); font-family: inherit; }
29524
+
29525
+ .ocpv2-tools-picker .tool-list-picker .cc-dropdown-menu { background: rgba(22,22,26,0.98); }
29526
+