@jxsuite/studio 2.0.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (419) hide show
  1. package/canvas.html +21 -0
  2. package/dist/chunks/Overlay.dev-qfjzkms8.js +23 -0
  3. package/dist/chunks/{Overlay.dev-cszx7yn5.js.map → Overlay.dev-qfjzkms8.js.map} +1 -1
  4. package/dist/chunks/{adapter-z8fkmbmv.js → adapter-qfnesn5v.js} +2 -2
  5. package/dist/chunks/{cf-settings-mmyv436d.js → cf-settings-73sh5z4p.js} +3 -3
  6. package/dist/chunks/{components-0hzentwq.js → components-2bpqp4mq.js} +5 -7
  7. package/dist/chunks/{components-0hzentwq.js.map → components-2bpqp4mq.js.map} +1 -1
  8. package/dist/chunks/content-source-34gnkbnn.js +38 -0
  9. package/dist/chunks/content-source-34gnkbnn.js.map +9 -0
  10. package/dist/chunks/convert-to-repeater-t8kxre5s.js +258 -0
  11. package/dist/chunks/convert-to-repeater-t8kxre5s.js.map +10 -0
  12. package/dist/chunks/extension-sections-6mqydz35.js +301 -0
  13. package/dist/chunks/extension-sections-6mqydz35.js.map +11 -0
  14. package/dist/chunks/files-8kn321h1.js +70 -0
  15. package/dist/chunks/files-8kn321h1.js.map +9 -0
  16. package/dist/chunks/{format-host-2c188n41.js → format-host-mkwsmt8d.js} +3 -3
  17. package/dist/chunks/git-panel-tjbr191d.js +51 -0
  18. package/dist/chunks/git-panel-tjbr191d.js.map +9 -0
  19. package/dist/chunks/{index-baeg2x3y.js → index-7pxchcce.js} +4 -3
  20. package/dist/chunks/{index-baeg2x3y.js.map → index-7pxchcce.js.map} +3 -3
  21. package/dist/chunks/{jx-validate-qx8degj7.js → jx-validate-v6qgknrs.js} +3 -3
  22. package/dist/chunks/layers-panel-87pb25km.js +58 -0
  23. package/dist/chunks/layers-panel-87pb25km.js.map +9 -0
  24. package/dist/chunks/{monaco-setup-zjdp9zdw.js → monaco-setup-e0yh25j4.js} +4 -75
  25. package/dist/chunks/{monaco-setup-zjdp9zdw.js.map → monaco-setup-e0yh25j4.js.map} +3 -4
  26. package/dist/chunks/publish-panel-m0fcgdrt.js +21 -0
  27. package/dist/chunks/publish-panel-m0fcgdrt.js.map +9 -0
  28. package/dist/chunks/quick-search-rhs6cbsb.js +53 -0
  29. package/dist/chunks/quick-search-rhs6cbsb.js.map +9 -0
  30. package/dist/chunks/right-panel-zpdxd98t.js +37 -0
  31. package/dist/chunks/right-panel-zpdxd98t.js.map +9 -0
  32. package/dist/chunks/section-registry-zmckaxf4.js +30 -0
  33. package/dist/chunks/section-registry-zmckaxf4.js.map +9 -0
  34. package/dist/chunks/sp-overlay.dev-9ran0sfq.js +18 -0
  35. package/dist/chunks/sp-overlay.dev-9ran0sfq.js.map +9 -0
  36. package/dist/chunks/sp-popover.dev-rebmdncr.js +9 -0
  37. package/dist/chunks/sp-popover.dev-rebmdncr.js.map +9 -0
  38. package/dist/chunks/sp-progress-circle.dev-5vkppfkt.js +15 -0
  39. package/dist/chunks/sp-progress-circle.dev-5vkppfkt.js.map +9 -0
  40. package/dist/chunks/sp-tooltip.dev-ykqrg8h5.js +15 -0
  41. package/dist/chunks/sp-tooltip.dev-ykqrg8h5.js.map +9 -0
  42. package/dist/chunks/{sp-tray.dev-pb2fsd65.js → sp-tray.dev-ey59vfh7.js} +10 -8
  43. package/dist/chunks/{sp-tray.dev-pb2fsd65.js.map → sp-tray.dev-ey59vfh7.js.map} +2 -2
  44. package/dist/chunks/{studio-9qr6fq7p.js → studio-0rqqhrdy.js} +10 -378
  45. package/dist/chunks/{studio-9qr6fq7p.js.map → studio-0rqqhrdy.js.map} +4 -14
  46. package/dist/chunks/{studio-5x6tqqec.js → studio-2sj1jj3v.js} +10 -8
  47. package/dist/chunks/{studio-5x6tqqec.js.map → studio-2sj1jj3v.js.map} +2 -2
  48. package/dist/chunks/{studio-h3fw0wn8.js → studio-3fk1ac9z.js} +6 -4
  49. package/dist/chunks/{studio-h3fw0wn8.js.map → studio-3fk1ac9z.js.map} +2 -2
  50. package/dist/chunks/studio-41exgzhq.js +6690 -0
  51. package/dist/chunks/studio-41exgzhq.js.map +38 -0
  52. package/dist/chunks/{studio-7v2bpweq.js → studio-4mqb9a0j.js} +6 -4
  53. package/dist/chunks/{studio-7v2bpweq.js.map → studio-4mqb9a0j.js.map} +2 -2
  54. package/dist/chunks/studio-50k77cca.js +1787 -0
  55. package/dist/chunks/studio-50k77cca.js.map +18 -0
  56. package/dist/chunks/{studio-56v3zwk6.js → studio-6a0h7sne.js} +10 -8
  57. package/dist/chunks/{studio-56v3zwk6.js.map → studio-6a0h7sne.js.map} +2 -2
  58. package/dist/chunks/studio-6f0am8f2.js +53 -0
  59. package/dist/chunks/studio-6f0am8f2.js.map +10 -0
  60. package/dist/chunks/studio-6nmjc5qk.js +7002 -0
  61. package/dist/chunks/studio-6nmjc5qk.js.map +32 -0
  62. package/dist/chunks/studio-7afd21nw.js +67 -0
  63. package/dist/chunks/studio-7afd21nw.js.map +10 -0
  64. package/dist/chunks/{studio-xze4zrs1.js → studio-7bmdvzne.js} +2 -2
  65. package/dist/chunks/studio-7bmdvzne.js.map +10 -0
  66. package/dist/chunks/studio-8jpzqk5s.js +128 -0
  67. package/dist/chunks/studio-8jpzqk5s.js.map +10 -0
  68. package/dist/chunks/studio-94m77tgk.js +1482 -0
  69. package/dist/chunks/studio-94m77tgk.js.map +13 -0
  70. package/dist/chunks/studio-9je6w5sq.js +1000 -0
  71. package/dist/chunks/studio-9je6w5sq.js.map +16 -0
  72. package/dist/chunks/{studio-w7c6kvk7.js → studio-a7pzveq1.js} +2 -2
  73. package/dist/chunks/{studio-97qcgvdn.js → studio-adn0z1k3.js} +14 -8
  74. package/dist/chunks/{studio-97qcgvdn.js.map → studio-adn0z1k3.js.map} +3 -3
  75. package/dist/chunks/{studio-kr88ryr7.js → studio-bsxxx3x2.js} +17 -15
  76. package/dist/chunks/{studio-kr88ryr7.js.map → studio-bsxxx3x2.js.map} +7 -6
  77. package/dist/chunks/studio-bw5dz6km.js +608 -0
  78. package/dist/chunks/studio-bw5dz6km.js.map +21 -0
  79. package/dist/chunks/studio-c6s5getc.js +4232 -0
  80. package/dist/chunks/studio-c6s5getc.js.map +39 -0
  81. package/dist/chunks/studio-cjm7fdjf.js +451 -0
  82. package/dist/chunks/studio-cjm7fdjf.js.map +14 -0
  83. package/dist/chunks/{studio-cx91mnh8.js → studio-ckwz4d3x.js} +53 -53
  84. package/dist/chunks/{studio-cx91mnh8.js.map → studio-ckwz4d3x.js.map} +5 -5
  85. package/dist/chunks/studio-dg7zyt5x.js +28 -0
  86. package/dist/chunks/studio-dg7zyt5x.js.map +10 -0
  87. package/dist/chunks/studio-dzcyvvvz.js +166 -0
  88. package/dist/chunks/studio-dzcyvvvz.js.map +10 -0
  89. package/dist/chunks/{studio-7kqe41sa.js → studio-evkr5d3b.js} +15 -7
  90. package/dist/chunks/{studio-7kqe41sa.js.map → studio-evkr5d3b.js.map} +5 -4
  91. package/dist/chunks/studio-f12h6177.js +411 -0
  92. package/dist/chunks/studio-f12h6177.js.map +13 -0
  93. package/dist/chunks/studio-hbp1s8m9.js +1817 -0
  94. package/dist/chunks/studio-hbp1s8m9.js.map +14 -0
  95. package/dist/chunks/studio-k2sxjph5.js +15295 -0
  96. package/dist/chunks/studio-k2sxjph5.js.map +235 -0
  97. package/dist/chunks/studio-myje51t3.js +385 -0
  98. package/dist/chunks/studio-myje51t3.js.map +12 -0
  99. package/dist/chunks/studio-na6rwzhw.js +353 -0
  100. package/dist/chunks/studio-na6rwzhw.js.map +11 -0
  101. package/dist/chunks/{studio-4k0m4fmp.js → studio-p471gg5n.js} +126 -3
  102. package/dist/chunks/studio-p471gg5n.js.map +14 -0
  103. package/dist/chunks/{studio-9bjwf0d4.js → studio-rgwcpast.js} +5 -46
  104. package/dist/chunks/{studio-9bjwf0d4.js.map → studio-rgwcpast.js.map} +4 -5
  105. package/dist/chunks/{studio-hhj92gcr.js → studio-s519zc99.js} +3 -3
  106. package/dist/chunks/studio-sas7mt3k.js +75 -0
  107. package/dist/chunks/studio-sas7mt3k.js.map +10 -0
  108. package/dist/chunks/studio-t5wqwzdh.js +74 -0
  109. package/dist/chunks/studio-t5wqwzdh.js.map +10 -0
  110. package/dist/chunks/{studio-9qpspwfn.js → studio-temv5bw4.js} +5 -5
  111. package/dist/chunks/{studio-9qpspwfn.js.map → studio-temv5bw4.js.map} +1 -1
  112. package/dist/chunks/{studio-qkvt37c0.js → studio-tr20m8g8.js} +669 -18
  113. package/dist/chunks/studio-tr20m8g8.js.map +9 -0
  114. package/dist/chunks/{studio-ygzav7z5.js → studio-v96qfnww.js} +5514 -4291
  115. package/dist/chunks/studio-v96qfnww.js.map +54 -0
  116. package/dist/chunks/studio-vcetc91k.js +659 -0
  117. package/dist/chunks/studio-vcetc91k.js.map +10 -0
  118. package/dist/chunks/{studio-n9zmpxjg.js → studio-vmymjefp.js} +2972 -4937
  119. package/dist/chunks/studio-vmymjefp.js.map +98 -0
  120. package/dist/chunks/{studio-bghqfmea.js → studio-wwseqyw0.js} +2 -2
  121. package/dist/chunks/studio-x9hmy5kr.js +390 -0
  122. package/dist/chunks/studio-x9hmy5kr.js.map +10 -0
  123. package/dist/chunks/studio-xa0ce0n7.js +335 -0
  124. package/dist/chunks/studio-xa0ce0n7.js.map +10 -0
  125. package/dist/chunks/studio-xm3dbxvn.js +378 -0
  126. package/dist/chunks/studio-xm3dbxvn.js.map +19 -0
  127. package/dist/chunks/{studio-nqw433kv.js → studio-xmvbhg31.js} +2 -2
  128. package/dist/chunks/studio-zv37yrfa.js +1054 -0
  129. package/dist/chunks/studio-zv37yrfa.js.map +13 -0
  130. package/dist/chunks/{ws-client-q7hkz3j9.js → ws-client-654ts66j.js} +6 -4
  131. package/dist/chunks/ws-client-654ts66j.js.map +11 -0
  132. package/dist/iframe-entry.js +668 -230
  133. package/dist/studio.js +23711 -35185
  134. package/index.html +35 -4685
  135. package/package.json +17 -15
  136. package/src/about/about-modal.ts +42 -11
  137. package/src/browse/library-commands.ts +240 -0
  138. package/src/browse/library-layouts.ts +369 -0
  139. package/src/browse/library-model.ts +396 -0
  140. package/src/browse/library-pane.ts +1049 -0
  141. package/src/browse/library-preview.ts +252 -0
  142. package/src/browse/library-source.ts +150 -0
  143. package/src/canvas/canvas-helpers.ts +33 -9
  144. package/src/canvas/canvas-live-render.ts +45 -29
  145. package/src/canvas/canvas-patcher.ts +151 -31
  146. package/src/canvas/canvas-perf.ts +46 -7
  147. package/src/canvas/canvas-render.ts +1092 -220
  148. package/src/canvas/canvas-surface.ts +240 -0
  149. package/src/canvas/canvas-utils.ts +1166 -124
  150. package/src/canvas/iframe-drop.ts +2 -1
  151. package/src/canvas/iframe-entry.ts +241 -4
  152. package/src/canvas/iframe-host.ts +1226 -143
  153. package/src/canvas/iframe-inline-edit.ts +31 -0
  154. package/src/canvas/iframe-interaction.ts +76 -16
  155. package/src/canvas/iframe-keys.ts +107 -45
  156. package/src/canvas/iframe-overlay.ts +38 -1
  157. package/src/canvas/iframe-protocol.ts +137 -2
  158. package/src/canvas/iframe-render.ts +70 -2
  159. package/src/canvas/iframe-slash.ts +6 -0
  160. package/src/canvas/path-mapping.ts +56 -6
  161. package/src/canvas/surface-registry.ts +292 -0
  162. package/src/collab/collab-commands.ts +244 -0
  163. package/src/collab/collab-session.ts +198 -32
  164. package/src/collab/collab-state.ts +28 -2
  165. package/src/collab/presence-chips.ts +100 -9
  166. package/src/commands/active-registry.ts +42 -0
  167. package/src/commands/app-commands.ts +176 -0
  168. package/src/commands/budget.ts +158 -0
  169. package/src/commands/command-args.ts +253 -0
  170. package/src/commands/context.ts +387 -0
  171. package/src/commands/defaults.ts +580 -0
  172. package/src/commands/keymap.ts +571 -0
  173. package/src/commands/levels.ts +345 -0
  174. package/src/commands/live-context.ts +193 -0
  175. package/src/commands/reference.ts +227 -0
  176. package/src/commands/registry.ts +293 -0
  177. package/src/component-props.ts +3 -2
  178. package/src/content/draft-state.ts +106 -0
  179. package/src/content/entry-commands.ts +282 -0
  180. package/src/content/entry-editor.ts +327 -0
  181. package/src/content/entry-fields.ts +116 -0
  182. package/src/content/entry-model.ts +175 -0
  183. package/src/editor/canvas-context-menu.ts +17 -11
  184. package/src/editor/canvas-slash-bridge.ts +11 -4
  185. package/src/editor/context-menu.ts +804 -204
  186. package/src/editor/convert-to-component.ts +31 -10
  187. package/src/editor/convert-to-repeater.ts +3 -2
  188. package/src/editor/inline-edit-apply.ts +5 -5
  189. package/src/editor/inline-edit.ts +86 -50
  190. package/src/editor/insert-zone-action.ts +1 -1
  191. package/src/editor/shortcuts.ts +1043 -329
  192. package/src/editor/slash-menu.ts +1 -0
  193. package/src/files/elements.ts +166 -0
  194. package/src/files/file-ops.ts +178 -31
  195. package/src/files/files.ts +898 -268
  196. package/src/files/fs-events.ts +21 -0
  197. package/src/files/media-meta.ts +203 -0
  198. package/src/files/media-paths.ts +141 -0
  199. package/src/files/media-upload.ts +7 -3
  200. package/src/files/media-usage.ts +189 -0
  201. package/src/github/github-auth.ts +235 -33
  202. package/src/github/github-publish.ts +80 -21
  203. package/src/grid/grid-controller.ts +152 -12
  204. package/src/grid/grid-layout.ts +225 -20
  205. package/src/grid/grid-open.ts +120 -0
  206. package/src/grid/grid-panel.ts +554 -39
  207. package/src/grid/grid-source.ts +27 -1
  208. package/src/grid/redirects-grid.ts +599 -0
  209. package/src/grid/redirects.ts +398 -0
  210. package/src/grid/sources/content-source.ts +108 -2
  211. package/src/i18n/i18n-commands.ts +322 -0
  212. package/src/new-project/add-repo-modal.ts +8 -10
  213. package/src/new-project/import-tab.ts +34 -9
  214. package/src/new-project/location-fields.ts +9 -1
  215. package/src/new-project/new-project-modal.ts +270 -262
  216. package/src/packages/jxsuite-update.ts +97 -48
  217. package/src/packages/pull-package-sync.ts +18 -9
  218. package/src/page-params.ts +2 -1
  219. package/src/panels/activity-bar.ts +152 -91
  220. package/src/panels/activity-panel.ts +481 -0
  221. package/src/panels/ai-chat/chat-markdown.ts +8 -3
  222. package/src/panels/ai-chat/chat-view.ts +245 -18
  223. package/src/panels/ai-chat/composer.ts +31 -5
  224. package/src/panels/ai-chat/sessions-view.ts +17 -10
  225. package/src/panels/ai-panel.ts +279 -120
  226. package/src/panels/block-action-bar.ts +1115 -224
  227. package/src/panels/bottom-dock.ts +337 -0
  228. package/src/panels/canvas-dnd-bridge.ts +37 -8
  229. package/src/panels/chat-panel.ts +29 -12
  230. package/src/panels/data-explorer.ts +254 -112
  231. package/src/panels/data-grid.ts +10 -4
  232. package/src/panels/dnd.ts +28 -51
  233. package/src/panels/editors.ts +434 -107
  234. package/src/panels/elements-panel.ts +66 -2
  235. package/src/panels/empty-state.ts +112 -0
  236. package/src/panels/events-panel.ts +596 -82
  237. package/src/panels/formula-workspace.ts +408 -218
  238. package/src/panels/frontmatter-fields.ts +51 -10
  239. package/src/panels/frontmatter-panel.ts +357 -79
  240. package/src/panels/git-panel.ts +375 -164
  241. package/src/panels/head-panel.ts +791 -85
  242. package/src/panels/i18n-panel.ts +592 -0
  243. package/src/panels/imports-panel.ts +95 -85
  244. package/src/panels/jump-bar.ts +584 -0
  245. package/src/panels/layers-panel.ts +1106 -328
  246. package/src/panels/left-panel.ts +109 -204
  247. package/src/panels/navigator-panels.ts +131 -0
  248. package/src/panels/overlays.ts +7 -2
  249. package/src/panels/pane-context.ts +1477 -0
  250. package/src/panels/pane-grid.ts +406 -0
  251. package/src/panels/panel-registry.ts +340 -0
  252. package/src/panels/panel-scheduler.ts +75 -0
  253. package/src/panels/problems-panel.ts +234 -0
  254. package/src/panels/properties-panel.ts +946 -1139
  255. package/src/panels/provenance.ts +258 -0
  256. package/src/panels/quick-search.ts +791 -122
  257. package/src/panels/right-panel.ts +228 -102
  258. package/src/panels/seo-modal.ts +395 -0
  259. package/src/panels/settings-pane.ts +203 -0
  260. package/src/panels/signals-panel.ts +354 -137
  261. package/src/panels/statement-editor.ts +41 -25
  262. package/src/panels/statusbar.ts +342 -106
  263. package/src/panels/style-panel.ts +974 -463
  264. package/src/panels/style-utils.ts +3 -3
  265. package/src/panels/stylebook-doc.ts +4 -2
  266. package/src/panels/stylebook-layers-panel.ts +3 -2
  267. package/src/panels/stylebook-panel.ts +51 -26
  268. package/src/panels/tab-strip.ts +1058 -78
  269. package/src/panels/target-line.ts +274 -0
  270. package/src/panels/toolbar.ts +631 -484
  271. package/src/panels/welcome-screen.ts +301 -198
  272. package/src/platform-errors.ts +26 -3
  273. package/src/platform.ts +96 -2
  274. package/src/platforms/cloud.ts +71 -8
  275. package/src/platforms/devserver.ts +92 -29
  276. package/src/publish/deploy-checklist.ts +383 -0
  277. package/src/publish/pages-service.ts +10 -1
  278. package/src/publish/publish-commands.ts +218 -0
  279. package/src/publish/publish-panel.ts +110 -16
  280. package/src/recent-projects.ts +3 -2
  281. package/src/services/a11y-report.ts +505 -0
  282. package/src/services/ai-models.ts +75 -2
  283. package/src/services/ai-project-tools.ts +29 -10
  284. package/src/services/ai-system-prompt.ts +53 -14
  285. package/src/services/ai-tools.ts +39 -3
  286. package/src/services/ai-writes.ts +154 -0
  287. package/src/services/announce.ts +97 -0
  288. package/src/services/automation.ts +424 -175
  289. package/src/services/cem-export.ts +9 -4
  290. package/src/services/clock.ts +61 -0
  291. package/src/services/document-assistant.ts +36 -8
  292. package/src/services/idle.ts +179 -0
  293. package/src/services/import-client.ts +26 -0
  294. package/src/services/monaco-buffer.ts +627 -0
  295. package/src/services/monaco-lazy.ts +36 -0
  296. package/src/services/notify.ts +271 -0
  297. package/src/services/profile.ts +155 -0
  298. package/src/services/references.ts +0 -0
  299. package/src/services/token-lint.ts +3 -2
  300. package/src/services/tool-executor.ts +53 -7
  301. package/src/services/trusted-types.ts +123 -0
  302. package/src/settings/contexts-section.ts +427 -0
  303. package/src/settings/contributed-section.ts +149 -11
  304. package/src/settings/css-vars-editor.ts +306 -349
  305. package/src/settings/defs-editor.ts +93 -34
  306. package/src/settings/dependencies-editor.ts +7 -7
  307. package/src/settings/extension-sections.ts +37 -5
  308. package/src/settings/general-settings.ts +204 -121
  309. package/src/settings/locales-section.ts +347 -0
  310. package/src/settings/preferences-accounts.ts +140 -0
  311. package/src/settings/preferences-dialog.ts +620 -0
  312. package/src/settings/preferences-keymap.ts +270 -0
  313. package/src/settings/project-sections.ts +260 -0
  314. package/src/settings/section-registry.ts +169 -0
  315. package/src/settings/settings-document.ts +385 -0
  316. package/src/shell.ts +1549 -0
  317. package/src/site-context.ts +45 -20
  318. package/src/state.ts +14 -275
  319. package/src/store.ts +88 -43
  320. package/src/studio.ts +790 -346
  321. package/src/style/live-preview.ts +36 -0
  322. package/src/style/project-styles.ts +349 -0
  323. package/src/style/token-ref.ts +123 -0
  324. package/src/tabs/patch-ops.ts +16 -4
  325. package/src/tabs/project-config.ts +416 -0
  326. package/src/tabs/selection.ts +323 -0
  327. package/src/tabs/tab.ts +182 -47
  328. package/src/tabs/transact.ts +209 -28
  329. package/src/types.ts +68 -13
  330. package/src/ui/ai-credentials-form.ts +39 -35
  331. package/src/ui/ai-managed-connect.ts +113 -0
  332. package/src/ui/dynamic-slot.ts +224 -81
  333. package/src/ui/expression-editor.ts +71 -63
  334. package/src/ui/field-input.ts +4 -6
  335. package/src/ui/field-row.ts +215 -38
  336. package/src/ui/form-controls.ts +194 -7
  337. package/src/ui/layers.ts +492 -69
  338. package/src/ui/media-picker.ts +115 -25
  339. package/src/ui/panel-resize.ts +109 -91
  340. package/src/ui/progress-modal.ts +131 -50
  341. package/src/ui/regions.ts +462 -0
  342. package/src/ui/schema-form.ts +229 -45
  343. package/src/ui/spectrum.ts +24 -8
  344. package/src/ui/timing.ts +49 -0
  345. package/src/ui/value-selector.ts +20 -0
  346. package/src/ui/value-source.ts +348 -0
  347. package/src/ui/virtual-window.ts +400 -0
  348. package/src/utils/edit-display.ts +3 -2
  349. package/src/utils/inherited-style.ts +67 -37
  350. package/src/view.ts +64 -78
  351. package/src/workspace/pane-derive.ts +1258 -0
  352. package/src/workspace/session.ts +317 -0
  353. package/src/workspace/workspace.ts +1345 -23
  354. package/styles/canvas.css +653 -0
  355. package/styles/forced-colors.css +106 -0
  356. package/styles/inspector.css +1454 -0
  357. package/styles/overlays.css +2704 -0
  358. package/styles/panels.css +1701 -0
  359. package/styles/shell.css +1423 -0
  360. package/styles/tokens.css +151 -0
  361. package/dist/chunks/Overlay.dev-cszx7yn5.js +0 -22
  362. package/dist/chunks/extension-sections-qct0gt8f.js +0 -531
  363. package/dist/chunks/extension-sections-qct0gt8f.js.map +0 -12
  364. package/dist/chunks/files-02zn5y24.js +0 -50
  365. package/dist/chunks/files-02zn5y24.js.map +0 -9
  366. package/dist/chunks/git-panel-mbb0y0hz.js +0 -28
  367. package/dist/chunks/git-panel-mbb0y0hz.js.map +0 -9
  368. package/dist/chunks/layers-panel-9qekmqk1.js +0 -26
  369. package/dist/chunks/layers-panel-9qekmqk1.js.map +0 -9
  370. package/dist/chunks/settings-modal-gj0hrah4.js +0 -29
  371. package/dist/chunks/settings-modal-gj0hrah4.js.map +0 -9
  372. package/dist/chunks/sp-overlay.dev-earn5as8.js +0 -17
  373. package/dist/chunks/sp-overlay.dev-earn5as8.js.map +0 -9
  374. package/dist/chunks/sp-popover.dev-frxtfejn.js +0 -8
  375. package/dist/chunks/sp-popover.dev-frxtfejn.js.map +0 -9
  376. package/dist/chunks/sp-progress-circle.dev-7tvw34h8.js +0 -14
  377. package/dist/chunks/sp-progress-circle.dev-7tvw34h8.js.map +0 -9
  378. package/dist/chunks/sp-tooltip.dev-a9fywesm.js +0 -21
  379. package/dist/chunks/sp-tooltip.dev-a9fywesm.js.map +0 -10
  380. package/dist/chunks/studio-4k0m4fmp.js.map +0 -13
  381. package/dist/chunks/studio-568nx4t5.js +0 -469
  382. package/dist/chunks/studio-568nx4t5.js.map +0 -14
  383. package/dist/chunks/studio-9smfzqhc.js +0 -19
  384. package/dist/chunks/studio-9smfzqhc.js.map +0 -10
  385. package/dist/chunks/studio-asvf0j9e.js +0 -429
  386. package/dist/chunks/studio-asvf0j9e.js.map +0 -13
  387. package/dist/chunks/studio-d77qm3pk.js +0 -3427
  388. package/dist/chunks/studio-d77qm3pk.js.map +0 -26
  389. package/dist/chunks/studio-j6gqyjf4.js +0 -1854
  390. package/dist/chunks/studio-j6gqyjf4.js.map +0 -18
  391. package/dist/chunks/studio-n9zmpxjg.js.map +0 -115
  392. package/dist/chunks/studio-qkvt37c0.js.map +0 -9
  393. package/dist/chunks/studio-rq0vxb19.js +0 -3744
  394. package/dist/chunks/studio-rq0vxb19.js.map +0 -22
  395. package/dist/chunks/studio-wd6ewdvd.js +0 -853
  396. package/dist/chunks/studio-wd6ewdvd.js.map +0 -12
  397. package/dist/chunks/studio-xq0t7n5t.js +0 -140
  398. package/dist/chunks/studio-xq0t7n5t.js.map +0 -10
  399. package/dist/chunks/studio-xze4zrs1.js.map +0 -10
  400. package/dist/chunks/studio-ygzav7z5.js.map +0 -46
  401. package/dist/chunks/studio-zmy7241e.js +0 -399
  402. package/dist/chunks/studio-zmy7241e.js.map +0 -12
  403. package/dist/chunks/ws-client-q7hkz3j9.js.map +0 -11
  404. package/src/browse/browse-modal.ts +0 -69
  405. package/src/browse/browse.ts +0 -904
  406. package/src/canvas/canvas-diff.ts +0 -216
  407. package/src/canvas/nested-site-style.ts +0 -58
  408. package/src/new-project/design-fields.ts +0 -264
  409. package/src/new-project/templates.ts +0 -61
  410. package/src/panels/tab-bar.ts +0 -548
  411. package/src/settings/settings-modal.ts +0 -203
  412. /package/dist/chunks/{adapter-z8fkmbmv.js.map → adapter-qfnesn5v.js.map} +0 -0
  413. /package/dist/chunks/{cf-settings-mmyv436d.js.map → cf-settings-73sh5z4p.js.map} +0 -0
  414. /package/dist/chunks/{format-host-2c188n41.js.map → format-host-mkwsmt8d.js.map} +0 -0
  415. /package/dist/chunks/{jx-validate-qx8degj7.js.map → jx-validate-v6qgknrs.js.map} +0 -0
  416. /package/dist/chunks/{studio-w7c6kvk7.js.map → studio-a7pzveq1.js.map} +0 -0
  417. /package/dist/chunks/{studio-hhj92gcr.js.map → studio-s519zc99.js.map} +0 -0
  418. /package/dist/chunks/{studio-bghqfmea.js.map → studio-wwseqyw0.js.map} +0 -0
  419. /package/dist/chunks/{studio-nqw433kv.js.map → studio-xmvbhg31.js.map} +0 -0
