@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
|
@@ -31,6 +31,7 @@
|
|
|
31
31
|
* find-replace in those two call sites.
|
|
32
32
|
*/
|
|
33
33
|
|
|
34
|
+
import { isJsonPrimitive, isString } from "@jxsuite/schema/guards";
|
|
34
35
|
import { getPlatform } from "../platform";
|
|
35
36
|
import { flattenTree, nodeLabel, projectState } from "../store";
|
|
36
37
|
import { documentExtensions, formatByExtension, loadFormats } from "../format/format-host";
|
|
@@ -45,7 +46,7 @@ import { activeRegistry } from "../commands/active-registry";
|
|
|
45
46
|
import { runActiveReported, runReported } from "../commands/run-reported";
|
|
46
47
|
import type { PaletteMode } from "../commands/defaults";
|
|
47
48
|
import type { AnyCommand, CommandRegistry } from "../commands/registry";
|
|
48
|
-
import type {
|
|
49
|
+
import type { CommandArgValues } from "../commands/command-args";
|
|
49
50
|
import type { SurfaceHandle } from "../ui/surface";
|
|
50
51
|
import type { JxPath } from "../state";
|
|
51
52
|
|
|
@@ -123,6 +124,12 @@ export function modeSpec(mode: PaletteMode): PaletteModeSpec {
|
|
|
123
124
|
return MODE_SPEC.get(mode) ?? PALETTE_MODES[0]!;
|
|
124
125
|
}
|
|
125
126
|
|
|
127
|
+
/** The mode an input resolves to, and the query left once a prefix has moved into the chip. */
|
|
128
|
+
export interface ResolvedPaletteMode {
|
|
129
|
+
mode: PaletteMode;
|
|
130
|
+
query: string;
|
|
131
|
+
}
|
|
132
|
+
|
|
126
133
|
/**
|
|
127
134
|
* The mode a raw input actually addresses.
|
|
128
135
|
*
|
|
@@ -139,7 +146,7 @@ export function resolvePaletteMode(
|
|
|
139
146
|
requested: PaletteMode,
|
|
140
147
|
raw: string,
|
|
141
148
|
projectOpen: boolean,
|
|
142
|
-
):
|
|
149
|
+
): ResolvedPaletteMode {
|
|
143
150
|
const prefixed = PREFIXED_MODES.find((spec) => raw.startsWith(spec.prefix));
|
|
144
151
|
if (prefixed) {
|
|
145
152
|
return resolvePaletteMode(prefixed.mode, raw.slice(1), projectOpen);
|
|
@@ -220,7 +227,7 @@ export function rankBy<T>(items: readonly T[], query: string, key: (item: T) =>
|
|
|
220
227
|
|
|
221
228
|
/** One offered value for a command's single argument. */
|
|
222
229
|
export interface PaletteArgChoice {
|
|
223
|
-
value:
|
|
230
|
+
value: string | boolean;
|
|
224
231
|
label: string;
|
|
225
232
|
}
|
|
226
233
|
|
|
@@ -230,11 +237,6 @@ export type PaletteArgs =
|
|
|
230
237
|
| { kind: "choice"; name: string; choices: PaletteArgChoice[] }
|
|
231
238
|
| { kind: "unsupported" };
|
|
232
239
|
|
|
233
|
-
interface ArgsSchemaShape {
|
|
234
|
-
properties?: Record<string, { type?: string; enum?: readonly unknown[]; description?: string }>;
|
|
235
|
-
required?: readonly string[];
|
|
236
|
-
}
|
|
237
|
-
|
|
238
240
|
/**
|
|
239
241
|
* How a command's arguments are asked for.
|
|
240
242
|
*
|
|
@@ -246,7 +248,7 @@ interface ArgsSchemaShape {
|
|
|
246
248
|
* a command that gains an enum argument becomes promptable without anyone editing this file.
|
|
247
249
|
*/
|
|
248
250
|
export function paletteArgs(command: AnyCommand): PaletteArgs {
|
|
249
|
-
const schema = command.args
|
|
251
|
+
const schema = command.args;
|
|
250
252
|
const properties = schema?.properties;
|
|
251
253
|
if (!schema || !properties) {
|
|
252
254
|
return { kind: "none" };
|
|
@@ -308,7 +310,7 @@ const RECENT_COMMANDS_MAX = 6;
|
|
|
308
310
|
export function getRecentCommands(): string[] {
|
|
309
311
|
try {
|
|
310
312
|
const raw: unknown = JSON.parse(localStorage.getItem(RECENT_COMMANDS_KEY) || "[]");
|
|
311
|
-
return Array.isArray(raw) ? raw.filter((id) =>
|
|
313
|
+
return Array.isArray(raw) ? raw.filter((id) => isString(id)) : [];
|
|
312
314
|
} catch {
|
|
313
315
|
return [];
|
|
314
316
|
}
|
|
@@ -370,7 +372,7 @@ interface ArgRow {
|
|
|
370
372
|
kind: "arg";
|
|
371
373
|
commandId: string;
|
|
372
374
|
argName: string;
|
|
373
|
-
value:
|
|
375
|
+
value: string | boolean;
|
|
374
376
|
name: string;
|
|
375
377
|
detail: string;
|
|
376
378
|
}
|
|
@@ -437,7 +439,7 @@ export function isQuickSearchOpen(): boolean {
|
|
|
437
439
|
|
|
438
440
|
/** The project root scoping the palette, or null when no project is open. */
|
|
439
441
|
function scopeRoot(): string | null {
|
|
440
|
-
return projectState ?
|
|
442
|
+
return projectState ? projectState.projectRoot : null;
|
|
441
443
|
}
|
|
442
444
|
|
|
443
445
|
function hasProject(): boolean {
|
|
@@ -445,7 +447,7 @@ function hasProject(): boolean {
|
|
|
445
447
|
}
|
|
446
448
|
|
|
447
449
|
/** The mode and query the current input resolves to. */
|
|
448
|
-
function current():
|
|
450
|
+
function current(): ResolvedPaletteMode {
|
|
449
451
|
return resolvePaletteMode(_requested, _query, hasProject());
|
|
450
452
|
}
|
|
451
453
|
|
|
@@ -465,6 +467,15 @@ function shortenPath(path: string) {
|
|
|
465
467
|
return path;
|
|
466
468
|
}
|
|
467
469
|
|
|
470
|
+
/**
|
|
471
|
+
* What a file row reads from a search hit. `name` is optional because the cloud adapter hands back
|
|
472
|
+
* its response body unvalidated, so a hit without one falls back to the path's last segment.
|
|
473
|
+
*/
|
|
474
|
+
interface SearchHit {
|
|
475
|
+
path: string;
|
|
476
|
+
name?: string;
|
|
477
|
+
}
|
|
478
|
+
|
|
468
479
|
/**
|
|
469
480
|
* Fetch the project's document set once per open.
|
|
470
481
|
*
|
|
@@ -480,7 +491,7 @@ async function ensureFiles(): Promise<void> {
|
|
|
480
491
|
renderOverlay();
|
|
481
492
|
try {
|
|
482
493
|
await loadFormats();
|
|
483
|
-
const hits = await getPlatform().searchFiles("", documentExtensions());
|
|
494
|
+
const hits: readonly SearchHit[] = await getPlatform().searchFiles("", documentExtensions());
|
|
484
495
|
_files = hits.map((hit) => ({
|
|
485
496
|
kind: "file" as const,
|
|
486
497
|
path: hit.path,
|
|
@@ -566,23 +577,27 @@ function nodeRows(query: string): NodeRow[] {
|
|
|
566
577
|
const rows: NodeRow[] = flattenTree(tab.doc.document).map((row) => ({
|
|
567
578
|
kind: "node" as const,
|
|
568
579
|
path: row.path,
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
? String(row.node).slice(0, 60)
|
|
572
|
-
: nodeLabel(row.node as JxMutableNode),
|
|
580
|
+
// A primitive is exactly what `flattenTree` emits as a "text" row; every other row is a node.
|
|
581
|
+
name: isJsonPrimitive(row.node) ? String(row.node).slice(0, 60) : nodeLabel(row.node),
|
|
573
582
|
detail: row.nodeType,
|
|
574
583
|
}));
|
|
575
584
|
return rankBy(rows, query.trim(), (row) => row.name);
|
|
576
585
|
}
|
|
577
586
|
|
|
578
587
|
function modeRows(): ModeRow[] {
|
|
579
|
-
return PALETTE_MODES.
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
588
|
+
return PALETTE_MODES.flatMap((spec) =>
|
|
589
|
+
spec.mode === "picker"
|
|
590
|
+
? []
|
|
591
|
+
: [
|
|
592
|
+
{
|
|
593
|
+
kind: "mode" as const,
|
|
594
|
+
mode: spec.mode,
|
|
595
|
+
name: spec.chip,
|
|
596
|
+
detail: spec.description,
|
|
597
|
+
chord: spec.prefix,
|
|
598
|
+
},
|
|
599
|
+
],
|
|
600
|
+
);
|
|
586
601
|
}
|
|
587
602
|
|
|
588
603
|
function argRows(query: string): ArgRow[] {
|
|
@@ -598,8 +613,14 @@ function argRows(query: string): ArgRow[] {
|
|
|
598
613
|
return rankBy(rows, query.trim(), (row) => row.name);
|
|
599
614
|
}
|
|
600
615
|
|
|
616
|
+
/** What the list draws: its rows, and whether they are a "recent" listing rather than a search. */
|
|
617
|
+
interface CurrentRows {
|
|
618
|
+
rows: PaletteRow[];
|
|
619
|
+
showingRecent: boolean;
|
|
620
|
+
}
|
|
621
|
+
|
|
601
622
|
/** The rows for the current input, and whether they are a "recent" listing rather than a search. */
|
|
602
|
-
function currentRows():
|
|
623
|
+
function currentRows(): CurrentRows {
|
|
603
624
|
const { mode, query } = current();
|
|
604
625
|
if (_pending) {
|
|
605
626
|
return { rows: argRows(query), showingRecent: false };
|
|
@@ -669,7 +690,7 @@ function enterMode(mode: PaletteMode) {
|
|
|
669
690
|
void ensureFiles();
|
|
670
691
|
}
|
|
671
692
|
|
|
672
|
-
function runCommand(command: AnyCommand, args?:
|
|
693
|
+
function runCommand(command: AnyCommand, args?: CommandArgValues) {
|
|
673
694
|
const registry = activeRegistry();
|
|
674
695
|
if (!registry) {
|
|
675
696
|
return;
|
|
@@ -838,7 +859,7 @@ export interface PaletteRowProjection {
|
|
|
838
859
|
chord: string;
|
|
839
860
|
}
|
|
840
861
|
|
|
841
|
-
interface PaletteScope
|
|
862
|
+
interface PaletteScope {
|
|
842
863
|
open: boolean;
|
|
843
864
|
hasChip: boolean;
|
|
844
865
|
chipLabel: string;
|
|
@@ -863,10 +884,11 @@ interface PaletteScope extends Record<string, unknown> {
|
|
|
863
884
|
activate: () => void;
|
|
864
885
|
clearMode: () => void;
|
|
865
886
|
hover: (index: number) => void;
|
|
866
|
-
|
|
887
|
+
/** The `select` detail of the picked `jx-option`: its `value` attribute, a string. */
|
|
888
|
+
activateRow: (value: string) => void;
|
|
867
889
|
}
|
|
868
890
|
|
|
869
|
-
registerSurface("palette", paletteDoc
|
|
891
|
+
registerSurface("palette", paletteDoc);
|
|
870
892
|
|
|
871
893
|
let _scope: PaletteScope | null = null;
|
|
872
894
|
let _mount: Promise<SurfaceHandle> | null = null;
|
|
@@ -924,7 +946,7 @@ function scope(): PaletteScope {
|
|
|
924
946
|
rows: [],
|
|
925
947
|
sectionLabel: "",
|
|
926
948
|
showSection: false,
|
|
927
|
-
})
|
|
949
|
+
});
|
|
928
950
|
return _scope;
|
|
929
951
|
}
|
|
930
952
|
|
|
@@ -1,17 +1,27 @@
|
|
|
1
1
|
/// <reference lib="dom" />
|
|
2
2
|
/**
|
|
3
|
-
* Right panel — the Inspector dock:
|
|
3
|
+
* Right panel — the Inspector dock: three tabs, five views, one column (§6).
|
|
4
4
|
*
|
|
5
|
-
* **
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
5
|
+
* **Page · Element · Assistant**, text-labelled. Page is the open document's own settings (the
|
|
6
|
+
* former Navigator Page panel, re-hosted), titled for what the document is: Page, Template,
|
|
7
|
+
* Component, Entry or Document. Element is the selected node, and keeps the three views the strip
|
|
8
|
+
* used to spend three tabs on — Content, Style, Logic — behind a sub-switch in its body. The
|
|
9
|
+
* Assistant is folded in from the grid column it used to own, which is the point of §3.1's "no
|
|
10
|
+
* assistant column": an inspector tab costs zero additional width.
|
|
11
|
+
*
|
|
12
|
+
* The five LEAVES stay addressable (`shell.ts`'s `INSPECTOR_TAB_IDS`): `view.setRightTab { tab:
|
|
13
|
+
* "style" }` shows Element with Style chosen, and ⌘⇧1–5 follow the leaves left to right.
|
|
14
|
+
*
|
|
15
|
+
* **The strip follows the selection, and yields to the author.** When the selection goes from empty
|
|
16
|
+
* to non-empty while Page is showing, the strip switches to Element on the leaf last used there;
|
|
17
|
+
* when it becomes empty while Element is showing, it switches to Page. Only the TRANSITION
|
|
18
|
+
* switches: a tab the author clicks is kept until the selection next crosses empty, and the
|
|
19
|
+
* Assistant is never switched away from.
|
|
10
20
|
*
|
|
11
21
|
* **This file no longer draws anything.** The dock's markup, its ARIA and its style are
|
|
12
22
|
* `surfaces/inspector-dock.json`, mounted through `surfaces/inspector-dock.ts`; what is left here
|
|
13
|
-
* is the flow — which
|
|
14
|
-
* body host is handed to. Two things came out of the move:
|
|
23
|
+
* is the flow — which leaf is selected, what the tab is pointed at, and which of the five seams
|
|
24
|
+
* each body host is handed to. Two things came out of the move:
|
|
15
25
|
*
|
|
16
26
|
* - **The strip is a real `tablist`.** It was `sp-tabs` with no `tabpanel` on the other end, so the
|
|
17
27
|
* four bodies were anonymous scrolling divs: a screen reader was told a tab was selected and
|
|
@@ -27,21 +37,31 @@
|
|
|
27
37
|
* already holds, so there is nothing to withhold.
|
|
28
38
|
*/
|
|
29
39
|
|
|
30
|
-
import { getNodeAtPath, nodeLabel, rightPanel } from "../store";
|
|
40
|
+
import { getNodeAtPath, nodeLabel, requireShellRef, rightPanel } from "../store";
|
|
31
41
|
import { effect, effectScope, reactive } from "../reactivity";
|
|
32
42
|
import { activeTab } from "../workspace/workspace";
|
|
33
43
|
import { primarySelection } from "../tabs/selection";
|
|
44
|
+
import { stylebookTarget } from "../style/stylebook-target";
|
|
34
45
|
import { bindLogicPanelHost } from "./events-panel";
|
|
35
46
|
import { bindContentHost } from "./properties-panel";
|
|
36
47
|
|
|
37
|
-
import {
|
|
38
|
-
|
|
48
|
+
import {
|
|
49
|
+
DEFAULT_ELEMENT_TAB,
|
|
50
|
+
DEFAULT_INSPECTOR_TAB,
|
|
51
|
+
isElementTabId,
|
|
52
|
+
isInspectorTabId,
|
|
53
|
+
shell,
|
|
54
|
+
} from "../shell";
|
|
55
|
+
import { INSPECTOR_STRIP, INSPECTOR_TABS } from "../commands/defaults";
|
|
56
|
+
import { bindPageHost, PAGE_TAB_EMPTY, pageTabTitle, renderPageTab } from "./head-panel";
|
|
39
57
|
import { inspectorTabRegion } from "../ui/regions";
|
|
40
58
|
import { bindStyleHost } from "./style-panel";
|
|
41
59
|
import { mountInspectorDock } from "../surfaces/inspector-dock";
|
|
42
60
|
|
|
43
61
|
import type { InspectorDockHandle, InspectorTabView } from "../surfaces/inspector-dock";
|
|
44
|
-
import type { InspectorTabId } from "../shell";
|
|
62
|
+
import type { ElementTabId, InspectorTabId } from "../shell";
|
|
63
|
+
import type { InspectorStripId } from "../commands/defaults";
|
|
64
|
+
import type { Tab } from "../tabs/tab";
|
|
45
65
|
import type { EffectScope } from "@vue/reactivity";
|
|
46
66
|
|
|
47
67
|
interface RightPanelCtx {
|
|
@@ -74,7 +94,17 @@ let _dock: InspectorDockHandle | null = null;
|
|
|
74
94
|
* reports whether the assistant is showing, and a plain field would leave that button lying on the
|
|
75
95
|
* welcome screen — which is the whole class of bug `shell.ts` was split out to end.
|
|
76
96
|
*/
|
|
77
|
-
const _detached = reactive
|
|
97
|
+
const _detached = reactive<{ tab: InspectorTabId; element: ElementTabId }>({
|
|
98
|
+
element: DEFAULT_ELEMENT_TAB,
|
|
99
|
+
tab: DEFAULT_INSPECTOR_TAB,
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Whether each document had a selection the last time the dock looked, so the strip switches on a
|
|
104
|
+
* TRANSITION through empty rather than on every repaint (§6). Keyed on the tab, so focusing another
|
|
105
|
+
* document is not mistaken for its selection appearing.
|
|
106
|
+
*/
|
|
107
|
+
const _hadSelection = new WeakMap<Tab, boolean>();
|
|
78
108
|
|
|
79
109
|
/**
|
|
80
110
|
* Hand one tab's body host to its owner, once, and never let that stop the dock.
|
|
@@ -95,15 +125,21 @@ function bindBody(ctx: RightPanelCtx, tabId: string, host: HTMLElement): void {
|
|
|
95
125
|
}
|
|
96
126
|
|
|
97
127
|
/**
|
|
98
|
-
* The
|
|
128
|
+
* The five seams, keyed by the leaf whose body feeds them.
|
|
99
129
|
*
|
|
100
130
|
* A table rather than a chain of `if`s so that the ONE thing this module still does with a body
|
|
101
|
-
* host is stated in one place. Every entry is a binder another module published:
|
|
102
|
-
*
|
|
103
|
-
*
|
|
131
|
+
* host is stated in one place. Every entry is a binder another module published: four of them mount
|
|
132
|
+
* a document of their own into the host, and the assistant's arrives from `studio.ts` because a
|
|
133
|
+
* matching import here would be a cycle.
|
|
104
134
|
*/
|
|
105
135
|
function bindBodyUnguarded(ctx: RightPanelCtx, tabId: string, host: HTMLElement): void {
|
|
106
136
|
switch (tabId) {
|
|
137
|
+
case "page": {
|
|
138
|
+
/* The former Navigator Page panel, re-hosted unchanged: `head-panel.ts` draws it against the
|
|
139
|
+
focused document and empties it when nothing is open. */
|
|
140
|
+
bindPageHost(host);
|
|
141
|
+
break;
|
|
142
|
+
}
|
|
107
143
|
case "assistant": {
|
|
108
144
|
/* The assistant owns its container for the life of the window: it is the mount point for the
|
|
109
145
|
Assistant's own Jx document, and rebuilding it would drop the transcript and the composer
|
|
@@ -127,7 +163,10 @@ function bindBodyUnguarded(ctx: RightPanelCtx, tabId: string, host: HTMLElement)
|
|
|
127
163
|
/* The canvas mode is what the tab cannot read for itself — Stylebook edits a tag catalogue
|
|
128
164
|
entry and Edit edits the selection — so it comes in from `studio.ts` the same way the
|
|
129
165
|
Content tab's navigation door does. */
|
|
130
|
-
bindStyleHost(host, {
|
|
166
|
+
bindStyleHost(host, {
|
|
167
|
+
getCanvasMode: ctx.getCanvasMode,
|
|
168
|
+
isShowing: () => inspectorTab() === "style",
|
|
169
|
+
});
|
|
131
170
|
break;
|
|
132
171
|
}
|
|
133
172
|
default: {
|
|
@@ -139,16 +178,49 @@ function bindBodyUnguarded(ctx: RightPanelCtx, tabId: string, host: HTMLElement)
|
|
|
139
178
|
}
|
|
140
179
|
}
|
|
141
180
|
|
|
142
|
-
/**
|
|
181
|
+
/** Which strip tab hosts a leaf. */
|
|
182
|
+
export function stripOf(leaf: InspectorTabId): InspectorStripId {
|
|
183
|
+
return INSPECTOR_TABS.find((tab) => tab.id === leaf)?.strip ?? "page";
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/** The Page tab's title for the focused document (§6), or "Page" with nothing open. */
|
|
187
|
+
function pageTitle(): string {
|
|
188
|
+
const tab = activeTab.value;
|
|
189
|
+
return tab ? pageTabTitle(tab.documentPath) : "Page";
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/** What a strip tab is called on screen: Page's title is the document's kind. */
|
|
193
|
+
function stripTitle(id: InspectorStripId): string {
|
|
194
|
+
return id === "page" ? pageTitle() : (INSPECTOR_STRIP.find((tab) => tab.id === id)?.title ?? id);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/** The tab rows the document draws, with the selected leaf resolved onto them. */
|
|
143
198
|
function tabViews(selected: InspectorTabId): InspectorTabView[] {
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
199
|
+
const strip = stripOf(selected);
|
|
200
|
+
const noDocument = activeTab.value === null;
|
|
201
|
+
return INSPECTOR_STRIP.map((tab) => {
|
|
202
|
+
const leaves = INSPECTOR_TABS.filter((leaf) => leaf.strip === tab.id).map((leaf) => {
|
|
203
|
+
const empty = leaf.id === "page" && noDocument ? PAGE_TAB_EMPTY : "";
|
|
204
|
+
return {
|
|
205
|
+
active: leaf.id === selected,
|
|
206
|
+
empty,
|
|
207
|
+
hasEmpty: empty !== "",
|
|
208
|
+
key: leaf.id,
|
|
209
|
+
region: inspectorTabRegion(leaf.id),
|
|
210
|
+
shown: leaf.id === selected ? ("true" as const) : ("false" as const),
|
|
211
|
+
title: leaf.title,
|
|
212
|
+
};
|
|
213
|
+
});
|
|
214
|
+
return {
|
|
215
|
+
active: tab.id === strip,
|
|
216
|
+
hasLeaves: leaves.length > 1,
|
|
217
|
+
key: tab.id,
|
|
218
|
+
leaves,
|
|
219
|
+
panelId: `inspector-panel-${tab.id}`,
|
|
220
|
+
tabId: `inspector-tab-${tab.id}`,
|
|
221
|
+
title: stripTitle(tab.id),
|
|
222
|
+
};
|
|
223
|
+
});
|
|
152
224
|
}
|
|
153
225
|
|
|
154
226
|
/**
|
|
@@ -158,7 +230,7 @@ function tabViews(selected: InspectorTabId): InspectorTabView[] {
|
|
|
158
230
|
*/
|
|
159
231
|
export function mount(ctx: RightPanelCtx) {
|
|
160
232
|
_dock = mountInspectorDock(
|
|
161
|
-
rightPanel,
|
|
233
|
+
requireShellRef(rightPanel, "right-panel"),
|
|
162
234
|
values(),
|
|
163
235
|
{ selectTab: (id) => selectFromStrip(id) },
|
|
164
236
|
{ onBody: (tabId, host) => bindBody(ctx, tabId, host) },
|
|
@@ -176,10 +248,15 @@ export function mount(ctx: RightPanelCtx) {
|
|
|
176
248
|
if (tab) {
|
|
177
249
|
// Track properties the right panel reads
|
|
178
250
|
void tab.doc.document;
|
|
251
|
+
// The Page tab reads the realm a content page keeps its head in, and its kind.
|
|
252
|
+
void tab.doc.mode;
|
|
253
|
+
void tab.doc.content;
|
|
254
|
+
void tab.documentPath;
|
|
179
255
|
// The whole SET, joined — a bare property read would not re-trigger when the selection
|
|
180
256
|
// Changes WITHIN the array, and §6.7's helpers always replace it but nothing enforces that.
|
|
181
257
|
void tab.session.selection.map((path) => path.join("/")).join("|");
|
|
182
258
|
void tab.session.ui.rightTab;
|
|
259
|
+
followSelection(tab);
|
|
183
260
|
}
|
|
184
261
|
void _detached.tab;
|
|
185
262
|
render();
|
|
@@ -197,33 +274,89 @@ export function unmount() {
|
|
|
197
274
|
bindLogicPanelHost(null);
|
|
198
275
|
bindContentHost(null);
|
|
199
276
|
bindStyleHost(null);
|
|
277
|
+
bindPageHost(null);
|
|
200
278
|
_detached.tab = DEFAULT_INSPECTOR_TAB;
|
|
279
|
+
_detached.element = DEFAULT_ELEMENT_TAB;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* Switch the strip on a selection transition through empty (§6), and only then.
|
|
284
|
+
*
|
|
285
|
+
* Empty → non-empty while Page shows: Element, on the leaf last used there. Non-empty → empty while
|
|
286
|
+
* an Element leaf shows: Page. The first look at a document records its state and switches nothing,
|
|
287
|
+
* so focusing another tab is not a transition, and the Assistant is never left by this. Layout
|
|
288
|
+
* chrome counts as a selection: the Content view is what explains it. So does a Styles specimen's
|
|
289
|
+
* tag, which is a selection of the catalogue rather than of the document.
|
|
290
|
+
*/
|
|
291
|
+
function followSelection(tab: Tab): void {
|
|
292
|
+
// A tag picked in the Styles workspace's Elements view is a selection too: it is what the Style
|
|
293
|
+
// Leaf is editing, and it leaves the document selection empty (`selectStylebookTag`).
|
|
294
|
+
const has =
|
|
295
|
+
tab.session.selection.length > 0 ||
|
|
296
|
+
shell.layoutSelection !== null ||
|
|
297
|
+
stylebookTarget(tab) !== null;
|
|
298
|
+
const had = _hadSelection.get(tab);
|
|
299
|
+
_hadSelection.set(tab, has);
|
|
300
|
+
if (had === undefined || had === has) {
|
|
301
|
+
return;
|
|
302
|
+
}
|
|
303
|
+
const current = inspectorTab();
|
|
304
|
+
if (has && current === "page") {
|
|
305
|
+
setInspectorTab(lastElementTab());
|
|
306
|
+
} else if (!has && isElementTabId(current)) {
|
|
307
|
+
setInspectorTab("page");
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
/**
|
|
312
|
+
* The tab the strip rests on when nothing chose one (§6): Page with nothing selected, otherwise the
|
|
313
|
+
* Element leaf last used. What closing the Assistant steps onto.
|
|
314
|
+
*/
|
|
315
|
+
export function restingInspectorTab(): InspectorTabId {
|
|
316
|
+
const tab = activeTab.value;
|
|
317
|
+
const has = tab !== null && (tab.session.selection.length > 0 || shell.layoutSelection !== null);
|
|
318
|
+
return has ? lastElementTab() : "page";
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
/** The Element leaf last shown for the focused document, or with nothing open. */
|
|
322
|
+
function lastElementTab(): ElementTabId {
|
|
323
|
+
const tab = activeTab.value;
|
|
324
|
+
const stored: unknown = tab ? tab.session.ui.elementTab : _detached.element;
|
|
325
|
+
return isElementTabId(stored) ? stored : DEFAULT_ELEMENT_TAB;
|
|
201
326
|
}
|
|
202
327
|
|
|
203
328
|
/** The whole projection the document reads, built fresh from the state it names. */
|
|
204
329
|
function values() {
|
|
205
330
|
const tab = inspectorTab();
|
|
331
|
+
const strip = stripOf(tab);
|
|
206
332
|
return {
|
|
207
|
-
tab,
|
|
333
|
+
tab: strip,
|
|
208
334
|
tabs: tabViews(tab),
|
|
209
|
-
target: inspectorTarget(),
|
|
210
|
-
title:
|
|
335
|
+
target: inspectorTarget(tab),
|
|
336
|
+
title: stripTitle(strip),
|
|
211
337
|
};
|
|
212
338
|
}
|
|
213
339
|
|
|
214
340
|
/**
|
|
215
341
|
* Bring the dock up to date. Synchronous, and idempotent: the runtime skips a binding whose value
|
|
216
342
|
* did not move, so an explicit caller can never take a control mid-interaction.
|
|
343
|
+
*
|
|
344
|
+
* The Page body is redrawn only while it is the leaf showing: it builds a merged-head preview per
|
|
345
|
+
* paint, and a hidden one would pay for that on every selection change. Showing it draws it.
|
|
217
346
|
*/
|
|
218
347
|
export function render() {
|
|
219
|
-
|
|
348
|
+
const view = values();
|
|
349
|
+
_dock?.update(view);
|
|
350
|
+
if (inspectorTab() === "page") {
|
|
351
|
+
renderPageTab();
|
|
352
|
+
}
|
|
220
353
|
}
|
|
221
354
|
|
|
222
355
|
/**
|
|
223
|
-
* The
|
|
356
|
+
* The leaf showing right now — the stored value, coerced to a declared one.
|
|
224
357
|
*
|
|
225
358
|
* Coercion rather than trust because the value is persisted session state: a build that spelled a
|
|
226
|
-
* tab differently, or an automation step that guessed, must land on
|
|
359
|
+
* tab differently, or an automation step that guessed, must land on Page rather than on a blank
|
|
227
360
|
* dock with no tab selected.
|
|
228
361
|
*/
|
|
229
362
|
export function inspectorTab(): InspectorTabId {
|
|
@@ -243,38 +376,51 @@ export function setInspectorTab(tab: InspectorTabId): void {
|
|
|
243
376
|
const aTab = activeTab.value;
|
|
244
377
|
if (aTab) {
|
|
245
378
|
aTab.session.ui.rightTab = tab;
|
|
379
|
+
if (isElementTabId(tab)) {
|
|
380
|
+
aTab.session.ui.elementTab = tab;
|
|
381
|
+
}
|
|
246
382
|
} else {
|
|
247
383
|
_detached.tab = tab;
|
|
384
|
+
if (isElementTabId(tab)) {
|
|
385
|
+
_detached.element = tab;
|
|
386
|
+
}
|
|
248
387
|
}
|
|
249
388
|
render();
|
|
250
389
|
}
|
|
251
390
|
|
|
252
391
|
/**
|
|
253
|
-
* A pick from the strip.
|
|
392
|
+
* A pick from the strip, or from Element's sub-switch.
|
|
254
393
|
*
|
|
255
394
|
* The strip states a value and this decides what it means, which is why the document dispatches an
|
|
256
|
-
* id rather than writing one
|
|
257
|
-
* a
|
|
395
|
+
* id rather than writing one. `element` is a strip id with no leaf of its own: it means "the
|
|
396
|
+
* Element view I last used". Any other id must be a declared leaf, so an id the enum does not
|
|
397
|
+
* declare is refused here rather than becoming a dock with no tab selected.
|
|
258
398
|
*/
|
|
259
399
|
function selectFromStrip(id: string): void {
|
|
260
|
-
|
|
261
|
-
|
|
400
|
+
const leaf = id === "element" ? lastElementTab() : id;
|
|
401
|
+
if (leaf !== "" && leaf !== inspectorTab() && isInspectorTabId(leaf)) {
|
|
402
|
+
setInspectorTab(leaf);
|
|
262
403
|
}
|
|
263
404
|
}
|
|
264
405
|
|
|
265
406
|
/**
|
|
266
407
|
* What the selected tab is pointed AT, in the fewest words that are true.
|
|
267
408
|
*
|
|
268
|
-
* A tag name when a node is selected, the document's own name when nothing is
|
|
269
|
-
*
|
|
270
|
-
*
|
|
271
|
-
* with no on-screen
|
|
409
|
+
* A tag name when a node is selected, the document's own name when nothing is or when the Page tab
|
|
410
|
+
* is showing (it edits the document, whatever is selected), and "no document" when there is nothing
|
|
411
|
+
* open. The dock spent its whole life unable to answer this — three icon tabs and no statement of
|
|
412
|
+
* target anywhere — which is how "why is this field disabled" became a question with no on-screen
|
|
413
|
+
* answer.
|
|
272
414
|
*/
|
|
273
|
-
function inspectorTarget(): string {
|
|
415
|
+
function inspectorTarget(showing: InspectorTabId): string {
|
|
274
416
|
const tab = activeTab.value;
|
|
275
417
|
if (!tab) {
|
|
276
418
|
return "no document";
|
|
277
419
|
}
|
|
420
|
+
// The Page tab edits the document whatever is selected, so it is pointed at the document.
|
|
421
|
+
if (showing === "page") {
|
|
422
|
+
return documentName(tab.documentPath);
|
|
423
|
+
}
|
|
278
424
|
// Layout chrome first: it is mutually exclusive with a document selection, and it is the one
|
|
279
425
|
// Target whose name has to say where it came FROM — "<header> in layouts/base.json" is the whole
|
|
280
426
|
// Answer to "why can I not edit this".
|
|
@@ -282,6 +428,12 @@ function inspectorTarget(): string {
|
|
|
282
428
|
if (layout) {
|
|
283
429
|
return `<${layout.tagName || "element"}> in ${layout.layoutFile || "the layout"}`;
|
|
284
430
|
}
|
|
431
|
+
// The Styles workspace's Elements view styles a TAG: name it, as the Style body's `h1 · Base`
|
|
432
|
+
// Does, rather than whatever node the document selection happens to hold.
|
|
433
|
+
const tag = stylebookTarget(tab);
|
|
434
|
+
if (tag) {
|
|
435
|
+
return tag;
|
|
436
|
+
}
|
|
285
437
|
const paths = tab.session.selection;
|
|
286
438
|
const selection = primarySelection(paths);
|
|
287
439
|
if (selection) {
|
|
@@ -291,6 +443,10 @@ function inspectorTarget(): string {
|
|
|
291
443
|
? `${paths.length} elements`
|
|
292
444
|
: nodeLabel(getNodeAtPath(tab.doc.document, selection));
|
|
293
445
|
}
|
|
294
|
-
|
|
446
|
+
return documentName(tab.documentPath);
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
/** A document's own name in the header: its file name, or "document" for an unsaved one. */
|
|
450
|
+
function documentName(path: string | null | undefined): string {
|
|
295
451
|
return path ? (path.split("/").at(-1) ?? "document") : "document";
|
|
296
452
|
}
|