@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
|
@@ -7,21 +7,30 @@
|
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
9
|
import { projectState, stripEventHandlers } from "../store";
|
|
10
|
-
import {
|
|
10
|
+
import {
|
|
11
|
+
displayTagName,
|
|
12
|
+
isJsonObject,
|
|
13
|
+
isMappedArray,
|
|
14
|
+
isNonNullObject,
|
|
15
|
+
isString,
|
|
16
|
+
} from "@jxsuite/schema/guards";
|
|
11
17
|
import { canvasModeOfTab } from "./canvas-surface";
|
|
12
18
|
import { toRaw } from "../reactivity";
|
|
13
19
|
import {
|
|
14
20
|
distributePageIntoLayout,
|
|
15
21
|
getEffectiveElements,
|
|
16
22
|
getEffectiveHead,
|
|
23
|
+
extensionClassPaths,
|
|
17
24
|
getEffectiveImports,
|
|
18
25
|
getEffectiveLayoutPath,
|
|
19
26
|
getEffectiveMedia,
|
|
20
27
|
resolveLayoutDoc,
|
|
21
28
|
} from "../site-context";
|
|
22
29
|
import { documentBase } from "./canvas-origin";
|
|
23
|
-
import { getPlatform, hasPlatform } from "../platform";
|
|
24
30
|
import { componentRegistry, computeRelativePath } from "../files/components";
|
|
31
|
+
import { collectUsedTags } from "@jxsuite/schema/component-meta";
|
|
32
|
+
import { injectContext } from "@jxsuite/site/context";
|
|
33
|
+
import { documentUrlPattern } from "@jxsuite/site/routes";
|
|
25
34
|
import { prepareForEditMode } from "../utils/edit-display";
|
|
26
35
|
import {
|
|
27
36
|
paramBoundStateKeys,
|
|
@@ -29,10 +38,23 @@ import {
|
|
|
29
38
|
substitutePreviewParams,
|
|
30
39
|
} from "../page-params";
|
|
31
40
|
import { isComponentDoc, substitutePreviewProps } from "../component-props";
|
|
32
|
-
import { assetContextFor } from "./asset-refs";
|
|
41
|
+
import { assetContextFor, hostAssetDeclarations } from "./asset-refs";
|
|
42
|
+
import { collectionForFile } from "../content/collection-match";
|
|
43
|
+
import { writesEntryOnCanvas } from "../content/content-collections";
|
|
44
|
+
import { collectionPage, entryLayoutPath, entryLocale } from "../content/collection-pages";
|
|
45
|
+
import { pageContextFor } from "./canvas-page-context";
|
|
46
|
+
import { loadExtensions } from "../format/format-host";
|
|
47
|
+
import { bakeRepeaterSources, extensionClassKeys, repeaterSourceKeys } from "./repeater-sources";
|
|
33
48
|
|
|
34
49
|
import type { AssetContext } from "./asset-refs";
|
|
35
|
-
import type {
|
|
50
|
+
import type {
|
|
51
|
+
JsonValue,
|
|
52
|
+
JxDocument,
|
|
53
|
+
JxElement,
|
|
54
|
+
JxMutableNode,
|
|
55
|
+
JxPath,
|
|
56
|
+
JxStyle,
|
|
57
|
+
} from "@jxsuite/schema/types";
|
|
36
58
|
import type { ComponentEntry } from "../files/components.js";
|
|
37
59
|
import type { LayoutMarker } from "./path-mapping";
|
|
38
60
|
import type { Tab } from "../tabs/tab";
|
|
@@ -55,19 +77,20 @@ function findPageContentPrefix(
|
|
|
55
77
|
node: JxMutableNode,
|
|
56
78
|
path: (string | number)[] = [],
|
|
57
79
|
): { prefix: (string | number)[]; offset: number } | null {
|
|
58
|
-
|
|
80
|
+
// Document JSON can hold a null or scalar where a node belongs; neither has page content.
|
|
81
|
+
if (!isNonNullObject(node)) {
|
|
59
82
|
return null;
|
|
60
83
|
}
|
|
61
84
|
if (Array.isArray(node.children)) {
|
|
62
85
|
const firstPageIdx = node.children.findIndex(
|
|
63
|
-
(child) => child &&
|
|
86
|
+
(child) => isNonNullObject(child) && !child.$__layout,
|
|
64
87
|
);
|
|
65
88
|
if (firstPageIdx !== -1) {
|
|
66
89
|
return { offset: firstPageIdx, prefix: [...path, "children"] };
|
|
67
90
|
}
|
|
68
91
|
for (let i = 0; i < node.children.length; i++) {
|
|
69
92
|
const child = node.children[i];
|
|
70
|
-
if (child &&
|
|
93
|
+
if (isNonNullObject(child) && child.$__layout) {
|
|
71
94
|
const found = findPageContentPrefix(child, [...path, "children", i]);
|
|
72
95
|
if (found) {
|
|
73
96
|
return found;
|
|
@@ -87,13 +110,14 @@ function findPageContentPrefix(
|
|
|
87
110
|
* editor can open the layout with that node selected. See {@link LayoutMarker}.
|
|
88
111
|
*/
|
|
89
112
|
export function markLayoutNodes(node: JxMutableNode, file: string, path: JxPath = []) {
|
|
90
|
-
|
|
113
|
+
// Layout JSON can hold a null or scalar where a node belongs; there is nothing to mark on it.
|
|
114
|
+
if (!isNonNullObject(node)) {
|
|
91
115
|
return;
|
|
92
116
|
}
|
|
93
117
|
node.$__layout = { file, path } satisfies LayoutMarker;
|
|
94
118
|
if (Array.isArray(node.children)) {
|
|
95
119
|
for (const [i, child] of node.children.entries()) {
|
|
96
|
-
if (
|
|
120
|
+
if (isString(child)) {
|
|
97
121
|
continue;
|
|
98
122
|
}
|
|
99
123
|
markLayoutNodes(child, file, [...path, "children", i]);
|
|
@@ -101,13 +125,125 @@ export function markLayoutNodes(node: JxMutableNode, file: string, path: JxPath
|
|
|
101
125
|
}
|
|
102
126
|
if (Array.isArray(node.$elements)) {
|
|
103
127
|
for (const [i, el] of node.$elements.entries()) {
|
|
104
|
-
if (
|
|
128
|
+
if (!isString(el)) {
|
|
129
|
+
/* SAFETY: a non-string `$elements` entry is an inline element definition or a `{ $ref }`
|
|
130
|
+
import. markLayoutNodes stamps `$__layout` and walks `children` / `$elements`, which a
|
|
131
|
+
`$ref` entry simply lacks, so it is marked as a childless node. */
|
|
105
132
|
markLayoutNodes(el as JxMutableNode, file, [...path, "$elements", i]);
|
|
106
133
|
}
|
|
107
134
|
}
|
|
108
135
|
}
|
|
109
136
|
}
|
|
110
137
|
|
|
138
|
+
/**
|
|
139
|
+
* A layout as the canvas wraps a document in it: read, its nodes marked with the file they come
|
|
140
|
+
* from, and itself wrapped in the layout ITS `$layout` names, all the way up.
|
|
141
|
+
*
|
|
142
|
+
* A layout can sit in another layout (`layouts/post.json` → `layouts/base.json`), and the build
|
|
143
|
+
* resolves the whole chain (`@jxsuite/site` `resolveLayout`), so a page drawn in the inner layout
|
|
144
|
+
* alone lost the outer one's nav and footer on the canvas and nowhere else. Each level is merged
|
|
145
|
+
* the way the build merges it, and each node keeps the marker of the file it was authored in, so
|
|
146
|
+
* opening a locked node still opens the layout that holds it. A cycle stops at the first repeat
|
|
147
|
+
* rather than recursing forever, and a parent that cannot be read leaves the chain where it is.
|
|
148
|
+
*
|
|
149
|
+
* @param {string} layoutPath - The `$layout` reference, project-relative as authored
|
|
150
|
+
* @param {Set<string>} [seen] - Files already on the chain
|
|
151
|
+
* @returns {Promise<JxMutableNode | null>} The merged, marked layout, or null when unreadable
|
|
152
|
+
*/
|
|
153
|
+
export async function resolveCanvasLayout(
|
|
154
|
+
layoutPath: string,
|
|
155
|
+
seen = new Set<string>(),
|
|
156
|
+
): Promise<JxMutableNode | null> {
|
|
157
|
+
const file = layoutPath.replace(/^\.\//, "");
|
|
158
|
+
if (seen.has(file)) {
|
|
159
|
+
return null;
|
|
160
|
+
}
|
|
161
|
+
seen.add(file);
|
|
162
|
+
const layoutDoc = await resolveLayoutDoc(layoutPath);
|
|
163
|
+
if (!layoutDoc) {
|
|
164
|
+
return null;
|
|
165
|
+
}
|
|
166
|
+
// The SAME normalization resolveLayoutDoc reads the file with, so the marker's `file` is a path
|
|
167
|
+
// The editor can hand straight to navigateToComponent when the author asks to open it.
|
|
168
|
+
markLayoutNodes(layoutDoc, file);
|
|
169
|
+
const parentRef = layoutDoc.$layout;
|
|
170
|
+
if (!isString(parentRef) || !parentRef) {
|
|
171
|
+
return layoutDoc;
|
|
172
|
+
}
|
|
173
|
+
const parent = await resolveCanvasLayout(parentRef, seen);
|
|
174
|
+
if (!parent) {
|
|
175
|
+
return layoutDoc;
|
|
176
|
+
}
|
|
177
|
+
const merged = distributePageIntoLayout(parent, layoutDoc);
|
|
178
|
+
delete merged.$layout;
|
|
179
|
+
return merged;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Re-address a layout's `$elements` imports from the layout's file to the document being drawn.
|
|
184
|
+
*
|
|
185
|
+
* A layout's `{ $ref: "../components/site-nav.json" }` is relative to the LAYOUT, but once the
|
|
186
|
+
* layout is merged around a document the canvas resolves every `$ref` against the document's own
|
|
187
|
+
* base. A page in `pages/` sits as deep as `layouts/`, so the two answers agreed by coincidence; an
|
|
188
|
+
* entry in `content/menu/` or a page in `pages/blog/` resolved the same ref to
|
|
189
|
+
* `content/components/…`, which 404s and leaves the nav and footer unregistered. Each entry is
|
|
190
|
+
* re-addressed from the file its `$__layout` marker names, which is the file it was authored in at
|
|
191
|
+
* every level of a layout chain. Bare specifiers and URLs are left alone, and so is an entry with
|
|
192
|
+
* no marker (the document's own).
|
|
193
|
+
*
|
|
194
|
+
* @param {(JxElement | string)[] | undefined} elements - The merged document's `$elements`
|
|
195
|
+
* @param {string} documentPath - The project-relative path of the document being drawn
|
|
196
|
+
*/
|
|
197
|
+
export function rebaseLayoutElementRefs(
|
|
198
|
+
elements: readonly (JxElement | string | null)[] | undefined,
|
|
199
|
+
documentPath: string,
|
|
200
|
+
) {
|
|
201
|
+
for (const el of elements ?? []) {
|
|
202
|
+
if (!isNonNullObject(el) || !isString(el.$ref) || !/^\.\.?\//.test(el.$ref)) {
|
|
203
|
+
continue;
|
|
204
|
+
}
|
|
205
|
+
const marker = el["$__layout"];
|
|
206
|
+
if (!isJsonObject(marker) || !isString(marker.file)) {
|
|
207
|
+
continue;
|
|
208
|
+
}
|
|
209
|
+
const target = new URL(el.$ref, `jx-project:/${marker.file}`).pathname.replace(/^\//, "");
|
|
210
|
+
el.$ref = computeRelativePath(documentPath, target);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* A document's own layout override: its root's `$layout`, or a Markdown document's frontmatter
|
|
216
|
+
* `$layout` (which the build reads, and which the Inspector's Page tab writes); `undefined` when it
|
|
217
|
+
* names none.
|
|
218
|
+
*/
|
|
219
|
+
export function pageLayout(doc: JxMutableNode, tab: Tab | null): string | false | undefined {
|
|
220
|
+
if (doc.$layout !== undefined) {
|
|
221
|
+
return doc.$layout;
|
|
222
|
+
}
|
|
223
|
+
const fromFrontmatter = tab?.doc.content.frontmatter.$layout;
|
|
224
|
+
return isString(fromFrontmatter) || fromFrontmatter === false ? fromFrontmatter : undefined;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* The layout a collection entry is drawn in (studio.md §22.5): the entry's own `$layout` (on its
|
|
229
|
+
* document, or in its frontmatter for a Markdown entry, {@link pageLayout}), else its collection's
|
|
230
|
+
* template page's `$layout`, else the project's `defaults.layout`. `null` when none applies.
|
|
231
|
+
*
|
|
232
|
+
* The template PAGE's own body is not spliced around the entry: a page that binds the entry into a
|
|
233
|
+
* wrapper of its own shows that wrapper only in Preview of the page itself, because the edit
|
|
234
|
+
* transforms cannot map the entry's paths through the page's bound node.
|
|
235
|
+
*/
|
|
236
|
+
export async function entryLayout(
|
|
237
|
+
doc: JxMutableNode,
|
|
238
|
+
tab: Tab | null,
|
|
239
|
+
path: string | null | undefined,
|
|
240
|
+
): Promise<string | null> {
|
|
241
|
+
const own = pageLayout(doc, tab);
|
|
242
|
+
const match = path ? collectionForFile(path) : null;
|
|
243
|
+
const page = match ? await collectionPage(match.name, entryLocale(path)) : null;
|
|
244
|
+
return entryLayoutPath(own, page);
|
|
245
|
+
}
|
|
246
|
+
|
|
111
247
|
/**
|
|
112
248
|
* Resolve a document into the form the iframe canvas renders: layout-distributed, edit-transformed,
|
|
113
249
|
* with components/imports/$media/$head merged in, plus the path-mapper context and site style. This
|
|
@@ -157,7 +293,7 @@ export async function resolveCanvasDocument(
|
|
|
157
293
|
/** How the canvas must address project media, or null when its origin serves the site URL space. */
|
|
158
294
|
assets: AssetContext | null;
|
|
159
295
|
mapperCtx: WireMapperCtx;
|
|
160
|
-
siteStyle:
|
|
296
|
+
siteStyle: JxStyle | null;
|
|
161
297
|
}> {
|
|
162
298
|
const S = { documentPath: tab?.documentPath, mode: tab?.doc.mode };
|
|
163
299
|
const canvasMode = modeOverride ?? canvasModeOfTab(tab);
|
|
@@ -172,24 +308,35 @@ export async function resolveCanvasDocument(
|
|
|
172
308
|
S.documentPath &&
|
|
173
309
|
projectState?.isSiteProject &&
|
|
174
310
|
(S.documentPath.startsWith("pages/") || S.documentPath.startsWith("./pages/"));
|
|
311
|
+
/* A collection entry written on the canvas is drawn the way a page is: inside a layout, with the
|
|
312
|
+
layout's nodes locked and the entry's own tree the editable region (studio.md §22.5). */
|
|
313
|
+
const isEntry =
|
|
314
|
+
!isPage && Boolean(projectState?.isSiteProject) && writesEntryOnCanvas(S.documentPath);
|
|
175
315
|
let pageContentPrefix: (string | number)[] | null = null;
|
|
176
316
|
let pageContentOffset = 0;
|
|
177
317
|
|
|
178
318
|
// Layout wrapping obeys the tab-bar's "show layout elements" toggle (default on); with it off,
|
|
179
319
|
// The page renders alone — the unwrapped path is identical to a non-layout page.
|
|
180
|
-
if (isPage && tab?.session.ui.showLayout !== false) {
|
|
181
|
-
const layoutPath =
|
|
320
|
+
if ((isPage || isEntry) && tab?.session.ui.showLayout !== false) {
|
|
321
|
+
const layoutPath = isEntry
|
|
322
|
+
? await entryLayout(doc, tab, S.documentPath)
|
|
323
|
+
: getEffectiveLayoutPath(pageLayout(doc, tab));
|
|
182
324
|
if (layoutPath) {
|
|
183
|
-
const layoutDoc =
|
|
325
|
+
const layoutDoc = await resolveCanvasLayout(layoutPath);
|
|
184
326
|
if (layoutDoc) {
|
|
185
|
-
// The SAME normalization resolveLayoutDoc reads the file with, so the marker's `file` is a
|
|
186
|
-
// Path the editor can hand straight to navigateToComponent when the author asks to open it.
|
|
187
|
-
markLayoutNodes(layoutDoc, layoutPath.replace(/^\.\//, ""));
|
|
188
327
|
const pageForSlots = canvasMode === "preview" ? structuredClone(toRaw(doc)) : renderDoc;
|
|
189
328
|
const merged = distributePageIntoLayout(layoutDoc, pageForSlots);
|
|
190
329
|
renderDoc =
|
|
191
330
|
canvasMode === "preview" ? merged : prepareForEditMode(stripEventHandlers(merged));
|
|
192
331
|
layoutWrapped = true;
|
|
332
|
+
if (S.documentPath) {
|
|
333
|
+
/* SAFETY: a document's `$elements` entries are tag-name strings, `{ $ref }` imports or
|
|
334
|
+
inline element definitions (a hand-edited null among them is skipped by the walk). */
|
|
335
|
+
rebaseLayoutElementRefs(
|
|
336
|
+
renderDoc.$elements as (JxElement | string | null)[] | undefined,
|
|
337
|
+
S.documentPath,
|
|
338
|
+
);
|
|
339
|
+
}
|
|
193
340
|
const pageContent = findPageContentPrefix(merged);
|
|
194
341
|
pageContentPrefix = pageContent?.prefix ?? null;
|
|
195
342
|
pageContentOffset = pageContent?.offset ?? 0;
|
|
@@ -197,6 +344,24 @@ export async function resolveCanvasDocument(
|
|
|
197
344
|
}
|
|
198
345
|
}
|
|
199
346
|
|
|
347
|
+
/* `$site` / `$page`, and the project's own state, exactly as the build injects them — a layout
|
|
348
|
+
that binds `${state.$page.url}` (a header marking its current link) threw on the canvas, and in
|
|
349
|
+
Preview, where templates are live, that one TypeError blanked the whole page. Onto COPIES of
|
|
350
|
+
`state` and `imports`: the edit-mode render doc shares both with the tab's source document,
|
|
351
|
+
which must not gain injected keys it would then save. */
|
|
352
|
+
const projectConfig = projectState?.projectConfig;
|
|
353
|
+
if (isPage && projectConfig) {
|
|
354
|
+
renderDoc = { ...renderDoc, state: { ...renderDoc.state } };
|
|
355
|
+
if (renderDoc.imports) {
|
|
356
|
+
renderDoc.imports = { ...renderDoc.imports };
|
|
357
|
+
}
|
|
358
|
+
/* SAFETY: a page render document is a JxDocument in all but its declared (mutable) type;
|
|
359
|
+
`injectContext` writes `state`, `$media` and `imports`, all of which the copy above owns. */
|
|
360
|
+
injectContext(renderDoc as JxDocument, projectConfig, {
|
|
361
|
+
urlPattern: documentUrlPattern(S.documentPath),
|
|
362
|
+
});
|
|
363
|
+
}
|
|
364
|
+
|
|
200
365
|
const fileBase = documentBase(projectState?.projectRoot);
|
|
201
366
|
const docBase = S.documentPath ? new URL(S.documentPath, fileBase).href : undefined;
|
|
202
367
|
/*
|
|
@@ -210,10 +375,7 @@ export async function resolveCanvasDocument(
|
|
|
210
375
|
* — design and edit swap every bound src for a transparent pixel, so they never reached the
|
|
211
376
|
* network to fail.
|
|
212
377
|
*/
|
|
213
|
-
const assets = assetContextFor(S.documentPath,
|
|
214
|
-
fileBaseUrl: fileBase,
|
|
215
|
-
...(hasPlatform() ? { space: getPlatform().assetSpace } : {}),
|
|
216
|
-
});
|
|
378
|
+
const assets = assetContextFor(S.documentPath, hostAssetDeclarations());
|
|
217
379
|
|
|
218
380
|
// Substitute chosen dynamic route params ({$ref: "#/$params/x"} → literal), inject state.$page,
|
|
219
381
|
// And bake the substituted class-prototype state entries via the backend resolver — in every
|
|
@@ -222,15 +384,47 @@ export async function resolveCanvasDocument(
|
|
|
222
384
|
// (posted as shadowDoc), whose $refs must survive for editing/serialization.
|
|
223
385
|
if (isPage && tab) {
|
|
224
386
|
const { previewParams } = tab.session.ui;
|
|
225
|
-
if (
|
|
226
|
-
const boundKeys = paramBoundStateKeys(
|
|
227
|
-
(doc as { state?: Record<string, unknown> }).state ?? null,
|
|
228
|
-
);
|
|
387
|
+
if (Object.keys(previewParams).length > 0) {
|
|
388
|
+
const boundKeys = paramBoundStateKeys(doc.state ?? null);
|
|
229
389
|
renderDoc = substitutePreviewParams(renderDoc, previewParams, S.documentPath);
|
|
230
390
|
await resolveParamBoundState(renderDoc, boundKeys, docBase);
|
|
231
391
|
}
|
|
232
392
|
}
|
|
233
393
|
|
|
394
|
+
// `$site` and `$page`, as the build injects them (canvas-page-context.ts), in every mode: Preview
|
|
395
|
+
// Draws the page as it ships, and edit mode evaluates a component's bound props live. For a page
|
|
396
|
+
// This refines the pair injected above with the chosen route params and the project's i18n, and
|
|
397
|
+
// It is the only injection a collection entry gets.
|
|
398
|
+
if ((isPage || isEntry) && S.documentPath) {
|
|
399
|
+
const context = await pageContextFor(
|
|
400
|
+
{
|
|
401
|
+
documentPath: S.documentPath,
|
|
402
|
+
fields: isEntry ? (tab?.doc.content.frontmatter ?? null) : null,
|
|
403
|
+
isEntry,
|
|
404
|
+
lang: doc.$lang,
|
|
405
|
+
params: tab?.session.ui.previewParams ?? {},
|
|
406
|
+
title: doc.title,
|
|
407
|
+
},
|
|
408
|
+
projectState?.projectConfig,
|
|
409
|
+
);
|
|
410
|
+
if (context) {
|
|
411
|
+
// A rebuild, not a write: the render doc shares nodes with the tab's source document.
|
|
412
|
+
renderDoc = { ...renderDoc, state: { ...renderDoc.state, ...context } };
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
/* Class-backed state resolved before the render rather than by it (repeater-sources.ts): in every
|
|
417
|
+
mode, an entry naming an enabled extension's class by a bare `$prototype`, as the build
|
|
418
|
+
resolves it; in Edit and Design, also the collections a repeater reads, whose first item draws
|
|
419
|
+
the repeater's template. */
|
|
420
|
+
const extensions = await loadExtensions();
|
|
421
|
+
const classes = extensionClassPaths(extensions);
|
|
422
|
+
const bakeKeys = extensionClassKeys(renderDoc, classes);
|
|
423
|
+
if (canvasMode !== "preview") {
|
|
424
|
+
bakeKeys.push(...repeaterSourceKeys(doc));
|
|
425
|
+
}
|
|
426
|
+
renderDoc = await bakeRepeaterSources(renderDoc, [...new Set(bakeKeys)], docBase, classes);
|
|
427
|
+
|
|
234
428
|
// Component definition docs (non-page): seed chosen test-prop values into the render doc's state
|
|
235
429
|
// So a non-instantiated component previews with real data — templates, dataScope snapshots, and
|
|
236
430
|
// Live/snapshot expression previews all see the values (M6, the previewParams mirror). Pure
|
|
@@ -253,30 +447,29 @@ export async function resolveCanvasDocument(
|
|
|
253
447
|
const arrayPaths = new Set<string>();
|
|
254
448
|
if (canvasMode !== "preview") {
|
|
255
449
|
(function findArrayPaths(node: JxMutableNode, path: (string | number)[]) {
|
|
256
|
-
|
|
450
|
+
// Document JSON can hold a null or scalar where a node belongs; it holds no repeater.
|
|
451
|
+
if (!isNonNullObject(node)) {
|
|
257
452
|
return;
|
|
258
453
|
}
|
|
259
|
-
if (
|
|
454
|
+
if (node.$prototype === "Array") {
|
|
260
455
|
arrayPaths.add(path.join("/"));
|
|
261
|
-
const mapDef =
|
|
262
|
-
if (mapDef
|
|
456
|
+
const mapDef = node.map;
|
|
457
|
+
if (isNonNullObject(mapDef)) {
|
|
263
458
|
findArrayPaths(mapDef, [...path, "map"]);
|
|
264
459
|
}
|
|
265
460
|
return;
|
|
266
461
|
}
|
|
267
462
|
if (Array.isArray(node.children)) {
|
|
268
|
-
for (
|
|
269
|
-
|
|
270
|
-
if (typeof child === "string") {
|
|
463
|
+
for (const [i, child] of node.children.entries()) {
|
|
464
|
+
if (isString(child)) {
|
|
271
465
|
continue;
|
|
272
466
|
}
|
|
273
|
-
findArrayPaths(child
|
|
467
|
+
findArrayPaths(child, [...path, "children", i]);
|
|
274
468
|
}
|
|
275
|
-
} else if (
|
|
276
|
-
node
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
) {
|
|
469
|
+
} else if (isMappedArray(node.children)) {
|
|
470
|
+
/* SAFETY: the bare mapped-array slot is a repeater node in all but its declared type, and
|
|
471
|
+
the walk reads only what isMappedArray just established (`$prototype`) and its `map`
|
|
472
|
+
template, an element definition. */
|
|
280
473
|
findArrayPaths(node.children as JxMutableNode, [...path, "children"]);
|
|
281
474
|
}
|
|
282
475
|
if (node.$switch && node.cases) {
|
|
@@ -295,32 +488,34 @@ export async function resolveCanvasDocument(
|
|
|
295
488
|
const isLayoutDoc =
|
|
296
489
|
S.documentPath != null &&
|
|
297
490
|
(S.documentPath.startsWith("layouts/") || S.documentPath.startsWith("./layouts/"));
|
|
491
|
+
/* SAFETY: a document's `$elements` entries are tag-name strings, `{ $ref }` imports or inline
|
|
492
|
+
element definitions, each a JxElement or a string; getEffectiveElements only dedups them by the
|
|
493
|
+
string itself or by `$ref`. */
|
|
298
494
|
const effectiveElements = getEffectiveElements(renderDoc.$elements as (JxElement | string)[]);
|
|
299
495
|
if ((S.mode === "content" || layoutWrapped || isLayoutDoc) && componentRegistry.length > 0) {
|
|
300
496
|
const existingRefs = new Set(
|
|
301
|
-
|
|
497
|
+
// A null entry in a document's `$elements` names nothing, so it contributes no ref.
|
|
498
|
+
effectiveElements.map((e: JxElement | string) => (isNonNullObject(e) ? e.$ref : e)),
|
|
302
499
|
);
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
}
|
|
500
|
+
/* Every tag the render can reach: the document's own, then — through the registry's `uses` —
|
|
501
|
+
each component's, transitively. Components address one another by bare `tagName` and declare
|
|
502
|
+
no `$elements` (the build finds them project-wide), so a tag that only appears INSIDE a
|
|
503
|
+
component (a card's panel, a header's theme toggle) was never registered here and rendered as
|
|
504
|
+
an empty, unstyled element. */
|
|
505
|
+
const byTag = new Map(componentRegistry.map((c: ComponentEntry) => [c.tagName, c]));
|
|
506
|
+
/* SAFETY: a render document is JSON by construction (it crosses into the canvas realm by
|
|
507
|
+
`postMessage`); the walk only reads `tagName`, `children`, `map` and `cases` off it. */
|
|
508
|
+
const reachable = collectUsedTags(renderDoc as JsonValue);
|
|
509
|
+
if (renderDoc.tagName) {
|
|
510
|
+
reachable.add(displayTagName(renderDoc.tagName));
|
|
511
|
+
}
|
|
512
|
+
for (const tag of reachable) {
|
|
513
|
+
for (const used of byTag.get(tag)?.uses ?? []) {
|
|
514
|
+
reachable.add(used);
|
|
319
515
|
}
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
const comp = componentRegistry.find((c: ComponentEntry) => c.tagName === tag);
|
|
516
|
+
}
|
|
517
|
+
for (const tag of reachable) {
|
|
518
|
+
const comp = byTag.get(tag);
|
|
324
519
|
if (comp && comp.source !== "npm" && comp.path) {
|
|
325
520
|
const relPath = computeRelativePath(S.documentPath ?? null, comp.path);
|
|
326
521
|
if (!existingRefs.has(relPath)) {
|
|
@@ -331,24 +526,12 @@ export async function resolveCanvasDocument(
|
|
|
331
526
|
}
|
|
332
527
|
}
|
|
333
528
|
if (effectiveElements.length > 0) {
|
|
334
|
-
renderDoc.$elements = effectiveElements
|
|
335
|
-
}
|
|
336
|
-
renderDoc.imports = getEffectiveImports(renderDoc.imports);
|
|
337
|
-
// The effective-media/head getters return the merged value or undefined. Optional properties
|
|
338
|
-
// Cannot be assigned undefined under exactOptionalPropertyTypes, so clear them by deleting the key
|
|
339
|
-
// When the getter yields nothing.
|
|
340
|
-
const media = getEffectiveMedia(renderDoc.$media);
|
|
341
|
-
if (media === undefined) {
|
|
342
|
-
delete renderDoc.$media;
|
|
343
|
-
} else {
|
|
344
|
-
renderDoc.$media = media as NonNullable<JxMutableNode["$media"]>;
|
|
345
|
-
}
|
|
346
|
-
const head = getEffectiveHead(renderDoc.$head);
|
|
347
|
-
if (head === undefined) {
|
|
348
|
-
delete renderDoc.$head;
|
|
349
|
-
} else {
|
|
350
|
-
renderDoc.$head = head as NonNullable<JxMutableNode["$head"]>;
|
|
529
|
+
renderDoc.$elements = effectiveElements;
|
|
351
530
|
}
|
|
531
|
+
renderDoc.imports = getEffectiveImports(renderDoc.imports, extensions);
|
|
532
|
+
// The effective-media/head getters always answer a value: the merge, or an empty one.
|
|
533
|
+
renderDoc.$media = getEffectiveMedia(renderDoc.$media);
|
|
534
|
+
renderDoc.$head = getEffectiveHead(renderDoc.$head);
|
|
352
535
|
|
|
353
536
|
return {
|
|
354
537
|
assets,
|
|
@@ -361,6 +544,6 @@ export async function resolveCanvasDocument(
|
|
|
361
544
|
pageContentPrefix,
|
|
362
545
|
},
|
|
363
546
|
renderDoc,
|
|
364
|
-
siteStyle:
|
|
547
|
+
siteStyle: projectState?.projectConfig?.style ?? null,
|
|
365
548
|
};
|
|
366
549
|
}
|
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
/// <reference lib="dom" />
|
|
2
2
|
/**
|
|
3
|
-
* Canvas origin derivation. The canvas iframe may load same-origin (dev server / chromium /
|
|
4
|
-
*
|
|
5
|
-
*
|
|
3
|
+
* Canvas origin derivation. The canvas iframe may load same-origin (dev server / chromium / cloud,
|
|
4
|
+
* where the platform canvasUrl is a relative path) or cross-origin (a host whose canvasUrl is an
|
|
5
|
+
* absolute http://127.0.0.1:<port> URL).
|
|
6
6
|
*
|
|
7
7
|
* CanvasBaseOrigin() returns the origin the canvas document lives on, so callers that build
|
|
8
8
|
* absolute asset/doc URLs target the right server. For a relative canvasUrl this resolves to
|
|
9
|
-
* location.origin — IDENTITY for the same-origin paths, so dev/chromium/
|
|
10
|
-
*
|
|
9
|
+
* location.origin — IDENTITY for the same-origin paths, so dev/chromium/cloud are byte-identical to
|
|
10
|
+
* before.
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
13
|
import { getPlatform, hasPlatform } from "../platform";
|
|
14
14
|
|
|
15
15
|
/**
|
|
16
|
-
* The origin serving the canvas document. When the platform registers an absolute canvasUrl
|
|
17
|
-
*
|
|
16
|
+
* The origin serving the canvas document. When the platform registers an absolute canvasUrl (an
|
|
17
|
+
* absolute loopback URL), this is that URL's origin; otherwise it falls back to the parent's own
|
|
18
18
|
* origin (a relative canvasUrl resolves against location.href to location.origin).
|
|
19
19
|
*/
|
|
20
20
|
export function canvasBaseOrigin(): string {
|
|
@@ -25,6 +25,31 @@ export function canvasBaseOrigin(): string {
|
|
|
25
25
|
return location.origin;
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
+
/**
|
|
29
|
+
* The dev-proxy token for a render in the SHELL's own realm, or null when it has none to use.
|
|
30
|
+
*
|
|
31
|
+
* A desktop server gates `/__jx_resolve__` and `/__jx_server__` on its rpcToken, and the canvas
|
|
32
|
+
* iframe authenticates by reading it off its own URL (`?rpcToken=`). The shell renders documents
|
|
33
|
+
* too (the Library's previews, the assistant's render check) through its own copy of the runtime,
|
|
34
|
+
* and that copy was never told: every `$src` class on a previewed page posted without the token and
|
|
35
|
+
* drew a 403. The token is read off the same canvas URL rather than a second channel, so there is
|
|
36
|
+
* one place it is handed out.
|
|
37
|
+
*
|
|
38
|
+
* Same-origin only. A cross-origin canvas (an absolute loopback canvasUrl) is not where the shell's
|
|
39
|
+
* relative dev-proxy fetches go, so its token would authenticate nothing and is better not spread
|
|
40
|
+
* around.
|
|
41
|
+
*
|
|
42
|
+
* @returns {string | null} The token, or null on a host with no token or a cross-origin canvas.
|
|
43
|
+
*/
|
|
44
|
+
export function hostResolveToken(): string | null {
|
|
45
|
+
const canvasUrl = hasPlatform() ? getPlatform().canvasUrl : undefined;
|
|
46
|
+
if (!canvasUrl) {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
const url = new URL(canvasUrl, location.href);
|
|
50
|
+
return url.origin === location.origin ? url.searchParams.get("rpcToken") : null;
|
|
51
|
+
}
|
|
52
|
+
|
|
28
53
|
/**
|
|
29
54
|
* The base the canvas fetches PROJECT FILES against — component `$ref`s, `$src` modules, images.
|
|
30
55
|
*
|
|
@@ -69,11 +94,11 @@ export function documentBase(projectRoot?: string): string {
|
|
|
69
94
|
* the desktop MutationObserver only rewrites asynchronously. Rendering the src loopback-absolute up
|
|
70
95
|
* front eliminates that race for direct-parent <img> sites.
|
|
71
96
|
*
|
|
72
|
-
* Guarded: this ONLY rewrites when a real cross-origin http(s) loopback is registered (
|
|
73
|
-
*
|
|
74
|
-
*
|
|
75
|
-
*
|
|
76
|
-
*
|
|
97
|
+
* Guarded: this ONLY rewrites when a real cross-origin http(s) loopback is registered (canvasUrl
|
|
98
|
+
* set to an absolute http URL) whose origin differs from location.origin. Otherwise — dev server,
|
|
99
|
+
* chromium, cloud, and the pre-activate window — it returns the ORIGINAL relative path unchanged,
|
|
100
|
+
* keeping those cases byte-identical (an absolute ${location.origin}/... on the shell would just
|
|
101
|
+
* reintroduce views://... — the exact bug).
|
|
77
102
|
*
|
|
78
103
|
* Only for PROJECT asset srcs; NEVER call it for shell-packaged views:// assets (sp-icons, bundled
|
|
79
104
|
* chrome). Already-absolute inputs (data:/blob:/http/views://) are returned untouched, so it is
|