@@ -0,0 +1,2704 @@
1
+ /* Jx Studio — toolbar, overlays and full-surface screens.
2
+ Load last, after tokens.css, shell.css, canvas.css, panels.css and
3
+ inspector.css.
4
+
5
+ This is the residual tail of the original inline stylesheet, kept as one
6
+ file because its sections are interleaved in source order and the split
7
+ is move-only. It owns, in cascade order: the toolbar and its responsive
8
+ collapse; the browse modal and browse view; the settings modal, its
9
+ collection/definition editors and schema field cards; the media picker;
10
+ the source view; the empty state; the style toolbar; the git panel; the
11
+ stylebook (and its feature toggle); inline editing; the welcome screen;
12
+ and the Tabulator grid editor theme. */
13
+
14
+ /* ─── ① Command Bar ──────────────────────────────
15
+ Region ① of UX-REDESIGN-PLAN §3.2. The band is now three things —
16
+ the ⬢ menu, the Command Center pill and a verb cluster capped at
17
+ five by scripts/check-chrome-budget.ts — so the two-stage responsive
18
+ collapse the old toolbar needed is down to one stage. */
19
+ .tb-spacer {
20
+ flex: 1;
21
+ }
22
+
23
+ /* ─── ①a Command Center pill ─────────────────────
24
+ ◈ project › document › selection, right-aligned ⌘K. The whole pill is
25
+ clickable (it opens the mode picker); each segment stops propagation
26
+ and opens the palette pre-scoped to what that segment addresses. */
27
+ .tb-center {
28
+ display: flex;
29
+ align-items: center;
30
+ gap: 4px;
31
+ flex: 0 1 520px;
32
+ min-width: 0;
33
+ padding: 0 8px;
34
+ height: 24px;
35
+ cursor: pointer;
36
+ border: 1px solid var(--spectrum-gray-300, #393939);
37
+ border-radius: var(--radius);
38
+ background: var(--spectrum-gray-75, #141414);
39
+ font-size: var(--spectrum-font-size-75, 12px);
40
+ }
41
+ .tb-center:hover {
42
+ border-color: var(--spectrum-gray-400, #4a4a4a);
43
+ }
44
+ .tb-center-mark {
45
+ color: var(--accent);
46
+ flex-shrink: 0;
47
+ }
48
+ .tb-center-sep {
49
+ color: var(--spectrum-gray-600, #666);
50
+ flex-shrink: 0;
51
+ }
52
+ .tb-center-seg {
53
+ appearance: none;
54
+ border: none;
55
+ background: none;
56
+ padding: 2px 4px;
57
+ border-radius: var(--radius);
58
+ color: var(--spectrum-gray-800, #ccc);
59
+ font: inherit;
60
+ cursor: pointer;
61
+ max-width: 220px;
62
+ overflow: hidden;
63
+ text-overflow: ellipsis;
64
+ white-space: nowrap;
65
+ }
66
+ .tb-center-seg:hover {
67
+ background: var(--spectrum-gray-200, #2a2a2a);
68
+ color: var(--spectrum-gray-900, #e0e0e0);
69
+ }
70
+ .tb-center-seg:focus-visible {
71
+ outline: 2px solid var(--accent);
72
+ outline-offset: -2px;
73
+ }
74
+ .tb-center-chord {
75
+ margin-left: auto;
76
+ padding-left: 8px;
77
+ font-family: inherit;
78
+ font-size: var(--spectrum-font-size-50, 11px);
79
+ color: var(--spectrum-gray-600, #666);
80
+ flex-shrink: 0;
81
+ }
82
+ /* ─── Responsive Command Bar collapse ──────────────
83
+ Below this width every verb drops its text label and reads as an icon
84
+ (the `title` attribute, built by `commandTooltip`, carries the full
85
+ name and the chord). The pill keeps its labels: it is the answer to
86
+ "where am I", which is the one thing §4.4 requires never to collapse. */
87
+ @container toolbar (max-width: 1140px) {
88
+ #toolbar .tb-label {
89
+ display: none;
90
+ }
91
+ /* Collapse the icon-to-(now hidden)-label gap so buttons read as icons. */
92
+ #toolbar sp-action-button {
93
+ gap: 0;
94
+ }
95
+ }
96
+ .quick-search-overlay {
97
+ position: fixed;
98
+ inset: 0;
99
+ z-index: 1000;
100
+ display: flex;
101
+ justify-content: center;
102
+ padding-top: 60px;
103
+ background: rgba(0, 0, 0, 0.4);
104
+ }
105
+ .quick-search-panel {
106
+ width: 560px;
107
+ max-height: 420px;
108
+ display: flex;
109
+ flex-direction: column;
110
+ background: var(--spectrum-gray-100, #1e1e1e);
111
+ border: 1px solid var(--spectrum-gray-300, #393939);
112
+ border-radius: var(--spectrum-corner-radius-200, 8px);
113
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.5);
114
+ overflow: hidden;
115
+ align-self: flex-start;
116
+ }
117
+ /* The mode chip sits INSIDE the input row, left of the caret, so Backspace
118
+ at position zero deletes it — see `chipTemplate` / `onKeydown`. */
119
+ .palette-input-row {
120
+ display: flex;
121
+ align-items: center;
122
+ gap: 8px;
123
+ padding-left: 12px;
124
+ background: var(--spectrum-gray-75, #141414);
125
+ border-bottom: 1px solid var(--spectrum-gray-300, #393939);
126
+ }
127
+ .palette-chip {
128
+ display: inline-flex;
129
+ align-items: center;
130
+ gap: 4px;
131
+ flex-shrink: 0;
132
+ padding: 2px 4px 2px 8px;
133
+ border-radius: var(--radius);
134
+ background: var(--spectrum-blue-700, #0054a3);
135
+ color: var(--spectrum-white, #fff);
136
+ font-size: var(--spectrum-font-size-75, 12px);
137
+ }
138
+ .palette-chip-remove {
139
+ appearance: none;
140
+ border: none;
141
+ background: none;
142
+ color: inherit;
143
+ cursor: pointer;
144
+ font: inherit;
145
+ line-height: 1;
146
+ padding: 0 2px;
147
+ opacity: 0.7;
148
+ }
149
+ .palette-chip-remove:hover {
150
+ opacity: 1;
151
+ }
152
+ .palette-chord {
153
+ margin-left: auto;
154
+ flex-shrink: 0;
155
+ font-family: inherit;
156
+ font-size: var(--spectrum-font-size-50, 11px);
157
+ color: var(--spectrum-gray-600, #666);
158
+ border: 1px solid var(--spectrum-gray-300, #393939);
159
+ border-radius: var(--radius);
160
+ padding: 0 5px;
161
+ }
162
+ /* Every row prints its binding, and the footer prints the palette's own
163
+ namespace — that is how the surface teaches the keyboard it replaced. */
164
+ .palette-hint {
165
+ padding: 6px 16px;
166
+ border-top: 1px solid var(--spectrum-gray-300, #393939);
167
+ color: var(--spectrum-gray-600, #666);
168
+ font-size: var(--spectrum-font-size-50, 11px);
169
+ }
170
+ .palette-hint kbd {
171
+ font-family: inherit;
172
+ color: var(--spectrum-gray-700, #999);
173
+ }
174
+ .quick-search-input {
175
+ flex: 1;
176
+ min-width: 0;
177
+ padding: 12px 16px 12px 4px;
178
+ font-size: var(--spectrum-font-size-100, 14px);
179
+ border: none;
180
+ /* Pointer focus only — the keyboard ring is restored below. */
181
+ outline: none;
182
+ background: none;
183
+ color: var(--spectrum-gray-900, #e0e0e0);
184
+ }
185
+
186
+ .quick-search-input:focus-visible {
187
+ outline: 2px solid var(--accent);
188
+ outline-offset: -2px;
189
+ }
190
+ .quick-search-results {
191
+ overflow-y: auto;
192
+ flex: 1;
193
+ }
194
+ .quick-search-item {
195
+ display: flex;
196
+ align-items: center;
197
+ gap: 8px;
198
+ padding: 6px 16px;
199
+ cursor: pointer;
200
+ font-size: 13px;
201
+ color: var(--spectrum-gray-800, #ccc);
202
+ }
203
+ .quick-search-item.selected {
204
+ background: var(--spectrum-blue-700, #0054a3);
205
+ color: var(--spectrum-white, #fff);
206
+ }
207
+ .quick-search-item:hover:not(.selected) {
208
+ background: var(--spectrum-gray-200, #2a2a2a);
209
+ }
210
+ /* An unavailable command is GREYED, never hidden (§2 principle 4): the row
211
+ stays, its `requires` sentence becomes the subtitle, and Enter is inert. */
212
+ .quick-search-item.disabled .quick-search-name,
213
+ .quick-search-item.disabled .quick-search-icon {
214
+ opacity: 0.45;
215
+ }
216
+ .quick-search-item.disabled {
217
+ cursor: default;
218
+ }
219
+ .quick-search-icon {
220
+ flex-shrink: 0;
221
+ opacity: 0.7;
222
+ }
223
+ .quick-search-name {
224
+ font-weight: 500;
225
+ white-space: nowrap;
226
+ }
227
+ .quick-search-path {
228
+ opacity: 0.5;
229
+ font-size: var(--spectrum-font-size-75, 12px);
230
+ white-space: nowrap;
231
+ overflow: hidden;
232
+ text-overflow: ellipsis;
233
+ }
234
+ .quick-search-badge {
235
+ margin-left: auto;
236
+ font-size: var(--spectrum-font-size-50, 11px);
237
+ padding: 1px 6px;
238
+ border-radius: var(--radius);
239
+ background: var(--spectrum-gray-300, #393939);
240
+ color: var(--spectrum-gray-700, #999);
241
+ }
242
+ .quick-search-empty {
243
+ padding: 16px;
244
+ text-align: center;
245
+ color: var(--spectrum-gray-600, #666);
246
+ font-size: 13px;
247
+ }
248
+ .quick-search-section-label {
249
+ padding: 8px 16px 4px;
250
+ font-size: var(--spectrum-font-size-50, 11px);
251
+ text-transform: uppercase;
252
+ color: var(--spectrum-gray-600, #666);
253
+ letter-spacing: 0.5px;
254
+ }
255
+
256
+ /* ─── Library ────────────────────────────────────
257
+ The Library is a PANE surface, not an overlay — the Manage modal it replaces is gone. It keeps
258
+ its rules here beside the grid's for one reason: both are non-iframe editors drawn into a
259
+ pane's stage, and splitting them across two sheets is how the two drifted apart before. */
260
+ .library {
261
+ display: flex;
262
+ flex-direction: column;
263
+ width: 100%;
264
+ height: 100%;
265
+ overflow: hidden;
266
+ }
267
+ .library-toolbar {
268
+ display: flex;
269
+ align-items: center;
270
+ gap: 12px;
271
+ padding: 8px 16px;
272
+ background: var(--bg-panel);
273
+ border-bottom: 1px solid var(--border);
274
+ flex-shrink: 0;
275
+ flex-wrap: wrap;
276
+ }
277
+ .library-toolbar sp-search {
278
+ width: 220px;
279
+ }
280
+ /* Narrow on purpose: it holds one language name, and the toolbar wraps before it grows. */
281
+ .library-locale-filter {
282
+ width: 160px;
283
+ }
284
+ .library-upload-input {
285
+ display: none;
286
+ }
287
+ .library-spacer {
288
+ flex: 1;
289
+ }
290
+ .library-layout-switch {
291
+ margin-left: auto;
292
+ }
293
+ .library-banner {
294
+ display: flex;
295
+ align-items: center;
296
+ justify-content: space-between;
297
+ gap: 12px;
298
+ padding: 8px 16px;
299
+ background: var(--spectrum-orange-100, #3a2a10);
300
+ border-bottom: 1px solid var(--border);
301
+ color: var(--fg);
302
+ font-size: var(--spectrum-font-size-75, 12px);
303
+ }
304
+ .library-body {
305
+ flex: 1;
306
+ min-height: 0;
307
+ overflow-y: auto;
308
+ position: relative;
309
+ }
310
+ .library-body.library-drop-active {
311
+ outline: 2px dashed var(--spectrum-blue-600, #0070c1);
312
+ outline-offset: -4px;
313
+ }
314
+ .library-empty {
315
+ padding: 48px 24px;
316
+ text-align: center;
317
+ color: var(--fg-dim);
318
+ display: flex;
319
+ flex-direction: column;
320
+ align-items: center;
321
+ gap: 8px;
322
+ }
323
+ .library-empty-detail {
324
+ font-size: var(--spectrum-font-size-75, 12px);
325
+ color: var(--fg-dim);
326
+ }
327
+ .library-truncated {
328
+ margin: 8px 0 0;
329
+ font-size: var(--spectrum-font-size-50, 11px);
330
+ color: var(--fg-dim);
331
+ }
332
+
333
+ /* Cards and Media — the two windowed grids. The item sizes here are the ones
334
+ `library-layouts.ts`'s LAYOUT_METRICS counts rows in; change one and change both. */
335
+ .library-grid {
336
+ display: grid;
337
+ gap: 12px;
338
+ padding: 12px 16px;
339
+ align-items: start;
340
+ }
341
+ .library-grid-cards {
342
+ grid-template-columns: repeat(auto-fill, minmax(188px, 1fr));
343
+ }
344
+ .library-grid-media {
345
+ grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));
346
+ }
347
+ .library-card,
348
+ .library-tile {
349
+ cursor: pointer;
350
+ overflow: hidden;
351
+ border: 1px solid var(--border);
352
+ border-radius: var(--radius);
353
+ background: var(--bg-panel);
354
+ }
355
+ .library-card:hover,
356
+ .library-tile:hover {
357
+ border-color: var(--spectrum-blue-600, #0070c1);
358
+ }
359
+ .library-card-preview,
360
+ .library-tile-preview {
361
+ aspect-ratio: 4 / 3;
362
+ display: flex;
363
+ align-items: center;
364
+ justify-content: center;
365
+ overflow: hidden;
366
+ background: var(--spectrum-gray-100, #222);
367
+ pointer-events: none;
368
+ }
369
+ .library-preview-slot {
370
+ width: 100%;
371
+ height: 100%;
372
+ overflow: hidden;
373
+ }
374
+ .library-preview-slot > * {
375
+ transform: scale(0.4);
376
+ transform-origin: top left;
377
+ width: 250%;
378
+ height: 250%;
379
+ }
380
+ .library-thumb {
381
+ max-width: 100%;
382
+ max-height: 100%;
383
+ object-fit: contain;
384
+ }
385
+ .library-card-label,
386
+ .library-tile-label {
387
+ padding: 6px 8px 0;
388
+ font-size: var(--spectrum-font-size-75, 12px);
389
+ color: var(--fg);
390
+ white-space: nowrap;
391
+ overflow: hidden;
392
+ text-overflow: ellipsis;
393
+ }
394
+ .library-card-meta {
395
+ padding: 0 8px 6px;
396
+ font-size: var(--spectrum-font-size-50, 11px);
397
+ color: var(--fg-dim);
398
+ }
399
+
400
+ /* Table — a windowed list, not a `sp-table`: the rows have to be sliceable. */
401
+ .library-table {
402
+ display: flex;
403
+ flex-direction: column;
404
+ padding: 0 16px 16px;
405
+ }
406
+ .library-table-head,
407
+ .library-table-row {
408
+ display: flex;
409
+ align-items: center;
410
+ gap: 8px;
411
+ height: 32px;
412
+ border-bottom: 1px solid var(--border);
413
+ }
414
+ .library-table-head {
415
+ position: sticky;
416
+ top: 0;
417
+ z-index: 1;
418
+ background: var(--bg-panel);
419
+ font-weight: 600;
420
+ font-size: var(--spectrum-font-size-75, 12px);
421
+ }
422
+ .library-table-row {
423
+ cursor: pointer;
424
+ }
425
+ .library-table-row:hover {
426
+ background: var(--spectrum-gray-200, #333);
427
+ }
428
+ .library-table-cell {
429
+ flex: 1;
430
+ min-width: 0;
431
+ overflow: hidden;
432
+ text-overflow: ellipsis;
433
+ white-space: nowrap;
434
+ font-size: var(--spectrum-font-size-75, 12px);
435
+ }
436
+ .library-table-cell[data-field="name"] {
437
+ flex: 3;
438
+ font-weight: 500;
439
+ }
440
+ .library-table-cell[data-field="path"] {
441
+ flex: 3;
442
+ color: var(--fg-dim);
443
+ font-family: var(--font-mono);
444
+ font-size: var(--spectrum-font-size-50, 11px);
445
+ }
446
+ .library-table-cell[data-field="size"],
447
+ .library-table-cell[data-field="modified"] {
448
+ flex: 0 0 96px;
449
+ }
450
+ /* Fixed, like size and modified: a language name is short and never earns width from Name. Without
451
+ this it inherits `flex: 1` above and the Name column loses a quarter of itself in every
452
+ multilingual project. */
453
+ .library-table-cell[data-field="locale"] {
454
+ flex: 0 0 90px;
455
+ color: var(--fg-dim);
456
+ }
457
+
458
+ /* Calendar and Board — grouped, capped, and each states what it left out. */
459
+ .library-calendar {
460
+ padding: 12px 16px;
461
+ }
462
+ .library-day {
463
+ margin-bottom: 16px;
464
+ }
465
+ .library-day-date {
466
+ margin: 0 0 4px;
467
+ font-size: var(--spectrum-font-size-75, 12px);
468
+ font-weight: 600;
469
+ color: var(--fg);
470
+ }
471
+ .library-day-undated .library-day-date {
472
+ color: var(--fg-dim);
473
+ }
474
+ .library-day-note {
475
+ margin: 0 0 4px;
476
+ font-size: var(--spectrum-font-size-50, 11px);
477
+ color: var(--fg-dim);
478
+ }
479
+ .library-board {
480
+ display: flex;
481
+ gap: 12px;
482
+ padding: 12px 16px;
483
+ align-items: flex-start;
484
+ overflow-x: auto;
485
+ }
486
+ .library-board-column {
487
+ flex: 0 0 220px;
488
+ border: 1px solid var(--border);
489
+ border-radius: var(--radius);
490
+ padding: 8px;
491
+ background: var(--bg-panel);
492
+ }
493
+ .library-board-title {
494
+ margin: 0 0 6px;
495
+ font-size: var(--spectrum-font-size-75, 12px);
496
+ font-weight: 600;
497
+ display: flex;
498
+ justify-content: space-between;
499
+ }
500
+ .library-board-count {
501
+ color: var(--fg-dim);
502
+ font-weight: 400;
503
+ }
504
+ .library-list {
505
+ list-style: none;
506
+ margin: 0;
507
+ padding: 0;
508
+ }
509
+ .library-list-item {
510
+ padding: 3px 4px;
511
+ border-radius: var(--radius);
512
+ cursor: pointer;
513
+ font-size: var(--spectrum-font-size-75, 12px);
514
+ white-space: nowrap;
515
+ overflow: hidden;
516
+ text-overflow: ellipsis;
517
+ }
518
+ .library-list-item:hover {
519
+ background: var(--spectrum-gray-200, #333);
520
+ }
521
+
522
+ /* ─── Settings Modal ─── */
523
+ .settings-modal {
524
+ position: fixed;
525
+ inset: 40px;
526
+ z-index: 1000;
527
+ display: flex;
528
+ flex-direction: column;
529
+ background: var(--bg-panel);
530
+ border: 1px solid var(--border);
531
+ border-radius: var(--spectrum-corner-radius-200, 8px);
532
+ box-shadow: 0 16px 48px rgba(0, 0, 0, 0.4);
533
+ overflow: hidden;
534
+ }
535
+ .about-modal {
536
+ position: fixed;
537
+ top: 50%;
538
+ left: 50%;
539
+ transform: translate(-50%, -50%);
540
+ width: min(440px, calc(100vw - 48px));
541
+ max-height: calc(100vh - 80px);
542
+ z-index: 1000;
543
+ display: flex;
544
+ flex-direction: column;
545
+ background: var(--bg-panel);
546
+ border: 1px solid var(--border);
547
+ border-radius: var(--spectrum-corner-radius-200, 8px);
548
+ box-shadow: 0 16px 48px rgba(0, 0, 0, 0.4);
549
+ overflow: hidden;
550
+ }
551
+ .about-modal-body {
552
+ flex: 1;
553
+ overflow-y: auto;
554
+ padding: 20px;
555
+ }
556
+
557
+ /* ─── Search appearance ───────────────────────────────────────────────────────
558
+ Wider than .about-modal because the two preview cards are side by side, and a SERP snippet
559
+ narrower than a SERP snippet is not a preview of anything. Below ~700px they wrap (the .seo-card
560
+ flex-basis in panels.css does that) and the modal is simply a tall column. */
561
+ .seo-modal {
562
+ position: fixed;
563
+ top: 50%;
564
+ left: 50%;
565
+ transform: translate(-50%, -50%);
566
+ width: min(720px, calc(100vw - 48px));
567
+ max-height: calc(100vh - 80px);
568
+ z-index: 1000;
569
+ display: flex;
570
+ flex-direction: column;
571
+ background: var(--bg-panel);
572
+ border: 1px solid var(--border);
573
+ border-radius: var(--spectrum-corner-radius-200, 8px);
574
+ box-shadow: 0 16px 48px rgba(0, 0, 0, 0.4);
575
+ overflow: hidden;
576
+ }
577
+ /* Which document this is about. Between the title and the close button, and it truncates rather
578
+ than pushing the button off — a long path must not cost you the way out. */
579
+ .seo-modal-doc {
580
+ flex: 1;
581
+ min-width: 0;
582
+ margin-left: 10px;
583
+ overflow: hidden;
584
+ text-overflow: ellipsis;
585
+ white-space: nowrap;
586
+ font-size: var(--spectrum-font-size-75, 12px);
587
+ color: var(--fg-dim);
588
+ direction: rtl;
589
+ text-align: left;
590
+ }
591
+ .seo-modal-body {
592
+ flex: 1;
593
+ overflow-y: auto;
594
+ padding: 12px 16px 16px;
595
+ }
596
+ /* The form, split by the card each half feeds — Open Graph has its own Title/Description/Image. */
597
+ .seo-modal-group {
598
+ margin-top: 14px;
599
+ padding-top: 10px;
600
+ border-top: 1px solid var(--border);
601
+ }
602
+ .seo-modal-group-title {
603
+ margin: 0 0 2px;
604
+ font-size: var(--spectrum-font-size-50, 11px);
605
+ font-weight: 600;
606
+ text-transform: uppercase;
607
+ letter-spacing: 0.06em;
608
+ color: var(--fg-dim);
609
+ }
610
+ .seo-modal-group-note {
611
+ margin: 0 0 8px;
612
+ font-size: var(--spectrum-font-size-50, 11px);
613
+ color: var(--fg-dim);
614
+ }
615
+ /* The previews sit at the top of a scroll container, so they need no top padding of their own. */
616
+ .seo-modal-body .seo-previews {
617
+ padding-top: 0;
618
+ }
619
+ .about-meta {
620
+ margin: 0 0 16px;
621
+ display: flex;
622
+ flex-direction: column;
623
+ gap: 6px;
624
+ }
625
+ .about-meta-row {
626
+ display: flex;
627
+ gap: 12px;
628
+ font-size: 13px;
629
+ }
630
+ .about-meta-label {
631
+ width: 96px;
632
+ min-width: 96px;
633
+ margin: 0;
634
+ color: var(--fg-dim);
635
+ }
636
+ .about-meta-value {
637
+ margin: 0;
638
+ color: var(--fg);
639
+ word-break: break-word;
640
+ }
641
+ .about-links {
642
+ display: flex;
643
+ gap: 16px;
644
+ padding: 12px 0;
645
+ margin-bottom: 12px;
646
+ border-top: 1px solid var(--border);
647
+ border-bottom: 1px solid var(--border);
648
+ font-size: 13px;
649
+ }
650
+ .about-links a {
651
+ color: var(--spectrum-accent-color-1000, #6aa9ff);
652
+ text-decoration: none;
653
+ }
654
+ .about-links a:hover {
655
+ text-decoration: underline;
656
+ }
657
+ .about-section-title {
658
+ margin: 0 0 8px;
659
+ font-size: 13px;
660
+ font-weight: 600;
661
+ color: var(--fg);
662
+ }
663
+ .about-muted {
664
+ margin: 0;
665
+ font-size: 13px;
666
+ color: var(--fg-dim);
667
+ }
668
+ .about-packages {
669
+ list-style: none;
670
+ margin: 0;
671
+ padding: 0;
672
+ display: flex;
673
+ flex-direction: column;
674
+ gap: 4px;
675
+ }
676
+ .about-package-row {
677
+ display: flex;
678
+ justify-content: space-between;
679
+ gap: 12px;
680
+ font-size: var(--spectrum-font-size-75, 12px);
681
+ }
682
+ .about-package-name {
683
+ color: var(--fg-dim);
684
+ }
685
+ .about-package-version {
686
+ color: var(--fg);
687
+ font-variant-numeric: tabular-nums;
688
+ }
689
+ .settings-modal-header {
690
+ display: flex;
691
+ align-items: center;
692
+ justify-content: space-between;
693
+ padding: 12px 16px;
694
+ border-bottom: 1px solid var(--border);
695
+ }
696
+ .settings-modal-title {
697
+ margin: 0;
698
+ font-size: var(--spectrum-font-size-100, 14px);
699
+ font-weight: 600;
700
+ color: var(--fg);
701
+ }
702
+ .settings-modal-body {
703
+ display: flex;
704
+ flex: 1;
705
+ min-height: 0;
706
+ }
707
+ .settings-modal-nav {
708
+ width: 180px;
709
+ min-width: 180px;
710
+ padding: 8px 0;
711
+ border-right: 1px solid var(--border);
712
+ overflow-y: auto;
713
+ display: flex;
714
+ flex-direction: column;
715
+ }
716
+ .settings-nav-item {
717
+ display: block;
718
+ width: 100%;
719
+ padding: 8px 16px;
720
+ border: none;
721
+ background: none;
722
+ color: var(--fg-dim);
723
+ font-size: 13px;
724
+ text-align: left;
725
+ cursor: pointer;
726
+ border-radius: 0;
727
+ }
728
+ .settings-nav-item:hover {
729
+ background: var(--spectrum-gray-200, #333);
730
+ color: var(--fg);
731
+ }
732
+ .settings-nav-item.active {
733
+ background: var(--spectrum-gray-300, #444);
734
+ color: var(--fg);
735
+ font-weight: 500;
736
+ }
737
+ .settings-modal-content {
738
+ flex: 1;
739
+ overflow-y: auto;
740
+ padding: 24px;
741
+ }
742
+ .settings-section-title {
743
+ margin: 0 0 16px;
744
+ font-size: 16px;
745
+ font-weight: 600;
746
+ color: var(--fg);
747
+ }
748
+ .settings-field {
749
+ margin-bottom: 20px;
750
+ }
751
+ .settings-field-label {
752
+ display: block;
753
+ font-size: 13px;
754
+ font-weight: 500;
755
+ color: var(--fg);
756
+ margin-bottom: 2px;
757
+ }
758
+ .settings-field-desc {
759
+ margin: 0 0 6px;
760
+ font-size: var(--spectrum-font-size-75, 12px);
761
+ color: var(--fg-dim);
762
+ }
763
+ /* A write that failed, or a value the field refuses. Rendered under the control it belongs to
764
+ (or under the section title for a whole-file write failure) — settings save on change, so a
765
+ silent rejection would otherwise read as "my edit just vanished". */
766
+ .settings-field-error {
767
+ margin: 6px 0 0;
768
+ font-size: var(--spectrum-font-size-75, 12px);
769
+ color: var(--danger);
770
+ }
771
+ .settings-site-name,
772
+ .settings-site-url {
773
+ width: 100%;
774
+ max-width: 420px;
775
+ }
776
+ .settings-site-description {
777
+ width: 100%;
778
+ max-width: 420px;
779
+ min-height: 64px;
780
+ }
781
+ .settings-field-row {
782
+ display: flex;
783
+ gap: 8px;
784
+ align-items: center;
785
+ margin-bottom: 8px;
786
+ }
787
+ .settings-media-list {
788
+ display: flex;
789
+ flex-direction: column;
790
+ gap: 6px;
791
+ }
792
+ .settings-media-row {
793
+ display: flex;
794
+ gap: 6px;
795
+ align-items: center;
796
+ }
797
+ .settings-media-name-fixed {
798
+ width: 80px;
799
+ font-size: var(--spectrum-font-size-75, 12px);
800
+ font-weight: 500;
801
+ color: var(--fg-dim);
802
+ padding: 0 8px;
803
+ }
804
+ .settings-media-name {
805
+ width: 80px;
806
+ }
807
+ .settings-media-value {
808
+ flex: 1;
809
+ }
810
+ /* New Project modal */
811
+ .new-project-modal {
812
+ position: fixed;
813
+ top: 50%;
814
+ left: 50%;
815
+ transform: translate(-50%, -50%);
816
+ z-index: 1000;
817
+ display: flex;
818
+ flex-direction: column;
819
+ background: var(--bg-panel);
820
+ border: 1px solid var(--border);
821
+ border-radius: var(--spectrum-corner-radius-200, 8px);
822
+ box-shadow: 0 16px 48px rgba(0, 0, 0, 0.4);
823
+ width: min(720px, calc(100vw - 48px));
824
+ max-height: 80vh;
825
+ }
826
+ .new-project-modal-header {
827
+ display: flex;
828
+ align-items: center;
829
+ justify-content: space-between;
830
+ padding: 12px 16px;
831
+ border-bottom: 1px solid var(--border);
832
+ }
833
+ .new-project-modal-title {
834
+ margin: 0;
835
+ font-size: var(--spectrum-font-size-100, 14px);
836
+ font-weight: 600;
837
+ color: var(--fg);
838
+ }
839
+ .new-project-modal-body {
840
+ padding: 16px;
841
+ overflow-y: auto;
842
+ display: flex;
843
+ flex-direction: column;
844
+ gap: 12px;
845
+ }
846
+ .new-project-modal-footer {
847
+ display: flex;
848
+ justify-content: flex-end;
849
+ gap: 8px;
850
+ padding: 12px 16px;
851
+ border-top: 1px solid var(--border);
852
+ }
853
+ .new-project-field {
854
+ display: flex;
855
+ flex-direction: column;
856
+ gap: 4px;
857
+ }
858
+ .new-project-label {
859
+ font-size: var(--spectrum-font-size-75, 12px);
860
+ font-weight: 500;
861
+ color: var(--fg-dim);
862
+ }
863
+ .new-project-error {
864
+ font-size: var(--spectrum-font-size-75, 12px);
865
+ color: var(--danger);
866
+ padding: 4px 0;
867
+ }
868
+ /* Destination row: the Location field takes the slack, Browse… stays its natural width. */
869
+ .new-project-location-row {
870
+ display: flex;
871
+ align-items: center;
872
+ gap: 8px;
873
+ }
874
+ .new-project-location-row .new-project-location {
875
+ flex: 1;
876
+ min-width: 0;
877
+ }
878
+ /* Live preview of where the project will land — the answer to "where did that go?". */
879
+ .new-project-destination-preview {
880
+ font-size: var(--spectrum-font-size-75, 12px);
881
+ color: var(--fg-dim);
882
+ padding: 2px 0 4px;
883
+ overflow-wrap: anywhere;
884
+ }
885
+ .new-project-destination-preview code {
886
+ font-family: var(--font-mono, ui-monospace, monospace);
887
+ color: var(--fg);
888
+ }
889
+ /* Backend/global creation errors sit between the scroll body and the footer so they are
890
+ visible regardless of scroll position. */
891
+ .new-project-error--global {
892
+ flex: none;
893
+ padding: 8px 16px;
894
+ border-top: 1px solid var(--border);
895
+ }
896
+ .add-repo-modal .new-project-modal-body {
897
+ display: flex;
898
+ flex-direction: column;
899
+ gap: 8px;
900
+ }
901
+ .add-repo-list {
902
+ display: flex;
903
+ flex-direction: column;
904
+ max-height: 320px;
905
+ overflow-y: auto;
906
+ }
907
+ .add-repo-row {
908
+ display: flex;
909
+ align-items: baseline;
910
+ gap: 8px;
911
+ width: 100%;
912
+ padding: 5px 8px;
913
+ background: none;
914
+ border: none;
915
+ border-radius: var(--radius);
916
+ font: inherit;
917
+ font-size: 13px;
918
+ color: var(--fg);
919
+ cursor: pointer;
920
+ text-align: left;
921
+ }
922
+ .add-repo-row:hover:not([disabled]) {
923
+ background: var(--hover-bg);
924
+ }
925
+ .add-repo-row[disabled] {
926
+ opacity: 0.6;
927
+ cursor: default;
928
+ }
929
+ .add-repo-name {
930
+ color: var(--accent);
931
+ }
932
+ .add-repo-meta {
933
+ display: flex;
934
+ align-items: baseline;
935
+ gap: 6px;
936
+ font-size: var(--spectrum-font-size-50, 11px);
937
+ color: var(--fg-dim);
938
+ }
939
+ .add-repo-badge {
940
+ padding: 0 5px;
941
+ border: 1px solid var(--border);
942
+ border-radius: 8px;
943
+ }
944
+ .add-repo-busy {
945
+ margin-left: auto;
946
+ font-size: var(--spectrum-font-size-50, 11px);
947
+ color: var(--fg-dim);
948
+ }
949
+ .add-repo-empty {
950
+ padding: 12px 8px;
951
+ font-size: var(--spectrum-font-size-75, 12px);
952
+ color: var(--fg-dim);
953
+ }
954
+ .add-repo-install {
955
+ color: var(--accent, #1473e6);
956
+ text-decoration: underline;
957
+ }
958
+ /* Repository-access footer: widen the GitHub App, or reload after doing so. */
959
+ .add-repo-access {
960
+ display: flex;
961
+ flex-wrap: wrap;
962
+ align-items: baseline;
963
+ gap: 6px;
964
+ padding-top: 8px;
965
+ border-top: 1px solid var(--border);
966
+ font-size: var(--spectrum-font-size-50, 11px);
967
+ color: var(--fg-dim);
968
+ }
969
+ .add-repo-access-note {
970
+ flex: 1 1 auto;
971
+ }
972
+ .add-repo-access-links {
973
+ display: flex;
974
+ flex-wrap: wrap;
975
+ gap: 8px;
976
+ }
977
+ .add-repo-access-link {
978
+ color: var(--accent, #1473e6);
979
+ text-decoration: underline;
980
+ }
981
+ .add-repo-refresh {
982
+ padding: 2px 8px;
983
+ background: none;
984
+ border: 1px solid var(--border);
985
+ border-radius: var(--radius);
986
+ font: inherit;
987
+ font-size: var(--spectrum-font-size-50, 11px);
988
+ color: var(--fg);
989
+ cursor: pointer;
990
+ }
991
+ .add-repo-refresh:hover:not([disabled]) {
992
+ background: var(--hover-bg);
993
+ }
994
+ .add-repo-refresh[disabled] {
995
+ opacity: 0.5;
996
+ cursor: default;
997
+ }
998
+ .new-project-tabs {
999
+ padding: 0 16px;
1000
+ border-bottom: 1px solid var(--border);
1001
+ }
1002
+ .new-project-tab-intro {
1003
+ font-size: var(--spectrum-font-size-75, 12px);
1004
+ color: var(--fg-dim);
1005
+ line-height: 1.5;
1006
+ }
1007
+ .new-project-creds {
1008
+ display: flex;
1009
+ flex-direction: column;
1010
+ max-width: 480px;
1011
+ }
1012
+ .new-project-import-grid {
1013
+ display: grid;
1014
+ grid-template-columns: 1fr 1fr;
1015
+ gap: 12px;
1016
+ }
1017
+ .new-project-import-progress {
1018
+ display: flex;
1019
+ align-items: center;
1020
+ gap: 8px;
1021
+ font-size: var(--spectrum-font-size-75, 12px);
1022
+ color: var(--fg);
1023
+ }
1024
+ .new-project-import-log {
1025
+ font-family: var(--font-mono);
1026
+ font-size: 11px;
1027
+ line-height: 1.6;
1028
+ background: var(--bg-input);
1029
+ border: 1px solid var(--border);
1030
+ border-radius: var(--radius);
1031
+ padding: 8px 10px;
1032
+ max-height: 240px;
1033
+ overflow-y: auto;
1034
+ white-space: pre-wrap;
1035
+ word-break: break-word;
1036
+ }
1037
+ .new-project-import-log-line {
1038
+ color: var(--fg);
1039
+ }
1040
+ .new-project-import-phase {
1041
+ color: var(--fg-dim);
1042
+ margin-right: 6px;
1043
+ }
1044
+ .new-project-agent-prompt {
1045
+ min-height: 120px;
1046
+ }
1047
+ .new-project-step-context {
1048
+ font-size: var(--spectrum-font-size-75, 12px);
1049
+ color: var(--fg-dim);
1050
+ }
1051
+ .new-project-templates {
1052
+ display: grid;
1053
+ grid-template-columns: 1fr 1fr 1fr;
1054
+ gap: 8px;
1055
+ }
1056
+ .new-project-template {
1057
+ text-align: left;
1058
+ border: 1px solid var(--border);
1059
+ border-radius: 6px;
1060
+ overflow: hidden;
1061
+ cursor: pointer;
1062
+ background: var(--bg-panel);
1063
+ padding: 0;
1064
+ display: flex;
1065
+ flex-direction: column;
1066
+ }
1067
+ .new-project-template:hover {
1068
+ border-color: var(--fg-dim);
1069
+ }
1070
+ .new-project-template.selected {
1071
+ border-color: var(--accent, #3b82f6);
1072
+ box-shadow: 0 0 0 1px var(--accent, #3b82f6);
1073
+ }
1074
+ .new-project-template-thumb {
1075
+ width: 100%;
1076
+ aspect-ratio: 16 / 10;
1077
+ object-fit: cover;
1078
+ display: block;
1079
+ background: var(--bg-elevated, #1a1a1a);
1080
+ }
1081
+ .new-project-template-blank {
1082
+ display: flex;
1083
+ align-items: center;
1084
+ justify-content: center;
1085
+ aspect-ratio: 16 / 10;
1086
+ color: var(--fg-dim);
1087
+ font-size: 28px;
1088
+ background: var(--bg-elevated, #1a1a1a);
1089
+ }
1090
+ .new-project-template-body {
1091
+ padding: 6px 8px 8px;
1092
+ }
1093
+ .new-project-template-name {
1094
+ font-size: 12px;
1095
+ font-weight: 600;
1096
+ color: var(--fg);
1097
+ }
1098
+ .new-project-template-tag {
1099
+ font-size: 11px;
1100
+ color: var(--fg-dim);
1101
+ margin-top: 2px;
1102
+ line-height: 1.3;
1103
+ }
1104
+
1105
+ /* The one non-starter card, last in the gallery and spanning it, so the sites lead. */
1106
+ .new-project-scratch {
1107
+ grid-column: 1 / -1;
1108
+ flex-direction: row;
1109
+ align-items: center;
1110
+ }
1111
+ .new-project-scratch .new-project-template-blank {
1112
+ width: 96px;
1113
+ flex-shrink: 0;
1114
+ }
1115
+ /* CSS Vars editor */
1116
+ .css-vars-group {
1117
+ margin-bottom: 24px;
1118
+ }
1119
+ .css-vars-group-title {
1120
+ margin: 0 0 8px;
1121
+ font-size: 13px;
1122
+ font-weight: 600;
1123
+ color: var(--fg);
1124
+ text-transform: uppercase;
1125
+ letter-spacing: 0.5px;
1126
+ }
1127
+ .css-var-row {
1128
+ display: flex;
1129
+ align-items: center;
1130
+ gap: 8px;
1131
+ padding: 4px 0;
1132
+ }
1133
+ .css-var-name {
1134
+ font-size: var(--spectrum-font-size-75, 12px);
1135
+ color: var(--fg-dim);
1136
+ min-width: 100px;
1137
+ }
1138
+ .css-var-swatch {
1139
+ width: 24px;
1140
+ height: 24px;
1141
+ border-radius: var(--radius);
1142
+ border: 1px solid var(--border);
1143
+ position: relative;
1144
+ overflow: hidden;
1145
+ cursor: pointer;
1146
+ }
1147
+ .css-var-swatch input[type="color"] {
1148
+ position: absolute;
1149
+ inset: 0;
1150
+ opacity: 0;
1151
+ cursor: pointer;
1152
+ width: 100%;
1153
+ height: 100%;
1154
+ }
1155
+ .css-var-font-preview {
1156
+ font-size: 13px;
1157
+ color: var(--fg-dim);
1158
+ padding: 4px 0 12px 108px;
1159
+ }
1160
+ .css-var-media-overrides {
1161
+ padding-left: 108px;
1162
+ margin-bottom: 8px;
1163
+ }
1164
+ .css-var-media-row {
1165
+ display: flex;
1166
+ align-items: center;
1167
+ gap: 8px;
1168
+ padding: 2px 0;
1169
+ }
1170
+ .css-var-media-label {
1171
+ font-size: var(--spectrum-font-size-50, 11px);
1172
+ color: var(--fg-dim);
1173
+ min-width: 60px;
1174
+ }
1175
+ .css-var-add-row {
1176
+ display: flex;
1177
+ gap: 8px;
1178
+ align-items: center;
1179
+ padding: 8px 0;
1180
+ border-top: 1px solid var(--border);
1181
+ margin-top: 8px;
1182
+ }
1183
+ /* Head editor */
1184
+ .head-entry {
1185
+ border: 1px solid var(--border);
1186
+ border-radius: var(--radius);
1187
+ padding: 12px;
1188
+ margin-bottom: 8px;
1189
+ }
1190
+ .head-entry-header {
1191
+ display: flex;
1192
+ align-items: center;
1193
+ justify-content: space-between;
1194
+ margin-bottom: 8px;
1195
+ }
1196
+ .head-entry-tag {
1197
+ font-size: var(--spectrum-font-size-75, 12px);
1198
+ font-weight: 600;
1199
+ color: var(--fg);
1200
+ }
1201
+ .head-code-editor {
1202
+ width: 100%;
1203
+ min-height: 80px;
1204
+ padding: 8px;
1205
+ font-family: var(--font-mono);
1206
+ font-size: var(--spectrum-font-size-75, 12px);
1207
+ background: var(--spectrum-gray-100, #1e1e1e);
1208
+ color: var(--fg);
1209
+ border: 1px solid var(--border);
1210
+ border-radius: var(--radius);
1211
+ resize: vertical;
1212
+ }
1213
+
1214
+ /* ─── Settings editors (Collections / Definitions) ─── */
1215
+ .settings-two-col {
1216
+ display: flex;
1217
+ height: 100%;
1218
+ gap: 1px;
1219
+ background: var(--border);
1220
+ }
1221
+ .settings-list-panel {
1222
+ display: flex;
1223
+ flex-direction: column;
1224
+ gap: 4px;
1225
+ padding: 12px;
1226
+ width: 200px;
1227
+ min-width: 200px;
1228
+ background: var(--bg-panel);
1229
+ overflow-y: auto;
1230
+ }
1231
+ .settings-list-panel sp-action-button {
1232
+ width: 100%;
1233
+ justify-content: flex-start;
1234
+ }
1235
+ .settings-editor-panel {
1236
+ flex: 1;
1237
+ padding: 16px;
1238
+ background: var(--bg-panel);
1239
+ overflow-y: auto;
1240
+ }
1241
+ .settings-editor-header {
1242
+ display: flex;
1243
+ align-items: center;
1244
+ gap: 12px;
1245
+ margin-bottom: 16px;
1246
+ }
1247
+ .settings-editor-header h3 {
1248
+ margin: 0;
1249
+ font-size: var(--spectrum-font-size-100, 14px);
1250
+ font-weight: 600;
1251
+ }
1252
+ .settings-empty-state {
1253
+ flex: 1;
1254
+ display: flex;
1255
+ align-items: center;
1256
+ justify-content: center;
1257
+ background: var(--bg-panel);
1258
+ color: var(--fg-dim);
1259
+ font-size: 13px;
1260
+ }
1261
+ .settings-inline-form {
1262
+ display: flex;
1263
+ align-items: center;
1264
+ gap: 6px;
1265
+ }
1266
+ .settings-top-chrome {
1267
+ z-index: 16 !important;
1268
+ }
1269
+
1270
+ /* ─── Schema field cards ─── */
1271
+ .schema-field-list {
1272
+ display: flex;
1273
+ flex-direction: column;
1274
+ gap: 4px;
1275
+ margin-bottom: 12px;
1276
+ }
1277
+ .schema-field-card {
1278
+ border: 1px solid var(--border);
1279
+ border-radius: var(--radius);
1280
+ padding: 6px 10px;
1281
+ }
1282
+ .schema-field-row {
1283
+ display: flex;
1284
+ align-items: center;
1285
+ gap: 8px;
1286
+ }
1287
+ .schema-field-nested {
1288
+ margin-left: 16px;
1289
+ margin-top: 6px;
1290
+ padding-left: 8px;
1291
+ border-left: 2px solid var(--border);
1292
+ }
1293
+ .schema-field-name-input {
1294
+ flex: 1;
1295
+ max-width: 140px;
1296
+ }
1297
+ .schema-field-card--nested {
1298
+ border-color: var(--spectrum-gray-300, #444);
1299
+ }
1300
+ .schema-nested-add {
1301
+ display: flex;
1302
+ align-items: center;
1303
+ gap: 6px;
1304
+ padding: 4px 0;
1305
+ }
1306
+ .schema-nested-add-name {
1307
+ flex: 1;
1308
+ max-width: 120px;
1309
+ }
1310
+ .schema-add-field {
1311
+ display: flex;
1312
+ align-items: center;
1313
+ gap: 8px;
1314
+ padding: 8px 0;
1315
+ }
1316
+
1317
+ /* ─── Media picker ─────────────────────────────── */
1318
+ .media-picker {
1319
+ display: flex;
1320
+ align-items: center;
1321
+ gap: 4px;
1322
+ flex: 1;
1323
+ }
1324
+ .media-picker sp-textfield {
1325
+ flex: 1;
1326
+ min-width: 0;
1327
+ }
1328
+ /* Upload + Browse always render, so the field yields width before the buttons do. */
1329
+ .media-picker sp-action-button {
1330
+ flex-shrink: 0;
1331
+ }
1332
+ .media-picker-thumb {
1333
+ width: 24px;
1334
+ height: 24px;
1335
+ object-fit: cover;
1336
+ border-radius: var(--radius);
1337
+ border: 1px solid var(--border);
1338
+ flex-shrink: 0;
1339
+ }
1340
+ /* .media-picker-popover is no longer used — inlined in media-picker.ts */
1341
+
1342
+ /* ─── Source view ────────────────────────────── */
1343
+ #source-view {
1344
+ width: 100%;
1345
+ height: 100%;
1346
+ background: var(--bg);
1347
+ color: var(--fg);
1348
+ font: 11px/1.6 var(--font-mono, monospace);
1349
+ border: none;
1350
+ padding: 8px;
1351
+ resize: none;
1352
+ /* Pointer focus only — the keyboard ring is restored below. */
1353
+ outline: none;
1354
+ }
1355
+
1356
+ #source-view:focus-visible {
1357
+ outline: 2px solid var(--accent);
1358
+ outline-offset: -2px;
1359
+ }
1360
+
1361
+ /* ─── Empty state ────────────────────────────── */
1362
+ .empty-state {
1363
+ padding: 24px;
1364
+ text-align: center;
1365
+ color: var(--fg-dim);
1366
+ font-size: 13px;
1367
+ }
1368
+
1369
+ /* ─── Style filter bar ───────────────────────── */
1370
+ .style-filter-bar {
1371
+ display: flex;
1372
+ align-items: center;
1373
+ padding: 2px 8px 4px;
1374
+ gap: 6px;
1375
+ }
1376
+ .style-filter-input {
1377
+ flex: 1;
1378
+ min-width: 0;
1379
+ --spectrum-textfield-texticon-min-width: 0;
1380
+ }
1381
+ /* ─── Git panel ──────────────────────────────── */
1382
+ .git-panel {
1383
+ display: flex;
1384
+ flex-direction: column;
1385
+ height: 100%;
1386
+ font-size: var(--spectrum-font-size-75, 12px);
1387
+ }
1388
+
1389
+ /* Sync status bar */
1390
+ .git-sync-bar {
1391
+ display: flex;
1392
+ align-items: center;
1393
+ gap: 10px;
1394
+ padding: 12px 12px;
1395
+ border-bottom: 1px solid var(--border);
1396
+ }
1397
+ .git-sync-icon {
1398
+ flex-shrink: 0;
1399
+ }
1400
+ .git-sync-text {
1401
+ display: flex;
1402
+ flex-direction: column;
1403
+ gap: 2px;
1404
+ flex: 1;
1405
+ }
1406
+ .git-sync-actions {
1407
+ flex-shrink: 0;
1408
+ margin-left: auto;
1409
+ }
1410
+ .git-sync-label {
1411
+ font-size: 13px;
1412
+ font-weight: 600;
1413
+ color: var(--fg);
1414
+ }
1415
+ .git-sync-time {
1416
+ font-size: var(--spectrum-font-size-50, 11px);
1417
+ color: var(--fg-dim);
1418
+ }
1419
+
1420
+ /* Branch selector row */
1421
+ .git-branch-row {
1422
+ display: flex;
1423
+ align-items: center;
1424
+ gap: 10px;
1425
+ padding: 10px 12px;
1426
+ border-bottom: 1px solid var(--border);
1427
+ }
1428
+ .git-branch-icon {
1429
+ flex-shrink: 0;
1430
+ color: var(--fg-dim);
1431
+ }
1432
+ .git-branch-text {
1433
+ display: flex;
1434
+ flex-direction: column;
1435
+ gap: 1px;
1436
+ flex: 1;
1437
+ min-width: 0;
1438
+ }
1439
+ .git-branch-label {
1440
+ font-size: var(--spectrum-font-size-50, 11px);
1441
+ color: var(--fg-dim);
1442
+ }
1443
+ .git-branch-name {
1444
+ font-size: 13px;
1445
+ font-weight: 600;
1446
+ color: var(--fg);
1447
+ }
1448
+ .git-branch-picker {
1449
+ flex-shrink: 0;
1450
+ --spectrum-picker-min-width: 0;
1451
+ }
1452
+
1453
+ /* Tabs: Local Changes / History */
1454
+ .git-tabs {
1455
+ display: flex;
1456
+ border-bottom: 1px solid var(--border);
1457
+ }
1458
+ .git-tab {
1459
+ flex: 1;
1460
+ padding: 8px 12px;
1461
+ font: inherit;
1462
+ font-size: var(--spectrum-font-size-75, 12px);
1463
+ font-weight: 600;
1464
+ background: var(--hover-bg);
1465
+ border: none;
1466
+ border-bottom: 2px solid transparent;
1467
+ color: var(--fg-dim);
1468
+ cursor: pointer;
1469
+ transition:
1470
+ color 0.15s,
1471
+ border-color 0.15s;
1472
+ }
1473
+ .git-tab:hover {
1474
+ color: var(--fg);
1475
+ }
1476
+ .git-tab.active {
1477
+ color: var(--fg);
1478
+ border-bottom-color: var(--accent, #e2b93d);
1479
+ background: transparent;
1480
+ }
1481
+
1482
+ /* Commit area */
1483
+ .git-commit-area {
1484
+ display: flex;
1485
+ flex-direction: column;
1486
+ gap: 8px;
1487
+ padding: 12px;
1488
+ border-bottom: 1px solid var(--border);
1489
+ }
1490
+ .git-commit-label {
1491
+ font-size: var(--spectrum-font-size-75, 12px);
1492
+ font-weight: 500;
1493
+ color: var(--fg-dim);
1494
+ }
1495
+ .git-commit-input {
1496
+ width: 100%;
1497
+ --spectrum-textfield-texticon-min-width: 0;
1498
+ }
1499
+ .git-commit-actions {
1500
+ display: flex;
1501
+ }
1502
+ .git-split-btn {
1503
+ display: flex;
1504
+ flex: 1;
1505
+ position: relative;
1506
+ }
1507
+ .git-split-btn .git-commit-btn {
1508
+ flex: 1;
1509
+ border-top-right-radius: 0;
1510
+ border-bottom-right-radius: 0;
1511
+ }
1512
+ .git-split-btn .git-split-trigger {
1513
+ border-top-left-radius: 0;
1514
+ border-bottom-left-radius: 0;
1515
+ border-left: 1px solid rgba(0, 0, 0, 0.15);
1516
+ }
1517
+ .git-split-menu {
1518
+ position: absolute;
1519
+ top: 100%;
1520
+ left: 0;
1521
+ right: 0;
1522
+ margin-top: 4px;
1523
+ background: var(--bg-panel);
1524
+ border: 1px solid var(--border);
1525
+ border-radius: var(--radius);
1526
+ z-index: 10;
1527
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
1528
+ }
1529
+ .git-split-menu-item {
1530
+ display: block;
1531
+ width: 100%;
1532
+ padding: 6px 12px;
1533
+ font: inherit;
1534
+ font-size: var(--spectrum-font-size-75, 12px);
1535
+ color: var(--fg);
1536
+ background: none;
1537
+ border: none;
1538
+ text-align: left;
1539
+ cursor: pointer;
1540
+ }
1541
+ .git-split-menu-item:hover {
1542
+ background: var(--hover-bg);
1543
+ }
1544
+
1545
+ /* Changed Components grouping */
1546
+ .git-component-group {
1547
+ margin-bottom: 2px;
1548
+ }
1549
+ .git-component-header {
1550
+ display: flex;
1551
+ align-items: center;
1552
+ gap: 6px;
1553
+ padding: 4px 8px;
1554
+ }
1555
+ .git-component-overflow {
1556
+ flex-shrink: 0;
1557
+ }
1558
+ .git-component-name {
1559
+ font-size: var(--spectrum-font-size-75, 12px);
1560
+ font-weight: 500;
1561
+ color: var(--fg);
1562
+ }
1563
+
1564
+ /* Sections */
1565
+ .git-section {
1566
+ border-bottom: 1px solid var(--border);
1567
+ }
1568
+ .git-section-header {
1569
+ display: flex;
1570
+ align-items: center;
1571
+ gap: 6px;
1572
+ padding: 8px 12px 6px;
1573
+ font-size: var(--spectrum-font-size-75, 12px);
1574
+ font-weight: 700;
1575
+ color: var(--fg);
1576
+ }
1577
+ .git-count {
1578
+ display: inline-flex;
1579
+ align-items: center;
1580
+ justify-content: center;
1581
+ min-width: 18px;
1582
+ height: 18px;
1583
+ padding: 0 5px;
1584
+ border-radius: 9px;
1585
+ background: var(--accent-15);
1586
+ color: var(--accent);
1587
+ font-size: 10px;
1588
+ font-weight: 600;
1589
+ }
1590
+ .git-section-header .git-count {
1591
+ margin-right: auto;
1592
+ }
1593
+
1594
+ /* File rows */
1595
+ .git-file-row {
1596
+ display: flex;
1597
+ align-items: center;
1598
+ gap: 4px;
1599
+ padding: 2px 8px 2px 16px;
1600
+ cursor: default;
1601
+ }
1602
+ .git-file-row:hover {
1603
+ background: var(--hover-bg);
1604
+ }
1605
+ .git-file-info {
1606
+ flex: 1;
1607
+ min-width: 0;
1608
+ display: flex;
1609
+ align-items: baseline;
1610
+ gap: 6px;
1611
+ overflow: hidden;
1612
+ }
1613
+ .git-file-name {
1614
+ white-space: nowrap;
1615
+ overflow: hidden;
1616
+ text-overflow: ellipsis;
1617
+ }
1618
+ .git-file-dir {
1619
+ font-size: 10px;
1620
+ color: var(--fg-dim);
1621
+ white-space: nowrap;
1622
+ overflow: hidden;
1623
+ text-overflow: ellipsis;
1624
+ }
1625
+ .git-file-actions {
1626
+ display: flex;
1627
+ gap: 0;
1628
+ opacity: 0;
1629
+ }
1630
+ .git-file-row:hover .git-file-actions {
1631
+ opacity: 1;
1632
+ }
1633
+ .git-file-badge {
1634
+ flex-shrink: 0;
1635
+ width: 16px;
1636
+ text-align: center;
1637
+ font-size: 10px;
1638
+ font-weight: 700;
1639
+ font-family: var(--font-mono);
1640
+ }
1641
+ .git-status-M {
1642
+ color: var(--signal);
1643
+ }
1644
+ .git-status-A {
1645
+ color: var(--success);
1646
+ }
1647
+ .git-status-D {
1648
+ color: var(--danger);
1649
+ }
1650
+ .git-status-R {
1651
+ color: var(--tag);
1652
+ }
1653
+ .git-status-U {
1654
+ color: var(--success);
1655
+ }
1656
+ .git-status-C {
1657
+ color: var(--tag);
1658
+ }
1659
+
1660
+ /* History tab */
1661
+ .git-history {
1662
+ padding: 4px 0;
1663
+ overflow-y: auto;
1664
+ flex: 1;
1665
+ }
1666
+ .git-history-entry {
1667
+ display: flex;
1668
+ flex-direction: column;
1669
+ gap: 2px;
1670
+ padding: 6px 12px;
1671
+ border-bottom: 1px solid var(--border);
1672
+ }
1673
+ .git-history-entry:hover {
1674
+ background: var(--hover-bg);
1675
+ }
1676
+ .git-history-hash {
1677
+ font-size: 10px;
1678
+ font-family: var(--font-mono);
1679
+ color: var(--accent);
1680
+ }
1681
+ .git-history-message {
1682
+ font-size: var(--spectrum-font-size-75, 12px);
1683
+ color: var(--fg);
1684
+ }
1685
+ .git-history-meta {
1686
+ font-size: 10px;
1687
+ color: var(--fg-dim);
1688
+ }
1689
+
1690
+ /* Utility */
1691
+ .git-loading {
1692
+ padding: 8px;
1693
+ text-align: center;
1694
+ color: var(--fg-dim);
1695
+ font-size: var(--spectrum-font-size-50, 11px);
1696
+ }
1697
+ .git-error {
1698
+ padding: 6px 8px;
1699
+ font-size: var(--spectrum-font-size-50, 11px);
1700
+ color: var(--danger);
1701
+ background: color-mix(in srgb, var(--danger) 8%, transparent);
1702
+ border-bottom: 1px solid var(--border);
1703
+ }
1704
+
1705
+ .git-panel-empty {
1706
+ justify-content: center;
1707
+ align-items: center;
1708
+ }
1709
+ .git-sync-bar--no-remote {
1710
+ gap: 8px;
1711
+ }
1712
+
1713
+ /* GitHub auth dialog */
1714
+ .github-auth-dialog {
1715
+ text-align: center;
1716
+ padding: 16px 0;
1717
+ }
1718
+ .github-auth-dialog p {
1719
+ margin: 8px 0;
1720
+ font-size: 13px;
1721
+ }
1722
+ .github-auth-code {
1723
+ font-size: 24px;
1724
+ font-weight: 700;
1725
+ letter-spacing: 2px;
1726
+ font-family: var(--font-mono, monospace);
1727
+ padding: 12px 16px;
1728
+ background: var(--hover-bg);
1729
+ border-radius: var(--radius);
1730
+ display: inline-block;
1731
+ margin: 8px 0;
1732
+ }
1733
+ .github-auth-waiting {
1734
+ color: var(--fg-dim);
1735
+ font-style: italic;
1736
+ }
1737
+
1738
+ /* GitHub publish dialog */
1739
+ .github-publish-dialog {
1740
+ display: flex;
1741
+ flex-direction: column;
1742
+ gap: 8px;
1743
+ padding: 8px 0;
1744
+ }
1745
+ .github-publish-dialog sp-textfield {
1746
+ width: 100%;
1747
+ }
1748
+
1749
+ /* ─── Feature toggle (stylebook) ─────────────── */
1750
+ .tb-toggle {
1751
+ padding: 3px 8px;
1752
+ font: inherit;
1753
+ font-size: var(--spectrum-font-size-50, 11px);
1754
+ color: var(--fg-dim);
1755
+ background: transparent;
1756
+ border: 1px solid var(--border);
1757
+ border-radius: var(--radius);
1758
+ cursor: pointer;
1759
+ }
1760
+ .tb-toggle:hover {
1761
+ background: var(--hover-bg);
1762
+ }
1763
+ .tb-toggle.active {
1764
+ color: var(--accent);
1765
+ border-color: var(--accent);
1766
+ background: var(--accent-15);
1767
+ }
1768
+
1769
+ /* ─── Stylebook ─────────────────────────────────── */
1770
+ /* Chrome bar (tabs + filter) above the canvas viewport */
1771
+ .sb-chrome {
1772
+ display: flex;
1773
+ align-items: center;
1774
+ padding: 4px 8px;
1775
+ background: var(--bg-panel);
1776
+ border-bottom: 1px solid var(--border);
1777
+ gap: 4px;
1778
+ flex-shrink: 0;
1779
+ }
1780
+
1781
+ /* Section layout in canvas */
1782
+ .sb-section {
1783
+ margin-bottom: 24px;
1784
+ }
1785
+ .sb-label {
1786
+ font-size: 10px;
1787
+ font-weight: 700;
1788
+ text-transform: uppercase;
1789
+ letter-spacing: 0.08em;
1790
+ color: var(--canvas-muted);
1791
+ padding: 8px 0 4px;
1792
+ border-bottom: 1px solid var(--canvas-rule);
1793
+ margin-bottom: 8px;
1794
+ }
1795
+ .sb-body {
1796
+ padding: 4px 0;
1797
+ display: flex;
1798
+ flex-direction: column;
1799
+ gap: 6px;
1800
+ }
1801
+
1802
+ /* Variable rows — unified layout for existing + add-new */
1803
+ .sb-var-row {
1804
+ display: flex;
1805
+ flex-direction: column;
1806
+ gap: 4px;
1807
+ padding: 10px 0;
1808
+ border-bottom: 1px solid var(--canvas-rule);
1809
+ }
1810
+ .sb-var-row:last-child {
1811
+ border-bottom: none;
1812
+ }
1813
+ .sb-var-row-header {
1814
+ display: flex;
1815
+ align-items: baseline;
1816
+ gap: 6px;
1817
+ min-height: 18px;
1818
+ flex-wrap: wrap;
1819
+ }
1820
+ .sb-var-row-title {
1821
+ font-weight: 600;
1822
+ font-size: var(--spectrum-font-size-75, 12px);
1823
+ color: var(--canvas-fg-2);
1824
+ white-space: nowrap;
1825
+ }
1826
+ .sb-var-row-ref {
1827
+ font-size: 10px;
1828
+ color: var(--canvas-muted);
1829
+ font-family: var(--font-mono);
1830
+ overflow: hidden;
1831
+ text-overflow: ellipsis;
1832
+ }
1833
+ .sb-var-row-header .sb-var-del {
1834
+ margin-left: auto;
1835
+ }
1836
+ .sb-var-row sp-textfield {
1837
+ pointer-events: auto;
1838
+ }
1839
+ /* Existing variable: horizontal swatch + value */
1840
+ .sb-var-input-row {
1841
+ display: flex;
1842
+ align-items: flex-end;
1843
+ gap: 8px;
1844
+ }
1845
+ .sb-var-col-name {
1846
+ min-width: 0;
1847
+ }
1848
+ .sb-var-col-value {
1849
+ flex: 1;
1850
+ min-width: 0;
1851
+ }
1852
+ .sb-var-col-name sp-textfield,
1853
+ .sb-var-col-value sp-textfield {
1854
+ width: 100%;
1855
+ }
1856
+ .sb-var-col-label {
1857
+ font-size: 10px;
1858
+ color: var(--canvas-dim);
1859
+ margin-bottom: 2px;
1860
+ font-weight: 500;
1861
+ }
1862
+ /* Add-new form: horizontal layout matching existing rows */
1863
+ .sb-var-row.is-new .sb-var-input-row {
1864
+ flex-wrap: nowrap;
1865
+ align-items: flex-end;
1866
+ }
1867
+ .sb-var-row.is-new .sb-var-col-name {
1868
+ flex: 2;
1869
+ min-width: 0;
1870
+ }
1871
+ .sb-var-row.is-new .sb-var-col-value {
1872
+ flex: 3;
1873
+ min-width: 0;
1874
+ }
1875
+ .sb-var-row.is-new .sb-var-swatch {
1876
+ align-self: flex-end;
1877
+ margin-bottom: 2px;
1878
+ }
1879
+ .sb-var-swatch {
1880
+ width: 28px;
1881
+ height: 28px;
1882
+ border-radius: var(--radius);
1883
+ border: 1px solid var(--canvas-border);
1884
+ cursor: pointer;
1885
+ position: relative;
1886
+ flex-shrink: 0;
1887
+ align-self: flex-end;
1888
+ margin-bottom: 2px;
1889
+ }
1890
+ .sb-var-swatch input[type="color"] {
1891
+ position: absolute;
1892
+ inset: 0;
1893
+ width: 100%;
1894
+ height: 100%;
1895
+ opacity: 0;
1896
+ cursor: pointer;
1897
+ pointer-events: auto;
1898
+ }
1899
+ .sb-var-preview {
1900
+ margin-top: 2px;
1901
+ padding: 8px;
1902
+ background: var(--canvas-bg-1);
1903
+ border-radius: var(--radius);
1904
+ border: 1px solid var(--canvas-rule);
1905
+ }
1906
+ .sb-var-font-preview {
1907
+ font-size: var(--spectrum-font-size-100, 14px);
1908
+ line-height: 1.4;
1909
+ color: var(--canvas-fg-2);
1910
+ }
1911
+ .sb-var-size-track {
1912
+ background: var(--canvas-track);
1913
+ height: 8px;
1914
+ border-radius: var(--radius);
1915
+ width: 100%;
1916
+ overflow: hidden;
1917
+ }
1918
+ .sb-var-size-bar {
1919
+ height: 100%;
1920
+ background: var(--accent, #3b82f6);
1921
+ transition: width 0.3s;
1922
+ border-radius: var(--radius);
1923
+ }
1924
+ .sb-var-del {
1925
+ opacity: 0;
1926
+ transition: opacity 0.15s;
1927
+ flex-shrink: 0;
1928
+ }
1929
+ .sb-var-row:hover .sb-var-del {
1930
+ opacity: 1;
1931
+ }
1932
+ .sb-var-empty {
1933
+ padding: 16px 8px;
1934
+ text-align: center;
1935
+ color: var(--canvas-light);
1936
+ font-size: var(--spectrum-font-size-75, 12px);
1937
+ font-style: italic;
1938
+ }
1939
+ .sb-var-add-btn {
1940
+ margin-top: 6px;
1941
+ pointer-events: auto;
1942
+ background: none;
1943
+ border: 1px dashed var(--canvas-border);
1944
+ border-radius: var(--radius);
1945
+ padding: 5px 10px;
1946
+ font-size: var(--spectrum-font-size-75, 12px);
1947
+ color: var(--canvas-fg-3);
1948
+ cursor: pointer;
1949
+ display: flex;
1950
+ align-items: center;
1951
+ gap: 4px;
1952
+ transition: all 0.15s;
1953
+ }
1954
+ .sb-var-add-btn:hover {
1955
+ border-color: var(--canvas-muted);
1956
+ color: var(--canvas-fg-2);
1957
+ background: var(--canvas-bg-1);
1958
+ }
1959
+ .sb-var-add-icon {
1960
+ font-size: var(--spectrum-font-size-100, 14px);
1961
+ font-weight: 600;
1962
+ }
1963
+ .sb-var-add-actions {
1964
+ display: flex;
1965
+ gap: 4px;
1966
+ align-items: center;
1967
+ flex-shrink: 0;
1968
+ align-self: flex-end;
1969
+ margin-bottom: 2px;
1970
+ }
1971
+ .sb-unit-input {
1972
+ position: relative;
1973
+ display: flex;
1974
+ align-items: center;
1975
+ width: 100%;
1976
+ }
1977
+ .sb-unit-input sp-textfield {
1978
+ width: 100%;
1979
+ }
1980
+ .sb-unit-input sp-picker {
1981
+ position: absolute;
1982
+ right: 2px;
1983
+ --mod-picker-border-width: 0;
1984
+ --mod-picker-min-width: 56px;
1985
+ }
1986
+ .sb-var-add-preview {
1987
+ font-size: 10px;
1988
+ color: var(--canvas-muted);
1989
+ font-family: var(--font-mono);
1990
+ min-height: 14px;
1991
+ }
1992
+
1993
+ /* ─── Inline editing ─────────────────────────── */
1994
+ .canvas-panel-canvas [contenteditable="true"] {
1995
+ outline: 2px solid var(--accent);
1996
+ outline-offset: 1px;
1997
+ cursor: text;
1998
+ min-height: 1.5em;
1999
+ border-radius: var(--spectrum-corner-radius-75, 2px);
2000
+ }
2001
+ .canvas-panel-canvas [contenteditable="true"]:focus {
2002
+ outline-color: var(--accent);
2003
+ box-shadow: 0 0 0 3px var(--accent-15);
2004
+ }
2005
+
2006
+ /* ─── Start pane (no project open) ─────────────────────────── */
2007
+ .welcome-screen {
2008
+ width: 100%;
2009
+ height: 100%;
2010
+ display: flex;
2011
+ align-items: flex-start;
2012
+ justify-content: center;
2013
+ padding-top: 10vh;
2014
+ overflow-y: auto;
2015
+ }
2016
+ .welcome-content {
2017
+ max-width: 560px;
2018
+ width: 100%;
2019
+ padding: 0 24px 48px;
2020
+ }
2021
+ .welcome-title {
2022
+ font-size: 28px;
2023
+ font-weight: 300;
2024
+ color: var(--fg);
2025
+ margin: 0;
2026
+ letter-spacing: -0.5px;
2027
+ }
2028
+ .welcome-subtitle {
2029
+ font-size: var(--spectrum-font-size-100, 14px);
2030
+ color: var(--fg-dim);
2031
+ margin: 2px 0 0;
2032
+ }
2033
+ .welcome-section {
2034
+ margin-top: 28px;
2035
+ }
2036
+ .welcome-section-title {
2037
+ font-size: 13px;
2038
+ font-weight: 600;
2039
+ color: var(--fg);
2040
+ margin: 0 0 8px;
2041
+ text-transform: uppercase;
2042
+ letter-spacing: 0.3px;
2043
+ }
2044
+ .welcome-actions {
2045
+ display: flex;
2046
+ flex-direction: column;
2047
+ align-items: stretch;
2048
+ gap: 2px;
2049
+ }
2050
+ .welcome-action {
2051
+ --mod-actionbutton-content-color-default: var(--accent);
2052
+ --mod-actionbutton-content-color-hover: var(--accent);
2053
+
2054
+ justify-content: flex-start;
2055
+ text-align: left;
2056
+ }
2057
+ .welcome-install-note {
2058
+ margin: 4px 8px 0;
2059
+ font-size: 12px;
2060
+ color: var(--fg-dim);
2061
+ }
2062
+ .welcome-list {
2063
+ list-style: none;
2064
+ margin: 0;
2065
+ padding: 0;
2066
+ }
2067
+ .welcome-recent {
2068
+ display: grid;
2069
+ grid-template-columns: auto 1fr auto;
2070
+ align-items: baseline;
2071
+ gap: 12px;
2072
+ width: 100%;
2073
+ padding: 5px 8px;
2074
+ margin: 0;
2075
+ background: none;
2076
+ border: none;
2077
+ border-radius: var(--radius);
2078
+ font: inherit;
2079
+ font-size: 13px;
2080
+ color: var(--fg);
2081
+ cursor: pointer;
2082
+ text-align: left;
2083
+ }
2084
+ .welcome-recent:hover {
2085
+ background: var(--hover-bg);
2086
+ }
2087
+ .welcome-recent-name {
2088
+ color: var(--accent);
2089
+ overflow: hidden;
2090
+ text-overflow: ellipsis;
2091
+ white-space: nowrap;
2092
+ }
2093
+ .welcome-recent-path {
2094
+ color: var(--fg-dim);
2095
+ font-size: var(--spectrum-font-size-75, 12px);
2096
+ overflow: hidden;
2097
+ text-overflow: ellipsis;
2098
+ white-space: nowrap;
2099
+ }
2100
+ .welcome-recent-when {
2101
+ color: var(--fg-dim);
2102
+ font-size: var(--spectrum-font-size-75, 12px);
2103
+ white-space: nowrap;
2104
+ }
2105
+ .welcome-section-header {
2106
+ display: flex;
2107
+ align-items: baseline;
2108
+ justify-content: space-between;
2109
+ gap: 12px;
2110
+ }
2111
+ .welcome-clear {
2112
+ --mod-actionbutton-content-color-default: var(--fg-dim);
2113
+
2114
+ flex-shrink: 0;
2115
+ }
2116
+ .welcome-recent-row {
2117
+ display: flex;
2118
+ align-items: center;
2119
+ }
2120
+ .welcome-recent-row .welcome-recent {
2121
+ flex: 1;
2122
+ min-width: 0;
2123
+ }
2124
+ .welcome-recent-remove {
2125
+ flex-shrink: 0;
2126
+ opacity: 0;
2127
+ }
2128
+ .welcome-recent-row:hover .welcome-recent-remove,
2129
+ .welcome-recent-remove:focus-visible {
2130
+ opacity: 1;
2131
+ }
2132
+
2133
+ /* ─── Grid editor (Tabulator theme over Spectrum tokens) ─────────────── */
2134
+ .jx-grid {
2135
+ display: flex;
2136
+ flex-direction: column;
2137
+ height: 100%;
2138
+ min-height: 0;
2139
+ background: var(--bg);
2140
+ }
2141
+ .jx-grid-toolbar {
2142
+ display: flex;
2143
+ align-items: center;
2144
+ gap: 6px;
2145
+ padding: 6px 10px;
2146
+ border-bottom: 1px solid var(--border);
2147
+ background: var(--bg-panel);
2148
+ flex-shrink: 0;
2149
+ }
2150
+ .jx-grid-toolbar sp-search {
2151
+ width: 200px;
2152
+ }
2153
+ .jx-grid-spacer {
2154
+ flex: 1;
2155
+ }
2156
+ .jx-grid-note {
2157
+ font-size: var(--spectrum-font-size-50, 11px);
2158
+ color: var(--fg-dim);
2159
+ border: 1px solid var(--border);
2160
+ border-radius: var(--radius);
2161
+ padding: 1px 6px;
2162
+ cursor: help;
2163
+ }
2164
+ .jx-grid-count {
2165
+ font-size: var(--spectrum-font-size-75, 12px);
2166
+ color: var(--fg-dim);
2167
+ white-space: nowrap;
2168
+ }
2169
+ .jx-grid-error-text {
2170
+ color: var(--danger);
2171
+ }
2172
+ .jx-grid-host {
2173
+ flex: 1;
2174
+ min-height: 0;
2175
+ }
2176
+ .jx-grid-missing {
2177
+ padding: 24px;
2178
+ color: var(--fg-dim);
2179
+ }
2180
+
2181
+ /* Tabulator structural overrides — tokens only, scoped under .jx-grid. */
2182
+ .jx-grid .tabulator {
2183
+ background: var(--bg);
2184
+ color: var(--fg);
2185
+ border: none;
2186
+ font-size: var(--spectrum-font-size-75, 12px);
2187
+ height: 100%;
2188
+ }
2189
+ .jx-grid .tabulator .tabulator-header {
2190
+ background: var(--bg-panel);
2191
+ color: var(--fg);
2192
+ border-bottom: 1px solid var(--border);
2193
+ }
2194
+ .jx-grid .tabulator .tabulator-header .tabulator-col {
2195
+ background: var(--bg-panel);
2196
+ border-right: 1px solid var(--border);
2197
+ }
2198
+ .jx-grid .tabulator .tabulator-header .tabulator-col .tabulator-col-title {
2199
+ color: var(--fg);
2200
+ font-weight: 600;
2201
+ }
2202
+ .jx-grid .tabulator .tabulator-header .tabulator-header-filter input {
2203
+ background: var(--bg);
2204
+ color: var(--fg);
2205
+ border: 1px solid var(--border);
2206
+ border-radius: var(--spectrum-corner-radius-75, 2px);
2207
+ padding: 1px 4px;
2208
+ font: inherit;
2209
+ }
2210
+ .jx-grid .tabulator .tabulator-tableholder {
2211
+ background: var(--bg);
2212
+ }
2213
+ .jx-grid .tabulator .tabulator-row {
2214
+ background: var(--bg);
2215
+ color: var(--fg);
2216
+ border-bottom: 1px solid color-mix(in srgb, var(--border) 55%, transparent);
2217
+ min-height: 26px;
2218
+ }
2219
+ .jx-grid .tabulator .tabulator-row.tabulator-row-even {
2220
+ background: color-mix(in srgb, var(--bg-panel) 45%, var(--bg));
2221
+ }
2222
+ .jx-grid .tabulator .tabulator-row.tabulator-selected {
2223
+ background: color-mix(in srgb, var(--accent) 16%, var(--bg));
2224
+ }
2225
+ .jx-grid .tabulator .tabulator-row .tabulator-cell {
2226
+ border-right: 1px solid color-mix(in srgb, var(--border) 55%, transparent);
2227
+ padding: 3px 8px;
2228
+ }
2229
+ .jx-grid .tabulator .tabulator-row .tabulator-cell.tabulator-frozen {
2230
+ background: var(--bg-panel);
2231
+ border-right: 1px solid var(--border);
2232
+ }
2233
+ .jx-grid .tabulator .tabulator-range {
2234
+ border: 1px solid var(--accent);
2235
+ background: color-mix(in srgb, var(--accent) 10%, transparent);
2236
+ }
2237
+ .jx-grid .tabulator .tabulator-range-overlay .tabulator-range-cell-active {
2238
+ border: 2px solid var(--accent);
2239
+ }
2240
+ .jx-grid .tabulator .tabulator-placeholder .tabulator-placeholder-contents {
2241
+ color: var(--fg-dim);
2242
+ background: transparent;
2243
+ }
2244
+
2245
+ /* Buffer-state paint (dirty / error / stale / pending rows). */
2246
+ .jx-grid .tabulator-cell.jx-grid-cell--dirty {
2247
+ box-shadow: inset 2px 0 0 var(--accent);
2248
+ background: color-mix(in srgb, var(--accent) 8%, transparent);
2249
+ }
2250
+ .jx-grid .tabulator-cell.jx-grid-cell--error {
2251
+ box-shadow: inset 2px 0 0 var(--danger);
2252
+ background: color-mix(in srgb, var(--danger) 12%, transparent);
2253
+ }
2254
+ .jx-grid .tabulator-cell.jx-grid-cell--stale {
2255
+ opacity: 0.65;
2256
+ }
2257
+ .jx-grid .tabulator-row.jx-grid-row--pending-delete .tabulator-cell {
2258
+ text-decoration: line-through;
2259
+ opacity: 0.55;
2260
+ }
2261
+ .jx-grid .tabulator-row.jx-grid-row--pending-insert {
2262
+ background: color-mix(in srgb, var(--success, var(--accent)) 10%, var(--bg));
2263
+ }
2264
+ .jx-grid .tabulator-row.jx-grid-row--stale {
2265
+ outline: 1px dashed var(--fg-dim);
2266
+ outline-offset: -1px;
2267
+ }
2268
+
2269
+ /* Cell content + in-cell editors. */
2270
+ .jx-grid-cell-content {
2271
+ overflow: hidden;
2272
+ text-overflow: ellipsis;
2273
+ white-space: nowrap;
2274
+ }
2275
+ .jx-grid-kind-number {
2276
+ text-align: right;
2277
+ font-variant-numeric: tabular-nums;
2278
+ }
2279
+ .jx-grid-kind-readonly {
2280
+ color: var(--fg-dim);
2281
+ font-family: var(--font-mono);
2282
+ font-size: var(--spectrum-font-size-50, 11px);
2283
+ }
2284
+ .jx-grid-chip {
2285
+ display: inline-block;
2286
+ background: color-mix(in srgb, var(--accent) 18%, transparent);
2287
+ border: 1px solid color-mix(in srgb, var(--accent) 40%, transparent);
2288
+ border-radius: 8px;
2289
+ padding: 0 6px;
2290
+ margin-right: 4px;
2291
+ font-size: var(--spectrum-font-size-50, 11px);
2292
+ line-height: 16px;
2293
+ }
2294
+ .jx-grid-editor {
2295
+ width: 100%;
2296
+ height: 100%;
2297
+ display: flex;
2298
+ align-items: center;
2299
+ }
2300
+ .jx-grid-editor .jx-grid-input,
2301
+ .jx-grid-editor .jx-grid-select {
2302
+ width: 100%;
2303
+ background: var(--bg);
2304
+ color: var(--fg);
2305
+ border: 1px solid var(--accent);
2306
+ border-radius: var(--spectrum-corner-radius-75, 2px);
2307
+ padding: 2px 6px;
2308
+ font: inherit;
2309
+ /* Pointer focus only — the keyboard ring is restored below. */
2310
+ outline: none;
2311
+ }
2312
+
2313
+ /* Both halves of the suppression above, not just the picker: the text input shared the `outline:
2314
+ none` and none of the restore, so a keyboard-focused text cell showed nothing at all. A grouped
2315
+ selector is exactly what a per-line ban cannot see — FOCUS_RING_ALLOWANCES lists the two
2316
+ separately for that reason. */
2317
+ .jx-grid-editor .jx-grid-input:focus-visible,
2318
+ .jx-grid-editor .jx-grid-select:focus-visible {
2319
+ outline: 2px solid var(--accent);
2320
+ outline-offset: -1px;
2321
+ }
2322
+ .jx-grid-editor .jx-grid-checkbox {
2323
+ margin: 0 auto;
2324
+ accent-color: var(--accent);
2325
+ }
2326
+ .jx-grid-pill-editor .jx-grid-pills {
2327
+ display: flex;
2328
+ flex-wrap: wrap;
2329
+ gap: 2px;
2330
+ align-items: center;
2331
+ width: 100%;
2332
+ background: var(--bg);
2333
+ border: 1px solid var(--accent);
2334
+ border-radius: var(--spectrum-corner-radius-75, 2px);
2335
+ padding: 1px 4px;
2336
+ }
2337
+ .jx-grid-pill-input {
2338
+ flex: 1;
2339
+ min-width: 60px;
2340
+ background: transparent;
2341
+ border: none;
2342
+ /* Pointer focus only — the keyboard ring is restored below. */
2343
+ outline: none;
2344
+ color: var(--fg);
2345
+ font: inherit;
2346
+ }
2347
+
2348
+ .jx-grid-pill-input:focus-visible {
2349
+ outline: 2px solid var(--accent);
2350
+ outline-offset: -1px;
2351
+ }
2352
+ .jx-grid-chip-x {
2353
+ background: none;
2354
+ border: none;
2355
+ color: inherit;
2356
+ cursor: pointer;
2357
+ padding: 0 0 0 4px;
2358
+ font: inherit;
2359
+ line-height: 1;
2360
+ }
2361
+ .jx-grid-chip-x:hover {
2362
+ color: var(--danger);
2363
+ }
2364
+ .jx-grid-cell-popover-body {
2365
+ display: flex;
2366
+ flex-direction: column;
2367
+ gap: 8px;
2368
+ padding: 10px;
2369
+ min-width: 260px;
2370
+ }
2371
+ .jx-grid-cell-popover-title {
2372
+ font-weight: 600;
2373
+ font-size: var(--spectrum-font-size-75, 12px);
2374
+ }
2375
+ .jx-grid-cell-popover-hint {
2376
+ color: var(--fg-dim);
2377
+ font-size: var(--spectrum-font-size-50, 11px);
2378
+ }
2379
+ .jx-grid-cell-popover-actions {
2380
+ display: flex;
2381
+ justify-content: flex-end;
2382
+ }
2383
+ .jx-grid-cell-popover .jx-grid-select,
2384
+ .jx-grid-cell-popover .jx-grid-input,
2385
+ .jx-grid-view-popover .jx-grid-input {
2386
+ width: 100%;
2387
+ background: var(--bg);
2388
+ color: var(--fg);
2389
+ border: 1px solid var(--border);
2390
+ border-radius: var(--spectrum-corner-radius-75, 2px);
2391
+ padding: 3px 6px;
2392
+ font: inherit;
2393
+ }
2394
+
2395
+ /* Saved views — one popover for the four facets a view is made of (plan §12 P7.2). The name of the
2396
+ applied view is on the toolbar button, so the control says what is on screen before it is
2397
+ opened. */
2398
+ .jx-grid-view-button {
2399
+ max-width: 160px;
2400
+ overflow: hidden;
2401
+ text-overflow: ellipsis;
2402
+ white-space: nowrap;
2403
+ }
2404
+ .jx-grid-view-popover .jx-grid-cell-popover-body {
2405
+ min-width: 280px;
2406
+ max-height: 60vh;
2407
+ overflow-y: auto;
2408
+ }
2409
+ .jx-grid-view-empty {
2410
+ color: var(--fg-dim);
2411
+ font-size: var(--spectrum-font-size-50, 11px);
2412
+ }
2413
+ .jx-grid-view-row {
2414
+ display: flex;
2415
+ align-items: center;
2416
+ gap: 4px;
2417
+ }
2418
+ .jx-grid-view-name {
2419
+ flex: 1;
2420
+ text-align: left;
2421
+ background: none;
2422
+ border: none;
2423
+ color: var(--fg);
2424
+ font: inherit;
2425
+ padding: 3px 6px;
2426
+ border-radius: var(--spectrum-corner-radius-75, 2px);
2427
+ cursor: pointer;
2428
+ }
2429
+ .jx-grid-view-name:hover {
2430
+ background: var(--bg-hover);
2431
+ }
2432
+ .jx-grid-view-name.is-active {
2433
+ font-weight: 600;
2434
+ background: var(--bg-selected);
2435
+ }
2436
+ .jx-grid-view-check {
2437
+ display: flex;
2438
+ align-items: center;
2439
+ gap: 6px;
2440
+ font-size: var(--spectrum-font-size-75, 12px);
2441
+ }
2442
+ .jx-grid-sort-field,
2443
+ .jx-grid-sort-dir,
2444
+ .jx-grid-group-field {
2445
+ width: 100%;
2446
+ }
2447
+
2448
+ /* The redirect paste box (site-architecture.md §11.4's "import from _redirects or CSV"). Monospace
2449
+ because both formats are column-aligned in the file the author copied them out of. */
2450
+ .jx-redirect-import {
2451
+ width: 100%;
2452
+ min-width: 420px;
2453
+ font-family: var(--font-mono, monospace);
2454
+ background: var(--bg);
2455
+ color: var(--fg);
2456
+ border: 1px solid var(--border);
2457
+ border-radius: var(--spectrum-corner-radius-75, 2px);
2458
+ padding: 6px;
2459
+ resize: vertical;
2460
+ }
2461
+
2462
+ /* ─── ④ The toast host — the fourth overlay layer ─────────────────────────── */
2463
+ /* The stack is bottom-right and pinned to the layer, not to the app grid: a toast reports on an
2464
+ operation, and operations are started from every region — pinning it to one of them would put it
2465
+ furthest from wherever the reader was looking half the time. `pointer-events` is re-enabled per
2466
+ toast rather than on the stack, so the empty area of the layer never eats a canvas click. */
2467
+ .toast-stack {
2468
+ position: absolute;
2469
+ right: 12px;
2470
+ bottom: 36px;
2471
+ display: flex;
2472
+ flex-direction: column;
2473
+ gap: 8px;
2474
+ align-items: flex-end;
2475
+ max-width: min(420px, calc(100vw - 24px));
2476
+ }
2477
+ .toast {
2478
+ display: flex;
2479
+ align-items: center;
2480
+ gap: 8px;
2481
+ pointer-events: auto;
2482
+ padding: 8px 10px;
2483
+ border: 1px solid var(--border);
2484
+ border-left: 3px solid var(--fg-dim);
2485
+ border-radius: var(--radius);
2486
+ background: var(--bg-panel);
2487
+ color: var(--fg);
2488
+ font-size: var(--spectrum-font-size-75, 12px);
2489
+ box-shadow: 0 4px 16px rgb(0 0 0 / 35%);
2490
+ animation: toast-in 180ms ease-out;
2491
+ }
2492
+ /* §13.3 clause 6: the app honours reduced motion itself, so the photograph shows what a
2493
+ reduced-motion reader actually sees rather than what a runner-injected freeze produced. */
2494
+ @media (prefers-reduced-motion: reduce) {
2495
+ .toast {
2496
+ animation: none;
2497
+ }
2498
+ }
2499
+ @keyframes toast-in {
2500
+ from {
2501
+ opacity: 0;
2502
+ transform: translateY(6px);
2503
+ }
2504
+ to {
2505
+ opacity: 1;
2506
+ transform: translateY(0);
2507
+ }
2508
+ }
2509
+ .toast--success {
2510
+ border-left-color: var(--success);
2511
+ }
2512
+ .toast--info {
2513
+ border-left-color: var(--accent);
2514
+ }
2515
+ .toast--warn {
2516
+ border-left-color: var(--warning);
2517
+ }
2518
+ .toast--error {
2519
+ border-left-color: var(--danger);
2520
+ }
2521
+ .toast-icon {
2522
+ flex: none;
2523
+ width: 14px;
2524
+ text-align: center;
2525
+ font-weight: 700;
2526
+ }
2527
+ .toast--success .toast-icon {
2528
+ color: var(--success);
2529
+ }
2530
+ .toast--info .toast-icon {
2531
+ color: var(--accent);
2532
+ }
2533
+ .toast--warn .toast-icon {
2534
+ color: var(--warning);
2535
+ }
2536
+ .toast--error .toast-icon {
2537
+ color: var(--danger);
2538
+ }
2539
+ .toast-message {
2540
+ flex: 1;
2541
+ min-width: 0;
2542
+ /* Four lines is a message that belongs in Problems, where it can be read at leisure. */
2543
+ overflow: hidden;
2544
+ display: -webkit-box;
2545
+ -webkit-box-orient: vertical;
2546
+ -webkit-line-clamp: 3;
2547
+ }
2548
+ /* The recovery button IS a command: its label is the command's title, so it is never a bare
2549
+ "Retry" that fails to say what would be retried. */
2550
+ .toast-action {
2551
+ flex: none;
2552
+ padding: 2px 8px;
2553
+ border: 1px solid var(--border);
2554
+ border-radius: var(--spectrum-corner-radius-75, 2px);
2555
+ background: transparent;
2556
+ color: var(--accent);
2557
+ font: inherit;
2558
+ cursor: pointer;
2559
+ }
2560
+ .toast-action:hover:not(:disabled) {
2561
+ background: var(--hover-bg);
2562
+ }
2563
+ .toast-action:disabled {
2564
+ color: var(--fg-dim);
2565
+ cursor: default;
2566
+ }
2567
+ .toast-dismiss {
2568
+ flex: none;
2569
+ width: 18px;
2570
+ height: 18px;
2571
+ padding: 0;
2572
+ border: none;
2573
+ border-radius: var(--spectrum-corner-radius-75, 2px);
2574
+ background: transparent;
2575
+ color: var(--fg-dim);
2576
+ font: inherit;
2577
+ line-height: 1;
2578
+ cursor: pointer;
2579
+ }
2580
+ .toast-dismiss:hover {
2581
+ color: var(--fg);
2582
+ background: var(--hover-bg);
2583
+ }
2584
+
2585
+ /* The consequence line inside a destructive confirmation — what this delete or rename breaks, and
2586
+ what survives it. Set apart from the question above it, because the question is a sentence the
2587
+ user already wrote in their head and this is the part they have not thought about. */
2588
+ .dialog-consequence {
2589
+ margin-top: 8px;
2590
+ color: var(--fg-dim);
2591
+ font-size: var(--spectrum-font-size-75, 12px);
2592
+ line-height: 1.5;
2593
+ }
2594
+
2595
+ /* A panel withholding a render because one of its own fields has focus (`panel-scheduler.ts`).
2596
+ The panel is deliberately stale — finishing your sentence beats being current — but it used to
2597
+ make that trade in silence, which is indistinguishable from a panel that has stopped working.
2598
+ Pinned to the panel's top edge rather than the viewport's, because it is that panel that is
2599
+ behind, and it retires itself on focusout when the withheld render finally lands. */
2600
+ [data-jx-stale] {
2601
+ position: relative;
2602
+ }
2603
+ [data-jx-stale]::before {
2604
+ content: "New changes — applied when you finish editing";
2605
+ position: absolute;
2606
+ z-index: 2;
2607
+ top: 0;
2608
+ right: 0;
2609
+ left: 0;
2610
+ padding: 3px 8px;
2611
+ background: var(--spectrum-yellow-400, #d8b400);
2612
+ color: var(--spectrum-gray-900, #000);
2613
+ font-size: var(--spectrum-font-size-50, 11px);
2614
+ line-height: 1.4;
2615
+ text-align: center;
2616
+ pointer-events: none;
2617
+ }
2618
+
2619
+ /* ─── The Entry editor (content/entry-editor.ts) ─────────────────────────────
2620
+ One content entry's fields, drawn by ui/schema-form.ts in a pane. Same
2621
+ pane-editor family as the Project Settings document above, so it borrows its
2622
+ metrics rather than inventing a second set. */
2623
+ .entry-editor {
2624
+ height: 100%;
2625
+ padding: 16px;
2626
+ overflow-y: auto;
2627
+ background: var(--bg-panel);
2628
+ }
2629
+ .entry-editor-header {
2630
+ display: flex;
2631
+ align-items: center;
2632
+ gap: 12px;
2633
+ margin-bottom: 16px;
2634
+ }
2635
+ .entry-editor-header h3 {
2636
+ margin: 0;
2637
+ font-size: var(--spectrum-font-size-100, 14px);
2638
+ font-weight: 600;
2639
+ }
2640
+ .entry-editor-collection {
2641
+ padding: 1px 8px;
2642
+ border-radius: var(--radius);
2643
+ background: var(--bg);
2644
+ color: var(--fg-dim);
2645
+ font-size: var(--spectrum-font-size-50, 11px);
2646
+ }
2647
+ .entry-draft-switch {
2648
+ margin-left: auto;
2649
+ }
2650
+ .entry-editor-fields {
2651
+ display: flex;
2652
+ flex-direction: column;
2653
+ }
2654
+ .entry-editor-note {
2655
+ margin: 0 0 12px;
2656
+ color: var(--fg-dim);
2657
+ font-size: var(--spectrum-font-size-75, 12px);
2658
+ line-height: 1.5;
2659
+ }
2660
+ .entry-editor-empty {
2661
+ display: flex;
2662
+ max-width: 46ch;
2663
+ flex-direction: column;
2664
+ align-items: flex-start;
2665
+ gap: 8px;
2666
+ color: var(--fg-dim);
2667
+ font-size: var(--spectrum-font-size-75, 12px);
2668
+ line-height: 1.5;
2669
+ }
2670
+
2671
+ /* The draft pill, on the tab chip. "Published" is deliberately as visible as
2672
+ "Draft": a state you can only see one half of is a state you cannot check. */
2673
+ .entry-pill {
2674
+ padding: 0 5px;
2675
+ border-radius: var(--radius);
2676
+ background: var(--bg);
2677
+ color: var(--fg-dim);
2678
+ font-size: var(--spectrum-font-size-50, 11px);
2679
+ line-height: 15px;
2680
+ white-space: nowrap;
2681
+ }
2682
+ .entry-pill--draft {
2683
+ background: var(--spectrum-yellow-400, #d8b400);
2684
+ color: var(--spectrum-gray-900, #000);
2685
+ }
2686
+
2687
+ /* ─── Locales section ─── */
2688
+ /* The raw BCP 47 tag beside the language's own name. Both are shown because they answer different
2689
+ questions — "which language is this" is the autonym, "what do I type in a path" is the tag, and a
2690
+ row showing only one of them sends the author to the docs to find the other. */
2691
+ .settings-locale-tag {
2692
+ margin-inline-start: auto;
2693
+ font-family: var(--font-mono);
2694
+ font-size: var(--spectrum-font-size-75, 12px);
2695
+ color: var(--fg-dim);
2696
+ }
2697
+ .settings-locale-name {
2698
+ flex: 1;
2699
+ min-width: 0;
2700
+ }
2701
+ .settings-default-locale,
2702
+ .settings-locale-routing {
2703
+ max-width: 320px;
2704
+ }