@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
|
@@ -12,12 +12,22 @@
|
|
|
12
12
|
* Pure and DOM-free: deps limited to `@jxsuite/schema` guards/types + {@link getNodeAtPath}.
|
|
13
13
|
*/
|
|
14
14
|
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
15
|
+
import { getNodeAtPath } from "@jxsuite/schema/doc-ops";
|
|
16
|
+
import {
|
|
17
|
+
isJsonObject,
|
|
18
|
+
isMappedArray,
|
|
19
|
+
isNonNullObject,
|
|
20
|
+
isRef,
|
|
21
|
+
isString,
|
|
22
|
+
} from "@jxsuite/schema/guards";
|
|
17
23
|
|
|
18
24
|
import type { JxPath } from "../state";
|
|
19
|
-
import type {
|
|
20
|
-
|
|
25
|
+
import type {
|
|
26
|
+
JxMappedArray,
|
|
27
|
+
JxMutableNode,
|
|
28
|
+
JxStateDefinition,
|
|
29
|
+
ProjectConfig,
|
|
30
|
+
} from "@jxsuite/schema/types";
|
|
21
31
|
|
|
22
32
|
/** Cap on how many inferred/declared fields we enumerate (mirrors merge-tags BREADTH_CAP breadth). */
|
|
23
33
|
const FIELD_CAP = 50;
|
|
@@ -44,18 +54,16 @@ export function findEnclosingRepeater(
|
|
|
44
54
|
if (mapIdx <= 0) {
|
|
45
55
|
return null;
|
|
46
56
|
}
|
|
47
|
-
const node = getNodeAtPath(doc, path.slice(0, mapIdx))
|
|
48
|
-
|
|
49
|
-
| undefined;
|
|
50
|
-
return node && node.$prototype === "Array" ? (node as JxMappedArray) : null;
|
|
57
|
+
const node = getNodeAtPath(doc, path.slice(0, mapIdx));
|
|
58
|
+
return isMappedArray(node) ? node : null;
|
|
51
59
|
}
|
|
52
60
|
|
|
53
61
|
/** Strip a `#/state/<name>` JSON-Pointer ref to its bare state name (null when it is not one). */
|
|
54
|
-
function refToStateName(
|
|
55
|
-
if (!isRef(
|
|
62
|
+
function refToStateName(binding: JxMappedArray["items"]): string | null {
|
|
63
|
+
if (!isRef(binding)) {
|
|
56
64
|
return null;
|
|
57
65
|
}
|
|
58
|
-
const { $ref: target } =
|
|
66
|
+
const { $ref: target } = binding;
|
|
59
67
|
return target.startsWith("#/state/") ? target.slice("#/state/".length) : null;
|
|
60
68
|
}
|
|
61
69
|
|
|
@@ -85,25 +93,28 @@ function safeFields(names: string[]): string[] {
|
|
|
85
93
|
*/
|
|
86
94
|
export function resolveRepeaterItemFields(
|
|
87
95
|
arrayNode: JxMappedArray,
|
|
88
|
-
state: Record<string,
|
|
96
|
+
state: Readonly<Record<string, JxStateDefinition>> | null | undefined,
|
|
89
97
|
projectConfig: ProjectConfig | null | undefined,
|
|
90
98
|
): string[] {
|
|
91
99
|
const base = ["item", "index"];
|
|
92
|
-
const { items } = arrayNode
|
|
100
|
+
const { items } = arrayNode;
|
|
93
101
|
const defs = state ?? {};
|
|
94
102
|
|
|
95
103
|
const stateName = refToStateName(items);
|
|
96
104
|
if (stateName) {
|
|
97
|
-
const def = defs[stateName]
|
|
98
|
-
if (def
|
|
105
|
+
const def = defs[stateName];
|
|
106
|
+
if (isJsonObject(def)) {
|
|
99
107
|
// (a) Content collection — `{ contentType: "<name>" }`. Import-aliased `$prototype` still
|
|
100
108
|
// Matches because we detect on the `contentType` string, not the prototype name.
|
|
101
|
-
if (
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
const
|
|
109
|
+
if (isString(def.contentType)) {
|
|
110
|
+
/* The `content` section is contributed by an extension and absorbed by the project
|
|
111
|
+
config's index signature, so each level is checked before it is read. */
|
|
112
|
+
const content = projectConfig?.content;
|
|
113
|
+
const ct = isJsonObject(content) ? content[def.contentType] : undefined;
|
|
114
|
+
const ctSchema = isJsonObject(ct) ? ct.schema : undefined;
|
|
115
|
+
const props = isJsonObject(ctSchema) ? ctSchema.properties : undefined;
|
|
105
116
|
const out = [...base, "item.id", "item.body"];
|
|
106
|
-
if (props
|
|
117
|
+
if (isNonNullObject(props)) {
|
|
107
118
|
for (const f of safeFields(Object.keys(props))) {
|
|
108
119
|
out.push(`item.data.${f}`);
|
|
109
120
|
}
|
|
@@ -112,14 +123,14 @@ export function resolveRepeaterItemFields(
|
|
|
112
123
|
}
|
|
113
124
|
|
|
114
125
|
// (b) State array — declared object item-schema, or inferred from a sample default[0].
|
|
115
|
-
const itemsSchema = def.items
|
|
116
|
-
const declared = itemsSchema
|
|
117
|
-
if (declared
|
|
126
|
+
const itemsSchema = def.items;
|
|
127
|
+
const declared = isJsonObject(itemsSchema) ? itemsSchema.properties : undefined;
|
|
128
|
+
if (isNonNullObject(declared)) {
|
|
118
129
|
return [...base, ...safeFields(Object.keys(declared)).map((f) => `item.${f}`)];
|
|
119
130
|
}
|
|
120
|
-
const defaults = def.default
|
|
121
|
-
const sample
|
|
122
|
-
if (
|
|
131
|
+
const defaults = def.default;
|
|
132
|
+
const sample = Array.isArray(defaults) ? defaults[0] : undefined;
|
|
133
|
+
if (isJsonObject(sample)) {
|
|
123
134
|
return [...base, ...safeFields(Object.keys(sample)).map((f) => `item.${f}`)];
|
|
124
135
|
}
|
|
125
136
|
}
|
|
@@ -128,8 +139,8 @@ export function resolveRepeaterItemFields(
|
|
|
128
139
|
|
|
129
140
|
// (c) Inline literal array — infer fields from the first object element.
|
|
130
141
|
if (Array.isArray(items)) {
|
|
131
|
-
const [first] = items
|
|
132
|
-
if (
|
|
142
|
+
const [first] = items;
|
|
143
|
+
if (isJsonObject(first)) {
|
|
133
144
|
return [...base, ...safeFields(Object.keys(first)).map((f) => `item.${f}`)];
|
|
134
145
|
}
|
|
135
146
|
}
|
package/src/editor/shortcuts.ts
CHANGED
|
@@ -30,6 +30,7 @@
|
|
|
30
30
|
* to the code that runs, so a chord and its behaviour cannot drift apart again.
|
|
31
31
|
*/
|
|
32
32
|
|
|
33
|
+
import { isFunction, isNonNullObject } from "@jxsuite/schema/guards";
|
|
33
34
|
import { childIndex, childList, getNodeAtPath, parentElementPath, projectState } from "../store";
|
|
34
35
|
import { activeTab, workspace } from "../workspace/workspace";
|
|
35
36
|
import {
|
|
@@ -45,8 +46,8 @@ import {
|
|
|
45
46
|
mutateDuplicateNodes,
|
|
46
47
|
mutateInsertNode,
|
|
47
48
|
mutateRemoveNodes,
|
|
48
|
-
redo
|
|
49
|
-
undo
|
|
49
|
+
redo,
|
|
50
|
+
undo,
|
|
50
51
|
transactDoc,
|
|
51
52
|
} from "../tabs/transact";
|
|
52
53
|
import {
|
|
@@ -81,6 +82,7 @@ import { runReported } from "../commands/run-reported";
|
|
|
81
82
|
import { pointerAnchor } from "../canvas/iframe-host";
|
|
82
83
|
import type { PointerAnchor } from "../canvas/iframe-host";
|
|
83
84
|
import type { CommandContext } from "../commands/context";
|
|
85
|
+
import type { CommandArgValues } from "../commands/command-args";
|
|
84
86
|
import type { DockId as CommandDockId } from "../commands/defaults";
|
|
85
87
|
import type { AnyCommand, CommandRegistry } from "../commands/registry";
|
|
86
88
|
import type { DockId, FocusRegion } from "../shell";
|
|
@@ -165,11 +167,14 @@ function navigateSelection(direction: -1 | 1): void {
|
|
|
165
167
|
tab.session.selection = [[]];
|
|
166
168
|
return;
|
|
167
169
|
}
|
|
168
|
-
|
|
170
|
+
// `parentElementPath` is null exactly when the path is the document element (length < 2).
|
|
171
|
+
const parentPath = parentElementPath(selected);
|
|
172
|
+
if (!parentPath) {
|
|
169
173
|
return;
|
|
170
174
|
}
|
|
171
|
-
const parentPath = parentElementPath(selected) as JxPath;
|
|
172
175
|
const parent = getNodeAtPath(tab.doc.document, parentPath);
|
|
176
|
+
// SAFETY: a selection path of length >= 2 addresses a child as `[..., "children", n]`, so its
|
|
177
|
+
// Last segment is the numeric index `n` (the same invariant `insertSiblingParagraph` relies on).
|
|
173
178
|
const newIndex = (childIndex(selected) as number) + direction;
|
|
174
179
|
if (newIndex >= 0 && newIndex < childList(parent).length) {
|
|
175
180
|
tab.session.selection = [[...parentPath, "children", newIndex]];
|
|
@@ -190,14 +195,10 @@ function selectSiblings(): void {
|
|
|
190
195
|
return;
|
|
191
196
|
}
|
|
192
197
|
const selected = primarySelection(tab.session.selection);
|
|
193
|
-
const parentPath = (
|
|
194
|
-
selected && selected.length >= 2 ? parentElementPath(selected) : []
|
|
195
|
-
) as JxPath;
|
|
198
|
+
const parentPath: JxPath = (selected ? parentElementPath(selected) : null) ?? [];
|
|
196
199
|
const parent = getNodeAtPath(tab.doc.document, parentPath);
|
|
197
200
|
const paths = childList(parent).flatMap((child, index) =>
|
|
198
|
-
|
|
199
|
-
? [[...parentPath, "children", index] as JxPath]
|
|
200
|
-
: [],
|
|
201
|
+
isNonNullObject(child) ? [[...parentPath, "children", index]] : [],
|
|
201
202
|
);
|
|
202
203
|
if (paths.length > 0) {
|
|
203
204
|
tab.session.selection = paths;
|
|
@@ -242,10 +243,16 @@ function selectParent(): void {
|
|
|
242
243
|
function insertSiblingParagraph(): void {
|
|
243
244
|
const tab = activeTab.value;
|
|
244
245
|
const selected = primarySelection(tab?.session.selection);
|
|
245
|
-
if (!tab || !selected
|
|
246
|
+
if (!tab || !selected) {
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
// Null exactly when the selection is the document element, which has no sibling slot.
|
|
250
|
+
const parentPath = parentElementPath(selected);
|
|
251
|
+
if (!parentPath) {
|
|
246
252
|
return;
|
|
247
253
|
}
|
|
248
|
-
|
|
254
|
+
// SAFETY: a selection path of length >= 2 addresses a child as `[..., "children", n]`, so its
|
|
255
|
+
// Last segment is the numeric child index `n`.
|
|
249
256
|
const index = childIndex(selected) as number;
|
|
250
257
|
const newPath = [...parentPath, "children", index + 1];
|
|
251
258
|
transactDoc(tab, (t) => {
|
|
@@ -303,14 +310,14 @@ function closeDocument(): void {
|
|
|
303
310
|
function undoDocument(): void {
|
|
304
311
|
const tab = activeTab.value;
|
|
305
312
|
if (tab) {
|
|
306
|
-
|
|
313
|
+
undo(tab);
|
|
307
314
|
}
|
|
308
315
|
}
|
|
309
316
|
|
|
310
317
|
function redoDocument(): void {
|
|
311
318
|
const tab = activeTab.value;
|
|
312
319
|
if (tab) {
|
|
313
|
-
|
|
320
|
+
redo(tab);
|
|
314
321
|
}
|
|
315
322
|
}
|
|
316
323
|
|
|
@@ -349,7 +356,7 @@ function zoomBy(ctx: CommandContext, factor: number, redraw: () => void): void {
|
|
|
349
356
|
return;
|
|
350
357
|
}
|
|
351
358
|
if (isContentZoom(ctx)) {
|
|
352
|
-
setEditZoom(
|
|
359
|
+
setEditZoom(tab.session.ui.editZoom * factor);
|
|
353
360
|
return;
|
|
354
361
|
}
|
|
355
362
|
// Around the stage's middle, like the zoom pod's buttons.
|
|
@@ -397,7 +404,7 @@ function toggleShellDock(registry: CommandRegistry, dock: CommandDockId): void {
|
|
|
397
404
|
* a missing id must be inert rather than an exception thrown out of a keydown handler. A present
|
|
398
405
|
* one that refuses its arguments is not inert: `commands/run-reported.ts` files it in Problems.
|
|
399
406
|
*/
|
|
400
|
-
function runIfPresent(registry: CommandRegistry, id: string, args:
|
|
407
|
+
function runIfPresent(registry: CommandRegistry, id: string, args: CommandArgValues): void {
|
|
401
408
|
if (registry.get(id) && registry.isEnabled(id)) {
|
|
402
409
|
void runReported(registry, id, args, "Keyboard");
|
|
403
410
|
}
|
|
@@ -521,15 +528,15 @@ function cycleRegion(direction: 1 | -1): void {
|
|
|
521
528
|
}
|
|
522
529
|
}
|
|
523
530
|
|
|
524
|
-
// ─── Panel and inspector focus (
|
|
531
|
+
// ─── Panel and inspector focus (`panel.focus.*`, ⌘⇧1–4) ──────────────────────
|
|
525
532
|
|
|
526
533
|
/**
|
|
527
534
|
* Toggle-FOCUS, not toggle-visible.
|
|
528
535
|
*
|
|
529
|
-
*
|
|
530
|
-
* — collapses the dock and hands the caret back to the pane. The distinction
|
|
531
|
-
* common case is "take me there", and a toggle-visible binding makes that a
|
|
532
|
-
* panel happened to be showing.
|
|
536
|
+
* `Show Files` from the canvas reveals Files and puts the caret in it; running it again — with
|
|
537
|
+
* Files already focused — collapses the dock and hands the caret back to the pane. The distinction
|
|
538
|
+
* matters because the common case is "take me there", and a toggle-visible binding makes that a
|
|
539
|
+
* coin flip on whichever panel happened to be showing.
|
|
533
540
|
*
|
|
534
541
|
* Every panel this can be handed lives in the Navigator. The roster is the rail plus the rail-less
|
|
535
542
|
* NAVIGATOR panels (`panels/navigator-panels.ts`), so a Bottom-dock record cannot reach here — the
|
|
@@ -539,14 +546,14 @@ function cycleRegion(direction: 1 | -1): void {
|
|
|
539
546
|
*/
|
|
540
547
|
function focusPanel(panelId: string): void {
|
|
541
548
|
/* THE DOOR. `shell.ts`'s `NAVIGATOR_PANEL_IDS` docstring says the command is what refuses an
|
|
542
|
-
undeclared id, "at the one door a caller comes through" — this is that door for
|
|
549
|
+
undeclared id, "at the one door a caller comes through" — this is that door for `panel.focus.*`, and it
|
|
543
550
|
was the only one of three doors that had no lock. `setActivityTab` now takes a
|
|
544
551
|
`NavigatorPanelId`, so the roster's `string` has to be narrowed somewhere; narrowing HERE keeps
|
|
545
552
|
`commands/defaults.ts` free of shell types, which is the property that lets three CI checks
|
|
546
553
|
load the command set in a bare Bun process.
|
|
547
554
|
|
|
548
555
|
A throw rather than a silent return: `tests/navigator-panels.test.ts` asserts the enum and the
|
|
549
|
-
registry agree, so this is unreachable while that passes, and a
|
|
556
|
+
registry agree, so this is unreachable while that passes, and a command that quietly does nothing
|
|
550
557
|
is precisely the defect this change is closing. */
|
|
551
558
|
const id = requireNavigatorPanelId(panelId, "panel.focus");
|
|
552
559
|
const alreadyThere =
|
|
@@ -647,8 +654,9 @@ function askWhereToOpen(openName: string): Promise<ProjectOpenTarget | "cancel">
|
|
|
647
654
|
export async function openProjectFlow(hooks: StudioCommandHooks): Promise<void> {
|
|
648
655
|
const platform = hasPlatform() ? getPlatform() : null;
|
|
649
656
|
const canOpenElsewhere =
|
|
650
|
-
|
|
651
|
-
|
|
657
|
+
platform !== null &&
|
|
658
|
+
isFunction(platform.openProjectInNewWindow) &&
|
|
659
|
+
isFunction(platform.pickProject);
|
|
652
660
|
if (!projectState || !canOpenElsewhere) {
|
|
653
661
|
await hooks.openProject("thisWindow");
|
|
654
662
|
return;
|
|
@@ -959,7 +967,11 @@ export function initShortcuts(registry: CommandRegistry, stageContext: StageCont
|
|
|
959
967
|
document.addEventListener(
|
|
960
968
|
"wheel",
|
|
961
969
|
(e: WheelEvent) => {
|
|
962
|
-
|
|
970
|
+
const { target } = e;
|
|
971
|
+
if (
|
|
972
|
+
(e.ctrlKey || e.metaKey) &&
|
|
973
|
+
!(target instanceof Element && target.closest(STAGE_SELECTOR))
|
|
974
|
+
) {
|
|
963
975
|
e.preventDefault();
|
|
964
976
|
}
|
|
965
977
|
},
|
|
@@ -978,7 +990,6 @@ export function initShortcuts(registry: CommandRegistry, stageContext: StageCont
|
|
|
978
990
|
* scrolled with the wheel at all.
|
|
979
991
|
*
|
|
980
992
|
* - `grid` — a Tabulator viewport with its own virtual scroller.
|
|
981
|
-
* - `manage` — the Library's ordinary overflow container.
|
|
982
993
|
* - `settings` — the Project Settings document (`panels/settings-pane.ts`): an `overflow-y: auto`
|
|
983
994
|
* section column, plus the Raw JSON `<pre>`'s own box inside it.
|
|
984
995
|
* - `entry` — the Entry editor's `overflow-y: auto` form (`content/entry-editor.ts`).
|
|
@@ -988,28 +999,30 @@ export function initShortcuts(registry: CommandRegistry, stageContext: StageCont
|
|
|
988
999
|
* there is no artboard here to zoom, either.
|
|
989
1000
|
*/
|
|
990
1001
|
const SELF_SCROLLING_MODES: ReadonlySet<string> = new Set([
|
|
1002
|
+
/* The Content home — `browse/library-pane.ts`. Its own scrolling list, nothing to zoom. */
|
|
1003
|
+
"content-home",
|
|
991
1004
|
"entry",
|
|
992
1005
|
"grid",
|
|
993
|
-
"manage",
|
|
994
1006
|
/* `media` — the Media viewer's own scrolling column (`media/media-pane.ts`). There is no artboard
|
|
995
1007
|
here either: a wheel over an image is a scroll down the page it sits on, not a zoom. */
|
|
996
1008
|
"media",
|
|
1009
|
+
/* A workspace's home — `workspace/workspace-home.ts`. A centred column with nothing to zoom. */
|
|
1010
|
+
"media-home",
|
|
997
1011
|
"preview",
|
|
998
|
-
"
|
|
1012
|
+
"publish-home",
|
|
999
1013
|
]);
|
|
1000
1014
|
|
|
1001
1015
|
/**
|
|
1002
1016
|
* Can a box between `target` and the stage still answer this wheel itself?
|
|
1003
1017
|
*
|
|
1004
|
-
* Edit forwards every wheel to the page's scroller (see the branch below)
|
|
1005
|
-
*
|
|
1006
|
-
*
|
|
1007
|
-
*
|
|
1008
|
-
*
|
|
1009
|
-
*
|
|
1010
|
-
*
|
|
1011
|
-
*
|
|
1012
|
-
* and letting the browser scroll the page natively would chain out of it into the shell.
|
|
1018
|
+
* Edit forwards every wheel to the page's scroller (see the branch below). A `preventDefault` from
|
|
1019
|
+
* an ANCESTOR listener cancels the native scroll of whatever the pointer is over, so any box in the
|
|
1020
|
+
* stage cell that scrolls itself (a sideways strip, a capped list) would otherwise be unwheelable
|
|
1021
|
+
* while the page scrolled underneath it instead. So the stage takes the wheel only when nothing
|
|
1022
|
+
* inside it wants one: the walk stops at the stage cell, and it steps over the page's scroller
|
|
1023
|
+
* because that box is what the forwarding is FOR — a wheel forwarded out of the cross-origin frame
|
|
1024
|
+
* is dispatched on the cell itself and reaches no scrollable element on the way, and letting the
|
|
1025
|
+
* browser scroll the page natively would chain out of it into the shell.
|
|
1013
1026
|
*
|
|
1014
1027
|
* @param {WheelEvent} e
|
|
1015
1028
|
* @param {HTMLElement} stage The cell the listener is on — the walk's upper bound, exclusive.
|
|
@@ -1022,7 +1035,7 @@ function wheelBelongsInside(
|
|
|
1022
1035
|
): boolean {
|
|
1023
1036
|
const { target } = e;
|
|
1024
1037
|
let el: Element | null =
|
|
1025
|
-
target instanceof Element ? target :
|
|
1038
|
+
target instanceof Element ? target : target instanceof Node ? target.parentElement : null;
|
|
1026
1039
|
while (el && el !== stage) {
|
|
1027
1040
|
if (el instanceof HTMLElement && el !== pageScroller && canScrollBy(el, e.deltaX, e.deltaY)) {
|
|
1028
1041
|
return true;
|
|
@@ -1134,8 +1147,8 @@ export function installStageGestures(surface: CanvasSurface): () => void {
|
|
|
1134
1147
|
/* The stage's own scroller, by the `part` the stage document draws it with — the same
|
|
1135
1148
|
attribute every other consumer of the canvas's chrome now addresses it by. */
|
|
1136
1149
|
const sc = canvasWrap.querySelector<HTMLElement>('[part="edit-canvas"]');
|
|
1137
|
-
/* …unless the pointer is over a box in this cell that scrolls itself
|
|
1138
|
-
|
|
1150
|
+
/* …unless the pointer is over a box in this cell that scrolls itself. See
|
|
1151
|
+
{@link wheelBelongsInside}. */
|
|
1139
1152
|
if (sc && !wheelBelongsInside(e, canvasWrap, sc)) {
|
|
1140
1153
|
e.preventDefault();
|
|
1141
1154
|
sc.scrollTop += e.deltaY;
|
|
@@ -1219,7 +1232,7 @@ export function installStageGestures(surface: CanvasSurface): () => void {
|
|
|
1219
1232
|
canvasWrap.addEventListener(
|
|
1220
1233
|
"click",
|
|
1221
1234
|
(e: MouseEvent) => {
|
|
1222
|
-
if (e.target
|
|
1235
|
+
if (!isStageBackground(e.target, canvasWrap, surface.panzoomWrap)) {
|
|
1223
1236
|
return;
|
|
1224
1237
|
}
|
|
1225
1238
|
const tab = tabOfPane(surface.paneId);
|
|
@@ -1237,6 +1250,27 @@ export function installStageGestures(surface: CanvasSurface): () => void {
|
|
|
1237
1250
|
};
|
|
1238
1251
|
}
|
|
1239
1252
|
|
|
1253
|
+
/**
|
|
1254
|
+
* Whether a click landed on a stage's BACKGROUND rather than on anything drawn in it: the stage
|
|
1255
|
+
* itself, the pan/zoom surface, or the frame box every view draws its artboards in.
|
|
1256
|
+
*
|
|
1257
|
+
* The frame box is the one that matters in Edit. Edit has no pan/zoom surface; its frame is the
|
|
1258
|
+
* scrolling `[part="edit-canvas"]` that fills the stage around the page column, so the grey margin
|
|
1259
|
+
* beside the page IS that box, and a test that knew only the stage and the pan/zoom surface never
|
|
1260
|
+
* saw a click there. The frame is recognised by its static `data-slot`, which the stage document
|
|
1261
|
+
* stamps on it in every view.
|
|
1262
|
+
*/
|
|
1263
|
+
export function isStageBackground(
|
|
1264
|
+
target: EventTarget | null,
|
|
1265
|
+
stage: Element,
|
|
1266
|
+
panzoom: Element | null,
|
|
1267
|
+
): boolean {
|
|
1268
|
+
if (target === stage || (panzoom !== null && target === panzoom)) {
|
|
1269
|
+
return true;
|
|
1270
|
+
}
|
|
1271
|
+
return target instanceof HTMLElement && target.dataset.slot === "frame" && stage.contains(target);
|
|
1272
|
+
}
|
|
1273
|
+
|
|
1240
1274
|
/** The context a stage answers with before the bootstrap has published a reader. */
|
|
1241
1275
|
function stageless(): ShortcutPointerContext {
|
|
1242
1276
|
return {
|
package/src/editor/slash-menu.ts
CHANGED
|
@@ -27,14 +27,15 @@
|
|
|
27
27
|
*/
|
|
28
28
|
|
|
29
29
|
import { openSlashMenuSurface } from "../surfaces/slash-menu";
|
|
30
|
+
import { componentSlashCommands } from "./insert-component";
|
|
30
31
|
import { rectOf } from "../utils/geometry";
|
|
31
|
-
import type {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
}
|
|
32
|
+
import type {
|
|
33
|
+
SlashMenuGroup,
|
|
34
|
+
SlashMenuRow,
|
|
35
|
+
SlashMenuSurface,
|
|
36
|
+
SlashMenuView,
|
|
37
|
+
} from "../surfaces/slash-menu";
|
|
38
|
+
import type { SlashCommand } from "./inline-edit";
|
|
38
39
|
|
|
39
40
|
// ─── Commands ─────────────────────────────────────────────────────────────────
|
|
40
41
|
|
|
@@ -120,9 +121,43 @@ export function showSlashMenuAtRect(
|
|
|
120
121
|
showAt(rect, filter, cbs);
|
|
121
122
|
}
|
|
122
123
|
|
|
124
|
+
/**
|
|
125
|
+
* The standard set: the HTML elements, then the project's components under their own heading
|
|
126
|
+
* (§5.7), read from the registry at the moment the menu opens so a component saved a moment ago is
|
|
127
|
+
* on offer.
|
|
128
|
+
*/
|
|
129
|
+
function standardCommands(): SlashCommand[] {
|
|
130
|
+
return [...SLASH_COMMANDS, ...componentSlashCommands()];
|
|
131
|
+
}
|
|
132
|
+
|
|
123
133
|
/** Everything on offer right now: what the caller named, or the standard set. */
|
|
124
134
|
function source(): SlashCommand[] {
|
|
125
|
-
return callbacks?.commands ||
|
|
135
|
+
return callbacks?.commands || standardCommands();
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* The rows as the panel groups them: consecutive offers with the same heading share a group, and
|
|
140
|
+
* the first, unheaded group is the HTML elements. Each row keeps its index in the FLAT list, which
|
|
141
|
+
* is the one the keyboard, the highlight and a pick count in.
|
|
142
|
+
*/
|
|
143
|
+
function groupsOf(rows: readonly SlashMenuRow[], items: readonly SlashCommand[]): SlashMenuGroup[] {
|
|
144
|
+
const groups: SlashMenuGroup[] = [];
|
|
145
|
+
for (const [index, row] of rows.entries()) {
|
|
146
|
+
const label = items[index]?.group ?? "";
|
|
147
|
+
const last = groups.at(-1);
|
|
148
|
+
if (last?.label === label) {
|
|
149
|
+
last.rows.push(row);
|
|
150
|
+
} else {
|
|
151
|
+
groups.push({
|
|
152
|
+
hasLabel: label !== "",
|
|
153
|
+
key: label || "elements",
|
|
154
|
+
label,
|
|
155
|
+
name: label || "Elements",
|
|
156
|
+
rows: [row],
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return groups;
|
|
126
161
|
}
|
|
127
162
|
|
|
128
163
|
/** The offers a filter leaves standing. An empty filter leaves all of them. */
|
|
@@ -137,14 +172,17 @@ function matching(filter: string, from: SlashCommand[]): SlashCommand[] {
|
|
|
137
172
|
/** What the panel should be showing, from the state above. */
|
|
138
173
|
function view(): SlashMenuView {
|
|
139
174
|
const rect = _anchorRect;
|
|
175
|
+
const rows = filteredItems.map((cmd, index): SlashMenuRow => ({
|
|
176
|
+
description: cmd.description,
|
|
177
|
+
index,
|
|
178
|
+
key: cmd.tag,
|
|
179
|
+
label: cmd.label,
|
|
180
|
+
}));
|
|
140
181
|
return {
|
|
141
182
|
activeIndex: activeIdx,
|
|
142
183
|
filter: filterText,
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
key: cmd.tag,
|
|
146
|
-
label: cmd.label,
|
|
147
|
-
})),
|
|
184
|
+
groups: groupsOf(rows, filteredItems),
|
|
185
|
+
rows,
|
|
148
186
|
showFilter,
|
|
149
187
|
// The gap between the anchor and the panel is the `--jx-popover-offset` token the element
|
|
150
188
|
// Already applies, so this is the anchor's own edge rather than an edge plus a guess.
|
|
@@ -168,7 +206,7 @@ function showAt(
|
|
|
168
206
|
callbacks = cbs;
|
|
169
207
|
_anchorRect = rect;
|
|
170
208
|
|
|
171
|
-
filteredItems = matching(filter, cbs.commands ||
|
|
209
|
+
filteredItems = matching(filter, cbs.commands || standardCommands());
|
|
172
210
|
|
|
173
211
|
if (filteredItems.length === 0 && !cbs.showFilter) {
|
|
174
212
|
dismissSlashMenu();
|
|
@@ -30,13 +30,14 @@
|
|
|
30
30
|
* paths only — a `.json` or `.md` file is never loaded by URL from the canvas, and leaving them out
|
|
31
31
|
* keeps that message as small as the media set.
|
|
32
32
|
*
|
|
33
|
-
* Pure module state — it imports nothing but path normalization
|
|
34
|
-
* the canvas host can import it without dragging in the file layer.
|
|
33
|
+
* Pure module state — it imports nothing but path normalization, the primitive guards and the
|
|
34
|
+
* reactivity re-export — so the canvas host can import it without dragging in the file layer.
|
|
35
35
|
*
|
|
36
36
|
* @docs extending/embedding/platform-adapter
|
|
37
37
|
*/
|
|
38
38
|
|
|
39
39
|
import { normalizeProjectPath } from "@jxsuite/schema/asset-paths";
|
|
40
|
+
import { isString } from "@jxsuite/schema/guards";
|
|
40
41
|
import { shallowRef } from "../reactivity";
|
|
41
42
|
import type { DirEntry } from "../types";
|
|
42
43
|
|
|
@@ -161,8 +162,7 @@ export function noteListing(entries: readonly DirEntry[], since: number): void {
|
|
|
161
162
|
if (path === "" || dirtiedSince(path, since)) {
|
|
162
163
|
continue;
|
|
163
164
|
}
|
|
164
|
-
const version =
|
|
165
|
-
typeof entry.version === "string" && entry.version !== "" ? entry.version : null;
|
|
165
|
+
const version = isString(entry.version) && entry.version !== "" ? entry.version : null;
|
|
166
166
|
const held = versions.get(path);
|
|
167
167
|
if (version === null) {
|
|
168
168
|
if (held === undefined) {
|