@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/commands/defaults.ts
CHANGED
|
@@ -50,9 +50,9 @@ export type DockId = "navigator" | "inspector" | "bottom";
|
|
|
50
50
|
export type PaletteMode = "picker" | "files" | "commands" | "nodes" | "projects";
|
|
51
51
|
|
|
52
52
|
/**
|
|
53
|
-
* One panel, as
|
|
53
|
+
* One panel, as its `panel.focus.<id>` record addresses it.
|
|
54
54
|
*
|
|
55
|
-
* Structurally the part of `panels/panel-registry.ts`'s `PanelRecord` a
|
|
55
|
+
* Structurally the part of `panels/panel-registry.ts`'s `PanelRecord` a record needs, declared here
|
|
56
56
|
* rather than imported so this module keeps its one load-bearing property: it imports no state and
|
|
57
57
|
* no DOM, which is what lets the three CI checks load the command set in a bare Bun process. The
|
|
58
58
|
* ROSTER arrives by injection ({@link CommandDeps.panelRoster}) from the panel registry, so there
|
|
@@ -64,30 +64,52 @@ export interface RailPanel {
|
|
|
64
64
|
/** The panel's human name, which is also the command's title after "Show ". */
|
|
65
65
|
title: string;
|
|
66
66
|
/** `false` for a panel with no rail button — reachable by name, not by number. */
|
|
67
|
-
rail?: boolean;
|
|
67
|
+
rail?: boolean | "developer";
|
|
68
68
|
/** The panel's own visibility predicate, composed into the command's. */
|
|
69
69
|
when?: (ctx: CommandContext) => boolean;
|
|
70
70
|
}
|
|
71
71
|
|
|
72
|
-
/**
|
|
73
|
-
export
|
|
72
|
+
/** The Inspector strip's three tabs (§6): Page · Element · Assistant. */
|
|
73
|
+
export type InspectorStripId = "page" | "element" | "assistant";
|
|
74
74
|
|
|
75
75
|
/**
|
|
76
|
-
*
|
|
76
|
+
* One Inspector LEAF — a view the dock can show — in the order §6 names them, which is the order
|
|
77
|
+
* ⌘⇧1–5 follow: Page, Element's Content · Style · Logic, then Assistant.
|
|
77
78
|
*
|
|
78
|
-
* `"assistant"` is
|
|
79
|
-
*
|
|
79
|
+
* `"assistant"` is a leaf, not a dock of its own (there is no assistant column, §3.1), so it is one
|
|
80
|
+
* of `shell.ts`'s `INSPECTOR_TAB_IDS` like the others. `strip` says which of the three strip tabs
|
|
81
|
+
* hosts the leaf: the three node views share Element, behind a sub-switch, because they share one
|
|
82
|
+
* target.
|
|
80
83
|
*/
|
|
81
84
|
export interface InspectorTab {
|
|
82
|
-
/** The stored `session.ui.rightTab` value
|
|
85
|
+
/** The stored `session.ui.rightTab` value. */
|
|
83
86
|
id: string;
|
|
84
87
|
title: string;
|
|
88
|
+
strip: InspectorStripId;
|
|
85
89
|
}
|
|
86
90
|
|
|
87
91
|
export const INSPECTOR_TABS: readonly InspectorTab[] = [
|
|
88
|
-
{ id: "
|
|
89
|
-
{ id: "
|
|
90
|
-
{ id: "
|
|
92
|
+
{ id: "page", strip: "page", title: "Page" },
|
|
93
|
+
{ id: "properties", strip: "element", title: "Content" },
|
|
94
|
+
{ id: "style", strip: "element", title: "Style" },
|
|
95
|
+
{ id: "events", strip: "element", title: "Logic" },
|
|
96
|
+
{ id: "assistant", strip: "assistant", title: "Assistant" },
|
|
97
|
+
];
|
|
98
|
+
|
|
99
|
+
/** One tab of the strip, and the leaves it hosts. */
|
|
100
|
+
export interface InspectorStripTab {
|
|
101
|
+
id: InspectorStripId;
|
|
102
|
+
title: string;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* The strip, in order. Three tabs, under the four-per-dock cap (`studio-ui-guidelines.md` §12.2):
|
|
107
|
+
* Element's sub-switch is inside a tab's body and is not a dock tab. The Page tab's title is
|
|
108
|
+
* contextual on screen (Page, Template, Component, Entry or Document, §6); this is its name.
|
|
109
|
+
*/
|
|
110
|
+
export const INSPECTOR_STRIP: readonly InspectorStripTab[] = [
|
|
111
|
+
{ id: "page", title: "Page" },
|
|
112
|
+
{ id: "element", title: "Element" },
|
|
91
113
|
{ id: "assistant", title: "Assistant" },
|
|
92
114
|
];
|
|
93
115
|
|
|
@@ -119,7 +141,8 @@ export interface CommandDeps {
|
|
|
119
141
|
*/
|
|
120
142
|
newWindow: () => void | Promise<void>;
|
|
121
143
|
/**
|
|
122
|
-
* The rail's panels in rail order, then the rail-less ones — the roster
|
|
144
|
+
* The rail's panels in rail order, then the rail-less ones — the roster `panel.focus.*` is
|
|
145
|
+
* generated from.
|
|
123
146
|
*
|
|
124
147
|
* Every entry is a Navigator panel: the rail is the Navigator's, and a Bottom-dock tab is
|
|
125
148
|
* addressed by `view.setBottomTab` instead — one door per surface. `panels/navigator-panels.ts`'s
|
|
@@ -131,8 +154,8 @@ export interface CommandDeps {
|
|
|
131
154
|
panelRoster: readonly RailPanel[];
|
|
132
155
|
/**
|
|
133
156
|
* Toggle-FOCUS a panel: reveal it and take focus, or — when it already has focus — collapse the
|
|
134
|
-
* dock hosting it and hand focus back to the pane. Deliberately not toggle-visible:
|
|
135
|
-
* from the canvas must land you in
|
|
157
|
+
* dock hosting it and hand focus back to the pane. Deliberately not toggle-visible: running it
|
|
158
|
+
* from the canvas must land you in the panel, not close it.
|
|
136
159
|
*/
|
|
137
160
|
focusPanel: (panelId: string) => void;
|
|
138
161
|
/** Show an Inspector tab and focus the dock. `"assistant"` addresses the assistant dock. */
|
|
@@ -305,6 +328,7 @@ export function defaultCommands(deps: CommandDeps): AnyCommand[] {
|
|
|
305
328
|
keybinding: "mod+z",
|
|
306
329
|
menus: ["commandbar/primary", "palette"],
|
|
307
330
|
group: "1_history",
|
|
331
|
+
order: 1,
|
|
308
332
|
when: documentOpen,
|
|
309
333
|
enablement: (ctx) => ctx.document.canUndo,
|
|
310
334
|
requires: "a change to undo",
|
|
@@ -319,6 +343,7 @@ export function defaultCommands(deps: CommandDeps): AnyCommand[] {
|
|
|
319
343
|
keybinding: ["mod+shift+z", "mod+y"],
|
|
320
344
|
menus: ["commandbar/primary", "palette"],
|
|
321
345
|
group: "1_history",
|
|
346
|
+
order: 2,
|
|
322
347
|
when: documentOpen,
|
|
323
348
|
enablement: (ctx) => ctx.document.canRedo,
|
|
324
349
|
requires: "a change to redo",
|
|
@@ -545,7 +570,7 @@ export function defaultCommands(deps: CommandDeps): AnyCommand[] {
|
|
|
545
570
|
* The other half of multi-window, and the half that had no door.
|
|
546
571
|
*
|
|
547
572
|
* "Open a project ELSEWHERE" is reachable from Open Project and from Recents
|
|
548
|
-
* (desktop.md §4.2a); "open an EMPTY window" was reachable only from the
|
|
573
|
+
* (desktop.md §4.2a); "open an EMPTY window" was reachable only from the desktop
|
|
549
574
|
* launcher's native application menu — so on a launcher whose window has no menu bar,
|
|
550
575
|
* `newWindow` existed on the platform and could not be run. Gated on the same capability
|
|
551
576
|
* every other multi-window verb is, so a host with one window does not offer it.
|
|
@@ -601,40 +626,39 @@ export function defaultCommands(deps: CommandDeps): AnyCommand[] {
|
|
|
601
626
|
}
|
|
602
627
|
|
|
603
628
|
/**
|
|
604
|
-
*
|
|
629
|
+
* One `panel.focus.<id>` record per Navigator panel, generated from
|
|
630
|
+
* {@link CommandDeps.panelRoster}.
|
|
605
631
|
*
|
|
606
|
-
* Generated rather than written out
|
|
607
|
-
*
|
|
608
|
-
*
|
|
609
|
-
*
|
|
632
|
+
* Generated rather than written out once per panel for the reason the whole registry exists: the
|
|
633
|
+
* rail, the palette row and the generated command sheet are then three renderings of one list.
|
|
634
|
+
*
|
|
635
|
+
* **No chords.** ⌘1–8 used to follow the rail here. The digit row now switches WORKSPACES (⌘1–5,
|
|
636
|
+
* `view.setWorkspace`), because the rail is Design's alone and a chord that reached a panel from
|
|
637
|
+
* Publish would open a column the workspace does not draw. The records stay, in the palette and
|
|
638
|
+
* bindable in Preferences › Keyboard, and the rail is the pointer's way to them.
|
|
610
639
|
*/
|
|
611
640
|
export function panelFocusCommands(deps: CommandDeps): AnyCommand[] {
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
run: () => deps.focusPanel(panel.id),
|
|
628
|
-
};
|
|
629
|
-
if (panel.rail !== false && chordsSpent < RAIL_CHORD_LIMIT) {
|
|
630
|
-
chordsSpent += 1;
|
|
631
|
-
command.keybinding = `mod+${chordsSpent}`;
|
|
632
|
-
}
|
|
633
|
-
return command;
|
|
634
|
-
});
|
|
641
|
+
return deps.panelRoster.map((panel): AnyCommand => ({
|
|
642
|
+
id: `panel.focus.${panel.id}`,
|
|
643
|
+
title: `Show ${panel.title}`,
|
|
644
|
+
category: "View",
|
|
645
|
+
// Application, like `view.setActivity`: revealing a panel arranges the workspace. What the
|
|
646
|
+
// PANEL acts on is the panel record's own level, and that is `registerPanel()`'s field.
|
|
647
|
+
level: "application",
|
|
648
|
+
menus: ["palette"],
|
|
649
|
+
group: "4_docks",
|
|
650
|
+
requires: "an open project",
|
|
651
|
+
// The panel's OWN `when` composes in, so a declared-but-unbuilt surface (Search, Problems)
|
|
652
|
+
// Has no palette row — the record exists, the affordance does not.
|
|
653
|
+
when: (ctx: CommandContext) => ctx.project.open && (panel.when?.(ctx) ?? true),
|
|
654
|
+
run: () => deps.focusPanel(panel.id),
|
|
655
|
+
}));
|
|
635
656
|
}
|
|
636
657
|
|
|
637
|
-
/**
|
|
658
|
+
/**
|
|
659
|
+
* ⌘⇧1–5 — one record per Inspector leaf, generated from {@link INSPECTOR_TABS}, so the chords
|
|
660
|
+
* follow the strip left to right: Page, Element › Content, Style, Logic, then Assistant.
|
|
661
|
+
*/
|
|
638
662
|
export function inspectorFocusCommands(deps: CommandDeps): AnyCommand[] {
|
|
639
663
|
return INSPECTOR_TABS.map((tab, index) => {
|
|
640
664
|
const command: AnyCommand = {
|
package/src/commands/keymap.ts
CHANGED
|
@@ -27,6 +27,7 @@
|
|
|
27
27
|
* colliding still throws, because that one is a bug in the app and nobody's preference.
|
|
28
28
|
*/
|
|
29
29
|
|
|
30
|
+
import { isString } from "@jxsuite/schema/guards";
|
|
30
31
|
import { KEY_SCOPES } from "./levels";
|
|
31
32
|
import type { KeyScope } from "./levels";
|
|
32
33
|
|
|
@@ -36,33 +37,33 @@ const MODIFIER_ORDER = ["mod", "ctrl", "alt", "shift"] as const;
|
|
|
36
37
|
type Modifier = (typeof MODIFIER_ORDER)[number];
|
|
37
38
|
|
|
38
39
|
/** Spellings people actually write, mapped onto the canonical four. */
|
|
39
|
-
const MODIFIER_ALIASES
|
|
40
|
-
mod
|
|
41
|
-
cmd
|
|
42
|
-
command
|
|
43
|
-
meta
|
|
44
|
-
super
|
|
45
|
-
ctrl
|
|
46
|
-
control
|
|
47
|
-
alt
|
|
48
|
-
opt
|
|
49
|
-
option
|
|
50
|
-
shift
|
|
51
|
-
|
|
40
|
+
const MODIFIER_ALIASES = new Map<string, Modifier>([
|
|
41
|
+
["mod", "mod"],
|
|
42
|
+
["cmd", "mod"],
|
|
43
|
+
["command", "mod"],
|
|
44
|
+
["meta", "mod"],
|
|
45
|
+
["super", "mod"],
|
|
46
|
+
["ctrl", "ctrl"],
|
|
47
|
+
["control", "ctrl"],
|
|
48
|
+
["alt", "alt"],
|
|
49
|
+
["opt", "alt"],
|
|
50
|
+
["option", "alt"],
|
|
51
|
+
["shift", "shift"],
|
|
52
|
+
]);
|
|
52
53
|
|
|
53
54
|
/** Key aliases — arrow/space spellings and the `KeyboardEvent.key` values that differ. */
|
|
54
|
-
const KEY_ALIASES
|
|
55
|
-
up
|
|
56
|
-
down
|
|
57
|
-
left
|
|
58
|
-
right
|
|
59
|
-
esc
|
|
60
|
-
space
|
|
61
|
-
spacebar
|
|
62
|
-
del
|
|
63
|
-
plus
|
|
64
|
-
return
|
|
65
|
-
|
|
55
|
+
const KEY_ALIASES = new Map<string, string>([
|
|
56
|
+
["up", "arrowup"],
|
|
57
|
+
["down", "arrowdown"],
|
|
58
|
+
["left", "arrowleft"],
|
|
59
|
+
["right", "arrowright"],
|
|
60
|
+
["esc", "escape"],
|
|
61
|
+
["space", " "],
|
|
62
|
+
["spacebar", " "],
|
|
63
|
+
["del", "delete"],
|
|
64
|
+
["plus", "="],
|
|
65
|
+
["return", "enter"],
|
|
66
|
+
]);
|
|
66
67
|
|
|
67
68
|
/** How each modifier prints, per platform. */
|
|
68
69
|
const MAC_GLYPHS: Readonly<Record<Modifier, string>> = {
|
|
@@ -80,18 +81,18 @@ const PC_LABELS: Readonly<Record<Modifier, string>> = {
|
|
|
80
81
|
};
|
|
81
82
|
|
|
82
83
|
/** Keys whose printed name is not just the uppercased token. */
|
|
83
|
-
const KEY_LABELS
|
|
84
|
-
arrowup
|
|
85
|
-
arrowdown
|
|
86
|
-
arrowleft
|
|
87
|
-
arrowright
|
|
88
|
-
" "
|
|
89
|
-
escape
|
|
90
|
-
enter
|
|
91
|
-
tab
|
|
92
|
-
delete
|
|
93
|
-
backspace
|
|
94
|
-
|
|
84
|
+
const KEY_LABELS = new Map<string, string>([
|
|
85
|
+
["arrowup", "↑"],
|
|
86
|
+
["arrowdown", "↓"],
|
|
87
|
+
["arrowleft", "←"],
|
|
88
|
+
["arrowright", "→"],
|
|
89
|
+
[" ", "Space"],
|
|
90
|
+
["escape", "Esc"],
|
|
91
|
+
["enter", "Enter"],
|
|
92
|
+
["tab", "Tab"],
|
|
93
|
+
["delete", "Delete"],
|
|
94
|
+
["backspace", "Backspace"],
|
|
95
|
+
]);
|
|
95
96
|
|
|
96
97
|
/**
|
|
97
98
|
* The five fields the keymap reads off a keyboard event.
|
|
@@ -159,12 +160,12 @@ export function parseChord(chord: string): ParsedChord {
|
|
|
159
160
|
// Parses the same as "Cmd+Shift+P".
|
|
160
161
|
const trimmed = token.trim();
|
|
161
162
|
const lower = trimmed === "" ? " " : trimmed.toLowerCase();
|
|
162
|
-
const modifier = MODIFIER_ALIASES
|
|
163
|
+
const modifier = MODIFIER_ALIASES.get(lower);
|
|
163
164
|
if (modifier) {
|
|
164
165
|
parsed[modifier] = true;
|
|
165
166
|
continue;
|
|
166
167
|
}
|
|
167
|
-
parsed.key = KEY_ALIASES
|
|
168
|
+
parsed.key = KEY_ALIASES.get(lower) ?? lower;
|
|
168
169
|
}
|
|
169
170
|
if (!parsed.key) {
|
|
170
171
|
throw new Error(`keybinding "${chord}" has no key — a chord needs more than modifiers`);
|
|
@@ -185,6 +186,9 @@ export function normalizeChord(chord: string): string {
|
|
|
185
186
|
|
|
186
187
|
/** Whether the current platform is a mac. `navigator` is injectable so tests never touch globals. */
|
|
187
188
|
export function isMacPlatform(
|
|
189
|
+
/* SAFETY: this module types without the DOM lib, so `globalThis` does not declare `navigator`.
|
|
190
|
+
Where a host provides one (every webview, Bun), its `platform` and `userAgent` are strings,
|
|
191
|
+
which is all `PlatformInfo` reads; where none exists the `?? {}` default answers. */
|
|
188
192
|
nav: PlatformInfo = (globalThis as { navigator?: PlatformInfo }).navigator ?? {},
|
|
189
193
|
): boolean {
|
|
190
194
|
return /mac/i.test(nav.platform ?? nav.userAgent ?? "");
|
|
@@ -209,7 +213,7 @@ export function chordFromEvent(event: KeyChordEvent, mac: boolean): string {
|
|
|
209
213
|
chord needs more than modifiers") — so every bare modifier press threw out of `resolveEvent`,
|
|
210
214
|
into the keydown listener, and onto the console. `""` is the honest answer, and
|
|
211
215
|
{@link Keymap.resolveEvent} reads it as "no chord yet". */
|
|
212
|
-
if (MODIFIER_ALIASES
|
|
216
|
+
if (MODIFIER_ALIASES.has(key)) {
|
|
213
217
|
return "";
|
|
214
218
|
}
|
|
215
219
|
const parsed: ParsedChord = {
|
|
@@ -219,7 +223,7 @@ export function chordFromEvent(event: KeyChordEvent, mac: boolean): string {
|
|
|
219
223
|
// Shift is implied by an uppercase letter but a chord table cannot rely on that: with ⇧ held
|
|
220
224
|
// `e.key` is "Z" for ⌘⇧Z and "?" for ⇧/, so the flag is the only stable signal.
|
|
221
225
|
shift: event.shiftKey,
|
|
222
|
-
key: KEY_ALIASES
|
|
226
|
+
key: KEY_ALIASES.get(key) ?? key,
|
|
223
227
|
};
|
|
224
228
|
return serializeChord(parsed);
|
|
225
229
|
}
|
|
@@ -229,7 +233,7 @@ export function formatChord(chord: string, mac: boolean): string {
|
|
|
229
233
|
const parsed = parseChord(chord);
|
|
230
234
|
const held = MODIFIER_ORDER.filter((modifier) => parsed[modifier]);
|
|
231
235
|
const key =
|
|
232
|
-
KEY_LABELS
|
|
236
|
+
KEY_LABELS.get(parsed.key) ??
|
|
233
237
|
(parsed.key.length === 1
|
|
234
238
|
? parsed.key.toUpperCase()
|
|
235
239
|
: parsed.key.charAt(0).toUpperCase() + parsed.key.slice(1));
|
|
@@ -386,7 +390,7 @@ export function createKeymap(options: { mac?: boolean } = {}): Keymap {
|
|
|
386
390
|
if (!raw) {
|
|
387
391
|
return [];
|
|
388
392
|
}
|
|
389
|
-
return (
|
|
393
|
+
return (isString(raw) ? [raw] : [...raw]).map((chord) => normalizeChord(chord));
|
|
390
394
|
}
|
|
391
395
|
|
|
392
396
|
function tableFor(scope: KeyScope): Map<string, Claim> {
|
|
@@ -543,14 +547,23 @@ export function createKeymap(options: { mac?: boolean } = {}): Keymap {
|
|
|
543
547
|
* The command id is deliberately dropped — the frame decides whether to forward, never what runs —
|
|
544
548
|
* and the projection is a pure function of the keymap so the host can recompute and repost it
|
|
545
549
|
* whenever a rebinding lands.
|
|
550
|
+
*
|
|
551
|
+
* `except` names commands whose chords the second realm must leave alone: a command that never
|
|
552
|
+
* applies to what that realm draws (`canvas/iframe-keys.ts` `HOST_ONLY_COMMANDS`) would otherwise
|
|
553
|
+
* have the realm cancel the keystroke's own default for nothing.
|
|
546
554
|
*/
|
|
547
555
|
export function chordsInScopes<S extends KeyScope>(
|
|
548
556
|
keymap: Keymap,
|
|
549
557
|
scopes: readonly S[],
|
|
558
|
+
except: ReadonlySet<string> = new Set(),
|
|
550
559
|
): { chord: string; scope: S }[] {
|
|
551
560
|
const seen = new Set<string>();
|
|
552
561
|
const out: { chord: string; scope: S }[] = [];
|
|
553
562
|
for (const entry of keymap.entries()) {
|
|
563
|
+
// A command that can never run on behalf of the second realm must not make it swallow a key.
|
|
564
|
+
if (except.has(entry.commandId)) {
|
|
565
|
+
continue;
|
|
566
|
+
}
|
|
554
567
|
/* `find` rather than a `Set.has` test: the narrowed member is what makes the result carry the
|
|
555
568
|
CALLER's scope union. The canvas frame's table is three scopes wide (`FRAME_KEY_SCOPES`) and
|
|
556
569
|
has to stay that way across the bridge, where `SyncedChord` declares exactly those three —
|
package/src/commands/levels.ts
CHANGED
|
@@ -176,17 +176,20 @@ export type PanelPlacement = (typeof PANEL_PLACEMENTS)[number];
|
|
|
176
176
|
export const PANEL_PLACEMENT_MATRIX: Readonly<Record<PanelPlacement, PlacementRule>> = {
|
|
177
177
|
"rail/project": {
|
|
178
178
|
admits: ["project"],
|
|
179
|
-
note: "the rail's upper group —
|
|
179
|
+
note: "the rail's upper group — Site, and Files with the developer panels on",
|
|
180
180
|
},
|
|
181
181
|
"rail/document": {
|
|
182
182
|
admits: ["document"],
|
|
183
|
-
note: "the rail's lower group — Outline,
|
|
183
|
+
note: "the rail's lower group — Outline, Data, and Packages with the developer panels on",
|
|
184
184
|
},
|
|
185
185
|
navigator: {
|
|
186
186
|
admits: ["project", "document"],
|
|
187
187
|
note: "whichever level the hosted panel declares; the panel header prints it",
|
|
188
188
|
},
|
|
189
|
-
inspector: {
|
|
189
|
+
inspector: {
|
|
190
|
+
admits: ["document", "selection"],
|
|
191
|
+
note: "Page is the open document's tab, Element the selection's (§6)",
|
|
192
|
+
},
|
|
190
193
|
"dock.bottom": { admits: ["project", "document"], note: "the panel header states which" },
|
|
191
194
|
};
|
|
192
195
|
|
|
@@ -196,8 +199,11 @@ export interface PlaceablePanel {
|
|
|
196
199
|
level: Level;
|
|
197
200
|
/** The dock hosting the panel's body. */
|
|
198
201
|
dock: "navigator" | "inspector" | "bottom";
|
|
199
|
-
/**
|
|
200
|
-
|
|
202
|
+
/**
|
|
203
|
+
* `false` for a panel with no rail button — it declares no rail-group placement. `"developer"` is
|
|
204
|
+
* a rail button only while the developer panels are shown, and it still holds its placement.
|
|
205
|
+
*/
|
|
206
|
+
rail?: boolean | "developer" | undefined;
|
|
201
207
|
}
|
|
202
208
|
|
|
203
209
|
/** One rejected (panel, placement) pair. Shaped like {@link PlacementViolation}, keyed by panel. */
|
|
@@ -231,7 +237,7 @@ export function panelPlacements(panel: PlaceablePanel): string[] {
|
|
|
231
237
|
|
|
232
238
|
/** Whether `value` is one of the {@link PANEL_PLACEMENTS}. */
|
|
233
239
|
export function isPanelPlacement(value: string): value is PanelPlacement {
|
|
234
|
-
return (
|
|
240
|
+
return PANEL_PLACEMENTS.some((placement) => placement === value);
|
|
235
241
|
}
|
|
236
242
|
|
|
237
243
|
/** Check one Panel record against {@link PANEL_PLACEMENT_MATRIX}. */
|
|
@@ -300,12 +306,12 @@ export interface PlacementViolation {
|
|
|
300
306
|
|
|
301
307
|
/** Whether `placement` is one of the {@link PLACEMENTS}. */
|
|
302
308
|
export function isPlacement(value: string): value is Placement {
|
|
303
|
-
return (
|
|
309
|
+
return PLACEMENTS.some((placement) => placement === value);
|
|
304
310
|
}
|
|
305
311
|
|
|
306
312
|
/** Whether `level` is one of the {@link LEVELS}. */
|
|
307
313
|
export function isLevel(value: string): value is Level {
|
|
308
|
-
return (
|
|
314
|
+
return LEVELS.some((level) => level === value);
|
|
309
315
|
}
|
|
310
316
|
|
|
311
317
|
/** Whether the matrix lets a `level` record render in `placement`. */
|
|
@@ -25,6 +25,7 @@
|
|
|
25
25
|
* studio.ts, and lets a test state a context without standing up the app.
|
|
26
26
|
*/
|
|
27
27
|
|
|
28
|
+
import { isFunction, isString } from "@jxsuite/schema/guards";
|
|
28
29
|
import { resolveI18n } from "@jxsuite/schema/locale";
|
|
29
30
|
import { componentRegistry } from "../files/components";
|
|
30
31
|
import { getNodeAtPath, projectState } from "../store";
|
|
@@ -36,7 +37,7 @@ import { hasTyping } from "../tabs/typing";
|
|
|
36
37
|
import { collabState } from "../collab/collab-state";
|
|
37
38
|
|
|
38
39
|
import { canvasViewForMode, editorKindForMode, emptyContext } from "./context";
|
|
39
|
-
import type { CommandContext
|
|
40
|
+
import type { CommandContext } from "./context";
|
|
40
41
|
import type { StudioPlatform } from "../types";
|
|
41
42
|
|
|
42
43
|
/** Elements that own the keyboard while focused. Matches the old listener's target test exactly. */
|
|
@@ -86,7 +87,7 @@ export interface LiveContextSources {
|
|
|
86
87
|
|
|
87
88
|
/** `capability.*` is presence-of-method on the PAL — the check every call site does by hand today. */
|
|
88
89
|
function capabilities(platform: StudioPlatform | null): CommandContext["capability"] {
|
|
89
|
-
const has = (key: keyof StudioPlatform) =>
|
|
90
|
+
const has = (key: keyof StudioPlatform) => isFunction(platform?.[key]);
|
|
90
91
|
return {
|
|
91
92
|
dataRows: has("dataRows"),
|
|
92
93
|
// The real member now, not the `codeService` stand-in it was minted against: the usage query is
|
|
@@ -96,6 +97,7 @@ function capabilities(platform: StudioPlatform | null): CommandContext["capabili
|
|
|
96
97
|
importSite: has("importSite"),
|
|
97
98
|
openProjectInNewWindow: has("openProjectInNewWindow"),
|
|
98
99
|
readFileBytes: has("readFileBytes"),
|
|
100
|
+
publish: has("cfApi"),
|
|
99
101
|
// Multi-window is a desktop-only family; `newWindow` is the one every member implies.
|
|
100
102
|
windowControls: has("newWindow"),
|
|
101
103
|
};
|
|
@@ -132,6 +134,7 @@ export function createLiveContext(sources: LiveContextSources): () => CommandCon
|
|
|
132
134
|
ctx.git.ahead = shell.git.status?.ahead ?? 0;
|
|
133
135
|
ctx.git.behind = shell.git.status?.behind ?? 0;
|
|
134
136
|
ctx.git.dirtyCount = shell.git.status?.files.length ?? 0;
|
|
137
|
+
ctx.workspace.id = shell.workspace;
|
|
135
138
|
|
|
136
139
|
ctx.document.open = tab !== null;
|
|
137
140
|
// Typing still in a source buffer is unsaved work too, though the document has not seen it.
|
|
@@ -161,18 +164,17 @@ export function createLiveContext(sources: LiveContextSources): () => CommandCon
|
|
|
161
164
|
const selection = primarySelection(paths);
|
|
162
165
|
if (selection) {
|
|
163
166
|
const node = getNodeAtPath(tab!.doc.document, selection);
|
|
167
|
+
const tagName = node?.tagName;
|
|
164
168
|
ctx.selection.count = paths.length;
|
|
165
169
|
ctx.selection.paths = paths.map((path) => [...path]);
|
|
166
170
|
// Every remaining fact describes the PRIMARY — the one node a single-target verb addresses —
|
|
167
171
|
// Except `isRoot`, which is the batch's own gate: a batch containing the document element
|
|
168
172
|
// Cannot be deleted or duplicated any more than that element could be on its own.
|
|
169
|
-
ctx.selection.kind =
|
|
173
|
+
ctx.selection.kind = isString(tagName) ? tagName : "";
|
|
170
174
|
// A path of fewer than two segments addresses the document element itself — the same test
|
|
171
175
|
// `shortcuts.ts` spelled as `selection.length >= 2` at four separate call sites.
|
|
172
176
|
ctx.selection.isRoot = paths.some((path) => path.length < 2);
|
|
173
|
-
ctx.selection.isComponentInstance = componentRegistry.some(
|
|
174
|
-
(c) => c.tagName === node?.tagName,
|
|
175
|
-
);
|
|
177
|
+
ctx.selection.isComponentInstance = componentRegistry.some((c) => c.tagName === tagName);
|
|
176
178
|
ctx.selection.isRepeater = node?.$prototype === "Array";
|
|
177
179
|
}
|
|
178
180
|
// Layout chrome is NOT a document selection: the node is not in the open page at all.
|
|
@@ -187,7 +189,7 @@ export function createLiveContext(sources: LiveContextSources): () => CommandCon
|
|
|
187
189
|
being typed into. The stack asks "is something being typed into"; a record asks "is the
|
|
188
190
|
thing being typed into the page". */
|
|
189
191
|
ctx.caret.inCanvas = sources.isCaretActive();
|
|
190
|
-
ctx.focus.region = shell.focusRegion
|
|
192
|
+
ctx.focus.region = shell.focusRegion;
|
|
191
193
|
ctx.modal.open = sources.isModalOpen();
|
|
192
194
|
|
|
193
195
|
if (tab) {
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
* between runs is a CI diff nobody can review.
|
|
18
18
|
*/
|
|
19
19
|
|
|
20
|
+
import { isString } from "@jxsuite/schema/guards";
|
|
20
21
|
import { formatChord, normalizeChord } from "./keymap";
|
|
21
22
|
import { CATEGORIES } from "./levels";
|
|
22
23
|
import type { KeybindingOverrides } from "./keymap";
|
|
@@ -83,7 +84,7 @@ function chordsOf(command: AnyCommand): string[] {
|
|
|
83
84
|
if (!raw) {
|
|
84
85
|
return [];
|
|
85
86
|
}
|
|
86
|
-
return (
|
|
87
|
+
return (isString(raw) ? [raw] : [...raw]).map((chord) => normalizeChord(chord));
|
|
87
88
|
}
|
|
88
89
|
|
|
89
90
|
/**
|
package/src/commands/registry.ts
CHANGED
|
@@ -36,13 +36,12 @@ import { createKeymap } from "./keymap";
|
|
|
36
36
|
import type { KeyChordEvent, Keymap, KeymapMatch } from "./keymap";
|
|
37
37
|
import { checkRecordPlacements } from "./levels";
|
|
38
38
|
import type { Category, KeyScope, Level, Placement } from "./levels";
|
|
39
|
+
import { isFunction } from "@jxsuite/schema/guards";
|
|
39
40
|
import { coerceArgs } from "./command-args";
|
|
41
|
+
import type { CommandArgsSchema, CommandArgValues } from "./command-args";
|
|
40
42
|
import { runReported } from "./run-reported";
|
|
41
43
|
import type { CommandContext } from "./context";
|
|
42
44
|
|
|
43
|
-
/** Arguments as they arrive from a palette prompt, an automation manifest step or an AI tool call. */
|
|
44
|
-
export type CommandArgs = Record<string, unknown>;
|
|
45
|
-
|
|
46
45
|
/** How an action's effect is undone — surfaced to the user before an agent runs it. */
|
|
47
46
|
export type UndoScope = "document" | "project" | "none";
|
|
48
47
|
|
|
@@ -77,11 +76,17 @@ export interface Command<A = void> {
|
|
|
77
76
|
* shot check's contract AND what {@link CommandRegistry.run} coerces the received record against
|
|
78
77
|
* before `run` sees it (`command-args.ts`'s `coerceArgs`). One object, four readers.
|
|
79
78
|
*/
|
|
80
|
-
args?:
|
|
79
|
+
args?: CommandArgsSchema;
|
|
81
80
|
/** Surfaces this command renders in. Defaults to `["palette"]`. */
|
|
82
81
|
menus?: readonly Placement[];
|
|
83
82
|
/** Menu ordering key: "1_clipboard", "3_structure", "9_danger". */
|
|
84
83
|
group?: string;
|
|
84
|
+
/**
|
|
85
|
+
* Position within its {@link Command.group}, lower first. A command without one follows the
|
|
86
|
+
* ordered commands of its group, by title. A group whose members have a reading order of their
|
|
87
|
+
* own (Undo before Redo) states it here, because the title is an accident of the language.
|
|
88
|
+
*/
|
|
89
|
+
order?: number;
|
|
85
90
|
/**
|
|
86
91
|
* How the effect is undone. Also the LEDGER SCOPE of a bridged write:
|
|
87
92
|
* `services/ai-command-tools.ts` records one "Changed N files" entry per path a projected run
|
|
@@ -216,7 +221,7 @@ export interface CommandRegistry {
|
|
|
216
221
|
* `RangeError` naming the argument when `args` does not fit the record's schema — synchronously,
|
|
217
222
|
* before `run` is entered, whichever surface the call came from.
|
|
218
223
|
*/
|
|
219
|
-
run: (id: string, args?:
|
|
224
|
+
run: (id: string, args?: CommandArgValues) => void | Promise<void>;
|
|
220
225
|
/** The chord index, conflict-checked at registration. */
|
|
221
226
|
keymap: Keymap;
|
|
222
227
|
/** Resolve a keyboard event through a scope stack and run what it hits. */
|
|
@@ -254,7 +259,7 @@ function checkProjection(command: AnyCommand, toolNames: ReadonlyMap<string, str
|
|
|
254
259
|
`command "${command.id}" aiTool name "${tool.name}" is already projected by "${claimant}"`,
|
|
255
260
|
);
|
|
256
261
|
}
|
|
257
|
-
if (
|
|
262
|
+
if (!isFunction(tool.report)) {
|
|
258
263
|
throw new TypeError(
|
|
259
264
|
`command "${command.id}" declares aiTool without a report: a tool that can only say ` +
|
|
260
265
|
`"done" is refused`,
|
|
@@ -270,8 +275,7 @@ function checkProjection(command: AnyCommand, toolNames: ReadonlyMap<string, str
|
|
|
270
275
|
selector's `paths` property in FRONT of the record's own `args`, so a record that declares its
|
|
271
276
|
own `paths` would have two definitions of one argument — the model would read the record's
|
|
272
277
|
description and the bridge would hand the value to the selector. */
|
|
273
|
-
const properties =
|
|
274
|
-
?.properties;
|
|
278
|
+
const properties = command.args?.properties;
|
|
275
279
|
if (command.level === "selection" && properties && Object.hasOwn(properties, "paths")) {
|
|
276
280
|
throw new Error(
|
|
277
281
|
`command "${command.id}" is selection-level and may not declare "paths": the assistant ` +
|
|
@@ -341,11 +345,11 @@ export function createCommandRegistry(options: CommandRegistryOptions): CommandR
|
|
|
341
345
|
if (violations.length > 0) {
|
|
342
346
|
throw new Error(`command "${command.id}" ${violations[0]!.message}`);
|
|
343
347
|
}
|
|
344
|
-
checkProjection(command
|
|
348
|
+
checkProjection(command, toolNames);
|
|
345
349
|
// Chord conflicts throw from the keymap; do this LAST so a rejected record leaves the
|
|
346
350
|
// Registry untouched in every failure mode — the tool name is claimed only after it.
|
|
347
351
|
keymap.add(command);
|
|
348
|
-
commands.set(command.id, command
|
|
352
|
+
commands.set(command.id, command);
|
|
349
353
|
if (command.aiTool) {
|
|
350
354
|
toolNames.set(command.aiTool.name, command.id);
|
|
351
355
|
}
|
|
@@ -373,7 +377,10 @@ export function createCommandRegistry(options: CommandRegistryOptions): CommandR
|
|
|
373
377
|
(command.menus ?? ["palette"]).includes(placement) && visibleWith(command, ctx),
|
|
374
378
|
)
|
|
375
379
|
.toSorted(
|
|
376
|
-
(a, b) =>
|
|
380
|
+
(a, b) =>
|
|
381
|
+
(a.group ?? "").localeCompare(b.group ?? "") ||
|
|
382
|
+
(a.order ?? Number.POSITIVE_INFINITY) - (b.order ?? Number.POSITIVE_INFINITY) ||
|
|
383
|
+
a.title.localeCompare(b.title),
|
|
377
384
|
);
|
|
378
385
|
},
|
|
379
386
|
isVisible(id) {
|
|
@@ -404,6 +411,10 @@ export function createCommandRegistry(options: CommandRegistryOptions): CommandR
|
|
|
404
411
|
their typed readers; `coerceArgs` dispatches to the same functions, so the two cannot
|
|
405
412
|
disagree. A record with no `args` takes whatever it was handed, as it always has. */
|
|
406
413
|
const coerced = command.args ? coerceArgs(id, command.args, args) : args;
|
|
414
|
+
/* SAFETY: a stored record is `Command<never>` because the map erases each record's own `A`.
|
|
415
|
+
The runtime contract for that erased `A` is the record's `args` schema, which `coerceArgs`
|
|
416
|
+
has just applied (every key its reader's return value, an undeclared key refused); a
|
|
417
|
+
record with no schema takes the caller's record as it always has. */
|
|
407
418
|
return command.run(ctx, coerced as never);
|
|
408
419
|
},
|
|
409
420
|
keymap,
|