@jxsuite/studio 4.0.0 → 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/data/elements-meta.json +5 -15
- package/data/html-meta.json +51 -6
- package/dist/chunks/{2020-xp8vnwma.js → 2020-g79n01v9.js} +14 -14
- package/dist/chunks/action-group-sp6tna8v.js +118 -0
- package/dist/chunks/adapter-nj7tnjfn.js +13 -0
- package/dist/chunks/cf-account-picker-fyf63pmy.js +495 -0
- package/dist/chunks/cf-settings-71bv5zn9.js +20 -0
- package/dist/chunks/color-area-v17df7b8.js +154 -0
- package/dist/chunks/color-field-anwybnkn.js +208 -0
- package/dist/chunks/color-slider-44ez96fc.js +79 -0
- package/dist/chunks/color-xgg3kfw7.js +35 -0
- package/dist/chunks/combobox-5e7jev23.js +236 -0
- package/dist/chunks/components-2w1f35qs.js +18 -0
- package/dist/chunks/content-source-3wqeas45.js +46 -0
- package/dist/chunks/convert-to-repeater-d0cgnb6d.js +639 -0
- package/dist/chunks/dialog-s890b918.js +85 -0
- package/dist/chunks/editor-3qhbg51x.js +35 -0
- package/dist/chunks/entry-commands-d6g50j7s.js +42 -0
- package/dist/chunks/extension-sections-fy7q4fe9.js +651 -0
- package/dist/chunks/file-ops-3btj6st0.js +47 -0
- package/dist/chunks/files-ef8fgs3w.js +72 -0
- package/dist/chunks/format-host-3c33nwr8.js +40 -0
- package/dist/chunks/fs-events-13tj6sex.js +18 -0
- package/dist/chunks/git-panel-4wp2rn9b.js +49 -0
- package/dist/chunks/icons-yy10wk9r.js +402 -0
- package/dist/chunks/iframe-entry-15g3n6xv.js +114 -0
- package/dist/chunks/iframe-entry-b27vq81n.js +203 -0
- package/dist/chunks/iframe-entry-nbyxee1y.js +154 -0
- package/dist/chunks/iframe-host-jgesd924.js +115 -0
- package/dist/chunks/{index-nj44jpzj.js → index-mdmyx6s2.js} +11 -11
- package/dist/chunks/index-n4j7qxyr.js +109 -0
- package/dist/chunks/{javascript-q8kpmfah.js → javascript-xvrfrpkb.js} +8 -9
- package/dist/chunks/{jsonMode-dkr040ga.js → jsonMode-tyx2kj6p.js} +526 -527
- package/dist/chunks/jx-validate-j0wxk72w.js +15 -0
- package/dist/chunks/layers-1nq5evsh.js +29 -0
- package/dist/chunks/layers-panel-ar2gh90g.js +40 -0
- package/dist/chunks/listbox-6v2ac08j.js +44 -0
- package/dist/chunks/lit-html-m244w9nh.js +17 -0
- package/dist/chunks/media-picker-2qbetq73.js +33 -0
- package/dist/chunks/menu-q99sy9rf.js +285 -0
- package/dist/chunks/menu-rf7n72mf.js +14 -0
- package/dist/chunks/{monaco-binding-rj6xpx9y.js → monaco-binding-sw6en4dw.js} +12 -15
- package/dist/chunks/monaco-buffer-bhy3hb6m.js +24 -0
- package/dist/chunks/{monaco-setup-rws7k4br.js → monaco-setup-8r62fj6y.js} +27 -37
- package/dist/chunks/notify-628t0anh.js +21 -0
- package/dist/chunks/number-field-5cndyft8.js +72 -0
- package/dist/chunks/parse-0zx14y15.js +10 -0
- package/dist/chunks/platform-ts9cg1a4.js +15 -0
- package/dist/chunks/popover-47z3ytva.js +25 -0
- package/dist/chunks/publish-panel-98f7sr3g.js +27 -0
- package/dist/chunks/quick-search-srzz83k2.js +45 -0
- package/dist/chunks/references-n553f0e1.js +26 -0
- package/dist/chunks/right-panel-rrgx2dn3.js +45 -0
- package/dist/chunks/section-registry-5pq32t0q.js +25 -0
- package/dist/chunks/select-2r16ez41.js +49 -0
- package/dist/chunks/split-g7nm1rgb.js +191 -0
- package/dist/chunks/studio-0hqbpbd0.js +62 -0
- package/dist/chunks/studio-18avnhjp.js +2430 -0
- package/dist/chunks/{studio-kryvsw6j.js → studio-1k325pwf.js} +48 -48
- package/dist/chunks/{studio-hbtp0eh1.js → studio-25hkdrkw.js} +356 -85
- package/dist/chunks/studio-26d7myd1.js +258 -0
- package/dist/chunks/{studio-p8j86wag.js → studio-38emantv.js} +22 -5
- package/dist/chunks/studio-3gxv60tn.js +422 -0
- package/dist/chunks/{studio-8swrjbny.js → studio-3hxkd92t.js} +275 -163
- package/dist/chunks/studio-4m0haseg.js +185 -0
- package/dist/chunks/{studio-ynxwkrzd.js → studio-4wbb9ct0.js} +1953 -1785
- package/dist/chunks/{studio-gv8vvshc.js → studio-5523bpzt.js} +11 -11
- package/dist/chunks/{studio-5q69gfag.js → studio-57mf66w2.js} +1753 -2484
- package/dist/chunks/studio-5jy81t3s.js +17463 -0
- package/dist/chunks/studio-5rt7sqa0.js +1168 -0
- package/dist/chunks/studio-5te5tqng.js +81 -0
- package/dist/chunks/{studio-p4ngc046.js → studio-6ewqv390.js} +9 -9
- package/dist/chunks/{studio-9ab8gqsm.js → studio-6nzaktvy.js} +7 -7
- package/dist/chunks/studio-6xa21ej9.js +28 -0
- package/dist/chunks/{studio-5ehhackm.js → studio-727xh0e3.js} +19 -19
- package/dist/chunks/{studio-eenfkt4e.js → studio-79y5sz51.js} +52 -38
- package/dist/chunks/{studio-4q0wznzf.js → studio-7e11jpa9.js} +461 -145
- package/dist/chunks/{studio-q7v10cg2.js → studio-7r42c6ca.js} +17 -7
- package/dist/chunks/studio-7xptrg0j.js +954 -0
- package/dist/chunks/{studio-cft9r4r7.js → studio-81390n6f.js} +22 -22
- package/dist/chunks/{studio-q43a5y9h.js → studio-8jn5yhyn.js} +16 -16
- package/dist/chunks/studio-8qtrpzr3.js +839 -0
- package/dist/chunks/{studio-dg7zyt5x.js → studio-98b3z07n.js} +1 -1
- package/dist/chunks/studio-9xxz1q69.js +1356 -0
- package/dist/chunks/studio-akbww0j5.js +13615 -0
- package/dist/chunks/studio-arfpe389.js +195 -0
- package/dist/chunks/{studio-2zkz8evn.js → studio-az3zd49t.js} +473 -281
- package/dist/chunks/studio-cpvb2ed1.js +1171 -0
- package/dist/chunks/{studio-9r6j5ev1.js → studio-d0300636.js} +5078 -19
- package/dist/chunks/{studio-bgxt93ga.js → studio-d055c37e.js} +13 -13
- package/dist/chunks/studio-d1ja2x9r.js +362 -0
- package/dist/chunks/{studio-b9b6t1dg.js → studio-e1f24eff.js} +5664 -5666
- package/dist/chunks/{studio-4pqqxbrt.js → studio-em9nw8eh.js} +301 -112
- package/dist/chunks/studio-erdatzvp.js +1190 -0
- package/dist/chunks/{studio-g1wdche0.js → studio-esrxgwh6.js} +80 -80
- package/dist/chunks/studio-fabxk6r9.js +2811 -0
- package/dist/chunks/{studio-3n4ndrzh.js → studio-h4nvnjvz.js} +303 -303
- package/dist/chunks/studio-hhvs4sdg.js +195 -0
- package/dist/chunks/{studio-68n67094.js → studio-kcgff4r0.js} +15 -18
- package/dist/chunks/{studio-685s0ytq.js → studio-nqgawfks.js} +572 -572
- package/dist/chunks/{studio-xrapxwwc.js → studio-p1dw8wfw.js} +55 -29
- package/dist/chunks/studio-pm6hgy7r.js +4763 -0
- package/dist/chunks/studio-q0a3yk4n.js +33 -0
- package/dist/chunks/{studio-wcy8trfx.js → studio-q3x06vmj.js} +23 -22
- package/dist/chunks/studio-qahxvnan.js +111 -0
- package/dist/chunks/{studio-53n8bp04.js → studio-r6xmmtfh.js} +1 -1
- package/dist/chunks/{studio-kjjsjak4.js → studio-rkstz940.js} +3661 -6136
- package/dist/chunks/{studio-tvgyw9xw.js → studio-rnyf3f8e.js} +83 -250
- package/dist/chunks/studio-rpyah2ew.js +2805 -0
- package/dist/chunks/studio-rs76k67r.js +12 -0
- package/dist/chunks/{studio-yxrkyv8a.js → studio-s6z853aq.js} +12108 -11766
- package/dist/chunks/{studio-sf7zjgv1.js → studio-sgdc5pfc.js} +8 -8
- package/dist/chunks/studio-tb3ev01j.js +763 -0
- package/dist/chunks/{studio-t5wqwzdh.js → studio-tjjk7jvk.js} +1 -1
- package/dist/chunks/studio-vhv5tgxm.js +51 -0
- package/dist/chunks/{studio-htsf0w6m.js → studio-vz68yn9e.js} +31 -154
- package/dist/chunks/studio-wqpngpsk.js +174 -0
- package/dist/chunks/{studio-eesa1myv.js → studio-x3rty6tr.js} +58 -58
- package/dist/chunks/studio-xsykpvsh.js +8448 -0
- package/dist/chunks/{studio-92ab2jqe.js → studio-y9zedyjn.js} +14 -14
- package/dist/chunks/studio-yxa81f45.js +12 -0
- package/dist/chunks/swatch-group-t0n6h2rn.js +139 -0
- package/dist/chunks/tabs-wbp1cdws.js +156 -0
- package/dist/chunks/textfield-abk6qyee.js +73 -0
- package/dist/chunks/toast-780pvfbv.js +27 -0
- package/dist/chunks/toast-host-3sqv46sn.js +116 -0
- package/dist/chunks/toolbar-xbh5bhtr.js +194 -0
- package/dist/chunks/tooltip-eptb614w.js +369 -0
- package/dist/chunks/tree-a73p0pqm.js +367 -0
- package/dist/chunks/{tsMode-76kr53q0.js → tsMode-jy4m86rv.js} +83 -85
- package/dist/chunks/workspace-wrew8zk4.js +69 -0
- package/dist/chunks/{ws-client-6shc5rze.js → ws-client-ny4zc51r.js} +20 -22
- package/dist/iframe-entry.js +1812 -698
- package/dist/manifest.json +7 -0
- package/dist/studio.js +52900 -36573
- package/dist/workers/editor.worker.js +1040 -1085
- package/dist/workers/json.worker.js +1946 -1991
- package/dist/workers/ts.worker.js +4960 -5005
- package/favicon.ico +0 -0
- package/index.html +2 -0
- package/package.json +22 -55
- package/src/about/about-modal.ts +73 -123
- package/src/browse/library-commands.ts +20 -49
- package/src/browse/library-layouts.ts +87 -218
- package/src/browse/library-pane.ts +406 -438
- package/src/canvas/canvas-helpers.ts +0 -49
- package/src/canvas/canvas-live-render.ts +25 -2
- package/src/canvas/canvas-render.ts +666 -231
- package/src/canvas/canvas-surface.ts +0 -1
- package/src/canvas/canvas-utils.ts +310 -117
- package/src/canvas/dialog-path.ts +76 -0
- package/src/canvas/dialog-state.ts +67 -0
- package/src/canvas/diff-marks.ts +252 -0
- package/src/canvas/diff-toolbar.ts +349 -0
- package/src/canvas/diff-view.ts +123 -0
- package/src/canvas/edit-width-drag.ts +187 -0
- package/src/canvas/edit-width.ts +150 -0
- package/src/canvas/iframe-entry.ts +125 -8
- package/src/canvas/iframe-host.ts +271 -15
- package/src/canvas/iframe-interaction.ts +133 -13
- package/src/canvas/iframe-patch.ts +7 -1
- package/src/canvas/iframe-position.ts +5 -6
- package/src/canvas/iframe-protocol.ts +106 -5
- package/src/canvas/iframe-render.ts +373 -5
- package/src/canvas/iframe-slash.ts +2 -2
- package/src/canvas/iframe-subtree.ts +5 -8
- package/src/canvas/path-mapping.ts +25 -3
- package/src/canvas/popover-path.ts +106 -0
- package/src/canvas/popover-state.ts +155 -0
- package/src/canvas/surface-registry.ts +21 -10
- package/src/collab/presence-chips.ts +51 -73
- package/src/commands/app-commands.ts +10 -0
- package/src/commands/budget.ts +12 -0
- package/src/commands/command-args.ts +369 -6
- package/src/commands/defaults.ts +44 -14
- package/src/commands/live-context.ts +11 -5
- package/src/commands/reference.ts +12 -2
- package/src/commands/registry.ts +165 -8
- package/src/content/entry-commands.ts +16 -23
- package/src/content/entry-editor.ts +144 -101
- package/src/editor/canvas-slash-bridge.ts +2 -2
- package/src/editor/context-menu.ts +49 -200
- package/src/editor/convert-to-component.ts +42 -82
- package/src/editor/convert-to-repeater.ts +132 -173
- package/src/editor/inline-edit.ts +11 -0
- package/src/editor/shortcuts.ts +65 -26
- package/src/editor/slash-menu.ts +150 -157
- package/src/files/file-ops.ts +117 -11
- package/src/files/files.ts +949 -664
- package/src/files/json-layout.ts +474 -0
- package/src/files/media-paths.ts +13 -42
- package/src/files/media-usage.ts +41 -131
- package/src/files/serialize-document.ts +8 -1
- package/src/format/convert-file.ts +16 -10
- package/src/format/format-host.ts +50 -1
- package/src/github/github-auth.ts +71 -29
- package/src/github/github-publish.ts +57 -65
- package/src/grid/cell-editors.ts +46 -4
- package/src/grid/cell-popovers.ts +65 -62
- package/src/grid/grid-open.ts +86 -64
- package/src/grid/grid-panel.ts +390 -469
- package/src/grid/redirects-grid.ts +40 -44
- package/src/hosting/document.ts +2 -0
- package/src/hosting/layout.ts +10 -0
- package/src/i18n/i18n-commands.ts +127 -62
- package/src/media/media-pane.ts +83 -133
- package/src/new-project/add-repo-modal.ts +125 -176
- package/src/new-project/import-tab.ts +201 -250
- package/src/new-project/location-fields.ts +101 -165
- package/src/new-project/new-project-modal.ts +376 -367
- package/src/packages/jxsuite-update.ts +76 -18
- package/src/panels/activity-panel.ts +137 -104
- package/src/panels/ai-chat/chat-markdown.ts +15 -13
- package/src/panels/ai-chat/chat-view.ts +307 -472
- package/src/panels/ai-chat/composer.ts +175 -153
- package/src/panels/ai-chat/sessions-view.ts +31 -62
- package/src/panels/ai-panel.ts +210 -185
- package/src/panels/block-action-bar.ts +437 -643
- package/src/panels/bottom-dock.ts +112 -47
- package/src/panels/chat-panel.ts +19 -14
- package/src/panels/data-explorer.ts +141 -102
- package/src/panels/data-grid.ts +183 -150
- package/src/panels/dnd.ts +75 -20
- package/src/panels/editors.ts +26 -19
- package/src/panels/elements-panel.ts +243 -186
- package/src/panels/empty-state.ts +26 -42
- package/src/panels/events-panel.ts +950 -729
- package/src/panels/formula-workspace.ts +434 -207
- package/src/panels/frontmatter-fields.ts +185 -153
- package/src/panels/frontmatter-panel.ts +411 -187
- package/src/panels/git-diff-open.ts +148 -0
- package/src/panels/git-panel.ts +679 -605
- package/src/panels/head-panel.ts +617 -435
- package/src/panels/i18n-panel.ts +153 -133
- package/src/panels/imports-panel.ts +388 -414
- package/src/panels/jump-bar.ts +174 -147
- package/src/panels/layers-panel.ts +785 -671
- package/src/panels/left-panel.ts +166 -94
- package/src/panels/navigator-panels.ts +1 -1
- package/src/panels/pane-context.ts +529 -677
- package/src/panels/pane-grid.ts +265 -241
- package/src/panels/panel-registry.ts +15 -4
- package/src/panels/problems-panel.ts +177 -99
- package/src/panels/properties-panel.ts +1525 -966
- package/src/panels/provenance.ts +31 -113
- package/src/panels/quick-search.ts +217 -172
- package/src/panels/right-panel.ts +135 -169
- package/src/panels/seo-modal.ts +346 -167
- package/src/panels/settings-menu.ts +109 -646
- package/src/panels/settings-pane.ts +102 -86
- package/src/panels/signals-panel.ts +1318 -1172
- package/src/panels/statement-editor.ts +556 -428
- package/src/panels/style-panel.ts +1367 -630
- package/src/panels/style-utils.ts +36 -32
- package/src/panels/stylebook-doc.ts +30 -73
- package/src/panels/stylebook-layers-panel.ts +202 -109
- package/src/panels/stylebook-panel.ts +124 -88
- package/src/panels/tab-strip.ts +385 -287
- package/src/platforms/cloud.ts +347 -86
- package/src/platforms/devserver.ts +13 -0
- package/src/publish/deploy-checklist.ts +124 -78
- package/src/publish/publish-commands.ts +4 -12
- package/src/publish/publish-panel.ts +165 -299
- package/src/services/a11y-report.ts +100 -43
- package/src/services/ai-command-tools.ts +468 -0
- package/src/services/ai-import-tools.ts +50 -12
- package/src/services/ai-models.ts +108 -1
- package/src/services/ai-session-store.ts +6 -0
- package/src/services/ai-system-prompt.ts +110 -18
- package/src/services/ai-tools.ts +28 -143
- package/src/services/ai-write-report.ts +174 -0
- package/src/services/context-manager.ts +12 -1
- package/src/services/document-assistant.ts +50 -2
- package/src/services/idle.ts +16 -14
- package/src/services/live-surfaces.ts +237 -0
- package/src/services/model-uri.ts +75 -0
- package/src/services/notify.ts +63 -6
- package/src/services/popover-report.ts +325 -0
- package/src/services/surface-registry.ts +56 -0
- package/src/services/tool-executor.ts +17 -0
- package/src/settings/contexts-section.ts +301 -299
- package/src/settings/contributed-section.ts +361 -222
- package/src/settings/css-vars-editor.ts +320 -325
- package/src/settings/defs-editor.ts +572 -535
- package/src/settings/dependencies-editor.ts +79 -107
- package/src/settings/extension-commands.ts +379 -0
- package/src/settings/extension-rows.ts +113 -0
- package/src/settings/extensions-section.ts +287 -0
- package/src/settings/general-settings.ts +130 -181
- package/src/settings/head-editor.ts +10 -305
- package/src/settings/locales-section.ts +146 -196
- package/src/settings/preferences-accounts.ts +193 -12
- package/src/settings/preferences-dialog.ts +384 -307
- package/src/settings/project-sections.ts +108 -181
- package/src/settings/schema-field-ui.ts +11 -399
- package/src/settings/section-registry.ts +8 -1
- package/src/settings/settings-document.ts +31 -29
- package/src/shell/tree.ts +42 -87
- package/src/shell.ts +48 -36
- package/src/studio.ts +90 -67
- package/src/style/token-ref.ts +0 -39
- package/src/surfaces/about.json +263 -0
- package/src/surfaces/about.ts +163 -0
- package/src/surfaces/add-repo.json +486 -0
- package/src/surfaces/add-repo.ts +236 -0
- package/src/surfaces/ai-chat.json +2185 -0
- package/src/surfaces/ai-chat.ts +549 -0
- package/src/surfaces/ai-credentials-form.json +332 -0
- package/src/surfaces/ai-credentials-form.ts +151 -0
- package/src/surfaces/ai-managed-connect.json +108 -0
- package/src/surfaces/ai-managed-connect.ts +123 -0
- package/src/surfaces/ai-model-picker.json +114 -0
- package/src/surfaces/ai-model-picker.ts +139 -0
- package/src/surfaces/block-action-bar.json +640 -0
- package/src/surfaces/block-action-bar.ts +368 -0
- package/src/surfaces/bottom-dock.json +154 -0
- package/src/surfaces/bottom-dock.ts +125 -0
- package/src/surfaces/canvas-stage.json +444 -0
- package/src/surfaces/canvas-stage.ts +253 -0
- package/src/surfaces/cf-account-picker.json +300 -0
- package/src/surfaces/cf-account-picker.ts +214 -0
- package/src/surfaces/commandbar.json +984 -0
- package/src/{panels/toolbar.ts → surfaces/commandbar.ts} +414 -389
- package/src/surfaces/convert-repeater.json +309 -0
- package/src/surfaces/convert-repeater.ts +276 -0
- package/src/surfaces/data-actions.json +157 -0
- package/src/surfaces/data-actions.ts +115 -0
- package/src/surfaces/dialog.json +289 -0
- package/src/surfaces/dialog.ts +343 -0
- package/src/surfaces/diff-toolbar.json +266 -0
- package/src/surfaces/diff-toolbar.ts +139 -0
- package/src/surfaces/doc-header.json +739 -0
- package/src/surfaces/doc-header.ts +223 -0
- package/src/surfaces/empty-state.json +152 -0
- package/src/surfaces/empty-state.ts +173 -0
- package/src/surfaces/entry-editor.json +281 -0
- package/src/surfaces/entry-editor.ts +191 -0
- package/src/surfaces/expression-editor.json +977 -0
- package/src/surfaces/expression-editor.ts +266 -0
- package/src/surfaces/files-panel.json +592 -0
- package/src/surfaces/files-panel.ts +301 -0
- package/src/surfaces/formula-palette.json +364 -0
- package/src/surfaces/formula-palette.ts +340 -0
- package/src/surfaces/git-panel.json +1822 -0
- package/src/surfaces/git-panel.ts +272 -0
- package/src/surfaces/github-auth.json +112 -0
- package/src/surfaces/github-auth.ts +139 -0
- package/src/surfaces/github-publish.json +206 -0
- package/src/surfaces/github-publish.ts +169 -0
- package/src/surfaces/grid-cell.json +218 -0
- package/src/surfaces/grid-cell.ts +120 -0
- package/src/surfaces/grid-open.json +147 -0
- package/src/surfaces/grid-open.ts +87 -0
- package/src/surfaces/grid-panel.json +706 -0
- package/src/surfaces/grid-panel.ts +206 -0
- package/src/surfaces/grid-replace.json +179 -0
- package/src/surfaces/grid-replace.ts +89 -0
- package/src/surfaces/grid-views.json +446 -0
- package/src/surfaces/grid-views.ts +172 -0
- package/src/surfaces/inspector-dock.json +187 -0
- package/src/surfaces/inspector-dock.ts +161 -0
- package/src/surfaces/jump-bar.json +243 -0
- package/src/surfaces/jump-bar.ts +129 -0
- package/src/surfaces/jxsuite-update.json +146 -0
- package/src/surfaces/jxsuite-update.ts +149 -0
- package/src/surfaces/library-pane.json +1509 -0
- package/src/surfaces/library-pane.ts +363 -0
- package/src/surfaces/logic-panel.json +1949 -0
- package/src/surfaces/logic-panel.ts +369 -0
- package/src/surfaces/logic-workspace.json +685 -0
- package/src/surfaces/logic-workspace.ts +238 -0
- package/src/surfaces/media-browser.json +303 -0
- package/src/surfaces/media-browser.ts +145 -0
- package/src/surfaces/media-field.json +163 -0
- package/src/surfaces/media-field.ts +116 -0
- package/src/surfaces/media-pane.json +513 -0
- package/src/surfaces/media-pane.ts +197 -0
- package/src/surfaces/menu.json +232 -0
- package/src/surfaces/menu.ts +375 -0
- package/src/surfaces/navigator-dock.json +113 -0
- package/src/surfaces/navigator-dock.ts +130 -0
- package/src/surfaces/new-project.json +1654 -0
- package/src/surfaces/new-project.ts +411 -0
- package/src/surfaces/palette.json +535 -0
- package/src/surfaces/pane-context.json +1497 -0
- package/src/surfaces/pane-context.ts +513 -0
- package/src/surfaces/pane-grid.json +188 -0
- package/src/surfaces/pane-grid.ts +250 -0
- package/src/surfaces/panel-activity.json +563 -0
- package/src/surfaces/panel-activity.ts +187 -0
- package/src/surfaces/panel-data.json +141 -0
- package/src/surfaces/panel-data.ts +156 -0
- package/src/surfaces/panel-deploy-checklist.json +283 -0
- package/src/surfaces/panel-deploy-checklist.ts +175 -0
- package/src/surfaces/panel-elements.json +367 -0
- package/src/surfaces/panel-elements.ts +175 -0
- package/src/surfaces/panel-i18n.json +569 -0
- package/src/surfaces/panel-i18n.ts +212 -0
- package/src/surfaces/panel-imports.json +780 -0
- package/src/surfaces/panel-imports.ts +209 -0
- package/src/surfaces/panel-outline.json +734 -0
- package/src/surfaces/panel-outline.ts +326 -0
- package/src/surfaces/panel-page.json +1017 -0
- package/src/surfaces/panel-page.ts +240 -0
- package/src/surfaces/panel-problems.json +497 -0
- package/src/surfaces/panel-problems.ts +157 -0
- package/src/surfaces/panel-signals.json +1973 -0
- package/src/surfaces/panel-signals.ts +436 -0
- package/src/surfaces/panel-stylebook-layers.json +317 -0
- package/src/surfaces/panel-stylebook-layers.ts +155 -0
- package/src/surfaces/preferences.json +850 -0
- package/src/surfaces/preferences.ts +332 -0
- package/src/surfaces/progress-modal.json +110 -0
- package/src/surfaces/progress-modal.ts +150 -0
- package/src/surfaces/properties-panel.json +1578 -0
- package/src/surfaces/properties-panel.ts +337 -0
- package/src/surfaces/publish.json +945 -0
- package/src/surfaces/publish.ts +392 -0
- package/src/surfaces/push-plan.json +110 -0
- package/src/surfaces/push-plan.ts +87 -0
- package/src/surfaces/rail.json +255 -0
- package/src/surfaces/rail.ts +206 -0
- package/src/surfaces/reference-field.json +191 -0
- package/src/surfaces/reference-field.ts +168 -0
- package/src/surfaces/schema-builder.json +1011 -0
- package/src/surfaces/schema-builder.ts +181 -0
- package/src/surfaces/schema-form.json +1013 -0
- package/src/surfaces/schema-form.ts +287 -0
- package/src/surfaces/secret-field.json +60 -0
- package/src/surfaces/secret-field.ts +146 -0
- package/src/surfaces/seo.json +932 -0
- package/src/surfaces/seo.ts +334 -0
- package/src/surfaces/settings-contexts.json +538 -0
- package/src/surfaces/settings-contexts.ts +196 -0
- package/src/surfaces/settings-contributed.json +489 -0
- package/src/surfaces/settings-contributed.ts +199 -0
- package/src/surfaces/settings-css-vars.json +820 -0
- package/src/surfaces/settings-css-vars.ts +199 -0
- package/src/surfaces/settings-defs.json +1363 -0
- package/src/surfaces/settings-defs.ts +232 -0
- package/src/surfaces/settings-deploy.json +108 -0
- package/src/surfaces/settings-deploy.ts +135 -0
- package/src/surfaces/settings-extensions.json +486 -0
- package/src/surfaces/settings-extensions.ts +201 -0
- package/src/surfaces/settings-head.json +779 -0
- package/src/surfaces/settings-head.ts +397 -0
- package/src/surfaces/settings-locales.json +420 -0
- package/src/surfaces/settings-locales.ts +137 -0
- package/src/surfaces/settings-overview.json +423 -0
- package/src/surfaces/settings-overview.ts +218 -0
- package/src/surfaces/settings-packages.json +549 -0
- package/src/surfaces/settings-packages.ts +158 -0
- package/src/surfaces/settings-pane.json +147 -0
- package/src/surfaces/settings-pane.ts +150 -0
- package/src/surfaces/settings-rawjson.json +104 -0
- package/src/surfaces/settings-rawjson.ts +107 -0
- package/src/surfaces/shell.json +99 -0
- package/src/surfaces/shell.ts +30 -0
- package/src/surfaces/slash-menu.json +180 -0
- package/src/surfaces/slash-menu.ts +272 -0
- package/src/surfaces/statements.json +607 -0
- package/src/surfaces/statements.ts +238 -0
- package/src/surfaces/statusbar.json +94 -0
- package/src/{panels → surfaces}/statusbar.ts +163 -90
- package/src/surfaces/style-panel.json +1643 -0
- package/src/surfaces/style-panel.ts +338 -0
- package/src/surfaces/stylebook-chrome.json +122 -0
- package/src/surfaces/stylebook-chrome.ts +122 -0
- package/src/surfaces/tab-strip.json +448 -0
- package/src/surfaces/tab-strip.ts +200 -0
- package/src/surfaces/target-line.json +419 -0
- package/src/surfaces/target-line.ts +349 -0
- package/src/surfaces/toasts.json +189 -0
- package/src/surfaces/welcome.json +571 -0
- package/src/surfaces/welcome.ts +338 -0
- package/src/tabs/project-config.ts +71 -15
- package/src/tabs/tab.ts +52 -1
- package/src/types.ts +49 -3
- package/src/ui/ai-credentials-form.ts +104 -100
- package/src/ui/ai-managed-connect.ts +116 -49
- package/src/ui/ai-model-picker.ts +102 -47
- package/src/ui/cf-account-picker.ts +135 -0
- package/src/ui/color-selector.ts +80 -301
- package/src/ui/dynamic-slot.ts +43 -283
- package/src/ui/expression-editor.ts +797 -576
- package/src/ui/field-input.ts +8 -181
- package/src/ui/form-controls.ts +838 -366
- package/src/ui/formula-chips.ts +80 -85
- package/src/ui/kit.ts +33 -0
- package/src/ui/layers.ts +293 -593
- package/src/ui/media-picker.ts +203 -284
- package/src/ui/panel-resize.ts +251 -64
- package/src/ui/popover-surface.ts +153 -0
- package/src/ui/progress-modal.ts +22 -60
- package/src/ui/regions.ts +13 -7
- package/src/ui/schema-form.ts +906 -440
- package/src/ui/surface.ts +122 -0
- package/src/ui/unit-selector.ts +15 -131
- package/src/ui/value-source.ts +14 -0
- package/src/ui/virtual-window.ts +88 -9
- package/src/utils/canvas-media.ts +72 -0
- package/src/utils/edit-display.ts +7 -2
- package/src/utils/element-selectors.ts +69 -0
- package/src/utils/link-target.ts +2 -2
- package/src/utils/studio-utils.ts +0 -10
- package/src/view.ts +15 -0
- package/src/workspace/pane-derive.ts +36 -14
- package/src/workspace/workspace.ts +15 -6
- package/styles/canvas.css +72 -467
- package/styles/forced-colors.css +48 -82
- package/styles/forced-colors.json +41 -0
- package/styles/inspector.css +2 -1301
- package/styles/overlays.css +96 -2823
- package/styles/panels.css +6 -1423
- package/styles/shell-frame.css +272 -0
- package/styles/shell-frame.json +227 -0
- package/styles/shell.css +0 -1532
- package/styles/tokens.css +65 -136
- package/styles/tokens.json +84 -0
- package/dist/chunks/Overlay.dev-723bv0df.js +0 -23
- package/dist/chunks/adapter-jkcyhgtr.js +0 -14
- package/dist/chunks/cf-settings-45fgyx8y.js +0 -21
- package/dist/chunks/components-zmx10t62.js +0 -21
- package/dist/chunks/content-source-t88vb2dr.js +0 -49
- package/dist/chunks/convert-to-repeater-dhw1nrz9.js +0 -268
- package/dist/chunks/editor-cptq5jp1.js +0 -37
- package/dist/chunks/entry-commands-6z6bhxg0.js +0 -46
- package/dist/chunks/extension-sections-3ydgjbdy.js +0 -311
- package/dist/chunks/file-ops-rskmhxyq.js +0 -48
- package/dist/chunks/files-0cratsr0.js +0 -92
- package/dist/chunks/flow-qbfgrpeh.js +0 -634
- package/dist/chunks/focus-trap.esm-ggawf1hy.js +0 -1024
- package/dist/chunks/focus-visible-6eg70z18.js +0 -167
- package/dist/chunks/format-host-tgcmfs4p.js +0 -43
- package/dist/chunks/fs-events-hrrg328g.js +0 -21
- package/dist/chunks/git-panel-0yywyk76.js +0 -58
- package/dist/chunks/index-zqxmqxmh.js +0 -109
- package/dist/chunks/jx-validate-8q2g05x1.js +0 -19
- package/dist/chunks/layers-panel-z3tqe5cd.js +0 -67
- package/dist/chunks/layers-q75tj2mf.js +0 -45
- package/dist/chunks/lit-html-j055mkh8.js +0 -22
- package/dist/chunks/monaco-buffer-dqw0xxpx.js +0 -25
- package/dist/chunks/notify-yjm79n4s.js +0 -30
- package/dist/chunks/parse-24d0gay3.js +0 -19
- package/dist/chunks/platform-ba1j1gbh.js +0 -16
- package/dist/chunks/publish-panel-54jvhskq.js +0 -28
- package/dist/chunks/quick-search-cgfmjwq5.js +0 -65
- package/dist/chunks/references-3qx8fkyp.js +0 -29
- package/dist/chunks/right-panel-cqp8bc4v.js +0 -46
- package/dist/chunks/section-registry-sx1ykvkw.js +0 -30
- package/dist/chunks/sp-overlay.dev-yztmtrs1.js +0 -18
- package/dist/chunks/sp-popover.dev-n2etmqdp.js +0 -9
- package/dist/chunks/sp-progress-circle.dev-hryhj0es.js +0 -15
- package/dist/chunks/sp-tooltip.dev-xcvpnqr0.js +0 -15
- package/dist/chunks/sp-tray.dev-tkbscm06.js +0 -199
- package/dist/chunks/studio-0a5qrh01.js +0 -3
- package/dist/chunks/studio-18j3bmcz.js +0 -14
- package/dist/chunks/studio-1hbqnt19.js +0 -1823
- package/dist/chunks/studio-4rzyrtjz.js +0 -426
- package/dist/chunks/studio-5rywrkxz.js +0 -1903
- package/dist/chunks/studio-7afd21nw.js +0 -67
- package/dist/chunks/studio-7nte2hj4.js +0 -613
- package/dist/chunks/studio-8jpzqk5s.js +0 -128
- package/dist/chunks/studio-8q517dfr.js +0 -24
- package/dist/chunks/studio-9c4k4vhv.js +0 -357
- package/dist/chunks/studio-9n4mrmnb.js +0 -184
- package/dist/chunks/studio-a0tswy0w.js +0 -58
- package/dist/chunks/studio-ahjfdy6e.js +0 -387
- package/dist/chunks/studio-ahnzd9rg.js +0 -23
- package/dist/chunks/studio-bw5dz6km.js +0 -608
- package/dist/chunks/studio-cb12yz9w.js +0 -15055
- package/dist/chunks/studio-d1ks410h.js +0 -175
- package/dist/chunks/studio-eqq1w638.js +0 -113
- package/dist/chunks/studio-ex8zyp98.js +0 -1813
- package/dist/chunks/studio-h4rxscfc.js +0 -10
- package/dist/chunks/studio-kyh9avvv.js +0 -28
- package/dist/chunks/studio-kyk2v92a.js +0 -659
- package/dist/chunks/studio-m3hwn7y1.js +0 -120
- package/dist/chunks/studio-mmv72a27.js +0 -4344
- package/dist/chunks/studio-n8b9wqwy.js +0 -291
- package/dist/chunks/studio-pdfjntbk.js +0 -6939
- package/dist/chunks/studio-qq6jym04.js +0 -53
- package/dist/chunks/studio-r1r7afxx.js +0 -1066
- package/dist/chunks/studio-rdx8jcxy.js +0 -83
- package/dist/chunks/studio-rn9ta2mz.js +0 -111
- package/dist/chunks/studio-t7qb9db8.js +0 -665
- package/dist/chunks/studio-tmc5emrw.js +0 -8
- package/dist/chunks/studio-txwkm6p9.js +0 -12
- package/dist/chunks/studio-v38hmvx1.js +0 -390
- package/dist/chunks/studio-vadzgkrz.js +0 -318
- package/dist/chunks/studio-wx5609xd.js +0 -341
- package/dist/chunks/studio-z6nw2ek2.js +0 -18
- package/dist/chunks/studio-zczps70q.js +0 -378
- package/dist/chunks/workspace-xpres40v.js +0 -89
- package/src/panels/activity-bar.ts +0 -251
- package/src/panels/panel-scheduler.ts +0 -219
- package/src/panels/style-inputs.ts +0 -237
- package/src/panels/target-line.ts +0 -274
- package/src/panels/welcome-screen.ts +0 -346
- package/src/ui/button-group.ts +0 -102
- package/src/ui/choice-field.ts +0 -72
- package/src/ui/field-row.ts +0 -249
- package/src/ui/formula-palette.ts +0 -213
- package/src/ui/icons.ts +0 -52
- package/src/ui/jx-theme.ts +0 -130
- package/src/ui/spectrum.ts +0 -340
- package/src/ui/value-selector.ts +0 -174
- package/src/ui/widgets.ts +0 -172
- /package/dist/chunks/{javascript-s56a8dpk.css → javascript-4abzjcy9.css} +0 -0
- /package/dist/chunks/{jsonMode-zr9sw0c7.css → jsonMode-vvmpmk34.css} +0 -0
- /package/dist/chunks/{monaco-setup-pav68602.css → monaco-setup-8vbyqnhr.css} +0 -0
- /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
|
+
}
|