@jxsuite/studio 6.1.2 → 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/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-0fj8a4ga.js → color-area-6rbra5dy.js} +2 -2
- package/dist/chunks/{color-field-xch8kx2g.js → color-field-gy56c94g.js} +3 -3
- package/dist/chunks/color-m7r1vk54.js +4 -0
- package/dist/chunks/{color-slider-jxd8v350.js → color-slider-sqqdyf6c.js} +2 -2
- package/dist/chunks/{combobox-p0efwjke.js → combobox-72h32ejk.js} +3 -3
- 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/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-d2wq9ezg.js → grid-view-qg1b5eqx.js} +25 -25
- package/dist/chunks/{icons-pnfz478q.js → icons-63bjtbs7.js} +2 -2
- package/dist/chunks/{iframe-entry-jdcktez8.js → iframe-entry-2zggzajv.js} +4 -4
- package/dist/chunks/{iframe-entry-zap785cw.js → iframe-entry-76j8vwwx.js} +4 -4
- package/dist/chunks/iframe-entry-99nr5zfb.js +5 -0
- package/dist/chunks/{iframe-entry-x0ygf2yr.js → iframe-entry-pkgmcgp0.js} +4 -4
- package/dist/chunks/iframe-host-ssv7kyj0.js +4 -0
- package/dist/chunks/{index-zpjmzqfk.js → index-32eqzv1k.js} +3 -3
- package/dist/chunks/index-f0jn7nnp.js +4 -0
- package/dist/chunks/{javascript-m54mnwp6.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-e74qjyq6.js → listbox-c421cf8c.js} +2 -2
- 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-n6yzswmy.js → menu-bdpzbfvs.js} +2 -2
- package/dist/chunks/{monaco-binding-7gx83x3r.js → monaco-binding-vq1hgnn0.js} +3 -3
- 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/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/source-control-kwktr9y6.js +4 -0
- package/dist/chunks/{split-n2gfpm5m.js → split-c9zfdgxf.js} +2 -2
- 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-2j1cb95x.js → studio-6m380wp7.js} +4 -4
- package/dist/chunks/studio-80jyh1xh.js +4 -0
- package/dist/chunks/studio-83mk4bgg.js +9 -0
- package/dist/chunks/{studio-v0jzqdjm.js → studio-881z1xrx.js} +4 -4
- package/dist/chunks/studio-8m0y2qe7.js +5 -0
- package/dist/chunks/{studio-d81xfh1g.js → studio-8tr6cfrc.js} +4 -4
- 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-dgz8d0c1.js → studio-bbe4c90a.js} +4 -4
- 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-90pq9km1.js → studio-jcnsdaep.js} +4 -4
- package/dist/chunks/studio-jsgf2q5k.js +7 -0
- package/dist/chunks/{studio-0q988f9w.js → studio-k3xxbagr.js} +3 -3
- package/dist/chunks/{studio-5ve6bbep.js → studio-k7evxqh4.js} +4 -4
- 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-485046te.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-1fxkaaea.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-tq0rtfwj.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-a3g98wjr.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-r5qy30vx.js +5 -0
- 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/toast-1gv0h53h.js +4 -0
- package/dist/chunks/{toast-host-ke5z4ng7.js → toast-host-1yg5ar8d.js} +3 -3
- package/dist/chunks/{tooltip-5v8ngwj2.js → tooltip-yypz28gq.js} +3 -3
- package/dist/chunks/{tree-mdq3v5cw.js → tree-9xa4hm7n.js} +2 -2
- 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-nze0k6mv.js → ws-client-bv552sfx.js} +3 -3
- package/dist/iframe-entry.js +20 -16
- package/dist/manifest.json +77 -63
- package/dist/studio.js +103 -104
- package/dist/workers/ts.worker.js +3 -3
- package/package.json +12 -11
- package/src/browse/component-examples.ts +272 -0
- package/src/browse/library-commands.ts +64 -104
- package/src/browse/library-layouts.ts +263 -49
- package/src/browse/library-model.ts +181 -133
- package/src/browse/library-pane.ts +738 -446
- package/src/browse/library-preview.ts +149 -19
- 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 +16 -1
- package/src/canvas/canvas-live-render.ts +222 -30
- package/src/canvas/canvas-origin.ts +37 -12
- package/src/canvas/canvas-page-context.ts +112 -0
- package/src/canvas/canvas-render.ts +113 -107
- package/src/canvas/canvas-utils.ts +57 -12
- package/src/canvas/iframe-drop.ts +107 -0
- package/src/canvas/iframe-entry.ts +24 -12
- package/src/canvas/iframe-host.ts +134 -62
- package/src/canvas/iframe-keys.ts +11 -0
- package/src/canvas/iframe-patch.ts +8 -7
- package/src/canvas/iframe-protocol.ts +24 -5
- package/src/canvas/iframe-render.ts +48 -1
- package/src/canvas/iframe-subtree.ts +5 -2
- package/src/canvas/npm-modules.ts +22 -0
- package/src/canvas/preview-navigate.ts +16 -0
- package/src/canvas/repeater-sources.ts +200 -0
- package/src/canvas/stage-scrollbar.ts +5 -1
- package/src/canvas/surface-registry.ts +6 -0
- package/src/commands/app-commands.ts +16 -6
- package/src/commands/budget.ts +10 -8
- package/src/commands/context.ts +35 -10
- package/src/commands/defaults.ts +69 -45
- package/src/commands/keymap.ts +9 -0
- package/src/commands/levels.ts +11 -5
- package/src/commands/live-context.ts +2 -0
- package/src/commands/registry.ts +10 -1
- package/src/content/collection-match.ts +6 -5
- package/src/content/collection-pages.ts +412 -0
- package/src/content/content-collections.ts +270 -0
- package/src/content/entry-commands.ts +51 -60
- package/src/content/entry-editor.ts +111 -18
- package/src/content/entry-fields.ts +13 -1
- package/src/content/entry-inspector.ts +225 -0
- package/src/content/entry-model.ts +17 -3
- 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/convert-to-component.ts +67 -43
- package/src/editor/file-drop-action.ts +9 -1
- package/src/editor/inline-edit-apply.ts +44 -0
- package/src/editor/inline-edit.ts +10 -0
- package/src/editor/insert-component.ts +91 -0
- package/src/editor/insert-zone-action.ts +13 -4
- package/src/editor/shortcuts.ts +44 -22
- package/src/editor/slash-menu.ts +51 -8
- package/src/files/components.ts +74 -10
- package/src/files/file-ops.ts +15 -5
- package/src/files/files.ts +164 -150
- package/src/files/fs-events.ts +18 -7
- package/src/files/media-meta.ts +95 -1
- 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 +13 -3
- package/src/format/format-host.ts +15 -0
- package/src/github/github-auth.ts +2 -2
- package/src/github/github-publish.ts +4 -3
- package/src/grid/grid-controller.ts +5 -1
- package/src/grid/grid-open.ts +0 -27
- package/src/grid/grid-panel.ts +54 -2
- package/src/grid/grid-reveal.ts +34 -0
- package/src/grid/grid-source.ts +3 -25
- package/src/grid/grid-view.ts +31 -6
- package/src/grid/sources/content-source.ts +75 -7
- package/src/grid/tabulator-tables.d.ts +6 -0
- package/src/hosting/document.ts +2 -2
- package/src/i18n/i18n-commands.ts +2 -1
- 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 +47 -19
- package/src/packages/pull-package-sync.ts +1 -1
- package/src/panels/activity-panel.ts +21 -5
- package/src/panels/ai-chat/chat-markdown.ts +8 -8
- package/src/panels/block-action-bar.ts +11 -11
- package/src/panels/canvas-dnd-bridge.ts +5 -2
- 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 +1 -1
- package/src/panels/data-grid.ts +4 -0
- package/src/panels/dnd.ts +17 -30
- package/src/panels/elements-panel.ts +9 -2
- package/src/panels/empty-state.ts +2 -2
- package/src/panels/formula-workspace.ts +2 -3
- package/src/panels/frontmatter-fields.ts +9 -9
- package/src/panels/git-diff-open.ts +9 -5
- package/src/panels/head-panel.ts +369 -103
- package/src/panels/i18n-panel.ts +11 -10
- package/src/panels/imports-panel.ts +2 -0
- package/src/panels/jump-bar.ts +27 -2
- package/src/panels/layers-panel.ts +36 -30
- package/src/panels/left-panel.ts +22 -8
- package/src/panels/navigator-panels.ts +23 -11
- package/src/panels/pane-context.ts +111 -29
- package/src/panels/pane-grid.ts +6 -6
- package/src/panels/panel-registry.ts +14 -9
- package/src/panels/properties-panel.ts +7 -3
- package/src/panels/right-panel.ts +199 -43
- package/src/panels/seo-modal.ts +41 -108
- package/src/panels/settings-menu.ts +52 -50
- package/src/panels/settings-pane.ts +268 -162
- package/src/panels/signals-panel.ts +3 -4
- package/src/panels/site-model.ts +367 -0
- package/src/panels/site-panel.ts +638 -0
- package/src/panels/style-panel.ts +37 -3
- package/src/panels/stylebook-doc.ts +142 -10
- package/src/panels/stylebook-layers-panel.ts +39 -80
- package/src/panels/stylebook-panel.ts +47 -10
- package/src/panels/styles-panel.ts +327 -0
- package/src/panels/tab-strip.ts +109 -25
- package/src/platform.ts +1 -1
- package/src/platforms/cloud.ts +28 -1
- package/src/platforms/default-platform.ts +4 -4
- package/src/platforms/devserver.ts +51 -25
- package/src/publish/deploy-checklist.ts +12 -7
- package/src/publish/pages-service.ts +38 -14
- package/src/publish/publish-changes.ts +491 -0
- package/src/publish/publish-commands.ts +83 -18
- package/src/publish/publish-ids.ts +49 -0
- 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/services/automation.ts +16 -20
- package/src/services/cf-settings.ts +4 -4
- package/src/services/connection.ts +2 -2
- package/src/services/directory-picker.ts +2 -2
- package/src/services/references.ts +0 -0
- package/src/services/render-critic.ts +21 -2
- package/src/services/settings/definitions.ts +25 -14
- package/src/settings/contributed-section.ts +49 -10
- package/src/settings/css-vars-editor.ts +93 -27
- package/src/settings/developer-panels.ts +43 -0
- package/src/settings/extension-sections.ts +20 -2
- package/src/settings/general-settings.ts +91 -21
- package/src/settings/preferences-dialog.ts +8 -1
- package/src/settings/project-sections.ts +27 -10
- package/src/settings/schema-field-ui.ts +3 -1
- package/src/settings/section-registry.ts +116 -11
- package/src/settings/settings-dialog.ts +192 -0
- package/src/settings/settings-document.ts +182 -162
- package/src/shell.ts +467 -431
- package/src/site-context.ts +64 -10
- package/src/state.ts +28 -9
- package/src/studio.ts +194 -41
- package/src/style/project-styles.ts +34 -0
- 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/variables-focus.ts +61 -0
- package/src/style/variables-view.ts +235 -0
- package/src/surfaces/add-new.json +1482 -0
- package/src/surfaces/add-new.ts +325 -0
- package/src/surfaces/ai-chat.ts +2 -2
- package/src/surfaces/boot-failure.json +4 -3
- package/src/surfaces/bottom-dock.json +1 -1
- package/src/surfaces/canvas-stage.json +30 -19
- package/src/surfaces/canvas-stage.ts +5 -5
- 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 +134 -99
- package/src/surfaces/empty-state.json +1 -1
- package/src/surfaces/entry-editor.json +136 -0
- package/src/surfaces/entry-editor.ts +21 -0
- package/src/surfaces/entry-inspector.json +371 -0
- package/src/surfaces/entry-inspector.ts +143 -0
- package/src/surfaces/inspector-dock.json +162 -14
- package/src/surfaces/inspector-dock.ts +46 -19
- package/src/surfaces/library-pane.json +670 -437
- package/src/surfaces/library-pane.ts +94 -59
- package/src/surfaces/media-browser.json +62 -6
- package/src/surfaces/media-browser.ts +15 -1
- package/src/surfaces/media-field.json +1 -1
- package/src/surfaces/media-library.json +1586 -0
- package/src/surfaces/media-library.ts +282 -0
- package/src/surfaces/media-pick-dialog.json +71 -0
- package/src/surfaces/media-pick-dialog.ts +132 -0
- package/src/surfaces/menu.ts +18 -0
- package/src/surfaces/pane-context.json +144 -77
- package/src/surfaces/pane-context.ts +24 -0
- package/src/surfaces/panel-deploy-checklist.json +12 -6
- package/src/surfaces/panel-deploy-checklist.ts +3 -1
- package/src/surfaces/panel-page.json +72 -2
- package/src/surfaces/panel-page.ts +38 -7
- package/src/surfaces/panel-signals.json +1 -1
- package/src/surfaces/panel-signals.ts +5 -5
- package/src/surfaces/panel-stylebook-layers.json +71 -204
- package/src/surfaces/panel-stylebook-layers.ts +0 -21
- package/src/surfaces/preferences.json +120 -48
- package/src/surfaces/preferences.ts +8 -0
- 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/rail.json +1 -159
- package/src/surfaces/rail.ts +18 -75
- package/src/surfaces/schema-form.json +10 -2
- package/src/surfaces/schema-form.ts +2 -0
- package/src/surfaces/seo.json +1 -1
- package/src/surfaces/settings-contributed.json +5 -5
- package/src/surfaces/settings-contributed.ts +18 -2
- package/src/surfaces/settings-css-vars.json +44 -36
- package/src/surfaces/settings-css-vars.ts +77 -4
- package/src/surfaces/settings-deploy.json +2 -15
- package/src/surfaces/settings-deploy.ts +1 -1
- package/src/surfaces/settings-dialog.json +51 -0
- package/src/surfaces/settings-dialog.ts +169 -0
- package/src/surfaces/settings-overview.json +3 -3
- package/src/surfaces/settings-overview.ts +9 -2
- package/src/surfaces/settings-pane.json +269 -46
- package/src/surfaces/settings-pane.ts +85 -24
- package/src/surfaces/shell.json +2 -1
- 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 +23 -0
- package/src/surfaces/statusbar.ts +39 -15
- 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/welcome.ts +1 -1
- 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/tab.ts +47 -7
- package/src/types.ts +21 -26
- package/src/ui/form-controls.ts +47 -8
- package/src/ui/layers.ts +13 -0
- package/src/ui/media-picker.ts +284 -40
- package/src/ui/regions.ts +7 -6
- package/src/ui/schema-form.ts +259 -27
- package/src/ui/virtual-window.ts +26 -1
- package/src/utils/base64.ts +3 -3
- package/src/utils/edit-display.ts +322 -67
- package/src/utils/local-day.ts +18 -0
- package/src/workspace/pane-derive.ts +4 -4
- package/src/workspace/session.ts +28 -7
- 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 +125 -11
- package/styles/shell-frame.css +30 -7
- package/styles/shell-frame.json +15 -3
- package/dist/chunks/2020-f2gkpy8d.js +0 -4
- package/dist/chunks/adapter-4912g339.js +0 -4
- package/dist/chunks/cf-account-picker-wccaenh6.js +0 -4
- package/dist/chunks/cf-settings-br6105tr.js +0 -4
- package/dist/chunks/color-28ksk2qm.js +0 -4
- package/dist/chunks/components-db68vsn7.js +0 -4
- package/dist/chunks/content-source-1449qesq.js +0 -4
- package/dist/chunks/convert-to-repeater-5h457egj.js +0 -4
- package/dist/chunks/editor-x9jn86a7.js +0 -4
- package/dist/chunks/entry-commands-may24cpt.js +0 -4
- package/dist/chunks/extension-sections-pvr14vxr.js +0 -4
- package/dist/chunks/file-ops-x9v54pcj.js +0 -4
- package/dist/chunks/files-j3knqf0s.js +0 -4
- package/dist/chunks/format-host-tyre2trb.js +0 -4
- package/dist/chunks/fs-events-64ma9htc.js +0 -4
- package/dist/chunks/git-panel-84ps5dex.js +0 -4
- package/dist/chunks/iframe-entry-fvbk89gm.js +0 -5
- package/dist/chunks/iframe-host-ck6vejt5.js +0 -4
- package/dist/chunks/index-b8xw3vy9.js +0 -4
- package/dist/chunks/jsonMode-w15cmrcm.js +0 -13
- package/dist/chunks/jx-validate-at3zn8wa.js +0 -4
- package/dist/chunks/layers-h4xp1pss.js +0 -4
- package/dist/chunks/layers-panel-m5hw1d7g.js +0 -4
- package/dist/chunks/lit-html-8t8t3dnr.js +0 -4
- package/dist/chunks/media-picker-2cweexc5.js +0 -4
- package/dist/chunks/menu-ynw13y0s.js +0 -4
- package/dist/chunks/monaco-buffer-qzxn567r.js +0 -4
- package/dist/chunks/monaco-setup-gxf6656g.js +0 -4
- package/dist/chunks/notify-cj5zbrs2.js +0 -4
- package/dist/chunks/parse-b7ddhr8m.js +0 -4
- package/dist/chunks/platform-3dfws9js.js +0 -4
- package/dist/chunks/popover-jt2gxmzs.js +0 -4
- package/dist/chunks/publish-panel-1gvxbj21.js +0 -4
- package/dist/chunks/quick-search-0dajrwqg.js +0 -4
- package/dist/chunks/references-49qgt404.js +0 -4
- package/dist/chunks/right-panel-jm1bwe53.js +0 -4
- package/dist/chunks/section-registry-6kwc4fky.js +0 -4
- package/dist/chunks/studio-0rt52vpq.js +0 -5
- package/dist/chunks/studio-18vgbhs5.js +0 -5
- package/dist/chunks/studio-24mccdrj.js +0 -5
- package/dist/chunks/studio-2eh507zk.js +0 -9
- package/dist/chunks/studio-2hcbccfv.js +0 -5
- package/dist/chunks/studio-2jbs3rxv.js +0 -5
- package/dist/chunks/studio-4h8k4dw9.js +0 -5
- package/dist/chunks/studio-5f6n18kx.js +0 -5
- package/dist/chunks/studio-5gthpky6.js +0 -5
- package/dist/chunks/studio-6ep3js6b.js +0 -9
- package/dist/chunks/studio-6wkmf3wz.js +0 -9
- package/dist/chunks/studio-841rf3cg.js +0 -5
- package/dist/chunks/studio-8gmwgheg.js +0 -5
- package/dist/chunks/studio-8qm0ep50.js +0 -5
- package/dist/chunks/studio-924p1tm1.js +0 -6
- package/dist/chunks/studio-a3shpz9y.js +0 -5
- package/dist/chunks/studio-amsbaaar.js +0 -6
- package/dist/chunks/studio-at5spjbc.js +0 -7
- package/dist/chunks/studio-b2xv945e.js +0 -5
- package/dist/chunks/studio-bn5nkafw.js +0 -5
- package/dist/chunks/studio-bw6q5xjf.js +0 -9
- package/dist/chunks/studio-c7q0t9x1.js +0 -5
- package/dist/chunks/studio-camnhc96.js +0 -6
- package/dist/chunks/studio-cffqvnzd.js +0 -5
- package/dist/chunks/studio-efvfrsf8.js +0 -5
- package/dist/chunks/studio-er30bpcx.js +0 -5
- package/dist/chunks/studio-ezscgr64.js +0 -5
- package/dist/chunks/studio-ffrrncvz.js +0 -5
- package/dist/chunks/studio-fpphgn8y.js +0 -10
- package/dist/chunks/studio-j1kvhdjk.js +0 -4
- package/dist/chunks/studio-j430n16g.js +0 -7
- package/dist/chunks/studio-jjkg84nj.js +0 -5
- package/dist/chunks/studio-m0q32ars.js +0 -4
- package/dist/chunks/studio-m6bdst11.js +0 -5
- package/dist/chunks/studio-nv2cptd4.js +0 -64
- package/dist/chunks/studio-nwfrc98n.js +0 -5
- package/dist/chunks/studio-p1wgvp7r.js +0 -5
- package/dist/chunks/studio-pag2wncm.js +0 -5
- package/dist/chunks/studio-qvanvzfd.js +0 -5
- package/dist/chunks/studio-qwa64kt7.js +0 -5
- package/dist/chunks/studio-rk1zc4x3.js +0 -928
- package/dist/chunks/studio-se2r3ptc.js +0 -5
- package/dist/chunks/studio-sg2a0dh0.js +0 -5
- package/dist/chunks/studio-tjzjhe68.js +0 -5
- package/dist/chunks/studio-v2w7q8r1.js +0 -7
- package/dist/chunks/studio-v5vjq1h0.js +0 -4
- package/dist/chunks/studio-v8aga3vp.js +0 -14
- package/dist/chunks/studio-vfcdrfmv.js +0 -5
- package/dist/chunks/studio-vmfkgdjf.js +0 -5
- package/dist/chunks/studio-wt1816jj.js +0 -5
- package/dist/chunks/studio-wz73q5kq.js +0 -4
- package/dist/chunks/studio-y04qtxvp.js +0 -7
- package/dist/chunks/studio-y21g8zzg.js +0 -5
- package/dist/chunks/studio-y64hrt8p.js +0 -12
- package/dist/chunks/studio-ynn90f58.js +0 -16
- package/dist/chunks/studio-yxz682sx.js +0 -5
- package/dist/chunks/studio-zp7snvkq.js +0 -5
- package/dist/chunks/studio-zq4z6tm6.js +0 -5
- package/dist/chunks/toast-c9fn075p.js +0 -4
- package/dist/chunks/tsMode-sf49ee9x.js +0 -14
- package/dist/chunks/workspace-jtfahpee.js +0 -4
- package/src/panels/frontmatter-panel.ts +0 -711
- package/src/panels/git-panel.ts +0 -1108
- package/src/surfaces/doc-header.json +0 -776
- package/src/surfaces/doc-header.ts +0 -222
- package/src/surfaces/git-panel.json +0 -1880
- package/src/surfaces/git-panel.ts +0 -264
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
/// <reference lib="dom" />
|
|
2
|
+
/**
|
|
3
|
+
* The Inspector's Entry tab: what the Page tab draws while a collection entry is the focused
|
|
4
|
+
* document (`specs/studio.md` §6, §22.5; the Content-Entry board's sidebar).
|
|
5
|
+
*
|
|
6
|
+
* Four things, in the board's order: the entry's **status** (its draft flag, when the collection
|
|
7
|
+
* has a draft workflow, `content/draft-state.ts`), its **fields** as the collection's schema types
|
|
8
|
+
* them (`ui/schema-form.ts` over `content/entry-fields.ts`, the same form and the same transacted
|
|
9
|
+
* commits as the form-only editor, so ⌘Z undoes a field here exactly as it does there), the **URL**
|
|
10
|
+
* its collection page publishes it at (`content/collection-pages.ts`), and the **file** it is
|
|
11
|
+
* stored in, with what that file holds.
|
|
12
|
+
*
|
|
13
|
+
* The body is written on the canvas beside it; this tab is the entry's frontmatter (or, for a JSON
|
|
14
|
+
* entry opened on the canvas by hand, its root). The form-only `entry` editor stays for the entries
|
|
15
|
+
* the canvas cannot write.
|
|
16
|
+
*
|
|
17
|
+
* @docs studio/projects/content-types
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import { effect, effectScope } from "../reactivity";
|
|
21
|
+
import { projectState } from "../store";
|
|
22
|
+
import { runActiveReported } from "../commands/run-reported";
|
|
23
|
+
import { mountSchemaForm } from "../ui/schema-form";
|
|
24
|
+
import { collectionForFile } from "./collection-match";
|
|
25
|
+
import { capitalise, contentCollection } from "./content-collections";
|
|
26
|
+
import {
|
|
27
|
+
entryLocale,
|
|
28
|
+
entryUrl,
|
|
29
|
+
onCollectionPagesRead,
|
|
30
|
+
peekCollectionPage,
|
|
31
|
+
} from "./collection-pages";
|
|
32
|
+
import { commitEntryFields, entryFields } from "./entry-fields";
|
|
33
|
+
import { DRAFT_MEANING, hasDraftAxis, isDraftEntry } from "./draft-state";
|
|
34
|
+
import { entryCollection } from "./entry-model";
|
|
35
|
+
import {
|
|
36
|
+
absentRequiredErrors,
|
|
37
|
+
fieldLabels,
|
|
38
|
+
formContext,
|
|
39
|
+
setEntryDraft,
|
|
40
|
+
titleFirst,
|
|
41
|
+
} from "./entry-editor";
|
|
42
|
+
import { mountEntryInspectorSurface } from "../surfaces/entry-inspector";
|
|
43
|
+
import type { EntryInspectorHandle, EntryInspectorView } from "../surfaces/entry-inspector";
|
|
44
|
+
import type { JsonSchema } from "../ui/schema-form";
|
|
45
|
+
import type { JsonObject } from "@jxsuite/schema/types";
|
|
46
|
+
import type { EffectScope } from "@vue/reactivity";
|
|
47
|
+
import type { Tab } from "../tabs/tab";
|
|
48
|
+
|
|
49
|
+
/** The region the tab's root carries. */
|
|
50
|
+
export const ENTRY_INSPECTOR_REGION = "inspector/entry";
|
|
51
|
+
|
|
52
|
+
/** A word with its first letter in capitals. */
|
|
53
|
+
|
|
54
|
+
/** Whether a tab's document is a collection entry: what titles the Page tab "Entry" (§6). */
|
|
55
|
+
export function isEntryTab(tab: Tab | null): boolean {
|
|
56
|
+
const match = collectionForFile(tab?.documentPath);
|
|
57
|
+
return match !== null && !match.fileBacked;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/** What the tab draws for an entry. */
|
|
61
|
+
export function entryInspectorView(tab: Tab): EntryInspectorView {
|
|
62
|
+
const path = tab.documentPath ?? "";
|
|
63
|
+
const match = collectionForFile(path);
|
|
64
|
+
const name = match?.name ?? "";
|
|
65
|
+
const collection = entryCollection(name);
|
|
66
|
+
const fields = entryFields(tab);
|
|
67
|
+
const draftAxis = hasDraftAxis(collection?.schema, fields);
|
|
68
|
+
const draft = isDraftEntry(fields);
|
|
69
|
+
const page = name === "" ? null : peekCollectionPage(name, entryLocale(path));
|
|
70
|
+
const url = page ? entryUrl(page, path, fields) : null;
|
|
71
|
+
const isJson = path.endsWith(".json");
|
|
72
|
+
return {
|
|
73
|
+
draft,
|
|
74
|
+
draftAxis: draftAxis ? "shown" : "hidden",
|
|
75
|
+
draftHint: DRAFT_MEANING,
|
|
76
|
+
fieldsState: collection?.schema ? "form" : "none",
|
|
77
|
+
kind: capitalise(contentCollection(name)?.item ?? "entry"),
|
|
78
|
+
path,
|
|
79
|
+
region: ENTRY_INSPECTOR_REGION,
|
|
80
|
+
status: draftAxis ? (draft ? "Draft" : "Published") : "",
|
|
81
|
+
storage: isJson
|
|
82
|
+
? ". Its fields are the file itself."
|
|
83
|
+
: ". Fields are its frontmatter, and the body is its Markdown.",
|
|
84
|
+
url: url ?? "",
|
|
85
|
+
urlState: page === undefined ? "loading" : url ? "shown" : page ? "unlisted" : "none",
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// ─── Mounting ────────────────────────────────────────────────────────────────
|
|
90
|
+
|
|
91
|
+
interface StandingInspector {
|
|
92
|
+
host: HTMLElement;
|
|
93
|
+
tabId: string;
|
|
94
|
+
handle: EntryInspectorHandle;
|
|
95
|
+
scope: EffectScope;
|
|
96
|
+
formHost: HTMLElement | null;
|
|
97
|
+
/**
|
|
98
|
+
* Repaint this tab, if it is still the one standing: the form's, the pages index's and the
|
|
99
|
+
* effect's.
|
|
100
|
+
*/
|
|
101
|
+
redraw: () => void;
|
|
102
|
+
unlisten: () => void;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
let _standing: StandingInspector | null = null;
|
|
106
|
+
|
|
107
|
+
/** Put the field form into the node the document made for it, or bring it up to date. */
|
|
108
|
+
function paintForm(standing: StandingInspector, tab: Tab): void {
|
|
109
|
+
const collection = entryCollection(collectionForFile(tab.documentPath)?.name ?? "");
|
|
110
|
+
if (!standing.formHost || !collection?.schema) {
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
const fields = entryFields(tab);
|
|
114
|
+
/* SAFETY: `collection.schema` is the collection's JSON Schema, the shape `JsonSchema` names for
|
|
115
|
+
the form; `fields` is a frontmatter block or a JSON entry's root, both parsed from YAML or JSON
|
|
116
|
+
text, so every value is JSON. The same reading `entry-editor.ts` makes. */
|
|
117
|
+
const form = mountSchemaForm(
|
|
118
|
+
"entry-inspector",
|
|
119
|
+
titleFirst(collection.schema as JsonSchema, collection.schema, fields),
|
|
120
|
+
fields as JsonObject,
|
|
121
|
+
{
|
|
122
|
+
context: formContext(tab),
|
|
123
|
+
errors: absentRequiredErrors(collection, fields),
|
|
124
|
+
onChange: (patch) => commitEntryFields(tab, patch),
|
|
125
|
+
rerender: standing.redraw,
|
|
126
|
+
ui: fieldLabels(collection.schema),
|
|
127
|
+
},
|
|
128
|
+
);
|
|
129
|
+
if (form.parentNode !== standing.formHost) {
|
|
130
|
+
standing.formHost.replaceChildren(form);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/** Repaint the tab and its form. */
|
|
135
|
+
function draw(standing: StandingInspector, tab: Tab): void {
|
|
136
|
+
const view = entryInspectorView(tab);
|
|
137
|
+
if (view.fieldsState === "none") {
|
|
138
|
+
standing.formHost = null;
|
|
139
|
+
}
|
|
140
|
+
standing.handle.update(view);
|
|
141
|
+
paintForm(standing, tab);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/** Take the tab down. Idempotent. */
|
|
145
|
+
export function unmountEntryInspector(host?: HTMLElement): void {
|
|
146
|
+
if (!_standing || (host !== undefined && _standing.host !== host)) {
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
_standing.unlisten();
|
|
150
|
+
_standing.scope.stop();
|
|
151
|
+
_standing.handle.dispose();
|
|
152
|
+
_standing = null;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Draw the Entry tab for `tab` into `host`, or bring the one already there up to date.
|
|
157
|
+
*
|
|
158
|
+
* Owns its own effect over the entry's fields, like the form-only editor, so a field commit
|
|
159
|
+
* repaints the tab and nothing else.
|
|
160
|
+
*/
|
|
161
|
+
export function renderEntryInspector(host: HTMLElement, tab: Tab): void {
|
|
162
|
+
if (
|
|
163
|
+
_standing &&
|
|
164
|
+
_standing.host === host &&
|
|
165
|
+
_standing.tabId === tab.id &&
|
|
166
|
+
_standing.handle.attached()
|
|
167
|
+
) {
|
|
168
|
+
draw(_standing, tab);
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
unmountEntryInspector();
|
|
172
|
+
const scope = effectScope();
|
|
173
|
+
const redraw = (): void => {
|
|
174
|
+
if (_standing === standing) {
|
|
175
|
+
draw(standing, tab);
|
|
176
|
+
}
|
|
177
|
+
};
|
|
178
|
+
const standing: StandingInspector = {
|
|
179
|
+
formHost: null,
|
|
180
|
+
handle: mountEntryInspectorSurface(
|
|
181
|
+
host,
|
|
182
|
+
entryInspectorView(tab),
|
|
183
|
+
{
|
|
184
|
+
openFields: () => {
|
|
185
|
+
const name = collectionForFile(tab.documentPath)?.name;
|
|
186
|
+
void runActiveReported(
|
|
187
|
+
"settings.open",
|
|
188
|
+
name ? { entry: name, section: "content" } : { section: "content" },
|
|
189
|
+
"Entry",
|
|
190
|
+
);
|
|
191
|
+
},
|
|
192
|
+
/* The command, not a local open(): Search appearance has one definition site, and an
|
|
193
|
+
entry's search title, description and image are frontmatter it commits into. */
|
|
194
|
+
openSeo: () => {
|
|
195
|
+
void runActiveReported("document.openSeo", undefined, "Entry");
|
|
196
|
+
},
|
|
197
|
+
setDraft: (draft) => setEntryDraft(tab, draft),
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
fieldsSlot: (element) => {
|
|
201
|
+
if (_standing === standing) {
|
|
202
|
+
standing.formHost = element;
|
|
203
|
+
paintForm(standing, tab);
|
|
204
|
+
}
|
|
205
|
+
},
|
|
206
|
+
},
|
|
207
|
+
),
|
|
208
|
+
host,
|
|
209
|
+
redraw,
|
|
210
|
+
scope,
|
|
211
|
+
tabId: tab.id,
|
|
212
|
+
unlisten: onCollectionPagesRead(redraw),
|
|
213
|
+
};
|
|
214
|
+
_standing = standing;
|
|
215
|
+
scope.run(() => {
|
|
216
|
+
effect(() => {
|
|
217
|
+
// Both stores, for the reason `entry-editor.ts` gives: which one holds the fields is
|
|
218
|
+
// `entry-fields.ts`'s answer, and the document is the reference every transaction replaces.
|
|
219
|
+
void tab.doc.document;
|
|
220
|
+
void tab.doc.content.frontmatter;
|
|
221
|
+
void projectState?.projectConfig?.content;
|
|
222
|
+
redraw();
|
|
223
|
+
});
|
|
224
|
+
});
|
|
225
|
+
}
|
|
@@ -14,9 +14,9 @@
|
|
|
14
14
|
* fill in and "absent" is a validation failure they did not cause.
|
|
15
15
|
* 2. **Where the entry files are** is `collectionInfo`'s answer, imported rather than recomputed.
|
|
16
16
|
* Three copies of "which collection owns this path, and what extension do its entries carry"
|
|
17
|
-
*
|
|
18
|
-
* source.ts`'s `collectionInfo`, `browse/library-model.ts`'s
|
|
19
|
-
* no fourth and calls the
|
|
17
|
+
* existed when this was written (`utils/studio-utils.ts`'s `findContentTypeSchema`,
|
|
18
|
+
* `grid/sources/content-source.ts`'s `collectionInfo`, and `browse/library-model.ts`'s
|
|
19
|
+
* `contentTypeFor`, since deleted); this module adds no fourth and calls the exported ones.
|
|
20
20
|
*
|
|
21
21
|
* **The draft axis is NOT here.** `content/draft-state.ts` owns what a draft is and whether drafts
|
|
22
22
|
* are listed, because this module imports `content-source.ts` and the grid source must be able to
|
|
@@ -99,6 +99,20 @@ export function collectionOfPath(path: string | null): EntryCollection | null {
|
|
|
99
99
|
return matched ? entryCollection(matched.name) : null;
|
|
100
100
|
}
|
|
101
101
|
|
|
102
|
+
/**
|
|
103
|
+
* The collection a file-backed collection's FILE holds the records of (`content/projects.csv`), or
|
|
104
|
+
* null. {@link entryCollection} refuses one, rightly, for everything that makes a new entry FILE; a
|
|
105
|
+
* record's form only reads its schema and its name, and `dir` is the file itself.
|
|
106
|
+
*/
|
|
107
|
+
export function recordCollectionOfPath(path: string | null): EntryCollection | null {
|
|
108
|
+
const matched = findContentTypeSchema(path ?? null, projectState?.projectConfig);
|
|
109
|
+
const info = matched ? collectionInfo(matched.name) : null;
|
|
110
|
+
if (!matched || !info) {
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
return { def: info.def, dir: info.dir, ext: info.ext, name: info.name, schema: matched.schema };
|
|
114
|
+
}
|
|
115
|
+
|
|
102
116
|
// ─── Seeding a new entry ─────────────────────────────────────────────────────
|
|
103
117
|
|
|
104
118
|
/** Deep copy of a schema `default`, so two entries seeded from one schema never share an object. */
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Opening a content entry: on the canvas in its writing editor, or in the form when it has no body.
|
|
3
|
+
*
|
|
4
|
+
* `specs/studio.md` §22.5: an entry is written on the canvas, inside its template's layout. Opening
|
|
5
|
+
* one opens the entry's OWN file as an ordinary tab — same id, history and dirty flag as a click in
|
|
6
|
+
* any file list — in its writing editor (`edit`), which the Content workspace owns (§22.1), so the
|
|
7
|
+
* Inspector's Entry tab and the writing-mode banner come with it. Every door into an entry goes
|
|
8
|
+
* through {@link openEntry}: a row in the Content home, an entry in the Collections panel,
|
|
9
|
+
* `content.openEntry`, and the entry Add new just made.
|
|
10
|
+
*
|
|
11
|
+
* The form-only `entry` editor (`content/entry-editor.ts`) stays as the fallback for an entry the
|
|
12
|
+
* canvas cannot write: a JSON entry IS its fields and has no body, and a file-backed collection's
|
|
13
|
+
* entries are rows of one file, which open in the grid.
|
|
14
|
+
*
|
|
15
|
+
* @docs studio/projects/content-types
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import { activateTab, workspace } from "../workspace/workspace";
|
|
19
|
+
import { collectionForFile } from "./collection-match";
|
|
20
|
+
import { writesEntryOnCanvas } from "./content-collections";
|
|
21
|
+
import { openEntryEditor } from "./entry-editor";
|
|
22
|
+
import type { Tab } from "../tabs/tab";
|
|
23
|
+
|
|
24
|
+
/** The editor an entry is written in on the canvas. */
|
|
25
|
+
export const WRITING_MODE = "edit";
|
|
26
|
+
|
|
27
|
+
/** The editors a tab already writes on the canvas in, which an open leaves alone. */
|
|
28
|
+
const CANVAS_MODES: ReadonlySet<string> = new Set(["edit", "design"]);
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* The open tab for a path, if any (a document tab's id is its path, but a renamed one keeps its
|
|
32
|
+
* id).
|
|
33
|
+
*/
|
|
34
|
+
function tabFor(path: string): Tab | null {
|
|
35
|
+
for (const tab of workspace.tabs.values()) {
|
|
36
|
+
if (tab.documentPath === path) {
|
|
37
|
+
return tab;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Open a content entry where it is written.
|
|
45
|
+
*
|
|
46
|
+
* - An entry with a body opens on the canvas in `edit`. A tab already writing it on the canvas
|
|
47
|
+
* (`edit` or `design`) keeps its view; a tab showing its form is switched back to writing.
|
|
48
|
+
* - A JSON entry opens in the form editor.
|
|
49
|
+
* - Any other file opens as `openFileInTab` would open it.
|
|
50
|
+
*
|
|
51
|
+
* @returns The tab, or `null` when the file could not be opened.
|
|
52
|
+
*/
|
|
53
|
+
export async function openEntry(path: string): Promise<Tab | null> {
|
|
54
|
+
if (!writesEntryOnCanvas(path)) {
|
|
55
|
+
const match = collectionForFile(path);
|
|
56
|
+
if (match && !match.fileBacked) {
|
|
57
|
+
return openEntryEditor(path);
|
|
58
|
+
}
|
|
59
|
+
/* Dynamic for the reason `entry-editor.ts` gives: `files/files.ts` reaches the platform, the
|
|
60
|
+
format registry and the packages layer. */
|
|
61
|
+
const { openFileInTab } = await import("../files/files");
|
|
62
|
+
await openFileInTab(path);
|
|
63
|
+
return tabFor(path);
|
|
64
|
+
}
|
|
65
|
+
const { openFileInTab } = await import("../files/files");
|
|
66
|
+
await openFileInTab(path);
|
|
67
|
+
const tab = tabFor(path);
|
|
68
|
+
if (!tab) {
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
if (
|
|
72
|
+
!CANVAS_MODES.has(tab.session.ui.canvasMode) &&
|
|
73
|
+
tab.capabilities.modes.includes(WRITING_MODE)
|
|
74
|
+
) {
|
|
75
|
+
tab.session.ui.canvasMode = WRITING_MODE;
|
|
76
|
+
tab.session.ui.preview = false;
|
|
77
|
+
}
|
|
78
|
+
activateTab(tab.id);
|
|
79
|
+
return tab;
|
|
80
|
+
}
|