@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,204 +1,265 @@
|
|
|
1
1
|
/// <reference lib="dom" />
|
|
2
|
-
/**
|
|
2
|
+
/**
|
|
3
|
+
* Elements panel — the Insert palette: the blocks and components a page is built out of.
|
|
4
|
+
*
|
|
5
|
+
* **The body is a Jx document** (`surfaces/panel-elements.json`, mounted by
|
|
6
|
+
* `surfaces/panel-elements.ts`), so `render` draws nothing and `afterRender` mounts. What stays
|
|
7
|
+
* here is everything that is a DECISION — which categories survive the filter, which npm components
|
|
8
|
+
* the open document has enabled, what a card inserts and where — projected into a scope whose every
|
|
9
|
+
* card already carries the tag it inserts. `afterRender` runs on every repaint, so
|
|
10
|
+
* {@link mountElementsPanel} is idempotent: the standing surface is updated where it is still
|
|
11
|
+
* there, and re-mounted only where lit has taken it out (which is what a switch to another panel
|
|
12
|
+
* does, because the document is appended into the `.panel-content` lit renders `nothing` into).
|
|
13
|
+
*
|
|
14
|
+
* **Filtering no longer repaints the Navigator, and that fixes a defect.** `panel-scheduler.ts`
|
|
15
|
+
* withholds a repaint while a text input inside the panel has focus — which is exactly when
|
|
16
|
+
* somebody is typing in the filter — so the palette used to sit stale, marked `data-jx-stale`,
|
|
17
|
+
* until the field was blurred. A document is updated in place instead: the cards that no longer
|
|
18
|
+
* match leave, the field is untouched, and no repaint is asked for at all.
|
|
19
|
+
*
|
|
20
|
+
* @docs studio/design/elements
|
|
21
|
+
*/
|
|
3
22
|
|
|
4
|
-
import {
|
|
23
|
+
import { nothing } from "lit-html";
|
|
24
|
+
import { buildComponentInstance, componentRegistry } from "../files/components";
|
|
5
25
|
import { childList, getNodeAtPath } from "../store";
|
|
6
|
-
import {
|
|
26
|
+
import { getEffectiveElements } from "../site-context";
|
|
27
|
+
import { mountElementsSurface } from "../surfaces/panel-elements";
|
|
7
28
|
import { mutateInsertNode, transactDoc } from "../tabs/transact";
|
|
8
29
|
import { primarySelection } from "../tabs/selection";
|
|
9
|
-
import { view } from "../view";
|
|
10
|
-
import { getEffectiveElements } from "../site-context";
|
|
11
|
-
import { buildComponentInstance, componentRegistry } from "../files/components";
|
|
12
|
-
import { renderEmptyState } from "./empty-state";
|
|
13
30
|
import { registerPanel } from "./panel-registry";
|
|
31
|
+
import { activeTab } from "../workspace/workspace";
|
|
32
|
+
import { view } from "../view";
|
|
14
33
|
|
|
15
34
|
import type { ComponentEntry } from "../files/components";
|
|
35
|
+
import type {
|
|
36
|
+
ComponentCardView,
|
|
37
|
+
ElementCategoryView,
|
|
38
|
+
ElementsActions,
|
|
39
|
+
ElementsSurfaceHandle,
|
|
40
|
+
ElementsValues,
|
|
41
|
+
} from "../surfaces/panel-elements";
|
|
16
42
|
import type { JxElement, JxMutableNode } from "@jxsuite/schema/types";
|
|
43
|
+
import type { NavigatorPanelContext, NavigatorPanelDeps, PanelBody } from "./panel-registry";
|
|
44
|
+
|
|
45
|
+
/** The palette's source of blocks, as `NavigatorPanelDeps.webdata` carries it. */
|
|
46
|
+
interface ElementsWebdata {
|
|
47
|
+
elements: Record<string, { tag: string }[]>;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/** The Components section's name — its accordion label AND its key in `view.elementsCollapsed`. */
|
|
51
|
+
const COMPONENTS = "Components";
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* What the palette is built from, held at module scope rather than closed over at mount.
|
|
55
|
+
*
|
|
56
|
+
* The standing surface outlives the {@link NavigatorPanelContext} that mounted it — a card clicked
|
|
57
|
+
* ten repaints later must reach the CURRENT `defaultDef` and the current drag registrations — so
|
|
58
|
+
* the seat is rewritten on every `afterRender` and the actions read it rather than a captured
|
|
59
|
+
* copy.
|
|
60
|
+
*/
|
|
61
|
+
let panelDeps: NavigatorPanelDeps | null = null;
|
|
17
62
|
|
|
18
63
|
/**
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
* @returns {import("lit-html").TemplateResult}
|
|
64
|
+
* The surface standing in the Navigator, and the node it was mounted into.
|
|
65
|
+
*
|
|
66
|
+
* One slot rather than a per-host map, because there is one Navigator: a mount into a DIFFERENT
|
|
67
|
+
* node is the old one being replaced, and holding both would leave the first one's effects running
|
|
68
|
+
* against a scope nobody writes any more.
|
|
25
69
|
*/
|
|
26
|
-
|
|
27
|
-
webdata: { elements: Record<string, { tag: string }[]> };
|
|
28
|
-
defaultDef: (tag: string) => JxMutableNode;
|
|
29
|
-
rerender: () => void;
|
|
30
|
-
}) {
|
|
31
|
-
const tab = activeTab.value;
|
|
70
|
+
let standing: { host: HTMLElement; handle: ElementsSurfaceHandle } | null = null;
|
|
32
71
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
: elements;
|
|
38
|
-
if (filtered.length === 0) {
|
|
39
|
-
return nothing;
|
|
40
|
-
}
|
|
72
|
+
/** What the filter matches on: the reader's text, lower-cased at the point of comparison. */
|
|
73
|
+
function needle(): string {
|
|
74
|
+
return view.elementsFilter.toLowerCase();
|
|
75
|
+
}
|
|
41
76
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
class="element-card"
|
|
59
|
-
data-block-tag=${tag}
|
|
60
|
-
@click=${() => {
|
|
61
|
-
const t = activeTab.value;
|
|
62
|
-
const parentPath = primarySelection(t?.session.selection) ?? [];
|
|
63
|
-
const parent = getNodeAtPath(t!.doc.document, parentPath);
|
|
64
|
-
const idx = childList(parent).length;
|
|
65
|
-
transactDoc(t!, (tr) =>
|
|
66
|
-
mutateInsertNode(tr, parentPath, idx, structuredClone(def)),
|
|
67
|
-
);
|
|
68
|
-
}}
|
|
69
|
-
>
|
|
70
|
-
<div class="element-card-preview"></div>
|
|
71
|
-
<div class="element-card-label"><${tag}></div>
|
|
72
|
-
</div>
|
|
73
|
-
`;
|
|
74
|
-
})}
|
|
75
|
-
</sp-accordion-item>
|
|
76
|
-
`;
|
|
77
|
-
},
|
|
78
|
-
);
|
|
77
|
+
/** The categories that still have something in them, with the filter applied. */
|
|
78
|
+
function categoryViews(webdata: ElementsWebdata, filter: string): ElementCategoryView[] {
|
|
79
|
+
const sections: ElementCategoryView[] = [];
|
|
80
|
+
for (const [name, elements] of Object.entries(webdata.elements ?? {})) {
|
|
81
|
+
const matched = filter ? elements.filter((entry) => entry.tag.includes(filter)) : elements;
|
|
82
|
+
if (matched.length === 0) {
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
sections.push({
|
|
86
|
+
elements: matched.map(({ tag }) => ({ tag })),
|
|
87
|
+
name,
|
|
88
|
+
open: !view.elementsCollapsed.has(name),
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
return sections;
|
|
92
|
+
}
|
|
79
93
|
|
|
80
|
-
|
|
94
|
+
/**
|
|
95
|
+
* The tag names the open document's `$elements` turn on.
|
|
96
|
+
*
|
|
97
|
+
* An entry is either `<package>/<modulePath>`, which names one component, or a bare package, which
|
|
98
|
+
* names every component in it. A project component is not gated at all — it is in the project.
|
|
99
|
+
*/
|
|
100
|
+
function enabledNpmTags(): Set<string> {
|
|
101
|
+
const tab = activeTab.value;
|
|
102
|
+
const entries = getEffectiveElements(
|
|
81
103
|
tab?.doc.document?.$elements as (string | JxElement)[] | undefined,
|
|
82
104
|
);
|
|
83
|
-
const
|
|
84
|
-
for (const entry of
|
|
105
|
+
const tags = new Set<string>();
|
|
106
|
+
for (const entry of entries) {
|
|
85
107
|
if (typeof entry !== "string") {
|
|
86
108
|
continue;
|
|
87
109
|
}
|
|
88
|
-
const
|
|
89
|
-
(
|
|
90
|
-
|
|
110
|
+
const named = componentRegistry.find(
|
|
111
|
+
(comp: ComponentEntry) =>
|
|
112
|
+
comp.source === "npm" && comp.modulePath && entry === `${comp.package}/${comp.modulePath}`,
|
|
91
113
|
);
|
|
92
|
-
if (
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
114
|
+
if (named) {
|
|
115
|
+
tags.add(named.tagName);
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
for (const comp of componentRegistry) {
|
|
119
|
+
if (comp.source === "npm" && comp.package === entry) {
|
|
120
|
+
tags.add(comp.tagName);
|
|
99
121
|
}
|
|
100
122
|
}
|
|
101
123
|
}
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
placeholder="Filter elements…"
|
|
168
|
-
value=${view.elementsFilter}
|
|
169
|
-
@input=${(e: Event) => {
|
|
170
|
-
view.elementsFilter = (e.target as HTMLInputElement).value.toLowerCase();
|
|
171
|
-
ctx.rerender();
|
|
172
|
-
}}
|
|
173
|
-
></sp-search>
|
|
174
|
-
${
|
|
175
|
-
nothingToShow
|
|
176
|
-
? renderEmptyState(
|
|
177
|
-
view.elementsFilter
|
|
178
|
-
? {
|
|
179
|
-
actions: [
|
|
180
|
-
{
|
|
181
|
-
label: "Clear the filter",
|
|
182
|
-
run: () => {
|
|
183
|
-
view.elementsFilter = "";
|
|
184
|
-
ctx.rerender();
|
|
185
|
-
},
|
|
186
|
-
},
|
|
187
|
-
],
|
|
188
|
-
message: `Nothing here matches “${view.elementsFilter}”.`,
|
|
189
|
-
}
|
|
190
|
-
: {
|
|
191
|
-
message:
|
|
192
|
-
"Elements you can drop onto the page live here — " +
|
|
193
|
-
"text, images, layout containers and your own components.",
|
|
194
|
-
},
|
|
195
|
-
)
|
|
196
|
-
: nothing
|
|
124
|
+
return tags;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/** The component cards: the project's own, plus the npm ones this document has enabled. */
|
|
128
|
+
function componentViews(filter: string): ComponentCardView[] {
|
|
129
|
+
if (componentRegistry.length === 0) {
|
|
130
|
+
return [];
|
|
131
|
+
}
|
|
132
|
+
const enabled = enabledNpmTags();
|
|
133
|
+
return componentRegistry
|
|
134
|
+
.filter((comp) => comp.source !== "npm" || enabled.has(comp.tagName))
|
|
135
|
+
.filter((comp) => !filter || comp.tagName.toLowerCase().includes(filter))
|
|
136
|
+
.map((comp) => ({
|
|
137
|
+
tagName: comp.tagName,
|
|
138
|
+
title:
|
|
139
|
+
comp.source === "npm" ? `${comp.package}: <${comp.tagName}>` : (comp.path ?? comp.tagName),
|
|
140
|
+
}));
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/** Everything the document draws, as one value. */
|
|
144
|
+
function panelValues(source: NavigatorPanelDeps): ElementsValues {
|
|
145
|
+
const filter = needle();
|
|
146
|
+
const categories = categoryViews(source.webdata as unknown as ElementsWebdata, filter);
|
|
147
|
+
const components = componentViews(filter);
|
|
148
|
+
const bare = categories.length === 0 && components.length === 0;
|
|
149
|
+
return {
|
|
150
|
+
categories,
|
|
151
|
+
components,
|
|
152
|
+
componentsOpen: !view.elementsCollapsed.has(COMPONENTS),
|
|
153
|
+
emptyState: bare ? (filter ? "filtered" : "empty") : "none",
|
|
154
|
+
/* The reader's own text, not `filter`: the field is bound to this, and a scope holding the
|
|
155
|
+
lower-cased form would rewrite what was typed on every keystroke. */
|
|
156
|
+
filter: view.elementsFilter,
|
|
157
|
+
hasComponents: components.length > 0,
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/** Insert a node as the last child of the selected element — what both kinds of card do. */
|
|
162
|
+
function insertAtSelection(def: JxMutableNode): void {
|
|
163
|
+
const tab = activeTab.value;
|
|
164
|
+
if (!tab) {
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
const parentPath = primarySelection(tab.session.selection) ?? [];
|
|
168
|
+
const parent = getNodeAtPath(tab.doc.document, parentPath);
|
|
169
|
+
const index = childList(parent).length;
|
|
170
|
+
transactDoc(tab, (tr) => mutateInsertNode(tr, parentPath, index, structuredClone(def)));
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Push a fresh projection into the standing surface, then re-register the drags.
|
|
175
|
+
*
|
|
176
|
+
* The drag registrations are deferred until the document has rendered: `mountSurface` resolving is
|
|
177
|
+
* what says the cards exist, and a mapped array coalesces its re-render into a microtask, so a
|
|
178
|
+
* registration that ran on the same turn as the write would walk the previous set of cards.
|
|
179
|
+
*/
|
|
180
|
+
function refresh(): void {
|
|
181
|
+
const seat = standing;
|
|
182
|
+
if (!seat || !panelDeps) {
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
seat.handle.update(panelValues(panelDeps));
|
|
186
|
+
void seat.handle.ready.then(() => {
|
|
187
|
+
if (standing !== seat) {
|
|
188
|
+
return;
|
|
197
189
|
}
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
190
|
+
panelDeps?.registerElementsDnD();
|
|
191
|
+
panelDeps?.registerComponentsDnD();
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/** What the document's controls do. Every one of them is a decision this module owns. */
|
|
196
|
+
const ACTIONS: ElementsActions = {
|
|
197
|
+
clearFilter: () => {
|
|
198
|
+
view.elementsFilter = "";
|
|
199
|
+
refresh();
|
|
200
|
+
},
|
|
201
|
+
insertComponent: (tagName) => {
|
|
202
|
+
const comp = componentRegistry.find((entry: ComponentEntry) => entry.tagName === tagName);
|
|
203
|
+
if (comp) {
|
|
204
|
+
insertAtSelection(buildComponentInstance(comp));
|
|
205
|
+
}
|
|
206
|
+
},
|
|
207
|
+
insertElement: (tag) => {
|
|
208
|
+
if (panelDeps) {
|
|
209
|
+
insertAtSelection(panelDeps.defaultDef(tag) as JxMutableNode);
|
|
210
|
+
}
|
|
211
|
+
},
|
|
212
|
+
setComponentsOpen: (open) => {
|
|
213
|
+
setCollapsed(COMPONENTS, !open);
|
|
214
|
+
refresh();
|
|
215
|
+
},
|
|
216
|
+
/* The echo: what the field now holds goes into the state the palette is filtered by, before
|
|
217
|
+
anything is decided about it. */
|
|
218
|
+
setFilter: (value) => {
|
|
219
|
+
view.elementsFilter = value;
|
|
220
|
+
refresh();
|
|
221
|
+
},
|
|
222
|
+
setSectionOpen: (name, open) => {
|
|
223
|
+
setCollapsed(name, !open);
|
|
224
|
+
refresh();
|
|
225
|
+
},
|
|
226
|
+
};
|
|
227
|
+
|
|
228
|
+
/** Remember a section's disclosure across repaints and across panel switches. */
|
|
229
|
+
function setCollapsed(name: string, collapsed: boolean): void {
|
|
230
|
+
if (collapsed) {
|
|
231
|
+
view.elementsCollapsed.add(name);
|
|
232
|
+
} else {
|
|
233
|
+
view.elementsCollapsed.delete(name);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
/**
|
|
238
|
+
* Draw the panel body — mounting the document the first time, updating it every time after.
|
|
239
|
+
*
|
|
240
|
+
* The document goes into `.panel-content`, not into the `.panel-body` this is handed. Both are
|
|
241
|
+
* lit's, but only one of them is the node lit renders this panel's body INTO: a repaint commits
|
|
242
|
+
* `nothing` there, which lit skips, and a switch to another panel commits that panel's template,
|
|
243
|
+
* which clears to the end of the parent and takes this document with it. Appending to `.panel-body`
|
|
244
|
+
* instead would survive the switch — and leave the palette drawn underneath the Files tree.
|
|
245
|
+
*
|
|
246
|
+
* @param {NavigatorPanelContext} ctx
|
|
247
|
+
* @param {HTMLElement} host - The painted `.panel-body`
|
|
248
|
+
*/
|
|
249
|
+
export function mountElementsPanel(ctx: NavigatorPanelContext, host: HTMLElement): void {
|
|
250
|
+
panelDeps = ctx.deps;
|
|
251
|
+
const container = host.querySelector<HTMLElement>(".panel-content") ?? host;
|
|
252
|
+
if (standing && (standing.host !== container || !standing.handle.connected())) {
|
|
253
|
+
standing.handle.dispose();
|
|
254
|
+
standing = null;
|
|
255
|
+
}
|
|
256
|
+
if (!standing) {
|
|
257
|
+
standing = {
|
|
258
|
+
handle: mountElementsSurface(container, panelValues(ctx.deps), ACTIONS),
|
|
259
|
+
host: container,
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
refresh();
|
|
202
263
|
}
|
|
203
264
|
|
|
204
265
|
/**
|
|
@@ -220,17 +281,13 @@ export function registerInsertPanel(): void {
|
|
|
220
281
|
title: "Insert",
|
|
221
282
|
level: "document",
|
|
222
283
|
dock: "navigator",
|
|
223
|
-
icon: "
|
|
284
|
+
icon: "grid-four",
|
|
224
285
|
rail: false,
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
} as Parameters<typeof renderElementsTemplate>[0]),
|
|
231
|
-
afterRender: (ctx) => {
|
|
232
|
-
ctx.deps.registerElementsDnD();
|
|
233
|
-
ctx.deps.registerComponentsDnD();
|
|
286
|
+
// The body is a document, so lit draws nothing and the mount happens against the painted DOM.
|
|
287
|
+
// `afterRender` runs on every repaint; {@link mountElementsPanel} is idempotent.
|
|
288
|
+
render: (): PanelBody => nothing,
|
|
289
|
+
afterRender: (ctx, host) => {
|
|
290
|
+
mountElementsPanel(ctx, host);
|
|
234
291
|
},
|
|
235
292
|
});
|
|
236
293
|
}
|
|
@@ -2,8 +2,9 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* The one empty-state pattern.
|
|
4
4
|
*
|
|
5
|
-
* Every region in the shell that can be empty
|
|
6
|
-
*
|
|
5
|
+
* Every region in the shell that can be empty says its piece through {@link EmptyStateSpec} — drawn
|
|
6
|
+
* by `surfaces/empty-state.json`, or by a converted panel's own `[part="empty"]` block — instead of
|
|
7
|
+
* hand-writing one, so the copy rules below are inherited rather than re-decided:
|
|
7
8
|
*
|
|
8
9
|
* 1. **One sentence saying what the region is _for_.** Not what is absent — "No state defined" is a
|
|
9
10
|
* dead end, "Data this page can read, compute or fetch lives here" tells you what it is.
|
|
@@ -17,16 +18,19 @@
|
|
|
17
18
|
* container.
|
|
18
19
|
*/
|
|
19
20
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
21
|
+
/**
|
|
22
|
+
* A button offered by an empty state.
|
|
23
|
+
*
|
|
24
|
+
* There is no `icon` here any more, and its absence is the point rather than an omission: it was
|
|
25
|
+
* typed `TemplateResult` and every value passed to it was an `sp-icon-*`, which is a Spectrum
|
|
26
|
+
* element smuggled through a shared vocabulary into surfaces that have no other Spectrum in them.
|
|
27
|
+
* `panels/git-panel.ts` was the last caller and it is a document now, so the field went with it —
|
|
28
|
+
* `surfaces/empty-state.json` draws a word, and a region that needs a glyph beside one is asking
|
|
29
|
+
* for a control the kit declares rather than for a hole in this type.
|
|
30
|
+
*/
|
|
25
31
|
export interface EmptyStateAction {
|
|
26
32
|
/** Imperative naming what happens — "Add a value", not "Go to the Data panel". */
|
|
27
33
|
label: string;
|
|
28
|
-
/** Optional Spectrum icon. Must carry `slot="icon"`. */
|
|
29
|
-
icon?: TemplateResult;
|
|
30
34
|
run: () => void;
|
|
31
35
|
disabled?: boolean;
|
|
32
36
|
}
|
|
@@ -77,36 +81,16 @@ export function openPageAction(label = "Open a page…"): EmptyStateAction {
|
|
|
77
81
|
};
|
|
78
82
|
}
|
|
79
83
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
${
|
|
94
|
-
actions.length > 0
|
|
95
|
-
? html`<div class="empty-state-actions">
|
|
96
|
-
${actions.map(
|
|
97
|
-
(action) => html`
|
|
98
|
-
<sp-action-button
|
|
99
|
-
size="s"
|
|
100
|
-
class="empty-state-action"
|
|
101
|
-
?disabled=${Boolean(action.disabled)}
|
|
102
|
-
@click=${() => action.run()}
|
|
103
|
-
>${action.icon ?? nothing}${action.label}</sp-action-button
|
|
104
|
-
>
|
|
105
|
-
`,
|
|
106
|
-
)}
|
|
107
|
-
</div>`
|
|
108
|
-
: nothing
|
|
109
|
-
}
|
|
110
|
-
</div>
|
|
111
|
-
`;
|
|
112
|
-
}
|
|
84
|
+
/*
|
|
85
|
+
* `renderEmptyState` was here, and it is GONE rather than kept beside the document.
|
|
86
|
+
*
|
|
87
|
+
* It drew the pattern as a lit template over an `sp-action-button`, and by the end of this batch it
|
|
88
|
+
* had no caller: the Navigator's bodies, the Bottom dock and a derived stage hand their box to
|
|
89
|
+
* `surfaces/empty-state.ts`'s `emptyState()`, the nine panels that are documents draw a
|
|
90
|
+
* `[part="empty"]` of their own, and `ui/expression-editor.ts` — the last lit caller — converted
|
|
91
|
+
* alongside them.
|
|
92
|
+
*
|
|
93
|
+
* What is left here is the half that was never about drawing: {@link EmptyStateSpec}, which the
|
|
94
|
+
* document reads verbatim, and the copy rules at the top of this file, which are the reason a
|
|
95
|
+
* region says what it is FOR rather than what is absent. One vocabulary, one renderer.
|
|
96
|
+
*/
|