@jxsuite/studio 4.0.0 → 5.0.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 (613) hide show
  1. package/README.md +1 -1
  2. package/data/elements-meta.json +5 -15
  3. package/data/html-meta.json +51 -6
  4. package/dist/chunks/{2020-xp8vnwma.js → 2020-g79n01v9.js} +14 -14
  5. package/dist/chunks/action-group-sp6tna8v.js +118 -0
  6. package/dist/chunks/adapter-nj7tnjfn.js +13 -0
  7. package/dist/chunks/cf-account-picker-fyf63pmy.js +495 -0
  8. package/dist/chunks/cf-settings-71bv5zn9.js +20 -0
  9. package/dist/chunks/color-area-v17df7b8.js +154 -0
  10. package/dist/chunks/color-field-anwybnkn.js +208 -0
  11. package/dist/chunks/color-slider-44ez96fc.js +79 -0
  12. package/dist/chunks/color-xgg3kfw7.js +35 -0
  13. package/dist/chunks/combobox-5e7jev23.js +236 -0
  14. package/dist/chunks/components-2w1f35qs.js +18 -0
  15. package/dist/chunks/content-source-3wqeas45.js +46 -0
  16. package/dist/chunks/convert-to-repeater-d0cgnb6d.js +639 -0
  17. package/dist/chunks/dialog-s890b918.js +85 -0
  18. package/dist/chunks/editor-3qhbg51x.js +35 -0
  19. package/dist/chunks/entry-commands-d6g50j7s.js +42 -0
  20. package/dist/chunks/extension-sections-fy7q4fe9.js +651 -0
  21. package/dist/chunks/file-ops-3btj6st0.js +47 -0
  22. package/dist/chunks/files-ef8fgs3w.js +72 -0
  23. package/dist/chunks/format-host-3c33nwr8.js +40 -0
  24. package/dist/chunks/fs-events-13tj6sex.js +18 -0
  25. package/dist/chunks/git-panel-4wp2rn9b.js +49 -0
  26. package/dist/chunks/icons-yy10wk9r.js +402 -0
  27. package/dist/chunks/iframe-entry-15g3n6xv.js +114 -0
  28. package/dist/chunks/iframe-entry-b27vq81n.js +203 -0
  29. package/dist/chunks/iframe-entry-nbyxee1y.js +154 -0
  30. package/dist/chunks/iframe-host-jgesd924.js +115 -0
  31. package/dist/chunks/{index-nj44jpzj.js → index-mdmyx6s2.js} +11 -11
  32. package/dist/chunks/index-n4j7qxyr.js +109 -0
  33. package/dist/chunks/{javascript-q8kpmfah.js → javascript-xvrfrpkb.js} +8 -9
  34. package/dist/chunks/{jsonMode-dkr040ga.js → jsonMode-tyx2kj6p.js} +526 -527
  35. package/dist/chunks/jx-validate-j0wxk72w.js +15 -0
  36. package/dist/chunks/layers-1nq5evsh.js +29 -0
  37. package/dist/chunks/layers-panel-ar2gh90g.js +40 -0
  38. package/dist/chunks/listbox-6v2ac08j.js +44 -0
  39. package/dist/chunks/lit-html-m244w9nh.js +17 -0
  40. package/dist/chunks/media-picker-2qbetq73.js +33 -0
  41. package/dist/chunks/menu-q99sy9rf.js +285 -0
  42. package/dist/chunks/menu-rf7n72mf.js +14 -0
  43. package/dist/chunks/{monaco-binding-rj6xpx9y.js → monaco-binding-sw6en4dw.js} +12 -15
  44. package/dist/chunks/monaco-buffer-bhy3hb6m.js +24 -0
  45. package/dist/chunks/{monaco-setup-rws7k4br.js → monaco-setup-8r62fj6y.js} +27 -37
  46. package/dist/chunks/notify-628t0anh.js +21 -0
  47. package/dist/chunks/number-field-5cndyft8.js +72 -0
  48. package/dist/chunks/parse-0zx14y15.js +10 -0
  49. package/dist/chunks/platform-ts9cg1a4.js +15 -0
  50. package/dist/chunks/popover-47z3ytva.js +25 -0
  51. package/dist/chunks/publish-panel-98f7sr3g.js +27 -0
  52. package/dist/chunks/quick-search-srzz83k2.js +45 -0
  53. package/dist/chunks/references-n553f0e1.js +26 -0
  54. package/dist/chunks/right-panel-rrgx2dn3.js +45 -0
  55. package/dist/chunks/section-registry-5pq32t0q.js +25 -0
  56. package/dist/chunks/select-2r16ez41.js +49 -0
  57. package/dist/chunks/split-g7nm1rgb.js +191 -0
  58. package/dist/chunks/studio-0hqbpbd0.js +62 -0
  59. package/dist/chunks/studio-18avnhjp.js +2430 -0
  60. package/dist/chunks/{studio-kryvsw6j.js → studio-1k325pwf.js} +48 -48
  61. package/dist/chunks/{studio-hbtp0eh1.js → studio-25hkdrkw.js} +356 -85
  62. package/dist/chunks/studio-26d7myd1.js +258 -0
  63. package/dist/chunks/{studio-p8j86wag.js → studio-38emantv.js} +22 -5
  64. package/dist/chunks/studio-3gxv60tn.js +422 -0
  65. package/dist/chunks/{studio-8swrjbny.js → studio-3hxkd92t.js} +275 -163
  66. package/dist/chunks/studio-4m0haseg.js +185 -0
  67. package/dist/chunks/{studio-ynxwkrzd.js → studio-4wbb9ct0.js} +1953 -1785
  68. package/dist/chunks/{studio-gv8vvshc.js → studio-5523bpzt.js} +11 -11
  69. package/dist/chunks/{studio-5q69gfag.js → studio-57mf66w2.js} +1753 -2484
  70. package/dist/chunks/studio-5jy81t3s.js +17463 -0
  71. package/dist/chunks/studio-5rt7sqa0.js +1168 -0
  72. package/dist/chunks/studio-5te5tqng.js +81 -0
  73. package/dist/chunks/{studio-p4ngc046.js → studio-6ewqv390.js} +9 -9
  74. package/dist/chunks/{studio-9ab8gqsm.js → studio-6nzaktvy.js} +7 -7
  75. package/dist/chunks/studio-6xa21ej9.js +28 -0
  76. package/dist/chunks/{studio-5ehhackm.js → studio-727xh0e3.js} +19 -19
  77. package/dist/chunks/{studio-eenfkt4e.js → studio-79y5sz51.js} +52 -38
  78. package/dist/chunks/{studio-4q0wznzf.js → studio-7e11jpa9.js} +461 -145
  79. package/dist/chunks/{studio-q7v10cg2.js → studio-7r42c6ca.js} +17 -7
  80. package/dist/chunks/studio-7xptrg0j.js +954 -0
  81. package/dist/chunks/{studio-cft9r4r7.js → studio-81390n6f.js} +22 -22
  82. package/dist/chunks/{studio-q43a5y9h.js → studio-8jn5yhyn.js} +16 -16
  83. package/dist/chunks/studio-8qtrpzr3.js +839 -0
  84. package/dist/chunks/{studio-dg7zyt5x.js → studio-98b3z07n.js} +1 -1
  85. package/dist/chunks/studio-9xxz1q69.js +1356 -0
  86. package/dist/chunks/studio-akbww0j5.js +13615 -0
  87. package/dist/chunks/studio-arfpe389.js +195 -0
  88. package/dist/chunks/{studio-2zkz8evn.js → studio-az3zd49t.js} +473 -281
  89. package/dist/chunks/studio-cpvb2ed1.js +1171 -0
  90. package/dist/chunks/{studio-9r6j5ev1.js → studio-d0300636.js} +5078 -19
  91. package/dist/chunks/{studio-bgxt93ga.js → studio-d055c37e.js} +13 -13
  92. package/dist/chunks/studio-d1ja2x9r.js +362 -0
  93. package/dist/chunks/{studio-b9b6t1dg.js → studio-e1f24eff.js} +5664 -5666
  94. package/dist/chunks/{studio-4pqqxbrt.js → studio-em9nw8eh.js} +301 -112
  95. package/dist/chunks/studio-erdatzvp.js +1190 -0
  96. package/dist/chunks/{studio-g1wdche0.js → studio-esrxgwh6.js} +80 -80
  97. package/dist/chunks/studio-fabxk6r9.js +2811 -0
  98. package/dist/chunks/{studio-3n4ndrzh.js → studio-h4nvnjvz.js} +303 -303
  99. package/dist/chunks/studio-hhvs4sdg.js +195 -0
  100. package/dist/chunks/{studio-68n67094.js → studio-kcgff4r0.js} +15 -18
  101. package/dist/chunks/{studio-685s0ytq.js → studio-nqgawfks.js} +572 -572
  102. package/dist/chunks/{studio-xrapxwwc.js → studio-p1dw8wfw.js} +55 -29
  103. package/dist/chunks/studio-pm6hgy7r.js +4763 -0
  104. package/dist/chunks/studio-q0a3yk4n.js +33 -0
  105. package/dist/chunks/{studio-wcy8trfx.js → studio-q3x06vmj.js} +23 -22
  106. package/dist/chunks/studio-qahxvnan.js +111 -0
  107. package/dist/chunks/{studio-53n8bp04.js → studio-r6xmmtfh.js} +1 -1
  108. package/dist/chunks/{studio-kjjsjak4.js → studio-rkstz940.js} +3661 -6136
  109. package/dist/chunks/{studio-tvgyw9xw.js → studio-rnyf3f8e.js} +83 -250
  110. package/dist/chunks/studio-rpyah2ew.js +2805 -0
  111. package/dist/chunks/studio-rs76k67r.js +12 -0
  112. package/dist/chunks/{studio-yxrkyv8a.js → studio-s6z853aq.js} +12108 -11766
  113. package/dist/chunks/{studio-sf7zjgv1.js → studio-sgdc5pfc.js} +8 -8
  114. package/dist/chunks/studio-tb3ev01j.js +763 -0
  115. package/dist/chunks/{studio-t5wqwzdh.js → studio-tjjk7jvk.js} +1 -1
  116. package/dist/chunks/studio-vhv5tgxm.js +51 -0
  117. package/dist/chunks/{studio-htsf0w6m.js → studio-vz68yn9e.js} +31 -154
  118. package/dist/chunks/studio-wqpngpsk.js +174 -0
  119. package/dist/chunks/{studio-eesa1myv.js → studio-x3rty6tr.js} +58 -58
  120. package/dist/chunks/studio-xsykpvsh.js +8448 -0
  121. package/dist/chunks/{studio-92ab2jqe.js → studio-y9zedyjn.js} +14 -14
  122. package/dist/chunks/studio-yxa81f45.js +12 -0
  123. package/dist/chunks/swatch-group-t0n6h2rn.js +139 -0
  124. package/dist/chunks/tabs-wbp1cdws.js +156 -0
  125. package/dist/chunks/textfield-abk6qyee.js +73 -0
  126. package/dist/chunks/toast-780pvfbv.js +27 -0
  127. package/dist/chunks/toast-host-3sqv46sn.js +116 -0
  128. package/dist/chunks/toolbar-xbh5bhtr.js +194 -0
  129. package/dist/chunks/tooltip-eptb614w.js +369 -0
  130. package/dist/chunks/tree-a73p0pqm.js +367 -0
  131. package/dist/chunks/{tsMode-76kr53q0.js → tsMode-jy4m86rv.js} +83 -85
  132. package/dist/chunks/workspace-wrew8zk4.js +69 -0
  133. package/dist/chunks/{ws-client-6shc5rze.js → ws-client-ny4zc51r.js} +20 -22
  134. package/dist/iframe-entry.js +1812 -698
  135. package/dist/manifest.json +7 -0
  136. package/dist/studio.js +52900 -36573
  137. package/dist/workers/editor.worker.js +1040 -1085
  138. package/dist/workers/json.worker.js +1946 -1991
  139. package/dist/workers/ts.worker.js +4960 -5005
  140. package/favicon.ico +0 -0
  141. package/index.html +2 -0
  142. package/package.json +22 -55
  143. package/src/about/about-modal.ts +73 -123
  144. package/src/browse/library-commands.ts +20 -49
  145. package/src/browse/library-layouts.ts +87 -218
  146. package/src/browse/library-pane.ts +406 -438
  147. package/src/canvas/canvas-helpers.ts +0 -49
  148. package/src/canvas/canvas-live-render.ts +25 -2
  149. package/src/canvas/canvas-render.ts +666 -231
  150. package/src/canvas/canvas-surface.ts +0 -1
  151. package/src/canvas/canvas-utils.ts +310 -117
  152. package/src/canvas/dialog-path.ts +76 -0
  153. package/src/canvas/dialog-state.ts +67 -0
  154. package/src/canvas/diff-marks.ts +252 -0
  155. package/src/canvas/diff-toolbar.ts +349 -0
  156. package/src/canvas/diff-view.ts +123 -0
  157. package/src/canvas/edit-width-drag.ts +187 -0
  158. package/src/canvas/edit-width.ts +150 -0
  159. package/src/canvas/iframe-entry.ts +125 -8
  160. package/src/canvas/iframe-host.ts +271 -15
  161. package/src/canvas/iframe-interaction.ts +133 -13
  162. package/src/canvas/iframe-patch.ts +7 -1
  163. package/src/canvas/iframe-position.ts +5 -6
  164. package/src/canvas/iframe-protocol.ts +106 -5
  165. package/src/canvas/iframe-render.ts +373 -5
  166. package/src/canvas/iframe-slash.ts +2 -2
  167. package/src/canvas/iframe-subtree.ts +5 -8
  168. package/src/canvas/path-mapping.ts +25 -3
  169. package/src/canvas/popover-path.ts +106 -0
  170. package/src/canvas/popover-state.ts +155 -0
  171. package/src/canvas/surface-registry.ts +21 -10
  172. package/src/collab/presence-chips.ts +51 -73
  173. package/src/commands/app-commands.ts +10 -0
  174. package/src/commands/budget.ts +12 -0
  175. package/src/commands/command-args.ts +369 -6
  176. package/src/commands/defaults.ts +44 -14
  177. package/src/commands/live-context.ts +11 -5
  178. package/src/commands/reference.ts +12 -2
  179. package/src/commands/registry.ts +165 -8
  180. package/src/content/entry-commands.ts +16 -23
  181. package/src/content/entry-editor.ts +144 -101
  182. package/src/editor/canvas-slash-bridge.ts +2 -2
  183. package/src/editor/context-menu.ts +49 -200
  184. package/src/editor/convert-to-component.ts +42 -82
  185. package/src/editor/convert-to-repeater.ts +132 -173
  186. package/src/editor/inline-edit.ts +11 -0
  187. package/src/editor/shortcuts.ts +65 -26
  188. package/src/editor/slash-menu.ts +150 -157
  189. package/src/files/file-ops.ts +117 -11
  190. package/src/files/files.ts +949 -664
  191. package/src/files/json-layout.ts +474 -0
  192. package/src/files/media-paths.ts +13 -42
  193. package/src/files/media-usage.ts +41 -131
  194. package/src/files/serialize-document.ts +8 -1
  195. package/src/format/convert-file.ts +16 -10
  196. package/src/format/format-host.ts +50 -1
  197. package/src/github/github-auth.ts +71 -29
  198. package/src/github/github-publish.ts +57 -65
  199. package/src/grid/cell-editors.ts +46 -4
  200. package/src/grid/cell-popovers.ts +65 -62
  201. package/src/grid/grid-open.ts +86 -64
  202. package/src/grid/grid-panel.ts +390 -469
  203. package/src/grid/redirects-grid.ts +40 -44
  204. package/src/hosting/document.ts +2 -0
  205. package/src/hosting/layout.ts +10 -0
  206. package/src/i18n/i18n-commands.ts +127 -62
  207. package/src/media/media-pane.ts +83 -133
  208. package/src/new-project/add-repo-modal.ts +125 -176
  209. package/src/new-project/import-tab.ts +201 -250
  210. package/src/new-project/location-fields.ts +101 -165
  211. package/src/new-project/new-project-modal.ts +376 -367
  212. package/src/packages/jxsuite-update.ts +76 -18
  213. package/src/panels/activity-panel.ts +137 -104
  214. package/src/panels/ai-chat/chat-markdown.ts +15 -13
  215. package/src/panels/ai-chat/chat-view.ts +307 -472
  216. package/src/panels/ai-chat/composer.ts +175 -153
  217. package/src/panels/ai-chat/sessions-view.ts +31 -62
  218. package/src/panels/ai-panel.ts +210 -185
  219. package/src/panels/block-action-bar.ts +437 -643
  220. package/src/panels/bottom-dock.ts +112 -47
  221. package/src/panels/chat-panel.ts +19 -14
  222. package/src/panels/data-explorer.ts +141 -102
  223. package/src/panels/data-grid.ts +183 -150
  224. package/src/panels/dnd.ts +75 -20
  225. package/src/panels/editors.ts +26 -19
  226. package/src/panels/elements-panel.ts +243 -186
  227. package/src/panels/empty-state.ts +26 -42
  228. package/src/panels/events-panel.ts +950 -729
  229. package/src/panels/formula-workspace.ts +434 -207
  230. package/src/panels/frontmatter-fields.ts +185 -153
  231. package/src/panels/frontmatter-panel.ts +411 -187
  232. package/src/panels/git-diff-open.ts +148 -0
  233. package/src/panels/git-panel.ts +679 -605
  234. package/src/panels/head-panel.ts +617 -435
  235. package/src/panels/i18n-panel.ts +153 -133
  236. package/src/panels/imports-panel.ts +388 -414
  237. package/src/panels/jump-bar.ts +174 -147
  238. package/src/panels/layers-panel.ts +785 -671
  239. package/src/panels/left-panel.ts +166 -94
  240. package/src/panels/navigator-panels.ts +1 -1
  241. package/src/panels/pane-context.ts +529 -677
  242. package/src/panels/pane-grid.ts +265 -241
  243. package/src/panels/panel-registry.ts +15 -4
  244. package/src/panels/problems-panel.ts +177 -99
  245. package/src/panels/properties-panel.ts +1525 -966
  246. package/src/panels/provenance.ts +31 -113
  247. package/src/panels/quick-search.ts +217 -172
  248. package/src/panels/right-panel.ts +135 -169
  249. package/src/panels/seo-modal.ts +346 -167
  250. package/src/panels/settings-menu.ts +109 -646
  251. package/src/panels/settings-pane.ts +102 -86
  252. package/src/panels/signals-panel.ts +1318 -1172
  253. package/src/panels/statement-editor.ts +556 -428
  254. package/src/panels/style-panel.ts +1367 -630
  255. package/src/panels/style-utils.ts +36 -32
  256. package/src/panels/stylebook-doc.ts +30 -73
  257. package/src/panels/stylebook-layers-panel.ts +202 -109
  258. package/src/panels/stylebook-panel.ts +124 -88
  259. package/src/panels/tab-strip.ts +385 -287
  260. package/src/platforms/cloud.ts +347 -86
  261. package/src/platforms/devserver.ts +13 -0
  262. package/src/publish/deploy-checklist.ts +124 -78
  263. package/src/publish/publish-commands.ts +4 -12
  264. package/src/publish/publish-panel.ts +165 -299
  265. package/src/services/a11y-report.ts +100 -43
  266. package/src/services/ai-command-tools.ts +468 -0
  267. package/src/services/ai-import-tools.ts +50 -12
  268. package/src/services/ai-models.ts +108 -1
  269. package/src/services/ai-session-store.ts +6 -0
  270. package/src/services/ai-system-prompt.ts +110 -18
  271. package/src/services/ai-tools.ts +28 -143
  272. package/src/services/ai-write-report.ts +174 -0
  273. package/src/services/context-manager.ts +12 -1
  274. package/src/services/document-assistant.ts +50 -2
  275. package/src/services/idle.ts +16 -14
  276. package/src/services/live-surfaces.ts +237 -0
  277. package/src/services/model-uri.ts +75 -0
  278. package/src/services/notify.ts +63 -6
  279. package/src/services/popover-report.ts +325 -0
  280. package/src/services/surface-registry.ts +56 -0
  281. package/src/services/tool-executor.ts +17 -0
  282. package/src/settings/contexts-section.ts +301 -299
  283. package/src/settings/contributed-section.ts +361 -222
  284. package/src/settings/css-vars-editor.ts +320 -325
  285. package/src/settings/defs-editor.ts +572 -535
  286. package/src/settings/dependencies-editor.ts +79 -107
  287. package/src/settings/extension-commands.ts +379 -0
  288. package/src/settings/extension-rows.ts +113 -0
  289. package/src/settings/extensions-section.ts +287 -0
  290. package/src/settings/general-settings.ts +130 -181
  291. package/src/settings/head-editor.ts +10 -305
  292. package/src/settings/locales-section.ts +146 -196
  293. package/src/settings/preferences-accounts.ts +193 -12
  294. package/src/settings/preferences-dialog.ts +384 -307
  295. package/src/settings/project-sections.ts +108 -181
  296. package/src/settings/schema-field-ui.ts +11 -399
  297. package/src/settings/section-registry.ts +8 -1
  298. package/src/settings/settings-document.ts +31 -29
  299. package/src/shell/tree.ts +42 -87
  300. package/src/shell.ts +48 -36
  301. package/src/studio.ts +90 -67
  302. package/src/style/token-ref.ts +0 -39
  303. package/src/surfaces/about.json +263 -0
  304. package/src/surfaces/about.ts +163 -0
  305. package/src/surfaces/add-repo.json +486 -0
  306. package/src/surfaces/add-repo.ts +236 -0
  307. package/src/surfaces/ai-chat.json +2185 -0
  308. package/src/surfaces/ai-chat.ts +549 -0
  309. package/src/surfaces/ai-credentials-form.json +332 -0
  310. package/src/surfaces/ai-credentials-form.ts +151 -0
  311. package/src/surfaces/ai-managed-connect.json +108 -0
  312. package/src/surfaces/ai-managed-connect.ts +123 -0
  313. package/src/surfaces/ai-model-picker.json +114 -0
  314. package/src/surfaces/ai-model-picker.ts +139 -0
  315. package/src/surfaces/block-action-bar.json +640 -0
  316. package/src/surfaces/block-action-bar.ts +368 -0
  317. package/src/surfaces/bottom-dock.json +154 -0
  318. package/src/surfaces/bottom-dock.ts +125 -0
  319. package/src/surfaces/canvas-stage.json +444 -0
  320. package/src/surfaces/canvas-stage.ts +253 -0
  321. package/src/surfaces/cf-account-picker.json +300 -0
  322. package/src/surfaces/cf-account-picker.ts +214 -0
  323. package/src/surfaces/commandbar.json +984 -0
  324. package/src/{panels/toolbar.ts → surfaces/commandbar.ts} +414 -389
  325. package/src/surfaces/convert-repeater.json +309 -0
  326. package/src/surfaces/convert-repeater.ts +276 -0
  327. package/src/surfaces/data-actions.json +157 -0
  328. package/src/surfaces/data-actions.ts +115 -0
  329. package/src/surfaces/dialog.json +289 -0
  330. package/src/surfaces/dialog.ts +343 -0
  331. package/src/surfaces/diff-toolbar.json +266 -0
  332. package/src/surfaces/diff-toolbar.ts +139 -0
  333. package/src/surfaces/doc-header.json +739 -0
  334. package/src/surfaces/doc-header.ts +223 -0
  335. package/src/surfaces/empty-state.json +152 -0
  336. package/src/surfaces/empty-state.ts +173 -0
  337. package/src/surfaces/entry-editor.json +281 -0
  338. package/src/surfaces/entry-editor.ts +191 -0
  339. package/src/surfaces/expression-editor.json +977 -0
  340. package/src/surfaces/expression-editor.ts +266 -0
  341. package/src/surfaces/files-panel.json +592 -0
  342. package/src/surfaces/files-panel.ts +301 -0
  343. package/src/surfaces/formula-palette.json +364 -0
  344. package/src/surfaces/formula-palette.ts +340 -0
  345. package/src/surfaces/git-panel.json +1822 -0
  346. package/src/surfaces/git-panel.ts +272 -0
  347. package/src/surfaces/github-auth.json +112 -0
  348. package/src/surfaces/github-auth.ts +139 -0
  349. package/src/surfaces/github-publish.json +206 -0
  350. package/src/surfaces/github-publish.ts +169 -0
  351. package/src/surfaces/grid-cell.json +218 -0
  352. package/src/surfaces/grid-cell.ts +120 -0
  353. package/src/surfaces/grid-open.json +147 -0
  354. package/src/surfaces/grid-open.ts +87 -0
  355. package/src/surfaces/grid-panel.json +706 -0
  356. package/src/surfaces/grid-panel.ts +206 -0
  357. package/src/surfaces/grid-replace.json +179 -0
  358. package/src/surfaces/grid-replace.ts +89 -0
  359. package/src/surfaces/grid-views.json +446 -0
  360. package/src/surfaces/grid-views.ts +172 -0
  361. package/src/surfaces/inspector-dock.json +187 -0
  362. package/src/surfaces/inspector-dock.ts +161 -0
  363. package/src/surfaces/jump-bar.json +243 -0
  364. package/src/surfaces/jump-bar.ts +129 -0
  365. package/src/surfaces/jxsuite-update.json +146 -0
  366. package/src/surfaces/jxsuite-update.ts +149 -0
  367. package/src/surfaces/library-pane.json +1509 -0
  368. package/src/surfaces/library-pane.ts +363 -0
  369. package/src/surfaces/logic-panel.json +1949 -0
  370. package/src/surfaces/logic-panel.ts +369 -0
  371. package/src/surfaces/logic-workspace.json +685 -0
  372. package/src/surfaces/logic-workspace.ts +238 -0
  373. package/src/surfaces/media-browser.json +303 -0
  374. package/src/surfaces/media-browser.ts +145 -0
  375. package/src/surfaces/media-field.json +163 -0
  376. package/src/surfaces/media-field.ts +116 -0
  377. package/src/surfaces/media-pane.json +513 -0
  378. package/src/surfaces/media-pane.ts +197 -0
  379. package/src/surfaces/menu.json +232 -0
  380. package/src/surfaces/menu.ts +375 -0
  381. package/src/surfaces/navigator-dock.json +113 -0
  382. package/src/surfaces/navigator-dock.ts +130 -0
  383. package/src/surfaces/new-project.json +1654 -0
  384. package/src/surfaces/new-project.ts +411 -0
  385. package/src/surfaces/palette.json +535 -0
  386. package/src/surfaces/pane-context.json +1497 -0
  387. package/src/surfaces/pane-context.ts +513 -0
  388. package/src/surfaces/pane-grid.json +188 -0
  389. package/src/surfaces/pane-grid.ts +250 -0
  390. package/src/surfaces/panel-activity.json +563 -0
  391. package/src/surfaces/panel-activity.ts +187 -0
  392. package/src/surfaces/panel-data.json +141 -0
  393. package/src/surfaces/panel-data.ts +156 -0
  394. package/src/surfaces/panel-deploy-checklist.json +283 -0
  395. package/src/surfaces/panel-deploy-checklist.ts +175 -0
  396. package/src/surfaces/panel-elements.json +367 -0
  397. package/src/surfaces/panel-elements.ts +175 -0
  398. package/src/surfaces/panel-i18n.json +569 -0
  399. package/src/surfaces/panel-i18n.ts +212 -0
  400. package/src/surfaces/panel-imports.json +780 -0
  401. package/src/surfaces/panel-imports.ts +209 -0
  402. package/src/surfaces/panel-outline.json +734 -0
  403. package/src/surfaces/panel-outline.ts +326 -0
  404. package/src/surfaces/panel-page.json +1017 -0
  405. package/src/surfaces/panel-page.ts +240 -0
  406. package/src/surfaces/panel-problems.json +497 -0
  407. package/src/surfaces/panel-problems.ts +157 -0
  408. package/src/surfaces/panel-signals.json +1973 -0
  409. package/src/surfaces/panel-signals.ts +436 -0
  410. package/src/surfaces/panel-stylebook-layers.json +317 -0
  411. package/src/surfaces/panel-stylebook-layers.ts +155 -0
  412. package/src/surfaces/preferences.json +850 -0
  413. package/src/surfaces/preferences.ts +332 -0
  414. package/src/surfaces/progress-modal.json +110 -0
  415. package/src/surfaces/progress-modal.ts +150 -0
  416. package/src/surfaces/properties-panel.json +1578 -0
  417. package/src/surfaces/properties-panel.ts +337 -0
  418. package/src/surfaces/publish.json +945 -0
  419. package/src/surfaces/publish.ts +392 -0
  420. package/src/surfaces/push-plan.json +110 -0
  421. package/src/surfaces/push-plan.ts +87 -0
  422. package/src/surfaces/rail.json +255 -0
  423. package/src/surfaces/rail.ts +206 -0
  424. package/src/surfaces/reference-field.json +191 -0
  425. package/src/surfaces/reference-field.ts +168 -0
  426. package/src/surfaces/schema-builder.json +1011 -0
  427. package/src/surfaces/schema-builder.ts +181 -0
  428. package/src/surfaces/schema-form.json +1013 -0
  429. package/src/surfaces/schema-form.ts +287 -0
  430. package/src/surfaces/secret-field.json +60 -0
  431. package/src/surfaces/secret-field.ts +146 -0
  432. package/src/surfaces/seo.json +932 -0
  433. package/src/surfaces/seo.ts +334 -0
  434. package/src/surfaces/settings-contexts.json +538 -0
  435. package/src/surfaces/settings-contexts.ts +196 -0
  436. package/src/surfaces/settings-contributed.json +489 -0
  437. package/src/surfaces/settings-contributed.ts +199 -0
  438. package/src/surfaces/settings-css-vars.json +820 -0
  439. package/src/surfaces/settings-css-vars.ts +199 -0
  440. package/src/surfaces/settings-defs.json +1363 -0
  441. package/src/surfaces/settings-defs.ts +232 -0
  442. package/src/surfaces/settings-deploy.json +108 -0
  443. package/src/surfaces/settings-deploy.ts +135 -0
  444. package/src/surfaces/settings-extensions.json +486 -0
  445. package/src/surfaces/settings-extensions.ts +201 -0
  446. package/src/surfaces/settings-head.json +779 -0
  447. package/src/surfaces/settings-head.ts +397 -0
  448. package/src/surfaces/settings-locales.json +420 -0
  449. package/src/surfaces/settings-locales.ts +137 -0
  450. package/src/surfaces/settings-overview.json +423 -0
  451. package/src/surfaces/settings-overview.ts +218 -0
  452. package/src/surfaces/settings-packages.json +549 -0
  453. package/src/surfaces/settings-packages.ts +158 -0
  454. package/src/surfaces/settings-pane.json +147 -0
  455. package/src/surfaces/settings-pane.ts +150 -0
  456. package/src/surfaces/settings-rawjson.json +104 -0
  457. package/src/surfaces/settings-rawjson.ts +107 -0
  458. package/src/surfaces/shell.json +99 -0
  459. package/src/surfaces/shell.ts +30 -0
  460. package/src/surfaces/slash-menu.json +180 -0
  461. package/src/surfaces/slash-menu.ts +272 -0
  462. package/src/surfaces/statements.json +607 -0
  463. package/src/surfaces/statements.ts +238 -0
  464. package/src/surfaces/statusbar.json +94 -0
  465. package/src/{panels → surfaces}/statusbar.ts +163 -90
  466. package/src/surfaces/style-panel.json +1643 -0
  467. package/src/surfaces/style-panel.ts +338 -0
  468. package/src/surfaces/stylebook-chrome.json +122 -0
  469. package/src/surfaces/stylebook-chrome.ts +122 -0
  470. package/src/surfaces/tab-strip.json +448 -0
  471. package/src/surfaces/tab-strip.ts +200 -0
  472. package/src/surfaces/target-line.json +419 -0
  473. package/src/surfaces/target-line.ts +349 -0
  474. package/src/surfaces/toasts.json +189 -0
  475. package/src/surfaces/welcome.json +571 -0
  476. package/src/surfaces/welcome.ts +338 -0
  477. package/src/tabs/project-config.ts +71 -15
  478. package/src/tabs/tab.ts +52 -1
  479. package/src/types.ts +49 -3
  480. package/src/ui/ai-credentials-form.ts +104 -100
  481. package/src/ui/ai-managed-connect.ts +116 -49
  482. package/src/ui/ai-model-picker.ts +102 -47
  483. package/src/ui/cf-account-picker.ts +135 -0
  484. package/src/ui/color-selector.ts +80 -301
  485. package/src/ui/dynamic-slot.ts +43 -283
  486. package/src/ui/expression-editor.ts +797 -576
  487. package/src/ui/field-input.ts +8 -181
  488. package/src/ui/form-controls.ts +838 -366
  489. package/src/ui/formula-chips.ts +80 -85
  490. package/src/ui/kit.ts +33 -0
  491. package/src/ui/layers.ts +293 -593
  492. package/src/ui/media-picker.ts +203 -284
  493. package/src/ui/panel-resize.ts +251 -64
  494. package/src/ui/popover-surface.ts +153 -0
  495. package/src/ui/progress-modal.ts +22 -60
  496. package/src/ui/regions.ts +13 -7
  497. package/src/ui/schema-form.ts +906 -440
  498. package/src/ui/surface.ts +122 -0
  499. package/src/ui/unit-selector.ts +15 -131
  500. package/src/ui/value-source.ts +14 -0
  501. package/src/ui/virtual-window.ts +88 -9
  502. package/src/utils/canvas-media.ts +72 -0
  503. package/src/utils/edit-display.ts +7 -2
  504. package/src/utils/element-selectors.ts +69 -0
  505. package/src/utils/link-target.ts +2 -2
  506. package/src/utils/studio-utils.ts +0 -10
  507. package/src/view.ts +15 -0
  508. package/src/workspace/pane-derive.ts +36 -14
  509. package/src/workspace/workspace.ts +15 -6
  510. package/styles/canvas.css +72 -467
  511. package/styles/forced-colors.css +48 -82
  512. package/styles/forced-colors.json +41 -0
  513. package/styles/inspector.css +2 -1301
  514. package/styles/overlays.css +96 -2823
  515. package/styles/panels.css +6 -1423
  516. package/styles/shell-frame.css +272 -0
  517. package/styles/shell-frame.json +227 -0
  518. package/styles/shell.css +0 -1532
  519. package/styles/tokens.css +65 -136
  520. package/styles/tokens.json +84 -0
  521. package/dist/chunks/Overlay.dev-723bv0df.js +0 -23
  522. package/dist/chunks/adapter-jkcyhgtr.js +0 -14
  523. package/dist/chunks/cf-settings-45fgyx8y.js +0 -21
  524. package/dist/chunks/components-zmx10t62.js +0 -21
  525. package/dist/chunks/content-source-t88vb2dr.js +0 -49
  526. package/dist/chunks/convert-to-repeater-dhw1nrz9.js +0 -268
  527. package/dist/chunks/editor-cptq5jp1.js +0 -37
  528. package/dist/chunks/entry-commands-6z6bhxg0.js +0 -46
  529. package/dist/chunks/extension-sections-3ydgjbdy.js +0 -311
  530. package/dist/chunks/file-ops-rskmhxyq.js +0 -48
  531. package/dist/chunks/files-0cratsr0.js +0 -92
  532. package/dist/chunks/flow-qbfgrpeh.js +0 -634
  533. package/dist/chunks/focus-trap.esm-ggawf1hy.js +0 -1024
  534. package/dist/chunks/focus-visible-6eg70z18.js +0 -167
  535. package/dist/chunks/format-host-tgcmfs4p.js +0 -43
  536. package/dist/chunks/fs-events-hrrg328g.js +0 -21
  537. package/dist/chunks/git-panel-0yywyk76.js +0 -58
  538. package/dist/chunks/index-zqxmqxmh.js +0 -109
  539. package/dist/chunks/jx-validate-8q2g05x1.js +0 -19
  540. package/dist/chunks/layers-panel-z3tqe5cd.js +0 -67
  541. package/dist/chunks/layers-q75tj2mf.js +0 -45
  542. package/dist/chunks/lit-html-j055mkh8.js +0 -22
  543. package/dist/chunks/monaco-buffer-dqw0xxpx.js +0 -25
  544. package/dist/chunks/notify-yjm79n4s.js +0 -30
  545. package/dist/chunks/parse-24d0gay3.js +0 -19
  546. package/dist/chunks/platform-ba1j1gbh.js +0 -16
  547. package/dist/chunks/publish-panel-54jvhskq.js +0 -28
  548. package/dist/chunks/quick-search-cgfmjwq5.js +0 -65
  549. package/dist/chunks/references-3qx8fkyp.js +0 -29
  550. package/dist/chunks/right-panel-cqp8bc4v.js +0 -46
  551. package/dist/chunks/section-registry-sx1ykvkw.js +0 -30
  552. package/dist/chunks/sp-overlay.dev-yztmtrs1.js +0 -18
  553. package/dist/chunks/sp-popover.dev-n2etmqdp.js +0 -9
  554. package/dist/chunks/sp-progress-circle.dev-hryhj0es.js +0 -15
  555. package/dist/chunks/sp-tooltip.dev-xcvpnqr0.js +0 -15
  556. package/dist/chunks/sp-tray.dev-tkbscm06.js +0 -199
  557. package/dist/chunks/studio-0a5qrh01.js +0 -3
  558. package/dist/chunks/studio-18j3bmcz.js +0 -14
  559. package/dist/chunks/studio-1hbqnt19.js +0 -1823
  560. package/dist/chunks/studio-4rzyrtjz.js +0 -426
  561. package/dist/chunks/studio-5rywrkxz.js +0 -1903
  562. package/dist/chunks/studio-7afd21nw.js +0 -67
  563. package/dist/chunks/studio-7nte2hj4.js +0 -613
  564. package/dist/chunks/studio-8jpzqk5s.js +0 -128
  565. package/dist/chunks/studio-8q517dfr.js +0 -24
  566. package/dist/chunks/studio-9c4k4vhv.js +0 -357
  567. package/dist/chunks/studio-9n4mrmnb.js +0 -184
  568. package/dist/chunks/studio-a0tswy0w.js +0 -58
  569. package/dist/chunks/studio-ahjfdy6e.js +0 -387
  570. package/dist/chunks/studio-ahnzd9rg.js +0 -23
  571. package/dist/chunks/studio-bw5dz6km.js +0 -608
  572. package/dist/chunks/studio-cb12yz9w.js +0 -15055
  573. package/dist/chunks/studio-d1ks410h.js +0 -175
  574. package/dist/chunks/studio-eqq1w638.js +0 -113
  575. package/dist/chunks/studio-ex8zyp98.js +0 -1813
  576. package/dist/chunks/studio-h4rxscfc.js +0 -10
  577. package/dist/chunks/studio-kyh9avvv.js +0 -28
  578. package/dist/chunks/studio-kyk2v92a.js +0 -659
  579. package/dist/chunks/studio-m3hwn7y1.js +0 -120
  580. package/dist/chunks/studio-mmv72a27.js +0 -4344
  581. package/dist/chunks/studio-n8b9wqwy.js +0 -291
  582. package/dist/chunks/studio-pdfjntbk.js +0 -6939
  583. package/dist/chunks/studio-qq6jym04.js +0 -53
  584. package/dist/chunks/studio-r1r7afxx.js +0 -1066
  585. package/dist/chunks/studio-rdx8jcxy.js +0 -83
  586. package/dist/chunks/studio-rn9ta2mz.js +0 -111
  587. package/dist/chunks/studio-t7qb9db8.js +0 -665
  588. package/dist/chunks/studio-tmc5emrw.js +0 -8
  589. package/dist/chunks/studio-txwkm6p9.js +0 -12
  590. package/dist/chunks/studio-v38hmvx1.js +0 -390
  591. package/dist/chunks/studio-vadzgkrz.js +0 -318
  592. package/dist/chunks/studio-wx5609xd.js +0 -341
  593. package/dist/chunks/studio-z6nw2ek2.js +0 -18
  594. package/dist/chunks/studio-zczps70q.js +0 -378
  595. package/dist/chunks/workspace-xpres40v.js +0 -89
  596. package/src/panels/activity-bar.ts +0 -251
  597. package/src/panels/panel-scheduler.ts +0 -219
  598. package/src/panels/style-inputs.ts +0 -237
  599. package/src/panels/target-line.ts +0 -274
  600. package/src/panels/welcome-screen.ts +0 -346
  601. package/src/ui/button-group.ts +0 -102
  602. package/src/ui/choice-field.ts +0 -72
  603. package/src/ui/field-row.ts +0 -249
  604. package/src/ui/formula-palette.ts +0 -213
  605. package/src/ui/icons.ts +0 -52
  606. package/src/ui/jx-theme.ts +0 -130
  607. package/src/ui/spectrum.ts +0 -340
  608. package/src/ui/value-selector.ts +0 -174
  609. package/src/ui/widgets.ts +0 -172
  610. /package/dist/chunks/{javascript-s56a8dpk.css → javascript-4abzjcy9.css} +0 -0
  611. /package/dist/chunks/{jsonMode-zr9sw0c7.css → jsonMode-vvmpmk34.css} +0 -0
  612. /package/dist/chunks/{monaco-setup-pav68602.css → monaco-setup-8vbyqnhr.css} +0 -0
  613. /package/dist/chunks/{tsMode-ef187txx.css → tsMode-hnxxb73h.css} +0 -0
