@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
@@ -0,0 +1,332 @@
1
+ /// <reference lib="dom" />
2
+ /**
3
+ * Preferences (⌘,) as a mounted document.
4
+ *
5
+ * `settings/preferences-dialog.ts` is the flow — which section is showing, what the shell's theme
6
+ * record holds, what `preferences-accounts.ts` enumerates, and the whole of the Keyboard sheet's
7
+ * state machine (the filter, the armed capture, the last refusal) — and this is the surface it
8
+ * draws into: the reactive scope the document reads, the four flags it discriminates on, and the
9
+ * mount that lives in the dialog layer until the flow takes it down.
10
+ *
11
+ * **The flow states facts; the surface derives what the document branches on.** Whether there is a
12
+ * registry at all, whether a filter matched anything, whether a refusal names a conflict — the flow
13
+ * answers each of those as a SENTENCE or an empty string, and `derive` turns "empty" into the case
14
+ * name. So no branch of the document is spelled twice.
15
+ *
16
+ * **Assistant is two islands.** `ui/ai-managed-connect.ts` and `ui/ai-credentials-form.ts` each own
17
+ * an element that three other credentials gates also embed, and a repaint of this sheet must never
18
+ * rebuild three fields a reader is typing into. So the document renders `managed-slot` and
19
+ * `creds-slot` empty and this module reports them through `onNodeCreated`, one `connectedCallback`
20
+ * earlier than awaiting the element would be — the island rule of studio-ui-guidelines.md §9.4.
21
+ *
22
+ * **Await the ELEMENT, not just the mount.** `mountSurface` resolving means the DOCUMENT rendered;
23
+ * a `jx-dialog`'s own template is one `connectedCallback` later, and `showModal` in between finds
24
+ * no `<dialog>` to open — the body is all there, correctly styled, and never shows. `whenReady` is
25
+ * shared with `surfaces/dialog.ts` rather than reimplemented.
26
+ *
27
+ * @docs studio/interface/preferences
28
+ */
29
+
30
+ import { reactive } from "../reactivity";
31
+ import { mountSurface, registerSurface } from "../ui/surface";
32
+ import { overlayRegion, REGION_ATTR } from "../ui/regions";
33
+ import { close as closeDialog, showModal } from "@jxsuite/ui/behaviors/dialog";
34
+ import { whenReady } from "./dialog";
35
+ import preferencesDoc from "./preferences.json";
36
+ import type { JxElement, JxDocument } from "@jxsuite/schema/types";
37
+ import type { JxScope } from "@jxsuite/runtime/types";
38
+ import type { SurfaceHandle } from "../ui/surface";
39
+
40
+ registerSurface("preferences", preferencesDoc as unknown as JxDocument);
41
+
42
+ /** One row of the section list. `current` is the string `aria-current` takes. */
43
+ export interface PreferencesSectionRow {
44
+ id: string;
45
+ title: string;
46
+ current: string;
47
+ }
48
+
49
+ /** One segment of the theme control. `checked` is the string `aria-checked` takes. */
50
+ export interface PreferencesThemeRow {
51
+ value: string;
52
+ label: string;
53
+ checked: string;
54
+ }
55
+
56
+ /** One button on an account row. */
57
+ export interface PreferencesAccountAction {
58
+ /** `"<account>/<action>"` — what `onAccountAction` takes, so a click names both halves. */
59
+ key: string;
60
+ /** The action's own id, which the row carries as `data-action`. */
61
+ id: string;
62
+ label: string;
63
+ /** The kit's button variant; `"secondary"` for the default treatment. */
64
+ variant: string;
65
+ }
66
+
67
+ /** One stored credential, as the Accounts section draws it. Never the secret. */
68
+ export interface PreferencesAccountRow {
69
+ id: string;
70
+ label: string;
71
+ detail: string;
72
+ actions: PreferencesAccountAction[];
73
+ }
74
+
75
+ /** One live binding. Every field is a string or a boolean the flow decided. */
76
+ export interface PreferencesKeyRow {
77
+ /** The row's identity for the keyed map: a command with two chords has two rows. */
78
+ key: string;
79
+ commandId: string;
80
+ /** The chord as the platform prints it, or the invitation while this row is capturing. */
81
+ chord: string;
82
+ title: string;
83
+ /** This row is listening for the next chord. */
84
+ capturing: boolean;
85
+ /** The binding came from the author's layer, so there is something to reset. */
86
+ overridden: boolean;
87
+ /** What the change button reads: "Change", or "Cancel" while it is listening. */
88
+ changeLabel: string;
89
+ /** The change button's accessible name, which says WHICH shortcut it changes. */
90
+ changeName: string;
91
+ /** The reset button's accessible name. */
92
+ resetName: string;
93
+ }
94
+
95
+ /** One scope's worth of bindings, under the heading the reference gives that scope. */
96
+ export interface PreferencesKeyGroup {
97
+ scope: string;
98
+ label: string;
99
+ rows: PreferencesKeyRow[];
100
+ }
101
+
102
+ /**
103
+ * What the flow knows. Not one field is a case name: the words are the flow's, and which of them
104
+ * add up to which branch is {@link derive}'s.
105
+ */
106
+ export interface PreferencesView {
107
+ /** The showing section's id — the document's outermost discriminant. */
108
+ section: string;
109
+ sections: PreferencesSectionRow[];
110
+ sectionTitle: string;
111
+ sectionBlurb: string;
112
+ themes: PreferencesThemeRow[];
113
+ accounts: PreferencesAccountRow[];
114
+ /** Why there is no keyboard sheet at all. Empty means there is one. */
115
+ keyboardEmpty: string;
116
+ /** What the search field shows: typed text, or a captured chord as it prints. */
117
+ keyQuery: string;
118
+ /** What the keystroke toggle reads, which is also whether it is listening. */
119
+ keystrokeLabel: string;
120
+ capturingSearch: boolean;
121
+ /** The last refusal, verbatim from whoever raised it. Empty draws nothing. */
122
+ refusal: string;
123
+ /** "Show Redo" — the one thing that can be done about a conflict. Empty draws no button. */
124
+ conflictLabel: string;
125
+ /** Why the list is empty under the current filter. Empty means it is not. */
126
+ rowsEmpty: string;
127
+ groups: PreferencesKeyGroup[];
128
+ }
129
+
130
+ /** The two islands the Assistant section renders and does not fill. */
131
+ export type PreferencesIsland = "managed" | "creds";
132
+
133
+ export interface PreferencesSurfaceOptions {
134
+ /** Where the sheet is mounted — the dialog layer, handed in so this never reaches back. */
135
+ layer: HTMLElement;
136
+ /** What to draw before anything has changed: the flow's own view, so there is one builder. */
137
+ view: PreferencesView;
138
+ onSelectSection: (id: string) => void;
139
+ onSetTheme: (value: string) => void;
140
+ /** One account button was pressed, named by its `"<account>/<action>"` key. */
141
+ onAccountAction: (key: string) => void;
142
+ onKeyQuery: (value: string) => void;
143
+ onToggleKeystroke: () => void;
144
+ onToggleRebind: (commandId: string) => void;
145
+ onResetBinding: (commandId: string) => void;
146
+ onShowConflict: () => void;
147
+ /** A keydown inside the keyboard sheet, whatever it was. The flow decides if it is a chord. */
148
+ onCaptureKey: (event: KeyboardEvent) => void;
149
+ /** An island was created: the flow puts the surface it owns inside it. */
150
+ onIsland: (island: PreferencesIsland, host: HTMLElement) => void;
151
+ /** The sheet closed, for any reason the platform owns as well as this module's `close`. */
152
+ onClosed: () => void;
153
+ }
154
+
155
+ export interface PreferencesSurfaceHandle {
156
+ /** The slot in the dialog layer the document is mounted into. */
157
+ host: HTMLElement;
158
+ /** Resolves with the `jx-dialog` element once it has rendered and been opened. */
159
+ ready: Promise<HTMLElement>;
160
+ /** Redraw from the flow's current view. */
161
+ update: (view: PreferencesView) => void;
162
+ /** Close the dialog (the platform restores focus) and dispose the document. Idempotent. */
163
+ close: () => void;
164
+ }
165
+
166
+ /** What the document discriminates on. Derived here, never handed in. */
167
+ interface PreferencesFlags {
168
+ /** `"none"` draws the reason instead of the whole sheet; `"keys"` draws the sheet. */
169
+ keyboardState: string;
170
+ /** `"empty"` draws the reason under the search box; `"rows"` draws the groups. */
171
+ rowsState: string;
172
+ hasRefusal: boolean;
173
+ hasConflict: boolean;
174
+ }
175
+
176
+ interface PreferencesScope extends Record<string, unknown>, PreferencesView, PreferencesFlags {
177
+ selectSection: (id: string) => void;
178
+ setTheme: (value: string) => void;
179
+ runAccountAction: (key: string) => void;
180
+ setKeyQuery: (value: string) => void;
181
+ toggleKeystroke: () => void;
182
+ toggleRebind: (commandId: string) => void;
183
+ resetBinding: (commandId: string) => void;
184
+ showConflict: () => void;
185
+ capture: (scope: JxScope, event: Event) => void;
186
+ closed: () => void;
187
+ }
188
+
189
+ /** The view plus the four flags the document branches on. */
190
+ function derive(view: PreferencesView): PreferencesView & PreferencesFlags {
191
+ return {
192
+ ...view,
193
+ hasConflict: view.conflictLabel !== "",
194
+ hasRefusal: view.refusal !== "",
195
+ keyboardState: view.keyboardEmpty === "" ? "keys" : "none",
196
+ rowsState: view.rowsEmpty === "" ? "rows" : "empty",
197
+ };
198
+ }
199
+
200
+ /** The `part` a node's definition carries, or `""` for a text node or an unmarked element. */
201
+ function partOf(def: JxElement | string): string {
202
+ const part = typeof def === "string" ? undefined : def.attributes?.["part"];
203
+ return typeof part === "string" ? part : "";
204
+ }
205
+
206
+ /**
207
+ * Open Preferences. The handle's `ready` resolves once the sheet is showing.
208
+ *
209
+ * @param options What to draw, and every decision a control can ask the flow for.
210
+ * @returns The handle the flow updates and closes.
211
+ */
212
+ export function openPreferencesSurface(
213
+ options: PreferencesSurfaceOptions,
214
+ ): PreferencesSurfaceHandle {
215
+ const slot = document.createElement("div");
216
+ /* The layer is `pointer-events: none` so a click passes through it when nothing is up, and every
217
+ slot in it turns them back on for its own content. `pointer-events` INHERITS, and the top layer
218
+ changes paint order rather than inheritance, so a modal `<dialog>` in a slot that skipped this
219
+ is painted above everything and hit-tests to nothing. */
220
+ slot.style.pointerEvents = "auto";
221
+ options.layer.append(slot);
222
+
223
+ let closed = false;
224
+ /**
225
+ * Say it is over, once.
226
+ *
227
+ * Two paths reach here and either may be first: the platform's own `close`, which `close()`
228
+ * provokes, and `close()` on a sheet that never got as far as being shown.
229
+ */
230
+ const finish = (): void => {
231
+ if (closed) {
232
+ return;
233
+ }
234
+ closed = true;
235
+ options.onClosed();
236
+ };
237
+
238
+ const scope = reactive({
239
+ ...derive(options.view),
240
+ capture: (_scope: JxScope, event: Event) => {
241
+ options.onCaptureKey(event as KeyboardEvent);
242
+ },
243
+ closed: finish,
244
+ resetBinding: (commandId: string) => {
245
+ options.onResetBinding(commandId);
246
+ },
247
+ runAccountAction: (key: string) => {
248
+ options.onAccountAction(key);
249
+ },
250
+ selectSection: (id: string) => {
251
+ options.onSelectSection(id);
252
+ },
253
+ setKeyQuery: (value: string) => {
254
+ /* What the control now holds, first and unconditionally. A binding only writes when the
255
+ scope CHANGES, so a surface that decided a query without announcing the raw one would
256
+ leave the field showing something the scope does not have (§9.3). */
257
+ scope.keyQuery = value;
258
+ options.onKeyQuery(value);
259
+ },
260
+ setTheme: (value: string) => {
261
+ options.onSetTheme(value);
262
+ },
263
+ showConflict: () => {
264
+ options.onShowConflict();
265
+ },
266
+ toggleKeystroke: () => {
267
+ options.onToggleKeystroke();
268
+ },
269
+ toggleRebind: (commandId: string) => {
270
+ options.onToggleRebind(commandId);
271
+ },
272
+ }) as PreferencesScope;
273
+
274
+ let mounted: SurfaceHandle | null = null;
275
+ const ready = mountSurface("preferences", scope, slot, {
276
+ onNodeCreated: (element, _path, def) => {
277
+ if (!(element instanceof HTMLElement)) {
278
+ return;
279
+ }
280
+ const part = partOf(def);
281
+ if (part === "managed-slot") {
282
+ options.onIsland("managed", element);
283
+ } else if (part === "creds-slot") {
284
+ options.onIsland("creds", element);
285
+ }
286
+ },
287
+ }).then(async (surface) => {
288
+ mounted = surface;
289
+ const element = surface.root as HTMLElement;
290
+ if (closed) {
291
+ surface.dispose();
292
+ return element;
293
+ }
294
+ await whenReady(element);
295
+ if (closed) {
296
+ return element;
297
+ }
298
+ /* The region goes on the platform's own `<dialog>`, which is the one element here that HAS a
299
+ box: `jx-dialog` is `display: contents`, and the slot wraps a dialog the top layer takes out
300
+ of flow, so both measure 0×0 — and a region whose box is empty is refused outright by
301
+ `scripts/screenshots/lib/shot.ts`. The kit treats that node as a seam already; its own
302
+ behaviour sidecar finds it by exactly this selector. */
303
+ const box = element.querySelector<HTMLElement>('dialog[part="dialog"]') ?? element;
304
+ box.setAttribute(REGION_ATTR, overlayRegion("dialog", "preferences"));
305
+ showModal(element);
306
+ return element;
307
+ });
308
+
309
+ return {
310
+ close() {
311
+ /* Guarded on the WORK rather than on `closed`, and the difference is a slot that would
312
+ otherwise be left behind: the platform's own `close` runs `finish()` before any caller
313
+ reaches here, so a `close()` that returned early on `closed` would take the sheet down and
314
+ leave its host div in the layer. Every line below is idempotent instead. */
315
+ const element = mounted?.root;
316
+ if (element instanceof HTMLElement) {
317
+ // The platform's close first, so focus goes back where it came from; then the document.
318
+ closeDialog(element);
319
+ }
320
+ // A mount that has not landed yet is disposed by `ready` when it does — `finish` tells it so.
321
+ mounted?.dispose();
322
+ mounted = null;
323
+ slot.remove();
324
+ finish();
325
+ },
326
+ host: slot,
327
+ ready,
328
+ update(view) {
329
+ Object.assign(scope, derive(view));
330
+ },
331
+ };
332
+ }
@@ -0,0 +1,110 @@
1
+ {
2
+ "$schema": "https://jxsuite.com/schema/v1",
3
+ "$id": "StudioProgressModal",
4
+ "$description": "The one surface in Studio that blocks while it works: the operation's name, a spinner, the line under it, and the two ways out. A `jx-dialog`, so the platform owns modality, the backdrop, focus restoration and Escape — which is what retired the `sp-underlay` this surface used to paint beside itself, and with it the fixed box, the panel, the shadow and the `z-index: 1000` that box needed to climb back out from under its own scrim. The two answers are the dialog's own: confirm is `Run in the background`, which stops the BLOCKING and leaves the work running in Activity, and the secondary answer is Cancel, drawn only when the operation handed one over. It is the secondary rather than the cancel answer for a reason that is behavioural, not cosmetic: the platform raises one `cancel` for Escape, for a light dismissal and for the cancel button alike, and a surface that cannot tell them apart would stop a dependency install on a keystroke. Escape therefore means what confirm means — stop blocking, not stop working — and the answer that stops the work is a button and only a button.",
5
+ "tagName": "jx-dialog",
6
+ "$props": {
7
+ "headline": {
8
+ "$ref": "#/state/title"
9
+ },
10
+ "confirmLabel": "Run in the background",
11
+ "secondaryLabel": {
12
+ "$ref": "#/state/cancelLabel"
13
+ },
14
+ "cancelLabel": "",
15
+ "size": "sm"
16
+ },
17
+ "attributes": {
18
+ "part": "progress"
19
+ },
20
+ "onconfirm": {
21
+ "$prototype": "Function",
22
+ "body": [
23
+ {
24
+ "operator": "call",
25
+ "target": {
26
+ "$ref": "#/state/background"
27
+ },
28
+ "value": []
29
+ }
30
+ ]
31
+ },
32
+ "onsecondary": {
33
+ "$prototype": "Function",
34
+ "body": [
35
+ {
36
+ "operator": "call",
37
+ "target": {
38
+ "$ref": "#/state/cancel"
39
+ },
40
+ "value": []
41
+ }
42
+ ]
43
+ },
44
+ "oncancel": {
45
+ "$prototype": "Function",
46
+ "body": [
47
+ {
48
+ "operator": "call",
49
+ "target": {
50
+ "$ref": "#/state/background"
51
+ },
52
+ "value": []
53
+ }
54
+ ]
55
+ },
56
+ "onclose": {
57
+ "$prototype": "Function",
58
+ "body": [
59
+ {
60
+ "operator": "call",
61
+ "target": {
62
+ "$ref": "#/state/closed"
63
+ },
64
+ "value": []
65
+ }
66
+ ]
67
+ },
68
+ "style": {
69
+ "$description": "What is left once `jx-dialog` has drawn the dialog. `.progress-modal` is gone rather than moved — it positioned a fixed box, painted its panel, border, radius and shadow, capped its height and then lifted itself above the scrim it rendered beside — and a modal `<dialog>` in the top layer is every one of those. `.progress-title` went the same way: the operation's name is the dialog's headline, which is also its accessible name, so nothing here draws a title.",
70
+ "& [part=\"row\"]": {
71
+ "display": "flex",
72
+ "alignItems": "center",
73
+ "gap": "var(--jx-space-4)"
74
+ },
75
+ "& [part=\"status\"]": {
76
+ "$description": "`anywhere`, because a status line is usually a path or a package spec with no space in it, and one of those would otherwise be the thing that decides how wide the dialog is. `min-width: 0` is what lets it wrap at all: a flex item's automatic minimum is its content, so without this the row refuses to shrink and the text overflows instead.",
77
+ "minWidth": "0",
78
+ "color": "var(--fg-dim)",
79
+ "fontSize": "var(--jx-text-md)",
80
+ "overflowWrap": "anywhere"
81
+ }
82
+ },
83
+ "children": [
84
+ {
85
+ "tagName": "div",
86
+ "attributes": {
87
+ "part": "row"
88
+ },
89
+ "children": [
90
+ {
91
+ "tagName": "jx-spinner",
92
+ "attributes": {
93
+ "part": "busy"
94
+ },
95
+ "$props": {
96
+ "size": "lg"
97
+ }
98
+ },
99
+ {
100
+ "tagName": "span",
101
+ "attributes": {
102
+ "part": "status",
103
+ "aria-live": "polite"
104
+ },
105
+ "textContent": "${state.status}"
106
+ }
107
+ ]
108
+ }
109
+ ]
110
+ }
@@ -0,0 +1,150 @@
1
+ /// <reference lib="dom" />
2
+ /**
3
+ * The blocking progress surface: a `jx-dialog` mounted into the modal layer and opened modally.
4
+ *
5
+ * This is the adapter. `ui/progress-modal.ts` keeps the flow — the Activity entry the operation is
6
+ * recorded in, what a failure does to Problems, which of the two exits hands the app back — and
7
+ * hands this module a projection: a title, a status line, and whether the operation can be stopped.
8
+ * The document renders that; the platform's `<dialog>` owns modality, the backdrop, focus
9
+ * restoration and Escape.
10
+ *
11
+ * Nothing here traps Tab, focuses the first control or paints a scrim, and that is the whole
12
+ * substance of the conversion rather than a tidy-up. The lit version was a card beside an
13
+ * `<sp-underlay>` in a slot that ran a keydown listener; the scrim painted at `z-index: 1` and the
14
+ * card at `auto`, so `Run in the background` — the only way out of a running install — was visible
15
+ * through the scrim and could not be clicked. A modal `<dialog>` is in the top layer by
16
+ * construction, so there is no stacking left to get wrong.
17
+ *
18
+ * @docs studio/interface
19
+ */
20
+
21
+ import { reactive } from "../reactivity";
22
+ import { mountSurface, registerSurface } from "../ui/surface";
23
+ import { overlayRegion, REGION_ATTR } from "../ui/regions";
24
+ import { close as closeDialog, showModal } from "@jxsuite/ui/behaviors/dialog";
25
+ import { whenReady } from "./dialog";
26
+ import progressDoc from "./progress-modal.json";
27
+ import type { SurfaceHandle } from "../ui/surface";
28
+ import type { JxDocument } from "@jxsuite/schema/types";
29
+
30
+ registerSurface("progress-modal", progressDoc as unknown as JxDocument);
31
+
32
+ /** What the flow hands the surface. Everything is a projection; the flow keeps the operation. */
33
+ export interface ProgressSurfaceOptions {
34
+ /** Where the dialog is mounted — the modal layer, handed in so this module never reaches back. */
35
+ layer: HTMLElement;
36
+ /** The operation's name, which the dialog draws as its headline and its accessible name. */
37
+ title: string;
38
+ /** The line under it, which is also the surface's live region. */
39
+ status: string;
40
+ /**
41
+ * The operation handed over a way to stop it, so a Cancel answer is drawn.
42
+ *
43
+ * Absent means it genuinely cannot be stopped and no button claims otherwise — but the confirm
44
+ * answer is offered regardless, because "let me use the app" is a promise this surface can always
45
+ * keep.
46
+ */
47
+ cancellable: boolean;
48
+ /** Stop blocking and keep working. The confirm button and Escape both mean this. */
49
+ onBackground: () => void;
50
+ /** Stop the work. Reachable only when `cancellable`. */
51
+ onCancel: () => void;
52
+ /** The dialog closed, for any reason the platform owns as well as this module's `close`. */
53
+ onClosed: () => void;
54
+ }
55
+
56
+ export interface ProgressSurfaceHandle {
57
+ /** The slot in the modal layer that carries the region. */
58
+ host: HTMLElement;
59
+ /** Resolves with the `jx-dialog` element once it has rendered and been opened. */
60
+ ready: Promise<HTMLElement>;
61
+ /** Rewrite the status line. A no-op once the dialog is gone. */
62
+ setStatus: (text: string) => void;
63
+ /** Close the dialog (the platform restores focus) and dispose the document. Idempotent. */
64
+ close: () => void;
65
+ }
66
+
67
+ interface ProgressScope extends Record<string, unknown> {
68
+ title: string;
69
+ status: string;
70
+ /**
71
+ * The secondary answer's label, empty for none — which is how "this cannot be stopped" is said.
72
+ *
73
+ * It is the SECONDARY answer rather than the cancel one because the platform raises a single
74
+ * `cancel` for Escape, for a light dismissal and for a cancel button alike. A surface that cannot
75
+ * tell those apart would stop a dependency install on a keystroke, and Escape here has always
76
+ * meant stop blocking rather than stop working.
77
+ */
78
+ cancelLabel: string;
79
+ background: () => void;
80
+ cancel: () => void;
81
+ closed: () => void;
82
+ }
83
+
84
+ /** Open the progress dialog. The handle's `ready` resolves once it is showing. */
85
+ export function openProgressSurface(options: ProgressSurfaceOptions): ProgressSurfaceHandle {
86
+ const slot = document.createElement("div");
87
+ /* The layer is `pointer-events: none` so a click passes through it when nothing is up, and every
88
+ slot in it turns them back on for its own content. */
89
+ slot.style.pointerEvents = "auto";
90
+ slot.setAttribute(REGION_ATTR, overlayRegion("modal", "progress"));
91
+ options.layer.append(slot);
92
+
93
+ let closed = false;
94
+ const scope = reactive<ProgressScope>({
95
+ background: () => {
96
+ options.onBackground();
97
+ },
98
+ cancel: () => {
99
+ options.onCancel();
100
+ },
101
+ cancelLabel: options.cancellable ? "Cancel" : "",
102
+ closed: () => {
103
+ options.onClosed();
104
+ },
105
+ status: options.status,
106
+ title: options.title,
107
+ }) as ProgressScope;
108
+
109
+ let mounted: SurfaceHandle | null = null;
110
+ const ready = mountSurface("progress-modal", scope, slot).then(async (surface) => {
111
+ const element = surface.root as HTMLElement;
112
+ if (closed) {
113
+ surface.dispose();
114
+ return element;
115
+ }
116
+ mounted = surface;
117
+ /* `whenReady` before `showModal`, and it is not belt and braces: the mount resolving means the
118
+ DOCUMENT rendered, while the element's OWN template is one `connectedCallback` later.
119
+ `showModal` in between finds no `<dialog>` to open, and the surface never shows. */
120
+ await whenReady(element);
121
+ if (closed) {
122
+ return element;
123
+ }
124
+ showModal(element);
125
+ return element;
126
+ });
127
+
128
+ return {
129
+ close() {
130
+ if (closed) {
131
+ return;
132
+ }
133
+ closed = true;
134
+ const element = mounted?.root;
135
+ if (element instanceof HTMLElement) {
136
+ // The platform's close first, so focus goes back where it came from; then the document.
137
+ closeDialog(element);
138
+ }
139
+ // A mount that has not landed yet is disposed by `ready` when it does.
140
+ mounted?.dispose();
141
+ mounted = null;
142
+ slot.remove();
143
+ },
144
+ host: slot,
145
+ ready,
146
+ setStatus(text: string) {
147
+ scope.status = text;
148
+ },
149
+ };
150
+ }