@jxsuite/studio 4.1.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 (607) 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-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-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-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-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-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-msd847zn.js → studio-25hkdrkw.js} +357 -86
  62. package/dist/chunks/studio-26d7myd1.js +258 -0
  63. package/dist/chunks/{studio-4r1pv6zf.js → studio-38emantv.js} +22 -5
  64. package/dist/chunks/studio-3gxv60tn.js +422 -0
  65. package/dist/chunks/{studio-fbf92ckf.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-1wagb550.js → studio-5523bpzt.js} +11 -11
  69. package/dist/chunks/{studio-x4qkdat5.js → studio-57mf66w2.js} +1749 -2481
  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-ahn3pdgx.js → studio-79y5sz51.js} +52 -38
  78. package/dist/chunks/{studio-gcye7qka.js → studio-7e11jpa9.js} +21 -21
  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-x813zp48.js → studio-arfpe389.js} +30 -30
  88. package/dist/chunks/{studio-trxrabqf.js → studio-az3zd49t.js} +475 -283
  89. package/dist/chunks/studio-cpvb2ed1.js +1171 -0
  90. package/dist/chunks/{studio-f3wqjtk5.js → studio-d0300636.js} +5076 -18
  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-3bqpr0zh.js → studio-em9nw8eh.js} +299 -110
  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-dm19q43r.js → studio-hhvs4sdg.js} +10 -10
  100. package/dist/chunks/{studio-q9jd1a60.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-2b946z26.js → studio-rkstz940.js} +3658 -6134
  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-jkftxyvz.js → studio-s6z853aq.js} +5858 -2152
  113. package/dist/chunks/{studio-6yw4y3my.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-qjy2z9bv.js → studio-vz68yn9e.js} +32 -137
  118. package/dist/chunks/studio-wqpngpsk.js +174 -0
  119. package/dist/chunks/{studio-b55y6ewx.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 +1780 -667
  135. package/dist/studio.js +52819 -36480
  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 +310 -117
  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 +369 -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 +165 -8
  178. package/src/content/entry-commands.ts +16 -23
  179. package/src/content/entry-editor.ts +144 -101
  180. package/src/editor/canvas-slash-bridge.ts +2 -2
  181. package/src/editor/context-menu.ts +49 -200
  182. package/src/editor/convert-to-component.ts +42 -82
  183. package/src/editor/convert-to-repeater.ts +132 -173
  184. package/src/editor/inline-edit.ts +11 -0
  185. package/src/editor/shortcuts.ts +65 -26
  186. package/src/editor/slash-menu.ts +150 -157
  187. package/src/files/file-ops.ts +117 -11
  188. package/src/files/files.ts +943 -660
  189. package/src/files/json-layout.ts +474 -0
  190. package/src/files/serialize-document.ts +8 -1
  191. package/src/format/convert-file.ts +16 -10
  192. package/src/format/format-host.ts +50 -1
  193. package/src/github/github-auth.ts +71 -29
  194. package/src/github/github-publish.ts +57 -65
  195. package/src/grid/cell-editors.ts +46 -4
  196. package/src/grid/cell-popovers.ts +65 -62
  197. package/src/grid/grid-open.ts +86 -64
  198. package/src/grid/grid-panel.ts +390 -469
  199. package/src/grid/redirects-grid.ts +40 -44
  200. package/src/hosting/layout.ts +2 -0
  201. package/src/i18n/i18n-commands.ts +127 -62
  202. package/src/media/media-pane.ts +83 -133
  203. package/src/new-project/add-repo-modal.ts +125 -176
  204. package/src/new-project/import-tab.ts +181 -252
  205. package/src/new-project/location-fields.ts +93 -160
  206. package/src/new-project/new-project-modal.ts +376 -367
  207. package/src/packages/jxsuite-update.ts +76 -18
  208. package/src/panels/activity-panel.ts +137 -104
  209. package/src/panels/ai-chat/chat-markdown.ts +15 -13
  210. package/src/panels/ai-chat/chat-view.ts +307 -472
  211. package/src/panels/ai-chat/composer.ts +175 -163
  212. package/src/panels/ai-chat/sessions-view.ts +31 -62
  213. package/src/panels/ai-panel.ts +210 -185
  214. package/src/panels/block-action-bar.ts +437 -643
  215. package/src/panels/bottom-dock.ts +112 -47
  216. package/src/panels/chat-panel.ts +19 -14
  217. package/src/panels/data-explorer.ts +141 -102
  218. package/src/panels/data-grid.ts +183 -150
  219. package/src/panels/dnd.ts +75 -20
  220. package/src/panels/editors.ts +26 -19
  221. package/src/panels/elements-panel.ts +243 -186
  222. package/src/panels/empty-state.ts +26 -42
  223. package/src/panels/events-panel.ts +950 -729
  224. package/src/panels/formula-workspace.ts +434 -207
  225. package/src/panels/frontmatter-fields.ts +185 -153
  226. package/src/panels/frontmatter-panel.ts +411 -187
  227. package/src/panels/git-diff-open.ts +148 -0
  228. package/src/panels/git-panel.ts +679 -605
  229. package/src/panels/head-panel.ts +617 -435
  230. package/src/panels/i18n-panel.ts +153 -133
  231. package/src/panels/imports-panel.ts +388 -414
  232. package/src/panels/jump-bar.ts +174 -147
  233. package/src/panels/layers-panel.ts +785 -671
  234. package/src/panels/left-panel.ts +166 -94
  235. package/src/panels/navigator-panels.ts +1 -1
  236. package/src/panels/pane-context.ts +529 -677
  237. package/src/panels/pane-grid.ts +265 -241
  238. package/src/panels/panel-registry.ts +15 -4
  239. package/src/panels/problems-panel.ts +177 -99
  240. package/src/panels/properties-panel.ts +1525 -966
  241. package/src/panels/provenance.ts +31 -113
  242. package/src/panels/quick-search.ts +217 -172
  243. package/src/panels/right-panel.ts +135 -169
  244. package/src/panels/seo-modal.ts +346 -167
  245. package/src/panels/settings-menu.ts +109 -646
  246. package/src/panels/settings-pane.ts +102 -86
  247. package/src/panels/signals-panel.ts +1318 -1172
  248. package/src/panels/statement-editor.ts +556 -428
  249. package/src/panels/style-panel.ts +1367 -630
  250. package/src/panels/style-utils.ts +36 -32
  251. package/src/panels/stylebook-doc.ts +30 -73
  252. package/src/panels/stylebook-layers-panel.ts +202 -109
  253. package/src/panels/stylebook-panel.ts +124 -88
  254. package/src/panels/tab-strip.ts +385 -287
  255. package/src/platforms/cloud.ts +106 -16
  256. package/src/platforms/devserver.ts +13 -0
  257. package/src/publish/deploy-checklist.ts +124 -78
  258. package/src/publish/publish-commands.ts +4 -12
  259. package/src/publish/publish-panel.ts +134 -328
  260. package/src/services/a11y-report.ts +100 -43
  261. package/src/services/ai-command-tools.ts +468 -0
  262. package/src/services/ai-session-store.ts +6 -0
  263. package/src/services/ai-system-prompt.ts +110 -18
  264. package/src/services/ai-tools.ts +28 -143
  265. package/src/services/ai-write-report.ts +174 -0
  266. package/src/services/document-assistant.ts +50 -2
  267. package/src/services/idle.ts +16 -14
  268. package/src/services/live-surfaces.ts +237 -0
  269. package/src/services/model-uri.ts +75 -0
  270. package/src/services/notify.ts +63 -6
  271. package/src/services/popover-report.ts +325 -0
  272. package/src/services/surface-registry.ts +56 -0
  273. package/src/services/tool-executor.ts +6 -0
  274. package/src/settings/contexts-section.ts +301 -299
  275. package/src/settings/contributed-section.ts +361 -222
  276. package/src/settings/css-vars-editor.ts +320 -325
  277. package/src/settings/defs-editor.ts +572 -535
  278. package/src/settings/dependencies-editor.ts +79 -107
  279. package/src/settings/extension-commands.ts +379 -0
  280. package/src/settings/extension-rows.ts +113 -0
  281. package/src/settings/extensions-section.ts +287 -0
  282. package/src/settings/general-settings.ts +130 -181
  283. package/src/settings/head-editor.ts +10 -305
  284. package/src/settings/locales-section.ts +146 -196
  285. package/src/settings/preferences-accounts.ts +1 -1
  286. package/src/settings/preferences-dialog.ts +350 -330
  287. package/src/settings/project-sections.ts +108 -181
  288. package/src/settings/schema-field-ui.ts +11 -399
  289. package/src/settings/section-registry.ts +8 -1
  290. package/src/settings/settings-document.ts +31 -29
  291. package/src/shell/tree.ts +42 -87
  292. package/src/shell.ts +48 -36
  293. package/src/studio.ts +90 -67
  294. package/src/style/token-ref.ts +0 -39
  295. package/src/surfaces/about.json +263 -0
  296. package/src/surfaces/about.ts +163 -0
  297. package/src/surfaces/add-repo.json +486 -0
  298. package/src/surfaces/add-repo.ts +236 -0
  299. package/src/surfaces/ai-chat.json +2185 -0
  300. package/src/surfaces/ai-chat.ts +549 -0
  301. package/src/surfaces/ai-credentials-form.json +332 -0
  302. package/src/surfaces/ai-credentials-form.ts +151 -0
  303. package/src/surfaces/ai-managed-connect.json +108 -0
  304. package/src/surfaces/ai-managed-connect.ts +123 -0
  305. package/src/surfaces/ai-model-picker.json +114 -0
  306. package/src/surfaces/ai-model-picker.ts +139 -0
  307. package/src/surfaces/block-action-bar.json +640 -0
  308. package/src/surfaces/block-action-bar.ts +368 -0
  309. package/src/surfaces/bottom-dock.json +154 -0
  310. package/src/surfaces/bottom-dock.ts +125 -0
  311. package/src/surfaces/canvas-stage.json +444 -0
  312. package/src/surfaces/canvas-stage.ts +253 -0
  313. package/src/surfaces/cf-account-picker.json +300 -0
  314. package/src/surfaces/cf-account-picker.ts +214 -0
  315. package/src/surfaces/commandbar.json +984 -0
  316. package/src/{panels/toolbar.ts → surfaces/commandbar.ts} +414 -389
  317. package/src/surfaces/convert-repeater.json +309 -0
  318. package/src/surfaces/convert-repeater.ts +276 -0
  319. package/src/surfaces/data-actions.json +157 -0
  320. package/src/surfaces/data-actions.ts +115 -0
  321. package/src/surfaces/dialog.json +289 -0
  322. package/src/surfaces/dialog.ts +343 -0
  323. package/src/surfaces/diff-toolbar.json +266 -0
  324. package/src/surfaces/diff-toolbar.ts +139 -0
  325. package/src/surfaces/doc-header.json +739 -0
  326. package/src/surfaces/doc-header.ts +223 -0
  327. package/src/surfaces/empty-state.json +152 -0
  328. package/src/surfaces/empty-state.ts +173 -0
  329. package/src/surfaces/entry-editor.json +281 -0
  330. package/src/surfaces/entry-editor.ts +191 -0
  331. package/src/surfaces/expression-editor.json +977 -0
  332. package/src/surfaces/expression-editor.ts +266 -0
  333. package/src/surfaces/files-panel.json +592 -0
  334. package/src/surfaces/files-panel.ts +301 -0
  335. package/src/surfaces/formula-palette.json +364 -0
  336. package/src/surfaces/formula-palette.ts +340 -0
  337. package/src/surfaces/git-panel.json +1822 -0
  338. package/src/surfaces/git-panel.ts +272 -0
  339. package/src/surfaces/github-auth.json +112 -0
  340. package/src/surfaces/github-auth.ts +139 -0
  341. package/src/surfaces/github-publish.json +206 -0
  342. package/src/surfaces/github-publish.ts +169 -0
  343. package/src/surfaces/grid-cell.json +218 -0
  344. package/src/surfaces/grid-cell.ts +120 -0
  345. package/src/surfaces/grid-open.json +147 -0
  346. package/src/surfaces/grid-open.ts +87 -0
  347. package/src/surfaces/grid-panel.json +706 -0
  348. package/src/surfaces/grid-panel.ts +206 -0
  349. package/src/surfaces/grid-replace.json +179 -0
  350. package/src/surfaces/grid-replace.ts +89 -0
  351. package/src/surfaces/grid-views.json +446 -0
  352. package/src/surfaces/grid-views.ts +172 -0
  353. package/src/surfaces/inspector-dock.json +187 -0
  354. package/src/surfaces/inspector-dock.ts +161 -0
  355. package/src/surfaces/jump-bar.json +243 -0
  356. package/src/surfaces/jump-bar.ts +129 -0
  357. package/src/surfaces/jxsuite-update.json +146 -0
  358. package/src/surfaces/jxsuite-update.ts +149 -0
  359. package/src/surfaces/library-pane.json +1509 -0
  360. package/src/surfaces/library-pane.ts +363 -0
  361. package/src/surfaces/logic-panel.json +1949 -0
  362. package/src/surfaces/logic-panel.ts +369 -0
  363. package/src/surfaces/logic-workspace.json +685 -0
  364. package/src/surfaces/logic-workspace.ts +238 -0
  365. package/src/surfaces/media-browser.json +303 -0
  366. package/src/surfaces/media-browser.ts +145 -0
  367. package/src/surfaces/media-field.json +163 -0
  368. package/src/surfaces/media-field.ts +116 -0
  369. package/src/surfaces/media-pane.json +513 -0
  370. package/src/surfaces/media-pane.ts +197 -0
  371. package/src/surfaces/menu.json +232 -0
  372. package/src/surfaces/menu.ts +375 -0
  373. package/src/surfaces/navigator-dock.json +113 -0
  374. package/src/surfaces/navigator-dock.ts +130 -0
  375. package/src/surfaces/new-project.json +1654 -0
  376. package/src/surfaces/new-project.ts +411 -0
  377. package/src/surfaces/palette.json +535 -0
  378. package/src/surfaces/pane-context.json +1497 -0
  379. package/src/surfaces/pane-context.ts +513 -0
  380. package/src/surfaces/pane-grid.json +188 -0
  381. package/src/surfaces/pane-grid.ts +250 -0
  382. package/src/surfaces/panel-activity.json +563 -0
  383. package/src/surfaces/panel-activity.ts +187 -0
  384. package/src/surfaces/panel-data.json +141 -0
  385. package/src/surfaces/panel-data.ts +156 -0
  386. package/src/surfaces/panel-deploy-checklist.json +283 -0
  387. package/src/surfaces/panel-deploy-checklist.ts +175 -0
  388. package/src/surfaces/panel-elements.json +367 -0
  389. package/src/surfaces/panel-elements.ts +175 -0
  390. package/src/surfaces/panel-i18n.json +569 -0
  391. package/src/surfaces/panel-i18n.ts +212 -0
  392. package/src/surfaces/panel-imports.json +780 -0
  393. package/src/surfaces/panel-imports.ts +209 -0
  394. package/src/surfaces/panel-outline.json +734 -0
  395. package/src/surfaces/panel-outline.ts +326 -0
  396. package/src/surfaces/panel-page.json +1017 -0
  397. package/src/surfaces/panel-page.ts +240 -0
  398. package/src/surfaces/panel-problems.json +497 -0
  399. package/src/surfaces/panel-problems.ts +157 -0
  400. package/src/surfaces/panel-signals.json +1973 -0
  401. package/src/surfaces/panel-signals.ts +436 -0
  402. package/src/surfaces/panel-stylebook-layers.json +317 -0
  403. package/src/surfaces/panel-stylebook-layers.ts +155 -0
  404. package/src/surfaces/preferences.json +850 -0
  405. package/src/surfaces/preferences.ts +332 -0
  406. package/src/surfaces/progress-modal.json +110 -0
  407. package/src/surfaces/progress-modal.ts +150 -0
  408. package/src/surfaces/properties-panel.json +1578 -0
  409. package/src/surfaces/properties-panel.ts +337 -0
  410. package/src/surfaces/publish.json +945 -0
  411. package/src/surfaces/publish.ts +392 -0
  412. package/src/surfaces/push-plan.json +110 -0
  413. package/src/surfaces/push-plan.ts +87 -0
  414. package/src/surfaces/rail.json +255 -0
  415. package/src/surfaces/rail.ts +206 -0
  416. package/src/surfaces/reference-field.json +191 -0
  417. package/src/surfaces/reference-field.ts +168 -0
  418. package/src/surfaces/schema-builder.json +1011 -0
  419. package/src/surfaces/schema-builder.ts +181 -0
  420. package/src/surfaces/schema-form.json +1013 -0
  421. package/src/surfaces/schema-form.ts +287 -0
  422. package/src/surfaces/secret-field.json +60 -0
  423. package/src/surfaces/secret-field.ts +146 -0
  424. package/src/surfaces/seo.json +932 -0
  425. package/src/surfaces/seo.ts +334 -0
  426. package/src/surfaces/settings-contexts.json +538 -0
  427. package/src/surfaces/settings-contexts.ts +196 -0
  428. package/src/surfaces/settings-contributed.json +489 -0
  429. package/src/surfaces/settings-contributed.ts +199 -0
  430. package/src/surfaces/settings-css-vars.json +820 -0
  431. package/src/surfaces/settings-css-vars.ts +199 -0
  432. package/src/surfaces/settings-defs.json +1363 -0
  433. package/src/surfaces/settings-defs.ts +232 -0
  434. package/src/surfaces/settings-deploy.json +108 -0
  435. package/src/surfaces/settings-deploy.ts +135 -0
  436. package/src/surfaces/settings-extensions.json +486 -0
  437. package/src/surfaces/settings-extensions.ts +201 -0
  438. package/src/surfaces/settings-head.json +779 -0
  439. package/src/surfaces/settings-head.ts +397 -0
  440. package/src/surfaces/settings-locales.json +420 -0
  441. package/src/surfaces/settings-locales.ts +137 -0
  442. package/src/surfaces/settings-overview.json +423 -0
  443. package/src/surfaces/settings-overview.ts +218 -0
  444. package/src/surfaces/settings-packages.json +549 -0
  445. package/src/surfaces/settings-packages.ts +158 -0
  446. package/src/surfaces/settings-pane.json +147 -0
  447. package/src/surfaces/settings-pane.ts +150 -0
  448. package/src/surfaces/settings-rawjson.json +104 -0
  449. package/src/surfaces/settings-rawjson.ts +107 -0
  450. package/src/surfaces/shell.json +99 -0
  451. package/src/surfaces/shell.ts +30 -0
  452. package/src/surfaces/slash-menu.json +180 -0
  453. package/src/surfaces/slash-menu.ts +272 -0
  454. package/src/surfaces/statements.json +607 -0
  455. package/src/surfaces/statements.ts +238 -0
  456. package/src/surfaces/statusbar.json +94 -0
  457. package/src/{panels → surfaces}/statusbar.ts +163 -90
  458. package/src/surfaces/style-panel.json +1643 -0
  459. package/src/surfaces/style-panel.ts +338 -0
  460. package/src/surfaces/stylebook-chrome.json +122 -0
  461. package/src/surfaces/stylebook-chrome.ts +122 -0
  462. package/src/surfaces/tab-strip.json +448 -0
  463. package/src/surfaces/tab-strip.ts +200 -0
  464. package/src/surfaces/target-line.json +419 -0
  465. package/src/surfaces/target-line.ts +349 -0
  466. package/src/surfaces/toasts.json +189 -0
  467. package/src/surfaces/welcome.json +571 -0
  468. package/src/surfaces/welcome.ts +338 -0
  469. package/src/tabs/project-config.ts +71 -15
  470. package/src/tabs/tab.ts +52 -1
  471. package/src/types.ts +22 -0
  472. package/src/ui/ai-credentials-form.ts +104 -100
  473. package/src/ui/ai-managed-connect.ts +54 -36
  474. package/src/ui/ai-model-picker.ts +75 -47
  475. package/src/ui/cf-account-picker.ts +76 -141
  476. package/src/ui/color-selector.ts +80 -301
  477. package/src/ui/dynamic-slot.ts +43 -283
  478. package/src/ui/expression-editor.ts +797 -576
  479. package/src/ui/field-input.ts +8 -181
  480. package/src/ui/form-controls.ts +838 -366
  481. package/src/ui/formula-chips.ts +80 -85
  482. package/src/ui/kit.ts +33 -0
  483. package/src/ui/layers.ts +293 -593
  484. package/src/ui/media-picker.ts +203 -284
  485. package/src/ui/panel-resize.ts +251 -64
  486. package/src/ui/popover-surface.ts +153 -0
  487. package/src/ui/progress-modal.ts +22 -60
  488. package/src/ui/regions.ts +13 -7
  489. package/src/ui/schema-form.ts +906 -440
  490. package/src/ui/surface.ts +122 -0
  491. package/src/ui/unit-selector.ts +15 -131
  492. package/src/ui/value-source.ts +14 -0
  493. package/src/ui/virtual-window.ts +88 -9
  494. package/src/utils/canvas-media.ts +72 -0
  495. package/src/utils/edit-display.ts +7 -2
  496. package/src/utils/element-selectors.ts +69 -0
  497. package/src/utils/link-target.ts +2 -2
  498. package/src/utils/studio-utils.ts +0 -10
  499. package/src/view.ts +15 -0
  500. package/src/workspace/pane-derive.ts +36 -14
  501. package/src/workspace/workspace.ts +15 -6
  502. package/styles/canvas.css +72 -467
  503. package/styles/forced-colors.css +48 -82
  504. package/styles/forced-colors.json +41 -0
  505. package/styles/inspector.css +2 -1301
  506. package/styles/overlays.css +96 -2823
  507. package/styles/panels.css +6 -1423
  508. package/styles/shell-frame.css +272 -0
  509. package/styles/shell-frame.json +227 -0
  510. package/styles/shell.css +0 -1568
  511. package/styles/tokens.css +65 -136
  512. package/styles/tokens.json +84 -0
  513. package/dist/chunks/Overlay.dev-etqjwyf9.js +0 -23
  514. package/dist/chunks/adapter-jkcyhgtr.js +0 -14
  515. package/dist/chunks/cf-account-picker-en86v7x7.js +0 -163
  516. package/dist/chunks/cf-settings-45fgyx8y.js +0 -21
  517. package/dist/chunks/components-zmx10t62.js +0 -21
  518. package/dist/chunks/content-source-48xg86wj.js +0 -49
  519. package/dist/chunks/convert-to-repeater-43tfn7cs.js +0 -268
  520. package/dist/chunks/editor-cptq5jp1.js +0 -37
  521. package/dist/chunks/entry-commands-e63f1xc0.js +0 -46
  522. package/dist/chunks/extension-sections-txv08xxg.js +0 -311
  523. package/dist/chunks/file-ops-wbh4hhsx.js +0 -48
  524. package/dist/chunks/files-3kfkwhk4.js +0 -93
  525. package/dist/chunks/flow-qbfgrpeh.js +0 -634
  526. package/dist/chunks/focus-trap.esm-9t2drp0g.js +0 -1025
  527. package/dist/chunks/focus-visible-6eg70z18.js +0 -167
  528. package/dist/chunks/format-host-w16q81tf.js +0 -43
  529. package/dist/chunks/fs-events-hrrg328g.js +0 -21
  530. package/dist/chunks/git-panel-532whr1y.js +0 -59
  531. package/dist/chunks/index-zqxmqxmh.js +0 -109
  532. package/dist/chunks/jx-validate-8er6gbxy.js +0 -19
  533. package/dist/chunks/layers-panel-07hm7g5j.js +0 -67
  534. package/dist/chunks/layers-q75tj2mf.js +0 -45
  535. package/dist/chunks/lit-html-j055mkh8.js +0 -22
  536. package/dist/chunks/monaco-buffer-dqw0xxpx.js +0 -25
  537. package/dist/chunks/notify-yjm79n4s.js +0 -30
  538. package/dist/chunks/parse-24d0gay3.js +0 -19
  539. package/dist/chunks/platform-ba1j1gbh.js +0 -16
  540. package/dist/chunks/publish-panel-v9st96ja.js +0 -29
  541. package/dist/chunks/quick-search-zccjp6gv.js +0 -66
  542. package/dist/chunks/references-3qx8fkyp.js +0 -29
  543. package/dist/chunks/right-panel-vm3b6kwy.js +0 -46
  544. package/dist/chunks/section-registry-sx1ykvkw.js +0 -30
  545. package/dist/chunks/sp-overlay.dev-qgvhnxf4.js +0 -18
  546. package/dist/chunks/sp-popover.dev-n2etmqdp.js +0 -9
  547. package/dist/chunks/sp-progress-circle.dev-hryhj0es.js +0 -15
  548. package/dist/chunks/sp-tooltip.dev-4sastdnw.js +0 -15
  549. package/dist/chunks/sp-tray.dev-tkbscm06.js +0 -199
  550. package/dist/chunks/studio-0a5qrh01.js +0 -3
  551. package/dist/chunks/studio-0bq6eh7v.js +0 -12
  552. package/dist/chunks/studio-18j3bmcz.js +0 -14
  553. package/dist/chunks/studio-1ngbejft.js +0 -181
  554. package/dist/chunks/studio-4b5z1x43.js +0 -424
  555. package/dist/chunks/studio-4n2b5gzb.js +0 -357
  556. package/dist/chunks/studio-4rzyrtjz.js +0 -426
  557. package/dist/chunks/studio-5fx3g9jg.js +0 -4325
  558. package/dist/chunks/studio-5myknm0a.js +0 -1903
  559. package/dist/chunks/studio-7afd21nw.js +0 -67
  560. package/dist/chunks/studio-7nte2hj4.js +0 -613
  561. package/dist/chunks/studio-8jpzqk5s.js +0 -128
  562. package/dist/chunks/studio-8q517dfr.js +0 -24
  563. package/dist/chunks/studio-950k0dx6.js +0 -6939
  564. package/dist/chunks/studio-9n4mrmnb.js +0 -184
  565. package/dist/chunks/studio-a0tswy0w.js +0 -58
  566. package/dist/chunks/studio-ahnzd9rg.js +0 -23
  567. package/dist/chunks/studio-cmb03bg5.js +0 -13890
  568. package/dist/chunks/studio-d1ks410h.js +0 -175
  569. package/dist/chunks/studio-ef49pnzx.js +0 -387
  570. package/dist/chunks/studio-eqq1w638.js +0 -113
  571. package/dist/chunks/studio-ew0djmhg.js +0 -341
  572. package/dist/chunks/studio-gfgb8pe6.js +0 -1652
  573. package/dist/chunks/studio-h4rxscfc.js +0 -10
  574. package/dist/chunks/studio-jc994dnr.js +0 -1066
  575. package/dist/chunks/studio-kyh9avvv.js +0 -28
  576. package/dist/chunks/studio-m3hwn7y1.js +0 -120
  577. package/dist/chunks/studio-mtfnaqs9.js +0 -659
  578. package/dist/chunks/studio-n6j9t10q.js +0 -318
  579. package/dist/chunks/studio-n8b9wqwy.js +0 -291
  580. package/dist/chunks/studio-qcy05dp8.js +0 -1743
  581. package/dist/chunks/studio-qq6jym04.js +0 -53
  582. package/dist/chunks/studio-rdx8jcxy.js +0 -83
  583. package/dist/chunks/studio-rn9ta2mz.js +0 -111
  584. package/dist/chunks/studio-t7qb9db8.js +0 -665
  585. package/dist/chunks/studio-tmc5emrw.js +0 -8
  586. package/dist/chunks/studio-z6nw2ek2.js +0 -18
  587. package/dist/chunks/studio-zczps70q.js +0 -378
  588. package/dist/chunks/studio-zqazsct2.js +0 -1823
  589. package/dist/chunks/workspace-fjx52ryv.js +0 -89
  590. package/src/panels/activity-bar.ts +0 -251
  591. package/src/panels/panel-scheduler.ts +0 -219
  592. package/src/panels/style-inputs.ts +0 -237
  593. package/src/panels/target-line.ts +0 -274
  594. package/src/panels/welcome-screen.ts +0 -346
  595. package/src/ui/button-group.ts +0 -102
  596. package/src/ui/choice-field.ts +0 -72
  597. package/src/ui/field-row.ts +0 -249
  598. package/src/ui/formula-palette.ts +0 -213
  599. package/src/ui/icons.ts +0 -52
  600. package/src/ui/jx-theme.ts +0 -130
  601. package/src/ui/spectrum.ts +0 -340
  602. package/src/ui/value-selector.ts +0 -174
  603. package/src/ui/widgets.ts +0 -172
  604. /package/dist/chunks/{javascript-s56a8dpk.css → javascript-4abzjcy9.css} +0 -0
  605. /package/dist/chunks/{jsonMode-zr9sw0c7.css → jsonMode-vvmpmk34.css} +0 -0
  606. /package/dist/chunks/{monaco-setup-pav68602.css → monaco-setup-8vbyqnhr.css} +0 -0
  607. /package/dist/chunks/{tsMode-ef187txx.css → tsMode-hnxxb73h.css} +0 -0
@@ -16,17 +16,19 @@
16
16
  * holding a pasted API token (desktop, dev server) keeps its own local account field and this
17
17
  * resolves null without opening anything.
18
18
  *
19
+ * The dialog itself is `src/surfaces/cf-account-picker.json`, a `jx-dialog`; this module is the
20
+ * flow around it. It used to be a lit template rendered through `showDialog`, with its own
21
+ * `repaint()` re-rendering the whole body into the slot's parent whenever anything landed — the
22
+ * surface is reactive now, so a listing that arrives late, or a refusal, changes only what it names.
23
+ *
19
24
  * @docs studio/ai
20
25
  * @license MIT
21
26
  */
22
27
 
23
- import { html, render as litRender, nothing } from "lit-html";
24
- import { ref } from "lit-html/directives/ref.js";
25
- import type { TemplateResult } from "lit-html";
26
28
  import { getPlatform, hasPlatform } from "../platform";
27
29
  import { notifyCredentialsChanged } from "../settings/preferences-accounts";
28
- import { showDialog } from "./layers";
29
- import { overlayRegion } from "./regions";
30
+ import { openCfAccountPickerSurface } from "../surfaces/cf-account-picker";
31
+ import { layerHost } from "./layers";
30
32
  import type { CfAccountSummary } from "../types";
31
33
 
32
34
  /** Whether this platform brokers the connection, and so can be asked which accounts it reaches. */
@@ -38,6 +40,11 @@ function canPick(): boolean {
38
40
  return Boolean(platform.cfAccounts && platform.cfSelectAccount);
39
41
  }
40
42
 
43
+ /** What a thrown thing says, for a line the reader has to act on. */
44
+ function reasonOf(error: unknown): string {
45
+ return error instanceof Error ? error.message : String(error);
46
+ }
47
+
41
48
  /**
42
49
  * Ask which Cloudflare account this connection should use, and store the answer.
43
50
  *
@@ -51,150 +58,78 @@ export function openCfAccountPicker(): Promise<CfAccountSummary | null> {
51
58
  if (!canPick()) {
52
59
  return Promise.resolve(null);
53
60
  }
54
- return showDialog<CfAccountSummary | null>(
55
- (done) => {
56
- let accounts: CfAccountSummary[] = [];
57
- let loading = true;
58
- /** The last refusal — a listing that failed, or an account the broker would not accept. */
59
- let failure = "";
60
- /** The id being committed, so its own row can say so rather than the whole list going grey. */
61
- let choosing = "";
62
- let settled = false;
63
- let wrapperEl: HTMLElement | null = null;
61
+ return new Promise<CfAccountSummary | null>((resolve) => {
62
+ let accounts: CfAccountSummary[] = [];
63
+ /** The id being committed. Held here as well as in the scope: it is what guards a second press. */
64
+ let choosing = "";
65
+ let settled = false;
64
66
 
65
- function finish(account: CfAccountSummary | null): void {
66
- settled = true;
67
- done(account);
67
+ /* Resolve once, and take the dialog down with it. `close()` provokes the platform's own
68
+ `close`, which comes back as `onClosed` — so the guard is what keeps a chosen account from
69
+ being overwritten by the dismissal its own commit caused. */
70
+ const finish = (account: CfAccountSummary | null): void => {
71
+ if (settled) {
72
+ return;
68
73
  }
74
+ settled = true;
75
+ handle.close();
76
+ resolve(account);
77
+ };
69
78
 
70
- function repaint(): void {
71
- /* Resolved lazily, and only while the dialog is still up: `done` releases the slot, so a
72
- late `load()` landing after a dismissal would otherwise paint into a detached host. */
73
- const host = settled ? null : wrapperEl?.parentElement;
74
- if (host) {
75
- litRender(build(), host);
76
- }
79
+ async function load(): Promise<void> {
80
+ handle.update({ failure: "", loading: true });
81
+ let failure = "";
82
+ try {
83
+ accounts = (await getPlatform().cfAccounts?.()) ?? [];
84
+ } catch (error) {
85
+ accounts = [];
86
+ failure = reasonOf(error);
77
87
  }
78
-
79
- async function load(): Promise<void> {
80
- loading = true;
81
- failure = "";
82
- repaint();
83
- try {
84
- accounts = (await getPlatform().cfAccounts?.()) ?? [];
85
- } catch (error) {
86
- failure = error instanceof Error ? error.message : String(error);
87
- }
88
- loading = false;
89
- repaint();
88
+ /* `done` released the slot, so a late listing landing after a dismissal would otherwise be a
89
+ write into a disposed surface. The lit version guarded the same moment by resolving its
90
+ host lazily and finding none. */
91
+ if (settled) {
92
+ return;
90
93
  }
94
+ handle.update({ accounts, failure, loading: false });
95
+ }
91
96
 
92
- async function choose(account: CfAccountSummary): Promise<void> {
93
- choosing = account.id;
94
- failure = "";
95
- repaint();
96
- try {
97
- await getPlatform().cfSelectAccount?.({ id: account.id, name: account.name });
98
- } catch (error) {
99
- failure = error instanceof Error ? error.message : String(error);
100
- choosing = "";
101
- repaint();
102
- return;
103
- }
104
- /* The stored account is a credential like any other: the assistant's gate, the publish
105
- panel and the Preferences row all re-read from the same announcement. */
106
- notifyCredentialsChanged();
107
- finish(account);
97
+ async function choose(id: string): Promise<void> {
98
+ const account = accounts.find((candidate) => candidate.id === id);
99
+ if (!account || choosing !== "") {
100
+ return;
108
101
  }
109
-
110
- function listTpl(): TemplateResult | typeof nothing {
111
- if (loading) {
112
- return html`<p class="cf-account-picker-empty">Reading your Cloudflare accounts…</p>`;
102
+ choosing = id;
103
+ handle.update({ choosing: id, failure: "" });
104
+ try {
105
+ await getPlatform().cfSelectAccount?.({ id: account.id, name: account.name });
106
+ } catch (error) {
107
+ choosing = "";
108
+ if (!settled) {
109
+ /* The list survives a refusal, and the reason sits above it: listing again is not what
110
+ would fix an account the broker will not accept, so this state offers no retry. */
111
+ handle.update({ choosing: "", failure: reasonOf(error) });
113
112
  }
114
- /* Nothing to show and a reason why. The retry is offered only here: a commit that was
115
- refused (below) keeps the list, because listing again is not what would fix it. */
116
- if (accounts.length === 0) {
117
- return html`
118
- <p class="cf-account-picker-empty">
119
- ${
120
- failure
121
- ? `Cloudflare could not be reached: ${failure}`
122
- : "This Cloudflare login reaches no accounts. Create one at dash.cloudflare.com, then try again."
123
- }
124
- </p>
125
- ${
126
- failure
127
- ? html`<sp-button
128
- size="s"
129
- treatment="outline"
130
- @click=${() => {
131
- void load();
132
- }}
133
- >
134
- Try again
135
- </sp-button>`
136
- : nothing
137
- }
138
- `;
139
- }
140
- /* The row shape is Preferences › Accounts', deliberately reused: this IS an account list,
141
- and a second stylesheet entry for the same shape is how two lists drift apart. */
142
- return html`
143
- ${failure ? html`<p class="cf-account-picker-error">${failure}</p>` : nothing}
144
- <div class="prefs-accounts">
145
- ${accounts.map(
146
- (account) => html`
147
- <div class="prefs-account" data-account=${account.id}>
148
- <div class="prefs-account-text">
149
- <span class="prefs-account-label">${account.name}</span>
150
- <span class="prefs-account-detail">${account.id}</span>
151
- </div>
152
- <sp-button
153
- size="s"
154
- variant="accent"
155
- ?disabled=${choosing !== ""}
156
- @click=${() => {
157
- void choose(account);
158
- }}
159
- >
160
- ${choosing === account.id ? "Selecting…" : "Use this account"}
161
- </sp-button>
162
- </div>
163
- `,
164
- )}
165
- </div>
166
- `;
167
- }
168
-
169
- function build(): TemplateResult {
170
- return html`
171
- <sp-dialog-wrapper
172
- open
173
- underlay
174
- headline="Choose a Cloudflare account"
175
- cancel-label="Cancel"
176
- @cancel=${() => finish(null)}
177
- @close=${() => finish(null)}
178
- ${ref((el?: Element) => {
179
- if (el) {
180
- wrapperEl = el as HTMLElement;
181
- }
182
- })}
183
- >
184
- <div class="cf-account-picker">
185
- <p class="cf-account-picker-lede">
186
- Your Cloudflare login reaches more than one account. Publishing and the assistant
187
- both run against the one you pick; you can change it in Preferences › Accounts.
188
- </p>
189
- ${listTpl()}
190
- </div>
191
- </sp-dialog-wrapper>
192
- `;
113
+ return;
193
114
  }
115
+ /* The stored account is a credential like any other: the assistant's gate, the publish
116
+ panel and the Preferences row all re-read from the same announcement. */
117
+ notifyCredentialsChanged();
118
+ finish(account);
119
+ }
194
120
 
195
- void load();
196
- return build();
197
- },
198
- { region: overlayRegion("dialog", "cf-accounts") },
199
- );
121
+ const handle = openCfAccountPickerSurface({
122
+ layer: layerHost("dialog"),
123
+ onChoose: (id) => {
124
+ void choose(id);
125
+ },
126
+ onClosed: () => {
127
+ finish(null);
128
+ },
129
+ onRetry: () => {
130
+ void load();
131
+ },
132
+ });
133
+ void load();
134
+ });
200
135
  }
@@ -1,330 +1,109 @@
1
- /// <reference lib="dom" />
2
1
  /**
3
- * Color-selector.js — Color input widget with swatch, text field, and popover picker.
2
+ * The project's colour tokens, as a projection.
4
3
  *
5
- * Uses sp-overlay trigger pattern for positioning (same as unit-selector and value-selector). The
6
- * popover content is a JxColorPopover LitElement that reactively syncs color between the area,
7
- * slider, and text field via a single `color` property.
4
+ * This module used to be a CONTROL — a swatch, a text field and an `sp-overlay` holding an
5
+ * `sp-color-area`, an `sp-color-slider` and an `sp-swatch-group` — because `specs/ui.md` §5.6 was
6
+ * Pending and there was no colour element in the kit to draw a colour row with. It was the last
7
+ * Spectrum surface in Studio, and the island `studio-ui-guidelines.md` §9.4 describes: the Style
8
+ * tab and the Content tab each drew an empty `[part="control-host"]` and this filled it with lit.
8
9
  *
9
- * When the value is a var(--color-*) reference matching a defined color variable, the input
10
- * switches to picker mode showing the title-cased variable name (e.g. "Primary Blue") with a
11
- * swatch, similar to jx-value-selector's dual-mode behavior.
10
+ * §5.6 landed, so the control is `jx-color-field` and both tabs draw it inline in their own
11
+ * documents. What no kit element can answer is what is LEFT here: which colours this project has
12
+ * given a name to. That is a question about the document being edited — the `--color-*` custom
13
+ * properties of the effective style, site and document together — and it is Studio's to answer.
14
+ *
15
+ * A token is projected as three separate things on purpose, because they are three:
16
+ *
17
+ * - `value` is what choosing it COMMITS, and it is the reference (`var(--color-accent)`) rather than
18
+ * the colour behind it. Committing the literal would resolve the token at the moment of the click
19
+ * and quietly opt that one declaration out of the palette for ever.
20
+ * - `color` is how the chip LOOKS, which is the literal, and is not what the swatch means.
21
+ * - `label` is the word a reader would use. A colour is not a name: `jx-swatch` announces its own
22
+ * `value` when it is given no label, and "var(--color-primary-blue)" read one character at a time
23
+ * is a name in the same sense that a licence plate is.
24
+ *
25
+ * @docs studio/design/style-inspector
12
26
  */
13
27
 
14
- import { LitElement, html, nothing } from "lit";
15
- import { html as litHtml } from "lit-html";
16
- import { live } from "lit-html/directives/live.js";
17
- import { debouncedStyleCommit } from "../store";
18
28
  import { activeTab } from "../workspace/workspace";
19
29
  import { getEffectiveStyle } from "../site-context";
30
+ import { resolveTokenValue, tokenRefName } from "../style/token-ref";
20
31
  import { kebabToLabel } from "../utils/studio-utils";
21
32
 
22
- interface ColorVar {
23
- name: string;
33
+ /**
34
+ * One colour the project has named, as a swatch reads it.
35
+ *
36
+ * `Record<string, unknown>` because it is a `$map` item: a repeater's scope is a record, and a
37
+ * shape that is not one cannot be read through `$map/item/...`.
38
+ */
39
+ export interface ColorTokenView extends Record<string, unknown> {
40
+ /** What choosing this swatch commits — the reference, never the literal behind it. */
24
41
  value: string;
25
- }
26
-
27
- // ─── Helpers ─────────────────────────────────────────────────────────────────
28
-
29
- /** Extract --color-* CSS custom properties from the effective (site + document) style. */
30
- function getColorVars() {
31
- const style = getEffectiveStyle(activeTab.value?.doc.document?.style);
32
- if (!style) {
33
- return [];
34
- }
35
- const vars = [];
36
- for (const [k, v] of Object.entries(style)) {
37
- if (k.startsWith("--color") && (typeof v === "string" || typeof v === "number")) {
38
- vars.push({ name: k, value: String(v) });
39
- }
40
- }
41
- return vars;
42
+ /** The chip's colour: how the token looks, which is not what it means. */
43
+ color: string;
44
+ /** The token's name, title-cased — "Primary Blue" — and the swatch's accessible name. */
45
+ label: string;
42
46
  }
43
47
 
44
48
  /**
45
- * Convert a color variable name to a title-case label. Strips the "--color-" prefix and converts
46
- * kebab to title case. e.g. "--color-primary-blue" → "Primary Blue"
49
+ * Convert a colour variable's name to a title-case label.
50
+ *
51
+ * Strips the `--color-` prefix and converts kebab to title case, so `--color-primary-blue` becomes
52
+ * "Primary Blue". A token named `--color` alone has nothing left after the prefix, and falls back
53
+ * to its own name rather than announcing itself as the empty string.
54
+ *
55
+ * @param {string} name The custom property's name, with its leading dashes.
56
+ * @returns {string}
47
57
  */
48
- function varToLabel(name: string) {
49
- return kebabToLabel(name.replace(/^--color-?/, ""));
50
- }
51
-
52
- /** Resolve a color value for display — if it's a var() reference, look up the actual color. */
53
- function resolveColorForDisplay(val: string | number | undefined) {
54
- if (!val) {
55
- return "transparent";
56
- }
57
- const s = String(val);
58
- const m = s.match(/^var\((--[^)]+)\)$/);
59
- if (m) {
60
- const style = getEffectiveStyle(activeTab.value?.doc.document?.style);
61
- const resolved = style?.[m[1]!];
62
- if (typeof resolved === "string") {
63
- return resolved;
64
- }
65
- return "transparent";
66
- }
67
- return s;
68
- }
69
-
70
- function safeColor(val: string | number | undefined) {
71
- if (!val) {
72
- return "transparent";
73
- }
74
- return resolveColorForDisplay(val);
75
- }
76
-
77
- /** Normalize a color string to include # prefix for hex values. */
78
- function normalizeHex(c: string) {
79
- if (!c) {
80
- return c;
81
- }
82
- if (c.startsWith("var(") || c.startsWith("rgb") || c.startsWith("hsl")) {
83
- return c;
84
- }
85
- return c.replace(/^#?/, "#");
58
+ function varToLabel(name: string): string {
59
+ return kebabToLabel(name.replace(/^--color-?/, "")) || name;
86
60
  }
87
61
 
88
62
  /**
89
- * Check if a value is a var() reference that matches a defined color variable.
63
+ * The `--color-*` custom properties of the effective (site + document) style, in the order they are
64
+ * written.
65
+ *
66
+ * Only scalars are taken. A custom property whose value is an object is a nested rule rather than a
67
+ * colour, and a swatch drawn from one would be a chip of nothing labelled with a name that commits
68
+ * a reference to something that is not a colour.
90
69
  *
91
- * @param {string | number | undefined} value
92
- * @param {{ name: string; value: string }[]} colorVars
70
+ * @returns {ColorTokenView[]} The palette, empty when the document defines no colours.
93
71
  */
94
- function matchesColorVar(
95
- value: string | number | undefined,
96
- colorVars: { name: string; value: string }[],
97
- ) {
98
- if (!value || typeof value !== "string") {
99
- return null;
100
- }
101
- const m = value.match(/^var\((--[^)]+)\)$/);
102
- if (!m) {
103
- return null;
104
- }
105
- return colorVars.find((cv) => cv.name === m[1]) || null;
106
- }
107
-
108
- // ─── JxColorPopover LitElement ──────────────────────────────────────────────
109
-
110
- export class JxColorPopover extends LitElement {
111
- static override properties = {
112
- color: { type: String },
113
- colorVars: { attribute: false },
114
- displayColor: { attribute: false, type: String },
115
- };
116
-
117
- declare color: string;
118
- declare displayColor: string;
119
- declare colorVars: ColorVar[];
120
-
121
- constructor() {
122
- super();
123
- this.color = "";
124
- this.displayColor = "#000000";
125
- this.colorVars = [];
126
- }
127
-
128
- /** No shadow DOM — render directly into light DOM for Spectrum theming */
129
- override createRenderRoot() {
130
- return this;
131
- }
132
-
133
- /** @param {Map<string, unknown>} changed */
134
- override willUpdate(changed: Map<string, unknown>) {
135
- if (changed.has("color")) {
136
- const raw = resolveColorForDisplay(this.color);
137
- if (!raw || raw === "transparent") {
138
- this.displayColor = "#000000";
139
- } else if (raw.startsWith("#") || raw.startsWith("rgb") || raw.startsWith("hsl")) {
140
- this.displayColor = raw;
141
- } else {
142
- this.displayColor = `#${raw}`;
143
- }
144
- }
145
- }
146
-
147
- _handleArea(e: Event) {
148
- const color = normalizeHex(String((e.target as HTMLElement & { color: string }).color));
149
- this.displayColor = color;
150
- this.color = color;
151
- this.dispatchEvent(new CustomEvent("color-change", { bubbles: true, detail: color }));
152
- }
153
-
154
- _handleSlider(e: Event) {
155
- const color = normalizeHex(String((e.target as HTMLElement & { color: string }).color));
156
- this.displayColor = color;
157
- this.color = color;
158
- this.dispatchEvent(new CustomEvent("color-change", { bubbles: true, detail: color }));
159
- }
160
-
161
- _handleText(e: Event) {
162
- const val = (e.target as HTMLInputElement).value.trim();
163
- if (!val) {
164
- return;
72
+ export function colorTokens(): ColorTokenView[] {
73
+ /* `getEffectiveStyle` answers with an object whatever it is given — the site's, the document's,
74
+ the two merged, or an empty one — so there is no absent case to guard, and the guard that used
75
+ to stand here was a branch no test could reach because nothing could produce it. */
76
+ const style = getEffectiveStyle(activeTab.value?.doc.document?.style);
77
+ const tokens: ColorTokenView[] = [];
78
+ for (const [name, value] of Object.entries(style)) {
79
+ if (name.startsWith("--color") && (typeof value === "string" || typeof value === "number")) {
80
+ tokens.push({ color: String(value), label: varToLabel(name), value: `var(${name})` });
165
81
  }
166
- this.displayColor = val;
167
- this.color = val;
168
- this.dispatchEvent(new CustomEvent("color-change", { bubbles: true, detail: val }));
169
- }
170
-
171
- _handleSwatch(e: Event, varName: string) {
172
- e.stopPropagation();
173
- const varRef = `var(${varName})`;
174
- this.color = varRef;
175
- this.dispatchEvent(new CustomEvent("color-change", { bubbles: true, detail: varRef }));
176
- }
177
-
178
- override render() {
179
- return html`
180
- <div class="color-popover-inner">
181
- <sp-color-area
182
- style="width:200px; height:150px; --mod-colorarea-width:200px; --mod-colorarea-height:150px"
183
- .color=${this.displayColor}
184
- @input=${this._handleArea}
185
- ></sp-color-area>
186
- <sp-color-slider
187
- style="width:200px; --mod-colorslider-length:200px"
188
- .color=${this.displayColor}
189
- @input=${this._handleSlider}
190
- ></sp-color-slider>
191
- <sp-textfield
192
- size="s"
193
- style="width:200px"
194
- .value=${live(this.color || "")}
195
- placeholder="#000000"
196
- @change=${this._handleText}
197
- ></sp-textfield>
198
- ${
199
- this.colorVars.length > 0
200
- ? html`
201
- <sp-divider size="s"></sp-divider>
202
- <span class="color-popover-swatches-label">Color Tokens</span>
203
- <sp-swatch-group size="xs" border="light" rounding="none">
204
- ${this.colorVars.map(
205
- (cv) => html`
206
- <sp-swatch
207
- color=${cv.value}
208
- .value=${cv.name}
209
- title=${cv.name}
210
- @click=${(e: Event) => this._handleSwatch(e, cv.name)}
211
- ></sp-swatch>
212
- `,
213
- )}
214
- </sp-swatch-group>
215
- `
216
- : nothing
217
- }
218
- </div>
219
- `;
220
82
  }
83
+ return tokens;
221
84
  }
222
85
 
223
- // ─── Color input widget ─────────────────────────────────────────────────────
224
-
225
86
  /**
226
- * Render a color selector: swatch + text field + overlay popover. Uses sp-overlay trigger pattern
227
- * (same as unit-selector and value-selector).
87
+ * The literal behind a colour value that is a token reference, for a chip to draw.
88
+ *
89
+ * `var(--color-accent)` is a perfectly good value for the document being edited and nothing at all
90
+ * for the page drawing the Inspector: the token lives in the project's style, which the canvas
91
+ * iframe loads and Studio's own chrome never sees, so a `jx-color-field` handed the reference alone
92
+ * drew the no-colour checkerboard the moment a palette swatch was picked. This is the answer both
93
+ * tabs hand the field's `resolved` prop (ui.md §5.6): the chain followed through the effective
94
+ * style to the colour at its end.
228
95
  *
229
- * When value is a var(--color-*) matching a defined variable, switches to picker mode showing
230
- * title-cased label with swatch (e.g. "Primary Blue").
96
+ * Empty for a literal, which draws itself, and for a reference the style cannot resolve — a token a
97
+ * stylesheet defines, or an alias loop — where the field's own fallback is the right one.
231
98
  *
232
- * @param {string} prop — property key (for debounce namespace)
233
- * @param {string | number | undefined} value — current color value
234
- * @param {(color: string) => void} onChange — commit callback
235
- * @returns {import("lit-html").TemplateResult}
99
+ * @param {string} value The row's value as the field holds it.
100
+ * @returns {string} The colour to draw, or the empty string.
236
101
  */
237
- export function renderColorSelector(
238
- /** @type {string} */ prop: string,
239
- /** @type {string | number | undefined} */ value: string | number | undefined,
240
- /** @type {(color: string) => void} */ onChange: (color: string) => void,
241
- ) {
242
- const colorVars = getColorVars();
243
- const matchedVar = matchesColorVar(value, colorVars);
244
- const triggerId = `color-trigger-${prop}`;
245
- const pickerTriggerId = `color-picker-${prop}`;
246
-
247
- // ─── Picker mode: value matches a defined color variable ───
248
- if (matchedVar) {
249
- return litHtml`
250
- <div class="style-input-color">
251
- <sp-swatch
252
- size="s"
253
- rounding="none"
254
- border="light"
255
- color=${matchedVar.value}
256
- id=${triggerId}
257
- ></sp-swatch>
258
- <sp-overlay trigger="${triggerId}@click" placement="bottom-start" type="auto">
259
- <sp-popover style="padding:12px">
260
- <jx-color-popover
261
- .color=${value || ""}
262
- .colorVars=${colorVars}
263
- @color-change=${(e: CustomEvent) => onChange(e.detail as string)}
264
- ></jx-color-popover>
265
- </sp-popover>
266
- </sp-overlay>
267
- <sp-picker
268
- id=${pickerTriggerId}
269
- size="s"
270
- style="flex:1; min-width:0"
271
- .value=${`var(${matchedVar.name})`}
272
- @change=${(e: Event) => {
273
- e.stopPropagation();
274
- onChange((e.target as HTMLInputElement).value);
275
- }}
276
- >
277
- ${colorVars.map(
278
- (cv) => litHtml`
279
- <sp-menu-item value=${`var(${cv.name})`}>
280
- <sp-swatch
281
- slot="icon"
282
- size="xs"
283
- rounding="none"
284
- border="light"
285
- color=${cv.value}
286
- ></sp-swatch>
287
- ${varToLabel(cv.name)}
288
- </sp-menu-item>
289
- `,
290
- )}
291
- </sp-picker>
292
- </div>
293
- `;
102
+ export function resolvedColor(value: string): string {
103
+ if (tokenRefName(value) === null) {
104
+ return "";
294
105
  }
295
-
296
- // ─── Text mode: custom color value or empty ───
297
- return litHtml`
298
- <div class="style-input-color" id=${triggerId}>
299
- <sp-swatch
300
- size="s"
301
- rounding="none"
302
- border="light"
303
- color=${safeColor(value)}
304
- ></sp-swatch>
305
- <sp-textfield
306
- size="s"
307
- style="flex:1; min-width:0"
308
- .value=${live(value || "")}
309
- @click=${(e: Event) => e.stopPropagation()}
310
- @input=${debouncedStyleCommit(`color:${prop}`, 400, (e: Event) => {
311
- onChange((e.target as HTMLInputElement).value.trim());
312
- })}
313
- ></sp-textfield>
314
- <sp-overlay trigger="${triggerId}@click" placement="bottom-start" type="auto">
315
- <sp-popover style="padding:12px">
316
- <jx-color-popover
317
- .color=${value || ""}
318
- .colorVars=${colorVars}
319
- @color-change=${(e: CustomEvent) => onChange(e.detail as string)}
320
- ></jx-color-popover>
321
- </sp-popover>
322
- </sp-overlay>
323
- </div>
324
- `;
325
- }
326
-
327
- /** Whether any color popover is currently open. */
328
- export function isColorPopoverOpen() {
329
- return Boolean(document.querySelector(".style-input-color sp-overlay[open]"));
106
+ const style = getEffectiveStyle(activeTab.value?.doc.document?.style);
107
+ const resolved = resolveTokenValue(style, value);
108
+ return resolved === undefined ? "" : String(resolved);
330
109
  }