@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
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The collections the Content workspace lists: a built-in **Pages** collection, then every
|
|
3
|
+
* collection `project.json` declares, in declaration order (`specs/studio.md` §9.1.2, §22.5).
|
|
4
|
+
*
|
|
5
|
+
* One answer to "which collection is this file in", and it is `content/collection-match.ts`'s. A
|
|
6
|
+
* routed file under `pages/` is a page; any other file is in the collection `collectionForFile`
|
|
7
|
+
* names, or in none. The Library this replaces had a third matcher (`contentTypeFor`, a source
|
|
8
|
+
* prefix test) and folder categories beside it, and the two disagreed about the same entry; both
|
|
9
|
+
* are gone, and nothing here guesses from a folder name.
|
|
10
|
+
*
|
|
11
|
+
* Pure over the open project's configuration: no DOM, no platform, so the commands that name a
|
|
12
|
+
* collection can build their `enum` in a bare Bun process.
|
|
13
|
+
*
|
|
14
|
+
* @docs studio/projects/browse
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { isRoutedPageFile } from "@jxsuite/site/routes";
|
|
18
|
+
import { projectState } from "../store";
|
|
19
|
+
import { MEDIA_EXTENSIONS, extensionOf } from "../files/media-types";
|
|
20
|
+
import { collectionForFile } from "./collection-match";
|
|
21
|
+
import type { ContentSectionEntry } from "../types";
|
|
22
|
+
import type { ContentTypeSchema } from "@jxsuite/schema/types";
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Collection names whose singular is the word itself. The suffix rules below would make `news` a
|
|
26
|
+
* `new`, `series` a `sery` and `species` a `specy`, and the result is visible copy ("New new").
|
|
27
|
+
*/
|
|
28
|
+
const INVARIANT_NOUNS = new Set(["data", "media", "metadata", "news", "series", "species"]);
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Collections named for the WHOLE rather than its parts: a `menu` holds dishes, a `gallery`
|
|
32
|
+
* pictures. Their item is "<name> item", the noun English already uses ("menu item", "catalog
|
|
33
|
+
* item"); "New menu" would promise a second menu.
|
|
34
|
+
*/
|
|
35
|
+
const COLLECTIVE_NOUNS = new Set([
|
|
36
|
+
"archive",
|
|
37
|
+
"catalog",
|
|
38
|
+
"catalogue",
|
|
39
|
+
"collection",
|
|
40
|
+
"directory",
|
|
41
|
+
"faq",
|
|
42
|
+
"gallery",
|
|
43
|
+
"inventory",
|
|
44
|
+
"library",
|
|
45
|
+
"menu",
|
|
46
|
+
"portfolio",
|
|
47
|
+
"showcase",
|
|
48
|
+
]);
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* A storage name in words, as a person reads it: `project_tag` → "project tag", `service-type` →
|
|
52
|
+
* "service type", `docsNav` → "docs nav". Lower case; {@link capitalise} makes a heading of it.
|
|
53
|
+
*/
|
|
54
|
+
export function humanName(name: string): string {
|
|
55
|
+
return name
|
|
56
|
+
.replaceAll(/[_-]+/g, " ")
|
|
57
|
+
.replaceAll(/([a-z\d])([A-Z])/g, "$1 $2")
|
|
58
|
+
.trim()
|
|
59
|
+
.replaceAll(/\s+/g, " ")
|
|
60
|
+
.toLowerCase();
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** A collection's item, said in the singular: `recipes` → `recipe`, `stories` → `story`. */
|
|
64
|
+
export function itemNoun(collection: string): string {
|
|
65
|
+
// Only the last word is a noun to singularise: `post_tags` is a "post tag".
|
|
66
|
+
// A one-word name keeps its own spelling (`News`); a compound one is said in lower-case words.
|
|
67
|
+
const words = /[_-]|[a-z\d][A-Z]/.test(collection) ? humanName(collection) : collection;
|
|
68
|
+
const at = words.lastIndexOf(" ");
|
|
69
|
+
const last = words.slice(at + 1);
|
|
70
|
+
if (COLLECTIVE_NOUNS.has(last.toLowerCase())) {
|
|
71
|
+
return `${words} item`;
|
|
72
|
+
}
|
|
73
|
+
return `${words.slice(0, at + 1)}${singular(last)}`;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/** One word in the singular. */
|
|
77
|
+
function singular(collection: string): string {
|
|
78
|
+
if (INVARIANT_NOUNS.has(collection.toLowerCase())) {
|
|
79
|
+
return collection;
|
|
80
|
+
}
|
|
81
|
+
if (/[^aeiou]ies$/.test(collection)) {
|
|
82
|
+
return `${collection.slice(0, -3)}y`;
|
|
83
|
+
}
|
|
84
|
+
// `classes` → `class`, `boxes` → `box`, `matches` → `match`: the plural added `es`.
|
|
85
|
+
if (/(?:ss|x|ch|sh|z)es$/.test(collection)) {
|
|
86
|
+
return collection.slice(0, -2);
|
|
87
|
+
}
|
|
88
|
+
// `status`, `campus`, `analysis`, `glass` are already singular.
|
|
89
|
+
if (/(?:us|is|ss)$/.test(collection)) {
|
|
90
|
+
return collection;
|
|
91
|
+
}
|
|
92
|
+
if (collection.endsWith("s")) {
|
|
93
|
+
return collection.slice(0, -1);
|
|
94
|
+
}
|
|
95
|
+
return collection;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/** A word with its first letter in capitals: `posts` → `Posts`. */
|
|
99
|
+
export function capitalise(word: string): string {
|
|
100
|
+
return word.charAt(0).toUpperCase() + word.slice(1);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* A template or page file's display name, from its file name: `./layouts/post.json` → `Post`,
|
|
105
|
+
* `./layouts/blog-post.json` → `Blog Post`. The one spelling every surface that names a template
|
|
106
|
+
* uses, so the header line, the writing banner and the layout picker never disagree.
|
|
107
|
+
*/
|
|
108
|
+
export function templateDisplayName(path: string): string {
|
|
109
|
+
const base = path.replaceAll("\\", "/").split("/").pop() ?? path;
|
|
110
|
+
return base
|
|
111
|
+
.replace(/\.[^.]+$/, "")
|
|
112
|
+
.replaceAll(/[-_]+/g, " ")
|
|
113
|
+
.replaceAll(/\b\w/g, (c: string) => c.toUpperCase());
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/** The key of the built-in collection every site has: the routed files under `pages/`. */
|
|
117
|
+
export const PAGES_COLLECTION = "pages";
|
|
118
|
+
|
|
119
|
+
/** One collection, as the Content workspace names it. */
|
|
120
|
+
export interface ContentCollection {
|
|
121
|
+
/** `pages`, or the collection's name in `project.json`. The value every command names. */
|
|
122
|
+
key: string;
|
|
123
|
+
/** What the heading says: "Pages", or the collection's name capitalised. */
|
|
124
|
+
title: string;
|
|
125
|
+
/** One of its items, in the singular and lower case: "page", "post", "story". */
|
|
126
|
+
item: string;
|
|
127
|
+
/** `pages` for the built-in collection, `collection` for a declared one. */
|
|
128
|
+
kind: "pages" | "collection";
|
|
129
|
+
/** True for a collection whose `source` is one file (a CSV catalogue): its entries are rows. */
|
|
130
|
+
fileBacked: boolean;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/** The declared collections, name → entry, in declaration order. */
|
|
134
|
+
function contentSection(): Record<string, ContentSectionEntry> {
|
|
135
|
+
/* SAFETY: `content` is the parser extension's section, collection name → entry object; this
|
|
136
|
+
module reads only the optional `source`, and only to ask whether it names one file. */
|
|
137
|
+
return (projectState?.projectConfig?.content ?? {}) as Record<string, ContentSectionEntry>;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/** Whether a `source` names a single file rather than a directory. */
|
|
141
|
+
function namesFile(source: string | undefined): boolean {
|
|
142
|
+
return source !== undefined && /\.[\da-z]+$/i.test(source.replace(/\/+$/, ""));
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/** The built-in Pages collection. */
|
|
146
|
+
const PAGES: ContentCollection = {
|
|
147
|
+
fileBacked: false,
|
|
148
|
+
item: "page",
|
|
149
|
+
key: PAGES_COLLECTION,
|
|
150
|
+
kind: "pages",
|
|
151
|
+
title: "Pages",
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
/** Every collection the Content workspace lists: Pages first, then the declared ones. */
|
|
155
|
+
export function contentCollections(): ContentCollection[] {
|
|
156
|
+
const declared = Object.entries(contentSection()).map(([name, def]): ContentCollection => ({
|
|
157
|
+
fileBacked: namesFile(def.source),
|
|
158
|
+
item: itemNoun(name),
|
|
159
|
+
key: name,
|
|
160
|
+
kind: "collection",
|
|
161
|
+
// In words, as the Table names a field: `project_tag` is "Project tag", not "Project_tag".
|
|
162
|
+
title: capitalise(humanName(name)),
|
|
163
|
+
}));
|
|
164
|
+
return [PAGES, ...declared];
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/** Every collection key, for a command's `enum`: `pages` first, then the declared names. */
|
|
168
|
+
export function contentCollectionKeys(): string[] {
|
|
169
|
+
return contentCollections().map((collection) => collection.key);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* The project-relative file a file-backed collection's entries are rows of (`./content/p.csv` →
|
|
174
|
+
* `content/p.csv`), or `null` for a collection whose source is a directory, or none at all.
|
|
175
|
+
*/
|
|
176
|
+
export function collectionSourceFile(key: string): string | null {
|
|
177
|
+
const source = contentSection()[key]?.source;
|
|
178
|
+
return source !== undefined && namesFile(source) ? source.replace(/^\.\//, "") : null;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/** The schema a collection declares, file-backed or not, or `null` for none. */
|
|
182
|
+
export function declaredCollectionSchema(key: string): ContentTypeSchema | null {
|
|
183
|
+
return contentSection()[key]?.schema ?? null;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/** The collection with this key, or `null` when the project declares none by that name. */
|
|
187
|
+
export function contentCollection(key: string): ContentCollection | null {
|
|
188
|
+
return contentCollections().find((collection) => collection.key === key) ?? null;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* The collection a file is in, or `null`.
|
|
193
|
+
*
|
|
194
|
+
* Media files are in none: an image beside an entry is the entry's asset, which the Media workspace
|
|
195
|
+
* lists. A file under `pages/` is a page; any other is `collectionForFile`'s answer.
|
|
196
|
+
*/
|
|
197
|
+
export function collectionKeyOfPath(path: string | null | undefined): string | null {
|
|
198
|
+
if (!path) {
|
|
199
|
+
return null;
|
|
200
|
+
}
|
|
201
|
+
const normalized = path.replaceAll("\\", "/").replace(/^\.\//, "");
|
|
202
|
+
if (MEDIA_EXTENSIONS.has(extensionOf(normalized))) {
|
|
203
|
+
return null;
|
|
204
|
+
}
|
|
205
|
+
if (normalized.startsWith("pages/")) {
|
|
206
|
+
// An underscore-prefixed file or folder is a page directory's private part, not a route.
|
|
207
|
+
return isRoutedPageFile(normalized) ? PAGES_COLLECTION : null;
|
|
208
|
+
}
|
|
209
|
+
return collectionForFile(normalized)?.name ?? null;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Whether an entry is written on the canvas rather than in the form editor.
|
|
214
|
+
*
|
|
215
|
+
* An entry with a body (a Markdown file, or any format with prose) is written on the canvas inside
|
|
216
|
+
* its template's layout (§22.5). A JSON entry IS its fields, with no body to write, and a
|
|
217
|
+
* file-backed collection's entries are rows: both keep the form-only `entry` editor.
|
|
218
|
+
*/
|
|
219
|
+
export function writesEntryOnCanvas(path: string | null | undefined): boolean {
|
|
220
|
+
if (!path) {
|
|
221
|
+
return false;
|
|
222
|
+
}
|
|
223
|
+
const match = collectionForFile(path);
|
|
224
|
+
if (!match || match.fileBacked) {
|
|
225
|
+
return false;
|
|
226
|
+
}
|
|
227
|
+
const ext = extensionOf(path);
|
|
228
|
+
return ext !== ".json" && ext !== ".csv";
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/** Which of the Content workspace's three derived caches a batch of file events can make wrong. */
|
|
232
|
+
export interface ContentCacheDrops {
|
|
233
|
+
/** The scan the collections are filtered from: only the file SET, so adds, removes and renames. */
|
|
234
|
+
scan: boolean;
|
|
235
|
+
/** The pages that say where each collection is published: any write under `pages/`. */
|
|
236
|
+
pages: boolean;
|
|
237
|
+
/** The titles and statuses the Collections panel lists: any write to a collection's entry. */
|
|
238
|
+
entries: boolean;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/**
|
|
242
|
+
* Which Content caches a file-event batch drops.
|
|
243
|
+
*
|
|
244
|
+
* A plain content `change` cannot change which files exist, so it leaves the scan alone; that is
|
|
245
|
+
* every save, Studio's own echoes included, and dropping the scan on each one blanked the
|
|
246
|
+
* Collections panel and re-walked the project after every keystroke-and-save. It can still change a
|
|
247
|
+
* template page's `$paths` (the index) and an entry's title or status (the summaries), so those are
|
|
248
|
+
* dropped by path.
|
|
249
|
+
*
|
|
250
|
+
* @param paths The project-relative paths the batch touched, or `undefined` after a gap, when any
|
|
251
|
+
* path may have changed.
|
|
252
|
+
* @param structural Whether the batch added, removed or renamed anything.
|
|
253
|
+
*/
|
|
254
|
+
export function contentCacheDrops(
|
|
255
|
+
paths: readonly string[] | undefined,
|
|
256
|
+
structural: boolean,
|
|
257
|
+
): ContentCacheDrops {
|
|
258
|
+
if (paths === undefined || structural) {
|
|
259
|
+
return { entries: true, pages: true, scan: true };
|
|
260
|
+
}
|
|
261
|
+
const normalized = paths.map((path) => path.replaceAll("\\", "/").replace(/^\.\//, ""));
|
|
262
|
+
return {
|
|
263
|
+
entries: normalized.some((path) => {
|
|
264
|
+
const key = collectionKeyOfPath(path);
|
|
265
|
+
return key !== null && key !== PAGES_COLLECTION;
|
|
266
|
+
}),
|
|
267
|
+
pages: normalized.some((path) => path.startsWith("pages/")),
|
|
268
|
+
scan: false,
|
|
269
|
+
};
|
|
270
|
+
}
|
|
@@ -20,6 +20,7 @@
|
|
|
20
20
|
|
|
21
21
|
import { reactive } from "../reactivity";
|
|
22
22
|
import type { ContentTypeSchema } from "@jxsuite/schema/types";
|
|
23
|
+
import type { EntryFields } from "./entry-fields";
|
|
23
24
|
|
|
24
25
|
/** The conventional frontmatter boolean that marks an entry a draft (site-architecture.md §7.6). */
|
|
25
26
|
export const DRAFT_FIELD = "draft";
|
|
@@ -44,7 +45,7 @@ export const DRAFT_MEANING =
|
|
|
44
45
|
* Takes the entry's FIELDS, whichever record they live in — `content/entry-fields.ts` answers that,
|
|
45
46
|
* because a JSON collection's entry has no frontmatter and its `draft` key is on the document.
|
|
46
47
|
*/
|
|
47
|
-
export function isDraftEntry(fields:
|
|
48
|
+
export function isDraftEntry(fields: EntryFields | null | undefined): boolean {
|
|
48
49
|
return fields?.[DRAFT_FIELD] === true;
|
|
49
50
|
}
|
|
50
51
|
|
|
@@ -63,7 +64,7 @@ export function schemaDeclaresDraft(schema: ContentTypeSchema | null | undefined
|
|
|
63
64
|
*/
|
|
64
65
|
export function hasDraftAxis(
|
|
65
66
|
schema: ContentTypeSchema | null | undefined,
|
|
66
|
-
fields?:
|
|
67
|
+
fields?: EntryFields | null,
|
|
67
68
|
): boolean {
|
|
68
69
|
return schemaDeclaresDraft(schema) || isDraftEntry(fields);
|
|
69
70
|
}
|
|
@@ -100,7 +101,7 @@ export function setIncludeDrafts(include: boolean): void {
|
|
|
100
101
|
*/
|
|
101
102
|
export function applyDraftFilter<T>(
|
|
102
103
|
items: readonly T[],
|
|
103
|
-
fieldsOf: (item: T) =>
|
|
104
|
+
fieldsOf: (item: T) => EntryFields | null | undefined,
|
|
104
105
|
includeDrafts: boolean,
|
|
105
106
|
): readonly T[] {
|
|
106
107
|
return includeDrafts ? items : items.filter((item) => !isDraftEntry(fieldsOf(item)));
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The content-entry verbs:
|
|
3
|
-
* drafts are listed at all
|
|
2
|
+
* The content-entry verbs: open one where it is written, mark one a draft, and choose whether
|
|
3
|
+
* drafts are listed at all — and {@link createEntry}, the New File tree's route into a collection
|
|
4
|
+
* folder.
|
|
5
|
+
*
|
|
6
|
+
* Creating an entry from anywhere else is Add new's (`file.new { kind: "entry", collection }`,
|
|
7
|
+
* `create/add-new-flow.ts`), which seeds through {@link entryFormatName} and `entryBody` exactly as
|
|
8
|
+
* {@link createEntry} does, so both routes write the same bytes.
|
|
4
9
|
*
|
|
5
10
|
* Each is a record in its owning module, so the palette row, the assistant's tool, the automation
|
|
6
11
|
* step and (for the two that declare one) the context-menu item are renderings of the same
|
|
@@ -14,8 +19,6 @@ import {
|
|
|
14
19
|
argsSchema,
|
|
15
20
|
booleanArg,
|
|
16
21
|
booleanProperty,
|
|
17
|
-
derivedEnumProperty,
|
|
18
|
-
enumArg,
|
|
19
22
|
stringArg,
|
|
20
23
|
stringProperty,
|
|
21
24
|
} from "../commands/command-args";
|
|
@@ -32,47 +35,61 @@ import { serializeJson } from "@jxsuite/schema/json-layout";
|
|
|
32
35
|
import { invalidateReferenceEntries } from "../ui/form-controls";
|
|
33
36
|
import { reloadDraftAwareGrids } from "../grid/sources/content-source";
|
|
34
37
|
import { setIncludeDrafts } from "./draft-state";
|
|
35
|
-
import { collectionOfPath, entryCollection
|
|
36
|
-
import {
|
|
37
|
-
import {
|
|
38
|
+
import { collectionOfPath, entryCollection } from "./entry-model";
|
|
39
|
+
import { entryBody } from "../create/add-new";
|
|
40
|
+
import { collectionForDirectory } from "./collection-match";
|
|
41
|
+
import { LOCALE_PLACEHOLDER } from "../canvas/asset-resolve";
|
|
42
|
+
import { setEntryDraft } from "./entry-editor";
|
|
43
|
+
import { openEntry } from "./entry-open";
|
|
38
44
|
import { errorMessage } from "@jxsuite/schema/parse";
|
|
39
45
|
import type { EntryCollection } from "./entry-model";
|
|
40
46
|
import type { AnyCommand, CommandRegistry } from "../commands/registry";
|
|
41
47
|
import type { Tab } from "../tabs/tab";
|
|
48
|
+
import type { JxMutableNode } from "@jxsuite/schema/types";
|
|
42
49
|
|
|
43
|
-
/**
|
|
44
|
-
|
|
45
|
-
|
|
50
|
+
/**
|
|
51
|
+
* The format class that writes a collection's entries, or `null` for native JSON.
|
|
52
|
+
*
|
|
53
|
+
* `collectionInfo` derives `.json` exactly when no format class claimed the collection — the
|
|
54
|
+
* extension and the serializer name come off the same three lookups in the same order — so "the
|
|
55
|
+
* extension is .json" and "no format can write this" are one condition. Writing JSON into a `.md`
|
|
56
|
+
* file is therefore not a state a seed can reach.
|
|
57
|
+
*/
|
|
58
|
+
export function entryFormatName(collection: Pick<EntryCollection, "def" | "ext">): string | null {
|
|
59
|
+
if (collection.ext === ".json") {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
return (
|
|
63
|
+
(collection.def.format ? formatByName(collection.def.format)?.name : undefined) ??
|
|
64
|
+
formatForPath(`untitled${collection.ext}`)?.name ??
|
|
65
|
+
defaultContentFormat()?.name ??
|
|
66
|
+
null
|
|
67
|
+
);
|
|
46
68
|
}
|
|
47
69
|
|
|
48
70
|
/**
|
|
49
|
-
* The source text a new entry starts as.
|
|
71
|
+
* The source text a new entry starts as: `create/add-new.ts`'s `entryBody`, serialized.
|
|
50
72
|
*
|
|
51
73
|
* A `json` collection is serialized here rather than through the format registry, because JSON is
|
|
52
74
|
* the one native collection shape (site-architecture.md §6.2) and has no format class to ask.
|
|
53
|
-
*
|
|
54
|
-
* `collectionInfo` derives `.json` exactly when no format class claimed the collection — the
|
|
55
|
-
* extension and the serializer name come off the same three lookups in the same order — so "the
|
|
56
|
-
* extension is .json" and "no format can write this" are one condition, and the second is not a
|
|
57
|
-
* separate failure to report. Writing JSON into a `.md` file is therefore not a state this can
|
|
58
|
-
* reach.
|
|
59
75
|
*/
|
|
60
76
|
async function seedText(collection: EntryCollection): Promise<string> {
|
|
61
|
-
const
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
if (
|
|
77
|
+
const body = entryBody({
|
|
78
|
+
ext: collection.ext,
|
|
79
|
+
formatName: entryFormatName(collection),
|
|
80
|
+
schema: collection.schema,
|
|
81
|
+
});
|
|
82
|
+
if (body.format === null) {
|
|
67
83
|
// The save serializer with no layout (`@jxsuite/schema/json-layout`): a seed has no source text, and
|
|
68
84
|
// This is what the formatter makes of one, newline included.
|
|
69
|
-
return serializeJson(
|
|
85
|
+
return serializeJson(body.doc, null);
|
|
70
86
|
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
87
|
+
/* SAFETY: an entry body is `{ ...seed, children: [] }`, an element-shaped object, which is the
|
|
88
|
+
document a format's serializer reads. */
|
|
89
|
+
return formatSerialize(body.format, body.doc as JxMutableNode, {
|
|
90
|
+
frontmatter: body.frontmatter ?? false,
|
|
91
|
+
mode: "roundtrip",
|
|
92
|
+
});
|
|
76
93
|
}
|
|
77
94
|
|
|
78
95
|
/**
|
|
@@ -126,8 +143,8 @@ export async function createEntry(
|
|
|
126
143
|
* Where the entry lands.
|
|
127
144
|
*
|
|
128
145
|
* A localized collection's `dir` is `content/exhibitions/{locale}` — a path nobody has. Creating
|
|
129
|
-
* there makes a directory literally named `{locale}`, which is what
|
|
130
|
-
*
|
|
146
|
+
* there makes a directory literally named `{locale}`, which is what the palette's New Entry and
|
|
147
|
+
* the `new_content_entry` tool used to do. There is no default locale to pick on
|
|
131
148
|
* the author's behalf (choosing one silently files the entry under a language), so this refuses
|
|
132
149
|
* and names the gesture that works.
|
|
133
150
|
*/
|
|
@@ -161,45 +178,19 @@ export async function createEntry(
|
|
|
161
178
|
}
|
|
162
179
|
// The picker's choices just changed; a cached list would keep offering the old set.
|
|
163
180
|
invalidateReferenceEntries(collection.name);
|
|
164
|
-
await
|
|
181
|
+
await openEntry(created);
|
|
165
182
|
return created;
|
|
166
183
|
}
|
|
167
184
|
|
|
168
185
|
/** The active tab, when it is a content entry — the subject of the document-level verbs. */
|
|
169
186
|
function activeEntryTab(): Tab | null {
|
|
170
|
-
const tab = activeTab.value
|
|
187
|
+
const tab = activeTab.value;
|
|
171
188
|
return tab && collectionOfPath(tab.documentPath) ? tab : null;
|
|
172
189
|
}
|
|
173
190
|
|
|
174
191
|
/** The content-entry command records. */
|
|
175
192
|
export function contentCommands(): AnyCommand[] {
|
|
176
193
|
return [
|
|
177
|
-
{
|
|
178
|
-
args: argsSchema({
|
|
179
|
-
collection: derivedEnumProperty(
|
|
180
|
-
creatableCollections,
|
|
181
|
-
"The content collection the entry is created in.",
|
|
182
|
-
),
|
|
183
|
-
}),
|
|
184
|
-
category: "File",
|
|
185
|
-
id: "content.newEntry",
|
|
186
|
-
level: "project",
|
|
187
|
-
menus: ["palette"],
|
|
188
|
-
group: "1_file",
|
|
189
|
-
requires: "a project with a directory-backed content collection",
|
|
190
|
-
when: (ctx) => ctx.project.open,
|
|
191
|
-
enablement: () => creatableCollections().length > 0,
|
|
192
|
-
undo: "project",
|
|
193
|
-
/* No `aiTool`, by studio-ui-guidelines.md §12.4's second deletion rule: `createEntry` awaits
|
|
194
|
-
`createFileIn`, which awaits the New File prompt for the name; a cancel resolves with
|
|
195
|
-
nothing thrown. An optional `name` argument that skips the prompt is the way back in, and
|
|
196
|
-
is a UX call (issue 273). */
|
|
197
|
-
run: async (_ctx, args) => {
|
|
198
|
-
const names = creatableCollections();
|
|
199
|
-
await createEntry(enumArg("content.newEntry", args, "collection", names));
|
|
200
|
-
},
|
|
201
|
-
title: "New Entry",
|
|
202
|
-
},
|
|
203
194
|
{
|
|
204
195
|
args: argsSchema({
|
|
205
196
|
path: stringProperty("Project-relative path of the entry file to open."),
|
|
@@ -212,11 +203,12 @@ export function contentCommands(): AnyCommand[] {
|
|
|
212
203
|
requires: "an open project",
|
|
213
204
|
when: (ctx) => ctx.project.open,
|
|
214
205
|
/* No `aiTool`, by studio-ui-guidelines.md §12.4's first deletion rule: this opens a surface;
|
|
215
|
-
the model has `open_document`.
|
|
206
|
+
the model has `open_document`. An entry with a body opens on the canvas in its writing
|
|
207
|
+
editor, inside its template's layout; a JSON entry opens in the form (§22.5). */
|
|
216
208
|
run: async (_ctx, args) => {
|
|
217
|
-
await
|
|
209
|
+
await openEntry(stringArg("content.openEntry", args, "path"));
|
|
218
210
|
},
|
|
219
|
-
title: "Open Entry
|
|
211
|
+
title: "Open Entry",
|
|
220
212
|
},
|
|
221
213
|
{
|
|
222
214
|
args: argsSchema({
|