@jxsuite/studio 6.1.1 → 6.1.2
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/dist/chunks/{2020-va2wwra4.js → 2020-f2gkpy8d.js} +3 -3
- package/dist/chunks/{action-group-2mqby73c.js → action-group-4aan7g6g.js} +3 -3
- package/dist/chunks/adapter-4912g339.js +4 -0
- package/dist/chunks/cf-account-picker-wccaenh6.js +4 -0
- package/dist/chunks/cf-settings-br6105tr.js +4 -0
- package/dist/chunks/color-28ksk2qm.js +4 -0
- package/dist/chunks/color-area-0fj8a4ga.js +4 -0
- package/dist/chunks/color-field-xch8kx2g.js +4 -0
- package/dist/chunks/color-slider-jxd8v350.js +4 -0
- package/dist/chunks/combobox-p0efwjke.js +4 -0
- package/dist/chunks/components-db68vsn7.js +4 -0
- package/dist/chunks/content-source-1449qesq.js +4 -0
- package/dist/chunks/convert-to-repeater-5h457egj.js +4 -0
- package/dist/chunks/dialog-c4x05vyx.js +4 -0
- package/dist/chunks/editor-x9jn86a7.js +4 -0
- package/dist/chunks/entry-commands-may24cpt.js +4 -0
- package/dist/chunks/extension-sections-pvr14vxr.js +4 -0
- package/dist/chunks/file-ops-x9v54pcj.js +4 -0
- package/dist/chunks/files-j3knqf0s.js +4 -0
- package/dist/chunks/format-host-tyre2trb.js +4 -0
- package/dist/chunks/fs-events-64ma9htc.js +4 -0
- package/dist/chunks/git-panel-84ps5dex.js +4 -0
- package/dist/chunks/grid-view-d2wq9ezg.js +51 -0
- package/dist/chunks/icons-pnfz478q.js +4 -0
- package/dist/chunks/iframe-entry-fvbk89gm.js +5 -0
- package/dist/chunks/iframe-entry-jdcktez8.js +5 -0
- package/dist/chunks/iframe-entry-x0ygf2yr.js +5 -0
- package/dist/chunks/iframe-entry-zap785cw.js +5 -0
- package/dist/chunks/iframe-host-ck6vejt5.js +4 -0
- package/dist/chunks/index-b8xw3vy9.js +4 -0
- package/dist/chunks/{index-2veqmnhr.js → index-zpjmzqfk.js} +3 -3
- package/dist/chunks/{javascript-8nbvs12s.js → javascript-m54mnwp6.js} +3 -3
- package/dist/chunks/{jsonMode-s8kt9dsj.js → jsonMode-w15cmrcm.js} +8 -8
- package/dist/chunks/jx-validate-at3zn8wa.js +4 -0
- package/dist/chunks/layers-h4xp1pss.js +4 -0
- package/dist/chunks/layers-panel-m5hw1d7g.js +4 -0
- package/dist/chunks/listbox-e74qjyq6.js +4 -0
- package/dist/chunks/lit-html-8t8t3dnr.js +4 -0
- package/dist/chunks/media-picker-2cweexc5.js +4 -0
- package/dist/chunks/menu-n6yzswmy.js +4 -0
- package/dist/chunks/menu-ynw13y0s.js +4 -0
- package/dist/chunks/monaco-binding-7gx83x3r.js +4 -0
- package/dist/chunks/monaco-buffer-qzxn567r.js +4 -0
- package/dist/chunks/monaco-setup-gxf6656g.js +4 -0
- package/dist/chunks/notify-cj5zbrs2.js +4 -0
- package/dist/chunks/number-field-y62xq0ty.js +4 -0
- package/dist/chunks/parse-b7ddhr8m.js +4 -0
- package/dist/chunks/platform-3dfws9js.js +4 -0
- package/dist/chunks/popover-jt2gxmzs.js +4 -0
- package/dist/chunks/publish-panel-1gvxbj21.js +4 -0
- package/dist/chunks/quick-search-0dajrwqg.js +4 -0
- package/dist/chunks/references-49qgt404.js +4 -0
- package/dist/chunks/right-panel-jm1bwe53.js +4 -0
- package/dist/chunks/section-registry-6kwc4fky.js +4 -0
- package/dist/chunks/select-rzds841e.js +4 -0
- package/dist/chunks/split-n2gfpm5m.js +4 -0
- package/dist/chunks/{studio-1q1sh2ax.js → studio-0q988f9w.js} +3 -3
- package/dist/chunks/studio-0rt52vpq.js +5 -0
- package/dist/chunks/studio-18vgbhs5.js +5 -0
- package/dist/chunks/{studio-h46vtzk8.js → studio-1fxkaaea.js} +4 -4
- package/dist/chunks/studio-24mccdrj.js +5 -0
- package/dist/chunks/studio-2eh507zk.js +9 -0
- package/dist/chunks/studio-2hcbccfv.js +5 -0
- package/dist/chunks/studio-2j1cb95x.js +5 -0
- package/dist/chunks/studio-2jbs3rxv.js +5 -0
- package/dist/chunks/{studio-rv11kfwa.js → studio-485046te.js} +7 -7
- package/dist/chunks/studio-4h8k4dw9.js +5 -0
- package/dist/chunks/studio-5f6n18kx.js +5 -0
- package/dist/chunks/studio-5gthpky6.js +5 -0
- package/dist/chunks/studio-5ve6bbep.js +5 -0
- package/dist/chunks/studio-6ep3js6b.js +9 -0
- package/dist/chunks/studio-6wkmf3wz.js +9 -0
- package/dist/chunks/studio-841rf3cg.js +5 -0
- package/dist/chunks/studio-8gmwgheg.js +5 -0
- package/dist/chunks/studio-8qm0ep50.js +5 -0
- package/dist/chunks/{studio-8grwxtqk.js → studio-90pq9km1.js} +4 -4
- package/dist/chunks/studio-924p1tm1.js +6 -0
- package/dist/chunks/{studio-pre0skq6.js → studio-a3g98wjr.js} +4 -4
- package/dist/chunks/studio-a3shpz9y.js +5 -0
- package/dist/chunks/studio-amsbaaar.js +6 -0
- package/dist/chunks/studio-at5spjbc.js +7 -0
- package/dist/chunks/studio-b2xv945e.js +5 -0
- package/dist/chunks/studio-bn5nkafw.js +5 -0
- package/dist/chunks/studio-bw6q5xjf.js +9 -0
- package/dist/chunks/studio-c7q0t9x1.js +5 -0
- package/dist/chunks/studio-camnhc96.js +6 -0
- package/dist/chunks/studio-cffqvnzd.js +5 -0
- package/dist/chunks/studio-d81xfh1g.js +5 -0
- package/dist/chunks/studio-dgz8d0c1.js +5 -0
- package/dist/chunks/studio-efvfrsf8.js +5 -0
- package/dist/chunks/studio-er30bpcx.js +5 -0
- package/dist/chunks/studio-ezscgr64.js +5 -0
- package/dist/chunks/studio-ffrrncvz.js +5 -0
- package/dist/chunks/studio-fpphgn8y.js +10 -0
- package/dist/chunks/studio-j1kvhdjk.js +4 -0
- package/dist/chunks/{studio-vrmcjf9g.js → studio-j430n16g.js} +5 -5
- package/dist/chunks/studio-jjkg84nj.js +5 -0
- package/dist/chunks/studio-m0q32ars.js +4 -0
- package/dist/chunks/studio-m6bdst11.js +5 -0
- package/dist/chunks/studio-nv2cptd4.js +64 -0
- package/dist/chunks/studio-nwfrc98n.js +5 -0
- package/dist/chunks/studio-p1wgvp7r.js +5 -0
- package/dist/chunks/studio-pag2wncm.js +5 -0
- package/dist/chunks/studio-qvanvzfd.js +5 -0
- package/dist/chunks/studio-qwa64kt7.js +5 -0
- package/dist/chunks/studio-rk1zc4x3.js +928 -0
- package/dist/chunks/studio-se2r3ptc.js +5 -0
- package/dist/chunks/studio-sg2a0dh0.js +5 -0
- package/dist/chunks/studio-tjzjhe68.js +5 -0
- package/dist/chunks/{studio-wszjyh0j.js → studio-tq0rtfwj.js} +4 -4
- package/dist/chunks/{studio-kggey1jt.js → studio-v0jzqdjm.js} +4 -4
- package/dist/chunks/studio-v2w7q8r1.js +7 -0
- package/dist/chunks/studio-v5vjq1h0.js +4 -0
- package/dist/chunks/studio-v8aga3vp.js +14 -0
- package/dist/chunks/studio-vfcdrfmv.js +5 -0
- package/dist/chunks/studio-vmfkgdjf.js +5 -0
- package/dist/chunks/studio-wt1816jj.js +5 -0
- package/dist/chunks/studio-wz73q5kq.js +4 -0
- package/dist/chunks/studio-y04qtxvp.js +7 -0
- package/dist/chunks/studio-y21g8zzg.js +5 -0
- package/dist/chunks/{studio-zey7zsdw.js → studio-y64hrt8p.js} +7 -7
- package/dist/chunks/studio-ynn90f58.js +16 -0
- package/dist/chunks/studio-yxz682sx.js +5 -0
- package/dist/chunks/studio-zp7snvkq.js +5 -0
- package/dist/chunks/studio-zq4z6tm6.js +5 -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-c9fn075p.js +4 -0
- package/dist/chunks/toast-host-ke5z4ng7.js +4 -0
- package/dist/chunks/{toolbar-2nnzqhrj.js → toolbar-44cm5cta.js} +3 -3
- package/dist/chunks/tooltip-5v8ngwj2.js +4 -0
- package/dist/chunks/tree-mdq3v5cw.js +4 -0
- package/dist/chunks/{tsMode-2frah6h1.js → tsMode-sf49ee9x.js} +7 -7
- package/dist/chunks/workspace-jtfahpee.js +4 -0
- package/dist/chunks/ws-client-nze0k6mv.js +4 -0
- package/dist/iframe-entry.js +16 -16
- package/dist/manifest.json +63 -63
- package/dist/studio.js +97 -97
- package/package.json +6 -6
- 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/library-layouts.ts +8 -5
- package/src/browse/library-model.ts +18 -6
- package/src/browse/library-pane.ts +37 -21
- package/src/browse/library-preview.ts +14 -9
- package/src/browse/library-source.ts +1 -1
- package/src/canvas/asset-refs.ts +24 -9
- package/src/canvas/asset-resolve.ts +19 -23
- package/src/canvas/canvas-helpers.ts +7 -6
- package/src/canvas/canvas-live-render.ts +44 -53
- package/src/canvas/canvas-patcher.ts +30 -30
- package/src/canvas/canvas-perf.ts +11 -5
- package/src/canvas/canvas-render.ts +62 -41
- package/src/canvas/canvas-surface.ts +5 -3
- package/src/canvas/canvas-utils.ts +90 -49
- 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 +13 -12
- package/src/canvas/iframe-editable-root.ts +29 -16
- package/src/canvas/iframe-entry.ts +80 -63
- package/src/canvas/iframe-eval.ts +73 -49
- package/src/canvas/iframe-host.ts +135 -96
- 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-overlay.ts +1 -1
- package/src/canvas/iframe-patch.ts +18 -15
- package/src/canvas/iframe-position.ts +12 -6
- package/src/canvas/iframe-protocol.ts +12 -16
- package/src/canvas/iframe-render.ts +36 -34
- package/src/canvas/iframe-slash.ts +24 -11
- package/src/canvas/iframe-subtree.ts +6 -2
- 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/serialize-scope.ts +13 -5
- package/src/canvas/stage-scrollbar.ts +2 -1
- package/src/canvas/surface-registry.ts +21 -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/budget.ts +3 -3
- package/src/commands/command-args.ts +103 -71
- package/src/commands/context.ts +22 -20
- package/src/commands/keymap.ts +47 -43
- package/src/commands/levels.ts +3 -3
- package/src/commands/live-context.ts +7 -7
- package/src/commands/reference.ts +2 -1
- package/src/commands/registry.ts +12 -10
- package/src/commands/run-reported.ts +15 -10
- package/src/component-props.ts +46 -30
- package/src/content/collection-match.ts +5 -4
- package/src/content/draft-state.ts +4 -3
- package/src/content/entry-commands.ts +3 -2
- package/src/content/entry-editor.ts +29 -17
- package/src/content/entry-fields.ts +12 -7
- package/src/content/entry-model.ts +21 -12
- 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 +11 -5
- package/src/editor/convert-to-repeater.ts +34 -22
- package/src/editor/editable-tags.ts +17 -2
- package/src/editor/file-drop-action.ts +21 -22
- package/src/editor/inline-edit-apply.ts +35 -17
- package/src/editor/inline-edit.ts +66 -50
- package/src/editor/inline-format.ts +59 -56
- package/src/editor/inline-link.ts +40 -15
- package/src/editor/insert-zone-action.ts +1 -1
- package/src/editor/merge-tags.ts +58 -19
- package/src/editor/repeater-scope.ts +39 -28
- package/src/editor/shortcuts.ts +32 -20
- package/src/editor/slash-menu.ts +1 -6
- package/src/files/asset-versions.ts +4 -4
- package/src/files/components.ts +15 -10
- package/src/files/elements.ts +5 -6
- package/src/files/file-ops.ts +77 -36
- package/src/files/files.ts +90 -95
- package/src/files/media-meta.ts +2 -1
- package/src/files/media-paths.ts +3 -0
- package/src/files/serialize-document.ts +2 -2
- 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 +76 -50
- package/src/github/github-auth-status.ts +27 -3
- package/src/github/github-auth.ts +19 -9
- package/src/github/github-publish.ts +24 -20
- 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 +20 -22
- package/src/grid/grid-layout.ts +21 -5
- package/src/grid/grid-open.ts +3 -6
- package/src/grid/grid-panel.ts +11 -4
- package/src/grid/grid-source.ts +8 -8
- package/src/grid/grid-view.ts +14 -17
- 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 +25 -24
- package/src/grid/sources/csv-file-source.ts +2 -2
- package/src/grid/tabulator-tables.d.ts +55 -34
- package/src/hosting/stage.ts +7 -7
- package/src/i18n/i18n-commands.ts +1 -2
- package/src/media/media-pane.ts +4 -1
- 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 +17 -9
- package/src/panels/ai-chat/attached-context.ts +13 -7
- 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 +46 -35
- package/src/panels/bottom-dock.ts +5 -3
- package/src/panels/canvas-dnd-bridge.ts +31 -24
- package/src/panels/data-explorer.ts +62 -25
- package/src/panels/data-grid.ts +14 -11
- package/src/panels/dnd.ts +108 -118
- package/src/panels/editors.ts +52 -21
- package/src/panels/elements-panel.ts +10 -3
- package/src/panels/events-panel.ts +84 -69
- package/src/panels/formula-workspace.ts +76 -51
- package/src/panels/frontmatter-fields.ts +24 -19
- package/src/panels/frontmatter-panel.ts +44 -34
- package/src/panels/git-diff-open.ts +4 -4
- package/src/panels/git-panel.ts +49 -61
- package/src/panels/head-panel.ts +131 -111
- package/src/panels/i18n-panel.ts +10 -3
- package/src/panels/imports-panel.ts +23 -47
- package/src/panels/jump-bar.ts +48 -29
- package/src/panels/layers-panel.ts +97 -74
- package/src/panels/left-panel.ts +3 -3
- package/src/panels/pane-context.ts +31 -22
- package/src/panels/pane-grid.ts +49 -20
- package/src/panels/panel-registry.ts +22 -37
- package/src/panels/properties-panel.ts +175 -121
- package/src/panels/quick-search.ts +53 -31
- package/src/panels/right-panel.ts +3 -3
- package/src/panels/seo-modal.ts +13 -17
- package/src/panels/settings-menu.ts +15 -15
- package/src/panels/signals-panel.ts +153 -131
- package/src/panels/statement-editor.ts +230 -140
- package/src/panels/style-panel.ts +218 -205
- package/src/panels/style-utils.ts +114 -51
- package/src/panels/stylebook-doc.ts +57 -54
- package/src/panels/stylebook-layers-panel.ts +9 -9
- package/src/panels/stylebook-panel.ts +13 -17
- package/src/panels/tab-drop.ts +27 -11
- package/src/panels/tab-strip.ts +36 -26
- package/src/platform-errors.ts +57 -43
- package/src/platform.ts +58 -30
- package/src/platforms/cloud.ts +345 -175
- package/src/platforms/default-platform.ts +10 -4
- package/src/platforms/devserver.ts +129 -117
- package/src/platforms/read-batcher.ts +16 -8
- package/src/project-list.ts +2 -1
- package/src/publish/deploy-checklist.ts +8 -2
- package/src/publish/pages-service.ts +28 -13
- package/src/publish/publish-commands.ts +5 -4
- package/src/publish/publish-panel.ts +10 -6
- 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 +58 -31
- package/src/services/cem-export.ts +149 -58
- package/src/services/clock.ts +6 -1
- package/src/services/code-services.ts +37 -31
- 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 +18 -12
- 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 +8 -7
- 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 +79 -60
- package/src/settings/css-vars-editor.ts +37 -16
- package/src/settings/defs-editor.ts +38 -35
- package/src/settings/extension-rows.ts +16 -8
- package/src/settings/extension-sections.ts +23 -13
- package/src/settings/extensions-section.ts +4 -1
- package/src/settings/general-settings.ts +11 -8
- package/src/settings/locales-section.ts +20 -12
- package/src/settings/preferences-dialog.ts +9 -6
- package/src/settings/preferences-keymap.ts +7 -5
- package/src/settings/preferences-sections.ts +11 -5
- package/src/settings/project-sections.ts +1 -1
- package/src/settings/schema-field-ui.ts +9 -0
- package/src/settings/settings-document.ts +5 -5
- package/src/shell/tree.ts +6 -5
- package/src/shell.ts +104 -81
- package/src/site-context.ts +37 -22
- package/src/state.ts +41 -49
- package/src/store.ts +54 -34
- package/src/studio.ts +25 -75
- package/src/style/live-preview.ts +1 -1
- package/src/style/project-styles.ts +6 -7
- package/src/style/token-ref.ts +5 -4
- package/src/surfaces/about.ts +18 -19
- package/src/surfaces/add-repo.ts +17 -19
- package/src/surfaces/ai-chat.ts +31 -36
- 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.ts +4 -5
- package/src/surfaces/bottom-dock.ts +9 -18
- package/src/surfaces/canvas-stage.ts +12 -11
- package/src/surfaces/cf-account-picker.ts +17 -18
- package/src/surfaces/commandbar.ts +14 -9
- 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/doc-header.ts +10 -19
- package/src/surfaces/empty-state.ts +7 -10
- package/src/surfaces/entry-editor.ts +14 -11
- 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/git-panel.ts +7 -15
- 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.ts +13 -12
- package/src/surfaces/jump-bar.ts +5 -6
- package/src/surfaces/jxsuite-update.ts +16 -22
- package/src/surfaces/library-pane.ts +19 -20
- package/src/surfaces/logic-panel.ts +17 -30
- package/src/surfaces/logic-workspace.ts +13 -15
- package/src/surfaces/media-browser.ts +11 -10
- package/src/surfaces/media-field.ts +4 -5
- package/src/surfaces/media-pane.ts +8 -7
- package/src/surfaces/menu.ts +29 -23
- package/src/surfaces/navigator-dock.ts +11 -12
- package/src/surfaces/new-project.ts +27 -26
- package/src/surfaces/pane-context.ts +20 -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.ts +5 -6
- 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.ts +11 -18
- package/src/surfaces/panel-problems.ts +5 -7
- package/src/surfaces/panel-signals.ts +20 -34
- package/src/surfaces/panel-stylebook-layers.ts +5 -8
- package/src/surfaces/preferences.ts +21 -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.ts +18 -18
- package/src/surfaces/push-plan.ts +7 -8
- package/src/surfaces/rail.ts +13 -13
- package/src/surfaces/reference-field.ts +11 -15
- package/src/surfaces/schema-builder.ts +16 -22
- package/src/surfaces/schema-form.ts +15 -25
- package/src/surfaces/secret-field.ts +9 -6
- package/src/surfaces/seo.ts +21 -15
- package/src/surfaces/settings-contexts.ts +9 -7
- package/src/surfaces/settings-contributed.ts +14 -10
- package/src/surfaces/settings-css-vars.ts +5 -12
- package/src/surfaces/settings-defs.json +2 -2
- package/src/surfaces/settings-defs.ts +17 -21
- package/src/surfaces/settings-deploy.ts +8 -15
- 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.ts +5 -6
- package/src/surfaces/settings-packages.ts +8 -7
- package/src/surfaces/settings-pane.ts +9 -18
- package/src/surfaces/settings-rawjson.ts +5 -6
- package/src/surfaces/shell.ts +1 -2
- package/src/surfaces/slash-menu.ts +19 -9
- package/src/surfaces/statements.ts +13 -18
- package/src/surfaces/statusbar.ts +17 -14
- package/src/surfaces/style-panel.ts +18 -31
- package/src/surfaces/stylebook-chrome.ts +3 -5
- package/src/surfaces/tab-strip.ts +14 -13
- package/src/surfaces/target-line.ts +6 -7
- package/src/surfaces/welcome.ts +5 -7
- 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 +52 -41
- package/src/tabs/transact.ts +98 -53
- package/src/types.ts +32 -17
- 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 +57 -48
- package/src/ui/formula-catalog.ts +239 -230
- package/src/ui/formula-chips.ts +33 -18
- package/src/ui/layers.ts +44 -31
- package/src/ui/media-picker.ts +18 -9
- package/src/ui/popover-surface.ts +20 -12
- package/src/ui/progress-modal.ts +13 -8
- package/src/ui/regions.ts +7 -6
- package/src/ui/schema-form.ts +113 -70
- 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 +3 -2
- package/src/utils/base64.ts +3 -1
- package/src/utils/edit-display.ts +73 -73
- 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/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 +10 -12
- package/src/workspace/session.ts +53 -43
- package/src/workspace/workspace.ts +40 -36
- 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/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-t6b6qe31.js +0 -5
- package/dist/chunks/studio-tdcprbqb.js +0 -5
- 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-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/workspace-zt81g1ms.js +0 -4
- package/dist/chunks/ws-client-n2bh4hkf.js +0 -4
|
@@ -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
|
}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
9
|
import { projectState, stripEventHandlers } from "../store";
|
|
10
|
-
import { displayTagName } from "@jxsuite/schema/guards";
|
|
10
|
+
import { displayTagName, isMappedArray, isNonNullObject, isString } from "@jxsuite/schema/guards";
|
|
11
11
|
import { canvasModeOfTab } from "./canvas-surface";
|
|
12
12
|
import { toRaw } from "../reactivity";
|
|
13
13
|
import {
|
|
@@ -20,7 +20,6 @@ import {
|
|
|
20
20
|
resolveLayoutDoc,
|
|
21
21
|
} from "../site-context";
|
|
22
22
|
import { documentBase } from "./canvas-origin";
|
|
23
|
-
import { getPlatform, hasPlatform } from "../platform";
|
|
24
23
|
import { componentRegistry, computeRelativePath } from "../files/components";
|
|
25
24
|
import { prepareForEditMode } from "../utils/edit-display";
|
|
26
25
|
import {
|
|
@@ -29,10 +28,10 @@ import {
|
|
|
29
28
|
substitutePreviewParams,
|
|
30
29
|
} from "../page-params";
|
|
31
30
|
import { isComponentDoc, substitutePreviewProps } from "../component-props";
|
|
32
|
-
import { assetContextFor } from "./asset-refs";
|
|
31
|
+
import { assetContextFor, hostAssetDeclarations } from "./asset-refs";
|
|
33
32
|
|
|
34
33
|
import type { AssetContext } from "./asset-refs";
|
|
35
|
-
import type { JxElement, JxMutableNode, JxPath } from "@jxsuite/schema/types";
|
|
34
|
+
import type { JxElement, JxMutableNode, JxPath, JxStyle } from "@jxsuite/schema/types";
|
|
36
35
|
import type { ComponentEntry } from "../files/components.js";
|
|
37
36
|
import type { LayoutMarker } from "./path-mapping";
|
|
38
37
|
import type { Tab } from "../tabs/tab";
|
|
@@ -55,19 +54,20 @@ function findPageContentPrefix(
|
|
|
55
54
|
node: JxMutableNode,
|
|
56
55
|
path: (string | number)[] = [],
|
|
57
56
|
): { prefix: (string | number)[]; offset: number } | null {
|
|
58
|
-
|
|
57
|
+
// Document JSON can hold a null or scalar where a node belongs; neither has page content.
|
|
58
|
+
if (!isNonNullObject(node)) {
|
|
59
59
|
return null;
|
|
60
60
|
}
|
|
61
61
|
if (Array.isArray(node.children)) {
|
|
62
62
|
const firstPageIdx = node.children.findIndex(
|
|
63
|
-
(child) => child &&
|
|
63
|
+
(child) => isNonNullObject(child) && !child.$__layout,
|
|
64
64
|
);
|
|
65
65
|
if (firstPageIdx !== -1) {
|
|
66
66
|
return { offset: firstPageIdx, prefix: [...path, "children"] };
|
|
67
67
|
}
|
|
68
68
|
for (let i = 0; i < node.children.length; i++) {
|
|
69
69
|
const child = node.children[i];
|
|
70
|
-
if (child &&
|
|
70
|
+
if (isNonNullObject(child) && child.$__layout) {
|
|
71
71
|
const found = findPageContentPrefix(child, [...path, "children", i]);
|
|
72
72
|
if (found) {
|
|
73
73
|
return found;
|
|
@@ -87,13 +87,14 @@ function findPageContentPrefix(
|
|
|
87
87
|
* editor can open the layout with that node selected. See {@link LayoutMarker}.
|
|
88
88
|
*/
|
|
89
89
|
export function markLayoutNodes(node: JxMutableNode, file: string, path: JxPath = []) {
|
|
90
|
-
|
|
90
|
+
// Layout JSON can hold a null or scalar where a node belongs; there is nothing to mark on it.
|
|
91
|
+
if (!isNonNullObject(node)) {
|
|
91
92
|
return;
|
|
92
93
|
}
|
|
93
94
|
node.$__layout = { file, path } satisfies LayoutMarker;
|
|
94
95
|
if (Array.isArray(node.children)) {
|
|
95
96
|
for (const [i, child] of node.children.entries()) {
|
|
96
|
-
if (
|
|
97
|
+
if (isString(child)) {
|
|
97
98
|
continue;
|
|
98
99
|
}
|
|
99
100
|
markLayoutNodes(child, file, [...path, "children", i]);
|
|
@@ -101,7 +102,10 @@ export function markLayoutNodes(node: JxMutableNode, file: string, path: JxPath
|
|
|
101
102
|
}
|
|
102
103
|
if (Array.isArray(node.$elements)) {
|
|
103
104
|
for (const [i, el] of node.$elements.entries()) {
|
|
104
|
-
if (
|
|
105
|
+
if (!isString(el)) {
|
|
106
|
+
/* SAFETY: a non-string `$elements` entry is an inline element definition or a `{ $ref }`
|
|
107
|
+
import. markLayoutNodes stamps `$__layout` and walks `children` / `$elements`, which a
|
|
108
|
+
`$ref` entry simply lacks, so it is marked as a childless node. */
|
|
105
109
|
markLayoutNodes(el as JxMutableNode, file, [...path, "$elements", i]);
|
|
106
110
|
}
|
|
107
111
|
}
|
|
@@ -157,7 +161,7 @@ export async function resolveCanvasDocument(
|
|
|
157
161
|
/** How the canvas must address project media, or null when its origin serves the site URL space. */
|
|
158
162
|
assets: AssetContext | null;
|
|
159
163
|
mapperCtx: WireMapperCtx;
|
|
160
|
-
siteStyle:
|
|
164
|
+
siteStyle: JxStyle | null;
|
|
161
165
|
}> {
|
|
162
166
|
const S = { documentPath: tab?.documentPath, mode: tab?.doc.mode };
|
|
163
167
|
const canvasMode = modeOverride ?? canvasModeOfTab(tab);
|
|
@@ -180,7 +184,7 @@ export async function resolveCanvasDocument(
|
|
|
180
184
|
if (isPage && tab?.session.ui.showLayout !== false) {
|
|
181
185
|
const layoutPath = getEffectiveLayoutPath(doc.$layout);
|
|
182
186
|
if (layoutPath) {
|
|
183
|
-
const layoutDoc =
|
|
187
|
+
const layoutDoc = await resolveLayoutDoc(layoutPath);
|
|
184
188
|
if (layoutDoc) {
|
|
185
189
|
// The SAME normalization resolveLayoutDoc reads the file with, so the marker's `file` is a
|
|
186
190
|
// Path the editor can hand straight to navigateToComponent when the author asks to open it.
|
|
@@ -210,10 +214,7 @@ export async function resolveCanvasDocument(
|
|
|
210
214
|
* — design and edit swap every bound src for a transparent pixel, so they never reached the
|
|
211
215
|
* network to fail.
|
|
212
216
|
*/
|
|
213
|
-
const assets = assetContextFor(S.documentPath,
|
|
214
|
-
fileBaseUrl: fileBase,
|
|
215
|
-
...(hasPlatform() ? { space: getPlatform().assetSpace } : {}),
|
|
216
|
-
});
|
|
217
|
+
const assets = assetContextFor(S.documentPath, hostAssetDeclarations());
|
|
217
218
|
|
|
218
219
|
// Substitute chosen dynamic route params ({$ref: "#/$params/x"} → literal), inject state.$page,
|
|
219
220
|
// And bake the substituted class-prototype state entries via the backend resolver — in every
|
|
@@ -222,10 +223,8 @@ export async function resolveCanvasDocument(
|
|
|
222
223
|
// (posted as shadowDoc), whose $refs must survive for editing/serialization.
|
|
223
224
|
if (isPage && tab) {
|
|
224
225
|
const { previewParams } = tab.session.ui;
|
|
225
|
-
if (
|
|
226
|
-
const boundKeys = paramBoundStateKeys(
|
|
227
|
-
(doc as { state?: Record<string, unknown> }).state ?? null,
|
|
228
|
-
);
|
|
226
|
+
if (Object.keys(previewParams).length > 0) {
|
|
227
|
+
const boundKeys = paramBoundStateKeys(doc.state ?? null);
|
|
229
228
|
renderDoc = substitutePreviewParams(renderDoc, previewParams, S.documentPath);
|
|
230
229
|
await resolveParamBoundState(renderDoc, boundKeys, docBase);
|
|
231
230
|
}
|
|
@@ -253,30 +252,29 @@ export async function resolveCanvasDocument(
|
|
|
253
252
|
const arrayPaths = new Set<string>();
|
|
254
253
|
if (canvasMode !== "preview") {
|
|
255
254
|
(function findArrayPaths(node: JxMutableNode, path: (string | number)[]) {
|
|
256
|
-
|
|
255
|
+
// Document JSON can hold a null or scalar where a node belongs; it holds no repeater.
|
|
256
|
+
if (!isNonNullObject(node)) {
|
|
257
257
|
return;
|
|
258
258
|
}
|
|
259
|
-
if (
|
|
259
|
+
if (node.$prototype === "Array") {
|
|
260
260
|
arrayPaths.add(path.join("/"));
|
|
261
|
-
const mapDef =
|
|
262
|
-
if (mapDef
|
|
261
|
+
const mapDef = node.map;
|
|
262
|
+
if (isNonNullObject(mapDef)) {
|
|
263
263
|
findArrayPaths(mapDef, [...path, "map"]);
|
|
264
264
|
}
|
|
265
265
|
return;
|
|
266
266
|
}
|
|
267
267
|
if (Array.isArray(node.children)) {
|
|
268
|
-
for (
|
|
269
|
-
|
|
270
|
-
if (typeof child === "string") {
|
|
268
|
+
for (const [i, child] of node.children.entries()) {
|
|
269
|
+
if (isString(child)) {
|
|
271
270
|
continue;
|
|
272
271
|
}
|
|
273
|
-
findArrayPaths(child
|
|
272
|
+
findArrayPaths(child, [...path, "children", i]);
|
|
274
273
|
}
|
|
275
|
-
} else if (
|
|
276
|
-
node
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
) {
|
|
274
|
+
} else if (isMappedArray(node.children)) {
|
|
275
|
+
/* SAFETY: the bare mapped-array slot is a repeater node in all but its declared type, and
|
|
276
|
+
the walk reads only what isMappedArray just established (`$prototype`) and its `map`
|
|
277
|
+
template, an element definition. */
|
|
280
278
|
findArrayPaths(node.children as JxMutableNode, [...path, "children"]);
|
|
281
279
|
}
|
|
282
280
|
if (node.$switch && node.cases) {
|
|
@@ -295,14 +293,19 @@ export async function resolveCanvasDocument(
|
|
|
295
293
|
const isLayoutDoc =
|
|
296
294
|
S.documentPath != null &&
|
|
297
295
|
(S.documentPath.startsWith("layouts/") || S.documentPath.startsWith("./layouts/"));
|
|
296
|
+
/* SAFETY: a document's `$elements` entries are tag-name strings, `{ $ref }` imports or inline
|
|
297
|
+
element definitions, each a JxElement or a string; getEffectiveElements only dedups them by the
|
|
298
|
+
string itself or by `$ref`. */
|
|
298
299
|
const effectiveElements = getEffectiveElements(renderDoc.$elements as (JxElement | string)[]);
|
|
299
300
|
if ((S.mode === "content" || layoutWrapped || isLayoutDoc) && componentRegistry.length > 0) {
|
|
300
301
|
const existingRefs = new Set(
|
|
301
|
-
|
|
302
|
+
// A null entry in a document's `$elements` names nothing, so it contributes no ref.
|
|
303
|
+
effectiveElements.map((e: JxElement | string) => (isNonNullObject(e) ? e.$ref : e)),
|
|
302
304
|
);
|
|
303
305
|
const collectTags = (node: JxMutableNode): Set<string> => {
|
|
304
306
|
const tags = new Set<string>();
|
|
305
|
-
|
|
307
|
+
// Document JSON can hold a null or scalar where a node belongs; it carries no tag.
|
|
308
|
+
if (!isNonNullObject(node)) {
|
|
306
309
|
return tags;
|
|
307
310
|
}
|
|
308
311
|
if (node.tagName) {
|
|
@@ -310,7 +313,7 @@ export async function resolveCanvasDocument(
|
|
|
310
313
|
}
|
|
311
314
|
if (Array.isArray(node.children)) {
|
|
312
315
|
for (const child of node.children) {
|
|
313
|
-
if (
|
|
316
|
+
if (!isString(child)) {
|
|
314
317
|
for (const t of collectTags(child)) {
|
|
315
318
|
tags.add(t);
|
|
316
319
|
}
|
|
@@ -331,24 +334,12 @@ export async function resolveCanvasDocument(
|
|
|
331
334
|
}
|
|
332
335
|
}
|
|
333
336
|
if (effectiveElements.length > 0) {
|
|
334
|
-
renderDoc.$elements = effectiveElements
|
|
337
|
+
renderDoc.$elements = effectiveElements;
|
|
335
338
|
}
|
|
336
339
|
renderDoc.imports = getEffectiveImports(renderDoc.imports);
|
|
337
|
-
// The effective-media/head getters
|
|
338
|
-
|
|
339
|
-
|
|
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"]>;
|
|
351
|
-
}
|
|
340
|
+
// The effective-media/head getters always answer a value: the merge, or an empty one.
|
|
341
|
+
renderDoc.$media = getEffectiveMedia(renderDoc.$media);
|
|
342
|
+
renderDoc.$head = getEffectiveHead(renderDoc.$head);
|
|
352
343
|
|
|
353
344
|
return {
|
|
354
345
|
assets,
|
|
@@ -361,6 +352,6 @@ export async function resolveCanvasDocument(
|
|
|
361
352
|
pageContentPrefix,
|
|
362
353
|
},
|
|
363
354
|
renderDoc,
|
|
364
|
-
siteStyle:
|
|
355
|
+
siteStyle: projectState?.projectConfig?.style ?? null,
|
|
365
356
|
};
|
|
366
357
|
}
|
|
@@ -18,7 +18,9 @@
|
|
|
18
18
|
* edit typed into the first, and how one failed patch would rebuild both.
|
|
19
19
|
*/
|
|
20
20
|
|
|
21
|
-
import { getNodeAtPath
|
|
21
|
+
import { getNodeAtPath } from "@jxsuite/schema/doc-ops";
|
|
22
|
+
import { isString } from "@jxsuite/schema/guards";
|
|
23
|
+
import { parentElementPath } from "../store";
|
|
22
24
|
import { canvasModeOfPane, surfacesShowingTab } from "./canvas-surface";
|
|
23
25
|
import { toRaw } from "../reactivity";
|
|
24
26
|
import { postPatchToHosts } from "./iframe-host";
|
|
@@ -29,6 +31,13 @@ import type { CanvasSurface } from "./surface-registry";
|
|
|
29
31
|
import type { JxPatchOp, TransactionRecord } from "../tabs/patch-ops";
|
|
30
32
|
import type { Tab } from "../tabs/tab.js";
|
|
31
33
|
import type { JxPath } from "../state";
|
|
34
|
+
import type { JxMutableNode } from "@jxsuite/schema/types";
|
|
35
|
+
|
|
36
|
+
/** Whether a batch can be applied surgically, and why not when it cannot. */
|
|
37
|
+
export interface PatchVerdict {
|
|
38
|
+
patchable: boolean;
|
|
39
|
+
reason: string;
|
|
40
|
+
}
|
|
32
41
|
|
|
33
42
|
/** Render-side callbacks injected at init so this module stays free of heavy canvas imports. */
|
|
34
43
|
interface CanvasPatcherCtx {
|
|
@@ -62,10 +71,17 @@ export function initCanvasPatcher(ctx: CanvasPatcherCtx) {
|
|
|
62
71
|
apply: applyPatchBatch,
|
|
63
72
|
classify: classifyOps,
|
|
64
73
|
escalate: escalateToFullRender,
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
74
|
+
/* Records that `docRef`'s change has been applied surgically in each patchable pane.
|
|
75
|
+
|
|
76
|
+
No empty-list guard, because the list cannot be empty here: `transactDoc` marks only a batch
|
|
77
|
+
{@link classifyOps} called patchable, and that function rejects `patchableSurfaces(tab).length
|
|
78
|
+
=== 0` before it can say so. A guard on an unreachable value is a branch no test can enter (the
|
|
79
|
+
gate's own rule), and `_consumed` is a `WeakMap` keyed on a reference `transactDoc` mints fresh
|
|
80
|
+
per transaction, so there is nothing for one to protect either. */
|
|
81
|
+
markConsumed: (docRef, tab) => {
|
|
82
|
+
_consumed.set(
|
|
83
|
+
toRaw(docRef),
|
|
84
|
+
new Set(patchableSurfaces(tab).map((surface) => surface.paneId)),
|
|
69
85
|
);
|
|
70
86
|
},
|
|
71
87
|
});
|
|
@@ -96,32 +112,16 @@ function patchableSurfaces(tab: Tab | null): CanvasSurface[] {
|
|
|
96
112
|
});
|
|
97
113
|
}
|
|
98
114
|
|
|
99
|
-
/**
|
|
100
|
-
* Record that `docRef`'s change has been applied surgically in each of `paneIds`.
|
|
101
|
-
*
|
|
102
|
-
* No empty-list guard, because the list cannot be empty here: `transactDoc` marks only a batch
|
|
103
|
-
* {@link classifyOps} called patchable, and that function rejects `patchableSurfaces(tab).length
|
|
104
|
-
* === 0` before it can say so. A guard on an unreachable value is a branch no test can enter — the
|
|
105
|
-
* gate's own rule — and `_consumed` is a `WeakMap` keyed on a reference `transactDoc` mints fresh
|
|
106
|
-
* per transaction, so there is nothing for one to protect either.
|
|
107
|
-
*
|
|
108
|
-
* @param {object} docRef
|
|
109
|
-
* @param {readonly string[]} paneIds
|
|
110
|
-
*/
|
|
111
|
-
function markConsumed(docRef: object, paneIds: readonly string[]) {
|
|
112
|
-
_consumed.set(toRaw(docRef) as object, new Set(paneIds));
|
|
113
|
-
}
|
|
114
|
-
|
|
115
115
|
/**
|
|
116
116
|
* One-shot check used by ONE PANE's canvas doc-effect: returns true (and clears that pane's mark)
|
|
117
117
|
* when the given document reference was already applied to that pane's stage surgically, so its
|
|
118
118
|
* full render can be skipped. One-shot so tab switches and repeat triggers still render fully.
|
|
119
119
|
*
|
|
120
|
-
* @param {
|
|
120
|
+
* @param {JxMutableNode} doc
|
|
121
121
|
* @param {string} paneId
|
|
122
122
|
*/
|
|
123
|
-
export function consumePatchedDocument(doc:
|
|
124
|
-
const raw = toRaw(doc)
|
|
123
|
+
export function consumePatchedDocument(doc: JxMutableNode, paneId: string): boolean {
|
|
124
|
+
const raw = toRaw(doc);
|
|
125
125
|
const panes = _consumed.get(raw);
|
|
126
126
|
if (!panes?.has(paneId)) {
|
|
127
127
|
return false;
|
|
@@ -221,7 +221,7 @@ function containerVerdict(tab: Tab, parentPath: JxPath, requireArray = true): st
|
|
|
221
221
|
* definition escalated to a full render — in a component-heavy project, the most common authoring
|
|
222
222
|
* action there is.
|
|
223
223
|
*/
|
|
224
|
-
if (parentPath.length > 0 &&
|
|
224
|
+
if (parentPath.length > 0 && isString(parent.tagName) && parent.tagName.includes("-")) {
|
|
225
225
|
return "structure-in-custom-element";
|
|
226
226
|
}
|
|
227
227
|
if (parent.innerHTML) {
|
|
@@ -253,7 +253,7 @@ function replaceVerdict(tab: Tab, path: JxPath): string | null {
|
|
|
253
253
|
if (pathHasDynamicSegment(path)) {
|
|
254
254
|
return "replace-on-cases-path";
|
|
255
255
|
}
|
|
256
|
-
const parentPath = parentElementPath(path)
|
|
256
|
+
const parentPath = parentElementPath(path);
|
|
257
257
|
if (!parentPath) {
|
|
258
258
|
return "replace-no-parent";
|
|
259
259
|
}
|
|
@@ -295,7 +295,7 @@ function opVerdict(tab: Tab, op: JxPatchOp): string | null {
|
|
|
295
295
|
if (!node) {
|
|
296
296
|
return "node-not-found";
|
|
297
297
|
}
|
|
298
|
-
if (
|
|
298
|
+
if (isString(node.tagName) && node.tagName.includes("-")) {
|
|
299
299
|
return "text-on-custom-element";
|
|
300
300
|
}
|
|
301
301
|
if (node.innerHTML) {
|
|
@@ -320,14 +320,14 @@ function opVerdict(tab: Tab, op: JxPatchOp): string | null {
|
|
|
320
320
|
return containerVerdict(tab, op.parentPath);
|
|
321
321
|
}
|
|
322
322
|
case "remove": {
|
|
323
|
-
const parentPath = parentElementPath(op.path)
|
|
323
|
+
const parentPath = parentElementPath(op.path);
|
|
324
324
|
return parentPath === null ? "remove-no-parent" : containerVerdict(tab, parentPath);
|
|
325
325
|
}
|
|
326
326
|
case "move": {
|
|
327
327
|
if (pathHasDynamicSegment(op.fromPath)) {
|
|
328
328
|
return "structure-on-cases-path";
|
|
329
329
|
}
|
|
330
|
-
const fromParentPath = parentElementPath(op.fromPath)
|
|
330
|
+
const fromParentPath = parentElementPath(op.fromPath);
|
|
331
331
|
if (fromParentPath === null) {
|
|
332
332
|
return "move-no-parent";
|
|
333
333
|
}
|
|
@@ -347,7 +347,7 @@ function opVerdict(tab: Tab, op: JxPatchOp): string | null {
|
|
|
347
347
|
* @param {Tab} tab
|
|
348
348
|
* @param {JxPatchOp[]} ops
|
|
349
349
|
*/
|
|
350
|
-
export function classifyOps(tab: Tab, ops: JxPatchOp[]):
|
|
350
|
+
export function classifyOps(tab: Tab, ops: JxPatchOp[]): PatchVerdict {
|
|
351
351
|
const reject = (reason: string) => {
|
|
352
352
|
recordEscalation(reason);
|
|
353
353
|
return { patchable: false, reason };
|
|
@@ -12,6 +12,9 @@
|
|
|
12
12
|
* marks with `localStorage["jx-canvas-debug"] = "1"`.
|
|
13
13
|
*/
|
|
14
14
|
|
|
15
|
+
import { isFunction } from "@jxsuite/schema/guards";
|
|
16
|
+
import type { JsonValue } from "@jxsuite/schema/types";
|
|
17
|
+
|
|
15
18
|
/** Rolling window per span. Bounded so a long session cannot grow the sample arrays. */
|
|
16
19
|
const SAMPLE_LIMIT = 128;
|
|
17
20
|
|
|
@@ -106,7 +109,12 @@ export const canvasPerf: CanvasPerf = {
|
|
|
106
109
|
timings: {},
|
|
107
110
|
};
|
|
108
111
|
|
|
109
|
-
|
|
112
|
+
declare global {
|
|
113
|
+
/** The live counters, for inspection from a devtools console or a profiling harness. */
|
|
114
|
+
var __jxCanvasPerf: CanvasPerf | undefined;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
globalThis.__jxCanvasPerf = canvasPerf;
|
|
110
118
|
|
|
111
119
|
/** Retained duration samples per span, parallel to `canvasPerf.timings`. */
|
|
112
120
|
const samples = new Map<string, number[]>();
|
|
@@ -121,13 +129,11 @@ function debugEnabled() {
|
|
|
121
129
|
|
|
122
130
|
/** Monotonic clock, or 0 when the environment has no `performance` (durations then read as 0). */
|
|
123
131
|
function now(): number {
|
|
124
|
-
return typeof performance !== "undefined" &&
|
|
125
|
-
? performance.now()
|
|
126
|
-
: 0;
|
|
132
|
+
return typeof performance !== "undefined" && isFunction(performance.now) ? performance.now() : 0;
|
|
127
133
|
}
|
|
128
134
|
|
|
129
135
|
/** Log a canvas perf event when debug mode is on. */
|
|
130
|
-
export function perfLog(event: string, detail?:
|
|
136
|
+
export function perfLog(event: string, detail?: JsonValue) {
|
|
131
137
|
if (debugEnabled()) {
|
|
132
138
|
console.debug(`[jx-canvas] ${event}`, detail ?? "");
|
|
133
139
|
}
|