@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
package/src/panels/jump-bar.ts
CHANGED
|
@@ -11,9 +11,9 @@
|
|
|
11
11
|
* is the SAME basename for a `$map` template, so it read `index.json › index.json`), and knew
|
|
12
12
|
* nothing about the project above it or the selection below it. It is deleted, and so is the
|
|
13
13
|
* stack it walked: nothing ever pushed a frame, so it could only ever draw its empty branch.
|
|
14
|
-
* 2. `
|
|
15
|
-
* It appeared ONLY while something was selected, and knew nothing about the document it
|
|
16
|
-
* inside.
|
|
14
|
+
* 2. `surfaces/statusbar.ts`'s selection field — a clickable ancestor trail, `selection.set` per
|
|
15
|
+
* crumb. It appeared ONLY while something was selected, and knew nothing about the document it
|
|
16
|
+
* was inside.
|
|
17
17
|
*
|
|
18
18
|
* Between them they never rendered at the same time as each other and never rendered the whole
|
|
19
19
|
* address, so neither one was a place to look. **This bar is the whole chain**, always:
|
|
@@ -41,9 +41,15 @@
|
|
|
41
41
|
* That is the one place this bar deliberately differs from the status bar, where an unavailable
|
|
42
42
|
* item vanishes. An address with a hole in it is a lie about containment; a readout is merely a
|
|
43
43
|
* step you cannot take.
|
|
44
|
+
*
|
|
45
|
+
* **This file is the FLOW; the markup is a document.** `surfaces/jump-bar.json` owns the bar's
|
|
46
|
+
* structure, its ARIA and every value in its style, and `surfaces/jump-bar.ts` mounts one per pane
|
|
47
|
+
* (studio-ui-guidelines.md §6, §9.3). What stays here is the part that is a decision: which pane
|
|
48
|
+
* this bar is about, what its address is, which of its steps the registry can run, and what a
|
|
49
|
+
* chevron opens — and the chevron opens the KIT MENU, `surfaces/menu.ts`, because a list of
|
|
50
|
+
* commands is what that surface already is (§12.5).
|
|
44
51
|
*/
|
|
45
52
|
|
|
46
|
-
import { html, render as litRender, nothing } from "lit-html";
|
|
47
53
|
import { displayTagName } from "@jxsuite/schema/guards";
|
|
48
54
|
import { childList, getNodeAtPath, nodeLabel, pathsEqual, projectState } from "../store";
|
|
49
55
|
import { effect, effectScope } from "../reactivity";
|
|
@@ -52,20 +58,22 @@ import { derivationOfPane, tabOfPane } from "../canvas/canvas-surface";
|
|
|
52
58
|
import { paneRegion } from "../ui/regions";
|
|
53
59
|
import { primarySelection } from "../tabs/selection";
|
|
54
60
|
import { activeRegistry } from "../commands/active-registry";
|
|
55
|
-
import {
|
|
56
|
-
import {
|
|
61
|
+
import { openMenu } from "../surfaces/menu";
|
|
62
|
+
import { mountJumpBarSurface } from "../surfaces/jump-bar";
|
|
63
|
+
import { PANE_SELECTOR } from "../surfaces/pane-grid";
|
|
57
64
|
import type { CommandArgs, CommandRegistry } from "../commands/registry";
|
|
58
65
|
import type { FormulaEditDef, FunctionEditDef } from "../types";
|
|
59
66
|
import type { JxPath } from "../state";
|
|
67
|
+
import type { MenuHandle, MenuRowProjection } from "../surfaces/menu";
|
|
68
|
+
import type { JumpBarSurface, ProjectedStep } from "../surfaces/jump-bar";
|
|
60
69
|
import type { Tab } from "../tabs/tab";
|
|
61
70
|
import type { PaneDerivation } from "../workspace/workspace";
|
|
62
71
|
import type { EffectScope } from "@vue/reactivity";
|
|
63
|
-
import type { TemplateResult } from "lit-html";
|
|
64
72
|
|
|
65
73
|
/** The CSS variable the stage is offset by while the jump bar is on screen. */
|
|
66
74
|
export const JUMP_BAR_VAR = "--jump-bar-h";
|
|
67
75
|
|
|
68
|
-
/** The bar's height. Declared here because the offset projection and the
|
|
76
|
+
/** The bar's height. Declared here because the offset projection and the document must agree. */
|
|
69
77
|
const JUMP_BAR_HEIGHT = 24;
|
|
70
78
|
|
|
71
79
|
// ─── The model ───────────────────────────────────────────────────────────────
|
|
@@ -105,7 +113,7 @@ export interface JumpSegment {
|
|
|
105
113
|
*
|
|
106
114
|
* Lives here rather than in `statusbar.ts`, where it started: the jump bar is the surface whose
|
|
107
115
|
* whole job is naming the containment chain, and the status bar's DOCUMENT field is a second reader
|
|
108
|
-
* of the same fact. Having the reader own it also kept `mock.module("
|
|
116
|
+
* of the same fact. Having the reader own it also kept `mock.module("surfaces/statusbar")` — which
|
|
109
117
|
* six bootstrap tests do — from deciding whether the jump bar can name a file.
|
|
110
118
|
*/
|
|
111
119
|
export function documentLabel(path: string | null): string {
|
|
@@ -211,11 +219,12 @@ function choiceFor(document: unknown, path: JxPath, fallback: string, own: JxPat
|
|
|
211
219
|
// ─── Building the address ────────────────────────────────────────────────────
|
|
212
220
|
|
|
213
221
|
/**
|
|
214
|
-
* The whole address, as data. Pure: no registry, no DOM — the
|
|
222
|
+
* The whole address, as data. Pure: no registry, no DOM — the projection decides what is
|
|
223
|
+
* renderable.
|
|
215
224
|
*
|
|
216
225
|
* Order is containment order, outermost first, which is the same left-to-right order the status bar
|
|
217
226
|
* puts its three fields in. Nothing here reads the registry, so a segment is produced whether or
|
|
218
|
-
* not its command happens to be registered; {@link
|
|
227
|
+
* not its command happens to be registered; {@link projectStep} is where that difference shows.
|
|
219
228
|
*/
|
|
220
229
|
export function jumpSegments(
|
|
221
230
|
tab: Tab | null,
|
|
@@ -244,7 +253,7 @@ export function jumpSegments(
|
|
|
244
253
|
The address is still the document — a lens draws the source pane's, a companion its own — but
|
|
245
254
|
the question an author has about a pane that is following something is "can I stop it
|
|
246
255
|
following and just keep this open". `pane.pin` answers it, and answers it with a REFUSAL for a
|
|
247
|
-
lens: `
|
|
256
|
+
lens: `projectStep` already renders a step whose command is disabled as a disabled button with
|
|
248
257
|
`disabledReason` in the tooltip, so the sentence explaining why Code, Diff and breakpoint views
|
|
249
258
|
cannot be pinned arrives for free. */
|
|
250
259
|
segments.push({
|
|
@@ -301,26 +310,20 @@ function editorSegment(sigil: string, def: FunctionEditDef | FormulaEditDef): Ju
|
|
|
301
310
|
};
|
|
302
311
|
}
|
|
303
312
|
|
|
304
|
-
// ───
|
|
313
|
+
// ─── The projection ──────────────────────────────────────────────────────────
|
|
305
314
|
|
|
306
315
|
/**
|
|
307
|
-
*
|
|
316
|
+
* A step's identity across repaints — the repeater's key, and what `run` and `choose` are given.
|
|
308
317
|
*
|
|
309
|
-
* A
|
|
310
|
-
*
|
|
311
|
-
*
|
|
312
|
-
* hand-over `panels/frontmatter-panel.ts` takes from the stage.
|
|
318
|
+
* A NODE step is named by its path, so moving the selection one level up keeps every ancestor's
|
|
319
|
+
* node (and the chevron the reader is aiming at) exactly where it was. Every other kind is a
|
|
320
|
+
* singleton in the address, so its kind is name enough.
|
|
313
321
|
*/
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
/** Close the open segment menu, if any. Idempotent. */
|
|
321
|
-
export function dismissJumpMenu(): void {
|
|
322
|
-
_menu?.dismiss();
|
|
323
|
-
_menu = null;
|
|
322
|
+
function stepKey(segment: JumpSegment): string {
|
|
323
|
+
const path = segment.args?.path;
|
|
324
|
+
return segment.kind === "node" && Array.isArray(path)
|
|
325
|
+
? `node:${(path as JxPath).join("/")}`
|
|
326
|
+
: segment.kind;
|
|
324
327
|
}
|
|
325
328
|
|
|
326
329
|
/** Whether the registry can actually run this id right now. */
|
|
@@ -342,117 +345,104 @@ function segmentTitle(registry: CommandRegistry, segment: JumpSegment, id: strin
|
|
|
342
345
|
}
|
|
343
346
|
|
|
344
347
|
/**
|
|
345
|
-
*
|
|
348
|
+
* One step, as the document reads it.
|
|
346
349
|
*
|
|
347
|
-
*
|
|
348
|
-
*
|
|
350
|
+
* An unregistered or invisible command makes the step a READOUT rather than removing it, and more
|
|
351
|
+
* than one alternative is what earns a chevron: one is not a choice, and a control that cannot move
|
|
352
|
+
* is chrome (§2 principle 9).
|
|
349
353
|
*/
|
|
350
|
-
function
|
|
351
|
-
event.preventDefault();
|
|
352
|
-
event.stopPropagation();
|
|
353
|
-
dismissJumpMenu();
|
|
354
|
-
const anchor = rectOf(event.currentTarget as HTMLElement);
|
|
355
|
-
const left = Math.round(Math.min(anchor.left, window.innerWidth - 4));
|
|
356
|
-
const top = Math.round(anchor.bottom);
|
|
357
|
-
_menu = renderPopover(
|
|
358
|
-
html`<sp-popover open style="position:fixed;z-index:10000;left:${left}px;top:${top}px">
|
|
359
|
-
<sp-menu role="menu" aria-label=${`Go to a sibling of ${segment.label}`}>
|
|
360
|
-
${segment.choices.map(
|
|
361
|
-
(choice) => html`<sp-menu-item
|
|
362
|
-
role="menuitem"
|
|
363
|
-
aria-current=${choice.current === true ? "true" : nothing}
|
|
364
|
-
@click=${() => {
|
|
365
|
-
dismissJumpMenu();
|
|
366
|
-
void registry.run(choice.command, choice.args);
|
|
367
|
-
}}
|
|
368
|
-
>${choice.label}</sp-menu-item
|
|
369
|
-
>`,
|
|
370
|
-
)}
|
|
371
|
-
</sp-menu>
|
|
372
|
-
</sp-popover>`,
|
|
373
|
-
{
|
|
374
|
-
dismissOnOutsideClick: true,
|
|
375
|
-
onDismiss: () => {
|
|
376
|
-
_menu = null;
|
|
377
|
-
},
|
|
378
|
-
region: "jump-bar",
|
|
379
|
-
},
|
|
380
|
-
);
|
|
381
|
-
}
|
|
382
|
-
|
|
383
|
-
/** One step of the address, plus its alternatives control when it has any. */
|
|
384
|
-
function segmentTpl(
|
|
354
|
+
function projectStep(
|
|
385
355
|
registry: CommandRegistry | null,
|
|
386
356
|
segment: JumpSegment,
|
|
357
|
+
first: boolean,
|
|
387
358
|
last: boolean,
|
|
388
|
-
):
|
|
359
|
+
): ProjectedStep {
|
|
389
360
|
const id = segment.command;
|
|
390
361
|
const live = runnable(registry, id);
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
? html`<button
|
|
414
|
-
class="jb-alts"
|
|
415
|
-
aria-haspopup="menu"
|
|
416
|
-
aria-label=${`Siblings of ${segment.label}`}
|
|
417
|
-
title=${`Siblings of ${segment.label}`}
|
|
418
|
-
@click=${(event: MouseEvent) => {
|
|
419
|
-
openChoices(event, registry, segment);
|
|
420
|
-
}}
|
|
421
|
-
>
|
|
422
|
-
⌄
|
|
423
|
-
</button>`
|
|
424
|
-
: nothing;
|
|
425
|
-
return html`<span class="jb-seg" data-jump-kind=${segment.kind}>${crumb}${alternatives}</span>`;
|
|
362
|
+
return {
|
|
363
|
+
altsLabel: `Siblings of ${segment.label}`,
|
|
364
|
+
control: live ? "button" : "readout",
|
|
365
|
+
current: last,
|
|
366
|
+
disabled: live && registry!.disabledReason(id!) !== undefined,
|
|
367
|
+
hasChoices: registry !== null && segment.choices.length > 1,
|
|
368
|
+
key: stepKey(segment),
|
|
369
|
+
kind: segment.kind,
|
|
370
|
+
label: segment.label,
|
|
371
|
+
leading: first,
|
|
372
|
+
title: live ? segmentTitle(registry!, segment, id!) : (segment.title ?? segment.label),
|
|
373
|
+
};
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
// ─── Rendering ───────────────────────────────────────────────────────────────
|
|
377
|
+
|
|
378
|
+
/** One pane's bar: the document mounted in its cell, and the address it last drew. */
|
|
379
|
+
interface PaneBar {
|
|
380
|
+
host: HTMLElement;
|
|
381
|
+
surface: JumpBarSurface;
|
|
382
|
+
/** The segments behind the projection, by key — what `run` and `choose` resolve against. */
|
|
383
|
+
segments: Map<string, JumpSegment>;
|
|
426
384
|
}
|
|
427
385
|
|
|
428
386
|
/**
|
|
429
|
-
*
|
|
387
|
+
* Where each pane's bar is mounted. One entry per drawn cell.
|
|
430
388
|
*
|
|
431
|
-
*
|
|
432
|
-
*
|
|
389
|
+
* A Map rather than a `let _host`, because the bar addresses a PANE: it prints where you are, and
|
|
390
|
+
* with two panes on screen there are two answers. `panels/pane-grid.ts` attaches a cell's
|
|
391
|
+
* `.pane-jump` as the cell is built and detaches it as the cell is disposed, which is the same
|
|
392
|
+
* hand-over `panels/frontmatter-panel.ts` takes from the stage.
|
|
433
393
|
*/
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
394
|
+
const _bars = new Map<string, PaneBar>();
|
|
395
|
+
|
|
396
|
+
let _scope: EffectScope | null = null;
|
|
397
|
+
|
|
398
|
+
let _menu: MenuHandle | null = null;
|
|
399
|
+
|
|
400
|
+
/** Close the open segment menu, if any. Idempotent. */
|
|
401
|
+
export function dismissJumpMenu(): void {
|
|
402
|
+
const menu = _menu;
|
|
403
|
+
_menu = null;
|
|
404
|
+
menu?.close();
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
/**
|
|
408
|
+
* Open a segment's alternatives, as the kit menu.
|
|
409
|
+
*
|
|
410
|
+
* The rows are built from the segment's choices, and every row runs a command — the same command
|
|
411
|
+
* the segment itself names, with a different path. Nothing here decides what selecting means, and
|
|
412
|
+
* nothing here draws a panel: `surfaces/menu.ts` owns the roving caret, typeahead, Escape and light
|
|
413
|
+
* dismissal, because a list of commands is what that surface already is (§12.5).
|
|
414
|
+
*/
|
|
415
|
+
function openChoices(segment: JumpSegment, anchor: HTMLElement | null): void {
|
|
441
416
|
const registry = activeRegistry();
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
)
|
|
455
|
-
|
|
417
|
+
if (!registry) {
|
|
418
|
+
return;
|
|
419
|
+
}
|
|
420
|
+
dismissJumpMenu();
|
|
421
|
+
const rows: MenuRowProjection[] = segment.choices.map((choice, i) => ({
|
|
422
|
+
// The choice you are already on is MARKED rather than removed: a menu that omits your place
|
|
423
|
+
// Loses it. `checked` is the element's own spelling of that, so the row announces itself.
|
|
424
|
+
checked: choice.current === true ? "true" : "false",
|
|
425
|
+
destructive: false,
|
|
426
|
+
disabled: false,
|
|
427
|
+
dividerAbove: false,
|
|
428
|
+
id: String(i),
|
|
429
|
+
run: () => {
|
|
430
|
+
void registry.run(choice.command, choice.args);
|
|
431
|
+
},
|
|
432
|
+
title: choice.label,
|
|
433
|
+
}));
|
|
434
|
+
const handle = openMenu({
|
|
435
|
+
label: `Go to a sibling of ${segment.label}`,
|
|
436
|
+
onClosed: (closed) => {
|
|
437
|
+
if (_menu === closed) {
|
|
438
|
+
_menu = null;
|
|
439
|
+
}
|
|
440
|
+
},
|
|
441
|
+
opener: anchor,
|
|
442
|
+
region: "jump-bar",
|
|
443
|
+
rows,
|
|
444
|
+
});
|
|
445
|
+
_menu = handle;
|
|
456
446
|
}
|
|
457
447
|
|
|
458
448
|
/**
|
|
@@ -473,10 +463,26 @@ export function jumpBarTemplate(
|
|
|
473
463
|
* @param {HTMLElement | null} [host] The bar's host. Its cell takes the variable when it has one.
|
|
474
464
|
*/
|
|
475
465
|
export function applyJumpBarOffset(height: number, host?: HTMLElement | null): void {
|
|
476
|
-
const target = host?.closest<HTMLElement>(
|
|
466
|
+
const target = host?.closest<HTMLElement>(PANE_SELECTOR) ?? document.documentElement;
|
|
477
467
|
target.style.setProperty(JUMP_BAR_VAR, `${height}px`);
|
|
478
468
|
}
|
|
479
469
|
|
|
470
|
+
/**
|
|
471
|
+
* The address one pane's document should be showing, and the segments behind it.
|
|
472
|
+
*
|
|
473
|
+
* @param {string} paneId
|
|
474
|
+
*/
|
|
475
|
+
function projectPane(paneId: string): { steps: ProjectedStep[]; segments: JumpSegment[] } {
|
|
476
|
+
const segments = jumpSegments(tabOfPane(paneId), derivationOfPane(paneId));
|
|
477
|
+
const registry = activeRegistry();
|
|
478
|
+
return {
|
|
479
|
+
segments,
|
|
480
|
+
steps: segments.map((segment, i) =>
|
|
481
|
+
projectStep(registry, segment, i === 0, i === segments.length - 1),
|
|
482
|
+
),
|
|
483
|
+
};
|
|
484
|
+
}
|
|
485
|
+
|
|
480
486
|
/**
|
|
481
487
|
* Paint one pane's bar. Exported because the bootstrap paints once before mounting the effect.
|
|
482
488
|
*
|
|
@@ -484,47 +490,67 @@ export function applyJumpBarOffset(height: number, host?: HTMLElement | null): v
|
|
|
484
490
|
* the caller is a lifecycle rather than a pane.
|
|
485
491
|
*/
|
|
486
492
|
export function renderJumpBar(paneId?: string): void {
|
|
487
|
-
if (
|
|
493
|
+
if (_bars.size === 0) {
|
|
488
494
|
return;
|
|
489
495
|
}
|
|
490
496
|
// The address changed, so an open menu is describing a place that may no longer be on the bar.
|
|
491
497
|
// Repaints happen only when tracked state moves, so this cannot close a menu you are reading.
|
|
492
498
|
dismissJumpMenu();
|
|
493
|
-
for (const [id,
|
|
499
|
+
for (const [id, bar] of _bars) {
|
|
494
500
|
if (paneId !== undefined && id !== paneId) {
|
|
495
501
|
continue;
|
|
496
502
|
}
|
|
497
|
-
const
|
|
498
|
-
|
|
499
|
-
|
|
503
|
+
const { segments, steps } = projectPane(id);
|
|
504
|
+
bar.segments = new Map(steps.map((step, i) => [step.key, segments[i]!]));
|
|
505
|
+
bar.surface.update(steps);
|
|
506
|
+
applyJumpBarOffset(steps.length === 0 ? 0 : JUMP_BAR_HEIGHT, bar.host);
|
|
500
507
|
}
|
|
501
508
|
}
|
|
502
509
|
|
|
503
510
|
/**
|
|
504
511
|
* Give a pane's bar somewhere to paint, or take it away.
|
|
505
512
|
*
|
|
506
|
-
* Called by `panels/pane-grid.ts` as a cell is built and as it is disposed. Detaching
|
|
507
|
-
*
|
|
508
|
-
* DOM is about to be unreachable.
|
|
513
|
+
* Called by `panels/pane-grid.ts` as a cell is built and as it is disposed. Detaching disposes the
|
|
514
|
+
* mount first: a cell being removed still has this bar's document in it, and the runtime that owns
|
|
515
|
+
* that DOM is about to be unreachable.
|
|
509
516
|
*
|
|
510
517
|
* @param {string} paneId
|
|
511
518
|
* @param {HTMLElement | null} host
|
|
512
519
|
*/
|
|
513
520
|
export function attachJumpBarHost(paneId: string, host: HTMLElement | null): void {
|
|
514
|
-
const previous =
|
|
515
|
-
if (previous === host) {
|
|
521
|
+
const previous = _bars.get(paneId);
|
|
522
|
+
if (previous?.host === host) {
|
|
516
523
|
return;
|
|
517
524
|
}
|
|
518
525
|
if (previous) {
|
|
519
|
-
|
|
520
|
-
applyJumpBarOffset(0, previous);
|
|
526
|
+
previous.surface.dispose();
|
|
527
|
+
applyJumpBarOffset(0, previous.host);
|
|
528
|
+
_bars.delete(paneId);
|
|
521
529
|
}
|
|
522
|
-
if (host) {
|
|
523
|
-
|
|
524
|
-
renderJumpBar(paneId);
|
|
525
|
-
} else {
|
|
526
|
-
_hosts.delete(paneId);
|
|
530
|
+
if (!host) {
|
|
531
|
+
return;
|
|
527
532
|
}
|
|
533
|
+
const bar: PaneBar = {
|
|
534
|
+
host,
|
|
535
|
+
segments: new Map(),
|
|
536
|
+
surface: mountJumpBarSurface(host, paneRegion(paneId, "jump"), {
|
|
537
|
+
choose: (key, anchor) => {
|
|
538
|
+
const segment = _bars.get(paneId)?.segments.get(key);
|
|
539
|
+
if (segment) {
|
|
540
|
+
openChoices(segment, anchor);
|
|
541
|
+
}
|
|
542
|
+
},
|
|
543
|
+
run: (key) => {
|
|
544
|
+
const segment = _bars.get(paneId)?.segments.get(key);
|
|
545
|
+
const registry = activeRegistry();
|
|
546
|
+
if (segment?.command && registry) {
|
|
547
|
+
void registry.run(segment.command, segment.args);
|
|
548
|
+
}
|
|
549
|
+
},
|
|
550
|
+
}),
|
|
551
|
+
};
|
|
552
|
+
_bars.set(paneId, bar);
|
|
553
|
+
renderJumpBar(paneId);
|
|
528
554
|
}
|
|
529
555
|
|
|
530
556
|
/**
|
|
@@ -569,10 +595,11 @@ export function unmountJumpBar(): void {
|
|
|
569
595
|
dismissJumpMenu();
|
|
570
596
|
_scope?.stop();
|
|
571
597
|
_scope = null;
|
|
572
|
-
for (const
|
|
573
|
-
|
|
598
|
+
for (const bar of _bars.values()) {
|
|
599
|
+
bar.surface.dispose();
|
|
600
|
+
applyJumpBarOffset(0, bar.host);
|
|
574
601
|
}
|
|
575
|
-
|
|
602
|
+
_bars.clear();
|
|
576
603
|
applyJumpBarOffset(0);
|
|
577
604
|
}
|
|
578
605
|
|