@@ -32,18 +32,6 @@
32
32
  flex-direction: column;
33
33
  overflow: hidden;
34
34
  }
35
- /* Text labels, not icons: four words in a 280px dock, allowed to compress rather
36
- than to become anonymous. */
37
- .inspector-tabs sp-tabs {
38
- --mod-tabs-font-size: var(--spectrum-font-size-50, 11px);
39
-
40
- width: 100%;
41
- }
42
-
43
- /* ─── Inspector ──────────────────────────────── */
44
- .inspector-fields {
45
- padding: 4px 8px 8px;
46
- }
47
35
  .inspector-fields.hidden {
48
36
  display: none;
49
37
  }
@@ -56,70 +44,13 @@
56
44
  .field-label {
57
45
  width: 80px;
58
46
  flex-shrink: 0;
59
- font-size: var(--spectrum-font-size-50, 11px);
47
+ font-size: var(--jx-text-sm, 11px);
60
48
  color: var(--fg-dim);
61
49
  text-align: right;
62
50
  overflow: hidden;
63
51
  text-overflow: ellipsis;
64
52
  white-space: nowrap;
65
53
  }
66
- .field-input {
67
- flex: 1;
68
- min-width: 0;
69
- padding: 3px 6px;
70
- font: inherit;
71
- font-size: var(--spectrum-font-size-50, 11px);
72
- color: var(--fg);
73
- background: var(--bg-input);
74
- border: 1px solid var(--border);
75
- border-radius: var(--radius);
76
- }
77
- .field-input:focus {
78
- border-color: var(--accent);
79
- }
80
- .field-input:focus-visible {
81
- outline: 2px solid var(--accent);
82
- outline-offset: -1px;
83
- }
84
- .field-input[type="checkbox"] {
85
- width: auto;
86
- flex: none;
87
- }
88
- textarea.field-input {
89
- resize: vertical;
90
- min-height: 60px;
91
- font-family: var(--font-mono);
92
- }
93
- /* Spectrum components inside field rows */
94
- .field-row sp-textfield,
95
- .field-row sp-picker {
96
- flex: 1;
97
- min-width: 0;
98
- }
99
- .field-row sp-textfield {
100
- --spectrum-textfield-height: 26px;
101
- }
102
- .field-row sp-picker {
103
- --spectrum-picker-min-width: 0;
104
- }
105
- .field-row sp-checkbox {
106
- flex: none;
107
- }
108
- .field-row sp-field-label {
109
- width: 80px;
110
- flex-shrink: 0;
111
- font-size: var(--spectrum-font-size-50, 11px);
112
- color: var(--fg-dim);
113
- text-align: right;
114
- }
115
- .signal-editor .field-row sp-field-label {
116
- width: 65px;
117
- font-size: 10px;
118
- }
119
- .signal-editor .field-row sp-textfield {
120
- --spectrum-textfield-height: 24px;
121
- }
122
-
123
54
  /* ─── Style editor (key-value list) ──────────── */
