@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
|
@@ -37,13 +37,19 @@
|
|
|
37
37
|
* is the pane context bar ⑦; a second mode picker in 24px would be the chrome duplication §2
|
|
38
38
|
* principle 9 exists to prevent), the save wording once a document IS saved, and the stylebook
|
|
39
39
|
* selector.
|
|
40
|
+
*
|
|
41
|
+
* The bar is the `statusbar` surface (`surfaces/statusbar.json`): this module is the projection —
|
|
42
|
+
* three fields of items, each item a button with a command or a readout without — and the surface
|
|
43
|
+
* draws it. The scope is reactive, so one effect recomputes the projection from the state the bar
|
|
44
|
+
* renders; nothing repaints.
|
|
45
|
+
*
|
|
46
|
+
* @docs studio/interface
|
|
40
47
|
*/
|
|
41
48
|
|
|
42
|
-
import { html, render as litRender, nothing } from "lit-html";
|
|
43
49
|
import { projectState, statusbarEl } from "../store";
|
|
44
|
-
import { documentLabel } from "
|
|
50
|
+
import { documentLabel } from "../panels/jump-bar";
|
|
45
51
|
import { shell } from "../shell";
|
|
46
|
-
import { effect, effectScope } from "../reactivity";
|
|
52
|
+
import { effect, effectScope, reactive } from "../reactivity";
|
|
47
53
|
import { activeTab } from "../workspace/workspace";
|
|
48
54
|
import { EDITOR_KIND_LABELS } from "../commands/context";
|
|
49
55
|
import { activeRegistry } from "../commands/active-registry";
|
|
@@ -51,11 +57,16 @@ import { deployStatusItem } from "../publish/deploy-checklist";
|
|
|
51
57
|
import { collabState } from "../collab/collab-state";
|
|
52
58
|
import { problemCount, problems } from "../services/notify";
|
|
53
59
|
import { now } from "../services/clock";
|
|
54
|
-
import { relativeTime } from "
|
|
60
|
+
import { relativeTime } from "../panels/ai-chat/sessions-view";
|
|
61
|
+
import { mountSurface, registerSurface } from "../ui/surface";
|
|
62
|
+
import statusbarDoc from "./statusbar.json";
|
|
55
63
|
import type { CommandRegistry } from "../commands/registry";
|
|
56
64
|
import type { EditorKind } from "../commands/context";
|
|
57
65
|
import type { EffectScope } from "@vue/reactivity";
|
|
58
|
-
import type {
|
|
66
|
+
import type { JxDocument } from "@jxsuite/schema/types";
|
|
67
|
+
import type { SurfaceHandle } from "../ui/surface";
|
|
68
|
+
|
|
69
|
+
registerSurface("statusbar", statusbarDoc as unknown as JxDocument);
|
|
59
70
|
|
|
60
71
|
let _scope: EffectScope | null = null;
|
|
61
72
|
|
|
@@ -93,22 +104,51 @@ interface StatusItem {
|
|
|
93
104
|
args?: Record<string, unknown>;
|
|
94
105
|
}
|
|
95
106
|
|
|
107
|
+
/** One item as the surface reads it: a button that runs a command through `run`, or a readout. */
|
|
108
|
+
interface ProjectedItem {
|
|
109
|
+
/** Unique within the bar; the row's identity and what `run` receives. */
|
|
110
|
+
key: string;
|
|
111
|
+
kind: "button" | "state";
|
|
112
|
+
label: string;
|
|
113
|
+
title: string;
|
|
114
|
+
disabled: boolean;
|
|
115
|
+
/** For a button: what `run` runs. */
|
|
116
|
+
command: string | null;
|
|
117
|
+
args: Record<string, unknown> | undefined;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
interface ProjectedField {
|
|
121
|
+
id: string;
|
|
122
|
+
region: string;
|
|
123
|
+
items: ProjectedItem[];
|
|
124
|
+
}
|
|
125
|
+
|
|
96
126
|
/**
|
|
97
|
-
*
|
|
127
|
+
* Project one item.
|
|
98
128
|
*
|
|
99
|
-
* A named command that the registry does not have, or whose `when` is false,
|
|
100
|
-
* item disappears rather than becoming a dead label. That is the whole mechanism by which the
|
|
101
|
-
* stays a rendering of the registry instead of a second place capabilities are decided.
|
|
129
|
+
* A named command that the registry does not have, or whose `when` is false, projects to NOTHING —
|
|
130
|
+
* the item disappears rather than becoming a dead label. That is the whole mechanism by which the
|
|
131
|
+
* bar stays a rendering of the registry instead of a second place capabilities are decided.
|
|
102
132
|
*/
|
|
103
|
-
function
|
|
133
|
+
function projectItem(
|
|
134
|
+
registry: CommandRegistry | null,
|
|
135
|
+
region: string,
|
|
136
|
+
item: StatusItem,
|
|
137
|
+
): ProjectedItem | null {
|
|
104
138
|
if (item.command === null) {
|
|
105
|
-
return
|
|
106
|
-
|
|
107
|
-
|
|
139
|
+
return {
|
|
140
|
+
args: undefined,
|
|
141
|
+
command: null,
|
|
142
|
+
disabled: false,
|
|
143
|
+
key: `${region}:${item.label}`,
|
|
144
|
+
kind: "state",
|
|
145
|
+
label: item.label,
|
|
146
|
+
title: item.title ?? item.label,
|
|
147
|
+
};
|
|
108
148
|
}
|
|
109
149
|
const id = item.command;
|
|
110
150
|
if (!registry?.get(id) || !registry.isVisible(id)) {
|
|
111
|
-
return
|
|
151
|
+
return null;
|
|
112
152
|
}
|
|
113
153
|
const command = registry.get(id)!;
|
|
114
154
|
const reason = registry.disabledReason(id);
|
|
@@ -118,28 +158,31 @@ function itemTpl(registry: CommandRegistry | null, item: StatusItem) {
|
|
|
118
158
|
: chord
|
|
119
159
|
? `${command.title} (${chord})`
|
|
120
160
|
: command.title;
|
|
121
|
-
return
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
</button>`;
|
|
161
|
+
return {
|
|
162
|
+
args: item.args,
|
|
163
|
+
command: id,
|
|
164
|
+
disabled: reason !== undefined,
|
|
165
|
+
key: `${region}:${id}`,
|
|
166
|
+
kind: "button",
|
|
167
|
+
label: item.label,
|
|
168
|
+
title: item.title ? `${item.title} · ${suffix}` : suffix,
|
|
169
|
+
};
|
|
131
170
|
}
|
|
132
171
|
|
|
133
|
-
/**
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
172
|
+
/** A field, with its region. Absent when it has no items. */
|
|
173
|
+
function projectField(
|
|
174
|
+
registry: CommandRegistry | null,
|
|
175
|
+
id: string,
|
|
176
|
+
items: readonly (StatusItem | null)[],
|
|
177
|
+
): ProjectedField | null {
|
|
178
|
+
const region = `statusbar/${id}`;
|
|
179
|
+
const live = items
|
|
180
|
+
.map((item) => (item === null ? null : projectItem(registry, region, item)))
|
|
181
|
+
.filter((item): item is ProjectedItem => item !== null);
|
|
139
182
|
if (live.length === 0) {
|
|
140
|
-
return
|
|
183
|
+
return null;
|
|
141
184
|
}
|
|
142
|
-
return
|
|
185
|
+
return { id, items: live, region };
|
|
143
186
|
}
|
|
144
187
|
|
|
145
188
|
// ─── ⑫a PROJECT ──────────────────────────────────────────────────────────────
|
|
@@ -149,16 +192,16 @@ export function aheadBehindLabel(ahead: number, behind: number): string {
|
|
|
149
192
|
return `${ahead > 0 ? ` ↑${ahead}` : ""}${behind > 0 ? ` ↓${behind}` : ""}`;
|
|
150
193
|
}
|
|
151
194
|
|
|
152
|
-
function
|
|
195
|
+
function projectField_(registry: CommandRegistry | null): ProjectedField | null {
|
|
153
196
|
const project = projectState;
|
|
154
197
|
const { status } = shell.git;
|
|
155
198
|
const count = problemCount();
|
|
156
199
|
const deploy = deployStatusItem();
|
|
157
200
|
const peers = activeTab.value ? collabState(activeTab.value).peers.length : 0;
|
|
158
|
-
return
|
|
201
|
+
return projectField(registry, "project", [
|
|
159
202
|
project
|
|
160
|
-
?
|
|
161
|
-
:
|
|
203
|
+
? { command: "project.openRecent", label: project.name }
|
|
204
|
+
: { command: "project.open", label: "No project" },
|
|
162
205
|
/* WHICH branch, when there is one — and deliberately no "not tracked" twin, though plan §12 P1
|
|
163
206
|
workstream 9's "repo state becomes a persistent status-bar field" reads like a request for
|
|
164
207
|
one. An untracked project already states itself in this field, one item along:
|
|
@@ -169,50 +212,38 @@ function projectFieldTpl(registry: CommandRegistry | null) {
|
|
|
169
212
|
pins the pairing from both ends, so deleting the checklist's repo step fails there rather
|
|
170
213
|
than quietly taking the state off the bar. */
|
|
171
214
|
status?.isRepo === true && status.branch
|
|
172
|
-
?
|
|
215
|
+
? {
|
|
173
216
|
command: "panel.focus.git",
|
|
174
217
|
label: `⑂ ${status.branch}${aheadBehindLabel(status.ahead, status.behind)}`,
|
|
175
218
|
title: `${status.files.length} changed file(s)`,
|
|
176
|
-
}
|
|
177
|
-
:
|
|
219
|
+
}
|
|
220
|
+
: null,
|
|
178
221
|
// Where the project stands with shipping — ambient state, so it belongs beside the branch and
|
|
179
222
|
// The problem count rather than in a toast. `deployStatusItem` names the NEXT missing step
|
|
180
223
|
// While anything is missing, and the deployment itself once nothing is.
|
|
181
|
-
deploy
|
|
182
|
-
? itemTpl(registry, {
|
|
183
|
-
command: deploy.command,
|
|
184
|
-
label: deploy.label,
|
|
185
|
-
title: deploy.title,
|
|
186
|
-
})
|
|
187
|
-
: nothing,
|
|
224
|
+
deploy ? { command: deploy.command, label: deploy.label, title: deploy.title } : null,
|
|
188
225
|
// `view.setBottomTab`, not `panel.focus.problems`: the latter is generated from the rail
|
|
189
226
|
// Roster, and Problems left the rail. That is the same verb Diff, Logic and Activity are
|
|
190
227
|
// Addressed by — one door per bottom tab — and it is what keeps this readout the ONLY standing
|
|
191
228
|
// Mention of problems in the chrome, which is the point of taking the rail button away.
|
|
192
229
|
count > 0
|
|
193
|
-
?
|
|
230
|
+
? {
|
|
194
231
|
args: { tab: "problems" },
|
|
195
232
|
command: "view.setBottomTab",
|
|
196
233
|
label: `⚠ ${count}`,
|
|
197
234
|
title: `${count} problem(s)`,
|
|
198
|
-
}
|
|
199
|
-
:
|
|
235
|
+
}
|
|
236
|
+
: null,
|
|
200
237
|
/* `collab.showStatus` — "what is happening in this document?" — because that is the question a
|
|
201
|
-
peer count raises.
|
|
202
|
-
|
|
203
|
-
This said `collab.share` and carried a comment promising the item would "appear the day the
|
|
204
|
-
`Collaborate:` family lands, with no edit to this file". The family landed, under five ids,
|
|
205
|
-
and `share` was renamed `collab.setEnabled` on the way (the set*-not-toggle* rule). `itemTpl`
|
|
206
|
-
renders `nothing` for an id the registry does not have, so the readout was permanently blank
|
|
207
|
-
and the comment said it was fine. An id is not a stable interface between two files unless
|
|
208
|
-
something checks it, which is what `tests/statusbar.test.ts` now does. */
|
|
238
|
+
peer count raises. An id is not a stable interface between two files unless something checks
|
|
239
|
+
it, which is what `tests/statusbar.test.ts` does. */
|
|
209
240
|
peers > 0
|
|
210
|
-
?
|
|
241
|
+
? {
|
|
211
242
|
command: "collab.showStatus",
|
|
212
243
|
label: `${peers} peer${peers === 1 ? "" : "s"}`,
|
|
213
244
|
title: `${peers} peer${peers === 1 ? "" : "s"} in this document`,
|
|
214
|
-
}
|
|
215
|
-
:
|
|
245
|
+
}
|
|
246
|
+
: null,
|
|
216
247
|
]);
|
|
217
248
|
}
|
|
218
249
|
|
|
@@ -253,29 +284,25 @@ function saveItem(dirty: boolean, readOnly: boolean, savedAt: number | undefined
|
|
|
253
284
|
: { command: null, label: `Saved ${relativeTime(savedAt)}` };
|
|
254
285
|
}
|
|
255
286
|
|
|
256
|
-
function
|
|
287
|
+
function documentField(registry: CommandRegistry | null): ProjectedField | null {
|
|
257
288
|
const tab = activeTab.value;
|
|
258
289
|
if (!tab) {
|
|
259
|
-
return
|
|
290
|
+
return null;
|
|
260
291
|
}
|
|
261
292
|
const ctx = registry?.context() ?? null;
|
|
262
293
|
const view = ctx ? viewLabel(ctx.editor.kind, ctx.canvas.view) : "";
|
|
263
294
|
const collab = collabState(tab);
|
|
264
295
|
const savedAt = tab.documentPath === null ? undefined : _savedAt.get(tab.documentPath);
|
|
265
|
-
return
|
|
266
|
-
|
|
296
|
+
return projectField(registry, "document", [
|
|
297
|
+
{
|
|
267
298
|
command: "palette.openFiles",
|
|
268
299
|
label: documentLabel(tab.documentPath),
|
|
269
300
|
title: tab.documentPath ?? "Not saved to disk yet",
|
|
270
|
-
}
|
|
301
|
+
},
|
|
271
302
|
view
|
|
272
|
-
?
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
title: "The pane's view — change it on the pane context bar",
|
|
276
|
-
})
|
|
277
|
-
: nothing,
|
|
278
|
-
itemTpl(registry, saveItem(tab.doc.dirty, collab.readOnly, savedAt)),
|
|
303
|
+
? { command: null, label: view, title: "The pane's view — change it on the pane context bar" }
|
|
304
|
+
: null,
|
|
305
|
+
saveItem(tab.doc.dirty, collab.readOnly, savedAt),
|
|
279
306
|
]);
|
|
280
307
|
}
|
|
281
308
|
|
|
@@ -296,49 +323,86 @@ function documentFieldTpl(registry: CommandRegistry | null) {
|
|
|
296
323
|
* A single selection therefore leaves this field empty. That is deliberate — the jump bar's leaf
|
|
297
324
|
* segment states it permanently, with its ancestors, and a second copy at 11px says nothing new.
|
|
298
325
|
*/
|
|
299
|
-
function
|
|
326
|
+
function selectionField(registry: CommandRegistry | null): ProjectedField | null {
|
|
300
327
|
const paths = activeTab.value?.session.selection ?? [];
|
|
301
328
|
if (paths.length > 0) {
|
|
302
329
|
// A document selection owns the field even when it prints nothing: the Stylebook's selector
|
|
303
330
|
// Below would otherwise appear while an element is picked, which is two answers to one question.
|
|
304
331
|
return paths.length > 1
|
|
305
|
-
?
|
|
306
|
-
|
|
332
|
+
? projectField(registry, "selection", [
|
|
333
|
+
{
|
|
307
334
|
command: null,
|
|
308
335
|
label: `${paths.length} selected`,
|
|
309
336
|
title: `${paths.length} elements are selected; the jump bar names the primary`,
|
|
310
|
-
}
|
|
337
|
+
},
|
|
311
338
|
])
|
|
312
|
-
:
|
|
339
|
+
: null;
|
|
313
340
|
}
|
|
314
341
|
// The stylebook's own selection is a selection: it is what the Style panel is editing, and it is
|
|
315
342
|
// The only thing in this field when no document node is picked.
|
|
316
343
|
return shell.stylebook.selection
|
|
317
|
-
?
|
|
318
|
-
|
|
344
|
+
? projectField(registry, "selection", [
|
|
345
|
+
{
|
|
319
346
|
command: null,
|
|
320
347
|
label: shell.stylebook.selection.replaceAll(" ", " › "),
|
|
321
348
|
title: "The style rule being edited",
|
|
322
|
-
}
|
|
349
|
+
},
|
|
323
350
|
])
|
|
324
|
-
:
|
|
351
|
+
: null;
|
|
325
352
|
}
|
|
326
353
|
|
|
327
354
|
// ─── The bar ─────────────────────────────────────────────────────────────────
|
|
328
355
|
|
|
329
|
-
/** The whole bar, as
|
|
330
|
-
|
|
356
|
+
/** The whole bar, as data. There is no second variant for the empty states. */
|
|
357
|
+
function projectBar(): ProjectedField[] {
|
|
331
358
|
const registry = activeRegistry();
|
|
332
|
-
return
|
|
333
|
-
|
|
334
|
-
)
|
|
359
|
+
return [projectField_(registry), documentField(registry), selectionField(registry)].filter(
|
|
360
|
+
(field): field is ProjectedField => field !== null,
|
|
361
|
+
);
|
|
335
362
|
}
|
|
336
363
|
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
364
|
+
interface StatusbarScope extends Record<string, unknown> {
|
|
365
|
+
fields: ProjectedField[];
|
|
366
|
+
run: (key: string) => void;
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
let _state: StatusbarScope | null = null;
|
|
370
|
+
let _mount: Promise<SurfaceHandle> | null = null;
|
|
371
|
+
let _handle: SurfaceHandle | null = null;
|
|
372
|
+
|
|
373
|
+
/** The reactive scope the surface reads, made once. */
|
|
374
|
+
function state(): StatusbarScope {
|
|
375
|
+
_state ??= reactive({
|
|
376
|
+
fields: [],
|
|
377
|
+
run: (key: string) => {
|
|
378
|
+
const item = _state?.fields.flatMap((field) => field.items).find((i) => i.key === key);
|
|
379
|
+
const registry = activeRegistry();
|
|
380
|
+
if (item?.command && registry) {
|
|
381
|
+
void registry.run(item.command, item.args as never);
|
|
382
|
+
}
|
|
383
|
+
},
|
|
384
|
+
}) as StatusbarScope;
|
|
385
|
+
return _state;
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
/** Mount the surface into the bar's host, once. */
|
|
389
|
+
function ensureMounted(): void {
|
|
390
|
+
if (_mount || !statusbarEl) {
|
|
391
|
+
return;
|
|
341
392
|
}
|
|
393
|
+
_mount = mountSurface("statusbar", state(), statusbarEl);
|
|
394
|
+
void _mount.then((handle) => {
|
|
395
|
+
_handle = handle;
|
|
396
|
+
});
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
/**
|
|
400
|
+
* Recompute the projection; the surface follows. Exported because the bootstrap paints once before
|
|
401
|
+
* mounting the effect.
|
|
402
|
+
*/
|
|
403
|
+
export function renderStatusbar(): void {
|
|
404
|
+
state().fields = projectBar();
|
|
405
|
+
ensureMounted();
|
|
342
406
|
}
|
|
343
407
|
|
|
344
408
|
/** Subscribe the bar to the state it renders. Idempotent. */
|
|
@@ -373,4 +437,13 @@ export function mountStatusbar(): void {
|
|
|
373
437
|
export function unmountStatusbar(): void {
|
|
374
438
|
_scope?.stop();
|
|
375
439
|
_scope = null;
|
|
440
|
+
const pending = _mount;
|
|
441
|
+
_mount = null;
|
|
442
|
+
if (_handle) {
|
|
443
|
+
_handle.dispose();
|
|
444
|
+
_handle = null;
|
|
445
|
+
} else if (pending) {
|
|
446
|
+
void pending.then((handle) => handle.dispose());
|
|
447
|
+
}
|
|
448
|
+
_state = null;
|
|
376
449
|
}
|