@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,272 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a component's live preview is drawn with.
|
|
3
|
+
*
|
|
4
|
+
* A preview instance used to be given nothing, so it drew its definition's DEFAULTS, and a starter
|
|
5
|
+
* component's defaults are empty strings: a page header with no title, a band with no label, a card
|
|
6
|
+
* with no name. A component is only ever seen with props, so the preview asks where it has been
|
|
7
|
+
* given some, in this order:
|
|
8
|
+
*
|
|
9
|
+
* 1. The definition's own `examples`: the JSON Schema keyword a typed state entry may carry (`spec.md`
|
|
10
|
+
* §5.3, Shape 2), whose first value is the author's own sample.
|
|
11
|
+
* 2. Its first use in the project that passes literal values: the reference index names the files that
|
|
12
|
+
* use the tag, and the instance among them that passes the most literal props is the likeliest
|
|
13
|
+
* to draw the component as the author meant it. A bound prop (`${…}`, `$ref`) has no value
|
|
14
|
+
* outside the page that binds it, so it is not one.
|
|
15
|
+
* 3. A list that draws it ({@link componentSampleRow}): a component used only as a repeater's row,
|
|
16
|
+
* every prop bound to the row, is drawn as that list's first row, with the list's data.
|
|
17
|
+
*
|
|
18
|
+
* Only a prop the definition declares, and that is not private (`spec.md` §5.6), is taken. Files in
|
|
19
|
+
* the project's default language are read before translations, so a preview reads in the language
|
|
20
|
+
* the site is written in first.
|
|
21
|
+
*
|
|
22
|
+
* @docs studio/interface
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
import {
|
|
26
|
+
isJsonObject,
|
|
27
|
+
isNodeObject,
|
|
28
|
+
isPrivateStateKey,
|
|
29
|
+
isRef,
|
|
30
|
+
isString,
|
|
31
|
+
} from "@jxsuite/schema/guards";
|
|
32
|
+
import { localeOfPath, resolveI18n } from "@jxsuite/schema/locale";
|
|
33
|
+
import { getPlatform } from "../platform";
|
|
34
|
+
import { formatForPath, loadFormats } from "../format/format-host";
|
|
35
|
+
import { parseSourceForPath } from "../files/file-ops";
|
|
36
|
+
import { loadUsages } from "../services/references";
|
|
37
|
+
import { documentBase } from "../canvas/canvas-origin";
|
|
38
|
+
import { bakeRepeaterSources } from "../canvas/repeater-sources";
|
|
39
|
+
import { pageContextFor } from "../canvas/canvas-page-context";
|
|
40
|
+
import { projectState } from "../store";
|
|
41
|
+
import type { JsonValue, JxDocument, JxDocumentValue, JxMutableNode } from "@jxsuite/schema/types";
|
|
42
|
+
|
|
43
|
+
/** A component's sample props, by state key. */
|
|
44
|
+
export type ExampleProps = Map<string, JsonValue>;
|
|
45
|
+
|
|
46
|
+
/** How many of the files that use a component are read for an instance to draw it from. */
|
|
47
|
+
const USAGE_FILES_READ = 4;
|
|
48
|
+
|
|
49
|
+
/** Whether a value is plain data a prop can hold outside any page: no template, no binding. */
|
|
50
|
+
export function isLiteralProp(value: JxDocumentValue | undefined): value is JsonValue {
|
|
51
|
+
if (value === undefined) {
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
if (isString(value)) {
|
|
55
|
+
return !value.includes("${");
|
|
56
|
+
}
|
|
57
|
+
if (Array.isArray(value)) {
|
|
58
|
+
return value.every((member) => isLiteralProp(member));
|
|
59
|
+
}
|
|
60
|
+
if (isJsonObject(value)) {
|
|
61
|
+
return (
|
|
62
|
+
!("$ref" in value) &&
|
|
63
|
+
!("$prototype" in value) &&
|
|
64
|
+
!("$expression" in value) &&
|
|
65
|
+
Object.values(value).every((member) => isLiteralProp(member))
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/** The definition's public prop keys: its state entries, without the private ones. */
|
|
72
|
+
function propKeys(definition: JxDocument): Set<string> {
|
|
73
|
+
return new Set(Object.keys(definition.state ?? {}).filter((key) => !isPrivateStateKey(key)));
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/** The first `examples` value of each typed state entry that declares one. */
|
|
77
|
+
export function declaredExamples(definition: JxDocument): ExampleProps {
|
|
78
|
+
const out: ExampleProps = new Map();
|
|
79
|
+
for (const [key, entry] of Object.entries(definition.state ?? {})) {
|
|
80
|
+
if (isPrivateStateKey(key) || !isJsonObject(entry) || !Array.isArray(entry.examples)) {
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
const [first] = entry.examples;
|
|
84
|
+
if (isLiteralProp(first)) {
|
|
85
|
+
out.set(key, first);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return out;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/** Every node of a tree, each with the repeater (if any) whose row template holds it. */
|
|
92
|
+
function eachNode(
|
|
93
|
+
tree: JxDocumentValue | undefined,
|
|
94
|
+
visit: (node: JxMutableNode, repeater: JxMutableNode | null) => void,
|
|
95
|
+
): void {
|
|
96
|
+
const walk = (value: JxDocumentValue | undefined, repeater: JxMutableNode | null): void => {
|
|
97
|
+
if (Array.isArray(value)) {
|
|
98
|
+
for (const member of value) {
|
|
99
|
+
walk(member, repeater);
|
|
100
|
+
}
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
if (!isNodeObject(value)) {
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
visit(value, repeater);
|
|
107
|
+
walk(value.children, repeater);
|
|
108
|
+
walk(value.map, value.$prototype === "Array" ? value : repeater);
|
|
109
|
+
for (const branch of Object.values(value.cases ?? {})) {
|
|
110
|
+
walk(branch, repeater);
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
walk(tree, null);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* The literal props of the instance of `tagName` in `tree` that passes the most of them, among the
|
|
118
|
+
* keys the definition declares; empty when no instance passes any.
|
|
119
|
+
*/
|
|
120
|
+
export function literalUsageProps(
|
|
121
|
+
tree: JxDocumentValue | undefined,
|
|
122
|
+
tagName: string,
|
|
123
|
+
keys: ReadonlySet<string>,
|
|
124
|
+
): ExampleProps {
|
|
125
|
+
let best: ExampleProps = new Map();
|
|
126
|
+
eachNode(tree, (node) => {
|
|
127
|
+
if (node.tagName !== tagName || !isJsonObject(node.$props)) {
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
const found: ExampleProps = new Map();
|
|
131
|
+
for (const [key, prop] of Object.entries(node.$props)) {
|
|
132
|
+
if (keys.has(key) && isLiteralProp(prop)) {
|
|
133
|
+
found.set(key, prop);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
if (found.size > best.size) {
|
|
137
|
+
best = found;
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
return best;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/** One project document as a tree, or null when it cannot be read or parsed. */
|
|
144
|
+
async function readTree(path: string): Promise<JxMutableNode | null> {
|
|
145
|
+
try {
|
|
146
|
+
const content = await getPlatform().readFile(path);
|
|
147
|
+
await loadFormats();
|
|
148
|
+
let tree: JxDocumentValue;
|
|
149
|
+
if (formatForPath(path)) {
|
|
150
|
+
const parsed = await parseSourceForPath(path, content);
|
|
151
|
+
tree = parsed.document;
|
|
152
|
+
} else if (path.endsWith(".json")) {
|
|
153
|
+
/* SAFETY: a `.json` project document is JSON, and every read of it below is guarded. */
|
|
154
|
+
tree = JSON.parse(content) as JxDocumentValue;
|
|
155
|
+
} else {
|
|
156
|
+
return null;
|
|
157
|
+
}
|
|
158
|
+
return isNodeObject(tree) ? tree : null;
|
|
159
|
+
} catch {
|
|
160
|
+
return null;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/** The files that use a component, default language first, at most {@link USAGE_FILES_READ}. */
|
|
165
|
+
async function usageFiles(path: string, tagName: string): Promise<string[]> {
|
|
166
|
+
const usages = await loadUsages({ path, tagName });
|
|
167
|
+
if (usages.status !== "ready") {
|
|
168
|
+
return [];
|
|
169
|
+
}
|
|
170
|
+
const { i18n } = resolveI18n(projectState?.projectConfig ?? {});
|
|
171
|
+
const translated = (file: string): boolean => {
|
|
172
|
+
const locale = localeOfPath(file, i18n);
|
|
173
|
+
return locale !== null && locale !== i18n?.defaultLocale;
|
|
174
|
+
};
|
|
175
|
+
const files = usages.result.files.map((file) => file.path);
|
|
176
|
+
return [
|
|
177
|
+
...files.filter((file) => !translated(file)),
|
|
178
|
+
...files.filter((file) => translated(file)),
|
|
179
|
+
].slice(0, USAGE_FILES_READ);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/** The props a component's preview instance is given (sources 1 and 2 of the module comment). */
|
|
183
|
+
export async function componentExampleProps(
|
|
184
|
+
definition: JxDocument,
|
|
185
|
+
path: string,
|
|
186
|
+
): Promise<ExampleProps> {
|
|
187
|
+
const keys = propKeys(definition);
|
|
188
|
+
const tagName = isString(definition.tagName) ? definition.tagName : null;
|
|
189
|
+
const examples = declaredExamples(definition);
|
|
190
|
+
if (!tagName || keys.size === 0) {
|
|
191
|
+
return examples;
|
|
192
|
+
}
|
|
193
|
+
let best: ExampleProps = new Map();
|
|
194
|
+
for (const file of await usageFiles(path, tagName)) {
|
|
195
|
+
const found = literalUsageProps(await readTree(file), tagName, keys);
|
|
196
|
+
if (found.size > best.size) {
|
|
197
|
+
best = found;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
// The author's own sample wins over a page's value for the same prop.
|
|
201
|
+
return new Map([...best, ...examples]);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/** A sample-row document, and the file whose list it draws (its relative refs resolve there). */
|
|
205
|
+
export interface SampleRow {
|
|
206
|
+
doc: JxDocument;
|
|
207
|
+
file: string;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/** The state key a repeater reads its whole list from (`#/state/shows`), or null. */
|
|
211
|
+
function listKeyOf(repeater: JxMutableNode): string | null {
|
|
212
|
+
const { items } = repeater;
|
|
213
|
+
if (!isRef(items) || !items.$ref.startsWith("#/state/")) {
|
|
214
|
+
return null;
|
|
215
|
+
}
|
|
216
|
+
const key = items.$ref.slice("#/state/".length);
|
|
217
|
+
return key !== "" && !key.includes("/") ? key : null;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* A document that draws the first row of a list using the component (source 3 of the module
|
|
222
|
+
* comment), or null when no file that uses it has one: the list's repeater, its data resolved the
|
|
223
|
+
* way the canvas resolves it for Edit (`canvas/repeater-sources.ts`) and cut to its first item, in
|
|
224
|
+
* the page's own state and `$site` / `$page`.
|
|
225
|
+
*/
|
|
226
|
+
export async function componentSampleRow(
|
|
227
|
+
definition: JxDocument,
|
|
228
|
+
path: string,
|
|
229
|
+
): Promise<SampleRow | null> {
|
|
230
|
+
const tagName = isString(definition.tagName) ? definition.tagName : null;
|
|
231
|
+
if (!tagName) {
|
|
232
|
+
return null;
|
|
233
|
+
}
|
|
234
|
+
for (const file of await usageFiles(path, tagName)) {
|
|
235
|
+
const tree = await readTree(file);
|
|
236
|
+
const lists: JxMutableNode[] = [];
|
|
237
|
+
eachNode(tree, (node, repeater) => {
|
|
238
|
+
if (node.tagName === tagName && repeater && listKeyOf(repeater)) {
|
|
239
|
+
lists.push(repeater);
|
|
240
|
+
}
|
|
241
|
+
});
|
|
242
|
+
const [list] = lists;
|
|
243
|
+
const key = list ? listKeyOf(list) : null;
|
|
244
|
+
if (!tree || !list || !key) {
|
|
245
|
+
continue;
|
|
246
|
+
}
|
|
247
|
+
const baked = await bakeRepeaterSources(
|
|
248
|
+
tree,
|
|
249
|
+
[key],
|
|
250
|
+
new URL(file, documentBase(projectState?.projectRoot)).href,
|
|
251
|
+
);
|
|
252
|
+
const rows = baked.state?.[key];
|
|
253
|
+
if (!Array.isArray(rows) || rows.length === 0) {
|
|
254
|
+
continue;
|
|
255
|
+
}
|
|
256
|
+
const context = file.startsWith("pages/")
|
|
257
|
+
? await pageContextFor(
|
|
258
|
+
{ documentPath: file, isEntry: false, lang: tree.$lang, title: tree.title },
|
|
259
|
+
projectState?.projectConfig,
|
|
260
|
+
)
|
|
261
|
+
: null;
|
|
262
|
+
return {
|
|
263
|
+
doc: {
|
|
264
|
+
children: [list],
|
|
265
|
+
state: { ...baked.state, [key]: rows.slice(0, 1), ...context },
|
|
266
|
+
tagName: "div",
|
|
267
|
+
},
|
|
268
|
+
file,
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
return null;
|
|
272
|
+
}
|
|
@@ -1,17 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The
|
|
2
|
+
* The Content home's verbs (`specs/studio.md` §22.5).
|
|
3
3
|
*
|
|
4
|
-
* Every piece of
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* (`scripts/screenshots/README.md`). `library.setCategory` is the same action the button runs, and
|
|
10
|
-
* the button is now a rendering of the record.
|
|
4
|
+
* Every piece of the home's state a person can reach is reachable here: which collection it shows,
|
|
5
|
+
* how that collection is arranged, what it is filtered to. The view switch, the search field and
|
|
6
|
+
* the language picker are renderings of the same records, and the Collections panel's rows run
|
|
7
|
+
* `content.showCollection` rather than writing the state themselves, so a shot or a script names
|
|
8
|
+
* the collection instead of pressing a row it found by its text.
|
|
11
9
|
*
|
|
12
10
|
* Every setter is idempotent and names the STATE it reaches, never a delta: there is no
|
|
13
|
-
* `
|
|
14
|
-
* eighteen manifest steps when a default flipped.
|
|
11
|
+
* `content.toggleLayout`, because a toggle against unstated state is what silently inverted
|
|
12
|
+
* eighteen manifest steps when a default flipped. The view setters write the SHOWN collection's own
|
|
13
|
+
* view, so each collection keeps its own.
|
|
15
14
|
*/
|
|
16
15
|
|
|
17
16
|
import {
|
|
@@ -22,18 +21,11 @@ import {
|
|
|
22
21
|
optionalStringArg,
|
|
23
22
|
stringProperty,
|
|
24
23
|
} from "../commands/command-args";
|
|
25
|
-
import {
|
|
24
|
+
import { LIBRARY_LAYOUTS, LIBRARY_LAYOUT_LABELS, projectLocales } from "./library-model";
|
|
25
|
+
import { contentCollectionKeys } from "../content/content-collections";
|
|
26
26
|
import {
|
|
27
|
-
LIBRARY_CATEGORY_KEYS,
|
|
28
|
-
LIBRARY_LAYOUTS,
|
|
29
|
-
LIBRARY_LAYOUT_LABELS,
|
|
30
|
-
projectLocales,
|
|
31
|
-
} from "./library-model";
|
|
32
|
-
import {
|
|
33
|
-
createLibraryEntry,
|
|
34
|
-
libraryNewEntries,
|
|
35
27
|
refreshLibrary,
|
|
36
|
-
|
|
28
|
+
setContentCollection,
|
|
37
29
|
setLibraryLayout,
|
|
38
30
|
setLibraryLocale,
|
|
39
31
|
setLibrarySearch,
|
|
@@ -41,76 +33,77 @@ import {
|
|
|
41
33
|
import type { LibraryLayout } from "./library-model";
|
|
42
34
|
import type { AnyCommand, CommandRegistry } from "../commands/registry";
|
|
43
35
|
|
|
44
|
-
/** Every value `
|
|
36
|
+
/** Every value `content.setLocale` accepts: the project's own locales, plus "all" for none of them. */
|
|
45
37
|
function localeChoices(): string[] {
|
|
46
38
|
return ["all", ...projectLocales()];
|
|
47
39
|
}
|
|
48
40
|
|
|
49
|
-
/**
|
|
50
|
-
|
|
41
|
+
/**
|
|
42
|
+
* Show a collection in the Content home, opening the home if it is not open.
|
|
43
|
+
*
|
|
44
|
+
* Opening the home activates it, and activating a tab enters its workspace (§22.1), so this is also
|
|
45
|
+
* how a script reaches Content on a named collection in one step.
|
|
46
|
+
*/
|
|
47
|
+
export async function showCollection(key: string): Promise<void> {
|
|
48
|
+
setContentCollection(key);
|
|
49
|
+
/* Dynamic: the home's module mounts surfaces, and this record is loaded in the bare Bun process
|
|
50
|
+
the CI checks run in. */
|
|
51
|
+
const { openWorkspaceHome } = await import("../workspace/workspace-home");
|
|
52
|
+
openWorkspaceHome("content");
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/** The Content home's command records. */
|
|
56
|
+
export function contentViewCommands(): AnyCommand[] {
|
|
51
57
|
return [
|
|
52
|
-
{
|
|
53
|
-
category: "Project",
|
|
54
|
-
id: "library.open",
|
|
55
|
-
// ⌘⇧E, as studio.md §9.1.2 names it. The Library is the content surface for a site
|
|
56
|
-
// With a collection, and it was reachable only by palette search and one overflow menu item.
|
|
57
|
-
keybinding: "mod+shift+e",
|
|
58
|
-
level: "project",
|
|
59
|
-
menus: ["commandbar/overflow", "palette", "context/file"],
|
|
60
|
-
group: "1_file",
|
|
61
|
-
requires: "an open project",
|
|
62
|
-
when: (ctx) => ctx.project.open,
|
|
63
|
-
/* No `aiTool`, by studio-ui-guidelines.md §12.4's first deletion rule: chrome. None of the
|
|
64
|
-
Library family is projected — every one of these verbs shapes a listing a person reads,
|
|
65
|
-
and the model has `list_files` / `search_files` for the same facts. */
|
|
66
|
-
run: () => {
|
|
67
|
-
openLibraryTab();
|
|
68
|
-
},
|
|
69
|
-
title: "Open Library",
|
|
70
|
-
},
|
|
71
58
|
{
|
|
72
59
|
args: argsSchema({
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
60
|
+
/* Derived: this record is built at module scope, before any project is open, so a frozen
|
|
61
|
+
enum would offer only `pages` forever. The getter is read when the prompt opens, when
|
|
62
|
+
the tool list is serialised, and when `registry.run` coerces the value; an enum is also
|
|
63
|
+
what keeps the verb in the palette, which prompts for enums only. A shot is checked with
|
|
64
|
+
no project open, so a manifest step may name `pages` and nothing else. */
|
|
65
|
+
collection: derivedEnumProperty(
|
|
66
|
+
contentCollectionKeys,
|
|
67
|
+
'Which collection the Content home shows: "pages", or a collection project.json declares.',
|
|
76
68
|
),
|
|
77
69
|
}),
|
|
78
70
|
category: "Project",
|
|
79
|
-
id: "
|
|
71
|
+
id: "content.showCollection",
|
|
80
72
|
level: "project",
|
|
81
73
|
menus: ["palette"],
|
|
82
74
|
group: "1_file",
|
|
83
75
|
requires: "an open project",
|
|
84
76
|
when: (ctx) => ctx.project.open,
|
|
85
|
-
/* No `aiTool
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
77
|
+
/* No `aiTool`, by studio-ui-guidelines.md §12.4's first deletion rule: it shapes a listing a
|
|
78
|
+
person reads, and the model has `list_files` for the same facts. */
|
|
79
|
+
run: async (_ctx, args) => {
|
|
80
|
+
const key = enumArg("content.showCollection", args, "collection", contentCollectionKeys());
|
|
81
|
+
await showCollection(key);
|
|
89
82
|
},
|
|
90
|
-
title: "
|
|
83
|
+
title: "Content: Show Collection",
|
|
91
84
|
},
|
|
92
85
|
{
|
|
93
86
|
args: argsSchema({
|
|
94
87
|
layout: enumProperty(
|
|
95
88
|
LIBRARY_LAYOUTS,
|
|
96
|
-
`How the
|
|
89
|
+
`How the Content home arranges the collection it shows: ${LIBRARY_LAYOUTS.map(
|
|
97
90
|
(layout) => LIBRARY_LAYOUT_LABELS[layout],
|
|
98
91
|
).join(", ")}.`,
|
|
99
92
|
),
|
|
100
93
|
}),
|
|
101
94
|
category: "Project",
|
|
102
|
-
id: "
|
|
95
|
+
id: "content.setLayout",
|
|
103
96
|
level: "project",
|
|
104
97
|
menus: ["palette"],
|
|
105
98
|
group: "1_file",
|
|
106
99
|
requires: "an open project",
|
|
107
100
|
when: (ctx) => ctx.project.open,
|
|
108
|
-
/* No `aiTool`: a listing
|
|
101
|
+
/* No `aiTool`: a listing view for a person (studio-ui-guidelines.md §12.4, rule 1). */
|
|
109
102
|
run: (_ctx, args) => {
|
|
110
|
-
const layout = enumArg<LibraryLayout>("
|
|
103
|
+
const layout = enumArg<LibraryLayout>("content.setLayout", args, "layout", LIBRARY_LAYOUTS);
|
|
111
104
|
setLibraryLayout(layout);
|
|
112
105
|
},
|
|
113
|
-
title: "
|
|
106
|
+
title: "Content: Set View",
|
|
114
107
|
},
|
|
115
108
|
{
|
|
116
109
|
args: {
|
|
@@ -121,7 +114,7 @@ export function libraryCommands(): AnyCommand[] {
|
|
|
121
114
|
type: "object",
|
|
122
115
|
},
|
|
123
116
|
category: "Project",
|
|
124
|
-
id: "
|
|
117
|
+
id: "content.setSearch",
|
|
125
118
|
level: "project",
|
|
126
119
|
menus: ["palette"],
|
|
127
120
|
group: "1_file",
|
|
@@ -130,42 +123,38 @@ export function libraryCommands(): AnyCommand[] {
|
|
|
130
123
|
/* No `aiTool`: a listing filter for a person; the model has `search_files`
|
|
131
124
|
(studio-ui-guidelines.md §12.4, rule 1). */
|
|
132
125
|
run: (_ctx, args) => {
|
|
133
|
-
setLibrarySearch(optionalStringArg("
|
|
126
|
+
setLibrarySearch(optionalStringArg("content.setSearch", args, "query") ?? "");
|
|
134
127
|
},
|
|
135
|
-
title: "
|
|
128
|
+
title: "Content: Search Collection",
|
|
136
129
|
},
|
|
137
130
|
{
|
|
138
131
|
args: argsSchema({
|
|
139
|
-
/* Derived, for the reason `content
|
|
140
|
-
built at module scope, before any project is open, so `enumProperty(localeChoices(), …)`
|
|
141
|
-
would freeze at `["all"]` and the palette would offer that forever. The getter is read
|
|
142
|
-
when the prompt opens, when the AI tool list is serialised, and when `registry.run`
|
|
143
|
-
coerces the value. */
|
|
132
|
+
/* Derived, for the reason `content.showCollection` gives. */
|
|
144
133
|
locale: derivedEnumProperty(
|
|
145
134
|
localeChoices,
|
|
146
|
-
'Which language the
|
|
135
|
+
'Which language the Content home lists, as a BCP 47 tag the project declares. "all" ' +
|
|
147
136
|
"clears the language filter.",
|
|
148
137
|
),
|
|
149
138
|
}),
|
|
150
139
|
category: "Project",
|
|
151
|
-
id: "
|
|
140
|
+
id: "content.setLocale",
|
|
152
141
|
level: "project",
|
|
153
142
|
menus: ["palette"],
|
|
154
143
|
group: "1_file",
|
|
155
144
|
requires: "a project with more than one locale",
|
|
156
|
-
// A monolingual project has no facet to set: the
|
|
157
|
-
//
|
|
145
|
+
// A monolingual project has no facet to set: the home draws no picker, and offering the verb
|
|
146
|
+
// Would name a value space with one member in it.
|
|
158
147
|
when: (ctx) => ctx.project.open && ctx.project.isMultilingual,
|
|
159
148
|
/* No `aiTool`: a listing filter for a person (studio-ui-guidelines.md §12.4, rule 1). */
|
|
160
149
|
run: (_ctx, args) => {
|
|
161
|
-
const choice = enumArg("
|
|
150
|
+
const choice = enumArg("content.setLocale", args, "locale", localeChoices());
|
|
162
151
|
setLibraryLocale(choice === "all" ? "" : choice);
|
|
163
152
|
},
|
|
164
|
-
title: "
|
|
153
|
+
title: "Content: Show Language",
|
|
165
154
|
},
|
|
166
155
|
{
|
|
167
156
|
category: "Project",
|
|
168
|
-
id: "
|
|
157
|
+
id: "content.refresh",
|
|
169
158
|
level: "project",
|
|
170
159
|
menus: ["palette"],
|
|
171
160
|
group: "1_file",
|
|
@@ -173,41 +162,12 @@ export function libraryCommands(): AnyCommand[] {
|
|
|
173
162
|
when: (ctx) => ctx.project.open,
|
|
174
163
|
/* No `aiTool`: chrome (studio-ui-guidelines.md §12.4, rule 1). */
|
|
175
164
|
run: () => refreshLibrary(),
|
|
176
|
-
title: "
|
|
177
|
-
},
|
|
178
|
-
{
|
|
179
|
-
args: {
|
|
180
|
-
additionalProperties: false,
|
|
181
|
-
properties: {
|
|
182
|
-
type: stringProperty(
|
|
183
|
-
'What to create: "page", "layout", "component", or "collection:<name>" for a ' +
|
|
184
|
-
"content collection this project declares.",
|
|
185
|
-
),
|
|
186
|
-
},
|
|
187
|
-
required: ["type"],
|
|
188
|
-
type: "object",
|
|
189
|
-
},
|
|
190
|
-
category: "Project",
|
|
191
|
-
id: "library.newEntry",
|
|
192
|
-
level: "project",
|
|
193
|
-
menus: ["palette"],
|
|
194
|
-
group: "1_file",
|
|
195
|
-
requires: "an open project",
|
|
196
|
-
when: (ctx) => ctx.project.open,
|
|
197
|
-
undo: "project",
|
|
198
|
-
/* No `aiTool`, by studio-ui-guidelines.md §12.4's second deletion rule: it waits on the New
|
|
199
|
-
File prompt; `create_page` / `create_component` cover the job. */
|
|
200
|
-
run: async (_ctx, args) => {
|
|
201
|
-
const declared = libraryNewEntries().map((entry) => entry.key);
|
|
202
|
-
const key = enumArg("library.newEntry", args, "type", declared);
|
|
203
|
-
await createLibraryEntry(key);
|
|
204
|
-
},
|
|
205
|
-
title: "Library: New Entry",
|
|
165
|
+
title: "Content: Rescan Files",
|
|
206
166
|
},
|
|
207
167
|
];
|
|
208
168
|
}
|
|
209
169
|
|
|
210
|
-
/** Register the
|
|
211
|
-
export function
|
|
212
|
-
registry.registerAll(
|
|
170
|
+
/** Register the Content home's verbs. */
|
|
171
|
+
export function registerContentViewCommands(registry: CommandRegistry): void {
|
|
172
|
+
registry.registerAll(contentViewCommands());
|
|
213
173
|
}
|