124
55
  .kv-row {
125
56
  display: flex;
@@ -134,18 +65,10 @@ textarea.field-input {
134
65
  flex: 1;
135
66
  min-width: 0;
136
67
  }
137
- .kv-del {
138
- width: 20px;
139
- text-align: center;
140
- cursor: pointer;
141
- color: var(--danger);
142
- font-size: 13px;
143
- line-height: 24px;
144
- }
145
68
  .kv-add {
146
69
  display: inline-block;
147
70
  padding: 2px 8px;
148
- font-size: var(--spectrum-font-size-50, 11px);
71
+ font-size: var(--jx-text-sm, 11px);
149
72
  cursor: pointer;
150
73
  color: var(--accent);
151
74
  }
@@ -153,140 +76,6 @@ textarea.field-input {
153
76
  text-decoration: underline;
154
77
  }
155
78
 
156
- /* ─── The Target Line (plan §6.1) ─────────────────────────────────────────────
157
- One sentence at the top of the Style tab, stating the compound coordinate an
158
- edit lands in: element · breakpoint · scheme variant · selector, then the
159
- scope chip. Every segment is a control, so every segment is a button with the
160
- chrome taken off — the row must read as a sentence, not as a toolbar, which is
161
- exactly what the three widgets it replaces failed to do. */
162
- .target-line {
163
- display: flex;
164
- align-items: center;
165
- gap: 4px;
166
- padding: 5px 8px;
167
- border-bottom: 1px solid var(--border);
168
- font-size: var(--spectrum-font-size-50, 11px);
169
- line-height: 1.4;
170
- }
171
- .tl-glyph {
172
- flex-shrink: 0;
173
- color: var(--accent);
174
- }
175
- .tl-segments {
176
- display: flex;
177
- flex-wrap: wrap;
178
- align-items: center;
179
- gap: 2px;
180
- min-width: 0;
181
- flex: 1;
182
- }
183
- .tl-sep {
184
- color: var(--fg-dim);
185
- opacity: 0.6;
186
- }
187
- .tl-seg {
188
- padding: 1px 3px;
189
- border: none;
190
- border-radius: var(--radius);
191
- background: none;
192
- color: var(--fg);
193
- font: inherit;
194
- font-family: var(--font-mono);
195
- cursor: pointer;
196
- }
197
- button.tl-seg:hover {
198
- background: var(--hover-bg);
199
- color: var(--accent);
200
- }
201
- button.tl-seg:focus-visible {
202
- outline: 2px solid var(--accent);
203
- outline-offset: -1px;
204
- }
205
- .tl-seg--element {
206
- color: var(--tag);
207
- }
208
- .tl-seg--media,
209
- .tl-seg--scheme {
210
- color: var(--fg-dim);
211
- }
212
- .tl-seg--selector {
213
- color: var(--signal);
214
- }
215
- .tl-selector-popover {
216
- max-height: 320px;
217
- overflow-y: auto;
218
- }
219
- .tl-selector-menu {
220
- min-width: 160px;
221
- }
222
- /* The scope chip. Element scope is ambient and reads as ambient; the two tag-wide
223
- scopes are the ones a reader has to notice before typing, so they carry weight. */
224
- .tl-scope {
225
- flex-shrink: 0;
226
- padding: 1px 6px;
227
- border: 1px solid var(--border);
228
- border-radius: 999px;
229
- color: var(--fg-dim);
230
- white-space: nowrap;
231
- }
232
- .tl-scope--document {
233
- border-color: var(--accent-50);
234
- color: var(--accent);
235
- }
236
- .tl-scope--project {
237
- border-color: var(--warning);
238
- color: var(--warning);
239
- }
240
- .tl-warning {
241
- padding: 6px 8px;
242
- border-bottom: 1px solid var(--border);
243
- border-left: 2px solid var(--warning);
244
- background: var(--bg-panel);
245
- font-size: var(--spectrum-font-size-50, 11px);
246
- }
247
- .tl-warning-text {
248
- margin: 0;
249
- color: var(--warning);
250
- }
251
- .tl-warning-action {
252
- margin-top: 4px;
253
- padding: 0;
254
- border: none;
255
- background: none;
256
- color: var(--accent);
257
- font: inherit;
258
- cursor: pointer;
259
- text-decoration: underline;
260
- }
261
- .tl-affected {
262
- margin: 4px 0 0;
263
- padding: 0;
264
- max-height: 140px;
265
- overflow-y: auto;
266
- list-style: none;
267
- }
268
- .tl-affected-row {
269
- display: flex;
270
- justify-content: space-between;
271
- gap: 8px;
272
- padding: 1px 0;
273
- color: var(--fg-dim);
274
- }
275
- .tl-affected-path {
276
- overflow: hidden;
277
- text-overflow: ellipsis;
278
- white-space: nowrap;
279
- font-family: var(--font-mono);
280
- }
281
- .tl-affected-count {
282
- flex-shrink: 0;
283
- font-family: var(--font-mono);
284
- }
285
- .tl-affected-empty {
286
- margin: 4px 0 0;
287
- color: var(--fg-dim);
288
- }
289
-
290
79
  /* ─── Provenance dots on a section heading (plan §6.2) ────────────────────────
291
80
  The chip itself is styled with the rest of the row vocabulary further down —
292
81
  one block, because Style and Component Props are the same chip in two
@@ -312,35 +101,13 @@ button.tl-seg:focus-visible {
312
101
  border: none;
313
102
  cursor: default;
314
103
  }
315
- .provenance-dots {
316
- display: inline-flex;
317
- align-items: center;
318
- gap: 3px;
319
- }
320
104
  /* Heading dots are the 7x7 size `.set-dot--section` established, so a section heading reads at the
321
105
  same weight it always did — it just now has up to three of them and a tally on hover. */
322
106
  .provenance-dots .set-dot {
323
107
  width: 7px;
324
108
  height: 7px;
325
109
  }
326
- .style-section-heading {
327
- display: flex;
328
- align-items: center;
329
- gap: 6px;
330
- }
331
110
 
332
- /* ─── Style sidebar (Spectrum accordion) ──────── */
333
- .style-sidebar sp-accordion {
334
- border: none;
335
- }
336
- .style-sidebar sp-accordion-item {
337
- --spectrum-accordion-item-header-font-size: var(--spectrum-font-size-50, 11px);
338
- }
339
- .style-sidebar sp-accordion-item [slot="heading"] {
340
- display: flex;
341
- align-items: center;
342
- gap: 4px;
343
- }
344
111
  .style-row {
345
112
  display: flex;
346
113
  flex-direction: column;
@@ -348,17 +115,6 @@ button.tl-seg:focus-visible {
348
115
  gap: 2px;
349
116
  padding: 2px 0;
350
117
  }
351
- .style-row--child {
352
- padding-left: 16px;
353
- }
354
- /* removed: .style-row--horizontal — all rows use top labels now */
355
- .style-row-label {
356
- display: flex;
357
- align-items: center;
358
- gap: 4px;
359
- font-size: 10px;
360
- color: var(--fg-dim);
361
- }
362
118
  .set-dot {
363
119
  display: inline-block;
364
120
  width: 6px;
@@ -372,397 +128,10 @@ button.tl-seg:focus-visible {
372
128
  .set-dot:hover {
373
129
  background: var(--danger);
374
130
  }
375
- .style-row--warning .style-row-label {
376
- color: var(--warning);
377
- }
378
- .style-row--warning .style-row-label::before {
379
- content: "⚠ ";
380
- }
381
- /* §7.1's third notification tier: a bad value, said AT the control that refuses it, for exactly as
382
- long as the value stays bad. A toast expires and a problem is a list entry somewhere else; this
383
- one is a property of the field, so it is styled as part of the row rather than as a floating
384
- surface. The left rule is what makes it read as belonging to the widget above it. */
385
- .style-row--invalid .style-row-label {
386
- color: var(--danger);
387
- }
388
- .style-row-error {
389
- margin: 2px 0 0;
390
- padding-left: 6px;
391
- border-left: 2px solid var(--danger);
392
- font-size: 10px;
393
- line-height: 1.35;
394
- color: var(--danger);
395
- }
396
- /* The repeat counter — "it refused me AGAIN" is otherwise indistinguishable from "the field is
397
- still red from last time" when the second attempt fails the same way. */
398
- .style-row-error-count {
399
- margin-left: 4px;
400
- font-family: var(--font-mono);
401
- opacity: 0.75;
402
- }
403
- .style-row > sp-textfield,
404
- .style-row > sp-number-field,
405
- .style-row > sp-picker,
406
- .style-row > sp-combobox,
407
- .style-row > textarea {
408
- width: 100%;
409
- }
410
- .style-input-color {
411
- display: flex;
412
- align-items: center;
413
- gap: 6px;
414
- flex: 1;
415
- min-width: 0;
416
- }
417
- .style-input-color sp-swatch {
418
- flex-shrink: 0;
419
- cursor: pointer;
420
- }
421
- .style-input-color sp-textfield {
422
- flex: 1;
423
- min-width: 0;
424
- }
425
- .color-popover-inner {
426
- display: flex;
427
- flex-direction: column;
428
- gap: 8px;
429
- width: 200px;
430
- overflow: hidden;
431
- }
432
- .color-popover-inner sp-textfield {
433
- width: 100%;
434
- }
435
- .color-popover-swatches-label {
436
- font-size: 10px;
437
- color: var(--spectrum-gray-600);
438
- text-transform: uppercase;
439
- letter-spacing: 0.05em;
440
- }
441
- .color-popover-inner sp-swatch-group {
442
- --mod-swatch-border-color: var(--spectrum-gray-400);
443
- }
444
- .font-token-item {
445
- display: flex;
446
- flex-direction: column;
447
- gap: 1px;
448
- }
449
- .font-token-preview {
450
- font-size: var(--spectrum-font-size-75, 12px);
451
- line-height: 1.3;
452
- }
453
- .font-token-name {
454
- font-size: 9px;
455
- color: var(--spectrum-gray-600);
456
- font-family: monospace;
457
- }
458
- /* jx-styled-combobox — dual-mode styled combobox component */
459
- jx-styled-combobox {
460
- display: contents;
461
- }
462
- jx-styled-combobox sp-picker {
463
- width: 100%;
464
- }
465
- .jx-combobox-group {
466
- display: inline-flex;
467
- position: relative;
468
- width: 100%;
469
- }
470
- .jx-combobox-group sp-textfield {
471
- flex: 1 1 auto;
472
- min-width: 0;
473
- --mod-textfield-border-start-end-radius: 0;
474
- --mod-textfield-border-end-end-radius: 0;
475
- margin-inline-end: calc(-1 * var(--spectrum-border-width-100, 1px));
476
- }
477
- .jx-combobox-group sp-picker-button {
478
- flex: 0 0 auto;
479
- --mod-picker-button-border-start-start-radius: 0;
480
- --mod-picker-button-border-end-start-radius: 0;
481
- --mod-picker-button-border-color: var(--spectrum-gray-400);
482
- }
483
- /* Number-unit compound input: textfield + picker-button */
484
- .style-input-number-unit {
485
- flex: 1;
486
- min-width: 0;
487
- }
488
- /* Combobox-like composite: textfield + picker-button, matching sp-combobox visually */
489
- .input-group {
490
- display: inline-flex;
491
- position: relative;
492
- width: 100%;
493
- }
494
- .input-group sp-textfield {
495
- flex: 1 1 auto;
496
- min-width: 0;
497
- /* Zero out the inline-end corners so the textfield abuts the picker-button */
498
- --mod-textfield-border-start-end-radius: 0;
499
- --mod-textfield-border-end-end-radius: 0;
500
- /* Pull textfield's border into the picker-button so they share one line */
501
- margin-inline-end: calc(-1 * var(--spectrum-border-width-100, 1px));
502
- }
503
- .input-group sp-picker-button {
504
- flex: 0 0 auto;
505
- /* Zero out the inline-start corners to abut the textfield */
506
- --mod-picker-button-border-start-start-radius: 0;
507
- --mod-picker-button-border-end-start-radius: 0;
508
- --mod-picker-button-border-color: var(--spectrum-gray-400);
509
- }
510
- .input-group.is-expression sp-picker-button {
511
- display: none;
512
- }
513
- .input-group.is-expression sp-textfield {
514
- --mod-textfield-text-color-default: var(--spectrum-accent-color-800);
515
- --mod-textfield-border-start-end-radius: var(--spectrum-corner-radius-100);
516
- --mod-textfield-border-end-end-radius: var(--spectrum-corner-radius-100);
517
- margin-inline-end: 0;
518
- }
519
- .style-shorthand-header {
520
- display: flex;
521
- align-items: center;
522
- gap: 4px;
523
- }
524
- .style-shorthand-header sp-textfield {
525
- flex: 1;
526
- min-width: 0;
527
- }
528
-
529
- /* Button-group + overflow picker-button combo */
530
- .button-group-combo {
531
- display: inline-flex;
532
- align-items: stretch;
533
- }
534
- .button-group-combo.has-overflow sp-action-group {
535
- --mod-actionbutton-border-radius: 0;
536
- }
537
- .button-group-combo sp-picker-button {
538
- flex: 0 0 auto;
539
- --mod-picker-button-border-start-start-radius: 0;
540
- --mod-picker-button-border-end-start-radius: 0;
541
- --mod-picker-button-border-color: var(--spectrum-gray-400);
542
- margin-inline-start: calc(-1 * var(--spectrum-border-width-100, 1px));
543
- }
544
- .button-group-combo sp-picker-button.has-selection {
545
- --mod-picker-button-background-color: var(--spectrum-accent-background-color-default);
546
- }
547
-
548
- /* ─── Grid section layout (Size panel) ─── */
549
- .style-section-body--grid {
550
- display: grid;
551
- grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
552
- gap: 6px 8px;
553
- }
554
131
  .style-section-body--grid .style-row {
555
132
  min-width: 0;
556
133
  overflow: hidden;
557
134
  }
558
-
559
- /* ─── Signals tab ────────────────────────────── */
560
- .signal-row {
561
- display: flex;
562
- align-items: center;
563
- gap: 4px;
564
- padding: 4px 8px;
565
- cursor: pointer;
566
- border-left: 2px solid transparent;
567
- user-select: none;
568
- }
569
- .signal-row:hover {
570
- background: var(--hover-bg);
571
- }
572
- .signal-row.expanded {
573
- background: var(--accent-10);
574
- border-left-color: var(--accent);
575
- }
576
- .signal-badge {
577
- padding: 0 4px;
578
- font-size: 10px;
579
- border-radius: var(--spectrum-corner-radius-75, 2px);
580
- font-weight: 600;
581
- flex-shrink: 0;
582
- min-width: 18px;
583
- text-align: center;
584
- }
585
- .signal-badge.state {
586
- background: color-mix(in srgb, var(--signal) 25%, transparent);
587
- color: var(--signal);
588
- }
589
- .signal-badge.computed {
590
- background: color-mix(in srgb, var(--success) 25%, transparent);
591
- color: var(--success);
592
- }
593
- .signal-badge.data {
594
- background: color-mix(in srgb, var(--tag) 25%, transparent);
595
- color: var(--tag);
596
- }
597
- .signal-badge.handler {
598
- background: color-mix(in srgb, var(--handler) 25%, transparent);
599
- color: var(--handler);
600
- }
601
- /* The NAME is what you came for, so it is the last thing to be elided. It used to sit at `flex: 1`
602
- beside a hint pinned at `flex-shrink: 0`, so a long-prototype row rendered as `re… ContentCollect…`
603
- — the summary intact and the identity gone. */
604
- .signal-name {
605
- flex: 1 1 auto;
606
- min-width: 8em;
607
- white-space: nowrap;
608
- font-family: var(--font-mono);
609
- font-size: var(--spectrum-font-size-50, 11px);
610
- overflow: hidden;
611
- text-overflow: ellipsis;
612
- }
613
- .signal-hint {
614
- font-size: 10px;
615
- color: var(--fg-dim);
616
- flex: 0 1 auto;
617
- min-width: 0;
618
- max-width: 64px;
619
- white-space: nowrap;
620
- overflow: hidden;
621
- text-overflow: ellipsis;
622
- }
623
- .signal-del {
624
- visibility: hidden;
625
- cursor: pointer;
626
- color: var(--danger);
627
- font-size: var(--spectrum-font-size-50, 11px);
628
- flex-shrink: 0;
629
- }
630
- .signal-row:hover .signal-del {
631
- visibility: visible;
632
- }
633
- .signal-editor {
634
- padding: 4px 8px 8px 26px;
635
- border-bottom: 1px solid var(--border);
636
- }
637
- /* Signals panel accordion (matches style-sidebar pattern) */
638
- .signals-panel sp-accordion {
639
- border: none;
640
- }
641
- .signals-panel sp-accordion-item {
642
- --spectrum-accordion-item-header-font-size: var(--spectrum-font-size-50, 11px);
643
- }
644
- .signals-add {
645
- display: flex;
646
- align-items: center;
647
- gap: 4px;
648
- padding: 6px 8px;
649
- }
650
-
651
- /* ─── Data explorer ──────────────────────────── */
652
- .data-explorer-toolbar {
653
- padding: 4px 8px;
654
- border-bottom: 1px solid var(--border);
655
- display: flex;
656
- justify-content: flex-end;
657
- }
658
- .data-refresh-btn {
659
- font-size: var(--spectrum-font-size-50, 11px);
660
- padding: 2px 8px;
661
- background: var(--bg-input);
662
- border: 1px solid var(--border);
663
- border-radius: var(--radius);
664
- color: var(--fg);
665
- cursor: pointer;
666
- }
667
- .data-refresh-btn:hover {
668
- border-color: var(--accent);
669
- }
670
- /* The Data panel's own row list is gone — the definition rows carry the resolved value now
671
- (plan §11.2). `.data-row`, `.data-row-header` and `.data-name` went with it; what is left here
672
- dresses the value INSIDE a `.signal-editor`. */
673
- .data-type {
674
- font-size: 10px;
675
- color: var(--fg-dim);
676
- flex-shrink: 0;
677
- }
678
- /* A truncation marker is a control, not a caption — it shows more of what the panel already has.
679
- Styled as the text it replaced so the tree does not sprout buttons, but focusable and hoverable
680
- so it reads as pressable. */
681
- .data-more {
682
- display: block;
683
- width: 100%;
684
- text-align: left;
685
- background: none;
686
- border: none;
687
- font: inherit;
688
- color: inherit;
689
- cursor: pointer;
690
- }
691
- .data-more:hover,
692
- .data-more:focus-visible {
693
- color: var(--accent);
694
- text-decoration: underline;
695
- }
696
-
697
- /* The resolved value, under the fields that define it. The rule above it is the seam between
698
- "what this is" and "what it became" — the two halves that used to be two panels. */
699
- .signal-live {
700
- margin-top: 8px;
701
- padding-top: 6px;
702
- border-top: 1px solid var(--border);
703
- }
704
- .signal-live-label {
705
- display: block;
706
- font-size: 10px;
707
- text-transform: uppercase;
708
- letter-spacing: 0.04em;
709
- color: var(--fg-dim);
710
- margin-bottom: 2px;
711
- }
712
- .data-tree {
713
- padding: 2px 0;
714
- max-height: 300px;
715
- overflow-y: auto;
716
- }
717
- .data-leaf,
718
- .data-branch {
719
- font-size: var(--spectrum-font-size-50, 11px);
720
- font-family: var(--font-mono, monospace);
721
- padding: 1px 8px;
722
- line-height: 1.5;
723
- white-space: nowrap;
724
- overflow: hidden;
725
- text-overflow: ellipsis;
726
- }
727
- .data-key {
728
- color: var(--data-key);
729
- }
730
- .data-value {
731
- color: var(--fg);
732
- }
733
- .data-null {
734
- color: var(--fg-dim);
735
- font-style: italic;
736
- }
737
- .data-string {
738
- color: var(--data-string);
739
- }
740
- .data-number {
741
- color: var(--data-number);
742
- }
743
- .data-boolean {
744
- color: var(--data-boolean);
745
- }
746
- .data-object-label {
747
- color: var(--fg-dim);
748
- font-style: italic;
749
- }
750
- .data-ellipsis {
751
- color: var(--fg-dim);
752
- font-style: italic;
753
- }
754
- /* PENDING IS A RESTING STATE, not progress. While you are editing, an automatic `Request` is
755
- deliberately not fetched — so a value that has not arrived is dim and STILL, and the pulse is
756
- kept for the one moment something is actually in flight. An animation that never stops is a
757
- spinner for a thing that is not loading, and it is why `probe.idle()` could never call this panel
758
- quiet: the screenshot lane timed out on "2 animation(s) running" in a panel at rest. */
759
- .data-pending {
760
- opacity: 0.55;
761
- }
762
- .signals-panel.is-refreshing .data-pending {
763
- opacity: 1;
764
- animation: pulse 1.5s ease-in-out infinite;
765
- }
766
135
  @keyframes pulse {
767
136
  0%,
768
137
  100% {
@@ -772,252 +141,10 @@ jx-styled-combobox sp-picker {
772
141
  opacity: 0.4;
773
142
  }
774
143
  }
775
- .field-check {
776
- width: auto;
777
- margin: 0;
778
- }
779
-
780
- /* ─── Binding toggle ─────────────────────────── */
781
- .bind-toggle {
782
- width: 20px;
783
- height: 20px;
784
- display: flex;
785
- align-items: center;
786
- justify-content: center;
787
- font-size: var(--spectrum-font-size-50, 11px);
788
- cursor: pointer;
789
- color: var(--fg-dim);
790
- border: 1px solid transparent;
791
- border-radius: var(--radius);
792
- flex-shrink: 0;
793
- }
794
- .bind-toggle:hover {
795
- color: var(--fg);
796
- background: var(--hover-bg);
797
- }
798
144
  .bind-toggle.bound {
799
145
  color: var(--accent);
800
146
  }
801
147
 
802
- /* ─── Events section ─────────────────────────── */
803
- .events-panel {
804
- padding: 8px;
805
- }
806
- .events-section {
807
- margin-bottom: 8px;
808
- }
809
- .declared-event-row {
810
- display: flex;
811
- gap: 6px;
812
- align-items: center;
813
- padding: 2px 0;
814
- font-size: var(--spectrum-font-size-50, 11px);
815
- }
816
- .event-code {
817
- font-family: monospace;
818
- color: var(--accent);
819
- }
820
- .event-source {
821
- color: var(--fg-dim);
822
- font-size: 10px;
823
- }
824
- .event-type {
825
- margin-left: auto;
826
- color: var(--fg-dim);
827
- font-size: 10px;
828
- }
829
- .event-binding {
830
- margin-bottom: 8px;
831
- }
832
- .event-row {
833
- display: flex;
834
- gap: 4px;
835
- align-items: center;
836
- }
837
- .event-name {
838
- flex: 1;
839
- min-width: 0;
840
- }
841
- .event-mode {
842
- width: 72px;
843
- flex-shrink: 0;
844
- }
845
- .event-handler {
846
- width: 100%;
847
- }
848
- .event-body-row {
849
- display: flex;
850
- gap: 4px;
851
- align-items: start;
852
- margin-top: 3px;
853
- }
854
- .event-body-row sp-textfield {
855
- flex: 1;
856
- font-size: var(--spectrum-font-size-50, 11px);
857
- }
858
-
859
- /* ── Usage ("Used on N pages →") ──────────────────────────────────────────────
860
- The reference index rendered in the inspector. The heading carries the count, so the rows are
861
- the answer's detail rather than its headline — collapsed by default, one row per referencing
862
- file, each a button that opens it. */
863
- .usage-note {
864
- color: var(--fg-dim);
865
- font-size: var(--spectrum-font-size-50, 11px);
866
- line-height: 1.5;
867
- padding: 2px 0;
868
- }
869
- .usage-row {
870
- display: flex;
871
- gap: 6px;
872
- align-items: center;
873
- width: 100%;
874
- padding: 3px 4px;
875
- border: none;
876
- border-radius: var(--radius);
877
- background: none;
878
- color: inherit;
879
- font: inherit;
880
- font-size: var(--spectrum-font-size-50, 11px);
881
- text-align: left;
882
- cursor: pointer;
883
- }
884
- .usage-row:hover,
885
- .usage-row:focus-visible {
886
- background: var(--hover-bg);
887
- }
888
- .usage-row-path {
889
- flex: 1;
890
- min-width: 0;
891
- overflow: hidden;
892
- text-overflow: ellipsis;
893
- white-space: nowrap;
894
- }
895
- .usage-row-count {
896
- flex-shrink: 0;
897
- color: var(--fg-dim);
898
- font-variant-numeric: tabular-nums;
899
- }
900
-
901
- /* ─── P5 · Provenance chips (UX-REDESIGN-PLAN §6.2) ─────────────────────────
902
- Four states, one vocabulary, reused in every cascade: `set` keeps the accent
903
- dot it has always been (see .set-dot above); `inherited` is amber and names
904
- its donor; `bound` is violet and names the signal or formula; `default`
905
- renders nothing at all, because a ghost dot on every unset row is 138 dots
906
- on the Style tab. Rendered by panels/provenance.ts:renderProvenanceChip, which
907
- ui/field-row.ts calls for every row that states its provenance. */
908
- .provenance-chip {
909
- flex-shrink: 0;
910
- }
911
- button.provenance-chip {
912
- display: inline-flex;
913
- align-items: center;
914
- max-width: 14ch;
915
- overflow: hidden;
916
- padding: 0 5px;
917
- border: 1px solid currentcolor;
918
- border-radius: var(--radius);
919
- background: transparent;
920
- font: inherit;
921
- font-size: 9px;
922
- line-height: 14px;
923
- white-space: nowrap;
924
- text-overflow: ellipsis;
925
- cursor: default;
926
- }
927
- button.provenance-chip:not(:disabled) {
928
- cursor: pointer;
929
- }
930
- .provenance-chip--inherited {
931
- color: var(--warning);
932
- }
933
- .provenance-chip--bound {
934
- color: var(--handler);
935
- }
936
- .provenance-chip--mixed {
937
- color: var(--text-secondary);
938
- }
939
- button.provenance-chip:hover,
940
- button.provenance-chip:focus-visible {
941
- background: var(--hover-bg);
942
- }
943
- /* The collapsed-header dot is an INDICATOR, not a control: it inherited
944
- .set-dot's pointer cursor and danger hover and had no handler behind either.
945
- §6.2 keeps the dot (a closed section must still say whether anything in it is
946
- set) and drops the affordance. */
947
- .set-dot--section {
948
- width: 7px;
949
- height: 7px;
950
- cursor: default;
951
- }
952
- .set-dot--section:hover {
953
- background: var(--accent);
954
- }
955
-
956
- /* ─── The read-only name/value line ─────────────────────────────────────────
957
- Observed Attributes, CSS Properties and CSS Parts were three copies of the
958
- same inline-styled flex row. One row, one rule, and it responds to the theme
959
- now that it has a class at all. */
960
- .kv-static-row {
961
- display: flex;
962
- gap: 6px;
963
- align-items: center;
964
- padding: 2px 0;
965
- font-size: var(--spectrum-font-size-50, 11px);
966
- }
967
- .kv-static-name {
968
- font-family: var(--font-mono);
969
- color: var(--accent);
970
- }
971
- .kv-static-detail {
972
- color: var(--fg-dim);
973
- }
974
- .kv-static-value {
975
- margin-left: auto;
976
- color: var(--fg-dim);
977
- }
978
- .kv-static-tag {
979
- padding: 1px 4px;
980
- border-radius: var(--radius);
981
- background: var(--hover-bg);
982
- font-size: 9px;
983
- }
984
- .kv-static-value + .kv-static-tag,
985
- .kv-static-detail + .kv-static-tag {
986
- margin-left: auto;
987
- }
988
- .kv-static-value ~ .kv-static-tag {
989
- margin-left: 0;
990
- }
991
-
992
- /* ─── Logic tab structure ───────────────────────────────────────────────────
993
- The Repeater and Switch sections used to carry their layout in inline style=
994
- attributes, which is how they also ended up as the last rows in the inspector
995
- without a set-dot or a clear affordance. */
996
- .logic-edit-template {
997
- margin-top: 8px;
998
- width: 100%;
999
- }
1000
- .logic-subhead {
1001
- margin: 8px 0 4px;
1002
- font-size: var(--spectrum-font-size-50, 11px);
1003
- font-weight: 600;
1004
- color: var(--fg-dim);
1005
- text-transform: uppercase;
1006
- letter-spacing: 0.05em;
1007
- }
1008
- .logic-case-row {
1009
- display: flex;
1010
- align-items: center;
1011
- gap: 4px;
1012
- }
1013
- .logic-case-name {
1014
- flex: 1;
1015
- min-width: 0;
1016
- }
1017
- .logic-case-open {
1018
- flex-shrink: 0;
1019
- }
1020
-
1021
148
  /* ─── The Layout-element card ───────────────────────────────────────────────
1022
149
  What the inspector says when you click page chrome — §8.2's first click. */
1023
150
  .layout-origin {
@@ -1026,429 +153,3 @@ button.provenance-chip:focus-visible {
1026
153
  gap: 6px;
1027
154
  margin-bottom: 8px;
1028
155
  }
1029
- .layout-origin-badge {
1030
- padding: 2px 6px;
1031
- border-radius: var(--radius);
1032
- background: var(--map);
1033
- color: var(--accent-fg);
1034
- font-size: 9px;
1035
- text-transform: uppercase;
1036
- letter-spacing: 0.5px;
1037
- }
1038
- .layout-origin-tag {
1039
- font-family: var(--font-mono);
1040
- font-size: var(--spectrum-font-size-75, 12px);
1041
- }
1042
- .layout-origin-class {
1043
- font-size: var(--spectrum-font-size-50, 11px);
1044
- color: var(--fg-dim);
1045
- word-break: break-all;
1046
- }
1047
- .layout-origin-note {
1048
- margin: 0;
1049
- padding: 4px 0;
1050
- font-size: 10px;
1051
- font-style: italic;
1052
- color: var(--fg-dim);
1053
- }
1054
-
1055
- /* ─── P6 · Project Styles: token chips and the override affordance (§9.4) ────
1056
- A style value that is exactly `var(--token)` is a REFERENCE, and raw text is
1057
- the one rendering that hides which token and what it currently is. The chip
1058
- reuses the provenance-chip vocabulary above — same border, same 9px, same
1059
- radius — because "this value comes from somewhere else" is the same sentence
1060
- in both places; only the donor differs. It is a <span>, not a button: it
1061
- states, it does not navigate (§6.2). */
1062
- .style-token-chip {
1063
- display: inline-flex;
1064
- align-items: center;
1065
- gap: 4px;
1066
- flex-shrink: 0;
1067
- max-width: 14ch;
1068
- overflow: hidden;
1069
- padding: 0 5px;
1070
- border: 1px solid currentcolor;
1071
- border-radius: var(--radius);
1072
- color: var(--handler);
1073
- font-size: 9px;
1074
- line-height: 14px;
1075
- white-space: nowrap;
1076
- }
1077
- .style-token-chip-swatch {
1078
- width: 8px;
1079
- height: 8px;
1080
- flex-shrink: 0;
1081
- border: 1px solid var(--border);
1082
- border-radius: var(--spectrum-corner-radius-75, 2px);
1083
- }
1084
- .style-token-chip-label {
1085
- overflow: hidden;
1086
- text-overflow: ellipsis;
1087
- }
1088
-
1089
- /* The add-an-override picker, under a token's existing context rows. It aligns
1090
- with them rather than with the token name, because it belongs to the override
1091
- list and not to the token — the affordance that was missing is "give this
1092
- token a value in a context it has none in", and a control that lined up with
1093
- the base value would read as a second base value. */
1094
- .css-var-override-add {
1095
- display: flex;
1096
- align-items: center;
1097
- padding: 2px 0;
1098
- }
1099
- .css-var-override-add sp-picker {
1100
- font-size: var(--spectrum-font-size-50, 11px);
1101
- }
1102
-
1103
- /* ─── The reference control (ui/form-controls.ts) ────────────────────────────
1104
- A property whose `$ref` names another collection. One registration, so this
1105
- is the only block that styles a relationship field wherever it is drawn — the
1106
- entry editor, a settings form, the frontmatter card. The note carries the two
1107
- states a dropdown alone cannot express: "no entries yet" and "the read
1108
- failed", and the failed one is coloured because it is a fault, not a fact. */
1109
- .reference-control {
1110
- display: flex;
1111
- flex: 1;
1112
- min-width: 0;
1113
- align-items: center;
1114
- gap: 6px;
1115
- }
1116
- .reference-field {
1117
- flex: 1;
1118
- min-width: 0;
1119
- }
1120
- .reference-note {
1121
- color: var(--fg-dim);
1122
- font-size: var(--spectrum-font-size-50, 11px);
1123
- line-height: 1.4;
1124
- }
1125
- .reference-note--failed {
1126
- color: var(--spectrum-red-600, #e34850);
1127
- }
1128
- /* The entry the value names is not on disk. Kept in the list — see the control's
1129
- note on dangling references — and marked so it cannot be mistaken for one. */
1130
- .reference-missing {
1131
- color: var(--spectrum-red-600, #e34850);
1132
- }
1133
-
1134
- /* ─── The statement editor (studio-ui-guidelines.md §4.6) ────────────────────────────────────────
1135
- A Function body as cards on a connector line — `panels/statement-editor.ts`.
1136
- Until this block existed the surface had NO stylesheet at all: every frame,
1137
- indent and connector was an inline `style=` attribute, and twenty class names
1138
- sat in check-styles.ts's orphan list.
1139
-
1140
- An attribute cannot carry the one declaration the layout needs. A flex item's
1141
- automatic minimum size is its min-content width, so a chain with no
1142
- `min-width: 0` on it refuses to shrink: an operand row asking for a 112px
1143
- picker + a 56px picker + a Spectrum field (192px by default) is wider than a
1144
- 280px Inspector, and Operator, Target and Value were clipped by the right
1145
- edge of the WINDOW. The editor is drawn in three docks of very different
1146
- widths — the Navigator's State panel, the Inspector's Events tab and the
1147
- Bottom dock's Logic tab — so a pixel layout is wrong by construction.
1148
-
1149
- Colours here are the ones the attributes already carried: this is a layout
1150
- change and nothing else. */
1151
- .statement-editor {
1152
- min-width: 0;
1153
- }
1154
- /* One indent per nesting level, drawn once. The lane used to add a 6px margin of
1155
- its own on top of the list's 4px + 2px + 8px, so a three-deep branch spent
1156
- 48px of a 240px panel on indentation alone. */
1157
- .statement-list {
1158
- min-width: 0;
1159
- padding: 2px 0 0 8px;
1160
- border-left: 2px solid var(--spectrum-gray-300, #3c3c3c);
1161
- }
1162
- .statement-lane {
1163
- min-width: 0;
1164
- margin: 4px 0;
1165
- }
1166
- .statement-lane-header {
1167
- display: flex;
1168
- flex-wrap: wrap;
1169
- align-items: center;
1170
- gap: 4px;
1171
- min-width: 0;
1172
- }
1173
- /* The card is the draggable object, so its frame is what carries the weight. */
1174
- .statement-card {
1175
- min-width: 0;
1176
- margin: 0 0 6px;
1177
- padding: 4px 6px;
1178
- border: 1px solid var(--spectrum-gray-300, #3c3c3c);
1179
- border-radius: var(--radius);
1180
- background: var(--spectrum-gray-75, #1e1e1e);
1181
- }
1182
- .statement-card-header {
1183
- display: flex;
1184
- align-items: center;
1185
- gap: 6px;
1186
- min-width: 0;
1187
- }
1188
- .statement-card-body {
1189
- min-width: 0;
1190
- }
1191
- .statement-drag-handle {
1192
- flex-shrink: 0;
1193
- color: var(--spectrum-gray-500, #6e6e6e);
1194
- font-size: var(--spectrum-font-size-50, 11px);
1195
- line-height: 1;
1196
- cursor: grab;
1197
- user-select: none;
1198
- }
1199
- /* The kind label and a lane's name are the same 10px caption. */
1200
- .statement-kind-label,
1201
- .statement-lane-label {
1202
- min-width: 0;
1203
- color: var(--fg-dim);
1204
- font-size: 10px;
1205
- font-weight: 600;
1206
- letter-spacing: 0.04em;
1207
- text-transform: uppercase;
1208
- }
1209
- /* "Dispatch event" beside a drag handle and a delete button is already most of a
1210
- narrow header, so the kind ellipsizes rather than widening the card. */
1211
- .statement-kind-label {
1212
- overflow: hidden;
1213
- white-space: nowrap;
1214
- text-overflow: ellipsis;
1215
- }
1216
- /* A `$switch` case renames itself in the lane header, so this label slot holds a
1217
- text FIELD rather than a word — hence a flex row and no `overflow: hidden`,
1218
- which would clip the field's focus ring. */
1219
- .statement-lane-label {
1220
- display: flex;
1221
- align-items: center;
1222
- }
1223
- /* The uppercase and the 10px belong to the label, not to the value: inherited
1224
- properties cross the shadow boundary, so `case 1` rendered as `CASE 1` in the
1225
- field you were about to type into. */
1226
- .statement-case-key {
1227
- /* It may not GROW: the lane's remove button shares this header, and a key
1228
- field that takes the whole line pushes it onto one of its own. */
1229
- flex: 0 1 6rem;
1230
- min-width: 0;
1231
- font-size: var(--spectrum-font-size-50, 11px);
1232
- font-weight: 400;
1233
- letter-spacing: normal;
1234
- text-transform: none;
1235
- }
1236
- /* Hard right, and it used to take a `<span style="flex:1">` spacer to get there. */
1237
- .statement-delete {
1238
- flex-shrink: 0;
1239
- margin-left: auto;
1240
- }
1241
- .statement-lane-remove {
1242
- flex-shrink: 0;
1243
- }
1244
- .statement-add,
1245
- .statement-add-case,
1246
- .statement-add-else {
1247
- max-width: 100%;
1248
- }
1249
- /* A direct child of `.style-row`, which is a flex COLUMN — so `flex: 1` here was
1250
- never a width, it was permission to grow TALL, and a flex-basis would have been
1251
- a height outright. That is the empty column the bug report photographed. Width
1252
- comes from the `.style-row > sp-textfield` stretch rule above; all this row
1253
- needs of its own is permission to shrink. */
1254
- .statement-dispatch-name {
1255
- min-width: 0;
1256
- }
1257
- /* `bubbles` and `composed` read as one row and stack when they cannot. */
1258
- .statement-dispatch-options {
1259
- display: flex;
1260
- flex-wrap: wrap;
1261
- align-items: center;
1262
- gap: 4px 12px;
1263
- min-width: 0;
1264
- }
1265
- .statement-dispatch-bubbles,
1266
- .statement-dispatch-composed {
1267
- flex: 0 0 auto;
1268
- max-width: 100%;
1269
- }
1270
- /* Drag feedback. `dragging`, `drop-above` and `drop-below` are toggled by
1271
- registerStatementsDnD and had no rule anywhere, so a drag showed the cursor
1272
- moving and nothing else until the drop landed. */
1273
- .statement-card.dragging {
1274
- opacity: 0.4;
1275
- }
1276
- .statement-card.drop-above {
1277
- box-shadow: inset 0 2px 0 0 var(--accent);
1278
- }
1279
- .statement-card.drop-below {
1280
- box-shadow: inset 0 -2px 0 0 var(--accent);
1281
- }
1282
-
1283
- /* ─── The expression editor ──────────────────────────────────────────────────
1284
- `ui/expression-editor.ts`, drawn inside a statement card, inside the Data
1285
- panel's signal editor, and on its own in the Bottom dock's formula workspace.
1286
- Same story as above: no stylesheet, so no `min-width: 0`, so the operand
1287
- controls could not shrink to the dock they were in. */
1288
- .expression-editor {
1289
- min-width: 0;
1290
- }
1291
- /* Nesting depth, from CSS rather than from a `style=` string built in TS. */
1292
- .expression-editor--nested {
1293
- margin-left: 4px;
1294
- padding-left: 6px;
1295
- border-left: 2px solid var(--spectrum-gray-300, #3c3c3c);
1296
- }
1297
- .expr-subsection {
1298
- min-width: 0;
1299
- margin-top: 4px;
1300
- }
1301
- .expr-error {
1302
- padding: 2px 0;
1303
- color: var(--danger);
1304
- font-size: 10px;
1305
- }
1306
- /* Two of the editor's three row primitives — the operand is the third, just
1307
- below, and differs only in how it aligns a tall widget. Between them they are
1308
- the rule that makes the whole thing hold at any width: a row when there is
1309
- room for one, a stack when there is not. The break is decided by a flex-basis,
1310
- never by a fixed width, so the same markup is two columns in a 600px dock and
1311
- two lines in a 240px rail and neither is a special case. */
1312
- .expr-widget,
1313
- .expr-literal {
1314
- display: flex;
1315
- flex: 1 1 auto;
1316
- flex-wrap: wrap;
1317
- align-items: center;
1318
- gap: 4px;
1319
- min-width: 0;
1320
- }
1321
- /* An operand may be a nested editor several rows tall; its mode picker belongs
1322
- at the top of that block, not at the middle of it. */
1323
- .expr-operand {
1324
- display: flex;
1325
- flex: 1 1 auto;
1326
- flex-wrap: wrap;
1327
- align-items: flex-start;
1328
- gap: 4px;
1329
- min-width: 0;
1330
- }
1331
- .expr-operand-mode {
1332
- flex: 0 1 6.5rem;
1333
- }
1334
- .expr-literal {
1335
- flex: 1 1 8rem;
1336
- }
1337
- /* The operator is two or three glyphs, so it may compress a long way before the
1338
- Browse-catalog button beside it is pushed onto a line of its own. */
1339
- .expr-operator {
1340
- flex: 1 1 4rem;
1341
- }
1342
- .expr-ref {
1343
- flex: 1 1 6rem;
1344
- }
1345
- /* A nested formula is a BLOCK of rows, not a control, so it always takes a line
1346
- of its own under the mode picker that names it. Sizing it as a sibling instead
1347
- is what put a lone "Formula ▾" at the top of a tall empty column in the bug
1348
- report — the picker labels what follows it, and a label does not want a column
1349
- to itself. A `flex-basis: 100%` is the wrap, said once. */
1350
- .expr-operand > .expression-editor {
1351
- flex: 1 1 100%;
1352
- min-width: 0;
1353
- }
1354
- .expr-literal-type {
1355
- flex: 0 1 4rem;
1356
- }
1357
- .expr-literal-value {
1358
- flex: 1 1 4.5rem;
1359
- }
1360
- .expr-browse-catalog,
1361
- .expr-literal-bool {
1362
- flex: 0 0 auto;
1363
- }
1364
- .expr-literal-null {
1365
- color: var(--fg-dim);
1366
- font-size: var(--spectrum-font-size-75, 12px);
1367
- }
1368
- /* The live value (spec §19.9). A resolved formula is arbitrary text — an object,
1369
- a URL, a paragraph — so it ellipsizes inside the row it annotates and never
1370
- sets the row's width. The same badge is drawn on the chip strip
1371
- (ui/formula-chips.ts), which still carries its own inline copy. */
1372
- .expr-live-badge {
1373
- flex: 0 1 auto;
1374
- min-width: 0;
1375
- max-width: 100%;
1376
- overflow: hidden;
1377
- padding: 0 5px;
1378
- border-radius: var(--radius);
1379
- background: var(--spectrum-gray-200, #323232);
1380
- color: var(--spectrum-seafoam-900, #35a690);
1381
- font-family: var(--font-mono);
1382
- font-size: 10px;
1383
- line-height: 16px;
1384
- white-space: nowrap;
1385
- text-overflow: ellipsis;
1386
- }
1387
- /* Positional args (`splice`, `call`) — also drawn by ui/schema-form.ts, which
1388
- still passes its own inline flex; the wrap and the shrink are what it gains. */
1389
- .array-object-field {
1390
- min-width: 0;
1391
- }
1392
- .array-object-row {
1393
- display: flex;
1394
- flex-wrap: wrap;
1395
- align-items: center;
1396
- gap: 4px;
1397
- min-width: 0;
1398
- margin-bottom: 4px;
1399
- }
1400
- .array-object-label {
1401
- flex: 0 0 auto;
1402
- min-width: 30px;
1403
- color: var(--fg-dim);
1404
- font-size: 10px;
1405
- }
1406
- .array-object-row sp-action-button {
1407
- flex: 0 0 auto;
1408
- }
1409
- /* `switch` cases: matched value → result operand, plus the default row. The
1410
- default's label keeps the key column's width so the two align. */
1411
- .switch-cases {
1412
- min-width: 0;
1413
- margin-top: 4px;
1414
- }
1415
- .switch-case-row {
1416
- display: flex;
1417
- flex-wrap: wrap;
1418
- align-items: flex-start;
1419
- gap: 4px;
1420
- min-width: 0;
1421
- margin-bottom: 4px;
1422
- }
1423
- .switch-case-key {
1424
- flex: 0 1 5rem;
1425
- min-width: 0;
1426
- }
1427
- .switch-case-default {
1428
- color: var(--fg-dim);
1429
- font-size: 10px;
1430
- line-height: 24px;
1431
- }
1432
- .switch-cases sp-action-button {
1433
- flex: 0 0 auto;
1434
- }
1435
- /* The belt, for both editors. A Spectrum field is `--spectrum-field-width` wide
1436
- by default (192px) and declares its own min-inline-size; a field row that
1437
- never says otherwise is therefore ~200px of demand per control, which is the
1438
- whole width of the rail. Outer-tree rules win over a shadow root's `:host`,
1439
- so this is where that demand is answered. */
1440
- .statement-editor .style-row,
1441
- .expression-editor .style-row {
1442
- min-width: 0;
1443
- }
1444
- .statement-editor sp-picker,
1445
- .statement-editor sp-textfield,
1446
- .statement-editor sp-number-field,
1447
- .statement-editor sp-combobox,
1448
- .expression-editor sp-picker,
1449
- .expression-editor sp-textfield,
1450
- .expression-editor sp-number-field,
1451
- .expression-editor sp-combobox {
1452
- min-width: 0;
1453
- max-width: 100%;
1454
- }