@jxsuite/studio 6.1.1 → 8.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 +5 -5
- package/dist/chunks/2020-5wtzce5g.js +4 -0
- package/dist/chunks/{action-group-2mqby73c.js → action-group-4aan7g6g.js} +3 -3
- package/dist/chunks/adapter-5tphg7xe.js +4 -0
- package/dist/chunks/add-new-flow-psym14sn.js +4 -0
- package/dist/chunks/cf-account-picker-haqazq5r.js +4 -0
- package/dist/chunks/cf-settings-h2wrh6hq.js +4 -0
- package/dist/chunks/color-area-6rbra5dy.js +4 -0
- package/dist/chunks/color-field-gy56c94g.js +4 -0
- package/dist/chunks/color-m7r1vk54.js +4 -0
- package/dist/chunks/color-slider-sqqdyf6c.js +4 -0
- package/dist/chunks/combobox-72h32ejk.js +4 -0
- package/dist/chunks/components-r22xca09.js +4 -0
- package/dist/chunks/content-source-mmppmcyg.js +4 -0
- package/dist/chunks/convert-to-repeater-he70fc2b.js +4 -0
- package/dist/chunks/dialog-c4x05vyx.js +4 -0
- package/dist/chunks/editor-ccd9jwsa.js +4 -0
- package/dist/chunks/entry-commands-6qxz9e8p.js +4 -0
- package/dist/chunks/extension-sections-0egb88dm.js +4 -0
- package/dist/chunks/file-ops-qnab36ek.js +4 -0
- package/dist/chunks/files-rcn56qvm.js +4 -0
- package/dist/chunks/format-host-yxz0kjjs.js +4 -0
- package/dist/chunks/fs-events-d1qxq4z4.js +4 -0
- package/dist/chunks/grid-open-4z1g062t.js +4 -0
- package/dist/chunks/grid-view-qg1b5eqx.js +51 -0
- package/dist/chunks/icons-63bjtbs7.js +4 -0
- package/dist/chunks/iframe-entry-2zggzajv.js +5 -0
- package/dist/chunks/iframe-entry-76j8vwwx.js +5 -0
- package/dist/chunks/iframe-entry-99nr5zfb.js +5 -0
- package/dist/chunks/iframe-entry-pkgmcgp0.js +5 -0
- package/dist/chunks/iframe-host-ssv7kyj0.js +4 -0
- package/dist/chunks/{index-2veqmnhr.js → index-32eqzv1k.js} +3 -3
- package/dist/chunks/index-f0jn7nnp.js +4 -0
- package/dist/chunks/{javascript-8nbvs12s.js → javascript-pjp734q4.js} +3 -3
- package/dist/chunks/jsonMode-njkvsa02.js +13 -0
- package/dist/chunks/jx-validate-ttasrbh7.js +4 -0
- package/dist/chunks/layers-bgyr11tr.js +4 -0
- package/dist/chunks/layers-panel-7ez66zeq.js +4 -0
- package/dist/chunks/listbox-c421cf8c.js +4 -0
- package/dist/chunks/lit-html-v9gh687x.js +4 -0
- package/dist/chunks/media-library-sq468wts.js +4 -0
- package/dist/chunks/media-picker-shfe59pt.js +4 -0
- package/dist/chunks/menu-bdpzbfvs.js +4 -0
- package/dist/chunks/monaco-binding-vq1hgnn0.js +4 -0
- package/dist/chunks/monaco-buffer-3afgwvbp.js +4 -0
- package/dist/chunks/monaco-setup-xrd2cbkp.js +4 -0
- package/dist/chunks/notify-kzrjr3fv.js +4 -0
- package/dist/chunks/number-field-y62xq0ty.js +4 -0
- package/dist/chunks/parse-v77xtwv7.js +4 -0
- package/dist/chunks/platform-7v4rtd7m.js +4 -0
- package/dist/chunks/popover-b89sfej7.js +4 -0
- package/dist/chunks/publish-panel-2z9gw8ee.js +4 -0
- package/dist/chunks/publish-quick-qx2455cj.js +4 -0
- package/dist/chunks/publish-workspace-wrc1dgwx.js +4 -0
- package/dist/chunks/quick-search-n0t0eqxb.js +4 -0
- package/dist/chunks/references-9547rg5s.js +4 -0
- package/dist/chunks/right-panel-wsgnr9pn.js +4 -0
- package/dist/chunks/select-rzds841e.js +4 -0
- package/dist/chunks/source-control-kwktr9y6.js +4 -0
- package/dist/chunks/split-c9zfdgxf.js +4 -0
- package/dist/chunks/studio-03ct6yfv.js +9 -0
- package/dist/chunks/studio-07rcfje3.js +5 -0
- package/dist/chunks/studio-3e54qh39.js +7 -0
- package/dist/chunks/studio-3exxhz5g.js +5 -0
- package/dist/chunks/studio-3q40e3rj.js +5 -0
- package/dist/chunks/studio-3qeh9t0h.js +6 -0
- package/dist/chunks/studio-3qqjeep5.js +6 -0
- package/dist/chunks/studio-43sd2mam.js +4 -0
- package/dist/chunks/studio-4hp8pkyt.js +5 -0
- package/dist/chunks/studio-58xg6j2q.js +9 -0
- package/dist/chunks/studio-5g0rprdt.js +7 -0
- package/dist/chunks/studio-6m380wp7.js +5 -0
- package/dist/chunks/studio-80jyh1xh.js +4 -0
- package/dist/chunks/studio-83mk4bgg.js +9 -0
- package/dist/chunks/{studio-kggey1jt.js → studio-881z1xrx.js} +4 -4
- package/dist/chunks/studio-8m0y2qe7.js +5 -0
- package/dist/chunks/studio-8tr6cfrc.js +5 -0
- package/dist/chunks/studio-8vcvfs7r.js +6 -0
- package/dist/chunks/studio-9tmebf0s.js +5 -0
- package/dist/chunks/studio-a2bvaptz.js +5 -0
- package/dist/chunks/studio-b7y5mr30.js +5 -0
- package/dist/chunks/studio-bavb31r0.js +5 -0
- package/dist/chunks/studio-bbe4c90a.js +5 -0
- package/dist/chunks/studio-c05wdnt3.js +5 -0
- package/dist/chunks/studio-ccv2svc6.js +5 -0
- package/dist/chunks/studio-d5grtb9e.js +16 -0
- package/dist/chunks/studio-df0baea9.js +5 -0
- package/dist/chunks/studio-dgk4dqtx.js +7 -0
- package/dist/chunks/studio-e1g64q43.js +5 -0
- package/dist/chunks/studio-ed1hp6zf.js +6 -0
- package/dist/chunks/studio-ed3xx40h.js +7 -0
- package/dist/chunks/studio-f14e1zdj.js +5 -0
- package/dist/chunks/studio-fbhxxc5f.js +5 -0
- package/dist/chunks/studio-fyh0jc96.js +5 -0
- package/dist/chunks/studio-gcxk20n7.js +5 -0
- package/dist/chunks/studio-jaaz8ce9.js +5 -0
- package/dist/chunks/{studio-8grwxtqk.js → studio-jcnsdaep.js} +4 -4
- package/dist/chunks/studio-jsgf2q5k.js +7 -0
- package/dist/chunks/{studio-1q1sh2ax.js → studio-k3xxbagr.js} +3 -3
- package/dist/chunks/studio-k7evxqh4.js +5 -0
- package/dist/chunks/studio-kt3pjkwd.js +5 -0
- package/dist/chunks/studio-m8g16bgz.js +5 -0
- package/dist/chunks/studio-mn0476ag.js +5 -0
- package/dist/chunks/studio-mx1smyq0.js +5 -0
- package/dist/chunks/studio-n0c5h6mf.js +5 -0
- package/dist/chunks/{studio-rv11kfwa.js → studio-nh6d342n.js} +7 -7
- package/dist/chunks/studio-nqxqf8p2.js +4 -0
- package/dist/chunks/studio-p4nrkvqr.js +5 -0
- package/dist/chunks/{studio-h46vtzk8.js → studio-pbxa5fpc.js} +4 -4
- package/dist/chunks/studio-pgmvdv7z.js +7 -0
- package/dist/chunks/studio-ph84avkf.js +5 -0
- package/dist/chunks/{studio-wszjyh0j.js → studio-q0mvbaq6.js} +4 -4
- package/dist/chunks/studio-q0tccd43.js +5 -0
- package/dist/chunks/studio-q7rtx6zq.js +14 -0
- package/dist/chunks/{studio-pre0skq6.js → studio-qgh13jtz.js} +4 -4
- package/dist/chunks/studio-qmn1xc24.js +5 -0
- package/dist/chunks/studio-qwdqwkj0.js +5 -0
- package/dist/chunks/{studio-t6b6qe31.js → studio-r5qy30vx.js} +4 -4
- package/dist/chunks/studio-rj9eamf8.js +5 -0
- package/dist/chunks/studio-rptgsk96.js +5 -0
- package/dist/chunks/studio-rthyg42z.js +928 -0
- package/dist/chunks/studio-s19tp1xr.js +5 -0
- package/dist/chunks/studio-s32578pn.js +5 -0
- package/dist/chunks/studio-svb7yyve.js +5 -0
- package/dist/chunks/studio-syreb644.js +5 -0
- package/dist/chunks/studio-tf9jryb1.js +10 -0
- package/dist/chunks/studio-tfkznv39.js +5 -0
- package/dist/chunks/studio-tft6r105.js +5 -0
- package/dist/chunks/studio-txf2kysx.js +5 -0
- package/dist/chunks/studio-v8867ddv.js +12 -0
- package/dist/chunks/studio-vxq7fcvv.js +5 -0
- package/dist/chunks/studio-w4rz9hdk.js +5 -0
- package/dist/chunks/studio-wbcjbhy1.js +9 -0
- package/dist/chunks/studio-wc649wss.js +5 -0
- package/dist/chunks/studio-wys23mxz.js +5 -0
- package/dist/chunks/studio-x1x167jh.js +5 -0
- package/dist/chunks/studio-x9hsze61.js +5 -0
- package/dist/chunks/studio-y0n7yxea.js +9 -0
- package/dist/chunks/studio-y3ahhdpx.js +5 -0
- package/dist/chunks/studio-z97c48fk.js +5 -0
- package/dist/chunks/studio-zat62m0c.js +5 -0
- package/dist/chunks/studio-zcd2e7yz.js +5 -0
- package/dist/chunks/studio-zz9qe3rw.js +64 -0
- package/dist/chunks/swatch-group-ewh24n1f.js +4 -0
- package/dist/chunks/tabs-f5cw3tgp.js +4 -0
- package/dist/chunks/textfield-wewc8rq2.js +4 -0
- package/dist/chunks/toast-1gv0h53h.js +4 -0
- package/dist/chunks/toast-host-1yg5ar8d.js +4 -0
- package/dist/chunks/{toolbar-2nnzqhrj.js → toolbar-44cm5cta.js} +3 -3
- package/dist/chunks/tooltip-yypz28gq.js +4 -0
- package/dist/chunks/tree-9xa4hm7n.js +4 -0
- package/dist/chunks/tsMode-epyfz1hv.js +14 -0
- package/dist/chunks/workspace-dz7nxfhv.js +4 -0
- package/dist/chunks/workspace-home-xsd7hkjw.js +4 -0
- package/dist/chunks/ws-client-bv552sfx.js +4 -0
- package/dist/iframe-entry.js +20 -16
- package/dist/manifest.json +77 -63
- package/dist/studio.js +106 -107
- package/dist/workers/ts.worker.js +3 -3
- package/package.json +17 -16
- package/src/about/about-modal.ts +4 -3
- package/src/account/action-flow.ts +45 -38
- package/src/account-status.ts +7 -2
- package/src/browse/component-examples.ts +272 -0
- package/src/browse/library-commands.ts +64 -104
- package/src/browse/library-layouts.ts +270 -53
- package/src/browse/library-model.ts +194 -134
- package/src/browse/library-pane.ts +748 -440
- package/src/browse/library-preview.ts +161 -26
- package/src/browse/library-source.ts +308 -41
- package/src/browse/preview-root.ts +78 -0
- package/src/browse/preview-style.ts +155 -0
- package/src/canvas/asset-refs.ts +40 -10
- package/src/canvas/asset-resolve.ts +19 -23
- package/src/canvas/canvas-helpers.ts +7 -6
- package/src/canvas/canvas-live-render.ts +260 -77
- package/src/canvas/canvas-origin.ts +37 -12
- package/src/canvas/canvas-page-context.ts +112 -0
- package/src/canvas/canvas-patcher.ts +30 -30
- package/src/canvas/canvas-perf.ts +11 -5
- package/src/canvas/canvas-render.ts +175 -148
- package/src/canvas/canvas-surface.ts +5 -3
- package/src/canvas/canvas-utils.ts +147 -61
- package/src/canvas/dialog-path.ts +9 -4
- package/src/canvas/dialog-state.ts +1 -2
- package/src/canvas/diff-marks.ts +9 -16
- package/src/canvas/diff-toolbar.ts +8 -7
- package/src/canvas/edit-width-drag.ts +4 -1
- package/src/canvas/edit-width.ts +1 -3
- package/src/canvas/iframe-channel.ts +27 -13
- package/src/canvas/iframe-drop.ts +120 -12
- package/src/canvas/iframe-editable-root.ts +29 -16
- package/src/canvas/iframe-entry.ts +104 -75
- package/src/canvas/iframe-eval.ts +73 -49
- package/src/canvas/iframe-host.ts +269 -158
- package/src/canvas/iframe-inline-edit.ts +49 -30
- package/src/canvas/iframe-insert.ts +5 -4
- package/src/canvas/iframe-interaction.ts +30 -25
- package/src/canvas/iframe-keys.ts +11 -0
- package/src/canvas/iframe-overlay.ts +1 -1
- package/src/canvas/iframe-patch.ts +25 -21
- package/src/canvas/iframe-position.ts +12 -6
- package/src/canvas/iframe-protocol.ts +36 -21
- package/src/canvas/iframe-render.ts +84 -35
- package/src/canvas/iframe-slash.ts +24 -11
- package/src/canvas/iframe-subtree.ts +10 -3
- package/src/canvas/npm-modules.ts +22 -0
- package/src/canvas/path-mapping.ts +19 -12
- package/src/canvas/popover-path.ts +7 -3
- package/src/canvas/popover-state.ts +1 -2
- package/src/canvas/preview-navigate.ts +16 -0
- package/src/canvas/repeater-sources.ts +200 -0
- package/src/canvas/serialize-scope.ts +13 -5
- package/src/canvas/stage-scrollbar.ts +7 -2
- package/src/canvas/surface-registry.ts +27 -3
- package/src/collab/collab-commands.ts +7 -2
- package/src/collab/collab-session.ts +84 -45
- package/src/collab/collab-state.ts +4 -3
- package/src/collab/monaco-binding.ts +16 -13
- package/src/collab/monaco-cursors.ts +5 -2
- package/src/commands/app-commands.ts +16 -6
- package/src/commands/budget.ts +13 -11
- package/src/commands/command-args.ts +103 -71
- package/src/commands/context.ts +55 -28
- package/src/commands/defaults.ts +69 -45
- package/src/commands/keymap.ts +56 -43
- package/src/commands/levels.ts +14 -8
- package/src/commands/live-context.ts +9 -7
- package/src/commands/reference.ts +2 -1
- package/src/commands/registry.ts +22 -11
- package/src/commands/run-reported.ts +15 -10
- package/src/component-props.ts +46 -30
- package/src/content/collection-match.ts +11 -9
- package/src/content/collection-pages.ts +412 -0
- package/src/content/content-collections.ts +270 -0
- package/src/content/draft-state.ts +4 -3
- package/src/content/entry-commands.ts +54 -62
- package/src/content/entry-editor.ts +137 -32
- package/src/content/entry-fields.ts +25 -8
- package/src/content/entry-inspector.ts +225 -0
- package/src/content/entry-model.ts +38 -15
- package/src/content/entry-open.ts +80 -0
- package/src/content/entry-summaries.ts +440 -0
- package/src/content/file-record-ids.ts +80 -0
- package/src/content/file-records.ts +125 -0
- package/src/content/page-summaries.ts +129 -0
- package/src/content/record-entry.ts +201 -0
- package/src/content/writing-banner.ts +177 -0
- package/src/create/add-new-commands.ts +185 -0
- package/src/create/add-new-flow.ts +1116 -0
- package/src/create/add-new.ts +1014 -0
- package/src/create/element-name.ts +121 -0
- package/src/editor/canvas-context-menu.ts +1 -2
- package/src/editor/canvas-slash-bridge.ts +3 -6
- package/src/editor/content-slice.ts +16 -14
- package/src/editor/context-menu.ts +35 -22
- package/src/editor/convert-targets.ts +30 -35
- package/src/editor/convert-to-component.ts +78 -48
- package/src/editor/convert-to-repeater.ts +34 -22
- package/src/editor/editable-tags.ts +17 -2
- package/src/editor/file-drop-action.ts +29 -22
- package/src/editor/inline-edit-apply.ts +79 -17
- package/src/editor/inline-edit.ts +76 -50
- package/src/editor/inline-format.ts +59 -56
- package/src/editor/inline-link.ts +40 -15
- package/src/editor/insert-component.ts +91 -0
- package/src/editor/insert-zone-action.ts +14 -5
- package/src/editor/merge-tags.ts +58 -19
- package/src/editor/repeater-scope.ts +39 -28
- package/src/editor/shortcuts.ts +76 -42
- package/src/editor/slash-menu.ts +52 -14
- package/src/files/asset-versions.ts +4 -4
- package/src/files/components.ts +89 -20
- package/src/files/elements.ts +5 -6
- package/src/files/file-ops.ts +92 -41
- package/src/files/files.ts +248 -239
- package/src/files/fs-events.ts +18 -7
- package/src/files/media-meta.ts +97 -2
- package/src/files/media-paths.ts +3 -0
- package/src/files/media-types.ts +55 -0
- package/src/files/media-upload.ts +209 -52
- package/src/files/new-file-name.ts +156 -0
- package/src/files/serialize-document.ts +15 -5
- package/src/format/constraints.ts +1 -1
- package/src/format/convert-file.ts +27 -13
- package/src/format/format-choices.ts +2 -1
- package/src/format/format-host.ts +91 -50
- package/src/github/github-auth-status.ts +27 -3
- package/src/github/github-auth.ts +21 -11
- package/src/github/github-publish.ts +28 -23
- package/src/grid/cell-editors.ts +46 -31
- package/src/grid/cell-popovers.ts +5 -3
- package/src/grid/edit-buffer.ts +10 -9
- package/src/grid/grid-controller.ts +25 -23
- package/src/grid/grid-layout.ts +21 -5
- package/src/grid/grid-open.ts +3 -33
- package/src/grid/grid-panel.ts +65 -6
- package/src/grid/grid-reveal.ts +34 -0
- package/src/grid/grid-source.ts +9 -31
- package/src/grid/grid-view.ts +45 -23
- package/src/grid/redirects-grid.ts +14 -5
- package/src/grid/redirects.ts +16 -14
- package/src/grid/schema-columns.ts +25 -19
- package/src/grid/sources/connector-source.ts +47 -20
- package/src/grid/sources/content-source.ts +100 -31
- package/src/grid/sources/csv-file-source.ts +2 -2
- package/src/grid/tabulator-tables.d.ts +61 -34
- package/src/hosting/document.ts +2 -2
- package/src/hosting/stage.ts +7 -7
- package/src/i18n/i18n-commands.ts +3 -3
- package/src/media/media-commands.ts +181 -0
- package/src/media/media-library-model.ts +232 -0
- package/src/media/media-library.ts +1283 -0
- package/src/media/media-pane.ts +51 -20
- package/src/new-project/add-repo-modal.ts +20 -19
- package/src/new-project/import-tab.ts +10 -14
- package/src/new-project/location-fields.ts +2 -1
- package/src/new-project/new-project-modal.ts +12 -9
- package/src/packages/jxsuite-update.ts +4 -3
- package/src/packages/pull-package-sync.ts +26 -25
- package/src/page-params.ts +97 -68
- package/src/panels/activity-panel.ts +38 -14
- package/src/panels/ai-chat/attached-context.ts +13 -7
- package/src/panels/ai-chat/chat-markdown.ts +8 -8
- package/src/panels/ai-chat/chat-view.ts +80 -73
- package/src/panels/ai-chat/composer.ts +30 -33
- package/src/panels/ai-chat/sessions-view.ts +1 -2
- package/src/panels/ai-panel.ts +23 -20
- package/src/panels/block-action-bar.ts +57 -46
- package/src/panels/bottom-dock.ts +5 -3
- package/src/panels/canvas-dnd-bridge.ts +36 -26
- package/src/panels/chat-panel.ts +6 -6
- package/src/panels/collections-panel.ts +306 -0
- package/src/panels/component-preview.ts +35 -13
- package/src/panels/data-explorer.ts +63 -26
- package/src/panels/data-grid.ts +18 -11
- package/src/panels/dnd.ts +115 -138
- package/src/panels/editors.ts +52 -21
- package/src/panels/elements-panel.ts +19 -5
- package/src/panels/empty-state.ts +2 -2
- package/src/panels/events-panel.ts +84 -69
- package/src/panels/formula-workspace.ts +78 -54
- package/src/panels/frontmatter-fields.ts +33 -28
- package/src/panels/git-diff-open.ts +10 -6
- package/src/panels/head-panel.ts +488 -202
- package/src/panels/i18n-panel.ts +20 -12
- package/src/panels/imports-panel.ts +25 -47
- package/src/panels/jump-bar.ts +75 -31
- package/src/panels/layers-panel.ts +130 -101
- package/src/panels/left-panel.ts +25 -11
- package/src/panels/navigator-panels.ts +23 -11
- package/src/panels/pane-context.ts +140 -49
- package/src/panels/pane-grid.ts +55 -26
- package/src/panels/panel-registry.ts +36 -46
- package/src/panels/properties-panel.ts +182 -124
- package/src/panels/quick-search.ts +53 -31
- package/src/panels/right-panel.ts +201 -45
- package/src/panels/seo-modal.ts +54 -125
- package/src/panels/settings-menu.ts +63 -61
- package/src/panels/settings-pane.ts +268 -162
- package/src/panels/signals-panel.ts +156 -135
- package/src/panels/site-model.ts +367 -0
- package/src/panels/site-panel.ts +638 -0
- package/src/panels/statement-editor.ts +230 -140
- package/src/panels/style-panel.ts +253 -206
- package/src/panels/style-utils.ts +114 -51
- package/src/panels/stylebook-doc.ts +195 -60
- package/src/panels/stylebook-layers-panel.ts +48 -89
- package/src/panels/stylebook-panel.ts +60 -27
- package/src/panels/styles-panel.ts +327 -0
- package/src/panels/tab-drop.ts +27 -11
- package/src/panels/tab-strip.ts +143 -49
- package/src/platform-errors.ts +57 -43
- package/src/platform.ts +59 -31
- package/src/platforms/cloud.ts +373 -176
- package/src/platforms/default-platform.ts +14 -8
- package/src/platforms/devserver.ts +180 -142
- package/src/platforms/read-batcher.ts +16 -8
- package/src/project-list.ts +2 -1
- package/src/publish/deploy-checklist.ts +20 -9
- package/src/publish/pages-service.ts +66 -27
- package/src/publish/publish-changes.ts +491 -0
- package/src/publish/publish-commands.ts +88 -22
- package/src/publish/publish-ids.ts +49 -0
- package/src/publish/publish-panel.ts +10 -6
- package/src/publish/publish-quick.ts +148 -0
- package/src/publish/publish-workspace.ts +926 -0
- package/src/publish/source-control.ts +907 -0
- package/src/recent-projects.ts +15 -8
- package/src/resize-edges.ts +26 -36
- package/src/services/a11y-report.ts +26 -19
- package/src/services/agent-seed.ts +23 -11
- package/src/services/ai-ask.ts +9 -12
- package/src/services/ai-command-tools.ts +68 -62
- package/src/services/ai-import-tools.ts +80 -67
- package/src/services/ai-models.ts +17 -13
- package/src/services/ai-project-tools.ts +68 -32
- package/src/services/ai-session-store.ts +19 -10
- package/src/services/ai-system-prompt.ts +46 -20
- package/src/services/ai-tools.ts +71 -27
- package/src/services/ai-write-report.ts +20 -12
- package/src/services/ai-writes.ts +4 -4
- package/src/services/automation.ts +74 -51
- package/src/services/cem-export.ts +149 -58
- package/src/services/cf-settings.ts +4 -4
- package/src/services/clock.ts +6 -1
- package/src/services/code-services.ts +37 -31
- package/src/services/connection.ts +2 -2
- package/src/services/context-manager.ts +14 -10
- package/src/services/context-resolver.ts +20 -8
- package/src/services/data-service.ts +19 -15
- package/src/services/directory-picker.ts +20 -14
- package/src/services/document-assistant.ts +39 -19
- package/src/services/gated-registry.ts +10 -6
- package/src/services/harness/chat-reducer.ts +23 -1
- package/src/services/import-client.ts +91 -38
- package/src/services/import-seed.ts +8 -2
- package/src/services/jx-validate.ts +28 -31
- package/src/services/live-preview.ts +0 -0
- package/src/services/live-surfaces.ts +6 -3
- package/src/services/model-uri.ts +10 -2
- package/src/services/module-preloads.ts +12 -8
- package/src/services/monaco-buffer.ts +43 -24
- package/src/services/monaco-lazy.ts +7 -8
- package/src/services/monaco-setup.ts +23 -16
- package/src/services/notify.ts +44 -17
- package/src/services/popover-report.ts +25 -10
- package/src/services/preview-eval.ts +20 -8
- package/src/services/profile.ts +13 -6
- package/src/services/project-path.ts +13 -10
- package/src/services/references.ts +0 -0
- package/src/services/render-critic.ts +29 -9
- package/src/services/settings/definitions.ts +25 -14
- package/src/services/settings/kernel.ts +13 -4
- package/src/services/settings/write-queue.ts +9 -9
- package/src/services/token-lint.ts +12 -10
- package/src/services/tool-executor.ts +17 -5
- package/src/services/tool-outcomes.ts +44 -24
- package/src/services/trusted-types.ts +24 -7
- package/src/settings/contexts-section.ts +11 -8
- package/src/settings/contributed-section.ts +128 -70
- package/src/settings/css-vars-editor.ts +119 -32
- package/src/settings/defs-editor.ts +38 -35
- package/src/settings/developer-panels.ts +43 -0
- package/src/settings/extension-rows.ts +16 -8
- package/src/settings/extension-sections.ts +42 -14
- package/src/settings/extensions-section.ts +4 -1
- package/src/settings/general-settings.ts +101 -28
- package/src/settings/locales-section.ts +20 -12
- package/src/settings/preferences-dialog.ts +17 -7
- package/src/settings/preferences-keymap.ts +7 -5
- package/src/settings/preferences-sections.ts +11 -5
- package/src/settings/project-sections.ts +28 -11
- package/src/settings/schema-field-ui.ts +12 -1
- package/src/settings/section-registry.ts +116 -11
- package/src/settings/settings-dialog.ts +192 -0
- package/src/settings/settings-document.ts +186 -166
- package/src/shell/tree.ts +6 -5
- package/src/shell.ts +536 -477
- package/src/site-context.ts +101 -32
- package/src/state.ts +68 -57
- package/src/store.ts +54 -34
- package/src/studio.ts +219 -116
- package/src/style/live-preview.ts +1 -1
- package/src/style/project-styles.ts +40 -7
- package/src/style/stylebook-specimens.ts +89 -0
- package/src/style/stylebook-target.ts +26 -0
- package/src/style/tag-inheritance.ts +105 -0
- package/src/style/token-ref.ts +5 -4
- package/src/style/variables-focus.ts +61 -0
- package/src/style/variables-view.ts +235 -0
- package/src/surfaces/about.ts +18 -19
- package/src/surfaces/add-new.json +1482 -0
- package/src/surfaces/add-new.ts +325 -0
- package/src/surfaces/add-repo.ts +17 -19
- package/src/surfaces/ai-chat.ts +33 -38
- package/src/surfaces/ai-credentials-form.ts +6 -16
- package/src/surfaces/ai-managed-connect.ts +3 -4
- package/src/surfaces/ai-model-picker.ts +3 -5
- package/src/surfaces/block-action-bar.ts +22 -11
- package/src/surfaces/boot-failure.json +4 -3
- package/src/surfaces/boot-failure.ts +4 -5
- package/src/surfaces/bottom-dock.json +1 -1
- package/src/surfaces/bottom-dock.ts +9 -18
- package/src/surfaces/canvas-stage.json +30 -19
- package/src/surfaces/canvas-stage.ts +17 -16
- package/src/surfaces/cf-account-picker.ts +17 -18
- package/src/surfaces/collections-panel.json +615 -0
- package/src/surfaces/collections-panel.ts +168 -0
- package/src/surfaces/commandbar.json +241 -96
- package/src/surfaces/commandbar.ts +145 -105
- package/src/surfaces/convert-repeater.ts +17 -19
- package/src/surfaces/data-actions.ts +9 -7
- package/src/surfaces/dialog.ts +26 -28
- package/src/surfaces/diff-toolbar.ts +9 -7
- package/src/surfaces/empty-state.json +1 -1
- package/src/surfaces/empty-state.ts +7 -10
- package/src/surfaces/entry-editor.json +136 -0
- package/src/surfaces/entry-editor.ts +35 -11
- package/src/surfaces/entry-inspector.json +371 -0
- package/src/surfaces/entry-inspector.ts +143 -0
- package/src/surfaces/expression-editor.ts +11 -25
- package/src/surfaces/files-panel.ts +27 -14
- package/src/surfaces/formula-palette.ts +4 -5
- package/src/surfaces/github-auth.ts +16 -20
- package/src/surfaces/github-publish.ts +17 -22
- package/src/surfaces/grid-cell.ts +30 -31
- package/src/surfaces/grid-open.ts +10 -14
- package/src/surfaces/grid-panel.ts +13 -9
- package/src/surfaces/grid-replace.ts +13 -13
- package/src/surfaces/grid-views.ts +15 -18
- package/src/surfaces/inspector-dock.json +162 -14
- package/src/surfaces/inspector-dock.ts +59 -31
- package/src/surfaces/jump-bar.ts +5 -6
- package/src/surfaces/jxsuite-update.ts +16 -22
- package/src/surfaces/library-pane.json +670 -437
- package/src/surfaces/library-pane.ts +111 -77
- package/src/surfaces/logic-panel.ts +17 -30
- package/src/surfaces/logic-workspace.ts +13 -15
- package/src/surfaces/media-browser.json +62 -6
- package/src/surfaces/media-browser.ts +26 -11
- package/src/surfaces/media-field.json +1 -1
- package/src/surfaces/media-field.ts +4 -5
- package/src/surfaces/media-library.json +1586 -0
- package/src/surfaces/media-library.ts +282 -0
- package/src/surfaces/media-pane.ts +8 -7
- package/src/surfaces/media-pick-dialog.json +71 -0
- package/src/surfaces/media-pick-dialog.ts +132 -0
- package/src/surfaces/menu.ts +47 -23
- package/src/surfaces/navigator-dock.ts +11 -12
- package/src/surfaces/new-project.ts +27 -26
- package/src/surfaces/pane-context.json +144 -77
- package/src/surfaces/pane-context.ts +44 -25
- package/src/surfaces/pane-grid.ts +15 -10
- package/src/surfaces/panel-activity.ts +5 -6
- package/src/surfaces/panel-data.ts +3 -4
- package/src/surfaces/panel-deploy-checklist.json +12 -6
- package/src/surfaces/panel-deploy-checklist.ts +8 -7
- package/src/surfaces/panel-elements.ts +5 -7
- package/src/surfaces/panel-i18n.ts +5 -7
- package/src/surfaces/panel-imports.ts +6 -13
- package/src/surfaces/panel-outline.ts +25 -19
- package/src/surfaces/panel-page.json +72 -2
- package/src/surfaces/panel-page.ts +49 -25
- package/src/surfaces/panel-problems.ts +5 -7
- package/src/surfaces/panel-signals.json +1 -1
- package/src/surfaces/panel-signals.ts +25 -39
- package/src/surfaces/panel-stylebook-layers.json +71 -204
- package/src/surfaces/panel-stylebook-layers.ts +5 -29
- package/src/surfaces/preferences.json +120 -48
- package/src/surfaces/preferences.ts +29 -11
- package/src/surfaces/progress-modal.ts +15 -9
- package/src/surfaces/properties-panel.json +1 -1
- package/src/surfaces/properties-panel.ts +20 -42
- package/src/surfaces/publish-quick.json +428 -0
- package/src/surfaces/publish-quick.ts +165 -0
- package/src/surfaces/publish-workspace.json +2892 -0
- package/src/surfaces/publish-workspace.ts +391 -0
- package/src/surfaces/publish.ts +18 -18
- package/src/surfaces/push-plan.ts +7 -8
- package/src/surfaces/rail.json +1 -159
- package/src/surfaces/rail.ts +22 -79
- package/src/surfaces/reference-field.ts +11 -15
- package/src/surfaces/schema-builder.ts +16 -22
- package/src/surfaces/schema-form.json +10 -2
- package/src/surfaces/schema-form.ts +17 -25
- package/src/surfaces/secret-field.ts +9 -6
- package/src/surfaces/seo.json +1 -1
- package/src/surfaces/seo.ts +21 -15
- package/src/surfaces/settings-contexts.ts +9 -7
- package/src/surfaces/settings-contributed.json +5 -5
- package/src/surfaces/settings-contributed.ts +32 -12
- package/src/surfaces/settings-css-vars.json +44 -36
- package/src/surfaces/settings-css-vars.ts +82 -16
- package/src/surfaces/settings-defs.json +2 -2
- package/src/surfaces/settings-defs.ts +17 -21
- package/src/surfaces/settings-deploy.json +2 -15
- package/src/surfaces/settings-deploy.ts +9 -16
- package/src/surfaces/settings-dialog.json +51 -0
- package/src/surfaces/settings-dialog.ts +169 -0
- package/src/surfaces/settings-extensions.ts +5 -6
- package/src/surfaces/settings-head.ts +33 -39
- package/src/surfaces/settings-locales.ts +8 -20
- package/src/surfaces/settings-overview.json +3 -3
- package/src/surfaces/settings-overview.ts +14 -8
- package/src/surfaces/settings-packages.ts +8 -7
- package/src/surfaces/settings-pane.json +269 -46
- package/src/surfaces/settings-pane.ts +88 -36
- package/src/surfaces/settings-rawjson.ts +5 -6
- package/src/surfaces/shell.json +2 -1
- package/src/surfaces/shell.ts +1 -2
- package/src/surfaces/site-panel.json +1029 -0
- package/src/surfaces/site-panel.ts +233 -0
- package/src/surfaces/slash-menu.json +63 -21
- package/src/surfaces/slash-menu.ts +42 -9
- package/src/surfaces/statements.ts +13 -18
- package/src/surfaces/statusbar.ts +56 -29
- package/src/surfaces/style-panel.ts +18 -31
- package/src/surfaces/stylebook-chrome.ts +3 -5
- package/src/surfaces/styles-panel.json +735 -0
- package/src/surfaces/styles-panel.ts +195 -0
- package/src/surfaces/styles-variables.json +149 -0
- package/src/surfaces/styles-variables.ts +145 -0
- package/src/surfaces/tab-strip.json +4 -4
- package/src/surfaces/tab-strip.ts +14 -13
- package/src/surfaces/target-line.ts +6 -7
- package/src/surfaces/welcome.ts +6 -8
- package/src/surfaces/writing-banner.json +94 -0
- package/src/surfaces/writing-banner.ts +80 -0
- package/src/tabs/bare-repeaters.ts +101 -0
- package/src/tabs/patch-ops.ts +4 -3
- package/src/tabs/project-config.ts +32 -21
- package/src/tabs/selection.ts +36 -8
- package/src/tabs/tab.ts +99 -48
- package/src/tabs/transact.ts +98 -53
- package/src/types.ts +53 -43
- package/src/ui/ai-credentials-form.ts +10 -13
- package/src/ui/ai-model-picker.ts +3 -3
- package/src/ui/cf-account-picker.ts +7 -9
- package/src/ui/color-selector.ts +9 -5
- package/src/ui/dynamic-slot.ts +7 -8
- package/src/ui/expression-editor.ts +112 -105
- package/src/ui/form-controls.ts +104 -56
- package/src/ui/formula-catalog.ts +239 -230
- package/src/ui/formula-chips.ts +33 -18
- package/src/ui/layers.ts +57 -31
- package/src/ui/media-picker.ts +300 -47
- package/src/ui/popover-surface.ts +20 -12
- package/src/ui/progress-modal.ts +13 -8
- package/src/ui/regions.ts +14 -12
- package/src/ui/schema-form.ts +372 -97
- package/src/ui/surface.ts +71 -8
- package/src/ui/timing.ts +9 -0
- package/src/ui/value-source.ts +44 -31
- package/src/ui/virtual-window.ts +29 -3
- package/src/utils/base64.ts +6 -4
- package/src/utils/edit-display.ts +366 -111
- package/src/utils/element-selectors.ts +3 -2
- package/src/utils/google-fonts.ts +15 -14
- package/src/utils/inherited-style.ts +18 -20
- package/src/utils/link-target.ts +1 -1
- package/src/utils/local-day.ts +18 -0
- package/src/utils/preview-format.ts +25 -3
- package/src/utils/strip-events.ts +49 -22
- package/src/utils/studio-utils.ts +29 -14
- package/src/view.ts +2 -3
- package/src/workspace/pane-derive.ts +14 -16
- package/src/workspace/session.ts +81 -50
- package/src/workspace/tab-workspace.ts +137 -0
- package/src/workspace/workspace-back.ts +189 -0
- package/src/workspace/workspace-home.ts +133 -0
- package/src/workspace/workspace-ids.ts +129 -0
- package/src/workspace/workspace-switch.ts +372 -0
- package/src/workspace/workspace.ts +165 -47
- package/styles/shell-frame.css +30 -7
- package/styles/shell-frame.json +15 -3
- package/dist/chunks/2020-va2wwra4.js +0 -4
- package/dist/chunks/adapter-f93pafd7.js +0 -4
- package/dist/chunks/cf-account-picker-af1h381v.js +0 -4
- package/dist/chunks/cf-settings-125tdm0w.js +0 -4
- package/dist/chunks/color-area-jqhna8zy.js +0 -4
- package/dist/chunks/color-field-embq5ctg.js +0 -4
- package/dist/chunks/color-fpezvnkt.js +0 -4
- package/dist/chunks/color-slider-1qmw7wqy.js +0 -4
- package/dist/chunks/combobox-773hdzyj.js +0 -4
- package/dist/chunks/components-ax2f1fnn.js +0 -4
- package/dist/chunks/content-source-108aqtk1.js +0 -4
- package/dist/chunks/convert-to-repeater-ry5rmppr.js +0 -4
- package/dist/chunks/dialog-mtm9fq5t.js +0 -4
- package/dist/chunks/editor-pfgdmkb0.js +0 -4
- package/dist/chunks/entry-commands-t0k1q0kx.js +0 -4
- package/dist/chunks/extension-sections-6mwh2hf8.js +0 -4
- package/dist/chunks/file-ops-meej5mqf.js +0 -4
- package/dist/chunks/files-44vp8a2s.js +0 -4
- package/dist/chunks/format-host-7q1petb9.js +0 -4
- package/dist/chunks/fs-events-h2mwnxaz.js +0 -4
- package/dist/chunks/git-panel-zngbymvd.js +0 -4
- package/dist/chunks/grid-view-sx9vynsp.js +0 -51
- package/dist/chunks/icons-p44xhjf0.js +0 -4
- package/dist/chunks/iframe-entry-f7mqjwpm.js +0 -5
- package/dist/chunks/iframe-entry-haw7jkvz.js +0 -5
- package/dist/chunks/iframe-entry-z6qrytv3.js +0 -5
- package/dist/chunks/iframe-host-qk3ycq87.js +0 -4
- package/dist/chunks/index-wkyfjeqz.js +0 -4
- package/dist/chunks/jsonMode-s8kt9dsj.js +0 -13
- package/dist/chunks/jx-validate-psgd7vsx.js +0 -4
- package/dist/chunks/layers-panel-1kq2jyfk.js +0 -4
- package/dist/chunks/layers-xd92fg8d.js +0 -4
- package/dist/chunks/listbox-s8fkmnq8.js +0 -4
- package/dist/chunks/lit-html-ac4cwwr4.js +0 -4
- package/dist/chunks/media-picker-0svzkdyb.js +0 -4
- package/dist/chunks/menu-37d07z9m.js +0 -4
- package/dist/chunks/menu-5c55ea3d.js +0 -4
- package/dist/chunks/monaco-binding-z6r70pdt.js +0 -4
- package/dist/chunks/monaco-buffer-fz6gq5y7.js +0 -4
- package/dist/chunks/monaco-setup-q4axkgj7.js +0 -4
- package/dist/chunks/notify-0xgtn8q1.js +0 -4
- package/dist/chunks/number-field-gw7sq8rn.js +0 -4
- package/dist/chunks/parse-897fvqah.js +0 -4
- package/dist/chunks/platform-v1qctbe6.js +0 -4
- package/dist/chunks/popover-8htra4er.js +0 -4
- package/dist/chunks/publish-panel-ym1fmgq5.js +0 -4
- package/dist/chunks/quick-search-a54e6t5n.js +0 -4
- package/dist/chunks/references-gmqp82fs.js +0 -4
- package/dist/chunks/right-panel-v7t9awbk.js +0 -4
- package/dist/chunks/section-registry-vhyf3zsr.js +0 -4
- package/dist/chunks/select-n3v7gwas.js +0 -4
- package/dist/chunks/split-pff8f3ze.js +0 -4
- package/dist/chunks/studio-0bhx5hz6.js +0 -5
- package/dist/chunks/studio-0k1ddnyy.js +0 -6
- package/dist/chunks/studio-1b04pd0j.js +0 -64
- package/dist/chunks/studio-4dwbj6gb.js +0 -5
- package/dist/chunks/studio-4tanh828.js +0 -5
- package/dist/chunks/studio-55h4mstj.js +0 -4
- package/dist/chunks/studio-5tnvjkz4.js +0 -5
- package/dist/chunks/studio-60dqgb0c.js +0 -5
- package/dist/chunks/studio-61dp09qg.js +0 -9
- package/dist/chunks/studio-63epcrj2.js +0 -5
- package/dist/chunks/studio-74k29dy9.js +0 -5
- package/dist/chunks/studio-7vg6jcd3.js +0 -5
- package/dist/chunks/studio-7zx31knw.js +0 -9
- package/dist/chunks/studio-8bxk97km.js +0 -5
- package/dist/chunks/studio-933e30n4.js +0 -5
- package/dist/chunks/studio-98wnwhbg.js +0 -5
- package/dist/chunks/studio-9mccjwjh.js +0 -14
- package/dist/chunks/studio-a2ke1e4t.js +0 -5
- package/dist/chunks/studio-e3a2a6v3.js +0 -4
- package/dist/chunks/studio-e81q1vb9.js +0 -5
- package/dist/chunks/studio-epgrmqqm.js +0 -5
- package/dist/chunks/studio-ery42sqr.js +0 -4
- package/dist/chunks/studio-g1shz58g.js +0 -5
- package/dist/chunks/studio-gf0fz03c.js +0 -5
- package/dist/chunks/studio-gjtpe62q.js +0 -6
- package/dist/chunks/studio-gkskhg7m.js +0 -5
- package/dist/chunks/studio-gx4dnjzd.js +0 -5
- package/dist/chunks/studio-j03zga3y.js +0 -9
- package/dist/chunks/studio-jhpxeckz.js +0 -5
- package/dist/chunks/studio-k01r7ykp.js +0 -5
- package/dist/chunks/studio-kk7h30ne.js +0 -7
- package/dist/chunks/studio-kt1zqney.js +0 -5
- package/dist/chunks/studio-m3cwhvye.js +0 -5
- package/dist/chunks/studio-mcayt6hz.js +0 -5
- package/dist/chunks/studio-myjcghv3.js +0 -5
- package/dist/chunks/studio-n8bxwc3y.js +0 -4
- package/dist/chunks/studio-ngm8gvpb.js +0 -5
- package/dist/chunks/studio-nj5a01jy.js +0 -928
- package/dist/chunks/studio-pcgz8heb.js +0 -5
- package/dist/chunks/studio-qcsq0t15.js +0 -5
- package/dist/chunks/studio-qkstvve9.js +0 -5
- package/dist/chunks/studio-qv1pwd3c.js +0 -5
- package/dist/chunks/studio-rc6dvxjb.js +0 -7
- package/dist/chunks/studio-s8dmmz66.js +0 -5
- package/dist/chunks/studio-sp5xzbj4.js +0 -6
- package/dist/chunks/studio-szsjbj0g.js +0 -5
- package/dist/chunks/studio-t1xzawhr.js +0 -16
- package/dist/chunks/studio-tdcprbqb.js +0 -5
- package/dist/chunks/studio-vrmcjf9g.js +0 -7
- package/dist/chunks/studio-vyc0b4he.js +0 -10
- package/dist/chunks/studio-w0cgf6jg.js +0 -5
- package/dist/chunks/studio-w3hskzqk.js +0 -5
- package/dist/chunks/studio-xgrgcdyh.js +0 -9
- package/dist/chunks/studio-xz2yxfcb.js +0 -5
- package/dist/chunks/studio-y6n42tgs.js +0 -5
- package/dist/chunks/studio-yb560vxr.js +0 -5
- package/dist/chunks/studio-yn9f8vtx.js +0 -5
- package/dist/chunks/studio-yw05w8f0.js +0 -7
- package/dist/chunks/studio-z16sgavc.js +0 -5
- package/dist/chunks/studio-zey7zsdw.js +0 -12
- package/dist/chunks/studio-zyqn40w4.js +0 -5
- package/dist/chunks/swatch-group-8qh9a3bm.js +0 -4
- package/dist/chunks/tabs-jwthg40w.js +0 -4
- package/dist/chunks/textfield-spy3hc77.js +0 -4
- package/dist/chunks/toast-4d35zd64.js +0 -4
- package/dist/chunks/toast-host-8sjmfed3.js +0 -4
- package/dist/chunks/tooltip-fd6g9xy3.js +0 -4
- package/dist/chunks/tree-h19v1jfz.js +0 -4
- package/dist/chunks/tsMode-2frah6h1.js +0 -14
- package/dist/chunks/workspace-zt81g1ms.js +0 -4
- package/dist/chunks/ws-client-n2bh4hkf.js +0 -4
- package/src/panels/frontmatter-panel.ts +0 -701
- package/src/panels/git-panel.ts +0 -1120
- package/src/surfaces/doc-header.json +0 -776
- package/src/surfaces/doc-header.ts +0 -231
- package/src/surfaces/git-panel.json +0 -1880
- package/src/surfaces/git-panel.ts +0 -272
package/src/panels/i18n-panel.ts
CHANGED
|
@@ -34,8 +34,8 @@
|
|
|
34
34
|
* does, because the document is appended into the `.panel-content` lit renders `nothing` into).
|
|
35
35
|
*
|
|
36
36
|
* **Off the rail.** `railDeclarations()` does not apply `when`, so a rail button here would spend
|
|
37
|
-
* the last `rail/project` slot in every monolingual project
|
|
38
|
-
*
|
|
37
|
+
* the last `rail/project` slot in every monolingual project. `i18n.showParity` is how this panel is
|
|
38
|
+
* reached.
|
|
39
39
|
*
|
|
40
40
|
* @docs studio/interface/languages
|
|
41
41
|
*/
|
|
@@ -63,6 +63,7 @@ import type {
|
|
|
63
63
|
I18nSurfaceHandle,
|
|
64
64
|
I18nValues,
|
|
65
65
|
} from "../surfaces/panel-i18n";
|
|
66
|
+
import type { CommandArgValues } from "../commands/command-args";
|
|
66
67
|
import type { LibraryFile, ScanFailure } from "../browse/library-model";
|
|
67
68
|
import type { NavigatorPanelContext, PanelBody } from "./panel-registry";
|
|
68
69
|
import type { ResolvedI18n } from "@jxsuite/schema/locale";
|
|
@@ -189,7 +190,7 @@ async function takeScan(root: string, rerender: () => void): Promise<void> {
|
|
|
189
190
|
*/
|
|
190
191
|
async function readDeclaredKeys(files: readonly LibraryFile[]): Promise<Map<string, string>> {
|
|
191
192
|
const platform = getPlatform();
|
|
192
|
-
const pages = files.filter((file) => file.
|
|
193
|
+
const pages = files.filter((file) => !file.media && file.path.startsWith("pages/"));
|
|
193
194
|
/* Issued together, not one after another. Each read is a round trip on a remote backend, and a
|
|
194
195
|
sequential loop paid one per page; issued in one tick, the cloud adapter coalesces them into a
|
|
195
196
|
single batch request (specs/desktop.md §10.1). `Promise.all` keeps the input order, so the map
|
|
@@ -235,8 +236,8 @@ function timeOf(modified: string | undefined): number | null {
|
|
|
235
236
|
* it is the source the other columns are measured against, and hiding it would leave the grid with
|
|
236
237
|
* a column of `missing` cells whose sources are on disk.
|
|
237
238
|
*
|
|
238
|
-
* Assets are skipped.
|
|
239
|
-
*
|
|
239
|
+
* Assets are skipped. The scan already marks what is media by its extension, so an image beside a
|
|
240
|
+
* page is not a row here for the same reason it is not a page anywhere else.
|
|
240
241
|
*/
|
|
241
242
|
export function parityRows(
|
|
242
243
|
files: readonly LibraryFile[],
|
|
@@ -254,7 +255,7 @@ export function parityRows(
|
|
|
254
255
|
/* Every key the paths alone produce, so a declared one can be matched against a real file rather
|
|
255
256
|
than against a spelling. */
|
|
256
257
|
const derivedKeys = new Set(
|
|
257
|
-
files.
|
|
258
|
+
files.flatMap((f) => (f.media ? [] : [translationKeyOfPath(f.path, i18n)])),
|
|
258
259
|
);
|
|
259
260
|
const keyOf = (file: LibraryFile): string => {
|
|
260
261
|
const own = declared.get(file.path);
|
|
@@ -277,7 +278,7 @@ export function parityRows(
|
|
|
277
278
|
return `pages/${own}${ext}`;
|
|
278
279
|
};
|
|
279
280
|
for (const file of files) {
|
|
280
|
-
if (file.
|
|
281
|
+
if (file.media) {
|
|
281
282
|
continue;
|
|
282
283
|
}
|
|
283
284
|
const key = keyOf(file);
|
|
@@ -401,7 +402,7 @@ function cellTitle(cell: ParityCell, locale: string, refusal: string | undefined
|
|
|
401
402
|
* report is what makes the next such drift a sentence in the Problems panel rather than an
|
|
402
403
|
* exception out of a click.
|
|
403
404
|
*/
|
|
404
|
-
function runByName(id: string, args:
|
|
405
|
+
function runByName(id: string, args: CommandArgValues = {}): void {
|
|
405
406
|
const registry = activeRegistry();
|
|
406
407
|
if (!registry?.get(id)) {
|
|
407
408
|
return;
|
|
@@ -437,7 +438,13 @@ function projectRow(row: ParityRow, i18n: ResolvedI18n): I18nParityRow {
|
|
|
437
438
|
}
|
|
438
439
|
|
|
439
440
|
/** How many squares are not yet a file, and how many are behind their source. */
|
|
440
|
-
|
|
441
|
+
interface CellCounts {
|
|
442
|
+
missing: number;
|
|
443
|
+
stale: number;
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
/** Tallies {@link CellCounts} over every square of the grid. */
|
|
447
|
+
function countCells(rows: readonly ParityRow[]): CellCounts {
|
|
441
448
|
let missing = 0;
|
|
442
449
|
let stale = 0;
|
|
443
450
|
for (const row of rows) {
|
|
@@ -535,8 +542,10 @@ let rerender: () => void = () => {};
|
|
|
535
542
|
|
|
536
543
|
/** What the document's three controls do. Every one of them is a decision this module owns. */
|
|
537
544
|
const ACTIONS: I18nActions = {
|
|
545
|
+
/* On Locales, not wherever Project Settings was last left: the empty state's one sentence is
|
|
546
|
+
"declare your languages", and the dialog remembers its section for the session (§17.1). */
|
|
538
547
|
openSettings: () => {
|
|
539
|
-
runByName(SETTINGS_COMMAND);
|
|
548
|
+
runByName(SETTINGS_COMMAND, { section: "locales" });
|
|
540
549
|
},
|
|
541
550
|
rescan: () => {
|
|
542
551
|
refreshParityScan();
|
|
@@ -599,8 +608,7 @@ export function registerI18nPanel(): void {
|
|
|
599
608
|
// Button, and `check-icons.ts` fails on a resolver row no rail panel declares.
|
|
600
609
|
icon: "globe",
|
|
601
610
|
// OFF THE RAIL. `railDeclarations()` does not apply `when`, so a rail button would spend the
|
|
602
|
-
// Last rail/project slot in every monolingual project
|
|
603
|
-
// ⌘1-8 chord by one. `i18n.showParity` is how it is reached.
|
|
611
|
+
// Last rail/project slot in every monolingual project. `i18n.showParity` is how it is reached.
|
|
604
612
|
rail: false,
|
|
605
613
|
when: (ctx) => ctx.project.isMultilingual,
|
|
606
614
|
// The body is a document, so lit draws nothing and the mount happens against the painted
|
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
* turn, where a Navigator repaint is a frame away and would rebuild far more than one field.
|
|
22
22
|
*/
|
|
23
23
|
|
|
24
|
+
import { isNonNullObject, isString } from "@jxsuite/schema/guards";
|
|
24
25
|
import { nothing } from "lit-html";
|
|
25
26
|
import { componentRegistry } from "../files/components";
|
|
26
27
|
import {
|
|
@@ -46,9 +47,9 @@ import type {
|
|
|
46
47
|
ImportsActions,
|
|
47
48
|
ImportsView,
|
|
48
49
|
PackageRow,
|
|
49
|
-
PickerOption,
|
|
50
50
|
} from "../surfaces/panel-imports";
|
|
51
|
-
import type {
|
|
51
|
+
import type { JxMutableNode } from "@jxsuite/schema/types";
|
|
52
|
+
import type { SurfaceOption } from "../ui/surface";
|
|
52
53
|
|
|
53
54
|
/** What the panel is drawn against. `left-panel.ts`'s context, reduced to what this reads. */
|
|
54
55
|
export interface ImportsContext {
|
|
@@ -105,17 +106,19 @@ function groupByPackage() {
|
|
|
105
106
|
if (comp.source !== "npm" || !comp.package || !comp.modulePath) {
|
|
106
107
|
continue;
|
|
107
108
|
}
|
|
108
|
-
|
|
109
|
-
|
|
109
|
+
let group = groups.get(comp.package);
|
|
110
|
+
if (!group) {
|
|
111
|
+
group = [];
|
|
112
|
+
groups.set(comp.package, group);
|
|
110
113
|
}
|
|
111
|
-
|
|
114
|
+
group.push(comp);
|
|
112
115
|
}
|
|
113
116
|
return groups;
|
|
114
117
|
}
|
|
115
118
|
|
|
116
119
|
/** The project's `$elements`, as the site-level mood reads and rewrites it. */
|
|
117
120
|
function siteElements(): ElementsEntry[] {
|
|
118
|
-
return
|
|
121
|
+
return projectState?.projectConfig?.$elements ?? [];
|
|
119
122
|
}
|
|
120
123
|
|
|
121
124
|
/**
|
|
@@ -163,19 +166,15 @@ function siteView(): ImportsView {
|
|
|
163
166
|
/** The document-level mood: this document's component imports, and what it could still import. */
|
|
164
167
|
function documentView(ctx: ImportsContext): ImportsView {
|
|
165
168
|
const { documentElements, documentPath } = ctx;
|
|
166
|
-
const refs = documentElements
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
typeof entry === "object" &&
|
|
171
|
-
typeof (entry as { $ref?: unknown }).$ref === "string",
|
|
172
|
-
)
|
|
173
|
-
.map((entry) => ({ ref: entry.$ref }));
|
|
169
|
+
const refs = documentElements.flatMap((entry) => {
|
|
170
|
+
const ref = isNonNullObject(entry) ? entry.$ref : undefined;
|
|
171
|
+
return isString(ref) ? [{ ref }] : [];
|
|
172
|
+
});
|
|
174
173
|
/* The checkbox reads the STRING entries only. A `$ref` is a project component and is listed
|
|
175
174
|
above; letting it answer here would tick an npm box for a file that happens to share a name. */
|
|
176
|
-
const npmEntries = documentElements.filter((entry) =>
|
|
175
|
+
const npmEntries = documentElements.filter((entry) => isString(entry));
|
|
177
176
|
const imported = new Set(refs.map((entry) => entry.ref));
|
|
178
|
-
const available:
|
|
177
|
+
const available: SurfaceOption[] = componentRegistry
|
|
179
178
|
.filter(
|
|
180
179
|
(comp: ComponentEntry) =>
|
|
181
180
|
comp.source !== "npm" &&
|
|
@@ -276,7 +275,7 @@ async function onRemovePackage(pkg: string): Promise<void> {
|
|
|
276
275
|
const updated = removePackageElements(siteElements(), pkg);
|
|
277
276
|
const { loadComponentRegistry } = await import("../files/components.js");
|
|
278
277
|
await loadComponentRegistry();
|
|
279
|
-
await updateSiteConfig({ $elements: updated
|
|
278
|
+
await updateSiteConfig({ $elements: updated });
|
|
280
279
|
context()?.renderLeftPanel();
|
|
281
280
|
} catch (error) {
|
|
282
281
|
console.error("Failed to remove package:", error);
|
|
@@ -301,17 +300,15 @@ async function onToggleComponent(id: string, checked: boolean): Promise<void> {
|
|
|
301
300
|
const updated = checked
|
|
302
301
|
? enableElement(before, comp, null)
|
|
303
302
|
: disableElement(before, comp, null);
|
|
304
|
-
await updateSiteConfig({ $elements: updated
|
|
303
|
+
await updateSiteConfig({ $elements: updated });
|
|
305
304
|
ctx.renderLeftPanel();
|
|
306
305
|
return;
|
|
307
306
|
}
|
|
308
307
|
ctx.applyMutation((doc: JxMutableNode) => {
|
|
309
|
-
const before =
|
|
310
|
-
doc.$elements =
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
: disableElement(before, comp, ctx.documentPath)
|
|
314
|
-
) as (string | JxElement)[];
|
|
308
|
+
const before = doc.$elements ?? [];
|
|
309
|
+
doc.$elements = checked
|
|
310
|
+
? enableElement(before, comp, ctx.documentPath)
|
|
311
|
+
: disableElement(before, comp, ctx.documentPath);
|
|
315
312
|
});
|
|
316
313
|
ctx.renderLeftPanel();
|
|
317
314
|
}
|
|
@@ -339,11 +336,7 @@ function onPick(value: string): void {
|
|
|
339
336
|
/* Through the service, which is also what makes this idempotent: it checked nothing and pushed a
|
|
340
337
|
second `$ref` every time you chose the same component. */
|
|
341
338
|
ctx.applyMutation((doc: JxMutableNode) => {
|
|
342
|
-
doc.$elements = enableElement(
|
|
343
|
-
(doc.$elements ?? []) as ElementsEntry[],
|
|
344
|
-
comp,
|
|
345
|
-
ctx.documentPath,
|
|
346
|
-
) as (string | JxElement)[];
|
|
339
|
+
doc.$elements = enableElement(doc.$elements ?? [], comp, ctx.documentPath);
|
|
347
340
|
});
|
|
348
341
|
ctx.renderLeftPanel();
|
|
349
342
|
}
|
|
@@ -355,10 +348,7 @@ function onRemoveRef(elementRef: string): void {
|
|
|
355
348
|
return;
|
|
356
349
|
}
|
|
357
350
|
ctx.applyMutation((doc: JxMutableNode) => {
|
|
358
|
-
doc.$elements = removeElementRef(
|
|
359
|
-
| string
|
|
360
|
-
| JxElement
|
|
361
|
-
)[];
|
|
351
|
+
doc.$elements = removeElementRef(doc.$elements ?? [], elementRef);
|
|
362
352
|
});
|
|
363
353
|
ctx.renderLeftPanel();
|
|
364
354
|
}
|
|
@@ -437,20 +427,6 @@ function contentArea(body: HTMLElement): HTMLElement {
|
|
|
437
427
|
return body.querySelector<HTMLElement>(".panel-content") ?? body;
|
|
438
428
|
}
|
|
439
429
|
|
|
440
|
-
/**
|
|
441
|
-
* The Navigator no longer draws this panel with lit.
|
|
442
|
-
*
|
|
443
|
-
* The record below returns `nothing` and mounts its document in `afterRender`, so this is a stub:
|
|
444
|
-
* it survives only because `NavigatorPanelDeps` still declares the injection and `studio.ts` still
|
|
445
|
-
* passes it. Both go in the change that deletes this.
|
|
446
|
-
*
|
|
447
|
-
* @deprecated The panel is `surfaces/panel-imports.json`; call {@link renderImportsPanel}.
|
|
448
|
-
* @returns {typeof nothing}
|
|
449
|
-
*/
|
|
450
|
-
export function renderImportsTemplate(_against: ImportsContext): typeof nothing {
|
|
451
|
-
return nothing;
|
|
452
|
-
}
|
|
453
|
-
|
|
454
430
|
/**
|
|
455
431
|
* Contribute the Packages panel.
|
|
456
432
|
*
|
|
@@ -466,6 +442,8 @@ export function registerPackagesPanel(): void {
|
|
|
466
442
|
level: "document",
|
|
467
443
|
dock: "navigator",
|
|
468
444
|
icon: "cube",
|
|
445
|
+
// A developer panel (§5.1): on the rail only with **Show developer panels** on.
|
|
446
|
+
rail: "developer",
|
|
469
447
|
requiresDocument: "Open a page to choose which components it can use.",
|
|
470
448
|
render: () => nothing,
|
|
471
449
|
afterRender: (ctx, host) => {
|
package/src/panels/jump-bar.ts
CHANGED
|
@@ -63,8 +63,9 @@
|
|
|
63
63
|
* @docs studio/interface
|
|
64
64
|
*/
|
|
65
65
|
|
|
66
|
-
import { displayTagName } from "@jxsuite/schema/guards";
|
|
67
|
-
import {
|
|
66
|
+
import { displayTagName, isNonNullObject, isString } from "@jxsuite/schema/guards";
|
|
67
|
+
import { getNodeAtPath } from "@jxsuite/schema/doc-ops";
|
|
68
|
+
import { childList, nodeLabel, pathsEqual, projectState } from "../store";
|
|
68
69
|
import { effect, effectScope } from "../reactivity";
|
|
69
70
|
import { activePane, workspace } from "../workspace/workspace";
|
|
70
71
|
import { derivationOfPane, tabOfPane } from "../canvas/canvas-surface";
|
|
@@ -74,14 +75,23 @@ import { runReported } from "../commands/run-reported";
|
|
|
74
75
|
import { openMenu } from "../surfaces/menu";
|
|
75
76
|
import { rectOf } from "../utils/geometry";
|
|
76
77
|
import { mountJumpBarSurface } from "../surfaces/jump-bar";
|
|
77
|
-
import
|
|
78
|
+
import { workspaceHomeLabel } from "../workspace/workspace-ids";
|
|
79
|
+
import { gridTabLabel } from "../grid/grid-source";
|
|
80
|
+
import type { CommandRegistry } from "../commands/registry";
|
|
78
81
|
import type { FormulaEditDef, FunctionEditDef } from "../types";
|
|
79
82
|
import type { JxPath } from "../state";
|
|
80
|
-
import type {
|
|
83
|
+
import type {
|
|
84
|
+
MenuHandle,
|
|
85
|
+
MenuRowProjection,
|
|
86
|
+
OpenMenuOptions,
|
|
87
|
+
ViewportPoint,
|
|
88
|
+
} from "../surfaces/menu";
|
|
81
89
|
import type { JumpBarSurface, ProjectedStep } from "../surfaces/jump-bar";
|
|
82
90
|
import type { Tab } from "../tabs/tab";
|
|
83
91
|
import type { PaneDerivation } from "../workspace/workspace";
|
|
84
92
|
import type { EffectScope } from "@vue/reactivity";
|
|
93
|
+
import type { JxMutableNode } from "@jxsuite/schema/types";
|
|
94
|
+
import type { CommandArgValues } from "../commands/command-args";
|
|
85
95
|
|
|
86
96
|
/**
|
|
87
97
|
* The region the trail stamps on itself. It is the status bar's DOCUMENT field: the document, and
|
|
@@ -108,7 +118,7 @@ export type JumpSegmentKind = "file" | "editor" | "node";
|
|
|
108
118
|
export interface JumpChoice {
|
|
109
119
|
label: string;
|
|
110
120
|
command: string;
|
|
111
|
-
args?:
|
|
121
|
+
args?: CommandArgValues;
|
|
112
122
|
/** The choice you are already on. Marked, never hidden — a menu that omits it loses its place. */
|
|
113
123
|
current?: boolean;
|
|
114
124
|
}
|
|
@@ -121,7 +131,7 @@ export interface JumpSegment {
|
|
|
121
131
|
title?: string;
|
|
122
132
|
/** The command that MOVES you here, or `null` when you are already here. */
|
|
123
133
|
command: string | null;
|
|
124
|
-
args?:
|
|
134
|
+
args?: CommandArgValues;
|
|
125
135
|
/** Where else this step could go. Fewer than two is not a choice, and renders no control. */
|
|
126
136
|
choices: readonly JumpChoice[];
|
|
127
137
|
}
|
|
@@ -144,6 +154,30 @@ export function documentLabel(path: string | null): string {
|
|
|
144
154
|
return root && path.startsWith(`${root}/`) ? path.slice(root.length + 1) : path;
|
|
145
155
|
}
|
|
146
156
|
|
|
157
|
+
/**
|
|
158
|
+
* What the file segment says about a tab: its path, or, for a VIRTUAL tab, the view's own name.
|
|
159
|
+
*
|
|
160
|
+
* A pathless tab is one of two different things. A workspace home (`workspace://content`) or a grid
|
|
161
|
+
* (`grid://…`) has no file because it is a view, not a document, and it never will have one;
|
|
162
|
+
* calling it "Untitled · Not saved to disk yet" invited the author to save a page that does not
|
|
163
|
+
* exist. Those tabs are named exactly as their strip chip names them (`panels/tab-strip.ts`), so
|
|
164
|
+
* the address and the tab agree. Only a genuinely new document is "Untitled".
|
|
165
|
+
*/
|
|
166
|
+
export function fileSegmentText(tab: Tab): Pick<JumpSegment, "label" | "title"> {
|
|
167
|
+
if (tab.documentPath) {
|
|
168
|
+
return { label: documentLabel(tab.documentPath), title: tab.documentPath };
|
|
169
|
+
}
|
|
170
|
+
const home = workspaceHomeLabel(tab.id);
|
|
171
|
+
if (home) {
|
|
172
|
+
return { label: home, title: `The ${home} workspace's home, a view rather than a file` };
|
|
173
|
+
}
|
|
174
|
+
const grid = gridTabLabel(tab.id);
|
|
175
|
+
if (grid) {
|
|
176
|
+
return { label: grid, title: `${grid}, a view of many files rather than one` };
|
|
177
|
+
}
|
|
178
|
+
return { label: documentLabel(null), title: "Not saved to disk yet" };
|
|
179
|
+
}
|
|
180
|
+
|
|
147
181
|
// ─── The selection trail (moved here from statusbar.ts) ──────────────────────
|
|
148
182
|
|
|
149
183
|
/** One crumb of the ancestor trail: what to call the node, and the path that selects it. */
|
|
@@ -160,19 +194,19 @@ export interface SelectionCrumb {
|
|
|
160
194
|
* array pseudo-element ("Repeater") and its template both visible instead of collapsing the array
|
|
161
195
|
* into a bare `[index]`.
|
|
162
196
|
*/
|
|
163
|
-
export function selectionCrumbs(document:
|
|
197
|
+
export function selectionCrumbs(document: JxMutableNode, selection: JxPath): SelectionCrumb[] {
|
|
164
198
|
const crumbs: SelectionCrumb[] = [];
|
|
165
199
|
for (let i = 0; i < selection.length;) {
|
|
166
200
|
const seg = selection[i];
|
|
167
201
|
const step = seg === "map" ? 1 : 2;
|
|
168
|
-
const path = selection.slice(0, i + step)
|
|
169
|
-
const node = getNodeAtPath(document
|
|
202
|
+
const path = selection.slice(0, i + step);
|
|
203
|
+
const node = getNodeAtPath(document, path);
|
|
170
204
|
const fallbackTag = node?.tag;
|
|
171
205
|
const label =
|
|
172
206
|
node?.$prototype === "Array"
|
|
173
207
|
? "Repeater"
|
|
174
208
|
: displayTagName(node?.tagName) ||
|
|
175
|
-
(
|
|
209
|
+
(isString(fallbackTag) ? fallbackTag : "") ||
|
|
176
210
|
(seg === "cases" ? String(selection[i + 1]) : `[${selection[i + 1]}]`);
|
|
177
211
|
crumbs.push({ label, path });
|
|
178
212
|
i += step;
|
|
@@ -191,7 +225,7 @@ export function selectionCrumbs(document: unknown, selection: JxPath): Selection
|
|
|
191
225
|
* addressable, so both drop out and the segment renders no control at all.
|
|
192
226
|
*/
|
|
193
227
|
export function crumbSiblings(
|
|
194
|
-
document:
|
|
228
|
+
document: JxMutableNode,
|
|
195
229
|
crumbs: readonly SelectionCrumb[],
|
|
196
230
|
index: number,
|
|
197
231
|
): JumpChoice[] {
|
|
@@ -199,17 +233,17 @@ export function crumbSiblings(
|
|
|
199
233
|
if (!crumb) {
|
|
200
234
|
return [];
|
|
201
235
|
}
|
|
202
|
-
const parentPath =
|
|
203
|
-
const parent = getNodeAtPath(document
|
|
236
|
+
const parentPath: JxPath = index === 0 ? [] : crumbs[index - 1]!.path;
|
|
237
|
+
const parent = getNodeAtPath(document, parentPath);
|
|
204
238
|
const key = crumb.path.at(-2);
|
|
205
239
|
const own = crumb.path;
|
|
206
240
|
if (key === "cases") {
|
|
207
241
|
const cases = parent?.cases;
|
|
208
|
-
if (!cases
|
|
242
|
+
if (!isNonNullObject(cases)) {
|
|
209
243
|
return [];
|
|
210
244
|
}
|
|
211
245
|
return Object.keys(cases).map((name) => {
|
|
212
|
-
const path = [...parentPath, "cases", name]
|
|
246
|
+
const path: JxPath = [...parentPath, "cases", name];
|
|
213
247
|
return choiceFor(document, path, name, own);
|
|
214
248
|
});
|
|
215
249
|
}
|
|
@@ -218,17 +252,22 @@ export function crumbSiblings(
|
|
|
218
252
|
}
|
|
219
253
|
const choices: JumpChoice[] = [];
|
|
220
254
|
for (const [i, child] of childList(parent).entries()) {
|
|
221
|
-
if (
|
|
255
|
+
if (isString(child)) {
|
|
222
256
|
continue;
|
|
223
257
|
}
|
|
224
|
-
const path = [...parentPath, "children", i]
|
|
258
|
+
const path: JxPath = [...parentPath, "children", i];
|
|
225
259
|
choices.push(choiceFor(document, path, nodeLabel(child), own));
|
|
226
260
|
}
|
|
227
261
|
return choices;
|
|
228
262
|
}
|
|
229
263
|
|
|
230
|
-
function choiceFor(
|
|
231
|
-
|
|
264
|
+
function choiceFor(
|
|
265
|
+
document: JxMutableNode,
|
|
266
|
+
path: JxPath,
|
|
267
|
+
fallback: string,
|
|
268
|
+
own: JxPath,
|
|
269
|
+
): JumpChoice {
|
|
270
|
+
const node = getNodeAtPath(document, path);
|
|
232
271
|
const label = node ? nodeLabel(node) : fallback;
|
|
233
272
|
const choice: JumpChoice = { args: { path }, command: "selection.set", label };
|
|
234
273
|
// `pathsEqual`, not a joined key: a separator is a guess about what a segment cannot contain,
|
|
@@ -271,15 +310,13 @@ export function jumpSegments(
|
|
|
271
310
|
choices: [],
|
|
272
311
|
command: derived ? "pane.pin" : "palette.openFiles",
|
|
273
312
|
kind: "file",
|
|
274
|
-
|
|
275
|
-
title: tab.documentPath ?? "Not saved to disk yet",
|
|
313
|
+
...fileSegmentText(tab),
|
|
276
314
|
},
|
|
277
315
|
];
|
|
278
316
|
|
|
279
317
|
// A logic editor is the leaf of the address, and it has no selection under it: the Monaco buffer
|
|
280
318
|
// And the formula workspace are editing a definition, not a node of the document tree.
|
|
281
|
-
const editingFunction = tab.session.ui
|
|
282
|
-
const editingFormula = tab.session.ui.editingFormula as FormulaEditDef | null;
|
|
319
|
+
const { editingFormula, editingFunction } = tab.session.ui;
|
|
283
320
|
if (editingFunction) {
|
|
284
321
|
segments.push(editorSegment("ƒ", editingFunction));
|
|
285
322
|
return segments;
|
|
@@ -333,9 +370,7 @@ function editorSegment(sigil: string, def: FunctionEditDef | FormulaEditDef): Ju
|
|
|
333
370
|
*/
|
|
334
371
|
function stepKey(segment: JumpSegment): string {
|
|
335
372
|
const path = segment.args?.path;
|
|
336
|
-
return segment.kind === "node" && Array.isArray(path)
|
|
337
|
-
? `node:${(path as JxPath).join("/")}`
|
|
338
|
-
: segment.kind;
|
|
373
|
+
return segment.kind === "node" && Array.isArray(path) ? `node:${path.join("/")}` : segment.kind;
|
|
339
374
|
}
|
|
340
375
|
|
|
341
376
|
/** Whether the registry can actually run this id right now. */
|
|
@@ -446,7 +481,7 @@ function openChoices(segment: JumpSegment, anchor: HTMLElement | null): void {
|
|
|
446
481
|
},
|
|
447
482
|
title: choice.label,
|
|
448
483
|
}));
|
|
449
|
-
const
|
|
484
|
+
const options: OpenMenuOptions = {
|
|
450
485
|
label: `Go to a sibling of ${segment.label}`,
|
|
451
486
|
onClosed: (closed) => {
|
|
452
487
|
if (_menu === closed) {
|
|
@@ -455,10 +490,13 @@ function openChoices(segment: JumpSegment, anchor: HTMLElement | null): void {
|
|
|
455
490
|
},
|
|
456
491
|
opener: anchor,
|
|
457
492
|
placement: ABOVE_OPENER,
|
|
458
|
-
...(anchor ? { place: (box: DOMRect) => aboveOpener(anchor, box) } : {}),
|
|
459
493
|
region: "jump-bar",
|
|
460
494
|
rows,
|
|
461
|
-
}
|
|
495
|
+
};
|
|
496
|
+
if (anchor) {
|
|
497
|
+
options.place = (box: DOMRect) => aboveOpener(anchor, box);
|
|
498
|
+
}
|
|
499
|
+
const handle = openMenu(options);
|
|
462
500
|
_menu = handle;
|
|
463
501
|
}
|
|
464
502
|
|
|
@@ -466,13 +504,19 @@ function openChoices(segment: JumpSegment, anchor: HTMLElement | null): void {
|
|
|
466
504
|
* The menu's corner when it hangs above `anchor`: its bottom on the anchor's top, leading edges
|
|
467
505
|
* aligned.
|
|
468
506
|
*/
|
|
469
|
-
export function aboveOpener(anchor: HTMLElement, box: DOMRect):
|
|
507
|
+
export function aboveOpener(anchor: HTMLElement, box: DOMRect): ViewportPoint {
|
|
470
508
|
const rect = rectOf(anchor);
|
|
471
509
|
return { x: Math.round(rect.left), y: Math.max(0, Math.round(rect.top - box.height)) };
|
|
472
510
|
}
|
|
473
511
|
|
|
474
512
|
/** The address of the focused pane, and the segments behind it. */
|
|
475
|
-
|
|
513
|
+
interface FocusedAddress {
|
|
514
|
+
steps: ProjectedStep[];
|
|
515
|
+
segments: JumpSegment[];
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
/** Projects {@link FocusedAddress} for the focused pane. */
|
|
519
|
+
function projectFocused(): FocusedAddress {
|
|
476
520
|
const paneId = activePane().id;
|
|
477
521
|
const segments = jumpSegments(tabOfPane(paneId), derivationOfPane(paneId));
|
|
478
522
|
const registry = activeRegistry();
|