@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
|
@@ -1,9 +1,23 @@
|
|
|
1
1
|
/// <reference lib="dom" />
|
|
2
2
|
// ─── Convert to Component ─────────────────────────────────────────────────────
|
|
3
|
-
|
|
3
|
+
/**
|
|
4
|
+
* Extract the selected element into a reusable component.
|
|
5
|
+
*
|
|
6
|
+
* The naming question is `showPromptDialog` — one headline, one sentence, one field, one refusal —
|
|
7
|
+
* which is exactly the shape this used to hand-render as an `sp-dialog-wrapper` of its own, down to
|
|
8
|
+
* the Enter binding, the focus move and the select-all. That helper is already a document over the
|
|
9
|
+
* kit (`src/surfaces/dialog.json`, studio-ui-guidelines §8.7), so the conversion here is a DELETION
|
|
10
|
+
* rather than a second surface: a prompt authored beside the prompt would be a second answer to a
|
|
11
|
+
* question Studio has settled once, and the two would drift the first time one of them was fixed.
|
|
12
|
+
*
|
|
13
|
+
* What is left is the flow, which is all this module ever owned that mattered: what the default
|
|
14
|
+
* name is, what makes a name usable, whether the document actually took the reference, and what is
|
|
15
|
+
* written to disk once it has.
|
|
16
|
+
*
|
|
17
|
+
* @docs studio/design/components
|
|
18
|
+
*/
|
|
4
19
|
import { displayTagName } from "@jxsuite/schema/guards";
|
|
5
20
|
import { errorMessage } from "@jxsuite/schema/parse";
|
|
6
|
-
import { ref } from "lit-html/directives/ref.js";
|
|
7
21
|
import { childIndex, getNodeAtPath, parentElementPath } from "../store";
|
|
8
22
|
import { primarySelection } from "../tabs/selection";
|
|
9
23
|
import { activeTab } from "../workspace/workspace";
|
|
@@ -11,8 +25,9 @@ import { transact } from "../tabs/transact";
|
|
|
11
25
|
import { componentRegistry, computeRelativePath, loadComponentRegistry } from "../files/components";
|
|
12
26
|
import { getPlatform } from "../platform";
|
|
13
27
|
import { jsonClone } from "../utils/studio-utils";
|
|
28
|
+
import { serializeJson } from "../files/json-layout";
|
|
14
29
|
import { notify } from "../services/notify";
|
|
15
|
-
import {
|
|
30
|
+
import { showPromptDialog } from "../ui/layers";
|
|
16
31
|
import { validateComponentSlots } from "../services/cem-export";
|
|
17
32
|
|
|
18
33
|
import type { JxMutableNode } from "@jxsuite/schema/types";
|
|
@@ -33,10 +48,14 @@ export async function convertToComponent() {
|
|
|
33
48
|
}
|
|
34
49
|
|
|
35
50
|
const defaultName = deriveDefaultName(node);
|
|
36
|
-
const
|
|
37
|
-
if (!
|
|
51
|
+
const chosen = await promptComponentName(defaultName);
|
|
52
|
+
if (!chosen) {
|
|
38
53
|
return;
|
|
39
54
|
}
|
|
55
|
+
/* The prompt resolves the TRIMMED value; the case fold is this module's, because it is the case
|
|
56
|
+
fold `validateName` already judged the name in. A tag name is lower-case by the same rule that
|
|
57
|
+
made `Hero-Block` default to `hero-block`. */
|
|
58
|
+
const name = chosen.toLowerCase();
|
|
40
59
|
|
|
41
60
|
// Extract component definition
|
|
42
61
|
const componentDef = extractComponentDef(node);
|
|
@@ -87,7 +106,11 @@ export async function convertToComponent() {
|
|
|
87
106
|
// Write component file and refresh registry
|
|
88
107
|
try {
|
|
89
108
|
const platform = getPlatform();
|
|
90
|
-
|
|
109
|
+
/* Through the save serializer (`files/json-layout.ts`) rather than `JSON.stringify`, so the new
|
|
110
|
+
file lands in the formatter's layout with its trailing newline and the first save from its
|
|
111
|
+
tab is a clean diff. No layout to carry: the subtree was lifted out of another document, and
|
|
112
|
+
its record there is keyed by that document's pointers. */
|
|
113
|
+
await platform.writeFile(componentFile, serializeJson(componentDef, null));
|
|
91
114
|
await loadComponentRegistry();
|
|
92
115
|
const warning = validateComponentSlots(componentDef);
|
|
93
116
|
notify.success(`Converted to <${name}>`);
|
|
@@ -167,85 +190,22 @@ function validateName(val: string) {
|
|
|
167
190
|
}
|
|
168
191
|
|
|
169
192
|
/**
|
|
170
|
-
*
|
|
193
|
+
* Ask for the new component's tag name.
|
|
194
|
+
*
|
|
195
|
+
* Resolves the trimmed name, or `null` when the dialog was dismissed. The refusal, the Enter
|
|
196
|
+
* binding, the focus move and the select-all all belong to `showPromptDialog`, which owns them for
|
|
197
|
+
* every prompt in Studio; the only thing this passes in that no other prompt has is what counts as
|
|
198
|
+
* a usable tag name.
|
|
171
199
|
*
|
|
172
200
|
* @param {string} defaultName
|
|
173
201
|
* @returns {Promise<string | null>}
|
|
174
202
|
*/
|
|
175
|
-
function promptComponentName(defaultName: string) {
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
if (!result.valid) {
|
|
183
|
-
({ error } = result);
|
|
184
|
-
rerender();
|
|
185
|
-
return;
|
|
186
|
-
}
|
|
187
|
-
done(value.trim().toLowerCase());
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
function onInput(e: Event) {
|
|
191
|
-
value = (e.target as HTMLInputElement).value || "";
|
|
192
|
-
const result = validateName(value);
|
|
193
|
-
error = result.valid ? "" : result.error;
|
|
194
|
-
rerender();
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
function onKeydown(e: KeyboardEvent) {
|
|
198
|
-
if (e.key === "Enter") {
|
|
199
|
-
confirm();
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
function rerender() {
|
|
204
|
-
const layer = document.querySelector("#layer-dialog");
|
|
205
|
-
const slot = layer?.lastElementChild;
|
|
206
|
-
if (slot) {
|
|
207
|
-
litRender(buildTpl(), slot as HTMLElement);
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
function buildTpl() {
|
|
212
|
-
return html`
|
|
213
|
-
<sp-dialog-wrapper
|
|
214
|
-
open
|
|
215
|
-
underlay
|
|
216
|
-
headline="Convert to Component"
|
|
217
|
-
confirm-label="Convert"
|
|
218
|
-
cancel-label="Cancel"
|
|
219
|
-
size="s"
|
|
220
|
-
@confirm=${confirm}
|
|
221
|
-
@cancel=${() => done(null)}
|
|
222
|
-
@close=${() => done(null)}
|
|
223
|
-
>
|
|
224
|
-
<p>Enter a hyphenated tag name for the new component.</p>
|
|
225
|
-
<sp-textfield
|
|
226
|
-
placeholder="my-component"
|
|
227
|
-
value=${value}
|
|
228
|
-
?invalid=${Boolean(error)}
|
|
229
|
-
@input=${onInput}
|
|
230
|
-
@keydown=${onKeydown}
|
|
231
|
-
${ref((el) => {
|
|
232
|
-
if (el) {
|
|
233
|
-
requestAnimationFrame(() => {
|
|
234
|
-
(el as HTMLElement).focus();
|
|
235
|
-
const input = (el as HTMLElement).shadowRoot?.querySelector("input");
|
|
236
|
-
if (input) {
|
|
237
|
-
input.select();
|
|
238
|
-
}
|
|
239
|
-
});
|
|
240
|
-
}
|
|
241
|
-
})}
|
|
242
|
-
>
|
|
243
|
-
<sp-help-text slot="negative-help-text">${error}</sp-help-text>
|
|
244
|
-
</sp-textfield>
|
|
245
|
-
</sp-dialog-wrapper>
|
|
246
|
-
`;
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
return buildTpl();
|
|
203
|
+
function promptComponentName(defaultName: string): Promise<string | null> {
|
|
204
|
+
return showPromptDialog("Convert to Component", {
|
|
205
|
+
confirmLabel: "Convert",
|
|
206
|
+
message: "Enter a hyphenated tag name for the new component.",
|
|
207
|
+
placeholder: "my-component",
|
|
208
|
+
validate: (value) => validateName(value).error,
|
|
209
|
+
value: defaultName,
|
|
250
210
|
});
|
|
251
211
|
}
|
|
@@ -1,17 +1,32 @@
|
|
|
1
1
|
/// <reference lib="dom" />
|
|
2
2
|
// ─── Convert to Repeater ──────────────────────────────────────────────────────
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
/**
|
|
4
|
+
* Turn the selected element into an `$prototype: "Array"` template.
|
|
5
|
+
*
|
|
6
|
+
* This is the flow only. It decides which state definitions can be an items source (including the
|
|
7
|
+
* plugin ones, whose schema has to be fetched to find out), keeps the answer the reader is
|
|
8
|
+
* assembling, refuses a name it cannot mint, and replaces the element in place. The dialog is
|
|
9
|
+
* `src/surfaces/convert-repeater.json`, a `jx-dialog` over the kit, mounted by
|
|
10
|
+
* `src/surfaces/convert-repeater.ts` — so the markup, the labels, the keyboard and the styling are
|
|
11
|
+
* the document's, and nothing here re-renders anything: a refusal changes the one string it names.
|
|
12
|
+
*
|
|
13
|
+
* @docs studio/design/repeaters
|
|
14
|
+
*/
|
|
5
15
|
import { childIndex, childList, getNodeAtPath, parentElementPath } from "../store";
|
|
6
16
|
import { primarySelection } from "../tabs/selection";
|
|
7
17
|
import { activeTab } from "../workspace/workspace";
|
|
8
18
|
import { transactDoc } from "../tabs/transact";
|
|
9
|
-
import {
|
|
19
|
+
import { layerHost } from "../ui/layers";
|
|
10
20
|
import { defCategory } from "../panels/signals-panel";
|
|
11
21
|
import { fetchPluginSchema } from "../services/code-services";
|
|
22
|
+
import { CREATE_NEW_SOURCE, openConvertRepeaterSurface } from "../surfaces/convert-repeater";
|
|
12
23
|
|
|
24
|
+
import type { ConvertRepeaterView } from "../surfaces/convert-repeater";
|
|
13
25
|
import type { JxMutableNode } from "@jxsuite/schema/types";
|
|
14
26
|
|
|
27
|
+
/** What a name has to look like to become a state definition. */
|
|
28
|
+
const IDENTIFIER = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/;
|
|
29
|
+
|
|
15
30
|
interface RepeaterConfig {
|
|
16
31
|
items: { $ref: string } | unknown[];
|
|
17
32
|
filter?: { $ref: string };
|
|
@@ -76,25 +91,28 @@ export async function convertToRepeater() {
|
|
|
76
91
|
}
|
|
77
92
|
|
|
78
93
|
/**
|
|
79
|
-
*
|
|
80
|
-
*
|
|
94
|
+
* Every state definition that can be the items of a repeater.
|
|
95
|
+
*
|
|
96
|
+
* Three of the four answers are free: a declared `type: "array"`, an array `default`, or the
|
|
97
|
+
* `Array` prototype itself. The fourth costs a round trip — a plugin definition only says what it
|
|
98
|
+
* returns in its schema — so it is asked for once per definition, and only for the ones the first
|
|
99
|
+
* three did not already claim.
|
|
81
100
|
*/
|
|
82
|
-
async function
|
|
83
|
-
const
|
|
84
|
-
([, d]) =>
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
const
|
|
91
|
-
const docPath = tab?.documentPath;
|
|
101
|
+
async function arraySourceNames(defs: Record<string, unknown>): Promise<string[]> {
|
|
102
|
+
const named = Object.entries(defs)
|
|
103
|
+
.filter(([, d]) => {
|
|
104
|
+
const def = d as Record<string, unknown> | null;
|
|
105
|
+
return def?.type === "array" || Array.isArray(def?.default) || def?.$prototype === "Array";
|
|
106
|
+
})
|
|
107
|
+
.map(([name]) => name);
|
|
108
|
+
|
|
109
|
+
const docPath = activeTab.value?.documentPath;
|
|
92
110
|
for (const [name, d] of Object.entries(defs)) {
|
|
93
111
|
const def = d as Record<string, unknown> | null;
|
|
94
112
|
if (!def?.$prototype || def.$prototype === "Function" || def.$prototype === "Array") {
|
|
95
113
|
continue;
|
|
96
114
|
}
|
|
97
|
-
if (
|
|
115
|
+
if (named.includes(name)) {
|
|
98
116
|
continue;
|
|
99
117
|
}
|
|
100
118
|
const schema = await fetchPluginSchema(
|
|
@@ -105,171 +123,112 @@ async function promptRepeaterConfig(defs: Record<string, unknown>) {
|
|
|
105
123
|
{ ...(docPath != null && { documentPath: docPath }) },
|
|
106
124
|
);
|
|
107
125
|
if (schema?.returns?.type === "array") {
|
|
108
|
-
|
|
126
|
+
named.push(name);
|
|
109
127
|
}
|
|
110
128
|
}
|
|
129
|
+
return named;
|
|
130
|
+
}
|
|
111
131
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
132
|
+
/**
|
|
133
|
+
* Ask which definition the repeater reads, and optionally which function filters and which sorts.
|
|
134
|
+
*
|
|
135
|
+
* Resolves the configuration, or `null` when the dialog was dismissed. Confirming an unusable new
|
|
136
|
+
* name keeps the dialog open with the reason under the field — the flow's state machine, which is
|
|
137
|
+
* the half the surface deliberately does not have.
|
|
138
|
+
*
|
|
139
|
+
* @param {Record<string, unknown>} defs
|
|
140
|
+
* @returns {Promise<RepeaterConfig | null>}
|
|
141
|
+
*/
|
|
142
|
+
async function promptRepeaterConfig(defs: Record<string, unknown>): Promise<RepeaterConfig | null> {
|
|
143
|
+
const sources = await arraySourceNames(defs);
|
|
144
|
+
const functions = Object.entries(defs)
|
|
145
|
+
.filter(([, d]) => defCategory(d) === "function")
|
|
146
|
+
.map(([name]) => name);
|
|
147
|
+
|
|
148
|
+
return new Promise<RepeaterConfig | null>((resolve) => {
|
|
149
|
+
const view: ConvertRepeaterView = {
|
|
150
|
+
error: "",
|
|
151
|
+
filter: "",
|
|
152
|
+
functions,
|
|
153
|
+
newName: "",
|
|
154
|
+
sort: "",
|
|
155
|
+
source: sources[0] ?? CREATE_NEW_SOURCE,
|
|
156
|
+
sources,
|
|
157
|
+
};
|
|
119
158
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
return;
|
|
128
|
-
}
|
|
129
|
-
if (defs[name]) {
|
|
130
|
-
error = `"${name}" already exists.`;
|
|
131
|
-
rerender();
|
|
132
|
-
return;
|
|
133
|
-
}
|
|
134
|
-
if (!/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(name)) {
|
|
135
|
-
error = "Invalid identifier name.";
|
|
136
|
-
rerender();
|
|
137
|
-
return;
|
|
138
|
-
}
|
|
139
|
-
done({
|
|
140
|
-
items: { $ref: `#/state/${name}` },
|
|
141
|
-
...(filterDef && { filter: { $ref: `#/state/${filterDef}` } }),
|
|
142
|
-
...(sortDef && { sort: { $ref: `#/state/${sortDef}` } }),
|
|
143
|
-
newDef: { name },
|
|
144
|
-
});
|
|
145
|
-
} else {
|
|
146
|
-
done({
|
|
147
|
-
items: { $ref: `#/state/${source}` },
|
|
148
|
-
...(filterDef && { filter: { $ref: `#/state/${filterDef}` } }),
|
|
149
|
-
...(sortDef && { sort: { $ref: `#/state/${sortDef}` } }),
|
|
150
|
-
});
|
|
159
|
+
let settled = false;
|
|
160
|
+
/* Resolve once, and take the dialog down with it. `close()` provokes the platform's own
|
|
161
|
+
`close`, which comes back as `onClosed` — so the guard is what keeps a confirmed answer from
|
|
162
|
+
being overwritten by the dismissal its own commit caused. */
|
|
163
|
+
const finish = (config: RepeaterConfig | null): void => {
|
|
164
|
+
if (settled) {
|
|
165
|
+
return;
|
|
151
166
|
}
|
|
152
|
-
|
|
167
|
+
settled = true;
|
|
168
|
+
handle.close();
|
|
169
|
+
resolve(config);
|
|
170
|
+
};
|
|
153
171
|
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
litRender(buildTpl(), slot as HTMLElement);
|
|
159
|
-
}
|
|
160
|
-
}
|
|
172
|
+
const refuse = (message: string): void => {
|
|
173
|
+
view.error = message;
|
|
174
|
+
handle.update(view);
|
|
175
|
+
};
|
|
161
176
|
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
headline="Repeat..."
|
|
168
|
-
confirm-label="Create Repeater"
|
|
169
|
-
cancel-label="Cancel"
|
|
170
|
-
size="s"
|
|
171
|
-
@confirm=${confirm}
|
|
172
|
-
@cancel=${() => done(null)}
|
|
173
|
-
@close=${() => done(null)}
|
|
174
|
-
>
|
|
175
|
-
<div style="display:flex;flex-direction:column;gap:12px">
|
|
176
|
-
<label>
|
|
177
|
-
<sp-field-label size="s">Items source</sp-field-label>
|
|
178
|
-
<sp-picker
|
|
179
|
-
label="Items source"
|
|
180
|
-
size="s"
|
|
181
|
-
.value=${source}
|
|
182
|
-
@change=${(e: Event) => {
|
|
183
|
-
source = (e.target as HTMLInputElement).value;
|
|
184
|
-
error = "";
|
|
185
|
-
rerender();
|
|
186
|
-
}}
|
|
187
|
-
>
|
|
188
|
-
${arrayDefs.map(
|
|
189
|
-
([name]) => html`<sp-menu-item value=${name}>${name}</sp-menu-item>`,
|
|
190
|
-
)}
|
|
191
|
-
<sp-menu-divider></sp-menu-divider>
|
|
192
|
-
<sp-menu-item value="__new__">Create new...</sp-menu-item>
|
|
193
|
-
</sp-picker>
|
|
194
|
-
</label>
|
|
177
|
+
/** The optional halves, which are the same two lines whichever source was chosen. */
|
|
178
|
+
const optional = () => ({
|
|
179
|
+
...(view.filter && { filter: { $ref: `#/state/${view.filter}` } }),
|
|
180
|
+
...(view.sort && { sort: { $ref: `#/state/${view.sort}` } }),
|
|
181
|
+
});
|
|
195
182
|
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
})}
|
|
221
|
-
>
|
|
222
|
-
<sp-help-text slot="negative-help-text">${error}</sp-help-text>
|
|
223
|
-
</sp-textfield>
|
|
224
|
-
</label>
|
|
225
|
-
`
|
|
226
|
-
: nothing
|
|
227
|
-
}
|
|
228
|
-
${
|
|
229
|
-
fnDefs.length > 0
|
|
230
|
-
? html`
|
|
231
|
-
<label>
|
|
232
|
-
<sp-field-label size="s">Filter (optional)</sp-field-label>
|
|
233
|
-
<sp-picker
|
|
234
|
-
label="Filter"
|
|
235
|
-
size="s"
|
|
236
|
-
.value=${filterDef}
|
|
237
|
-
@change=${(e: Event) => {
|
|
238
|
-
filterDef = (e.target as HTMLInputElement).value;
|
|
239
|
-
rerender();
|
|
240
|
-
}}
|
|
241
|
-
>
|
|
242
|
-
<sp-menu-item value="">None</sp-menu-item>
|
|
243
|
-
${fnDefs.map(
|
|
244
|
-
([name]) => html`<sp-menu-item value=${name}>${name}</sp-menu-item>`,
|
|
245
|
-
)}
|
|
246
|
-
</sp-picker>
|
|
247
|
-
</label>
|
|
248
|
-
<label>
|
|
249
|
-
<sp-field-label size="s">Sort (optional)</sp-field-label>
|
|
250
|
-
<sp-picker
|
|
251
|
-
label="Sort"
|
|
252
|
-
size="s"
|
|
253
|
-
.value=${sortDef}
|
|
254
|
-
@change=${(e: Event) => {
|
|
255
|
-
sortDef = (e.target as HTMLInputElement).value;
|
|
256
|
-
rerender();
|
|
257
|
-
}}
|
|
258
|
-
>
|
|
259
|
-
<sp-menu-item value="">None</sp-menu-item>
|
|
260
|
-
${fnDefs.map(
|
|
261
|
-
([name]) => html`<sp-menu-item value=${name}>${name}</sp-menu-item>`,
|
|
262
|
-
)}
|
|
263
|
-
</sp-picker>
|
|
264
|
-
</label>
|
|
265
|
-
`
|
|
266
|
-
: nothing
|
|
267
|
-
}
|
|
268
|
-
</div>
|
|
269
|
-
</sp-dialog-wrapper>
|
|
270
|
-
`;
|
|
271
|
-
}
|
|
183
|
+
const confirm = (): void => {
|
|
184
|
+
if (view.source !== CREATE_NEW_SOURCE) {
|
|
185
|
+
finish({ items: { $ref: `#/state/${view.source}` }, ...optional() });
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
const name = view.newName.trim();
|
|
189
|
+
if (!name) {
|
|
190
|
+
refuse("Enter a name for the new state definition.");
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
if (defs[name]) {
|
|
194
|
+
refuse(`"${name}" already exists.`);
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
if (!IDENTIFIER.test(name)) {
|
|
198
|
+
refuse("Invalid identifier name.");
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
finish({
|
|
202
|
+
items: { $ref: `#/state/${name}` },
|
|
203
|
+
...optional(),
|
|
204
|
+
newDef: { name },
|
|
205
|
+
});
|
|
206
|
+
};
|
|
272
207
|
|
|
273
|
-
|
|
208
|
+
const handle = openConvertRepeaterSurface({
|
|
209
|
+
layer: layerHost("dialog"),
|
|
210
|
+
onClosed: () => finish(null),
|
|
211
|
+
onConfirm: confirm,
|
|
212
|
+
onName: (value) => {
|
|
213
|
+
view.newName = value;
|
|
214
|
+
// A keystroke retires the refusal it is answering; the confirm mints the next one.
|
|
215
|
+
view.error = "";
|
|
216
|
+
handle.update(view);
|
|
217
|
+
},
|
|
218
|
+
onPickFilter: (value) => {
|
|
219
|
+
view.filter = value;
|
|
220
|
+
handle.update(view);
|
|
221
|
+
},
|
|
222
|
+
onPickSort: (value) => {
|
|
223
|
+
view.sort = value;
|
|
224
|
+
handle.update(view);
|
|
225
|
+
},
|
|
226
|
+
onPickSource: (value) => {
|
|
227
|
+
view.source = value;
|
|
228
|
+
view.error = "";
|
|
229
|
+
handle.update(view);
|
|
230
|
+
},
|
|
231
|
+
view,
|
|
232
|
+
});
|
|
274
233
|
});
|
|
275
234
|
}
|
|
@@ -50,6 +50,17 @@ export function setSlashController(controller: SlashController): void {
|
|
|
50
50
|
export interface InlineAction {
|
|
51
51
|
tag: string;
|
|
52
52
|
label: string;
|
|
53
|
+
/**
|
|
54
|
+
* REMOVED from the data, for the same reason `shortcut` below was, and the field stays only so an
|
|
55
|
+
* older `elements-meta.json` still parses.
|
|
56
|
+
*
|
|
57
|
+
* It held an `sp-icon-*` name — a SECOND definition site for a glyph the `format.*` command
|
|
58
|
+
* record already carries (`panels/block-action-bar.ts`, kit keys like `text-b` and
|
|
59
|
+
* `text-italic`), and one that named a Spectrum element rather than a key in the kit's manifest.
|
|
60
|
+
* The bar draws `toolOf(registry, command, …)`, so this was never read: `$inlineActions` says
|
|
61
|
+
* WHICH of the eight verbs a tag accepts and in what order, and the record says what each one
|
|
62
|
+
* looks like. Nothing reads this.
|
|
63
|
+
*/
|
|
53
64
|
icon?: string;
|
|
54
65
|
command?: string;
|
|
55
66
|
/**
|