@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
|
@@ -42,10 +42,11 @@
|
|
|
42
42
|
*/
|
|
43
43
|
|
|
44
44
|
import { nothing } from "lit-html";
|
|
45
|
-
import {
|
|
45
|
+
import { getNodeAtPath } from "@jxsuite/schema/doc-ops";
|
|
46
|
+
import { getEventBinding, isExpressionDef, isJsonObject, isString } from "@jxsuite/schema/guards";
|
|
46
47
|
|
|
47
48
|
import { effect, effectScope, shallowRef } from "../reactivity";
|
|
48
|
-
import {
|
|
49
|
+
import { updateUi } from "../store";
|
|
49
50
|
import { activeTab } from "../workspace/workspace";
|
|
50
51
|
import { mutateAddDef, mutateUpdateDef, mutateUpdateProperty, transactDoc } from "../tabs/transact";
|
|
51
52
|
import { setBottomTab } from "../shell";
|
|
@@ -69,14 +70,19 @@ import {
|
|
|
69
70
|
stringProperty,
|
|
70
71
|
} from "../commands/command-args";
|
|
71
72
|
|
|
72
|
-
import type { JxNodeValue } from "../tabs/transact";
|
|
73
73
|
import type { AnyCommand, CommandRegistry } from "../commands/registry";
|
|
74
74
|
import type { PanelBody } from "./panel-registry";
|
|
75
75
|
import type { ExpressionPreview } from "../services/preview-eval";
|
|
76
|
-
import type { FormulaEditDef, FunctionEditDef
|
|
76
|
+
import type { FormulaEditDef, FunctionEditDef } from "../types";
|
|
77
77
|
import type { Tab } from "../tabs/tab";
|
|
78
|
-
import type {
|
|
78
|
+
import type {
|
|
79
|
+
JsonObject,
|
|
80
|
+
JsonValue,
|
|
81
|
+
JxEventBinding,
|
|
82
|
+
JxStateDefinition,
|
|
83
|
+
} from "@jxsuite/schema/types";
|
|
79
84
|
import type { EffectScope } from "@vue/reactivity";
|
|
85
|
+
import type { ScopeValue } from "../editor/merge-tags";
|
|
80
86
|
import type {
|
|
81
87
|
LogicChipView,
|
|
82
88
|
LogicScopeEntryView,
|
|
@@ -125,10 +131,10 @@ export function logicTarget(tab: Tab | null = activeTab.value): LogicTarget | nu
|
|
|
125
131
|
return null;
|
|
126
132
|
}
|
|
127
133
|
if (ui.editingFunction) {
|
|
128
|
-
return { editing: ui.editingFunction
|
|
134
|
+
return { editing: ui.editingFunction, surface: "function" };
|
|
129
135
|
}
|
|
130
136
|
if (ui.editingFormula) {
|
|
131
|
-
return { editing: ui.editingFormula
|
|
137
|
+
return { editing: ui.editingFormula, surface: "formula" };
|
|
132
138
|
}
|
|
133
139
|
return null;
|
|
134
140
|
}
|
|
@@ -176,25 +182,35 @@ export function openLogicTarget(target: LogicTarget): void {
|
|
|
176
182
|
revealLogicPanel();
|
|
177
183
|
}
|
|
178
184
|
|
|
179
|
-
|
|
180
|
-
|
|
185
|
+
/** An expression node: a plain object naming its `operator`. */
|
|
186
|
+
function isExprNode(value: JsonValue | undefined): value is JsonObject {
|
|
187
|
+
return isJsonObject(value) && isString(value.operator);
|
|
181
188
|
}
|
|
182
189
|
|
|
183
190
|
// ─── Document access ─────────────────────────────────────────────────────────
|
|
184
191
|
|
|
192
|
+
/**
|
|
193
|
+
* The `$expression` of an expression entry or binding, as the JSON object it is; null for anything
|
|
194
|
+
* else. `isExpressionDef` has already checked it is a plain object, and the guard carries that to
|
|
195
|
+
* the type.
|
|
196
|
+
*/
|
|
197
|
+
function expressionOf(value: JxStateDefinition | JxEventBinding | undefined): JsonObject | null {
|
|
198
|
+
if (!isExpressionDef(value)) {
|
|
199
|
+
return null;
|
|
200
|
+
}
|
|
201
|
+
const { $expression } = value;
|
|
202
|
+
return isJsonObject($expression) ? $expression : null;
|
|
203
|
+
}
|
|
204
|
+
|
|
185
205
|
/** Read the workspace target's current root expression node from the document. */
|
|
186
|
-
export function formulaRoot(tab: Tab, editing: FormulaEditDef):
|
|
206
|
+
export function formulaRoot(tab: Tab, editing: FormulaEditDef): JsonObject | null {
|
|
187
207
|
const { document } = tab.doc;
|
|
188
208
|
if (editing.type === "def" && editing.defName) {
|
|
189
|
-
|
|
190
|
-
return isExpressionDef(def) ? (def.$expression as unknown as Record<string, unknown>) : null;
|
|
209
|
+
return expressionOf(document.state?.[editing.defName]);
|
|
191
210
|
}
|
|
192
211
|
if (editing.type === "event" && editing.path && editing.eventKey) {
|
|
193
212
|
const node = getNodeAtPath(document, editing.path);
|
|
194
|
-
|
|
195
|
-
return isExpressionDef(binding)
|
|
196
|
-
? (binding.$expression as unknown as Record<string, unknown>)
|
|
197
|
-
: null;
|
|
213
|
+
return expressionOf(node ? getEventBinding(node, editing.eventKey) : undefined);
|
|
198
214
|
}
|
|
199
215
|
return null;
|
|
200
216
|
}
|
|
@@ -203,18 +219,18 @@ export function formulaRoot(tab: Tab, editing: FormulaEditDef): Record<string, u
|
|
|
203
219
|
* Resolve a chip selection to its editable node: the deepest expression-node prefix of `path` (head
|
|
204
220
|
* chips target ref/literal operands; stale paths fall back toward the root).
|
|
205
221
|
*/
|
|
206
|
-
function resolveSelection(
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
): { node: Record<string, unknown>; path: NodePath } {
|
|
210
|
-
let current: unknown = root;
|
|
211
|
-
let node: Record<string, unknown> = root;
|
|
222
|
+
function resolveSelection(root: JsonObject, path: NodePath) {
|
|
223
|
+
let current: JsonValue | undefined = root;
|
|
224
|
+
let node = root;
|
|
212
225
|
let nodePath: NodePath = [];
|
|
213
226
|
for (const [i, seg] of path.entries()) {
|
|
214
|
-
if (
|
|
227
|
+
if (Array.isArray(current)) {
|
|
228
|
+
current = current[Number(seg)];
|
|
229
|
+
} else if (isJsonObject(current)) {
|
|
230
|
+
current = current[String(seg)];
|
|
231
|
+
} else {
|
|
215
232
|
break;
|
|
216
233
|
}
|
|
217
|
-
current = (current as Record<string, unknown>)[seg as keyof typeof current];
|
|
218
234
|
if (isExprNode(current)) {
|
|
219
235
|
node = current;
|
|
220
236
|
nodePath = path.slice(0, i + 1);
|
|
@@ -224,30 +240,28 @@ function resolveSelection(
|
|
|
224
240
|
}
|
|
225
241
|
|
|
226
242
|
/** Immutably replace the value at `path` within `node` (object keys / array indexes). */
|
|
227
|
-
function replaceAtPath(node:
|
|
228
|
-
|
|
243
|
+
function replaceAtPath(node: JsonValue | undefined, path: NodePath, value: JsonValue): JsonValue {
|
|
244
|
+
const [head, ...rest] = path;
|
|
245
|
+
if (head === undefined) {
|
|
229
246
|
return value;
|
|
230
247
|
}
|
|
231
|
-
const [head, ...rest] = path as [string | number, ...NodePath];
|
|
232
248
|
if (Array.isArray(node)) {
|
|
233
|
-
const copy = [...
|
|
249
|
+
const copy = [...node];
|
|
234
250
|
copy[Number(head)] = replaceAtPath(copy[Number(head)], rest, value);
|
|
235
251
|
return copy;
|
|
236
252
|
}
|
|
237
|
-
const base:
|
|
238
|
-
return { ...base, [head]: replaceAtPath(base[head
|
|
253
|
+
const base: JsonObject = isJsonObject(node) ? node : {};
|
|
254
|
+
return { ...base, [head]: replaceAtPath(base[head], rest, value) };
|
|
239
255
|
}
|
|
240
256
|
|
|
241
257
|
/** Write the whole updated root node back to the document position (one undo step). */
|
|
242
|
-
function writeRoot(tab: Tab, editing: FormulaEditDef, newRoot:
|
|
258
|
+
function writeRoot(tab: Tab, editing: FormulaEditDef, newRoot: JsonValue) {
|
|
243
259
|
if (editing.type === "def" && editing.defName) {
|
|
244
260
|
const { defName } = editing;
|
|
245
|
-
transactDoc(tab, (t) => mutateUpdateDef(t, defName, { $expression: newRoot
|
|
261
|
+
transactDoc(tab, (t) => mutateUpdateDef(t, defName, { $expression: newRoot }));
|
|
246
262
|
} else if (editing.type === "event" && editing.path && editing.eventKey) {
|
|
247
263
|
const { eventKey, path } = editing;
|
|
248
|
-
transactDoc(tab, (t) =>
|
|
249
|
-
mutateUpdateProperty(t, path, eventKey, { $expression: newRoot } as JxNodeValue),
|
|
250
|
-
);
|
|
264
|
+
transactDoc(tab, (t) => mutateUpdateProperty(t, path, eventKey, { $expression: newRoot }));
|
|
251
265
|
}
|
|
252
266
|
}
|
|
253
267
|
|
|
@@ -288,15 +302,14 @@ function selectionKey(editing: FormulaEditDef): string {
|
|
|
288
302
|
*
|
|
289
303
|
* The document reports a chip by its key and a button by nothing at all, so the objects behind them
|
|
290
304
|
* — the tab, the target, the root node, the sub-node a commit replaces — live here, rewritten by
|
|
291
|
-
* every projection. Held rather than recomputed at click time
|
|
292
|
-
*
|
|
293
|
-
* document for the rest of the window.
|
|
305
|
+
* every projection. Held rather than recomputed at click time because a callback captured at mount
|
|
306
|
+
* would reach the FIRST projection's document for the rest of the window.
|
|
294
307
|
*/
|
|
295
308
|
interface Resolved {
|
|
296
309
|
tab: Tab;
|
|
297
310
|
editing: FormulaEditDef;
|
|
298
|
-
root:
|
|
299
|
-
selected:
|
|
311
|
+
root: JsonObject;
|
|
312
|
+
selected: JsonObject;
|
|
300
313
|
selectedPath: NodePath;
|
|
301
314
|
stateEntries: Record<string, JxStateDefinition>;
|
|
302
315
|
preview: ExpressionPreview | null;
|
|
@@ -304,19 +317,27 @@ interface Resolved {
|
|
|
304
317
|
/** Chip key → node path, so a chip click needs no path parsing (a `switch` case may hold "/"). */
|
|
305
318
|
chipPaths: Map<string, NodePath>;
|
|
306
319
|
/** Rail entry name → the value its tree draws. */
|
|
307
|
-
scopeValues: Map<string,
|
|
320
|
+
scopeValues: Map<string, ScopeValue>;
|
|
308
321
|
}
|
|
309
322
|
|
|
310
323
|
let _resolved: Resolved | null = null;
|
|
311
324
|
|
|
312
|
-
/**
|
|
313
|
-
|
|
325
|
+
/**
|
|
326
|
+
* Replace the selected sub-node inside the root and write the whole root back.
|
|
327
|
+
*
|
|
328
|
+
* Typed as the expression editor's own change callback, which is one of its two callers; the other
|
|
329
|
+
* is a catalog pick's `onChange`.
|
|
330
|
+
*/
|
|
331
|
+
const writeSelected: Parameters<typeof mountExpressionEditor>[2] = (next) => {
|
|
314
332
|
const held = _resolved;
|
|
315
333
|
if (!held) {
|
|
316
334
|
return;
|
|
317
335
|
}
|
|
318
|
-
|
|
319
|
-
|
|
336
|
+
/* SAFETY: both callers hand back an expression node built of JSON operator/operand values: the
|
|
337
|
+
expression editor's edited tree, and the node a catalog pick inserts (a JxExpressionNode). */
|
|
338
|
+
const node = next as JsonValue;
|
|
339
|
+
writeRoot(held.tab, held.editing, replaceAtPath(held.root, held.selectedPath, node));
|
|
340
|
+
};
|
|
320
341
|
|
|
321
342
|
// ─── The projection ──────────────────────────────────────────────────────────
|
|
322
343
|
|
|
@@ -354,13 +375,13 @@ function resultOf(
|
|
|
354
375
|
}
|
|
355
376
|
|
|
356
377
|
/** The live data context — a SECOND opinion now that the page itself is on screen, not the only one. */
|
|
357
|
-
function railOf(scope:
|
|
358
|
-
entries: LogicScopeEntryView[];
|
|
359
|
-
values: Map<string, unknown>;
|
|
360
|
-
} {
|
|
378
|
+
function railOf(scope: Tab["session"]["canvas"]["scope"] | undefined) {
|
|
361
379
|
const entries: LogicScopeEntryView[] = [];
|
|
362
|
-
const values = new Map<string,
|
|
363
|
-
|
|
380
|
+
const values = new Map<string, ScopeValue>();
|
|
381
|
+
/* SAFETY: the canvas scope's one writer (iframe-host.ts, on a `dataScope` message) stores that
|
|
382
|
+
message's `scope`, a JsonObject of deep-cloned values (serialize-scope.ts). */
|
|
383
|
+
const snapshot = (scope ?? {}) as JsonObject;
|
|
384
|
+
for (const [name, value] of Object.entries(snapshot)) {
|
|
364
385
|
entries.push({ key: name, name, type: dataTypeLabel(value) });
|
|
365
386
|
values.set(name, unwrapSignal(value));
|
|
366
387
|
}
|
|
@@ -422,7 +443,7 @@ export function workspaceView(): LogicWorkspaceView {
|
|
|
422
443
|
};
|
|
423
444
|
}
|
|
424
445
|
|
|
425
|
-
const stateEntries =
|
|
446
|
+
const stateEntries = tab.doc.document.state ?? {};
|
|
426
447
|
/* Live-context evaluation in the canvas iframe with snapshot fallback (M6). The canvas is no
|
|
427
448
|
longer unmounted while this surface is open — that is the entire point of the move — so the
|
|
428
449
|
live path is the ORDINARY case now rather than the one that never happened. An event target's
|
|
@@ -595,7 +616,10 @@ const ACTIONS: LogicWorkspaceActions = {
|
|
|
595
616
|
};
|
|
596
617
|
|
|
597
618
|
/** Vendor a packaged formula's state entry into the document, as one undo step. */
|
|
598
|
-
function insertDef(defName: string, def:
|
|
619
|
+
function insertDef(defName: string, def: JxStateDefinition): void {
|
|
620
|
+
/* SAFETY: the only def the editor and the catalog insert is a packaged formula's vendored entry
|
|
621
|
+
(formula-catalog.ts `ensure`): `$description`, `$expression` and `parameters`, all JSON from
|
|
622
|
+
@jxsuite/formulas. */
|
|
599
623
|
transactDoc(activeTab.value, (t) => mutateAddDef(t, defName, def as Record<string, JsonValue>));
|
|
600
624
|
}
|
|
601
625
|
|
|
@@ -750,7 +774,7 @@ export function formulaEditorCommands(): AnyCommand[] {
|
|
|
750
774
|
if (!tab) {
|
|
751
775
|
throw new RangeError(`command "formula.editDef" needs an open document`);
|
|
752
776
|
}
|
|
753
|
-
const defs = tab.doc.document
|
|
777
|
+
const defs = tab.doc.document.state ?? {};
|
|
754
778
|
if (!(defName in defs)) {
|
|
755
779
|
const defined = Object.keys(defs);
|
|
756
780
|
throw new RangeError(
|
|
@@ -9,17 +9,18 @@
|
|
|
9
9
|
*
|
|
10
10
|
* {@link projectFmField} is the half that says WHAT ONE OF THEM LOOKS LIKE — which control it draws,
|
|
11
11
|
* what that control currently holds, and how to read the control's answer back into a frontmatter
|
|
12
|
-
* value. It is a projection rather than a renderer, and that is the whole of why it lives here:
|
|
13
|
-
*
|
|
14
|
-
* `src/surfaces/
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
12
|
+
* value. It is a projection rather than a renderer, and that is the whole of why it lives here: the
|
|
13
|
+
* surface that edits frontmatter is a Jx document (the Inspector's Page tab,
|
|
14
|
+
* `src/surfaces/panel-page.json`), and a document draws its own markup. What it must not decide for
|
|
15
|
+
* itself is that a `$ref` field is a picker, that `"uri-reference"` is a media format, or that an
|
|
16
|
+
* array is a comma-separated line — so it does not: it asks here and draws the answer. (The
|
|
17
|
+
* Document Header card that once drew the same rows above the canvas is gone, studio.md §4.2.)
|
|
18
18
|
*
|
|
19
19
|
* It replaces `renderFmField`, which was a lit template and could therefore only ever have ONE of
|
|
20
20
|
* the two hosts. The Page panel was the last one, and the renderer went with it.
|
|
21
21
|
*/
|
|
22
22
|
|
|
23
|
+
import { isBoolean, isString } from "@jxsuite/schema/guards";
|
|
23
24
|
import { previewAssetSrc } from "../canvas/asset-refs";
|
|
24
25
|
import { IMAGE_EXTENSIONS, extensionOf } from "../files/media-upload";
|
|
25
26
|
import { referenceEntryState } from "../ui/form-controls";
|
|
@@ -29,12 +30,14 @@ import { referenceTarget } from "../ui/schema-form";
|
|
|
29
30
|
import type { JsonValue } from "../types";
|
|
30
31
|
import type { Tab } from "../tabs/tab";
|
|
31
32
|
import type { ProjectConfig } from "@jxsuite/schema/types";
|
|
33
|
+
import type { SurfaceOption } from "../ui/surface";
|
|
32
34
|
|
|
33
35
|
export interface FmSchemaEntry {
|
|
34
36
|
type?: string;
|
|
35
37
|
enum?: string[];
|
|
36
38
|
format?: string;
|
|
37
|
-
|
|
39
|
+
/** A nested object field's own field schemas. */
|
|
40
|
+
properties?: Record<string, FmSchemaEntry>;
|
|
38
41
|
/** `#/content/<type>` — a relationship to another collection (site-architecture.md §6.1). */
|
|
39
42
|
$ref?: string;
|
|
40
43
|
}
|
|
@@ -42,7 +45,8 @@ export interface FmSchemaEntry {
|
|
|
42
45
|
export interface FmField {
|
|
43
46
|
field: string;
|
|
44
47
|
entry: FmSchemaEntry;
|
|
45
|
-
|
|
48
|
+
/** What the document holds under the key; `undefined` for a schema field it does not set. */
|
|
49
|
+
value: JsonValue | undefined;
|
|
46
50
|
}
|
|
47
51
|
|
|
48
52
|
export interface FmFieldSet {
|
|
@@ -62,16 +66,23 @@ export interface FmFieldSet {
|
|
|
62
66
|
*
|
|
63
67
|
* @param {Tab} tab
|
|
64
68
|
* @param {ProjectConfig | null | undefined} projectConfig
|
|
65
|
-
* @param {
|
|
69
|
+
* @param {ReadonlySet<string>} reserved — keys managed by dedicated controls elsewhere
|
|
66
70
|
* @returns {FmFieldSet}
|
|
67
71
|
*/
|
|
68
72
|
export function collectFmFields(
|
|
69
73
|
tab: Tab,
|
|
70
74
|
projectConfig: ProjectConfig | null | undefined,
|
|
71
|
-
reserved:
|
|
75
|
+
reserved: ReadonlySet<string>,
|
|
72
76
|
): FmFieldSet {
|
|
73
|
-
|
|
77
|
+
/* SAFETY: `FormatFrontmatter` holds `JxDocumentValue`, which is the JSON value space seen through
|
|
78
|
+
the typed interfaces a document's declared keys use (JxRef, JxStatement, CemEvent, ...). Every
|
|
79
|
+
frontmatter value is parsed from the file by a format class's split or JSON-cloned from one, so
|
|
80
|
+
each is plain JSON data, and viewing it as JsonValue reads the same data without those views. */
|
|
81
|
+
const fm = tab.doc.content.frontmatter as Record<string, JsonValue | undefined>;
|
|
74
82
|
const collection = findContentTypeSchema(tab.documentPath, projectConfig);
|
|
83
|
+
/* SAFETY: a collection schema is JSON Schema, and the only keywords an FmSchemaEntry reads —
|
|
84
|
+
`type`, `format`, `$ref` (strings) and `enum` (a list of choices) — carry those shapes there;
|
|
85
|
+
`required` is already typed `string[]` on ContentTypeSchema. */
|
|
75
86
|
const schema = collection?.schema as
|
|
76
87
|
| { properties?: Record<string, FmSchemaEntry>; required?: string[] }
|
|
77
88
|
| undefined;
|
|
@@ -84,16 +95,16 @@ export function collectFmFields(
|
|
|
84
95
|
if (reserved.has(field)) {
|
|
85
96
|
continue;
|
|
86
97
|
}
|
|
87
|
-
fields.push({ entry: fieldSchema, field, value: fm[field]
|
|
98
|
+
fields.push({ entry: fieldSchema, field, value: fm[field] });
|
|
88
99
|
}
|
|
89
100
|
for (const [field, value] of Object.entries(fm)) {
|
|
90
101
|
if (schemaProps[field] || field.startsWith("$") || reserved.has(field)) {
|
|
91
102
|
continue;
|
|
92
103
|
}
|
|
93
104
|
fields.push({
|
|
94
|
-
entry: { type:
|
|
105
|
+
entry: { type: isBoolean(value) ? "boolean" : "string" },
|
|
95
106
|
field,
|
|
96
|
-
value
|
|
107
|
+
value,
|
|
97
108
|
});
|
|
98
109
|
}
|
|
99
110
|
} else {
|
|
@@ -102,9 +113,9 @@ export function collectFmFields(
|
|
|
102
113
|
continue;
|
|
103
114
|
}
|
|
104
115
|
fields.push({
|
|
105
|
-
entry: { type:
|
|
116
|
+
entry: { type: isBoolean(value) ? "boolean" : "string" },
|
|
106
117
|
field,
|
|
107
|
-
value
|
|
118
|
+
value,
|
|
108
119
|
});
|
|
109
120
|
}
|
|
110
121
|
}
|
|
@@ -112,12 +123,6 @@ export function collectFmFields(
|
|
|
112
123
|
return { collection, fields, hasSchema: Boolean(schemaProps), requiredFields };
|
|
113
124
|
}
|
|
114
125
|
|
|
115
|
-
/** One choice in a row's picker — the shape `jx-select` reads. */
|
|
116
|
-
export interface FmChoice {
|
|
117
|
-
value: string;
|
|
118
|
-
label: string;
|
|
119
|
-
}
|
|
120
|
-
|
|
121
126
|
/**
|
|
122
127
|
* One frontmatter field as a surface draws it. Every field is present whatever the `kind`, because
|
|
123
128
|
* a document's binding renders a value and its `$switch` chooses on one: a row that omitted
|
|
@@ -140,7 +145,7 @@ export interface FmRowView {
|
|
|
140
145
|
/** A text row's placeholder. Empty draws none. */
|
|
141
146
|
placeholder: string;
|
|
142
147
|
/** A picker's rows, in the order they are offered. Empty on every other kind. */
|
|
143
|
-
options:
|
|
148
|
+
options: SurfaceOption[];
|
|
144
149
|
/** A sentence under the control — an empty collection, or a listing that failed. */
|
|
145
150
|
note: string;
|
|
146
151
|
/** Whether {@link FmRowView.note} has anything in it; `$switch` is a document's conditional. */
|
|
@@ -162,8 +167,8 @@ export interface FmRowProjection {
|
|
|
162
167
|
}
|
|
163
168
|
|
|
164
169
|
/** A frontmatter value as the text a field shows. An object is not a string and never pretends. */
|
|
165
|
-
function text(value:
|
|
166
|
-
return
|
|
170
|
+
function text(value: JsonValue | undefined): string {
|
|
171
|
+
return isString(value) ? value : "";
|
|
167
172
|
}
|
|
168
173
|
|
|
169
174
|
/** A blank row, so every kind carries every field a surface's bindings read. */
|
|
@@ -188,7 +193,7 @@ function blankRow(label: string): FmRowView {
|
|
|
188
193
|
*
|
|
189
194
|
* @param {string} field The frontmatter key.
|
|
190
195
|
* @param {FmSchemaEntry} entry Its schema, or the type inferred from the value it already holds.
|
|
191
|
-
* @param {
|
|
196
|
+
* @param {JsonValue | undefined} value What the document says today.
|
|
192
197
|
* @param {Set<string>} requiredFields The collection's required keys, for the label's marker.
|
|
193
198
|
* @param {{ rerender: () => void }} opts How a surface is repainted when a referenced collection's
|
|
194
199
|
* entry ids land — the one asynchronous read a row can start.
|
|
@@ -197,7 +202,7 @@ function blankRow(label: string): FmRowView {
|
|
|
197
202
|
export function projectFmField(
|
|
198
203
|
field: string,
|
|
199
204
|
entry: FmSchemaEntry,
|
|
200
|
-
value:
|
|
205
|
+
value: JsonValue | undefined,
|
|
201
206
|
requiredFields: Set<string>,
|
|
202
207
|
opts: { rerender: () => void },
|
|
203
208
|
): FmRowProjection {
|
|
@@ -294,7 +299,7 @@ export function projectFmField(
|
|
|
294
299
|
return {
|
|
295
300
|
parse: (raw) => {
|
|
296
301
|
/* NaN is deleted rather than written. The two surfaces this replaced disagreed here: the
|
|
297
|
-
Page panel's `spNumberField` refused a non-number and the Document Header card wrote
|
|
302
|
+
Page panel's `spNumberField` refused a non-number and the old Document Header card wrote
|
|
298
303
|
`NaN` into the frontmatter, where it round-trips to `null`. One answer, and it is the
|
|
299
304
|
one that cannot corrupt the document. */
|
|
300
305
|
const trimmed = String(raw).trim();
|
|
@@ -130,10 +130,14 @@ export function openDiffTab(path: string): Tab {
|
|
|
130
130
|
* leave the comparison for Design without reopening anything; a file it cannot gets the stub tab
|
|
131
131
|
* above. Both are keyed by the path, so §14.1 holds either way — one path, one tab.
|
|
132
132
|
*
|
|
133
|
-
* `
|
|
134
|
-
*
|
|
135
|
-
*
|
|
136
|
-
*
|
|
133
|
+
* The document tab opens IN `git-diff`, and an already-open one is moved into it before it is
|
|
134
|
+
* revealed: a comparison belongs to Publish (studio.md §22.1), and a tab activated in its edit mode
|
|
135
|
+
* would enter Design, frame and all, for the moment before the mode followed.
|
|
136
|
+
*
|
|
137
|
+
* `files/files.ts` is imported dynamically because it imports `cleanupSourceControl` from
|
|
138
|
+
* `publish/source-control.ts`, which imports this module: a static edge back would close that
|
|
139
|
+
* cycle. `openFileInTab` answers `void` whether it opens a new tab or reveals one that was already
|
|
140
|
+
* open, so the tab is resolved from the workspace by its path.
|
|
137
141
|
*
|
|
138
142
|
* Answers null when the file could not be opened at all, which the caller states rather than
|
|
139
143
|
* silently leaving the stage on someone else's document.
|
|
@@ -143,6 +147,6 @@ export async function openComparisonTab(path: string): Promise<Tab | null> {
|
|
|
143
147
|
return openDiffTab(path);
|
|
144
148
|
}
|
|
145
149
|
const files = await import("../files/files");
|
|
146
|
-
|
|
147
|
-
return
|
|
150
|
+
await files.openFileInTab(path, { canvasMode: "git-diff" });
|
|
151
|
+
return [...workspace.tabs.values()].find((tab) => tab.documentPath === path) ?? null;
|
|
148
152
|
}
|