@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
package/src/studio.ts
CHANGED
|
@@ -21,10 +21,12 @@ import {
|
|
|
21
21
|
registerRenderer,
|
|
22
22
|
render,
|
|
23
23
|
requireProjectState,
|
|
24
|
+
requireShellRef,
|
|
24
25
|
setProjectState,
|
|
25
26
|
toolbarEl,
|
|
26
27
|
updateSession,
|
|
27
28
|
} from "./store";
|
|
29
|
+
import { getEffectiveRenderLocale } from "./site-context";
|
|
28
30
|
|
|
29
31
|
import {
|
|
30
32
|
PRIMARY_PANE,
|
|
@@ -57,6 +59,7 @@ import { isEditing } from "./editor/inline-edit";
|
|
|
57
59
|
import { applyTransform, registerCanvasViewCommands } from "./canvas/canvas-utils";
|
|
58
60
|
import { diffCommands, setDiffChromeRepaint } from "./canvas/diff-toolbar";
|
|
59
61
|
import type { CanvasSurface } from "./canvas/canvas-surface";
|
|
62
|
+
import type { InspectorTabId } from "./shell";
|
|
60
63
|
import {
|
|
61
64
|
initCanvasRender,
|
|
62
65
|
registerSelectionSetCommand,
|
|
@@ -117,15 +120,15 @@ import {
|
|
|
117
120
|
import {
|
|
118
121
|
loadProject as _loadProject,
|
|
119
122
|
openProject as _openProject,
|
|
120
|
-
renderFilesTemplate,
|
|
121
123
|
findHomePage,
|
|
122
124
|
loadDirectory,
|
|
125
|
+
loadProjectDirectories,
|
|
123
126
|
openFileInPane,
|
|
124
127
|
openFileInTab,
|
|
125
128
|
openLastSessionOrHome,
|
|
126
|
-
registerFileTreeDnD,
|
|
127
129
|
reloadCleanTab,
|
|
128
130
|
reloadTabsIfChanged,
|
|
131
|
+
setSessionWorkspaceShow,
|
|
129
132
|
} from "./files/files";
|
|
130
133
|
import { resetIgnoreCache } from "./files/gitignore";
|
|
131
134
|
import { resetAssetVersions } from "./files/asset-versions";
|
|
@@ -136,12 +139,21 @@ import {
|
|
|
136
139
|
configureCollabParser,
|
|
137
140
|
configureCollabSerializer,
|
|
138
141
|
} from "./collab/collab-session";
|
|
139
|
-
import {
|
|
140
|
-
import { invalidateLayoutPickerCache, renderHeadTemplate } from "./panels/head-panel";
|
|
141
|
-
import { exportCemManifest as _exportCemManifest } from "./services/cem-export";
|
|
142
|
+
import { invalidateLayoutPickerCache } from "./panels/head-panel";
|
|
142
143
|
import { installAutomationHook } from "./services/automation";
|
|
143
|
-
import { invalidateLibrary } from "./browse/library-pane";
|
|
144
|
-
import {
|
|
144
|
+
import { invalidateLibrary, resetContentView } from "./browse/library-pane";
|
|
145
|
+
import { invalidateCollectionPages, resetCollectionPages } from "./content/collection-pages";
|
|
146
|
+
import { invalidatePageSummaries } from "./content/page-summaries";
|
|
147
|
+
import { invalidateEntrySummaries, noteSavedEntry } from "./content/entry-summaries";
|
|
148
|
+
import { invalidateRepeaterSources } from "./canvas/repeater-sources";
|
|
149
|
+
import { entryFields } from "./content/entry-fields";
|
|
150
|
+
import { contentCacheDrops } from "./content/content-collections";
|
|
151
|
+
import { resetWritingBanners } from "./content/writing-banner";
|
|
152
|
+
import { resetCollectionsPanel } from "./panels/collections-panel";
|
|
153
|
+
import { resetStylesPanel } from "./panels/styles-panel";
|
|
154
|
+
import { resetVariablesFocus } from "./style/variables-focus";
|
|
155
|
+
import { invalidateMediaCache, isMediaScanPath } from "./ui/media-picker";
|
|
156
|
+
import { invalidateSiteIndex, resetSitePanel } from "./panels/site-panel";
|
|
145
157
|
import { setMediaChangedHandler } from "./files/media-upload";
|
|
146
158
|
import { applyFileDrop } from "./editor/file-drop-action";
|
|
147
159
|
import {
|
|
@@ -171,13 +183,13 @@ import { autoSyncProjectOnOpen } from "./packages/pull-package-sync";
|
|
|
171
183
|
import webdata from "../data/webdata.json";
|
|
172
184
|
import { registerDataExplorerCommands } from "./panels/data-explorer";
|
|
173
185
|
import {
|
|
174
|
-
|
|
186
|
+
cleanupSourceControl,
|
|
175
187
|
cloneRepository,
|
|
176
188
|
loadDiffForLens,
|
|
177
189
|
registerSourceControlCommands,
|
|
178
|
-
renderGitPanel,
|
|
179
190
|
noteFileSaved,
|
|
180
|
-
|
|
191
|
+
setSourceControlDeps,
|
|
192
|
+
} from "./publish/source-control";
|
|
181
193
|
|
|
182
194
|
import { registerKit } from "./ui/kit";
|
|
183
195
|
import "./ui/panel-resize.js";
|
|
@@ -188,13 +200,12 @@ import { initShortcuts, registerStudioCommands } from "./editor/shortcuts";
|
|
|
188
200
|
import type { ProjectOpenOutcome, ProjectOpenTarget } from "./editor/shortcuts";
|
|
189
201
|
import { createCommandRegistry } from "./commands/registry";
|
|
190
202
|
import { chordsInScopes } from "./commands/keymap";
|
|
191
|
-
import { FRAME_KEY_SCOPES } from "./canvas/iframe-keys";
|
|
203
|
+
import { FRAME_KEY_SCOPES, HOST_ONLY_COMMANDS } from "./canvas/iframe-keys";
|
|
192
204
|
import { createLiveContext } from "./commands/live-context";
|
|
193
205
|
import { hasAiCredentials } from "./services/ai-models";
|
|
194
|
-
import { mount
|
|
206
|
+
import { mount } from "./surfaces/rail";
|
|
195
207
|
import * as toolbarPanel from "./surfaces/commandbar";
|
|
196
208
|
import * as overlaysPanel from "./panels/overlays";
|
|
197
|
-
import * as frontmatterPanelMod from "./panels/frontmatter-panel";
|
|
198
209
|
import * as rightPanelMod from "./panels/right-panel";
|
|
199
210
|
import * as chatPanelMod from "./panels/chat-panel";
|
|
200
211
|
import { setProjectAdopter } from "./services/project-adoption";
|
|
@@ -254,21 +265,38 @@ import { registerPopoverCommands } from "./services/popover-report";
|
|
|
254
265
|
import { registerStyleCommands } from "./panels/style-panel";
|
|
255
266
|
import { registerGridCommands } from "./grid/grid-open";
|
|
256
267
|
import { registerExtensionCommands } from "./settings/extension-commands";
|
|
257
|
-
import {
|
|
268
|
+
import {
|
|
269
|
+
registerSettingsCommands,
|
|
270
|
+
rememberStylesView,
|
|
271
|
+
showSettingsDocument,
|
|
272
|
+
} from "./settings/settings-document";
|
|
273
|
+
import {
|
|
274
|
+
installWorkspaceFollow,
|
|
275
|
+
revealInPane,
|
|
276
|
+
switchWorkspace,
|
|
277
|
+
} from "./workspace/workspace-switch";
|
|
278
|
+
import { workspaceBackCommands } from "./workspace/workspace-back";
|
|
279
|
+
import type { HomeWorkspaceId, WorkspaceId } from "./workspace/workspace-ids";
|
|
280
|
+
import { openWorkspaceHome, placeWorkspaceHome } from "./workspace/workspace-home";
|
|
258
281
|
import { registerPreferencesCommands } from "./settings/preferences-dialog";
|
|
259
282
|
import { registerAboutCommands } from "./about/about-modal";
|
|
260
283
|
import { registerCollabCommands } from "./collab/collab-commands";
|
|
261
|
-
import {
|
|
284
|
+
import { registerContentViewCommands } from "./browse/library-commands";
|
|
262
285
|
import { registerFileFormatCommands } from "./format/convert-file";
|
|
263
286
|
import { registerPublishCommands } from "./publish/publish-commands";
|
|
264
287
|
import { registerGridViewCommands } from "./grid/grid-panel";
|
|
265
288
|
import { registerRedirectsCommands } from "./grid/redirects-grid";
|
|
266
289
|
import { registerContentCommands } from "./content/entry-commands";
|
|
290
|
+
import { registerAddNewCommands } from "./create/add-new-commands";
|
|
291
|
+
import { registerMediaCommands } from "./media/media-commands";
|
|
292
|
+
import { focusMediaHome, resetMediaLibrary } from "./media/media-library";
|
|
293
|
+
import { focusPublishHome } from "./publish/publish-workspace";
|
|
267
294
|
import { registerI18nCommands } from "./i18n/i18n-commands";
|
|
268
295
|
import { convertToComponent } from "./editor/convert-to-component";
|
|
269
296
|
import type { GitDiffState } from "./types";
|
|
297
|
+
import { PROJECT_CONFIG_PATH } from "./tabs/tab";
|
|
270
298
|
import type { Tab } from "./tabs/tab";
|
|
271
|
-
import type { JxDocument,
|
|
299
|
+
import type { JxDocument, ProjectConfig } from "@jxsuite/schema/types";
|
|
272
300
|
import { setBundleBase } from "./services/bundle-base";
|
|
273
301
|
import { mountBootFailureTree, mountShellTree } from "./shell/tree";
|
|
274
302
|
|
|
@@ -299,8 +327,8 @@ setBundleBase(import.meta.url);
|
|
|
299
327
|
*
|
|
300
328
|
* `loadDiff` is here rather than in `workspace/pane-derive.ts` because that module owns no I/O —
|
|
301
329
|
* which is what lets its whole decision-making half be tested with no platform. It is the same pair
|
|
302
|
-
* of reads `
|
|
303
|
-
* "original" is the empty string rather than a `gitShow` that would throw.
|
|
330
|
+
* of reads `publish/source-control.ts` makes for a Before and after; an added file has no `HEAD`
|
|
331
|
+
* copy, so its "original" is the empty string rather than a `gitShow` that would throw.
|
|
304
332
|
*/
|
|
305
333
|
const derivationDeps: DerivationDeps = {
|
|
306
334
|
/*
|
|
@@ -373,6 +401,10 @@ function setCanvasMode(tab: Tab | null, mode: string) {
|
|
|
373
401
|
shell.git.diffState = null;
|
|
374
402
|
}
|
|
375
403
|
tab.session.ui.canvasMode = mode;
|
|
404
|
+
// The Styles home view follows the author's own switches between Variables and Elements.
|
|
405
|
+
if (tab.documentPath === PROJECT_CONFIG_PATH) {
|
|
406
|
+
rememberStylesView(mode);
|
|
407
|
+
}
|
|
376
408
|
}
|
|
377
409
|
|
|
378
410
|
// ─── Component registry ───────────────────────────────────────────────────────
|
|
@@ -499,7 +531,7 @@ initShellRefs();
|
|
|
499
531
|
mountShell();
|
|
500
532
|
|
|
501
533
|
// Mount extracted panel modules
|
|
502
|
-
toolbarPanel.mount(toolbarEl, {
|
|
534
|
+
toolbarPanel.mount(requireShellRef(toolbarEl, "toolbar"), {
|
|
503
535
|
closeFunctionEditor: () => closeFunctionEditor(),
|
|
504
536
|
getCanvasMode,
|
|
505
537
|
openProject: () => openProject(),
|
|
@@ -527,11 +559,26 @@ const primaryCell = cellForPane(PRIMARY_PANE);
|
|
|
527
559
|
|
|
528
560
|
tabStrip.mount(primaryCell?.strip ?? document.createElement("div"));
|
|
529
561
|
|
|
562
|
+
/**
|
|
563
|
+
* Give the keyboard to the home a Back landed on (`workspace/workspace-back.ts`): the media tile
|
|
564
|
+
* that was opened, the change whose comparison it was. One function for the Back control and for
|
|
565
|
+
* Escape, so the two land in the same place.
|
|
566
|
+
*/
|
|
567
|
+
function focusWorkspaceHome(paneId: string, id: WorkspaceId): void {
|
|
568
|
+
if (id === "media") {
|
|
569
|
+
focusMediaHome(paneId);
|
|
570
|
+
} else if (id === "publish") {
|
|
571
|
+
focusPublishHome(paneId);
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
|
|
530
575
|
paneContext.mount(primaryCell?.chrome ?? document.createElement("div"), {
|
|
531
576
|
exportFile,
|
|
532
577
|
// No `getCanvasMode`: the bar is drawn once per pane and asks its own pane. See `PaneContextCtx`.
|
|
533
578
|
parseMediaEntries,
|
|
534
579
|
setCanvasMode,
|
|
580
|
+
closeTab: tabStrip.requestClose,
|
|
581
|
+
focusHome: focusWorkspaceHome,
|
|
535
582
|
});
|
|
536
583
|
/* The diff's Visual/Code switch decides whether the zoom pod is drawn, and the half it writes is
|
|
537
584
|
not reactive — so the switch repaints the chrome as well as the stage. See `setDiffChromeRepaint`. */
|
|
@@ -561,6 +608,7 @@ setFileDropHandler(applyFileDrop);
|
|
|
561
608
|
setMediaChangedHandler(async (dir) => {
|
|
562
609
|
invalidateMediaCache();
|
|
563
610
|
invalidateLibrary();
|
|
611
|
+
invalidateSiteIndex();
|
|
564
612
|
await loadDirectory(dir);
|
|
565
613
|
renderLeftPanel();
|
|
566
614
|
});
|
|
@@ -585,7 +633,7 @@ setStylebookHitHandler((tag, media) => {
|
|
|
585
633
|
1. Commit-on-parent-click: it ends the live inline-edit session, which the iframe cannot observe
|
|
586
634
|
itself (layers panel, tab strip, right panel…).
|
|
587
635
|
2. The block action bar goes with it. The bar is `position: fixed` and clamped into the window,
|
|
588
|
-
so it can sit over the
|
|
636
|
+
so it can sit over the pane context bar, the Inspector and the docks; an author
|
|
589
637
|
working in the Inspector's Logic tab reported it "blocking a part of the interface that the
|
|
590
638
|
user needs to utilize". It is SUPPRESSED, not dismissed — a plain dismiss flashes back on the
|
|
591
639
|
next snapshot or overlay repaint — and it comes back the moment the canvas takes a pointer or
|
|
@@ -641,9 +689,8 @@ window.addEventListener("beforeunload", (e: BeforeUnloadEvent) => {
|
|
|
641
689
|
// Author may cancel the close, and the record is the same either way.
|
|
642
690
|
flushSession();
|
|
643
691
|
if (hasUnsavedTabs()) {
|
|
692
|
+
// The HTML standard's trigger for the leave-page prompt; the legacy `returnValue` is deprecated.
|
|
644
693
|
e.preventDefault();
|
|
645
|
-
// Legacy browsers require a truthy returnValue to trigger the native confirm prompt.
|
|
646
|
-
e.returnValue = "";
|
|
647
694
|
}
|
|
648
695
|
});
|
|
649
696
|
|
|
@@ -743,11 +790,8 @@ function installPaneRenderEffects(paneId: string): void {
|
|
|
743
790
|
installDerivationEffects(paneId, derivationDeps);
|
|
744
791
|
effect(() => {
|
|
745
792
|
const tab = tabOfPane(paneId);
|
|
746
|
-
if (tab) {
|
|
747
|
-
|
|
748
|
-
if (doc && consumePatchedDocument(doc, paneId)) {
|
|
749
|
-
return;
|
|
750
|
-
}
|
|
793
|
+
if (tab && consumePatchedDocument(tab.doc.document, paneId)) {
|
|
794
|
+
return;
|
|
751
795
|
}
|
|
752
796
|
scheduleCanvasRender(paneId);
|
|
753
797
|
});
|
|
@@ -781,10 +825,8 @@ function installPaneRenderEffects(paneId: string): void {
|
|
|
781
825
|
void tab.session.ui.previewProps;
|
|
782
826
|
void tab.session.ui.showLayout;
|
|
783
827
|
}
|
|
784
|
-
// Project-level render inputs: the stylebook catalogue's filters
|
|
785
|
-
//
|
|
786
|
-
void shell.settingsTab;
|
|
787
|
-
void shell.stylebook.tab;
|
|
828
|
+
// Project-level render inputs: the stylebook catalogue's filters are shell state, so a change
|
|
829
|
+
// Repaints the canvas with or without a document focused.
|
|
788
830
|
void shell.stylebook.filter;
|
|
789
831
|
void shell.stylebook.customizedOnly;
|
|
790
832
|
scheduleCanvasRender(paneId);
|
|
@@ -803,8 +845,11 @@ function installPaneRenderEffects(paneId: string): void {
|
|
|
803
845
|
* The other half of `i18n.switchLocale`. Without this the control moves a chip and the artboard
|
|
804
846
|
* goes on drawing the same document left-to-right, which makes the verb a label rather than a
|
|
805
847
|
* rendering context. Scoped to THIS pane's stage for the reason the scheme effect above gives.
|
|
848
|
+
* The document's OWN language when nothing is chosen, so an Arabic file draws right to left
|
|
849
|
+
* without being asked (`getEffectiveRenderLocale`).
|
|
806
850
|
*/
|
|
807
|
-
const
|
|
851
|
+
const tab = tabOfPane(paneId);
|
|
852
|
+
const locale = getEffectiveRenderLocale(tab?.session.ui.previewLocale, tab?.documentPath);
|
|
808
853
|
postLocaleToLiveHosts(locale, surfaceForPane(paneId).wrap);
|
|
809
854
|
});
|
|
810
855
|
}
|
|
@@ -849,10 +894,6 @@ rightPanelMod.mount({
|
|
|
849
894
|
renderCanvas: () => renderCanvas(),
|
|
850
895
|
});
|
|
851
896
|
|
|
852
|
-
// The Document Header card — every document with frontmatter or `$head`. It has no host of its own:
|
|
853
|
-
// The stage hands one over (`canvas-render.ts`), and this only starts the reactive subscription.
|
|
854
|
-
frontmatterPanelMod.mount();
|
|
855
|
-
|
|
856
897
|
// The assistant's create_project tool adopts freshly scaffolded projects through the same
|
|
857
898
|
// Flow as the recent-projects list.
|
|
858
899
|
setProjectAdopter(openRecentProject);
|
|
@@ -862,8 +903,20 @@ setImportHandoff(revealImportHandoff);
|
|
|
862
903
|
one — see services/connection.ts for why only the chromium shell can. */
|
|
863
904
|
watchConnection();
|
|
864
905
|
|
|
906
|
+
/* What source control needs from the bootstrap: the two writes a comparison makes outside
|
|
907
|
+
`shell.git` (the Publish workspace's Before and after puts the file's own tab into git-diff), and
|
|
908
|
+
the clone flow, which ends by opening the project it cloned. */
|
|
909
|
+
setSourceControlDeps({
|
|
910
|
+
cloneRepository: () => {
|
|
911
|
+
void cloneRepository({ openRecentProject });
|
|
912
|
+
},
|
|
913
|
+
setCanvasMode,
|
|
914
|
+
setGitDiffState: (state: GitDiffState | null) => {
|
|
915
|
+
shell.git.diffState = state;
|
|
916
|
+
},
|
|
917
|
+
});
|
|
918
|
+
|
|
865
919
|
leftPanelMod.mount({
|
|
866
|
-
cloneRepository: () => cloneRepository({ openRecentProject }),
|
|
867
920
|
defBadgeLabel,
|
|
868
921
|
defCategory,
|
|
869
922
|
defaultDef,
|
|
@@ -871,7 +924,6 @@ leftPanelMod.mount({
|
|
|
871
924
|
navigateToComponent,
|
|
872
925
|
registerComponentsDnD,
|
|
873
926
|
registerElementsDnD,
|
|
874
|
-
registerFileTreeDnD,
|
|
875
927
|
registerLayersDnD,
|
|
876
928
|
renderCanvas: () => renderCanvas(),
|
|
877
929
|
// The Data panel's Refresh: a canvas re-render that ALSO lets automatic `Request` state entries
|
|
@@ -894,15 +946,8 @@ leftPanelMod.mount({
|
|
|
894
946
|
}
|
|
895
947
|
renderCanvas(paneId);
|
|
896
948
|
},
|
|
897
|
-
renderFilesTemplate,
|
|
898
|
-
renderGitPanel,
|
|
899
|
-
renderHeadTemplate,
|
|
900
|
-
renderImportsTemplate,
|
|
901
949
|
mountSignalsPanel,
|
|
902
950
|
setCanvasMode,
|
|
903
|
-
setGitDiffState: (state: GitDiffState | null) => {
|
|
904
|
-
shell.git.diffState = state;
|
|
905
|
-
},
|
|
906
951
|
webdata,
|
|
907
952
|
});
|
|
908
953
|
|
|
@@ -911,7 +956,6 @@ leftPanelMod.mount({
|
|
|
911
956
|
registerRenderer("leftPanel", () => leftPanelMod.render());
|
|
912
957
|
registerRenderer("canvas", () => renderCanvas());
|
|
913
958
|
registerRenderer("rightPanel", () => rightPanelMod.render());
|
|
914
|
-
registerRenderer("frontmatterPanel", () => frontmatterPanelMod.render());
|
|
915
959
|
registerRenderer("seoModal", renderSeoModal);
|
|
916
960
|
registerRenderer("chatPanel", () => chatPanelMod.render());
|
|
917
961
|
registerRenderer("overlays", () => overlaysPanel.render());
|
|
@@ -919,7 +963,7 @@ renderStatusbar();
|
|
|
919
963
|
// The status bar mounts the jump bar too: the focused pane's breadcrumb trail is its DOCUMENT
|
|
920
964
|
// Field, and the only breadcrumb in the shell.
|
|
921
965
|
mountStatusbar();
|
|
922
|
-
|
|
966
|
+
mount();
|
|
923
967
|
|
|
924
968
|
/* The background-click deselect moved into `editor/shortcuts.ts`'s `installStageGestures`, beside
|
|
925
969
|
the wheel and the middle-drag, because it is a STAGE gesture: it compared against the app's one
|
|
@@ -957,9 +1001,32 @@ function ensureFsSync() {
|
|
|
957
1001
|
of them wrong, and it is the same event for all four. The bar's memo is separate from
|
|
958
1002
|
`page-params`' because it is keyed per DOCUMENT rather than globally; leaving it behind kept
|
|
959
1003
|
a stale candidate list in the picker after the collection changed. */
|
|
960
|
-
invalidateDerivedCaches: () => {
|
|
1004
|
+
invalidateDerivedCaches: (paths, structural = true) => {
|
|
961
1005
|
invalidatePageRouteCache();
|
|
962
1006
|
invalidateLayoutPickerCache();
|
|
1007
|
+
invalidateSiteIndex(paths);
|
|
1008
|
+
/* The Content workspace's three: the scan its collections are filtered from, the pages that
|
|
1009
|
+
say where each collection is published, and the entry list the Collections panel draws.
|
|
1010
|
+
Each is dropped only by a batch that can make it wrong, so a save does not re-walk the
|
|
1011
|
+
project or blank the Collections panel (`contentCacheDrops`). */
|
|
1012
|
+
const drops = contentCacheDrops(paths, structural);
|
|
1013
|
+
if (drops.scan) {
|
|
1014
|
+
invalidateLibrary();
|
|
1015
|
+
}
|
|
1016
|
+
if (drops.pages) {
|
|
1017
|
+
invalidateCollectionPages();
|
|
1018
|
+
invalidatePageSummaries();
|
|
1019
|
+
}
|
|
1020
|
+
if (drops.entries) {
|
|
1021
|
+
invalidateEntrySummaries();
|
|
1022
|
+
invalidateRepeaterSources();
|
|
1023
|
+
}
|
|
1024
|
+
/* The media listing is a walk of `public/` and every collection's `images/`, so only a batch
|
|
1025
|
+
under one of them (or one that cannot say what changed) can make it wrong: a file added by
|
|
1026
|
+
git, the OS or a Files-panel delete. */
|
|
1027
|
+
if (paths === undefined || paths.some((path) => isMediaScanPath(path))) {
|
|
1028
|
+
invalidateMediaCache();
|
|
1029
|
+
}
|
|
963
1030
|
invalidateParamValues();
|
|
964
1031
|
paneContext.resetParamValues();
|
|
965
1032
|
},
|
|
@@ -975,18 +1042,18 @@ const _urlParams = new URLSearchParams(location.search);
|
|
|
975
1042
|
const _projectParam = _urlParams.get("project") || _urlParams.get("open");
|
|
976
1043
|
|
|
977
1044
|
if (!_projectParam) {
|
|
978
|
-
//
|
|
1045
|
+
// The desktop app (and other non-?project= hosts) load their project over RPC, so the ?project= branch
|
|
979
1046
|
// Below — which is the only place that calls platform.activate() — is skipped. Kick off activate()
|
|
980
|
-
// Here UNCONDITIONALLY so this window's
|
|
981
|
-
// Needs it); a render() once it resolves lets ensureHost
|
|
982
|
-
//
|
|
1047
|
+
// Here UNCONDITIONALLY so this window's canvasUrl is fetched on boot (the canvas iframe
|
|
1048
|
+
// Needs it); a render() once it resolves lets ensureHost rebuild against it if it differs from
|
|
1049
|
+
// The default (see iframe-host ensureHost's canvasUrl-changed rebuild).
|
|
983
1050
|
const _bootPlatform = getPlatform();
|
|
984
1051
|
// oxlint-disable-next-line unicorn/prefer-top-level-await -- fire-and-forget: must not block the initial render
|
|
985
1052
|
void _bootPlatform
|
|
986
|
-
.activate
|
|
1053
|
+
.activate()
|
|
987
1054
|
// No project is bound yet, so this call only warms the canvasUrl; a backend that refuses it
|
|
988
1055
|
// Still gets the render below rather than an unhandled rejection.
|
|
989
|
-
|
|
1056
|
+
.catch((error) => {
|
|
990
1057
|
// A refusal that offers an action is the action flow's to explain; it is not a fault.
|
|
991
1058
|
if (!isActionRequired(error)) {
|
|
992
1059
|
console.error("Boot activation failed:", error);
|
|
@@ -1018,18 +1085,14 @@ if (_projectParam) {
|
|
|
1018
1085
|
// Report a bare `Error: <message>` because the only identifying fact was still block-scoped.
|
|
1019
1086
|
let fileRelPath = _urlParams.get("file") || _projectParam;
|
|
1020
1087
|
try {
|
|
1021
|
-
const siteCtx = platform.resolveSiteContext
|
|
1022
|
-
? await platform.resolveSiteContext(_projectParam)
|
|
1023
|
-
: { sitePath: null };
|
|
1088
|
+
const siteCtx = await platform.resolveSiteContext(_projectParam);
|
|
1024
1089
|
|
|
1025
1090
|
if (siteCtx.sitePath) {
|
|
1026
1091
|
// Set PAL project root to absolute path so file ops work
|
|
1027
1092
|
if (siteCtx.sitePath) {
|
|
1028
1093
|
platform.projectRoot = siteCtx.sitePath;
|
|
1029
1094
|
// Await activation so the server resolves project-relative static files
|
|
1030
|
-
|
|
1031
|
-
await platform.activate();
|
|
1032
|
-
}
|
|
1095
|
+
await platform.activate();
|
|
1033
1096
|
}
|
|
1034
1097
|
|
|
1035
1098
|
resetIgnoreCache();
|
|
@@ -1053,31 +1116,9 @@ if (_projectParam) {
|
|
|
1053
1116
|
await ensureDependenciesInstalled();
|
|
1054
1117
|
await loadComponentRegistry();
|
|
1055
1118
|
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
"layouts",
|
|
1060
|
-
"components",
|
|
1061
|
-
"content",
|
|
1062
|
-
"data",
|
|
1063
|
-
"public",
|
|
1064
|
-
"styles",
|
|
1065
|
-
]);
|
|
1066
|
-
/* Through `loadDirectory`, not `platform.listDirectory`: this is the second copy of the
|
|
1067
|
-
conventional-dir walk (the first is `openProject` in files/files.ts), and the loader is
|
|
1068
|
-
what reads the `.gitignore` chain governing each directory. Listing around it left the
|
|
1069
|
-
`?project=` boot as the one door into a project whose tree knew no ignore rules. */
|
|
1070
|
-
await loadDirectory(".");
|
|
1071
|
-
const dirEntries = requireProjectState().dirs.get(".") ?? [];
|
|
1072
|
-
const foundDirs = [];
|
|
1073
|
-
for (const e of dirEntries) {
|
|
1074
|
-
if (e.type === "directory" && conventionalDirs.has(e.name)) {
|
|
1075
|
-
foundDirs.push(e.name);
|
|
1076
|
-
requireProjectState().expanded.add(e.path || e.name);
|
|
1077
|
-
await loadDirectory(e.path || e.name);
|
|
1078
|
-
}
|
|
1079
|
-
}
|
|
1080
|
-
requireProjectState().projectDirs = foundDirs;
|
|
1119
|
+
/* Through `loadDirectory` (inside `loadProjectDirectories`), not `platform.listDirectory`:
|
|
1120
|
+
the loader is what reads the `.gitignore` chain governing each directory. */
|
|
1121
|
+
await loadProjectDirectories();
|
|
1081
1122
|
void maybePromptJxsuiteUpdate(siteCtx.sitePath);
|
|
1082
1123
|
}
|
|
1083
1124
|
|
|
@@ -1144,7 +1185,7 @@ if (_projectParam) {
|
|
|
1144
1185
|
openTab({
|
|
1145
1186
|
id: fileRelPath,
|
|
1146
1187
|
documentPath: fileRelPath,
|
|
1147
|
-
document: parsedDoc
|
|
1188
|
+
document: parsedDoc,
|
|
1148
1189
|
...(frontmatter != null && { frontmatter }),
|
|
1149
1190
|
layout,
|
|
1150
1191
|
sourceFormat: fileFormat?.name ?? null,
|
|
@@ -1294,10 +1335,32 @@ async function openProject(target: ProjectOpenTarget = "thisWindow"): Promise<Pr
|
|
|
1294
1335
|
if (!(await tabStrip.confirmCloseAll("Opening another project"))) {
|
|
1295
1336
|
return "cancelled";
|
|
1296
1337
|
}
|
|
1297
|
-
const opened = await _openProject({ renderLeftPanel });
|
|
1338
|
+
const opened = await _openProject({ renderLeftPanel, resetProjectCaches });
|
|
1298
1339
|
ensureFsSync();
|
|
1299
1340
|
return opened ? "opened" : "cancelled";
|
|
1300
1341
|
}
|
|
1342
|
+
/**
|
|
1343
|
+
* The one project-switch reset of the caches panels keep for the project being left: the Site
|
|
1344
|
+
* panel's index and filter, the media listing it and every image field read, and the Media
|
|
1345
|
+
* workspace's own filter, search and selection. Both open paths run it (this file's
|
|
1346
|
+
* `openRecentProject`, and `files.ts`'s `openProject` behind ⌘O, the toolbar and the welcome
|
|
1347
|
+
* screen), so neither can show the previous project's pages or media.
|
|
1348
|
+
*/
|
|
1349
|
+
function resetProjectCaches(): void {
|
|
1350
|
+
resetSitePanel();
|
|
1351
|
+
resetContentView();
|
|
1352
|
+
resetCollectionPages();
|
|
1353
|
+
invalidatePageSummaries();
|
|
1354
|
+
invalidateEntrySummaries();
|
|
1355
|
+
invalidateRepeaterSources();
|
|
1356
|
+
resetCollectionsPanel();
|
|
1357
|
+
resetStylesPanel();
|
|
1358
|
+
resetVariablesFocus();
|
|
1359
|
+
resetWritingBanners();
|
|
1360
|
+
invalidateMediaCache();
|
|
1361
|
+
resetMediaLibrary();
|
|
1362
|
+
}
|
|
1363
|
+
|
|
1301
1364
|
async function openRecentProject(root: string) {
|
|
1302
1365
|
// One entry for the whole sequence, not three surfaces for its three phases. Opening a project
|
|
1303
1366
|
// Used to chain a blocking spinner (dependencies), a transient status line (git sync) and a
|
|
@@ -1355,9 +1418,10 @@ async function openRecentProject(root: string) {
|
|
|
1355
1418
|
platform.projectRoot = root;
|
|
1356
1419
|
// Source control, the stylebook selection and the settings tab describe the project being
|
|
1357
1420
|
// Left behind; carrying them over showed the previous repository's branch and file count
|
|
1358
|
-
// Under the new project's name. The poll timer is re-armed by the
|
|
1359
|
-
|
|
1421
|
+
// Under the new project's name. The poll timer is re-armed by the Publish workspace's next mount.
|
|
1422
|
+
cleanupSourceControl();
|
|
1360
1423
|
resetProjectShell();
|
|
1424
|
+
resetProjectCaches();
|
|
1361
1425
|
// The format registry is cached per project — the previous root's registry (often empty on a
|
|
1362
1426
|
// Fresh desktop launch) must not answer for this project, or non-JSON documents fail with
|
|
1363
1427
|
// "No format class imported" until a reload. Mirrors openProject in files.ts.
|
|
@@ -1365,6 +1429,9 @@ async function openRecentProject(root: string) {
|
|
|
1365
1429
|
void loadFormats();
|
|
1366
1430
|
refreshExtensionUi(platform);
|
|
1367
1431
|
const content = await platform.readFile("project.json");
|
|
1432
|
+
/* SAFETY: This is `project.json` at the root the user chose to open, the project's own config
|
|
1433
|
+
file whose schema is ProjectConfig; Studio edits it in that shape and does not re-validate it
|
|
1434
|
+
on open, as the folder-picker path in `platforms/devserver.ts` does not either. */
|
|
1368
1435
|
const config = JSON.parse(content) as ProjectConfig;
|
|
1369
1436
|
|
|
1370
1437
|
closeAllTabs();
|
|
@@ -1389,28 +1456,11 @@ async function openRecentProject(root: string) {
|
|
|
1389
1456
|
activity.step("Install dependencies");
|
|
1390
1457
|
await ensureDependenciesInstalled();
|
|
1391
1458
|
activity.step("Read the project");
|
|
1392
|
-
await
|
|
1459
|
+
await loadProjectDirectories();
|
|
1393
1460
|
await loadComponentRegistry();
|
|
1394
1461
|
|
|
1395
|
-
const conventionalDirs = new Set([
|
|
1396
|
-
"pages",
|
|
1397
|
-
"layouts",
|
|
1398
|
-
"components",
|
|
1399
|
-
"content",
|
|
1400
|
-
"data",
|
|
1401
|
-
"public",
|
|
1402
|
-
"styles",
|
|
1403
|
-
]);
|
|
1404
|
-
const entries = requireProjectState().dirs.get(".") || [];
|
|
1405
|
-
for (const e of entries) {
|
|
1406
|
-
if (e.type === "directory" && conventionalDirs.has(e.name)) {
|
|
1407
|
-
requireProjectState().expanded.add(e.path || e.name);
|
|
1408
|
-
await loadDirectory(e.path || e.name);
|
|
1409
|
-
}
|
|
1410
|
-
}
|
|
1411
|
-
|
|
1412
1462
|
addRecentProject(requireProjectState().name, root);
|
|
1413
|
-
|
|
1463
|
+
// The Navigator shows the panel the workspace frame chose as the project opened (§22.3).
|
|
1414
1464
|
renderLeftPanel();
|
|
1415
1465
|
// The project's name is now permanent state in the status bar's PROJECT field.
|
|
1416
1466
|
|
|
@@ -1511,7 +1561,16 @@ registerStudioCommands(
|
|
|
1511
1561
|
);
|
|
1512
1562
|
|
|
1513
1563
|
// Tab navigation (⌃Tab MRU cycling, ⌘⇧T reopen-closed) is defined beside the tab model it drives.
|
|
1514
|
-
|
|
1564
|
+
/* `pane.compareWith` opens into the other pane without moving the keyboard; a compared document of
|
|
1565
|
+
another workspace would land hidden by that pane's strip, so it is revealed, which enters its
|
|
1566
|
+
workspace (`workspace/workspace-switch.ts`). */
|
|
1567
|
+
registerTabCommands(commandRegistry, {
|
|
1568
|
+
openFile: openFileInTab,
|
|
1569
|
+
openFileInPane: async (paneId, path) => {
|
|
1570
|
+
await openFileInPane(paneId, path);
|
|
1571
|
+
revealInPane(paneId, path);
|
|
1572
|
+
},
|
|
1573
|
+
});
|
|
1515
1574
|
|
|
1516
1575
|
/* The derivation's own two verbs (§18.4), beside the `PaneDerivation` they read and write rather
|
|
1517
1576
|
than in `paneCommands()`. `tests/app-commands-composition.test.ts` is the guard that this line
|
|
@@ -1527,6 +1586,28 @@ commandRegistry.registerAll(derivationCommands(derivationDeps));
|
|
|
1527
1586
|
* available or what it does — that would be the second definition site the design exists to prevent
|
|
1528
1587
|
* (§13).
|
|
1529
1588
|
*/
|
|
1589
|
+
/* The workspace's two halves (`workspace/workspace-switch.ts`): the follow, which enters a tab's
|
|
1590
|
+
workspace whenever a tab is activated, and the switch `view.setWorkspace` runs, which puts a
|
|
1591
|
+
workspace's tabs (or its home) on screen. The homes are handed in, so the switch imports
|
|
1592
|
+
neither the homes' surfaces nor the settings document. */
|
|
1593
|
+
const workspaceDeps = {
|
|
1594
|
+
openHome: (id: HomeWorkspaceId) => {
|
|
1595
|
+
openWorkspaceHome(id);
|
|
1596
|
+
},
|
|
1597
|
+
// The Styles home: the view it was left in, Variables on a first visit (§7.1).
|
|
1598
|
+
openStyles: () => {
|
|
1599
|
+
showSettingsDocument();
|
|
1600
|
+
},
|
|
1601
|
+
placeHome: placeWorkspaceHome,
|
|
1602
|
+
setInspectorTab: (tab: InspectorTabId) => rightPanelMod.setInspectorTab(tab),
|
|
1603
|
+
};
|
|
1604
|
+
installWorkspaceFollow(workspaceDeps);
|
|
1605
|
+
/** Show a workspace with the bootstrap's homes: what `view.setWorkspace` and a reopen both run. */
|
|
1606
|
+
function showWorkspaceWithHomes(id: WorkspaceId): void {
|
|
1607
|
+
switchWorkspace(id, workspaceDeps);
|
|
1608
|
+
}
|
|
1609
|
+
// A project reopens in the workspace it was left in, once its documents are open (§22.1).
|
|
1610
|
+
setSessionWorkspaceShow(showWorkspaceWithHomes);
|
|
1530
1611
|
registerShellViewCommands(commandRegistry, {
|
|
1531
1612
|
// The registry's own answer, so a gated-off panel cannot be persisted as a showing tab.
|
|
1532
1613
|
panelAvailable: (id) => {
|
|
@@ -1534,8 +1615,20 @@ registerShellViewCommands(commandRegistry, {
|
|
|
1534
1615
|
return panel ? (panel.when?.(commandRegistry.context()) ?? true) : true;
|
|
1535
1616
|
},
|
|
1536
1617
|
inspectorTab: () => rightPanelMod.inspectorTab(),
|
|
1618
|
+
restingInspectorTab: () => rightPanelMod.restingInspectorTab(),
|
|
1537
1619
|
setInspectorTab: (tab) => rightPanelMod.setInspectorTab(tab),
|
|
1620
|
+
showWorkspace: showWorkspaceWithHomes,
|
|
1538
1621
|
});
|
|
1622
|
+
/* Back to a strip-less workspace's home (Media, Styles, Publish): the pane context bar's Back
|
|
1623
|
+
control and Escape. The close goes through the strip's guarded close, so a view with unsaved
|
|
1624
|
+
work still asks first. */
|
|
1625
|
+
commandRegistry.registerAll(
|
|
1626
|
+
workspaceBackCommands({
|
|
1627
|
+
closeTab: tabStrip.requestClose,
|
|
1628
|
+
focusHome: focusWorkspaceHome,
|
|
1629
|
+
setCanvasMode,
|
|
1630
|
+
}),
|
|
1631
|
+
);
|
|
1539
1632
|
registerCanvasViewCommands(commandRegistry, {
|
|
1540
1633
|
getCanvasMode,
|
|
1541
1634
|
renderPane: renderCanvas,
|
|
@@ -1546,7 +1639,7 @@ registerCanvasViewCommands(commandRegistry, {
|
|
|
1546
1639
|
});
|
|
1547
1640
|
/* A save moves the working tree under any comparison of that file, and nothing about a
|
|
1548
1641
|
comparison notices on its own — see `noteFileSaved`. Injected rather than imported: `file-ops`
|
|
1549
|
-
must not pull
|
|
1642
|
+
must not pull source control into its graph. */
|
|
1550
1643
|
/* The second listener is the live chrome lane: a saved surface document or kit component re-mounts
|
|
1551
1644
|
the roots it draws in THIS shell (studio-ui-guidelines.md §9.3). Inert for every project but the
|
|
1552
1645
|
two the chrome comes from, by the saved path alone. */
|
|
@@ -1559,9 +1652,17 @@ const liveChrome = createLiveSurfaceSaver({
|
|
|
1559
1652
|
Component Settings and the Library read the props the file has now rather than the ones the scan
|
|
1560
1653
|
saw when the project opened. The Content tab and the Library are told, because neither reads the
|
|
1561
1654
|
registry reactively. */
|
|
1562
|
-
setDocumentSavedListener((path, doc) => {
|
|
1655
|
+
setDocumentSavedListener((path, doc, tab) => {
|
|
1563
1656
|
void noteFileSaved(path);
|
|
1564
|
-
|
|
1657
|
+
// Any saved file can be data a repeater on the canvas reads; the next render asks again.
|
|
1658
|
+
invalidateRepeaterSources();
|
|
1659
|
+
// An entry's new title or status reaches the Collections panel and the Content home at once.
|
|
1660
|
+
if (noteSavedEntry(path, entryFields(tab))) {
|
|
1661
|
+
renderLeftPanel();
|
|
1662
|
+
}
|
|
1663
|
+
/* SAFETY: The listener fires for a tab's saved ROOT document, and a root document is a
|
|
1664
|
+
JxDocument held in the editor's mutable node form; `liveChrome` only acts on surface paths. */
|
|
1665
|
+
void liveChrome(path, doc as JxDocument);
|
|
1565
1666
|
if (noteComponentSaved(path, doc)) {
|
|
1566
1667
|
renderPropertiesPanel();
|
|
1567
1668
|
renderLeftPanel();
|
|
@@ -1575,8 +1676,8 @@ commandRegistry.registerAll(diffCommands());
|
|
|
1575
1676
|
ensurePopoverRevealWatch();
|
|
1576
1677
|
registerSelectionSetCommand(commandRegistry);
|
|
1577
1678
|
registerInspectorCommands(commandRegistry);
|
|
1578
|
-
/* Search appearance, behind one record
|
|
1579
|
-
|
|
1679
|
+
/* Search appearance, behind one record the Page tab's button runs: a surface that IS the capability
|
|
1680
|
+
is one the palette cannot reach. */
|
|
1580
1681
|
registerSeoCommands(commandRegistry);
|
|
1581
1682
|
registerA11yCommands(commandRegistry);
|
|
1582
1683
|
registerPopoverCommands(commandRegistry);
|
|
@@ -1597,9 +1698,11 @@ registerGridCommands(commandRegistry);
|
|
|
1597
1698
|
registerSettingsCommands(commandRegistry);
|
|
1598
1699
|
registerExtensionCommands(commandRegistry);
|
|
1599
1700
|
registerPreferencesCommands(commandRegistry);
|
|
1600
|
-
|
|
1701
|
+
registerContentViewCommands(commandRegistry);
|
|
1601
1702
|
registerFileFormatCommands(commandRegistry);
|
|
1602
1703
|
registerContentCommands(commandRegistry);
|
|
1704
|
+
registerAddNewCommands(commandRegistry);
|
|
1705
|
+
registerMediaCommands(commandRegistry);
|
|
1603
1706
|
/* The four translation verbs: open a sibling translation, create the missing one, show the
|
|
1604
1707
|
Languages panel, declare a language. `i18n.switchLocale` is deliberately not among them — it sets
|
|
1605
1708
|
a rendering context, so it lives with the other axis-3 verbs in `canvasViewCommands`. */
|
|
@@ -1643,7 +1746,7 @@ initShortcuts(commandRegistry, stageContext);
|
|
|
1643
1746
|
which is what makes Preferences › Keyboard reach inside the page. */
|
|
1644
1747
|
setKeymapSource(
|
|
1645
1748
|
() => ({
|
|
1646
|
-
chords: chordsInScopes(commandRegistry.keymap, FRAME_KEY_SCOPES),
|
|
1749
|
+
chords: chordsInScopes(commandRegistry.keymap, FRAME_KEY_SCOPES, HOST_ONLY_COMMANDS),
|
|
1647
1750
|
mac: commandRegistry.keymap.mac,
|
|
1648
1751
|
}),
|
|
1649
1752
|
(listener) => commandRegistry.keymap.onChange(listener),
|