@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,411 @@
|
|
|
1
|
+
/// <reference lib="dom" />
|
|
2
|
+
/**
|
|
3
|
+
* The New Project wizard as a mounted document.
|
|
4
|
+
*
|
|
5
|
+
* `new-project/new-project-modal.ts` is the flow — it holds the step, the tab, the chosen starter
|
|
6
|
+
* and the two forms behind it, decides what the AI gate answers, calls `createProject` and resolves
|
|
7
|
+
* the promise its entry point returns — and this is the surface it draws into: the reactive scope
|
|
8
|
+
* the document reads, the discriminants it branches on, and the mount that lives in the dialog
|
|
9
|
+
* layer until the flow takes it down.
|
|
10
|
+
*
|
|
11
|
+
* **The flow states facts; the surface derives what the document branches on.** Which step is up,
|
|
12
|
+
* which tab is chosen and whether AI is usable are the flow's; that those add up to one of five
|
|
13
|
+
* bodies is {@link derive}'s, so neither the flow nor the document has to know that "the Import tab
|
|
14
|
+
* with no key" and "the Agent tab with no key" are the same gate said twice.
|
|
15
|
+
*
|
|
16
|
+
* **Three islands, all through `onNodeCreated`.** The credentials form, the keyless Cloudflare
|
|
17
|
+
* offer and the model catalogue are each a mounted document of their own with a host element the
|
|
18
|
+
* controller owns, so the wizard's document renders three empty boxes and this module puts those
|
|
19
|
+
* hosts inside them (specs/studio-ui-guidelines.md §9.4). A box is filled when it is created AND on
|
|
20
|
+
* every update, because a controller's `render()` is what brings its own surface up to date — and
|
|
21
|
+
* the placement is conditional on the host not already being there, because re-appending a node
|
|
22
|
+
* that is already in place disconnects and reconnects it, which would take the caret out of the
|
|
23
|
+
* field a reader is typing a key into.
|
|
24
|
+
*
|
|
25
|
+
* **Await the ELEMENT, not just the mount.** `mountSurface` resolving means the DOCUMENT rendered;
|
|
26
|
+
* a `jx-dialog`'s own template is one `connectedCallback` later, and `showModal` in between finds
|
|
27
|
+
* no `<dialog>` to open — the body is all there, correctly styled, and never shows. `whenReady` is
|
|
28
|
+
* shared with `surfaces/dialog.ts`, `surfaces/publish.ts` and `surfaces/add-repo.ts` rather than
|
|
29
|
+
* reimplemented.
|
|
30
|
+
*
|
|
31
|
+
* @docs studio/projects/create
|
|
32
|
+
*/
|
|
33
|
+
|
|
34
|
+
import { reactive } from "../reactivity";
|
|
35
|
+
import { mountSurface, registerSurface } from "../ui/surface";
|
|
36
|
+
import { overlayRegion, REGION_ATTR } from "../ui/regions";
|
|
37
|
+
import { close as closeDialog, showModal } from "@jxsuite/ui/behaviors/dialog";
|
|
38
|
+
import { whenReady } from "./dialog";
|
|
39
|
+
import newProjectDoc from "./new-project.json";
|
|
40
|
+
import type { SurfaceHandle } from "../ui/surface";
|
|
41
|
+
import type { JxDocument, JxElement } from "@jxsuite/schema/types";
|
|
42
|
+
|
|
43
|
+
registerSurface("new-project", newProjectDoc as unknown as JxDocument);
|
|
44
|
+
|
|
45
|
+
/** One row of a kit `jx-select`, and of the tab strip: a value and what it reads. */
|
|
46
|
+
export interface NewProjectRow {
|
|
47
|
+
value: string;
|
|
48
|
+
label: string;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** One card in the starter gallery — including the one that is not a starter. */
|
|
52
|
+
export interface NewProjectCard {
|
|
53
|
+
/** The starter id, and the row's key. `""` is Start from scratch. */
|
|
54
|
+
id: string;
|
|
55
|
+
name: string;
|
|
56
|
+
tagline: string;
|
|
57
|
+
/** The tooltip: the starter's own description, or empty for the scratch card. */
|
|
58
|
+
title: string;
|
|
59
|
+
thumbnail: string;
|
|
60
|
+
/** `"thumb"` draws the picture, `"blank"` draws the `+` well and spans the gallery. */
|
|
61
|
+
art: "thumb" | "blank";
|
|
62
|
+
selected: boolean;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/** Which body the document draws. Five, because the two gates are one sentence with two texts. */
|
|
66
|
+
export type NewProjectBody = "starter" | "gate" | "agent" | "import" | "params";
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* What the flow knows. Every one of these may change while the wizard is up, and not one of them is
|
|
70
|
+
* a decision: the words and the shapes belong to the document.
|
|
71
|
+
*/
|
|
72
|
+
export interface NewProjectView {
|
|
73
|
+
/** The headline, which is also the dialog's accessible name: the two steps name themselves. */
|
|
74
|
+
headline: string;
|
|
75
|
+
/** The primary button's text; empty draws no primary, which is how a closed gate says so. */
|
|
76
|
+
confirmLabel: string;
|
|
77
|
+
/** Back, on the second step only. Empty draws nothing. */
|
|
78
|
+
secondaryLabel: string;
|
|
79
|
+
/** Whether the source tabs are on screen — step one only. */
|
|
80
|
+
showTabs: boolean;
|
|
81
|
+
/** The chosen tab's value, and the strip's rows. */
|
|
82
|
+
tab: string;
|
|
83
|
+
tabs: NewProjectRow[];
|
|
84
|
+
/** Which body to draw. */
|
|
85
|
+
body: NewProjectBody;
|
|
86
|
+
/** The sentence above a closed AI gate: the two tabs ask for the same thing differently. */
|
|
87
|
+
gateIntro: string;
|
|
88
|
+
/** The gallery, already ordered and already carrying the scratch card. */
|
|
89
|
+
cards: NewProjectCard[];
|
|
90
|
+
/** The Agent tab's brief. */
|
|
91
|
+
agentPrompt: string;
|
|
92
|
+
/** The source this project is being made from, said on the step with no tab strip. */
|
|
93
|
+
contextLabel: string;
|
|
94
|
+
/** The sentence at the foot of the second step. */
|
|
95
|
+
note: string;
|
|
96
|
+
/** Name and slug, held by the flow so a repaint cannot lose what the reader typed. */
|
|
97
|
+
name: string;
|
|
98
|
+
nameError: string;
|
|
99
|
+
slug: string;
|
|
100
|
+
/** What the slug field is called: a folder on disk, or a repository. */
|
|
101
|
+
slugLabel: string;
|
|
102
|
+
|
|
103
|
+
// ── destination (new-project/location-fields.ts) ──────────────────────────
|
|
104
|
+
/** Which destination shape this platform writes: a path, or a repository. */
|
|
105
|
+
destination: "path" | "repo";
|
|
106
|
+
parent: string;
|
|
107
|
+
parentPlaceholder: string;
|
|
108
|
+
/** This platform can open a native directory dialog. */
|
|
109
|
+
canBrowse: boolean;
|
|
110
|
+
browsing: boolean;
|
|
111
|
+
browseLabel: string;
|
|
112
|
+
owner: string;
|
|
113
|
+
owners: NewProjectRow[];
|
|
114
|
+
/** `"private"` or `"public"` — a value rather than a flag, because a select holds one. */
|
|
115
|
+
visibility: string;
|
|
116
|
+
visibilities: NewProjectRow[];
|
|
117
|
+
/** The owner already has a repository of this name. Empty says nothing. */
|
|
118
|
+
repoTaken: string;
|
|
119
|
+
/** `Creates` or `Repository`, and the destination itself. */
|
|
120
|
+
previewLabel: string;
|
|
121
|
+
preview: string;
|
|
122
|
+
destinationError: string;
|
|
123
|
+
|
|
124
|
+
// ── import (new-project/import-tab.ts) ────────────────────────────────────
|
|
125
|
+
url: string;
|
|
126
|
+
depth: string;
|
|
127
|
+
maxDepth: string;
|
|
128
|
+
maxPages: string;
|
|
129
|
+
breakpointMode: string;
|
|
130
|
+
breakpointModes: NewProjectRow[];
|
|
131
|
+
breakpointCount: string;
|
|
132
|
+
maxBreakpoints: string;
|
|
133
|
+
breakpointWidths: string;
|
|
134
|
+
breakpointRounding: string;
|
|
135
|
+
roundings: NewProjectRow[];
|
|
136
|
+
/** What the chosen mode says will happen. */
|
|
137
|
+
breakpointHint: string;
|
|
138
|
+
aiNaming: boolean;
|
|
139
|
+
/** This backend compiles, so the fidelity check can run at all. */
|
|
140
|
+
canVerify: boolean;
|
|
141
|
+
verify: boolean;
|
|
142
|
+
minFidelity: string;
|
|
143
|
+
importPrompt: string;
|
|
144
|
+
importError: string;
|
|
145
|
+
|
|
146
|
+
/** The last backend refusal, verbatim from whatever raised it. Empty draws nothing. */
|
|
147
|
+
error: string;
|
|
148
|
+
/** A structured `needs_installation_access` failure's install link. */
|
|
149
|
+
errorInstallUrl: string;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/** Everything the reader can do here. Each one is a decision the flow makes, never this module. */
|
|
153
|
+
export interface NewProjectActions {
|
|
154
|
+
/** The primary button: Next on step one, the create or the hand-off on step two. */
|
|
155
|
+
confirm: () => void;
|
|
156
|
+
/** Back. */
|
|
157
|
+
secondary: () => void;
|
|
158
|
+
/** The dialog closed, for any reason the platform owns as well as this module's `close`. */
|
|
159
|
+
closed: () => void;
|
|
160
|
+
pickTab: (value: string) => void;
|
|
161
|
+
pickCard: (id: string) => void;
|
|
162
|
+
setAgentPrompt: (value: string) => void;
|
|
163
|
+
setName: (value: string) => void;
|
|
164
|
+
setSlug: (value: string) => void;
|
|
165
|
+
setParent: (value: string) => void;
|
|
166
|
+
browse: () => void;
|
|
167
|
+
setOwner: (value: string) => void;
|
|
168
|
+
setVisibility: (value: string) => void;
|
|
169
|
+
setUrl: (value: string) => void;
|
|
170
|
+
setDepth: (value: string) => void;
|
|
171
|
+
setMaxPages: (value: string) => void;
|
|
172
|
+
setBreakpointMode: (value: string) => void;
|
|
173
|
+
setBreakpointCount: (value: string) => void;
|
|
174
|
+
setBreakpointWidths: (value: string) => void;
|
|
175
|
+
setBreakpointRounding: (value: string) => void;
|
|
176
|
+
setAiNaming: (on: boolean) => void;
|
|
177
|
+
setVerify: (on: boolean) => void;
|
|
178
|
+
setMinFidelity: (value: string) => void;
|
|
179
|
+
setImportPrompt: (value: string) => void;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* The three mounted documents this one hosts, each asked for its host element.
|
|
184
|
+
*
|
|
185
|
+
* A function rather than an element, because asking is what brings the controller's own surface up
|
|
186
|
+
* to date: `render()` on all three updates the mount it already made and hands back the same node.
|
|
187
|
+
* A controller with nothing to offer answers `null`, which is how the keyless offer withdraws
|
|
188
|
+
* itself on a platform that brokers nothing.
|
|
189
|
+
*/
|
|
190
|
+
export interface NewProjectIslands {
|
|
191
|
+
creds: () => HTMLElement | null;
|
|
192
|
+
managed: () => HTMLElement | null;
|
|
193
|
+
model: () => HTMLElement | null;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
export interface NewProjectSurfaceOptions {
|
|
197
|
+
/** Where the dialog is mounted — the dialog layer, handed in so this module never reaches back. */
|
|
198
|
+
layer: HTMLElement;
|
|
199
|
+
/** What to draw before anything has landed: the flow's own view, so there is one builder of it. */
|
|
200
|
+
view: NewProjectView;
|
|
201
|
+
actions: NewProjectActions;
|
|
202
|
+
islands: NewProjectIslands;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
export interface NewProjectSurfaceHandle {
|
|
206
|
+
/** The slot in the dialog layer that carries the dialog. */
|
|
207
|
+
host: HTMLElement;
|
|
208
|
+
/** Resolves with the `jx-dialog` element once it has rendered and been opened. */
|
|
209
|
+
ready: Promise<HTMLElement>;
|
|
210
|
+
/** Redraw from the flow's current view. */
|
|
211
|
+
update: (view: NewProjectView) => void;
|
|
212
|
+
/** Bring the second step back to the top and put the caret in the name field. */
|
|
213
|
+
focusName: () => void;
|
|
214
|
+
/** Close the dialog (the platform restores focus) and dispose the document. Idempotent. */
|
|
215
|
+
close: () => void;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/** What the document discriminates on, and the flags it reads. Derived, never handed in. */
|
|
219
|
+
interface NewProjectFlags {
|
|
220
|
+
/** Which value control the chosen breakpoint mode takes, or neither. */
|
|
221
|
+
breakpointValue: "count" | "widths" | "none";
|
|
222
|
+
/** Both modes that match a kept width to a declared one show the rounding rule. */
|
|
223
|
+
showRounding: boolean;
|
|
224
|
+
/** The fidelity floor only means anything while the check that produces a score is on. */
|
|
225
|
+
showFidelity: boolean;
|
|
226
|
+
/** The owner list has landed, so the field is a picker rather than free text. */
|
|
227
|
+
hasOwners: boolean;
|
|
228
|
+
hasNameError: boolean;
|
|
229
|
+
hasDestinationError: boolean;
|
|
230
|
+
hasRepoTaken: boolean;
|
|
231
|
+
hasImportError: boolean;
|
|
232
|
+
hasError: boolean;
|
|
233
|
+
hasInstallUrl: boolean;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
interface NewProjectScope
|
|
237
|
+
extends Record<string, unknown>, NewProjectView, NewProjectFlags, NewProjectActions {}
|
|
238
|
+
|
|
239
|
+
/** The view plus the flags the document renders from. */
|
|
240
|
+
function derive(view: NewProjectView): NewProjectView & NewProjectFlags {
|
|
241
|
+
return {
|
|
242
|
+
...view,
|
|
243
|
+
breakpointValue:
|
|
244
|
+
view.breakpointMode === "limit"
|
|
245
|
+
? "count"
|
|
246
|
+
: view.breakpointMode === "explicit"
|
|
247
|
+
? "widths"
|
|
248
|
+
: "none",
|
|
249
|
+
hasDestinationError: view.destinationError !== "",
|
|
250
|
+
hasError: view.error !== "",
|
|
251
|
+
hasImportError: view.importError !== "",
|
|
252
|
+
hasInstallUrl: view.errorInstallUrl !== "",
|
|
253
|
+
hasNameError: view.nameError !== "",
|
|
254
|
+
hasOwners: view.owners.length > 0,
|
|
255
|
+
hasRepoTaken: view.repoTaken !== "",
|
|
256
|
+
showFidelity: view.canVerify && view.verify,
|
|
257
|
+
showRounding: view.breakpointMode !== "all",
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
/** A node's authored `part`, which is how an island announces which one it is. */
|
|
262
|
+
function partOf(def: JxElement | string): string {
|
|
263
|
+
const part = typeof def === "string" ? undefined : def.attributes?.["part"];
|
|
264
|
+
return typeof part === "string" ? part : "";
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
/**
|
|
268
|
+
* Open the wizard. The handle's `ready` resolves once the dialog is showing.
|
|
269
|
+
*
|
|
270
|
+
* @param options What to draw, every decision a control can ask the flow for, and the three
|
|
271
|
+
* controllers whose own documents this one hosts.
|
|
272
|
+
* @returns The handle the flow updates and closes.
|
|
273
|
+
*/
|
|
274
|
+
export function openNewProjectSurface(options: NewProjectSurfaceOptions): NewProjectSurfaceHandle {
|
|
275
|
+
const slot = document.createElement("div");
|
|
276
|
+
/* The layer is `pointer-events: none` so a click passes through it when nothing is up, and every
|
|
277
|
+
slot in it turns them back on for its own content. `pointer-events` INHERITS, and the top layer
|
|
278
|
+
changes paint order rather than inheritance, so a modal `<dialog>` in a slot that skipped this
|
|
279
|
+
is painted above everything and hit-tests to nothing. */
|
|
280
|
+
slot.style.pointerEvents = "auto";
|
|
281
|
+
options.layer.append(slot);
|
|
282
|
+
|
|
283
|
+
let closed = false;
|
|
284
|
+
/**
|
|
285
|
+
* Say it is over, once.
|
|
286
|
+
*
|
|
287
|
+
* Two paths reach here and either may be first: the platform's own `close`, which `close()`
|
|
288
|
+
* provokes, and `close()` on a dialog that never got as far as being shown.
|
|
289
|
+
*/
|
|
290
|
+
const finish = (): void => {
|
|
291
|
+
if (closed) {
|
|
292
|
+
return;
|
|
293
|
+
}
|
|
294
|
+
closed = true;
|
|
295
|
+
options.actions.closed();
|
|
296
|
+
};
|
|
297
|
+
|
|
298
|
+
/** The island boxes the document has announced, by part. Replaced as the bodies come and go. */
|
|
299
|
+
const boxes = new Map<string, HTMLElement>();
|
|
300
|
+
|
|
301
|
+
/**
|
|
302
|
+
* Ask each controller for its host and put it in the box, if it is not already there.
|
|
303
|
+
*
|
|
304
|
+
* Nothing here asks whether a box is still in the page, and the reason is the moment
|
|
305
|
+
* `onNodeCreated` fires: a node is announced when it is BUILT, one append before its parent puts
|
|
306
|
+
* it in the tree, so a connectedness test would throw every fresh box away and leave the gate
|
|
307
|
+
* showing two empty divs. One box per part instead — the map is keyed by it, so a rebuilt body
|
|
308
|
+
* replaces the entry and the host moves into the one that is showing.
|
|
309
|
+
*/
|
|
310
|
+
const fillIslands = (): void => {
|
|
311
|
+
for (const [part, box] of boxes) {
|
|
312
|
+
const source =
|
|
313
|
+
part === "creds-island"
|
|
314
|
+
? options.islands.creds
|
|
315
|
+
: part === "managed-island"
|
|
316
|
+
? options.islands.managed
|
|
317
|
+
: options.islands.model;
|
|
318
|
+
const element = source();
|
|
319
|
+
/* Guarded on placement, not on emptiness: `append` of a node that is already the box's child
|
|
320
|
+
removes and re-inserts it, which disconnects and reconnects every custom element under it
|
|
321
|
+
— and under `creds-island` that is three fields a reader may be typing a key into. */
|
|
322
|
+
if (element && element.parentNode !== box) {
|
|
323
|
+
box.append(element);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
};
|
|
327
|
+
|
|
328
|
+
const scope = reactive({
|
|
329
|
+
...derive(options.view),
|
|
330
|
+
...options.actions,
|
|
331
|
+
browse: () => {
|
|
332
|
+
options.actions.browse();
|
|
333
|
+
},
|
|
334
|
+
closed: finish,
|
|
335
|
+
}) as NewProjectScope;
|
|
336
|
+
|
|
337
|
+
let mounted: SurfaceHandle | null = null;
|
|
338
|
+
const ready = mountSurface("new-project", scope, slot, {
|
|
339
|
+
onNodeCreated: (element, _path, def) => {
|
|
340
|
+
const part = partOf(def);
|
|
341
|
+
if (element instanceof HTMLElement && part.endsWith("-island")) {
|
|
342
|
+
boxes.set(part, element);
|
|
343
|
+
fillIslands();
|
|
344
|
+
}
|
|
345
|
+
},
|
|
346
|
+
}).then(async (surface) => {
|
|
347
|
+
mounted = surface;
|
|
348
|
+
const element = surface.root as HTMLElement;
|
|
349
|
+
if (closed) {
|
|
350
|
+
surface.dispose();
|
|
351
|
+
return element;
|
|
352
|
+
}
|
|
353
|
+
await whenReady(element);
|
|
354
|
+
if (closed) {
|
|
355
|
+
return element;
|
|
356
|
+
}
|
|
357
|
+
/* The region goes on the platform's own `<dialog>`, which is the one element here that HAS a
|
|
358
|
+
box: `jx-dialog` is `display: contents`, and the slot wraps a dialog the top layer takes out
|
|
359
|
+
of flow, so both measure 0×0 — and a region whose box is empty is refused outright by
|
|
360
|
+
`scripts/screenshots/lib/shot.ts`. The kit treats that node as a seam already; its own
|
|
361
|
+
behaviour sidecar finds it by exactly this selector. */
|
|
362
|
+
const box = element.querySelector<HTMLElement>('dialog[part="dialog"]') ?? element;
|
|
363
|
+
box.setAttribute(REGION_ATTR, overlayRegion("dialog", "new-project"));
|
|
364
|
+
showModal(element);
|
|
365
|
+
fillIslands();
|
|
366
|
+
return element;
|
|
367
|
+
});
|
|
368
|
+
|
|
369
|
+
return {
|
|
370
|
+
close() {
|
|
371
|
+
/* Guarded on the WORK rather than on `closed`, and the difference is a slot that would
|
|
372
|
+
otherwise be left behind: the platform's own `close` runs `finish()` before any caller
|
|
373
|
+
reaches here, so a `close()` that returned early on `closed` would take the dialog down and
|
|
374
|
+
leave its host div in the layer. Every line below is idempotent instead. */
|
|
375
|
+
const element = mounted?.root;
|
|
376
|
+
if (element instanceof HTMLElement) {
|
|
377
|
+
// The platform's close first, so focus goes back where it came from; then the document.
|
|
378
|
+
closeDialog(element);
|
|
379
|
+
}
|
|
380
|
+
// A mount that has not landed yet is disposed by `ready` when it does — `finish` tells it so.
|
|
381
|
+
mounted?.dispose();
|
|
382
|
+
mounted = null;
|
|
383
|
+
boxes.clear();
|
|
384
|
+
slot.remove();
|
|
385
|
+
finish();
|
|
386
|
+
},
|
|
387
|
+
focusName() {
|
|
388
|
+
const element = mounted?.root;
|
|
389
|
+
if (!(element instanceof HTMLElement)) {
|
|
390
|
+
return;
|
|
391
|
+
}
|
|
392
|
+
/* After the frame the write above paints in: the field only exists once the body switch has
|
|
393
|
+
reconciled onto the second step, and a refused submit is exactly the moment it did not
|
|
394
|
+
move. Measurement and a focus move are the two imperative things a surface may still do
|
|
395
|
+
(ui.md §2 rule 5). */
|
|
396
|
+
requestAnimationFrame(() => {
|
|
397
|
+
element.querySelector('[part="dialog"]')?.scrollTo?.(0, 0);
|
|
398
|
+
element.querySelector<HTMLElement>('[part="name"] [part="input"]')?.focus?.();
|
|
399
|
+
});
|
|
400
|
+
},
|
|
401
|
+
host: slot,
|
|
402
|
+
ready,
|
|
403
|
+
update(view) {
|
|
404
|
+
Object.assign(scope, derive(view));
|
|
405
|
+
/* The controllers are asked again on every update, because `render()` is what brings each
|
|
406
|
+
one's own surface up to date. A box that the body switch has not built yet is filled by
|
|
407
|
+
`onNodeCreated` when it is. */
|
|
408
|
+
fillIslands();
|
|
409
|
+
},
|
|
410
|
+
};
|
|
411
|
+
}
|