@jxsuite/studio 4.1.0 → 5.1.0

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