@jxsuite/studio 6.1.1 → 8.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -5
- package/dist/chunks/2020-5wtzce5g.js +4 -0
- package/dist/chunks/{action-group-2mqby73c.js → action-group-4aan7g6g.js} +3 -3
- package/dist/chunks/adapter-5tphg7xe.js +4 -0
- package/dist/chunks/add-new-flow-psym14sn.js +4 -0
- package/dist/chunks/cf-account-picker-haqazq5r.js +4 -0
- package/dist/chunks/cf-settings-h2wrh6hq.js +4 -0
- package/dist/chunks/color-area-6rbra5dy.js +4 -0
- package/dist/chunks/color-field-gy56c94g.js +4 -0
- package/dist/chunks/color-m7r1vk54.js +4 -0
- package/dist/chunks/color-slider-sqqdyf6c.js +4 -0
- package/dist/chunks/combobox-72h32ejk.js +4 -0
- package/dist/chunks/components-r22xca09.js +4 -0
- package/dist/chunks/content-source-mmppmcyg.js +4 -0
- package/dist/chunks/convert-to-repeater-he70fc2b.js +4 -0
- package/dist/chunks/dialog-c4x05vyx.js +4 -0
- package/dist/chunks/editor-ccd9jwsa.js +4 -0
- package/dist/chunks/entry-commands-6qxz9e8p.js +4 -0
- package/dist/chunks/extension-sections-0egb88dm.js +4 -0
- package/dist/chunks/file-ops-qnab36ek.js +4 -0
- package/dist/chunks/files-rcn56qvm.js +4 -0
- package/dist/chunks/format-host-yxz0kjjs.js +4 -0
- package/dist/chunks/fs-events-d1qxq4z4.js +4 -0
- package/dist/chunks/grid-open-4z1g062t.js +4 -0
- package/dist/chunks/grid-view-qg1b5eqx.js +51 -0
- package/dist/chunks/icons-63bjtbs7.js +4 -0
- package/dist/chunks/iframe-entry-2zggzajv.js +5 -0
- package/dist/chunks/iframe-entry-76j8vwwx.js +5 -0
- package/dist/chunks/iframe-entry-99nr5zfb.js +5 -0
- package/dist/chunks/iframe-entry-pkgmcgp0.js +5 -0
- package/dist/chunks/iframe-host-ssv7kyj0.js +4 -0
- package/dist/chunks/{index-2veqmnhr.js → index-32eqzv1k.js} +3 -3
- package/dist/chunks/index-f0jn7nnp.js +4 -0
- package/dist/chunks/{javascript-8nbvs12s.js → javascript-pjp734q4.js} +3 -3
- package/dist/chunks/jsonMode-njkvsa02.js +13 -0
- package/dist/chunks/jx-validate-ttasrbh7.js +4 -0
- package/dist/chunks/layers-bgyr11tr.js +4 -0
- package/dist/chunks/layers-panel-7ez66zeq.js +4 -0
- package/dist/chunks/listbox-c421cf8c.js +4 -0
- package/dist/chunks/lit-html-v9gh687x.js +4 -0
- package/dist/chunks/media-library-sq468wts.js +4 -0
- package/dist/chunks/media-picker-shfe59pt.js +4 -0
- package/dist/chunks/menu-bdpzbfvs.js +4 -0
- package/dist/chunks/monaco-binding-vq1hgnn0.js +4 -0
- package/dist/chunks/monaco-buffer-3afgwvbp.js +4 -0
- package/dist/chunks/monaco-setup-xrd2cbkp.js +4 -0
- package/dist/chunks/notify-kzrjr3fv.js +4 -0
- package/dist/chunks/number-field-y62xq0ty.js +4 -0
- package/dist/chunks/parse-v77xtwv7.js +4 -0
- package/dist/chunks/platform-7v4rtd7m.js +4 -0
- package/dist/chunks/popover-b89sfej7.js +4 -0
- package/dist/chunks/publish-panel-2z9gw8ee.js +4 -0
- package/dist/chunks/publish-quick-qx2455cj.js +4 -0
- package/dist/chunks/publish-workspace-wrc1dgwx.js +4 -0
- package/dist/chunks/quick-search-n0t0eqxb.js +4 -0
- package/dist/chunks/references-9547rg5s.js +4 -0
- package/dist/chunks/right-panel-wsgnr9pn.js +4 -0
- package/dist/chunks/select-rzds841e.js +4 -0
- package/dist/chunks/source-control-kwktr9y6.js +4 -0
- package/dist/chunks/split-c9zfdgxf.js +4 -0
- package/dist/chunks/studio-03ct6yfv.js +9 -0
- package/dist/chunks/studio-07rcfje3.js +5 -0
- package/dist/chunks/studio-3e54qh39.js +7 -0
- package/dist/chunks/studio-3exxhz5g.js +5 -0
- package/dist/chunks/studio-3q40e3rj.js +5 -0
- package/dist/chunks/studio-3qeh9t0h.js +6 -0
- package/dist/chunks/studio-3qqjeep5.js +6 -0
- package/dist/chunks/studio-43sd2mam.js +4 -0
- package/dist/chunks/studio-4hp8pkyt.js +5 -0
- package/dist/chunks/studio-58xg6j2q.js +9 -0
- package/dist/chunks/studio-5g0rprdt.js +7 -0
- package/dist/chunks/studio-6m380wp7.js +5 -0
- package/dist/chunks/studio-80jyh1xh.js +4 -0
- package/dist/chunks/studio-83mk4bgg.js +9 -0
- package/dist/chunks/{studio-kggey1jt.js → studio-881z1xrx.js} +4 -4
- package/dist/chunks/studio-8m0y2qe7.js +5 -0
- package/dist/chunks/studio-8tr6cfrc.js +5 -0
- package/dist/chunks/studio-8vcvfs7r.js +6 -0
- package/dist/chunks/studio-9tmebf0s.js +5 -0
- package/dist/chunks/studio-a2bvaptz.js +5 -0
- package/dist/chunks/studio-b7y5mr30.js +5 -0
- package/dist/chunks/studio-bavb31r0.js +5 -0
- package/dist/chunks/studio-bbe4c90a.js +5 -0
- package/dist/chunks/studio-c05wdnt3.js +5 -0
- package/dist/chunks/studio-ccv2svc6.js +5 -0
- package/dist/chunks/studio-d5grtb9e.js +16 -0
- package/dist/chunks/studio-df0baea9.js +5 -0
- package/dist/chunks/studio-dgk4dqtx.js +7 -0
- package/dist/chunks/studio-e1g64q43.js +5 -0
- package/dist/chunks/studio-ed1hp6zf.js +6 -0
- package/dist/chunks/studio-ed3xx40h.js +7 -0
- package/dist/chunks/studio-f14e1zdj.js +5 -0
- package/dist/chunks/studio-fbhxxc5f.js +5 -0
- package/dist/chunks/studio-fyh0jc96.js +5 -0
- package/dist/chunks/studio-gcxk20n7.js +5 -0
- package/dist/chunks/studio-jaaz8ce9.js +5 -0
- package/dist/chunks/{studio-8grwxtqk.js → studio-jcnsdaep.js} +4 -4
- package/dist/chunks/studio-jsgf2q5k.js +7 -0
- package/dist/chunks/{studio-1q1sh2ax.js → studio-k3xxbagr.js} +3 -3
- package/dist/chunks/studio-k7evxqh4.js +5 -0
- package/dist/chunks/studio-kt3pjkwd.js +5 -0
- package/dist/chunks/studio-m8g16bgz.js +5 -0
- package/dist/chunks/studio-mn0476ag.js +5 -0
- package/dist/chunks/studio-mx1smyq0.js +5 -0
- package/dist/chunks/studio-n0c5h6mf.js +5 -0
- package/dist/chunks/{studio-rv11kfwa.js → studio-nh6d342n.js} +7 -7
- package/dist/chunks/studio-nqxqf8p2.js +4 -0
- package/dist/chunks/studio-p4nrkvqr.js +5 -0
- package/dist/chunks/{studio-h46vtzk8.js → studio-pbxa5fpc.js} +4 -4
- package/dist/chunks/studio-pgmvdv7z.js +7 -0
- package/dist/chunks/studio-ph84avkf.js +5 -0
- package/dist/chunks/{studio-wszjyh0j.js → studio-q0mvbaq6.js} +4 -4
- package/dist/chunks/studio-q0tccd43.js +5 -0
- package/dist/chunks/studio-q7rtx6zq.js +14 -0
- package/dist/chunks/{studio-pre0skq6.js → studio-qgh13jtz.js} +4 -4
- package/dist/chunks/studio-qmn1xc24.js +5 -0
- package/dist/chunks/studio-qwdqwkj0.js +5 -0
- package/dist/chunks/{studio-t6b6qe31.js → studio-r5qy30vx.js} +4 -4
- package/dist/chunks/studio-rj9eamf8.js +5 -0
- package/dist/chunks/studio-rptgsk96.js +5 -0
- package/dist/chunks/studio-rthyg42z.js +928 -0
- package/dist/chunks/studio-s19tp1xr.js +5 -0
- package/dist/chunks/studio-s32578pn.js +5 -0
- package/dist/chunks/studio-svb7yyve.js +5 -0
- package/dist/chunks/studio-syreb644.js +5 -0
- package/dist/chunks/studio-tf9jryb1.js +10 -0
- package/dist/chunks/studio-tfkznv39.js +5 -0
- package/dist/chunks/studio-tft6r105.js +5 -0
- package/dist/chunks/studio-txf2kysx.js +5 -0
- package/dist/chunks/studio-v8867ddv.js +12 -0
- package/dist/chunks/studio-vxq7fcvv.js +5 -0
- package/dist/chunks/studio-w4rz9hdk.js +5 -0
- package/dist/chunks/studio-wbcjbhy1.js +9 -0
- package/dist/chunks/studio-wc649wss.js +5 -0
- package/dist/chunks/studio-wys23mxz.js +5 -0
- package/dist/chunks/studio-x1x167jh.js +5 -0
- package/dist/chunks/studio-x9hsze61.js +5 -0
- package/dist/chunks/studio-y0n7yxea.js +9 -0
- package/dist/chunks/studio-y3ahhdpx.js +5 -0
- package/dist/chunks/studio-z97c48fk.js +5 -0
- package/dist/chunks/studio-zat62m0c.js +5 -0
- package/dist/chunks/studio-zcd2e7yz.js +5 -0
- package/dist/chunks/studio-zz9qe3rw.js +64 -0
- package/dist/chunks/swatch-group-ewh24n1f.js +4 -0
- package/dist/chunks/tabs-f5cw3tgp.js +4 -0
- package/dist/chunks/textfield-wewc8rq2.js +4 -0
- package/dist/chunks/toast-1gv0h53h.js +4 -0
- package/dist/chunks/toast-host-1yg5ar8d.js +4 -0
- package/dist/chunks/{toolbar-2nnzqhrj.js → toolbar-44cm5cta.js} +3 -3
- package/dist/chunks/tooltip-yypz28gq.js +4 -0
- package/dist/chunks/tree-9xa4hm7n.js +4 -0
- package/dist/chunks/tsMode-epyfz1hv.js +14 -0
- package/dist/chunks/workspace-dz7nxfhv.js +4 -0
- package/dist/chunks/workspace-home-xsd7hkjw.js +4 -0
- package/dist/chunks/ws-client-bv552sfx.js +4 -0
- package/dist/iframe-entry.js +20 -16
- package/dist/manifest.json +77 -63
- package/dist/studio.js +106 -107
- package/dist/workers/ts.worker.js +3 -3
- package/package.json +17 -16
- package/src/about/about-modal.ts +4 -3
- package/src/account/action-flow.ts +45 -38
- package/src/account-status.ts +7 -2
- package/src/browse/component-examples.ts +272 -0
- package/src/browse/library-commands.ts +64 -104
- package/src/browse/library-layouts.ts +270 -53
- package/src/browse/library-model.ts +194 -134
- package/src/browse/library-pane.ts +748 -440
- package/src/browse/library-preview.ts +161 -26
- package/src/browse/library-source.ts +308 -41
- package/src/browse/preview-root.ts +78 -0
- package/src/browse/preview-style.ts +155 -0
- package/src/canvas/asset-refs.ts +40 -10
- package/src/canvas/asset-resolve.ts +19 -23
- package/src/canvas/canvas-helpers.ts +7 -6
- package/src/canvas/canvas-live-render.ts +260 -77
- package/src/canvas/canvas-origin.ts +37 -12
- package/src/canvas/canvas-page-context.ts +112 -0
- package/src/canvas/canvas-patcher.ts +30 -30
- package/src/canvas/canvas-perf.ts +11 -5
- package/src/canvas/canvas-render.ts +175 -148
- package/src/canvas/canvas-surface.ts +5 -3
- package/src/canvas/canvas-utils.ts +147 -61
- package/src/canvas/dialog-path.ts +9 -4
- package/src/canvas/dialog-state.ts +1 -2
- package/src/canvas/diff-marks.ts +9 -16
- package/src/canvas/diff-toolbar.ts +8 -7
- package/src/canvas/edit-width-drag.ts +4 -1
- package/src/canvas/edit-width.ts +1 -3
- package/src/canvas/iframe-channel.ts +27 -13
- package/src/canvas/iframe-drop.ts +120 -12
- package/src/canvas/iframe-editable-root.ts +29 -16
- package/src/canvas/iframe-entry.ts +104 -75
- package/src/canvas/iframe-eval.ts +73 -49
- package/src/canvas/iframe-host.ts +269 -158
- package/src/canvas/iframe-inline-edit.ts +49 -30
- package/src/canvas/iframe-insert.ts +5 -4
- package/src/canvas/iframe-interaction.ts +30 -25
- package/src/canvas/iframe-keys.ts +11 -0
- package/src/canvas/iframe-overlay.ts +1 -1
- package/src/canvas/iframe-patch.ts +25 -21
- package/src/canvas/iframe-position.ts +12 -6
- package/src/canvas/iframe-protocol.ts +36 -21
- package/src/canvas/iframe-render.ts +84 -35
- package/src/canvas/iframe-slash.ts +24 -11
- package/src/canvas/iframe-subtree.ts +10 -3
- package/src/canvas/npm-modules.ts +22 -0
- package/src/canvas/path-mapping.ts +19 -12
- package/src/canvas/popover-path.ts +7 -3
- package/src/canvas/popover-state.ts +1 -2
- package/src/canvas/preview-navigate.ts +16 -0
- package/src/canvas/repeater-sources.ts +200 -0
- package/src/canvas/serialize-scope.ts +13 -5
- package/src/canvas/stage-scrollbar.ts +7 -2
- package/src/canvas/surface-registry.ts +27 -3
- package/src/collab/collab-commands.ts +7 -2
- package/src/collab/collab-session.ts +84 -45
- package/src/collab/collab-state.ts +4 -3
- package/src/collab/monaco-binding.ts +16 -13
- package/src/collab/monaco-cursors.ts +5 -2
- package/src/commands/app-commands.ts +16 -6
- package/src/commands/budget.ts +13 -11
- package/src/commands/command-args.ts +103 -71
- package/src/commands/context.ts +55 -28
- package/src/commands/defaults.ts +69 -45
- package/src/commands/keymap.ts +56 -43
- package/src/commands/levels.ts +14 -8
- package/src/commands/live-context.ts +9 -7
- package/src/commands/reference.ts +2 -1
- package/src/commands/registry.ts +22 -11
- package/src/commands/run-reported.ts +15 -10
- package/src/component-props.ts +46 -30
- package/src/content/collection-match.ts +11 -9
- package/src/content/collection-pages.ts +412 -0
- package/src/content/content-collections.ts +270 -0
- package/src/content/draft-state.ts +4 -3
- package/src/content/entry-commands.ts +54 -62
- package/src/content/entry-editor.ts +137 -32
- package/src/content/entry-fields.ts +25 -8
- package/src/content/entry-inspector.ts +225 -0
- package/src/content/entry-model.ts +38 -15
- package/src/content/entry-open.ts +80 -0
- package/src/content/entry-summaries.ts +440 -0
- package/src/content/file-record-ids.ts +80 -0
- package/src/content/file-records.ts +125 -0
- package/src/content/page-summaries.ts +129 -0
- package/src/content/record-entry.ts +201 -0
- package/src/content/writing-banner.ts +177 -0
- package/src/create/add-new-commands.ts +185 -0
- package/src/create/add-new-flow.ts +1116 -0
- package/src/create/add-new.ts +1014 -0
- package/src/create/element-name.ts +121 -0
- package/src/editor/canvas-context-menu.ts +1 -2
- package/src/editor/canvas-slash-bridge.ts +3 -6
- package/src/editor/content-slice.ts +16 -14
- package/src/editor/context-menu.ts +35 -22
- package/src/editor/convert-targets.ts +30 -35
- package/src/editor/convert-to-component.ts +78 -48
- package/src/editor/convert-to-repeater.ts +34 -22
- package/src/editor/editable-tags.ts +17 -2
- package/src/editor/file-drop-action.ts +29 -22
- package/src/editor/inline-edit-apply.ts +79 -17
- package/src/editor/inline-edit.ts +76 -50
- package/src/editor/inline-format.ts +59 -56
- package/src/editor/inline-link.ts +40 -15
- package/src/editor/insert-component.ts +91 -0
- package/src/editor/insert-zone-action.ts +14 -5
- package/src/editor/merge-tags.ts +58 -19
- package/src/editor/repeater-scope.ts +39 -28
- package/src/editor/shortcuts.ts +76 -42
- package/src/editor/slash-menu.ts +52 -14
- package/src/files/asset-versions.ts +4 -4
- package/src/files/components.ts +89 -20
- package/src/files/elements.ts +5 -6
- package/src/files/file-ops.ts +92 -41
- package/src/files/files.ts +248 -239
- package/src/files/fs-events.ts +18 -7
- package/src/files/media-meta.ts +97 -2
- package/src/files/media-paths.ts +3 -0
- package/src/files/media-types.ts +55 -0
- package/src/files/media-upload.ts +209 -52
- package/src/files/new-file-name.ts +156 -0
- package/src/files/serialize-document.ts +15 -5
- package/src/format/constraints.ts +1 -1
- package/src/format/convert-file.ts +27 -13
- package/src/format/format-choices.ts +2 -1
- package/src/format/format-host.ts +91 -50
- package/src/github/github-auth-status.ts +27 -3
- package/src/github/github-auth.ts +21 -11
- package/src/github/github-publish.ts +28 -23
- package/src/grid/cell-editors.ts +46 -31
- package/src/grid/cell-popovers.ts +5 -3
- package/src/grid/edit-buffer.ts +10 -9
- package/src/grid/grid-controller.ts +25 -23
- package/src/grid/grid-layout.ts +21 -5
- package/src/grid/grid-open.ts +3 -33
- package/src/grid/grid-panel.ts +65 -6
- package/src/grid/grid-reveal.ts +34 -0
- package/src/grid/grid-source.ts +9 -31
- package/src/grid/grid-view.ts +45 -23
- package/src/grid/redirects-grid.ts +14 -5
- package/src/grid/redirects.ts +16 -14
- package/src/grid/schema-columns.ts +25 -19
- package/src/grid/sources/connector-source.ts +47 -20
- package/src/grid/sources/content-source.ts +100 -31
- package/src/grid/sources/csv-file-source.ts +2 -2
- package/src/grid/tabulator-tables.d.ts +61 -34
- package/src/hosting/document.ts +2 -2
- package/src/hosting/stage.ts +7 -7
- package/src/i18n/i18n-commands.ts +3 -3
- package/src/media/media-commands.ts +181 -0
- package/src/media/media-library-model.ts +232 -0
- package/src/media/media-library.ts +1283 -0
- package/src/media/media-pane.ts +51 -20
- package/src/new-project/add-repo-modal.ts +20 -19
- package/src/new-project/import-tab.ts +10 -14
- package/src/new-project/location-fields.ts +2 -1
- package/src/new-project/new-project-modal.ts +12 -9
- package/src/packages/jxsuite-update.ts +4 -3
- package/src/packages/pull-package-sync.ts +26 -25
- package/src/page-params.ts +97 -68
- package/src/panels/activity-panel.ts +38 -14
- package/src/panels/ai-chat/attached-context.ts +13 -7
- package/src/panels/ai-chat/chat-markdown.ts +8 -8
- package/src/panels/ai-chat/chat-view.ts +80 -73
- package/src/panels/ai-chat/composer.ts +30 -33
- package/src/panels/ai-chat/sessions-view.ts +1 -2
- package/src/panels/ai-panel.ts +23 -20
- package/src/panels/block-action-bar.ts +57 -46
- package/src/panels/bottom-dock.ts +5 -3
- package/src/panels/canvas-dnd-bridge.ts +36 -26
- package/src/panels/chat-panel.ts +6 -6
- package/src/panels/collections-panel.ts +306 -0
- package/src/panels/component-preview.ts +35 -13
- package/src/panels/data-explorer.ts +63 -26
- package/src/panels/data-grid.ts +18 -11
- package/src/panels/dnd.ts +115 -138
- package/src/panels/editors.ts +52 -21
- package/src/panels/elements-panel.ts +19 -5
- package/src/panels/empty-state.ts +2 -2
- package/src/panels/events-panel.ts +84 -69
- package/src/panels/formula-workspace.ts +78 -54
- package/src/panels/frontmatter-fields.ts +33 -28
- package/src/panels/git-diff-open.ts +10 -6
- package/src/panels/head-panel.ts +488 -202
- package/src/panels/i18n-panel.ts +20 -12
- package/src/panels/imports-panel.ts +25 -47
- package/src/panels/jump-bar.ts +75 -31
- package/src/panels/layers-panel.ts +130 -101
- package/src/panels/left-panel.ts +25 -11
- package/src/panels/navigator-panels.ts +23 -11
- package/src/panels/pane-context.ts +140 -49
- package/src/panels/pane-grid.ts +55 -26
- package/src/panels/panel-registry.ts +36 -46
- package/src/panels/properties-panel.ts +182 -124
- package/src/panels/quick-search.ts +53 -31
- package/src/panels/right-panel.ts +201 -45
- package/src/panels/seo-modal.ts +54 -125
- package/src/panels/settings-menu.ts +63 -61
- package/src/panels/settings-pane.ts +268 -162
- package/src/panels/signals-panel.ts +156 -135
- package/src/panels/site-model.ts +367 -0
- package/src/panels/site-panel.ts +638 -0
- package/src/panels/statement-editor.ts +230 -140
- package/src/panels/style-panel.ts +253 -206
- package/src/panels/style-utils.ts +114 -51
- package/src/panels/stylebook-doc.ts +195 -60
- package/src/panels/stylebook-layers-panel.ts +48 -89
- package/src/panels/stylebook-panel.ts +60 -27
- package/src/panels/styles-panel.ts +327 -0
- package/src/panels/tab-drop.ts +27 -11
- package/src/panels/tab-strip.ts +143 -49
- package/src/platform-errors.ts +57 -43
- package/src/platform.ts +59 -31
- package/src/platforms/cloud.ts +373 -176
- package/src/platforms/default-platform.ts +14 -8
- package/src/platforms/devserver.ts +180 -142
- package/src/platforms/read-batcher.ts +16 -8
- package/src/project-list.ts +2 -1
- package/src/publish/deploy-checklist.ts +20 -9
- package/src/publish/pages-service.ts +66 -27
- package/src/publish/publish-changes.ts +491 -0
- package/src/publish/publish-commands.ts +88 -22
- package/src/publish/publish-ids.ts +49 -0
- package/src/publish/publish-panel.ts +10 -6
- package/src/publish/publish-quick.ts +148 -0
- package/src/publish/publish-workspace.ts +926 -0
- package/src/publish/source-control.ts +907 -0
- package/src/recent-projects.ts +15 -8
- package/src/resize-edges.ts +26 -36
- package/src/services/a11y-report.ts +26 -19
- package/src/services/agent-seed.ts +23 -11
- package/src/services/ai-ask.ts +9 -12
- package/src/services/ai-command-tools.ts +68 -62
- package/src/services/ai-import-tools.ts +80 -67
- package/src/services/ai-models.ts +17 -13
- package/src/services/ai-project-tools.ts +68 -32
- package/src/services/ai-session-store.ts +19 -10
- package/src/services/ai-system-prompt.ts +46 -20
- package/src/services/ai-tools.ts +71 -27
- package/src/services/ai-write-report.ts +20 -12
- package/src/services/ai-writes.ts +4 -4
- package/src/services/automation.ts +74 -51
- package/src/services/cem-export.ts +149 -58
- package/src/services/cf-settings.ts +4 -4
- package/src/services/clock.ts +6 -1
- package/src/services/code-services.ts +37 -31
- package/src/services/connection.ts +2 -2
- package/src/services/context-manager.ts +14 -10
- package/src/services/context-resolver.ts +20 -8
- package/src/services/data-service.ts +19 -15
- package/src/services/directory-picker.ts +20 -14
- package/src/services/document-assistant.ts +39 -19
- package/src/services/gated-registry.ts +10 -6
- package/src/services/harness/chat-reducer.ts +23 -1
- package/src/services/import-client.ts +91 -38
- package/src/services/import-seed.ts +8 -2
- package/src/services/jx-validate.ts +28 -31
- package/src/services/live-preview.ts +0 -0
- package/src/services/live-surfaces.ts +6 -3
- package/src/services/model-uri.ts +10 -2
- package/src/services/module-preloads.ts +12 -8
- package/src/services/monaco-buffer.ts +43 -24
- package/src/services/monaco-lazy.ts +7 -8
- package/src/services/monaco-setup.ts +23 -16
- package/src/services/notify.ts +44 -17
- package/src/services/popover-report.ts +25 -10
- package/src/services/preview-eval.ts +20 -8
- package/src/services/profile.ts +13 -6
- package/src/services/project-path.ts +13 -10
- package/src/services/references.ts +0 -0
- package/src/services/render-critic.ts +29 -9
- package/src/services/settings/definitions.ts +25 -14
- package/src/services/settings/kernel.ts +13 -4
- package/src/services/settings/write-queue.ts +9 -9
- package/src/services/token-lint.ts +12 -10
- package/src/services/tool-executor.ts +17 -5
- package/src/services/tool-outcomes.ts +44 -24
- package/src/services/trusted-types.ts +24 -7
- package/src/settings/contexts-section.ts +11 -8
- package/src/settings/contributed-section.ts +128 -70
- package/src/settings/css-vars-editor.ts +119 -32
- package/src/settings/defs-editor.ts +38 -35
- package/src/settings/developer-panels.ts +43 -0
- package/src/settings/extension-rows.ts +16 -8
- package/src/settings/extension-sections.ts +42 -14
- package/src/settings/extensions-section.ts +4 -1
- package/src/settings/general-settings.ts +101 -28
- package/src/settings/locales-section.ts +20 -12
- package/src/settings/preferences-dialog.ts +17 -7
- package/src/settings/preferences-keymap.ts +7 -5
- package/src/settings/preferences-sections.ts +11 -5
- package/src/settings/project-sections.ts +28 -11
- package/src/settings/schema-field-ui.ts +12 -1
- package/src/settings/section-registry.ts +116 -11
- package/src/settings/settings-dialog.ts +192 -0
- package/src/settings/settings-document.ts +186 -166
- package/src/shell/tree.ts +6 -5
- package/src/shell.ts +536 -477
- package/src/site-context.ts +101 -32
- package/src/state.ts +68 -57
- package/src/store.ts +54 -34
- package/src/studio.ts +219 -116
- package/src/style/live-preview.ts +1 -1
- package/src/style/project-styles.ts +40 -7
- package/src/style/stylebook-specimens.ts +89 -0
- package/src/style/stylebook-target.ts +26 -0
- package/src/style/tag-inheritance.ts +105 -0
- package/src/style/token-ref.ts +5 -4
- package/src/style/variables-focus.ts +61 -0
- package/src/style/variables-view.ts +235 -0
- package/src/surfaces/about.ts +18 -19
- package/src/surfaces/add-new.json +1482 -0
- package/src/surfaces/add-new.ts +325 -0
- package/src/surfaces/add-repo.ts +17 -19
- package/src/surfaces/ai-chat.ts +33 -38
- package/src/surfaces/ai-credentials-form.ts +6 -16
- package/src/surfaces/ai-managed-connect.ts +3 -4
- package/src/surfaces/ai-model-picker.ts +3 -5
- package/src/surfaces/block-action-bar.ts +22 -11
- package/src/surfaces/boot-failure.json +4 -3
- package/src/surfaces/boot-failure.ts +4 -5
- package/src/surfaces/bottom-dock.json +1 -1
- package/src/surfaces/bottom-dock.ts +9 -18
- package/src/surfaces/canvas-stage.json +30 -19
- package/src/surfaces/canvas-stage.ts +17 -16
- package/src/surfaces/cf-account-picker.ts +17 -18
- package/src/surfaces/collections-panel.json +615 -0
- package/src/surfaces/collections-panel.ts +168 -0
- package/src/surfaces/commandbar.json +241 -96
- package/src/surfaces/commandbar.ts +145 -105
- package/src/surfaces/convert-repeater.ts +17 -19
- package/src/surfaces/data-actions.ts +9 -7
- package/src/surfaces/dialog.ts +26 -28
- package/src/surfaces/diff-toolbar.ts +9 -7
- package/src/surfaces/empty-state.json +1 -1
- package/src/surfaces/empty-state.ts +7 -10
- package/src/surfaces/entry-editor.json +136 -0
- package/src/surfaces/entry-editor.ts +35 -11
- package/src/surfaces/entry-inspector.json +371 -0
- package/src/surfaces/entry-inspector.ts +143 -0
- package/src/surfaces/expression-editor.ts +11 -25
- package/src/surfaces/files-panel.ts +27 -14
- package/src/surfaces/formula-palette.ts +4 -5
- package/src/surfaces/github-auth.ts +16 -20
- package/src/surfaces/github-publish.ts +17 -22
- package/src/surfaces/grid-cell.ts +30 -31
- package/src/surfaces/grid-open.ts +10 -14
- package/src/surfaces/grid-panel.ts +13 -9
- package/src/surfaces/grid-replace.ts +13 -13
- package/src/surfaces/grid-views.ts +15 -18
- package/src/surfaces/inspector-dock.json +162 -14
- package/src/surfaces/inspector-dock.ts +59 -31
- package/src/surfaces/jump-bar.ts +5 -6
- package/src/surfaces/jxsuite-update.ts +16 -22
- package/src/surfaces/library-pane.json +670 -437
- package/src/surfaces/library-pane.ts +111 -77
- package/src/surfaces/logic-panel.ts +17 -30
- package/src/surfaces/logic-workspace.ts +13 -15
- package/src/surfaces/media-browser.json +62 -6
- package/src/surfaces/media-browser.ts +26 -11
- package/src/surfaces/media-field.json +1 -1
- package/src/surfaces/media-field.ts +4 -5
- package/src/surfaces/media-library.json +1586 -0
- package/src/surfaces/media-library.ts +282 -0
- package/src/surfaces/media-pane.ts +8 -7
- package/src/surfaces/media-pick-dialog.json +71 -0
- package/src/surfaces/media-pick-dialog.ts +132 -0
- package/src/surfaces/menu.ts +47 -23
- package/src/surfaces/navigator-dock.ts +11 -12
- package/src/surfaces/new-project.ts +27 -26
- package/src/surfaces/pane-context.json +144 -77
- package/src/surfaces/pane-context.ts +44 -25
- package/src/surfaces/pane-grid.ts +15 -10
- package/src/surfaces/panel-activity.ts +5 -6
- package/src/surfaces/panel-data.ts +3 -4
- package/src/surfaces/panel-deploy-checklist.json +12 -6
- package/src/surfaces/panel-deploy-checklist.ts +8 -7
- package/src/surfaces/panel-elements.ts +5 -7
- package/src/surfaces/panel-i18n.ts +5 -7
- package/src/surfaces/panel-imports.ts +6 -13
- package/src/surfaces/panel-outline.ts +25 -19
- package/src/surfaces/panel-page.json +72 -2
- package/src/surfaces/panel-page.ts +49 -25
- package/src/surfaces/panel-problems.ts +5 -7
- package/src/surfaces/panel-signals.json +1 -1
- package/src/surfaces/panel-signals.ts +25 -39
- package/src/surfaces/panel-stylebook-layers.json +71 -204
- package/src/surfaces/panel-stylebook-layers.ts +5 -29
- package/src/surfaces/preferences.json +120 -48
- package/src/surfaces/preferences.ts +29 -11
- package/src/surfaces/progress-modal.ts +15 -9
- package/src/surfaces/properties-panel.json +1 -1
- package/src/surfaces/properties-panel.ts +20 -42
- package/src/surfaces/publish-quick.json +428 -0
- package/src/surfaces/publish-quick.ts +165 -0
- package/src/surfaces/publish-workspace.json +2892 -0
- package/src/surfaces/publish-workspace.ts +391 -0
- package/src/surfaces/publish.ts +18 -18
- package/src/surfaces/push-plan.ts +7 -8
- package/src/surfaces/rail.json +1 -159
- package/src/surfaces/rail.ts +22 -79
- package/src/surfaces/reference-field.ts +11 -15
- package/src/surfaces/schema-builder.ts +16 -22
- package/src/surfaces/schema-form.json +10 -2
- package/src/surfaces/schema-form.ts +17 -25
- package/src/surfaces/secret-field.ts +9 -6
- package/src/surfaces/seo.json +1 -1
- package/src/surfaces/seo.ts +21 -15
- package/src/surfaces/settings-contexts.ts +9 -7
- package/src/surfaces/settings-contributed.json +5 -5
- package/src/surfaces/settings-contributed.ts +32 -12
- package/src/surfaces/settings-css-vars.json +44 -36
- package/src/surfaces/settings-css-vars.ts +82 -16
- package/src/surfaces/settings-defs.json +2 -2
- package/src/surfaces/settings-defs.ts +17 -21
- package/src/surfaces/settings-deploy.json +2 -15
- package/src/surfaces/settings-deploy.ts +9 -16
- package/src/surfaces/settings-dialog.json +51 -0
- package/src/surfaces/settings-dialog.ts +169 -0
- package/src/surfaces/settings-extensions.ts +5 -6
- package/src/surfaces/settings-head.ts +33 -39
- package/src/surfaces/settings-locales.ts +8 -20
- package/src/surfaces/settings-overview.json +3 -3
- package/src/surfaces/settings-overview.ts +14 -8
- package/src/surfaces/settings-packages.ts +8 -7
- package/src/surfaces/settings-pane.json +269 -46
- package/src/surfaces/settings-pane.ts +88 -36
- package/src/surfaces/settings-rawjson.ts +5 -6
- package/src/surfaces/shell.json +2 -1
- package/src/surfaces/shell.ts +1 -2
- package/src/surfaces/site-panel.json +1029 -0
- package/src/surfaces/site-panel.ts +233 -0
- package/src/surfaces/slash-menu.json +63 -21
- package/src/surfaces/slash-menu.ts +42 -9
- package/src/surfaces/statements.ts +13 -18
- package/src/surfaces/statusbar.ts +56 -29
- package/src/surfaces/style-panel.ts +18 -31
- package/src/surfaces/stylebook-chrome.ts +3 -5
- package/src/surfaces/styles-panel.json +735 -0
- package/src/surfaces/styles-panel.ts +195 -0
- package/src/surfaces/styles-variables.json +149 -0
- package/src/surfaces/styles-variables.ts +145 -0
- package/src/surfaces/tab-strip.json +4 -4
- package/src/surfaces/tab-strip.ts +14 -13
- package/src/surfaces/target-line.ts +6 -7
- package/src/surfaces/welcome.ts +6 -8
- package/src/surfaces/writing-banner.json +94 -0
- package/src/surfaces/writing-banner.ts +80 -0
- package/src/tabs/bare-repeaters.ts +101 -0
- package/src/tabs/patch-ops.ts +4 -3
- package/src/tabs/project-config.ts +32 -21
- package/src/tabs/selection.ts +36 -8
- package/src/tabs/tab.ts +99 -48
- package/src/tabs/transact.ts +98 -53
- package/src/types.ts +53 -43
- package/src/ui/ai-credentials-form.ts +10 -13
- package/src/ui/ai-model-picker.ts +3 -3
- package/src/ui/cf-account-picker.ts +7 -9
- package/src/ui/color-selector.ts +9 -5
- package/src/ui/dynamic-slot.ts +7 -8
- package/src/ui/expression-editor.ts +112 -105
- package/src/ui/form-controls.ts +104 -56
- package/src/ui/formula-catalog.ts +239 -230
- package/src/ui/formula-chips.ts +33 -18
- package/src/ui/layers.ts +57 -31
- package/src/ui/media-picker.ts +300 -47
- package/src/ui/popover-surface.ts +20 -12
- package/src/ui/progress-modal.ts +13 -8
- package/src/ui/regions.ts +14 -12
- package/src/ui/schema-form.ts +372 -97
- package/src/ui/surface.ts +71 -8
- package/src/ui/timing.ts +9 -0
- package/src/ui/value-source.ts +44 -31
- package/src/ui/virtual-window.ts +29 -3
- package/src/utils/base64.ts +6 -4
- package/src/utils/edit-display.ts +366 -111
- package/src/utils/element-selectors.ts +3 -2
- package/src/utils/google-fonts.ts +15 -14
- package/src/utils/inherited-style.ts +18 -20
- package/src/utils/link-target.ts +1 -1
- package/src/utils/local-day.ts +18 -0
- package/src/utils/preview-format.ts +25 -3
- package/src/utils/strip-events.ts +49 -22
- package/src/utils/studio-utils.ts +29 -14
- package/src/view.ts +2 -3
- package/src/workspace/pane-derive.ts +14 -16
- package/src/workspace/session.ts +81 -50
- package/src/workspace/tab-workspace.ts +137 -0
- package/src/workspace/workspace-back.ts +189 -0
- package/src/workspace/workspace-home.ts +133 -0
- package/src/workspace/workspace-ids.ts +129 -0
- package/src/workspace/workspace-switch.ts +372 -0
- package/src/workspace/workspace.ts +165 -47
- package/styles/shell-frame.css +30 -7
- package/styles/shell-frame.json +15 -3
- package/dist/chunks/2020-va2wwra4.js +0 -4
- package/dist/chunks/adapter-f93pafd7.js +0 -4
- package/dist/chunks/cf-account-picker-af1h381v.js +0 -4
- package/dist/chunks/cf-settings-125tdm0w.js +0 -4
- package/dist/chunks/color-area-jqhna8zy.js +0 -4
- package/dist/chunks/color-field-embq5ctg.js +0 -4
- package/dist/chunks/color-fpezvnkt.js +0 -4
- package/dist/chunks/color-slider-1qmw7wqy.js +0 -4
- package/dist/chunks/combobox-773hdzyj.js +0 -4
- package/dist/chunks/components-ax2f1fnn.js +0 -4
- package/dist/chunks/content-source-108aqtk1.js +0 -4
- package/dist/chunks/convert-to-repeater-ry5rmppr.js +0 -4
- package/dist/chunks/dialog-mtm9fq5t.js +0 -4
- package/dist/chunks/editor-pfgdmkb0.js +0 -4
- package/dist/chunks/entry-commands-t0k1q0kx.js +0 -4
- package/dist/chunks/extension-sections-6mwh2hf8.js +0 -4
- package/dist/chunks/file-ops-meej5mqf.js +0 -4
- package/dist/chunks/files-44vp8a2s.js +0 -4
- package/dist/chunks/format-host-7q1petb9.js +0 -4
- package/dist/chunks/fs-events-h2mwnxaz.js +0 -4
- package/dist/chunks/git-panel-zngbymvd.js +0 -4
- package/dist/chunks/grid-view-sx9vynsp.js +0 -51
- package/dist/chunks/icons-p44xhjf0.js +0 -4
- package/dist/chunks/iframe-entry-f7mqjwpm.js +0 -5
- package/dist/chunks/iframe-entry-haw7jkvz.js +0 -5
- package/dist/chunks/iframe-entry-z6qrytv3.js +0 -5
- package/dist/chunks/iframe-host-qk3ycq87.js +0 -4
- package/dist/chunks/index-wkyfjeqz.js +0 -4
- package/dist/chunks/jsonMode-s8kt9dsj.js +0 -13
- package/dist/chunks/jx-validate-psgd7vsx.js +0 -4
- package/dist/chunks/layers-panel-1kq2jyfk.js +0 -4
- package/dist/chunks/layers-xd92fg8d.js +0 -4
- package/dist/chunks/listbox-s8fkmnq8.js +0 -4
- package/dist/chunks/lit-html-ac4cwwr4.js +0 -4
- package/dist/chunks/media-picker-0svzkdyb.js +0 -4
- package/dist/chunks/menu-37d07z9m.js +0 -4
- package/dist/chunks/menu-5c55ea3d.js +0 -4
- package/dist/chunks/monaco-binding-z6r70pdt.js +0 -4
- package/dist/chunks/monaco-buffer-fz6gq5y7.js +0 -4
- package/dist/chunks/monaco-setup-q4axkgj7.js +0 -4
- package/dist/chunks/notify-0xgtn8q1.js +0 -4
- package/dist/chunks/number-field-gw7sq8rn.js +0 -4
- package/dist/chunks/parse-897fvqah.js +0 -4
- package/dist/chunks/platform-v1qctbe6.js +0 -4
- package/dist/chunks/popover-8htra4er.js +0 -4
- package/dist/chunks/publish-panel-ym1fmgq5.js +0 -4
- package/dist/chunks/quick-search-a54e6t5n.js +0 -4
- package/dist/chunks/references-gmqp82fs.js +0 -4
- package/dist/chunks/right-panel-v7t9awbk.js +0 -4
- package/dist/chunks/section-registry-vhyf3zsr.js +0 -4
- package/dist/chunks/select-n3v7gwas.js +0 -4
- package/dist/chunks/split-pff8f3ze.js +0 -4
- package/dist/chunks/studio-0bhx5hz6.js +0 -5
- package/dist/chunks/studio-0k1ddnyy.js +0 -6
- package/dist/chunks/studio-1b04pd0j.js +0 -64
- package/dist/chunks/studio-4dwbj6gb.js +0 -5
- package/dist/chunks/studio-4tanh828.js +0 -5
- package/dist/chunks/studio-55h4mstj.js +0 -4
- package/dist/chunks/studio-5tnvjkz4.js +0 -5
- package/dist/chunks/studio-60dqgb0c.js +0 -5
- package/dist/chunks/studio-61dp09qg.js +0 -9
- package/dist/chunks/studio-63epcrj2.js +0 -5
- package/dist/chunks/studio-74k29dy9.js +0 -5
- package/dist/chunks/studio-7vg6jcd3.js +0 -5
- package/dist/chunks/studio-7zx31knw.js +0 -9
- package/dist/chunks/studio-8bxk97km.js +0 -5
- package/dist/chunks/studio-933e30n4.js +0 -5
- package/dist/chunks/studio-98wnwhbg.js +0 -5
- package/dist/chunks/studio-9mccjwjh.js +0 -14
- package/dist/chunks/studio-a2ke1e4t.js +0 -5
- package/dist/chunks/studio-e3a2a6v3.js +0 -4
- package/dist/chunks/studio-e81q1vb9.js +0 -5
- package/dist/chunks/studio-epgrmqqm.js +0 -5
- package/dist/chunks/studio-ery42sqr.js +0 -4
- package/dist/chunks/studio-g1shz58g.js +0 -5
- package/dist/chunks/studio-gf0fz03c.js +0 -5
- package/dist/chunks/studio-gjtpe62q.js +0 -6
- package/dist/chunks/studio-gkskhg7m.js +0 -5
- package/dist/chunks/studio-gx4dnjzd.js +0 -5
- package/dist/chunks/studio-j03zga3y.js +0 -9
- package/dist/chunks/studio-jhpxeckz.js +0 -5
- package/dist/chunks/studio-k01r7ykp.js +0 -5
- package/dist/chunks/studio-kk7h30ne.js +0 -7
- package/dist/chunks/studio-kt1zqney.js +0 -5
- package/dist/chunks/studio-m3cwhvye.js +0 -5
- package/dist/chunks/studio-mcayt6hz.js +0 -5
- package/dist/chunks/studio-myjcghv3.js +0 -5
- package/dist/chunks/studio-n8bxwc3y.js +0 -4
- package/dist/chunks/studio-ngm8gvpb.js +0 -5
- package/dist/chunks/studio-nj5a01jy.js +0 -928
- package/dist/chunks/studio-pcgz8heb.js +0 -5
- package/dist/chunks/studio-qcsq0t15.js +0 -5
- package/dist/chunks/studio-qkstvve9.js +0 -5
- package/dist/chunks/studio-qv1pwd3c.js +0 -5
- package/dist/chunks/studio-rc6dvxjb.js +0 -7
- package/dist/chunks/studio-s8dmmz66.js +0 -5
- package/dist/chunks/studio-sp5xzbj4.js +0 -6
- package/dist/chunks/studio-szsjbj0g.js +0 -5
- package/dist/chunks/studio-t1xzawhr.js +0 -16
- package/dist/chunks/studio-tdcprbqb.js +0 -5
- package/dist/chunks/studio-vrmcjf9g.js +0 -7
- package/dist/chunks/studio-vyc0b4he.js +0 -10
- package/dist/chunks/studio-w0cgf6jg.js +0 -5
- package/dist/chunks/studio-w3hskzqk.js +0 -5
- package/dist/chunks/studio-xgrgcdyh.js +0 -9
- package/dist/chunks/studio-xz2yxfcb.js +0 -5
- package/dist/chunks/studio-y6n42tgs.js +0 -5
- package/dist/chunks/studio-yb560vxr.js +0 -5
- package/dist/chunks/studio-yn9f8vtx.js +0 -5
- package/dist/chunks/studio-yw05w8f0.js +0 -7
- package/dist/chunks/studio-z16sgavc.js +0 -5
- package/dist/chunks/studio-zey7zsdw.js +0 -12
- package/dist/chunks/studio-zyqn40w4.js +0 -5
- package/dist/chunks/swatch-group-8qh9a3bm.js +0 -4
- package/dist/chunks/tabs-jwthg40w.js +0 -4
- package/dist/chunks/textfield-spy3hc77.js +0 -4
- package/dist/chunks/toast-4d35zd64.js +0 -4
- package/dist/chunks/toast-host-8sjmfed3.js +0 -4
- package/dist/chunks/tooltip-fd6g9xy3.js +0 -4
- package/dist/chunks/tree-h19v1jfz.js +0 -4
- package/dist/chunks/tsMode-2frah6h1.js +0 -14
- package/dist/chunks/workspace-zt81g1ms.js +0 -4
- package/dist/chunks/ws-client-n2bh4hkf.js +0 -4
- package/src/panels/frontmatter-panel.ts +0 -701
- package/src/panels/git-panel.ts +0 -1120
- package/src/surfaces/doc-header.json +0 -776
- package/src/surfaces/doc-header.ts +0 -231
- package/src/surfaces/git-panel.json +0 -1880
- package/src/surfaces/git-panel.ts +0 -272
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/// <reference lib="dom" />
|
|
2
|
+
/**
|
|
3
|
+
* A live preview's root: the shadow root an island shows a rendered document or component in (the
|
|
4
|
+
* Site panel's component cards and the Content home's cards, `specs/studio.md` §5.7 and §9.1.2).
|
|
5
|
+
*
|
|
6
|
+
* A module of its own, apart from `library-preview.ts`, because what a preview IS (the render, the
|
|
7
|
+
* cache, the visibility gate) and where it is SHOWN are separate questions, and the second is plain
|
|
8
|
+
* DOM that every surface hosting a preview answers the same way.
|
|
9
|
+
*
|
|
10
|
+
* @docs studio/interface
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { isFunction } from "@jxsuite/schema/guards";
|
|
14
|
+
import { projectPreviewSheets } from "./preview-style";
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* The one rule a preview needs that its box cannot give it from outside: an image whose prop
|
|
18
|
+
* defaults to nothing draws a broken-image icon and its alt text, which in a thumbnail is noise,
|
|
19
|
+
* not the component. Everything else about the box (its size, its scale, its light surface) is the
|
|
20
|
+
* surface document's, on the island itself.
|
|
21
|
+
*/
|
|
22
|
+
const PREVIEW_RULES = 'img:not([src]), img[src=""] { visibility: hidden; }';
|
|
23
|
+
|
|
24
|
+
const _previewSheets = new WeakMap<Document, CSSStyleSheet>();
|
|
25
|
+
|
|
26
|
+
/** The preview rules as a sheet of `doc`'s own (a constructed sheet is adoptable only there). */
|
|
27
|
+
function previewSheetFor(doc: Document): CSSStyleSheet | null {
|
|
28
|
+
const known = _previewSheets.get(doc);
|
|
29
|
+
if (known) {
|
|
30
|
+
return known;
|
|
31
|
+
}
|
|
32
|
+
const Sheet = doc.defaultView?.CSSStyleSheet;
|
|
33
|
+
if (!isFunction(Sheet)) {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
const sheet = new Sheet();
|
|
37
|
+
sheet.replaceSync(PREVIEW_RULES);
|
|
38
|
+
_previewSheets.set(doc, sheet);
|
|
39
|
+
return sheet;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Show a rendered preview in its island, inside a shadow root of the island's own.
|
|
44
|
+
*
|
|
45
|
+
* **A preview is a page's part, rendered in Studio's window, and the shadow root is what keeps it a
|
|
46
|
+
* guest there.** It used to be appended straight into the island, so a component's own ids joined
|
|
47
|
+
* Studio's: Elite Equipment Rental's `<h2 id="equipment">` was the document's `#equipment`, an
|
|
48
|
+
* `aria-labelledby` or a fragment link anywhere in the chrome could resolve to a thumbnail, and two
|
|
49
|
+
* cards of one component made the id a duplicate. Ids, `getElementById` and Studio's linked
|
|
50
|
+
* stylesheets all stop at the root's boundary; inherited properties (the island's text colour and
|
|
51
|
+
* size) still cross it, which is what the light document surface relies on.
|
|
52
|
+
*
|
|
53
|
+
* The runtime's rules are not lost: the Jx runtime writes every element's style into sheets it
|
|
54
|
+
* adopts on the document (`openSink` in `@jxsuite/runtime`), keyed on each element's `data-jx`
|
|
55
|
+
* hash, and those sheets are adopted into the root too, so a component draws as it did. They are
|
|
56
|
+
* read at each fill, so a sheet the runtime opened since the last one is included.
|
|
57
|
+
*
|
|
58
|
+
* @param slot The island the surface document drew empty.
|
|
59
|
+
* @param rendered The preview, from `previewFor` (`library-preview.ts`).
|
|
60
|
+
*/
|
|
61
|
+
export function mountPreview(slot: HTMLElement, rendered: HTMLElement): void {
|
|
62
|
+
const root = slot.shadowRoot ?? slot.attachShadow({ mode: "open" });
|
|
63
|
+
const own = previewSheetFor(slot.ownerDocument);
|
|
64
|
+
/* The project's sheets first, the runtime's after them: on the page, the site's stylesheet is
|
|
65
|
+
in the document and the runtime's rules are adopted after it, so a component's own rule wins
|
|
66
|
+
over a site rule of equal specificity there, and must here. */
|
|
67
|
+
root.adoptedStyleSheets = [
|
|
68
|
+
...projectPreviewSheets(),
|
|
69
|
+
...slot.ownerDocument.adoptedStyleSheets,
|
|
70
|
+
...(own ? [own] : []),
|
|
71
|
+
];
|
|
72
|
+
root.replaceChildren(rendered);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/** The preview an island is showing, or null while it shows none. */
|
|
76
|
+
export function shownPreview(slot: Element): Element | null {
|
|
77
|
+
return slot.shadowRoot?.firstElementChild ?? null;
|
|
78
|
+
}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/// <reference lib="dom" />
|
|
2
|
+
/**
|
|
3
|
+
* The project's stylesheet, as a live preview's root adopts it.
|
|
4
|
+
*
|
|
5
|
+
* A component card or a page card in the Site panel and the Content home draws a part of a page in
|
|
6
|
+
* Studio's own window, inside a shadow root of its box (`preview-root.ts`). It drew that part with
|
|
7
|
+
* the runtime's rules alone: none of the site's tokens, typography or linked stylesheets, which is
|
|
8
|
+
* where most of a component's look lives, so a museum card or a site header drew as an empty white
|
|
9
|
+
* box. A page draws with two things this module supplies: `project.json`'s `style`, emitted by the
|
|
10
|
+
* builder the canvas and the build share (`@jxsuite/site/site-style`), and the stylesheets the
|
|
11
|
+
* project's `$head` links.
|
|
12
|
+
*
|
|
13
|
+
* Both address the page's `:root` and `body`, which a shadow root does not have: inside it the box
|
|
14
|
+
* the preview is drawn in is `:host`. The project block is emitted with `:host` as its root and
|
|
15
|
+
* body, and a linked sheet's own `:root`, `html` and `body` selectors are re-pointed at `:host`
|
|
16
|
+
* through the CSSOM, rule by rule, so a site's custom properties and body typography reach the
|
|
17
|
+
* preview the way they reach the page. A web font is the one thing that does not: `@font-face` is
|
|
18
|
+
* not honoured inside a shadow root, so a preview draws in the fallback face.
|
|
19
|
+
*
|
|
20
|
+
* Built once per project configuration and shared by every preview of it.
|
|
21
|
+
*
|
|
22
|
+
* @docs studio/interface
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
import { buildSiteStyleCSS } from "@jxsuite/site/site-style";
|
|
26
|
+
import { isFunction, isNonNullObject, isString } from "@jxsuite/schema/guards";
|
|
27
|
+
import { previewAssetSrcFor } from "../canvas/asset-refs";
|
|
28
|
+
import { projectState } from "../store";
|
|
29
|
+
import type { JxHeadEntry, ProjectConfig } from "@jxsuite/schema/types";
|
|
30
|
+
|
|
31
|
+
/** The preview box, as a project sheet names the page's root and body inside a shadow root. */
|
|
32
|
+
const HOST_ROOTS = { body: ":host", root: ":host" };
|
|
33
|
+
|
|
34
|
+
/** Every sheet built for a configuration, settled or in flight. */
|
|
35
|
+
const _sheets = new WeakMap<ProjectConfig, Promise<CSSStyleSheet[]>>();
|
|
36
|
+
/** The settled answers, for the synchronous mount. */
|
|
37
|
+
const _settled = new WeakMap<ProjectConfig, CSSStyleSheet[]>();
|
|
38
|
+
|
|
39
|
+
/** A selector of the page's root or body re-pointed at the preview box; `null` when unchanged. */
|
|
40
|
+
export function hostSelector(selector: string): string | null {
|
|
41
|
+
const rewritten = selector
|
|
42
|
+
.replaceAll(/:root\b/g, ":host")
|
|
43
|
+
.replaceAll(/(^|[\s,>+~(])(?:html|body)(?![\w-])/g, "$1:host")
|
|
44
|
+
.replaceAll(/:host(?:\s*>?\s*:host)+/g, ":host");
|
|
45
|
+
return rewritten === selector ? null : rewritten;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** What holds rules: a sheet, or a grouping rule (`@media`, `@supports`, a nesting style rule). */
|
|
49
|
+
type RuleContainer = CSSStyleSheet | CSSGroupingRule;
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Re-point every style rule under `container` (at any depth of grouping or nesting) at the box.
|
|
53
|
+
*
|
|
54
|
+
* A rule is REPLACED by its own text under the new selector rather than assigned a new
|
|
55
|
+
* `selectorText`: the assignment is settable in browsers but not in every CSSOM, and replacing it
|
|
56
|
+
* keeps its declarations, its nested rules and its place in source order either way. A rewritten
|
|
57
|
+
* selector the engine cannot parse keeps the rule as it was.
|
|
58
|
+
*/
|
|
59
|
+
function rehostRules(container: RuleContainer): void {
|
|
60
|
+
for (let index = 0; index < container.cssRules.length; index += 1) {
|
|
61
|
+
const rule = container.cssRules[index];
|
|
62
|
+
const rewritten = rule instanceof CSSStyleRule ? hostSelector(rule.selectorText) : null;
|
|
63
|
+
if (rule instanceof CSSStyleRule && rewritten !== null) {
|
|
64
|
+
const text = `${rewritten}${rule.cssText.slice(rule.cssText.indexOf("{"))}`;
|
|
65
|
+
try {
|
|
66
|
+
container.insertRule(text, index);
|
|
67
|
+
container.deleteRule(index + 1);
|
|
68
|
+
} catch {
|
|
69
|
+
// Unparseable under the new selector: the original stays.
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
const current = container.cssRules[index];
|
|
73
|
+
if (current instanceof CSSGroupingRule) {
|
|
74
|
+
rehostRules(current);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/** The stylesheet `href`s the project's `$head` links, in order. */
|
|
80
|
+
export function headStylesheetHrefs(head: readonly JxHeadEntry[] | undefined): string[] {
|
|
81
|
+
const hrefs: string[] = [];
|
|
82
|
+
for (const entry of head ?? []) {
|
|
83
|
+
if (!isNonNullObject(entry) || String(entry.tagName).toLowerCase() !== "link") {
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
const { href, rel } = entry.attributes ?? {};
|
|
87
|
+
if (isString(href) && href !== "" && isString(rel) && rel.split(/\s+/).includes("stylesheet")) {
|
|
88
|
+
hrefs.push(href);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return hrefs;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/** One linked stylesheet as a preview sheet, or null when it cannot be read. */
|
|
95
|
+
async function linkedSheet(href: string): Promise<CSSStyleSheet | null> {
|
|
96
|
+
const url = previewAssetSrcFor(href, "project.json");
|
|
97
|
+
try {
|
|
98
|
+
const response = await fetch(url);
|
|
99
|
+
if (!response.ok) {
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
const absolute = new URL(url, location.href).href;
|
|
103
|
+
// Its own URL as the base, so the sheet's relative `url()` references resolve as they do on the
|
|
104
|
+
// Page and not against Studio's address.
|
|
105
|
+
const sheet = new CSSStyleSheet({ baseURL: absolute });
|
|
106
|
+
sheet.replaceSync(await response.text());
|
|
107
|
+
rehostRules(sheet);
|
|
108
|
+
return sheet;
|
|
109
|
+
} catch {
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/** Build every sheet for one configuration: the linked sheets in `$head` order, then the block. */
|
|
115
|
+
async function buildSheets(config: ProjectConfig): Promise<CSSStyleSheet[]> {
|
|
116
|
+
const linked = await Promise.all(
|
|
117
|
+
headStylesheetHrefs(config.$head).map((href) => linkedSheet(href)),
|
|
118
|
+
);
|
|
119
|
+
const sheets = linked.filter((sheet): sheet is CSSStyleSheet => sheet !== null);
|
|
120
|
+
const { style } = config;
|
|
121
|
+
if (isNonNullObject(style)) {
|
|
122
|
+
const block = new CSSStyleSheet();
|
|
123
|
+
block.replaceSync(
|
|
124
|
+
buildSiteStyleCSS(style, config.$media ?? {}, (value) => value, undefined, HOST_ROOTS),
|
|
125
|
+
);
|
|
126
|
+
sheets.push(block);
|
|
127
|
+
}
|
|
128
|
+
return sheets;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Read the open project's preview sheets, building them on first ask. A preview awaits this before
|
|
133
|
+
* it is shown, so {@link projectPreviewSheets} has the answer by the time a box is filled.
|
|
134
|
+
*/
|
|
135
|
+
export function loadProjectPreviewSheets(): Promise<CSSStyleSheet[]> {
|
|
136
|
+
const config = projectState?.projectConfig;
|
|
137
|
+
if (!config || !isFunction(globalThis.CSSStyleSheet)) {
|
|
138
|
+
return Promise.resolve([]);
|
|
139
|
+
}
|
|
140
|
+
let pending = _sheets.get(config);
|
|
141
|
+
if (!pending) {
|
|
142
|
+
pending = buildSheets(config).then((sheets) => {
|
|
143
|
+
_settled.set(config, sheets);
|
|
144
|
+
return sheets;
|
|
145
|
+
});
|
|
146
|
+
_sheets.set(config, pending);
|
|
147
|
+
}
|
|
148
|
+
return pending;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/** The open project's preview sheets as far as they are built: none until the first read lands. */
|
|
152
|
+
export function projectPreviewSheets(): readonly CSSStyleSheet[] {
|
|
153
|
+
const config = projectState?.projectConfig;
|
|
154
|
+
return (config && _settled.get(config)) ?? [];
|
|
155
|
+
}
|
package/src/canvas/asset-refs.ts
CHANGED
|
@@ -53,6 +53,9 @@ export function assetContextFor(
|
|
|
53
53
|
const space = over?.space ?? "site";
|
|
54
54
|
const mount = contentMountFor(
|
|
55
55
|
documentPath,
|
|
56
|
+
/* SAFETY: `content` is the parser extension's opaque project section, which its project
|
|
57
|
+
fragment schema defines as a map of section entries; contentMountFor reads only each entry's
|
|
58
|
+
optional `source` and skips an entry without one. */
|
|
56
59
|
projectState?.projectConfig?.content as Record<string, ContentSectionEntry> | undefined,
|
|
57
60
|
projectLocales(),
|
|
58
61
|
);
|
|
@@ -61,13 +64,16 @@ export function assetContextFor(
|
|
|
61
64
|
if (space === "site" && !mount) {
|
|
62
65
|
return null;
|
|
63
66
|
}
|
|
64
|
-
|
|
67
|
+
const context: AssetContext = {
|
|
65
68
|
documentDir: dirOfPath(documentPath ?? ""),
|
|
66
|
-
...(over?.fileBaseUrl === undefined ? {} : { fileBaseUrl: over.fileBaseUrl }),
|
|
67
69
|
lanes: BUILD_LANES,
|
|
68
70
|
mounts: mount ? [mount] : [],
|
|
69
71
|
space,
|
|
70
72
|
};
|
|
73
|
+
if (over?.fileBaseUrl !== undefined) {
|
|
74
|
+
context.fileBaseUrl = over.fileBaseUrl;
|
|
75
|
+
}
|
|
76
|
+
return context;
|
|
71
77
|
}
|
|
72
78
|
|
|
73
79
|
/**
|
|
@@ -91,14 +97,38 @@ export function assetContextFor(
|
|
|
91
97
|
* @returns {string} A src the parent realm can load
|
|
92
98
|
*/
|
|
93
99
|
export function previewAssetSrc(value: string): string {
|
|
100
|
+
return previewAssetSrcFor(value, activeTab.value?.documentPath);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* {@link previewAssetSrc} for a value authored in a NAMED document rather than the focused one.
|
|
105
|
+
*
|
|
106
|
+
* A project-level surface (Project Settings › Overview previewing the `$head` favicon of
|
|
107
|
+
* `project.json`) is about the project whatever tab is in front, so it names its document instead
|
|
108
|
+
* of asking which one has the focus.
|
|
109
|
+
*
|
|
110
|
+
* @param {string} value - The reference as the author wrote it
|
|
111
|
+
* @param {string | null | undefined} documentPath - Project-relative path of the authoring document
|
|
112
|
+
* @returns {string} A src the parent realm can load
|
|
113
|
+
*/
|
|
114
|
+
export function previewAssetSrcFor(value: string, documentPath: string | null | undefined): string {
|
|
94
115
|
if (!value) {
|
|
95
116
|
return value;
|
|
96
117
|
}
|
|
97
|
-
const ctx = assetContextFor(
|
|
118
|
+
const ctx = assetContextFor(documentPath, hostAssetDeclarations());
|
|
98
119
|
const versioned = ctx && { ...ctx, versions: assetVersionsSnapshot() };
|
|
99
120
|
return loopbackAssetSrc(resolveAssetRef(value, versioned) ?? value);
|
|
100
121
|
}
|
|
101
122
|
|
|
123
|
+
/**
|
|
124
|
+
* The registered host's media declarations: its asset space, and the base project files serve
|
|
125
|
+
* under.
|
|
126
|
+
*/
|
|
127
|
+
export interface HostAssetDeclarations {
|
|
128
|
+
space?: "site" | "repo" | undefined;
|
|
129
|
+
fileBaseUrl: string;
|
|
130
|
+
}
|
|
131
|
+
|
|
102
132
|
/**
|
|
103
133
|
* What the registered host says about media — the platform's `assetSpace`, and the base project
|
|
104
134
|
* files are served under.
|
|
@@ -108,14 +138,14 @@ export function previewAssetSrc(value: string): string {
|
|
|
108
138
|
* The canvas pipeline builds the same two values from the same two places; the difference is only
|
|
109
139
|
* that it already has the document in hand.
|
|
110
140
|
*
|
|
111
|
-
* @returns {
|
|
141
|
+
* @returns {HostAssetDeclarations} The host's declarations
|
|
112
142
|
*/
|
|
113
|
-
export function hostAssetDeclarations(): {
|
|
114
|
-
|
|
115
|
-
fileBaseUrl: string;
|
|
116
|
-
} {
|
|
117
|
-
return {
|
|
143
|
+
export function hostAssetDeclarations(): HostAssetDeclarations {
|
|
144
|
+
const declarations: HostAssetDeclarations = {
|
|
118
145
|
fileBaseUrl: documentBase(projectState?.projectRoot),
|
|
119
|
-
...(hasPlatform() ? { space: getPlatform().assetSpace } : {}),
|
|
120
146
|
};
|
|
147
|
+
if (hasPlatform()) {
|
|
148
|
+
declarations.space = getPlatform().assetSpace;
|
|
149
|
+
}
|
|
150
|
+
return declarations;
|
|
121
151
|
}
|
|
@@ -45,29 +45,24 @@
|
|
|
45
45
|
|
|
46
46
|
import {
|
|
47
47
|
assetUrlFor,
|
|
48
|
+
CONTENT_SECTION_KEY,
|
|
48
49
|
encodeProjectPath,
|
|
49
50
|
isNonRelativeRef,
|
|
50
51
|
joinProjectPath,
|
|
52
|
+
LOCALE_PLACEHOLDER,
|
|
51
53
|
projectPathForRef,
|
|
54
|
+
SAFE_CONTENT_TYPE_NAME,
|
|
52
55
|
splitRefSuffix,
|
|
53
56
|
} from "@jxsuite/schema/asset-paths";
|
|
54
57
|
import type { AssetLane, AssetMount } from "@jxsuite/schema/asset-paths";
|
|
58
|
+
import { isString } from "@jxsuite/schema/guards";
|
|
55
59
|
import type { ContentSectionEntry } from "../types";
|
|
56
60
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* The placeholder a content type's `source` may carry to say "one directory per locale".
|
|
65
|
-
*
|
|
66
|
-
* Held here rather than imported out of the parser extension's content loader ({@link
|
|
67
|
-
* file://../../../../extensions/parser/src/content-loader.ts}): that module reads the filesystem
|
|
68
|
-
* and this one runs in a browser. It is also an extension, and core may not import one.
|
|
69
|
-
*/
|
|
70
|
-
const LOCALE_PLACEHOLDER = "{locale}";
|
|
61
|
+
/* The content namespace, the URL-safe name test and the `{locale}` token come from
|
|
62
|
+
`@jxsuite/schema/asset-paths`, the one module both this browser-side resolver and the parser
|
|
63
|
+
extension's content loader may import: the loader reads the filesystem, and it is an extension,
|
|
64
|
+
which core may not import. Re-exported so Studio's content modules keep one local import. */
|
|
65
|
+
export { LOCALE_PLACEHOLDER } from "@jxsuite/schema/asset-paths";
|
|
71
66
|
|
|
72
67
|
/**
|
|
73
68
|
* Everything the canvas needs to resolve one reference, as PLAIN DATA.
|
|
@@ -127,7 +122,7 @@ export interface AssetContext {
|
|
|
127
122
|
* @returns {string} The versioned URL
|
|
128
123
|
*/
|
|
129
124
|
export function withVersion(url: string, version: string | undefined): string {
|
|
130
|
-
if (
|
|
125
|
+
if (!isString(version) || version === "") {
|
|
131
126
|
return url;
|
|
132
127
|
}
|
|
133
128
|
const hashAt = url.indexOf("#");
|
|
@@ -172,7 +167,7 @@ function ownVersion(
|
|
|
172
167
|
return undefined;
|
|
173
168
|
}
|
|
174
169
|
const version: unknown = versions[path];
|
|
175
|
-
return
|
|
170
|
+
return isString(version) ? version : undefined;
|
|
176
171
|
}
|
|
177
172
|
|
|
178
173
|
/**
|
|
@@ -184,13 +179,14 @@ function ownVersion(
|
|
|
184
179
|
* file tree cannot reach in the first place.
|
|
185
180
|
*
|
|
186
181
|
* @param {string | null | undefined} documentPath - Project-relative path of the open document
|
|
187
|
-
* @param {Record<string, ContentSectionEntry> | null | undefined} content -
|
|
182
|
+
* @param {Record<string, ContentSectionEntry | null | undefined> | null | undefined} content -
|
|
183
|
+
* Project.json `content`
|
|
188
184
|
* @param {readonly string[]} [locales] - Canonical locale tags, for `{locale}` sources
|
|
189
185
|
* @returns {AssetMount | null} The mount, project-relative
|
|
190
186
|
*/
|
|
191
187
|
export function contentMountFor(
|
|
192
188
|
documentPath: string | null | undefined,
|
|
193
|
-
content: Record<string, ContentSectionEntry> | null | undefined,
|
|
189
|
+
content: Record<string, ContentSectionEntry | null | undefined> | null | undefined,
|
|
194
190
|
locales: readonly string[] = [],
|
|
195
191
|
): AssetMount | null {
|
|
196
192
|
if (!documentPath || !content) {
|
|
@@ -204,7 +200,7 @@ export function contentMountFor(
|
|
|
204
200
|
}
|
|
205
201
|
};
|
|
206
202
|
for (const [name, def] of Object.entries(content)) {
|
|
207
|
-
if (!def?.source || !
|
|
203
|
+
if (!def?.source || !SAFE_CONTENT_TYPE_NAME.test(name)) {
|
|
208
204
|
continue;
|
|
209
205
|
}
|
|
210
206
|
const dir = normalizeSource(def.source);
|
|
@@ -222,7 +218,7 @@ export function contentMountFor(
|
|
|
222
218
|
if (/\.[a-z0-9]+$/i.test(dir)) {
|
|
223
219
|
continue;
|
|
224
220
|
}
|
|
225
|
-
consider(dir, `/${
|
|
221
|
+
consider(dir, `/${CONTENT_SECTION_KEY}/${name}`);
|
|
226
222
|
}
|
|
227
223
|
return best;
|
|
228
224
|
}
|
|
@@ -256,15 +252,15 @@ function localeMountFor(
|
|
|
256
252
|
return null;
|
|
257
253
|
}
|
|
258
254
|
const segment = path.slice(head.length).split("/")[0] ?? "";
|
|
259
|
-
if (segment === "" || !
|
|
255
|
+
if (segment === "" || !SAFE_CONTENT_TYPE_NAME.test(segment)) {
|
|
260
256
|
return null;
|
|
261
257
|
}
|
|
262
258
|
const canonical = locales.find((tag) => tag.toLowerCase() === segment.toLowerCase());
|
|
263
|
-
if (canonical === undefined || !
|
|
259
|
+
if (canonical === undefined || !SAFE_CONTENT_TYPE_NAME.test(canonical)) {
|
|
264
260
|
return null;
|
|
265
261
|
}
|
|
266
262
|
const dir = `${head}${segment}${tail}`.replace(/\/+$/, "");
|
|
267
|
-
return { dir, urlPrefix: `/${
|
|
263
|
+
return { dir, urlPrefix: `/${CONTENT_SECTION_KEY}/${name}/${canonical}` };
|
|
268
264
|
}
|
|
269
265
|
|
|
270
266
|
/** Strip `./` and any trailing slash from a configured `source`, the way collectionDirs does. */
|
|
@@ -5,7 +5,8 @@
|
|
|
5
5
|
* multiple canvas-related modules: element lookup, zoom, panel resolution, inline bubbling.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import { getNodeAtPath
|
|
8
|
+
import { getNodeAtPath } from "@jxsuite/schema/doc-ops";
|
|
9
|
+
import { parentElementPath } from "../store";
|
|
9
10
|
import { displayTagName } from "@jxsuite/schema/guards";
|
|
10
11
|
import { activeCanvasSurface, activeMediaOfPane } from "./canvas-surface";
|
|
11
12
|
import { isInlineInContext } from "../editor/inline-edit";
|
|
@@ -46,7 +47,7 @@ export function panelOfSurface(surface: CanvasSurface): CanvasPanel | null {
|
|
|
46
47
|
}
|
|
47
48
|
const activeMedia = activeMediaOfPane(surface.paneId);
|
|
48
49
|
for (const p of canvasPanels) {
|
|
49
|
-
if (activeMedia === null &&
|
|
50
|
+
if (activeMedia === null && p.mediaName === "base") {
|
|
50
51
|
return p;
|
|
51
52
|
}
|
|
52
53
|
if (p.mediaName === activeMedia) {
|
|
@@ -78,10 +79,10 @@ export function bubbleInlinePath(doc: JxMutableNode | undefined, path: JxPath) {
|
|
|
78
79
|
return path;
|
|
79
80
|
}
|
|
80
81
|
let currentPath = path;
|
|
81
|
-
|
|
82
|
+
// `parentElementPath` is null exactly when the path is too short to have a parent element.
|
|
83
|
+
for (let pPath = parentElementPath(currentPath); pPath; pPath = parentElementPath(currentPath)) {
|
|
82
84
|
const node = getNodeAtPath(doc, currentPath);
|
|
83
|
-
const
|
|
84
|
-
const parentNode = pPath ? getNodeAtPath(doc, pPath) : null;
|
|
85
|
+
const parentNode = getNodeAtPath(doc, pPath);
|
|
85
86
|
if (!node || !parentNode) {
|
|
86
87
|
break;
|
|
87
88
|
}
|
|
@@ -90,7 +91,7 @@ export function bubbleInlinePath(doc: JxMutableNode | undefined, path: JxPath) {
|
|
|
90
91
|
if (!isInlineInContext(childTag, parentTag)) {
|
|
91
92
|
break;
|
|
92
93
|
}
|
|
93
|
-
currentPath = pPath
|
|
94
|
+
currentPath = pPath;
|
|
94
95
|
}
|
|
95
96
|
return currentPath;
|
|
96
97
|
}
|