@jxsuite/studio 4.1.0 → 5.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 (612) 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-n6tfwnda.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-qwkm9zrf.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-vj72gqtq.js +20 -0
  15. package/dist/chunks/content-source-5mex4x1h.js +46 -0
  16. package/dist/chunks/convert-to-repeater-n64h8znc.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-234hjnqw.js +42 -0
  20. package/dist/chunks/extension-sections-3hpcambp.js +651 -0
  21. package/dist/chunks/file-ops-8yhd83xr.js +47 -0
  22. package/dist/chunks/files-hnxqxtsg.js +72 -0
  23. package/dist/chunks/format-host-779sfp2n.js +40 -0
  24. package/dist/chunks/fs-events-b88z7g4h.js +18 -0
  25. package/dist/chunks/git-panel-xwj8fpab.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-syr0f9sb.js +115 -0
  31. package/dist/chunks/{index-wcnt3r9g.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-ff81wthn.js +30 -0
  37. package/dist/chunks/layers-panel-pnnghw12.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-cqhhxhhe.js +33 -0
  41. package/dist/chunks/menu-9p2w46gj.js +15 -0
  42. package/dist/chunks/menu-q99sy9rf.js +285 -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-vx9bhp1d.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-5zt840sy.js +27 -0
  52. package/dist/chunks/quick-search-3748564r.js +45 -0
  53. package/dist/chunks/references-qvvxej7h.js +26 -0
  54. package/dist/chunks/right-panel-eccz92qt.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-kryvsw6j.js → studio-1k325pwf.js} +48 -48
  60. package/dist/chunks/{studio-b55y6ewx.js → studio-1knfqgy7.js} +58 -58
  61. package/dist/chunks/{studio-2b946z26.js → studio-1z1kcjv4.js} +3628 -6095
  62. package/dist/chunks/studio-3773086z.js +111 -0
  63. package/dist/chunks/{studio-4r1pv6zf.js → studio-38emantv.js} +22 -5
  64. package/dist/chunks/{studio-x813zp48.js → studio-3rz5md06.js} +30 -30
  65. package/dist/chunks/{studio-ynxwkrzd.js → studio-4wbb9ct0.js} +1953 -1785
  66. package/dist/chunks/studio-5te5tqng.js +81 -0
  67. package/dist/chunks/studio-5wt9nvhd.js +4763 -0
  68. package/dist/chunks/{studio-p4ngc046.js → studio-6ewqv390.js} +9 -9
  69. package/dist/chunks/{studio-9ab8gqsm.js → studio-6nzaktvy.js} +7 -7
  70. package/dist/chunks/studio-6xa21ej9.js +28 -0
  71. package/dist/chunks/{studio-5ehhackm.js → studio-727xh0e3.js} +19 -19
  72. package/dist/chunks/{studio-gcye7qka.js → studio-7e11jpa9.js} +21 -21
  73. package/dist/chunks/{studio-q7v10cg2.js → studio-7r42c6ca.js} +17 -7
  74. package/dist/chunks/studio-7xnmgv66.js +13615 -0
  75. package/dist/chunks/studio-8scdew0e.js +258 -0
  76. package/dist/chunks/{studio-fbf92ckf.js → studio-93zafjcm.js} +275 -163
  77. package/dist/chunks/{studio-dg7zyt5x.js → studio-98b3z07n.js} +1 -1
  78. package/dist/chunks/studio-a79k90n9.js +1162 -0
  79. package/dist/chunks/studio-aj37eer3.js +422 -0
  80. package/dist/chunks/studio-b0k5tqgp.js +2432 -0
  81. package/dist/chunks/studio-b4s9eykd.js +2811 -0
  82. package/dist/chunks/{studio-f3wqjtk5.js → studio-d0300636.js} +5076 -18
  83. package/dist/chunks/{studio-b9b6t1dg.js → studio-e1f24eff.js} +5664 -5666
  84. package/dist/chunks/studio-e1pgga3k.js +839 -0
  85. package/dist/chunks/{studio-g1wdche0.js → studio-esrxgwh6.js} +80 -80
  86. package/dist/chunks/{studio-q43a5y9h.js → studio-g3jevyjt.js} +16 -16
  87. package/dist/chunks/studio-gb13095a.js +2806 -0
  88. package/dist/chunks/{studio-3n4ndrzh.js → studio-h4nvnjvz.js} +303 -303
  89. package/dist/chunks/{studio-dm19q43r.js → studio-hhvs4sdg.js} +10 -10
  90. package/dist/chunks/{studio-x4qkdat5.js → studio-js8nv53n.js} +1749 -2481
  91. package/dist/chunks/{studio-qjy2z9bv.js → studio-jxp12rnj.js} +32 -137
  92. package/dist/chunks/{studio-trxrabqf.js → studio-k75n7vhp.js} +527 -283
  93. package/dist/chunks/{studio-q9jd1a60.js → studio-kcgff4r0.js} +15 -18
  94. package/dist/chunks/studio-kkqkcp3d.js +17668 -0
  95. package/dist/chunks/studio-mhhyamxf.js +763 -0
  96. package/dist/chunks/{studio-cft9r4r7.js → studio-nq5yf5mp.js} +22 -22
  97. package/dist/chunks/{studio-685s0ytq.js → studio-nqgawfks.js} +572 -572
  98. package/dist/chunks/studio-nzzpvzx9.js +185 -0
  99. package/dist/chunks/{studio-xrapxwwc.js → studio-p1dw8wfw.js} +55 -29
  100. package/dist/chunks/{studio-3bqpr0zh.js → studio-pxbgypmg.js} +299 -110
  101. package/dist/chunks/studio-q0a3yk4n.js +33 -0
  102. package/dist/chunks/{studio-wcy8trfx.js → studio-q3x06vmj.js} +23 -22
  103. package/dist/chunks/{studio-6yw4y3my.js → studio-qhhm6hbt.js} +8 -8
  104. package/dist/chunks/studio-qk4bfsq2.js +362 -0
  105. package/dist/chunks/{studio-msd847zn.js → studio-qk90fgqm.js} +361 -90
  106. package/dist/chunks/{studio-jkftxyvz.js → studio-r6nvacqs.js} +5861 -2154
  107. package/dist/chunks/{studio-53n8bp04.js → studio-r6xmmtfh.js} +1 -1
  108. package/dist/chunks/{studio-tvgyw9xw.js → studio-rnyf3f8e.js} +83 -250
  109. package/dist/chunks/studio-rs76k67r.js +12 -0
  110. package/dist/chunks/studio-sbjyc8bt.js +954 -0
  111. package/dist/chunks/{studio-1wagb550.js → studio-syg2tadj.js} +11 -11
  112. package/dist/chunks/{studio-t5wqwzdh.js → studio-tjjk7jvk.js} +1 -1
  113. package/dist/chunks/studio-tqgryxwg.js +1171 -0
  114. package/dist/chunks/studio-try13h8c.js +8448 -0
  115. package/dist/chunks/studio-vfq8qpjt.js +1219 -0
  116. package/dist/chunks/studio-vhv5tgxm.js +51 -0
  117. package/dist/chunks/{studio-ahn3pdgx.js → studio-vw7mzp6z.js} +52 -38
  118. package/dist/chunks/studio-wqpngpsk.js +174 -0
  119. package/dist/chunks/studio-wqz6dggm.js +1356 -0
  120. package/dist/chunks/{studio-92ab2jqe.js → studio-y9zedyjn.js} +14 -14
  121. package/dist/chunks/studio-yxa81f45.js +12 -0
  122. package/dist/chunks/studio-zdn2g6dt.js +148 -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-t55jdjbx.js +69 -0
  133. package/dist/chunks/{ws-client-6shc5rze.js → ws-client-ny4zc51r.js} +20 -22
  134. package/dist/iframe-entry.js +1873 -673
  135. package/dist/studio.js +52757 -36535
  136. package/dist/workers/editor.worker.js +1040 -1085
  137. package/dist/workers/json.worker.js +1946 -1991
  138. package/dist/workers/ts.worker.js +4960 -5005
  139. package/index.html +1 -0
  140. package/package.json +18 -52
  141. package/src/about/about-modal.ts +72 -123
  142. package/src/browse/library-commands.ts +20 -49
  143. package/src/browse/library-layouts.ts +87 -218
  144. package/src/browse/library-pane.ts +406 -438
  145. package/src/canvas/canvas-helpers.ts +0 -49
  146. package/src/canvas/canvas-live-render.ts +25 -2
  147. package/src/canvas/canvas-render.ts +666 -231
  148. package/src/canvas/canvas-surface.ts +0 -1
  149. package/src/canvas/canvas-utils.ts +333 -113
  150. package/src/canvas/dialog-path.ts +76 -0
  151. package/src/canvas/dialog-state.ts +67 -0
  152. package/src/canvas/diff-marks.ts +252 -0
  153. package/src/canvas/diff-toolbar.ts +349 -0
  154. package/src/canvas/diff-view.ts +123 -0
  155. package/src/canvas/edit-width-drag.ts +187 -0
  156. package/src/canvas/edit-width.ts +150 -0
  157. package/src/canvas/iframe-entry.ts +125 -8
  158. package/src/canvas/iframe-host.ts +271 -15
  159. package/src/canvas/iframe-interaction.ts +133 -13
  160. package/src/canvas/iframe-patch.ts +7 -1
  161. package/src/canvas/iframe-position.ts +5 -6
  162. package/src/canvas/iframe-protocol.ts +106 -5
  163. package/src/canvas/iframe-render.ts +373 -5
  164. package/src/canvas/iframe-slash.ts +2 -2
  165. package/src/canvas/iframe-subtree.ts +5 -8
  166. package/src/canvas/path-mapping.ts +25 -3
  167. package/src/canvas/popover-path.ts +106 -0
  168. package/src/canvas/popover-state.ts +155 -0
  169. package/src/canvas/surface-registry.ts +21 -10
  170. package/src/collab/presence-chips.ts +51 -73
  171. package/src/commands/app-commands.ts +10 -0
  172. package/src/commands/budget.ts +12 -0
  173. package/src/commands/command-args.ts +404 -6
  174. package/src/commands/defaults.ts +44 -14
  175. package/src/commands/live-context.ts +11 -5
  176. package/src/commands/reference.ts +12 -2
  177. package/src/commands/registry.ts +177 -10
  178. package/src/commands/run-reported.ts +120 -0
  179. package/src/content/entry-commands.ts +16 -23
  180. package/src/content/entry-editor.ts +144 -101
  181. package/src/editor/canvas-slash-bridge.ts +2 -2
  182. package/src/editor/context-menu.ts +49 -200
  183. package/src/editor/convert-to-component.ts +42 -82
  184. package/src/editor/convert-to-repeater.ts +132 -173
  185. package/src/editor/inline-edit.ts +11 -0
  186. package/src/editor/shortcuts.ts +76 -49
  187. package/src/editor/slash-menu.ts +150 -157
  188. package/src/files/components.ts +39 -0
  189. package/src/files/file-ops.ts +117 -11
  190. package/src/files/files.ts +944 -660
  191. package/src/files/json-layout.ts +474 -0
  192. package/src/files/serialize-document.ts +8 -1
  193. package/src/format/convert-file.ts +16 -10
  194. package/src/format/format-host.ts +50 -1
  195. package/src/github/github-auth.ts +71 -29
  196. package/src/github/github-publish.ts +57 -65
  197. package/src/grid/cell-editors.ts +46 -4
  198. package/src/grid/cell-popovers.ts +65 -62
  199. package/src/grid/grid-open.ts +86 -64
  200. package/src/grid/grid-panel.ts +390 -469
  201. package/src/grid/redirects-grid.ts +40 -44
  202. package/src/hosting/layout.ts +2 -0
  203. package/src/i18n/i18n-commands.ts +137 -62
  204. package/src/media/media-pane.ts +83 -133
  205. package/src/new-project/add-repo-modal.ts +125 -176
  206. package/src/new-project/import-tab.ts +181 -252
  207. package/src/new-project/location-fields.ts +93 -160
  208. package/src/new-project/new-project-modal.ts +376 -367
  209. package/src/packages/jxsuite-update.ts +76 -18
  210. package/src/packages/pull-package-sync.ts +5 -1
  211. package/src/panels/activity-panel.ts +137 -104
  212. package/src/panels/ai-chat/chat-markdown.ts +15 -13
  213. package/src/panels/ai-chat/chat-view.ts +307 -472
  214. package/src/panels/ai-chat/composer.ts +175 -163
  215. package/src/panels/ai-chat/sessions-view.ts +31 -62
  216. package/src/panels/ai-panel.ts +213 -185
  217. package/src/panels/block-action-bar.ts +444 -645
  218. package/src/panels/bottom-dock.ts +112 -47
  219. package/src/panels/chat-panel.ts +19 -14
  220. package/src/panels/data-explorer.ts +141 -102
  221. package/src/panels/data-grid.ts +183 -150
  222. package/src/panels/dnd.ts +75 -20
  223. package/src/panels/editors.ts +26 -19
  224. package/src/panels/elements-panel.ts +243 -186
  225. package/src/panels/empty-state.ts +26 -42
  226. package/src/panels/events-panel.ts +950 -729
  227. package/src/panels/formula-workspace.ts +434 -207
  228. package/src/panels/frontmatter-fields.ts +185 -153
  229. package/src/panels/frontmatter-panel.ts +411 -187
  230. package/src/panels/git-diff-open.ts +148 -0
  231. package/src/panels/git-panel.ts +679 -605
  232. package/src/panels/head-panel.ts +617 -435
  233. package/src/panels/i18n-panel.ts +148 -135
  234. package/src/panels/imports-panel.ts +388 -414
  235. package/src/panels/jump-bar.ts +175 -147
  236. package/src/panels/layers-panel.ts +785 -671
  237. package/src/panels/left-panel.ts +166 -94
  238. package/src/panels/navigator-panels.ts +1 -1
  239. package/src/panels/pane-context.ts +529 -677
  240. package/src/panels/pane-grid.ts +265 -241
  241. package/src/panels/panel-registry.ts +15 -4
  242. package/src/panels/problems-panel.ts +181 -99
  243. package/src/panels/properties-panel.ts +1525 -966
  244. package/src/panels/provenance.ts +31 -113
  245. package/src/panels/quick-search.ts +223 -184
  246. package/src/panels/right-panel.ts +135 -169
  247. package/src/panels/seo-modal.ts +346 -167
  248. package/src/panels/settings-menu.ts +114 -661
  249. package/src/panels/settings-pane.ts +102 -86
  250. package/src/panels/signals-panel.ts +1318 -1172
  251. package/src/panels/statement-editor.ts +556 -428
  252. package/src/panels/style-panel.ts +1367 -630
  253. package/src/panels/style-utils.ts +36 -32
  254. package/src/panels/stylebook-doc.ts +30 -73
  255. package/src/panels/stylebook-layers-panel.ts +202 -109
  256. package/src/panels/stylebook-panel.ts +124 -88
  257. package/src/panels/tab-strip.ts +386 -288
  258. package/src/platforms/cloud.ts +106 -16
  259. package/src/platforms/devserver.ts +13 -0
  260. package/src/publish/deploy-checklist.ts +124 -78
  261. package/src/publish/publish-commands.ts +4 -12
  262. package/src/publish/publish-panel.ts +134 -328
  263. package/src/services/a11y-report.ts +100 -43
  264. package/src/services/ai-command-tools.ts +538 -0
  265. package/src/services/ai-project-tools.ts +8 -2
  266. package/src/services/ai-session-store.ts +6 -0
  267. package/src/services/ai-system-prompt.ts +112 -24
  268. package/src/services/ai-tools.ts +36 -212
  269. package/src/services/ai-write-report.ts +174 -0
  270. package/src/services/document-assistant.ts +59 -8
  271. package/src/services/idle.ts +16 -14
  272. package/src/services/live-surfaces.ts +237 -0
  273. package/src/services/model-uri.ts +75 -0
  274. package/src/services/notify.ts +63 -6
  275. package/src/services/popover-report.ts +325 -0
  276. package/src/services/surface-registry.ts +56 -0
  277. package/src/services/tool-executor.ts +6 -0
  278. package/src/settings/contexts-section.ts +301 -299
  279. package/src/settings/contributed-section.ts +361 -222
  280. package/src/settings/css-vars-editor.ts +320 -325
  281. package/src/settings/defs-editor.ts +572 -535
  282. package/src/settings/dependencies-editor.ts +79 -107
  283. package/src/settings/extension-commands.ts +379 -0
  284. package/src/settings/extension-rows.ts +113 -0
  285. package/src/settings/extensions-section.ts +287 -0
  286. package/src/settings/general-settings.ts +130 -181
  287. package/src/settings/head-editor.ts +10 -305
  288. package/src/settings/locales-section.ts +146 -196
  289. package/src/settings/preferences-accounts.ts +1 -1
  290. package/src/settings/preferences-dialog.ts +350 -330
  291. package/src/settings/project-sections.ts +108 -181
  292. package/src/settings/schema-field-ui.ts +11 -399
  293. package/src/settings/section-registry.ts +8 -1
  294. package/src/settings/settings-document.ts +31 -29
  295. package/src/shell/tree.ts +42 -87
  296. package/src/shell.ts +48 -36
  297. package/src/studio.ts +104 -69
  298. package/src/style/token-ref.ts +0 -39
  299. package/src/surfaces/about.json +263 -0
  300. package/src/surfaces/about.ts +163 -0
  301. package/src/surfaces/add-repo.json +486 -0
  302. package/src/surfaces/add-repo.ts +236 -0
  303. package/src/surfaces/ai-chat.json +2185 -0
  304. package/src/surfaces/ai-chat.ts +549 -0
  305. package/src/surfaces/ai-credentials-form.json +332 -0
  306. package/src/surfaces/ai-credentials-form.ts +151 -0
  307. package/src/surfaces/ai-managed-connect.json +108 -0
  308. package/src/surfaces/ai-managed-connect.ts +123 -0
  309. package/src/surfaces/ai-model-picker.json +114 -0
  310. package/src/surfaces/ai-model-picker.ts +139 -0
  311. package/src/surfaces/block-action-bar.json +640 -0
  312. package/src/surfaces/block-action-bar.ts +368 -0
  313. package/src/surfaces/bottom-dock.json +154 -0
  314. package/src/surfaces/bottom-dock.ts +125 -0
  315. package/src/surfaces/canvas-stage.json +444 -0
  316. package/src/surfaces/canvas-stage.ts +253 -0
  317. package/src/surfaces/cf-account-picker.json +300 -0
  318. package/src/surfaces/cf-account-picker.ts +214 -0
  319. package/src/surfaces/commandbar.json +985 -0
  320. package/src/{panels/toolbar.ts → surfaces/commandbar.ts} +417 -391
  321. package/src/surfaces/convert-repeater.json +309 -0
  322. package/src/surfaces/convert-repeater.ts +276 -0
  323. package/src/surfaces/data-actions.json +157 -0
  324. package/src/surfaces/data-actions.ts +115 -0
  325. package/src/surfaces/dialog.json +289 -0
  326. package/src/surfaces/dialog.ts +343 -0
  327. package/src/surfaces/diff-toolbar.json +266 -0
  328. package/src/surfaces/diff-toolbar.ts +139 -0
  329. package/src/surfaces/doc-header.json +739 -0
  330. package/src/surfaces/doc-header.ts +223 -0
  331. package/src/surfaces/empty-state.json +152 -0
  332. package/src/surfaces/empty-state.ts +173 -0
  333. package/src/surfaces/entry-editor.json +281 -0
  334. package/src/surfaces/entry-editor.ts +191 -0
  335. package/src/surfaces/expression-editor.json +977 -0
  336. package/src/surfaces/expression-editor.ts +266 -0
  337. package/src/surfaces/files-panel.json +592 -0
  338. package/src/surfaces/files-panel.ts +301 -0
  339. package/src/surfaces/formula-palette.json +364 -0
  340. package/src/surfaces/formula-palette.ts +340 -0
  341. package/src/surfaces/git-panel.json +1822 -0
  342. package/src/surfaces/git-panel.ts +272 -0
  343. package/src/surfaces/github-auth.json +112 -0
  344. package/src/surfaces/github-auth.ts +139 -0
  345. package/src/surfaces/github-publish.json +206 -0
  346. package/src/surfaces/github-publish.ts +169 -0
  347. package/src/surfaces/grid-cell.json +218 -0
  348. package/src/surfaces/grid-cell.ts +120 -0
  349. package/src/surfaces/grid-open.json +147 -0
  350. package/src/surfaces/grid-open.ts +87 -0
  351. package/src/surfaces/grid-panel.json +706 -0
  352. package/src/surfaces/grid-panel.ts +206 -0
  353. package/src/surfaces/grid-replace.json +179 -0
  354. package/src/surfaces/grid-replace.ts +89 -0
  355. package/src/surfaces/grid-views.json +446 -0
  356. package/src/surfaces/grid-views.ts +172 -0
  357. package/src/surfaces/inspector-dock.json +187 -0
  358. package/src/surfaces/inspector-dock.ts +161 -0
  359. package/src/surfaces/jump-bar.json +243 -0
  360. package/src/surfaces/jump-bar.ts +129 -0
  361. package/src/surfaces/jxsuite-update.json +146 -0
  362. package/src/surfaces/jxsuite-update.ts +149 -0
  363. package/src/surfaces/library-pane.json +1509 -0
  364. package/src/surfaces/library-pane.ts +363 -0
  365. package/src/surfaces/logic-panel.json +1949 -0
  366. package/src/surfaces/logic-panel.ts +369 -0
  367. package/src/surfaces/logic-workspace.json +685 -0
  368. package/src/surfaces/logic-workspace.ts +238 -0
  369. package/src/surfaces/media-browser.json +303 -0
  370. package/src/surfaces/media-browser.ts +145 -0
  371. package/src/surfaces/media-field.json +163 -0
  372. package/src/surfaces/media-field.ts +116 -0
  373. package/src/surfaces/media-pane.json +513 -0
  374. package/src/surfaces/media-pane.ts +197 -0
  375. package/src/surfaces/menu.json +232 -0
  376. package/src/surfaces/menu.ts +375 -0
  377. package/src/surfaces/navigator-dock.json +113 -0
  378. package/src/surfaces/navigator-dock.ts +130 -0
  379. package/src/surfaces/new-project.json +1654 -0
  380. package/src/surfaces/new-project.ts +411 -0
  381. package/src/surfaces/palette.json +535 -0
  382. package/src/surfaces/pane-context.json +1497 -0
  383. package/src/surfaces/pane-context.ts +513 -0
  384. package/src/surfaces/pane-grid.json +188 -0
  385. package/src/surfaces/pane-grid.ts +250 -0
  386. package/src/surfaces/panel-activity.json +563 -0
  387. package/src/surfaces/panel-activity.ts +187 -0
  388. package/src/surfaces/panel-data.json +141 -0
  389. package/src/surfaces/panel-data.ts +156 -0
  390. package/src/surfaces/panel-deploy-checklist.json +283 -0
  391. package/src/surfaces/panel-deploy-checklist.ts +175 -0
  392. package/src/surfaces/panel-elements.json +367 -0
  393. package/src/surfaces/panel-elements.ts +175 -0
  394. package/src/surfaces/panel-i18n.json +569 -0
  395. package/src/surfaces/panel-i18n.ts +212 -0
  396. package/src/surfaces/panel-imports.json +780 -0
  397. package/src/surfaces/panel-imports.ts +209 -0
  398. package/src/surfaces/panel-outline.json +734 -0
  399. package/src/surfaces/panel-outline.ts +326 -0
  400. package/src/surfaces/panel-page.json +1017 -0
  401. package/src/surfaces/panel-page.ts +240 -0
  402. package/src/surfaces/panel-problems.json +497 -0
  403. package/src/surfaces/panel-problems.ts +157 -0
  404. package/src/surfaces/panel-signals.json +1973 -0
  405. package/src/surfaces/panel-signals.ts +436 -0
  406. package/src/surfaces/panel-stylebook-layers.json +317 -0
  407. package/src/surfaces/panel-stylebook-layers.ts +155 -0
  408. package/src/surfaces/preferences.json +850 -0
  409. package/src/surfaces/preferences.ts +332 -0
  410. package/src/surfaces/progress-modal.json +110 -0
  411. package/src/surfaces/progress-modal.ts +150 -0
  412. package/src/surfaces/properties-panel.json +1578 -0
  413. package/src/surfaces/properties-panel.ts +337 -0
  414. package/src/surfaces/publish.json +945 -0
  415. package/src/surfaces/publish.ts +392 -0
  416. package/src/surfaces/push-plan.json +110 -0
  417. package/src/surfaces/push-plan.ts +87 -0
  418. package/src/surfaces/rail.json +255 -0
  419. package/src/surfaces/rail.ts +206 -0
  420. package/src/surfaces/reference-field.json +191 -0
  421. package/src/surfaces/reference-field.ts +168 -0
  422. package/src/surfaces/schema-builder.json +1011 -0
  423. package/src/surfaces/schema-builder.ts +181 -0
  424. package/src/surfaces/schema-form.json +1013 -0
  425. package/src/surfaces/schema-form.ts +287 -0
  426. package/src/surfaces/secret-field.json +60 -0
  427. package/src/surfaces/secret-field.ts +146 -0
  428. package/src/surfaces/seo.json +932 -0
  429. package/src/surfaces/seo.ts +334 -0
  430. package/src/surfaces/settings-contexts.json +538 -0
  431. package/src/surfaces/settings-contexts.ts +196 -0
  432. package/src/surfaces/settings-contributed.json +489 -0
  433. package/src/surfaces/settings-contributed.ts +199 -0
  434. package/src/surfaces/settings-css-vars.json +820 -0
  435. package/src/surfaces/settings-css-vars.ts +199 -0
  436. package/src/surfaces/settings-defs.json +1363 -0
  437. package/src/surfaces/settings-defs.ts +232 -0
  438. package/src/surfaces/settings-deploy.json +108 -0
  439. package/src/surfaces/settings-deploy.ts +135 -0
  440. package/src/surfaces/settings-extensions.json +486 -0
  441. package/src/surfaces/settings-extensions.ts +201 -0
  442. package/src/surfaces/settings-head.json +779 -0
  443. package/src/surfaces/settings-head.ts +397 -0
  444. package/src/surfaces/settings-locales.json +420 -0
  445. package/src/surfaces/settings-locales.ts +137 -0
  446. package/src/surfaces/settings-overview.json +423 -0
  447. package/src/surfaces/settings-overview.ts +218 -0
  448. package/src/surfaces/settings-packages.json +549 -0
  449. package/src/surfaces/settings-packages.ts +158 -0
  450. package/src/surfaces/settings-pane.json +147 -0
  451. package/src/surfaces/settings-pane.ts +150 -0
  452. package/src/surfaces/settings-rawjson.json +104 -0
  453. package/src/surfaces/settings-rawjson.ts +107 -0
  454. package/src/surfaces/shell.json +99 -0
  455. package/src/surfaces/shell.ts +30 -0
  456. package/src/surfaces/slash-menu.json +180 -0
  457. package/src/surfaces/slash-menu.ts +272 -0
  458. package/src/surfaces/statements.json +607 -0
  459. package/src/surfaces/statements.ts +238 -0
  460. package/src/surfaces/statusbar.json +94 -0
  461. package/src/{panels → surfaces}/statusbar.ts +164 -90
  462. package/src/surfaces/style-panel.json +1643 -0
  463. package/src/surfaces/style-panel.ts +338 -0
  464. package/src/surfaces/stylebook-chrome.json +122 -0
  465. package/src/surfaces/stylebook-chrome.ts +122 -0
  466. package/src/surfaces/tab-strip.json +448 -0
  467. package/src/surfaces/tab-strip.ts +200 -0
  468. package/src/surfaces/target-line.json +419 -0
  469. package/src/surfaces/target-line.ts +349 -0
  470. package/src/surfaces/toasts.json +189 -0
  471. package/src/surfaces/welcome.json +571 -0
  472. package/src/surfaces/welcome.ts +338 -0
  473. package/src/tabs/project-config.ts +111 -21
  474. package/src/tabs/tab.ts +52 -1
  475. package/src/types.ts +22 -0
  476. package/src/ui/ai-credentials-form.ts +104 -100
  477. package/src/ui/ai-managed-connect.ts +54 -36
  478. package/src/ui/ai-model-picker.ts +75 -47
  479. package/src/ui/cf-account-picker.ts +76 -141
  480. package/src/ui/color-selector.ts +80 -301
  481. package/src/ui/dynamic-slot.ts +43 -283
  482. package/src/ui/expression-editor.ts +797 -576
  483. package/src/ui/field-input.ts +8 -181
  484. package/src/ui/form-controls.ts +838 -366
  485. package/src/ui/formula-chips.ts +80 -85
  486. package/src/ui/kit.ts +33 -0
  487. package/src/ui/layers.ts +296 -593
  488. package/src/ui/media-picker.ts +203 -284
  489. package/src/ui/panel-resize.ts +251 -64
  490. package/src/ui/popover-surface.ts +153 -0
  491. package/src/ui/progress-modal.ts +22 -60
  492. package/src/ui/regions.ts +13 -7
  493. package/src/ui/schema-form.ts +906 -440
  494. package/src/ui/surface.ts +122 -0
  495. package/src/ui/unit-selector.ts +15 -131
  496. package/src/ui/value-source.ts +14 -0
  497. package/src/ui/virtual-window.ts +88 -9
  498. package/src/utils/canvas-media.ts +72 -0
  499. package/src/utils/edit-display.ts +7 -2
  500. package/src/utils/element-selectors.ts +69 -0
  501. package/src/utils/link-target.ts +2 -2
  502. package/src/utils/studio-utils.ts +0 -10
  503. package/src/view.ts +15 -0
  504. package/src/workspace/pane-derive.ts +36 -14
  505. package/src/workspace/workspace.ts +75 -6
  506. package/styles/canvas.css +72 -467
  507. package/styles/forced-colors.css +48 -82
  508. package/styles/forced-colors.json +41 -0
  509. package/styles/inspector.css +2 -1301
  510. package/styles/overlays.css +96 -2823
  511. package/styles/panels.css +6 -1423
  512. package/styles/shell-frame.css +272 -0
  513. package/styles/shell-frame.json +227 -0
  514. package/styles/shell.css +0 -1568
  515. package/styles/tokens.css +65 -136
  516. package/styles/tokens.json +84 -0
  517. package/dist/chunks/Overlay.dev-etqjwyf9.js +0 -23
  518. package/dist/chunks/adapter-jkcyhgtr.js +0 -14
  519. package/dist/chunks/cf-account-picker-en86v7x7.js +0 -163
  520. package/dist/chunks/cf-settings-45fgyx8y.js +0 -21
  521. package/dist/chunks/components-zmx10t62.js +0 -21
  522. package/dist/chunks/content-source-48xg86wj.js +0 -49
  523. package/dist/chunks/convert-to-repeater-43tfn7cs.js +0 -268
  524. package/dist/chunks/editor-cptq5jp1.js +0 -37
  525. package/dist/chunks/entry-commands-e63f1xc0.js +0 -46
  526. package/dist/chunks/extension-sections-txv08xxg.js +0 -311
  527. package/dist/chunks/file-ops-wbh4hhsx.js +0 -48
  528. package/dist/chunks/files-3kfkwhk4.js +0 -93
  529. package/dist/chunks/flow-qbfgrpeh.js +0 -634
  530. package/dist/chunks/focus-trap.esm-9t2drp0g.js +0 -1025
  531. package/dist/chunks/focus-visible-6eg70z18.js +0 -167
  532. package/dist/chunks/format-host-w16q81tf.js +0 -43
  533. package/dist/chunks/fs-events-hrrg328g.js +0 -21
  534. package/dist/chunks/git-panel-532whr1y.js +0 -59
  535. package/dist/chunks/index-zqxmqxmh.js +0 -109
  536. package/dist/chunks/jx-validate-8er6gbxy.js +0 -19
  537. package/dist/chunks/layers-panel-07hm7g5j.js +0 -67
  538. package/dist/chunks/layers-q75tj2mf.js +0 -45
  539. package/dist/chunks/lit-html-j055mkh8.js +0 -22
  540. package/dist/chunks/monaco-buffer-dqw0xxpx.js +0 -25
  541. package/dist/chunks/notify-yjm79n4s.js +0 -30
  542. package/dist/chunks/parse-24d0gay3.js +0 -19
  543. package/dist/chunks/platform-ba1j1gbh.js +0 -16
  544. package/dist/chunks/publish-panel-v9st96ja.js +0 -29
  545. package/dist/chunks/quick-search-zccjp6gv.js +0 -66
  546. package/dist/chunks/references-3qx8fkyp.js +0 -29
  547. package/dist/chunks/right-panel-vm3b6kwy.js +0 -46
  548. package/dist/chunks/section-registry-sx1ykvkw.js +0 -30
  549. package/dist/chunks/sp-overlay.dev-qgvhnxf4.js +0 -18
  550. package/dist/chunks/sp-popover.dev-n2etmqdp.js +0 -9
  551. package/dist/chunks/sp-progress-circle.dev-hryhj0es.js +0 -15
  552. package/dist/chunks/sp-tooltip.dev-4sastdnw.js +0 -15
  553. package/dist/chunks/sp-tray.dev-tkbscm06.js +0 -199
  554. package/dist/chunks/studio-0a5qrh01.js +0 -3
  555. package/dist/chunks/studio-0bq6eh7v.js +0 -12
  556. package/dist/chunks/studio-18j3bmcz.js +0 -14
  557. package/dist/chunks/studio-1ngbejft.js +0 -181
  558. package/dist/chunks/studio-4b5z1x43.js +0 -424
  559. package/dist/chunks/studio-4n2b5gzb.js +0 -357
  560. package/dist/chunks/studio-4rzyrtjz.js +0 -426
  561. package/dist/chunks/studio-5fx3g9jg.js +0 -4325
  562. package/dist/chunks/studio-5myknm0a.js +0 -1903
  563. package/dist/chunks/studio-7afd21nw.js +0 -67
  564. package/dist/chunks/studio-7nte2hj4.js +0 -613
  565. package/dist/chunks/studio-8jpzqk5s.js +0 -128
  566. package/dist/chunks/studio-8q517dfr.js +0 -24
  567. package/dist/chunks/studio-950k0dx6.js +0 -6939
  568. package/dist/chunks/studio-9n4mrmnb.js +0 -184
  569. package/dist/chunks/studio-a0tswy0w.js +0 -58
  570. package/dist/chunks/studio-ahnzd9rg.js +0 -23
  571. package/dist/chunks/studio-bgxt93ga.js +0 -62
  572. package/dist/chunks/studio-cmb03bg5.js +0 -13890
  573. package/dist/chunks/studio-d1ks410h.js +0 -175
  574. package/dist/chunks/studio-ef49pnzx.js +0 -387
  575. package/dist/chunks/studio-eqq1w638.js +0 -113
  576. package/dist/chunks/studio-ew0djmhg.js +0 -341
  577. package/dist/chunks/studio-gfgb8pe6.js +0 -1652
  578. package/dist/chunks/studio-h4rxscfc.js +0 -10
  579. package/dist/chunks/studio-jc994dnr.js +0 -1066
  580. package/dist/chunks/studio-kyh9avvv.js +0 -28
  581. package/dist/chunks/studio-m3hwn7y1.js +0 -120
  582. package/dist/chunks/studio-mtfnaqs9.js +0 -659
  583. package/dist/chunks/studio-n6j9t10q.js +0 -318
  584. package/dist/chunks/studio-n8b9wqwy.js +0 -291
  585. package/dist/chunks/studio-qcy05dp8.js +0 -1743
  586. package/dist/chunks/studio-qq6jym04.js +0 -53
  587. package/dist/chunks/studio-rdx8jcxy.js +0 -83
  588. package/dist/chunks/studio-rn9ta2mz.js +0 -111
  589. package/dist/chunks/studio-t7qb9db8.js +0 -665
  590. package/dist/chunks/studio-tmc5emrw.js +0 -8
  591. package/dist/chunks/studio-z6nw2ek2.js +0 -18
  592. package/dist/chunks/studio-zczps70q.js +0 -378
  593. package/dist/chunks/studio-zqazsct2.js +0 -1823
  594. package/dist/chunks/workspace-fjx52ryv.js +0 -89
  595. package/src/panels/activity-bar.ts +0 -251
  596. package/src/panels/panel-scheduler.ts +0 -219
  597. package/src/panels/style-inputs.ts +0 -237
  598. package/src/panels/target-line.ts +0 -274
  599. package/src/panels/welcome-screen.ts +0 -346
  600. package/src/ui/button-group.ts +0 -102
  601. package/src/ui/choice-field.ts +0 -72
  602. package/src/ui/field-row.ts +0 -249
  603. package/src/ui/formula-palette.ts +0 -213
  604. package/src/ui/icons.ts +0 -52
  605. package/src/ui/jx-theme.ts +0 -130
  606. package/src/ui/spectrum.ts +0 -340
  607. package/src/ui/value-selector.ts +0 -174
  608. package/src/ui/widgets.ts +0 -172
  609. /package/dist/chunks/{javascript-s56a8dpk.css → javascript-4abzjcy9.css} +0 -0
  610. /package/dist/chunks/{jsonMode-zr9sw0c7.css → jsonMode-vvmpmk34.css} +0 -0
  611. /package/dist/chunks/{monaco-setup-pav68602.css → monaco-setup-8vbyqnhr.css} +0 -0
  612. /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
- }