@jxsuite/studio 6.1.1 → 8.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -5
- package/dist/chunks/2020-5wtzce5g.js +4 -0
- package/dist/chunks/{action-group-2mqby73c.js → action-group-4aan7g6g.js} +3 -3
- package/dist/chunks/adapter-5tphg7xe.js +4 -0
- package/dist/chunks/add-new-flow-psym14sn.js +4 -0
- package/dist/chunks/cf-account-picker-haqazq5r.js +4 -0
- package/dist/chunks/cf-settings-h2wrh6hq.js +4 -0
- package/dist/chunks/color-area-6rbra5dy.js +4 -0
- package/dist/chunks/color-field-gy56c94g.js +4 -0
- package/dist/chunks/color-m7r1vk54.js +4 -0
- package/dist/chunks/color-slider-sqqdyf6c.js +4 -0
- package/dist/chunks/combobox-72h32ejk.js +4 -0
- package/dist/chunks/components-r22xca09.js +4 -0
- package/dist/chunks/content-source-mmppmcyg.js +4 -0
- package/dist/chunks/convert-to-repeater-he70fc2b.js +4 -0
- package/dist/chunks/dialog-c4x05vyx.js +4 -0
- package/dist/chunks/editor-ccd9jwsa.js +4 -0
- package/dist/chunks/entry-commands-6qxz9e8p.js +4 -0
- package/dist/chunks/extension-sections-0egb88dm.js +4 -0
- package/dist/chunks/file-ops-qnab36ek.js +4 -0
- package/dist/chunks/files-rcn56qvm.js +4 -0
- package/dist/chunks/format-host-yxz0kjjs.js +4 -0
- package/dist/chunks/fs-events-d1qxq4z4.js +4 -0
- package/dist/chunks/grid-open-4z1g062t.js +4 -0
- package/dist/chunks/grid-view-qg1b5eqx.js +51 -0
- package/dist/chunks/icons-63bjtbs7.js +4 -0
- package/dist/chunks/iframe-entry-2zggzajv.js +5 -0
- package/dist/chunks/iframe-entry-76j8vwwx.js +5 -0
- package/dist/chunks/iframe-entry-99nr5zfb.js +5 -0
- package/dist/chunks/iframe-entry-pkgmcgp0.js +5 -0
- package/dist/chunks/iframe-host-ssv7kyj0.js +4 -0
- package/dist/chunks/{index-2veqmnhr.js → index-32eqzv1k.js} +3 -3
- package/dist/chunks/index-f0jn7nnp.js +4 -0
- package/dist/chunks/{javascript-8nbvs12s.js → javascript-pjp734q4.js} +3 -3
- package/dist/chunks/jsonMode-njkvsa02.js +13 -0
- package/dist/chunks/jx-validate-ttasrbh7.js +4 -0
- package/dist/chunks/layers-bgyr11tr.js +4 -0
- package/dist/chunks/layers-panel-7ez66zeq.js +4 -0
- package/dist/chunks/listbox-c421cf8c.js +4 -0
- package/dist/chunks/lit-html-v9gh687x.js +4 -0
- package/dist/chunks/media-library-sq468wts.js +4 -0
- package/dist/chunks/media-picker-shfe59pt.js +4 -0
- package/dist/chunks/menu-bdpzbfvs.js +4 -0
- package/dist/chunks/monaco-binding-vq1hgnn0.js +4 -0
- package/dist/chunks/monaco-buffer-3afgwvbp.js +4 -0
- package/dist/chunks/monaco-setup-xrd2cbkp.js +4 -0
- package/dist/chunks/notify-kzrjr3fv.js +4 -0
- package/dist/chunks/number-field-y62xq0ty.js +4 -0
- package/dist/chunks/parse-v77xtwv7.js +4 -0
- package/dist/chunks/platform-7v4rtd7m.js +4 -0
- package/dist/chunks/popover-b89sfej7.js +4 -0
- package/dist/chunks/publish-panel-2z9gw8ee.js +4 -0
- package/dist/chunks/publish-quick-qx2455cj.js +4 -0
- package/dist/chunks/publish-workspace-wrc1dgwx.js +4 -0
- package/dist/chunks/quick-search-n0t0eqxb.js +4 -0
- package/dist/chunks/references-9547rg5s.js +4 -0
- package/dist/chunks/right-panel-wsgnr9pn.js +4 -0
- package/dist/chunks/select-rzds841e.js +4 -0
- package/dist/chunks/source-control-kwktr9y6.js +4 -0
- package/dist/chunks/split-c9zfdgxf.js +4 -0
- package/dist/chunks/studio-03ct6yfv.js +9 -0
- package/dist/chunks/studio-07rcfje3.js +5 -0
- package/dist/chunks/studio-3e54qh39.js +7 -0
- package/dist/chunks/studio-3exxhz5g.js +5 -0
- package/dist/chunks/studio-3q40e3rj.js +5 -0
- package/dist/chunks/studio-3qeh9t0h.js +6 -0
- package/dist/chunks/studio-3qqjeep5.js +6 -0
- package/dist/chunks/studio-43sd2mam.js +4 -0
- package/dist/chunks/studio-4hp8pkyt.js +5 -0
- package/dist/chunks/studio-58xg6j2q.js +9 -0
- package/dist/chunks/studio-5g0rprdt.js +7 -0
- package/dist/chunks/studio-6m380wp7.js +5 -0
- package/dist/chunks/studio-80jyh1xh.js +4 -0
- package/dist/chunks/studio-83mk4bgg.js +9 -0
- package/dist/chunks/{studio-kggey1jt.js → studio-881z1xrx.js} +4 -4
- package/dist/chunks/studio-8m0y2qe7.js +5 -0
- package/dist/chunks/studio-8tr6cfrc.js +5 -0
- package/dist/chunks/studio-8vcvfs7r.js +6 -0
- package/dist/chunks/studio-9tmebf0s.js +5 -0
- package/dist/chunks/studio-a2bvaptz.js +5 -0
- package/dist/chunks/studio-b7y5mr30.js +5 -0
- package/dist/chunks/studio-bavb31r0.js +5 -0
- package/dist/chunks/studio-bbe4c90a.js +5 -0
- package/dist/chunks/studio-c05wdnt3.js +5 -0
- package/dist/chunks/studio-ccv2svc6.js +5 -0
- package/dist/chunks/studio-d5grtb9e.js +16 -0
- package/dist/chunks/studio-df0baea9.js +5 -0
- package/dist/chunks/studio-dgk4dqtx.js +7 -0
- package/dist/chunks/studio-e1g64q43.js +5 -0
- package/dist/chunks/studio-ed1hp6zf.js +6 -0
- package/dist/chunks/studio-ed3xx40h.js +7 -0
- package/dist/chunks/studio-f14e1zdj.js +5 -0
- package/dist/chunks/studio-fbhxxc5f.js +5 -0
- package/dist/chunks/studio-fyh0jc96.js +5 -0
- package/dist/chunks/studio-gcxk20n7.js +5 -0
- package/dist/chunks/studio-jaaz8ce9.js +5 -0
- package/dist/chunks/{studio-8grwxtqk.js → studio-jcnsdaep.js} +4 -4
- package/dist/chunks/studio-jsgf2q5k.js +7 -0
- package/dist/chunks/{studio-1q1sh2ax.js → studio-k3xxbagr.js} +3 -3
- package/dist/chunks/studio-k7evxqh4.js +5 -0
- package/dist/chunks/studio-kt3pjkwd.js +5 -0
- package/dist/chunks/studio-m8g16bgz.js +5 -0
- package/dist/chunks/studio-mn0476ag.js +5 -0
- package/dist/chunks/studio-mx1smyq0.js +5 -0
- package/dist/chunks/studio-n0c5h6mf.js +5 -0
- package/dist/chunks/{studio-rv11kfwa.js → studio-nh6d342n.js} +7 -7
- package/dist/chunks/studio-nqxqf8p2.js +4 -0
- package/dist/chunks/studio-p4nrkvqr.js +5 -0
- package/dist/chunks/{studio-h46vtzk8.js → studio-pbxa5fpc.js} +4 -4
- package/dist/chunks/studio-pgmvdv7z.js +7 -0
- package/dist/chunks/studio-ph84avkf.js +5 -0
- package/dist/chunks/{studio-wszjyh0j.js → studio-q0mvbaq6.js} +4 -4
- package/dist/chunks/studio-q0tccd43.js +5 -0
- package/dist/chunks/studio-q7rtx6zq.js +14 -0
- package/dist/chunks/{studio-pre0skq6.js → studio-qgh13jtz.js} +4 -4
- package/dist/chunks/studio-qmn1xc24.js +5 -0
- package/dist/chunks/studio-qwdqwkj0.js +5 -0
- package/dist/chunks/{studio-t6b6qe31.js → studio-r5qy30vx.js} +4 -4
- package/dist/chunks/studio-rj9eamf8.js +5 -0
- package/dist/chunks/studio-rptgsk96.js +5 -0
- package/dist/chunks/studio-rthyg42z.js +928 -0
- package/dist/chunks/studio-s19tp1xr.js +5 -0
- package/dist/chunks/studio-s32578pn.js +5 -0
- package/dist/chunks/studio-svb7yyve.js +5 -0
- package/dist/chunks/studio-syreb644.js +5 -0
- package/dist/chunks/studio-tf9jryb1.js +10 -0
- package/dist/chunks/studio-tfkznv39.js +5 -0
- package/dist/chunks/studio-tft6r105.js +5 -0
- package/dist/chunks/studio-txf2kysx.js +5 -0
- package/dist/chunks/studio-v8867ddv.js +12 -0
- package/dist/chunks/studio-vxq7fcvv.js +5 -0
- package/dist/chunks/studio-w4rz9hdk.js +5 -0
- package/dist/chunks/studio-wbcjbhy1.js +9 -0
- package/dist/chunks/studio-wc649wss.js +5 -0
- package/dist/chunks/studio-wys23mxz.js +5 -0
- package/dist/chunks/studio-x1x167jh.js +5 -0
- package/dist/chunks/studio-x9hsze61.js +5 -0
- package/dist/chunks/studio-y0n7yxea.js +9 -0
- package/dist/chunks/studio-y3ahhdpx.js +5 -0
- package/dist/chunks/studio-z97c48fk.js +5 -0
- package/dist/chunks/studio-zat62m0c.js +5 -0
- package/dist/chunks/studio-zcd2e7yz.js +5 -0
- package/dist/chunks/studio-zz9qe3rw.js +64 -0
- package/dist/chunks/swatch-group-ewh24n1f.js +4 -0
- package/dist/chunks/tabs-f5cw3tgp.js +4 -0
- package/dist/chunks/textfield-wewc8rq2.js +4 -0
- package/dist/chunks/toast-1gv0h53h.js +4 -0
- package/dist/chunks/toast-host-1yg5ar8d.js +4 -0
- package/dist/chunks/{toolbar-2nnzqhrj.js → toolbar-44cm5cta.js} +3 -3
- package/dist/chunks/tooltip-yypz28gq.js +4 -0
- package/dist/chunks/tree-9xa4hm7n.js +4 -0
- package/dist/chunks/tsMode-epyfz1hv.js +14 -0
- package/dist/chunks/workspace-dz7nxfhv.js +4 -0
- package/dist/chunks/workspace-home-xsd7hkjw.js +4 -0
- package/dist/chunks/ws-client-bv552sfx.js +4 -0
- package/dist/iframe-entry.js +20 -16
- package/dist/manifest.json +77 -63
- package/dist/studio.js +106 -107
- package/dist/workers/ts.worker.js +3 -3
- package/package.json +17 -16
- package/src/about/about-modal.ts +4 -3
- package/src/account/action-flow.ts +45 -38
- package/src/account-status.ts +7 -2
- package/src/browse/component-examples.ts +272 -0
- package/src/browse/library-commands.ts +64 -104
- package/src/browse/library-layouts.ts +270 -53
- package/src/browse/library-model.ts +194 -134
- package/src/browse/library-pane.ts +748 -440
- package/src/browse/library-preview.ts +161 -26
- package/src/browse/library-source.ts +308 -41
- package/src/browse/preview-root.ts +78 -0
- package/src/browse/preview-style.ts +155 -0
- package/src/canvas/asset-refs.ts +40 -10
- package/src/canvas/asset-resolve.ts +19 -23
- package/src/canvas/canvas-helpers.ts +7 -6
- package/src/canvas/canvas-live-render.ts +260 -77
- package/src/canvas/canvas-origin.ts +37 -12
- package/src/canvas/canvas-page-context.ts +112 -0
- package/src/canvas/canvas-patcher.ts +30 -30
- package/src/canvas/canvas-perf.ts +11 -5
- package/src/canvas/canvas-render.ts +175 -148
- package/src/canvas/canvas-surface.ts +5 -3
- package/src/canvas/canvas-utils.ts +147 -61
- package/src/canvas/dialog-path.ts +9 -4
- package/src/canvas/dialog-state.ts +1 -2
- package/src/canvas/diff-marks.ts +9 -16
- package/src/canvas/diff-toolbar.ts +8 -7
- package/src/canvas/edit-width-drag.ts +4 -1
- package/src/canvas/edit-width.ts +1 -3
- package/src/canvas/iframe-channel.ts +27 -13
- package/src/canvas/iframe-drop.ts +120 -12
- package/src/canvas/iframe-editable-root.ts +29 -16
- package/src/canvas/iframe-entry.ts +104 -75
- package/src/canvas/iframe-eval.ts +73 -49
- package/src/canvas/iframe-host.ts +269 -158
- package/src/canvas/iframe-inline-edit.ts +49 -30
- package/src/canvas/iframe-insert.ts +5 -4
- package/src/canvas/iframe-interaction.ts +30 -25
- package/src/canvas/iframe-keys.ts +11 -0
- package/src/canvas/iframe-overlay.ts +1 -1
- package/src/canvas/iframe-patch.ts +25 -21
- package/src/canvas/iframe-position.ts +12 -6
- package/src/canvas/iframe-protocol.ts +36 -21
- package/src/canvas/iframe-render.ts +84 -35
- package/src/canvas/iframe-slash.ts +24 -11
- package/src/canvas/iframe-subtree.ts +10 -3
- package/src/canvas/npm-modules.ts +22 -0
- package/src/canvas/path-mapping.ts +19 -12
- package/src/canvas/popover-path.ts +7 -3
- package/src/canvas/popover-state.ts +1 -2
- package/src/canvas/preview-navigate.ts +16 -0
- package/src/canvas/repeater-sources.ts +200 -0
- package/src/canvas/serialize-scope.ts +13 -5
- package/src/canvas/stage-scrollbar.ts +7 -2
- package/src/canvas/surface-registry.ts +27 -3
- package/src/collab/collab-commands.ts +7 -2
- package/src/collab/collab-session.ts +84 -45
- package/src/collab/collab-state.ts +4 -3
- package/src/collab/monaco-binding.ts +16 -13
- package/src/collab/monaco-cursors.ts +5 -2
- package/src/commands/app-commands.ts +16 -6
- package/src/commands/budget.ts +13 -11
- package/src/commands/command-args.ts +103 -71
- package/src/commands/context.ts +55 -28
- package/src/commands/defaults.ts +69 -45
- package/src/commands/keymap.ts +56 -43
- package/src/commands/levels.ts +14 -8
- package/src/commands/live-context.ts +9 -7
- package/src/commands/reference.ts +2 -1
- package/src/commands/registry.ts +22 -11
- package/src/commands/run-reported.ts +15 -10
- package/src/component-props.ts +46 -30
- package/src/content/collection-match.ts +11 -9
- package/src/content/collection-pages.ts +412 -0
- package/src/content/content-collections.ts +270 -0
- package/src/content/draft-state.ts +4 -3
- package/src/content/entry-commands.ts +54 -62
- package/src/content/entry-editor.ts +137 -32
- package/src/content/entry-fields.ts +25 -8
- package/src/content/entry-inspector.ts +225 -0
- package/src/content/entry-model.ts +38 -15
- package/src/content/entry-open.ts +80 -0
- package/src/content/entry-summaries.ts +440 -0
- package/src/content/file-record-ids.ts +80 -0
- package/src/content/file-records.ts +125 -0
- package/src/content/page-summaries.ts +129 -0
- package/src/content/record-entry.ts +201 -0
- package/src/content/writing-banner.ts +177 -0
- package/src/create/add-new-commands.ts +185 -0
- package/src/create/add-new-flow.ts +1116 -0
- package/src/create/add-new.ts +1014 -0
- package/src/create/element-name.ts +121 -0
- package/src/editor/canvas-context-menu.ts +1 -2
- package/src/editor/canvas-slash-bridge.ts +3 -6
- package/src/editor/content-slice.ts +16 -14
- package/src/editor/context-menu.ts +35 -22
- package/src/editor/convert-targets.ts +30 -35
- package/src/editor/convert-to-component.ts +78 -48
- package/src/editor/convert-to-repeater.ts +34 -22
- package/src/editor/editable-tags.ts +17 -2
- package/src/editor/file-drop-action.ts +29 -22
- package/src/editor/inline-edit-apply.ts +79 -17
- package/src/editor/inline-edit.ts +76 -50
- package/src/editor/inline-format.ts +59 -56
- package/src/editor/inline-link.ts +40 -15
- package/src/editor/insert-component.ts +91 -0
- package/src/editor/insert-zone-action.ts +14 -5
- package/src/editor/merge-tags.ts +58 -19
- package/src/editor/repeater-scope.ts +39 -28
- package/src/editor/shortcuts.ts +76 -42
- package/src/editor/slash-menu.ts +52 -14
- package/src/files/asset-versions.ts +4 -4
- package/src/files/components.ts +89 -20
- package/src/files/elements.ts +5 -6
- package/src/files/file-ops.ts +92 -41
- package/src/files/files.ts +248 -239
- package/src/files/fs-events.ts +18 -7
- package/src/files/media-meta.ts +97 -2
- package/src/files/media-paths.ts +3 -0
- package/src/files/media-types.ts +55 -0
- package/src/files/media-upload.ts +209 -52
- package/src/files/new-file-name.ts +156 -0
- package/src/files/serialize-document.ts +15 -5
- package/src/format/constraints.ts +1 -1
- package/src/format/convert-file.ts +27 -13
- package/src/format/format-choices.ts +2 -1
- package/src/format/format-host.ts +91 -50
- package/src/github/github-auth-status.ts +27 -3
- package/src/github/github-auth.ts +21 -11
- package/src/github/github-publish.ts +28 -23
- package/src/grid/cell-editors.ts +46 -31
- package/src/grid/cell-popovers.ts +5 -3
- package/src/grid/edit-buffer.ts +10 -9
- package/src/grid/grid-controller.ts +25 -23
- package/src/grid/grid-layout.ts +21 -5
- package/src/grid/grid-open.ts +3 -33
- package/src/grid/grid-panel.ts +65 -6
- package/src/grid/grid-reveal.ts +34 -0
- package/src/grid/grid-source.ts +9 -31
- package/src/grid/grid-view.ts +45 -23
- package/src/grid/redirects-grid.ts +14 -5
- package/src/grid/redirects.ts +16 -14
- package/src/grid/schema-columns.ts +25 -19
- package/src/grid/sources/connector-source.ts +47 -20
- package/src/grid/sources/content-source.ts +100 -31
- package/src/grid/sources/csv-file-source.ts +2 -2
- package/src/grid/tabulator-tables.d.ts +61 -34
- package/src/hosting/document.ts +2 -2
- package/src/hosting/stage.ts +7 -7
- package/src/i18n/i18n-commands.ts +3 -3
- package/src/media/media-commands.ts +181 -0
- package/src/media/media-library-model.ts +232 -0
- package/src/media/media-library.ts +1283 -0
- package/src/media/media-pane.ts +51 -20
- package/src/new-project/add-repo-modal.ts +20 -19
- package/src/new-project/import-tab.ts +10 -14
- package/src/new-project/location-fields.ts +2 -1
- package/src/new-project/new-project-modal.ts +12 -9
- package/src/packages/jxsuite-update.ts +4 -3
- package/src/packages/pull-package-sync.ts +26 -25
- package/src/page-params.ts +97 -68
- package/src/panels/activity-panel.ts +38 -14
- package/src/panels/ai-chat/attached-context.ts +13 -7
- package/src/panels/ai-chat/chat-markdown.ts +8 -8
- package/src/panels/ai-chat/chat-view.ts +80 -73
- package/src/panels/ai-chat/composer.ts +30 -33
- package/src/panels/ai-chat/sessions-view.ts +1 -2
- package/src/panels/ai-panel.ts +23 -20
- package/src/panels/block-action-bar.ts +57 -46
- package/src/panels/bottom-dock.ts +5 -3
- package/src/panels/canvas-dnd-bridge.ts +36 -26
- package/src/panels/chat-panel.ts +6 -6
- package/src/panels/collections-panel.ts +306 -0
- package/src/panels/component-preview.ts +35 -13
- package/src/panels/data-explorer.ts +63 -26
- package/src/panels/data-grid.ts +18 -11
- package/src/panels/dnd.ts +115 -138
- package/src/panels/editors.ts +52 -21
- package/src/panels/elements-panel.ts +19 -5
- package/src/panels/empty-state.ts +2 -2
- package/src/panels/events-panel.ts +84 -69
- package/src/panels/formula-workspace.ts +78 -54
- package/src/panels/frontmatter-fields.ts +33 -28
- package/src/panels/git-diff-open.ts +10 -6
- package/src/panels/head-panel.ts +488 -202
- package/src/panels/i18n-panel.ts +20 -12
- package/src/panels/imports-panel.ts +25 -47
- package/src/panels/jump-bar.ts +75 -31
- package/src/panels/layers-panel.ts +130 -101
- package/src/panels/left-panel.ts +25 -11
- package/src/panels/navigator-panels.ts +23 -11
- package/src/panels/pane-context.ts +140 -49
- package/src/panels/pane-grid.ts +55 -26
- package/src/panels/panel-registry.ts +36 -46
- package/src/panels/properties-panel.ts +182 -124
- package/src/panels/quick-search.ts +53 -31
- package/src/panels/right-panel.ts +201 -45
- package/src/panels/seo-modal.ts +54 -125
- package/src/panels/settings-menu.ts +63 -61
- package/src/panels/settings-pane.ts +268 -162
- package/src/panels/signals-panel.ts +156 -135
- package/src/panels/site-model.ts +367 -0
- package/src/panels/site-panel.ts +638 -0
- package/src/panels/statement-editor.ts +230 -140
- package/src/panels/style-panel.ts +253 -206
- package/src/panels/style-utils.ts +114 -51
- package/src/panels/stylebook-doc.ts +195 -60
- package/src/panels/stylebook-layers-panel.ts +48 -89
- package/src/panels/stylebook-panel.ts +60 -27
- package/src/panels/styles-panel.ts +327 -0
- package/src/panels/tab-drop.ts +27 -11
- package/src/panels/tab-strip.ts +143 -49
- package/src/platform-errors.ts +57 -43
- package/src/platform.ts +59 -31
- package/src/platforms/cloud.ts +373 -176
- package/src/platforms/default-platform.ts +14 -8
- package/src/platforms/devserver.ts +180 -142
- package/src/platforms/read-batcher.ts +16 -8
- package/src/project-list.ts +2 -1
- package/src/publish/deploy-checklist.ts +20 -9
- package/src/publish/pages-service.ts +66 -27
- package/src/publish/publish-changes.ts +491 -0
- package/src/publish/publish-commands.ts +88 -22
- package/src/publish/publish-ids.ts +49 -0
- package/src/publish/publish-panel.ts +10 -6
- package/src/publish/publish-quick.ts +148 -0
- package/src/publish/publish-workspace.ts +926 -0
- package/src/publish/source-control.ts +907 -0
- package/src/recent-projects.ts +15 -8
- package/src/resize-edges.ts +26 -36
- package/src/services/a11y-report.ts +26 -19
- package/src/services/agent-seed.ts +23 -11
- package/src/services/ai-ask.ts +9 -12
- package/src/services/ai-command-tools.ts +68 -62
- package/src/services/ai-import-tools.ts +80 -67
- package/src/services/ai-models.ts +17 -13
- package/src/services/ai-project-tools.ts +68 -32
- package/src/services/ai-session-store.ts +19 -10
- package/src/services/ai-system-prompt.ts +46 -20
- package/src/services/ai-tools.ts +71 -27
- package/src/services/ai-write-report.ts +20 -12
- package/src/services/ai-writes.ts +4 -4
- package/src/services/automation.ts +74 -51
- package/src/services/cem-export.ts +149 -58
- package/src/services/cf-settings.ts +4 -4
- package/src/services/clock.ts +6 -1
- package/src/services/code-services.ts +37 -31
- package/src/services/connection.ts +2 -2
- package/src/services/context-manager.ts +14 -10
- package/src/services/context-resolver.ts +20 -8
- package/src/services/data-service.ts +19 -15
- package/src/services/directory-picker.ts +20 -14
- package/src/services/document-assistant.ts +39 -19
- package/src/services/gated-registry.ts +10 -6
- package/src/services/harness/chat-reducer.ts +23 -1
- package/src/services/import-client.ts +91 -38
- package/src/services/import-seed.ts +8 -2
- package/src/services/jx-validate.ts +28 -31
- package/src/services/live-preview.ts +0 -0
- package/src/services/live-surfaces.ts +6 -3
- package/src/services/model-uri.ts +10 -2
- package/src/services/module-preloads.ts +12 -8
- package/src/services/monaco-buffer.ts +43 -24
- package/src/services/monaco-lazy.ts +7 -8
- package/src/services/monaco-setup.ts +23 -16
- package/src/services/notify.ts +44 -17
- package/src/services/popover-report.ts +25 -10
- package/src/services/preview-eval.ts +20 -8
- package/src/services/profile.ts +13 -6
- package/src/services/project-path.ts +13 -10
- package/src/services/references.ts +0 -0
- package/src/services/render-critic.ts +29 -9
- package/src/services/settings/definitions.ts +25 -14
- package/src/services/settings/kernel.ts +13 -4
- package/src/services/settings/write-queue.ts +9 -9
- package/src/services/token-lint.ts +12 -10
- package/src/services/tool-executor.ts +17 -5
- package/src/services/tool-outcomes.ts +44 -24
- package/src/services/trusted-types.ts +24 -7
- package/src/settings/contexts-section.ts +11 -8
- package/src/settings/contributed-section.ts +128 -70
- package/src/settings/css-vars-editor.ts +119 -32
- package/src/settings/defs-editor.ts +38 -35
- package/src/settings/developer-panels.ts +43 -0
- package/src/settings/extension-rows.ts +16 -8
- package/src/settings/extension-sections.ts +42 -14
- package/src/settings/extensions-section.ts +4 -1
- package/src/settings/general-settings.ts +101 -28
- package/src/settings/locales-section.ts +20 -12
- package/src/settings/preferences-dialog.ts +17 -7
- package/src/settings/preferences-keymap.ts +7 -5
- package/src/settings/preferences-sections.ts +11 -5
- package/src/settings/project-sections.ts +28 -11
- package/src/settings/schema-field-ui.ts +12 -1
- package/src/settings/section-registry.ts +116 -11
- package/src/settings/settings-dialog.ts +192 -0
- package/src/settings/settings-document.ts +186 -166
- package/src/shell/tree.ts +6 -5
- package/src/shell.ts +536 -477
- package/src/site-context.ts +101 -32
- package/src/state.ts +68 -57
- package/src/store.ts +54 -34
- package/src/studio.ts +219 -116
- package/src/style/live-preview.ts +1 -1
- package/src/style/project-styles.ts +40 -7
- package/src/style/stylebook-specimens.ts +89 -0
- package/src/style/stylebook-target.ts +26 -0
- package/src/style/tag-inheritance.ts +105 -0
- package/src/style/token-ref.ts +5 -4
- package/src/style/variables-focus.ts +61 -0
- package/src/style/variables-view.ts +235 -0
- package/src/surfaces/about.ts +18 -19
- package/src/surfaces/add-new.json +1482 -0
- package/src/surfaces/add-new.ts +325 -0
- package/src/surfaces/add-repo.ts +17 -19
- package/src/surfaces/ai-chat.ts +33 -38
- package/src/surfaces/ai-credentials-form.ts +6 -16
- package/src/surfaces/ai-managed-connect.ts +3 -4
- package/src/surfaces/ai-model-picker.ts +3 -5
- package/src/surfaces/block-action-bar.ts +22 -11
- package/src/surfaces/boot-failure.json +4 -3
- package/src/surfaces/boot-failure.ts +4 -5
- package/src/surfaces/bottom-dock.json +1 -1
- package/src/surfaces/bottom-dock.ts +9 -18
- package/src/surfaces/canvas-stage.json +30 -19
- package/src/surfaces/canvas-stage.ts +17 -16
- package/src/surfaces/cf-account-picker.ts +17 -18
- package/src/surfaces/collections-panel.json +615 -0
- package/src/surfaces/collections-panel.ts +168 -0
- package/src/surfaces/commandbar.json +241 -96
- package/src/surfaces/commandbar.ts +145 -105
- package/src/surfaces/convert-repeater.ts +17 -19
- package/src/surfaces/data-actions.ts +9 -7
- package/src/surfaces/dialog.ts +26 -28
- package/src/surfaces/diff-toolbar.ts +9 -7
- package/src/surfaces/empty-state.json +1 -1
- package/src/surfaces/empty-state.ts +7 -10
- package/src/surfaces/entry-editor.json +136 -0
- package/src/surfaces/entry-editor.ts +35 -11
- package/src/surfaces/entry-inspector.json +371 -0
- package/src/surfaces/entry-inspector.ts +143 -0
- package/src/surfaces/expression-editor.ts +11 -25
- package/src/surfaces/files-panel.ts +27 -14
- package/src/surfaces/formula-palette.ts +4 -5
- package/src/surfaces/github-auth.ts +16 -20
- package/src/surfaces/github-publish.ts +17 -22
- package/src/surfaces/grid-cell.ts +30 -31
- package/src/surfaces/grid-open.ts +10 -14
- package/src/surfaces/grid-panel.ts +13 -9
- package/src/surfaces/grid-replace.ts +13 -13
- package/src/surfaces/grid-views.ts +15 -18
- package/src/surfaces/inspector-dock.json +162 -14
- package/src/surfaces/inspector-dock.ts +59 -31
- package/src/surfaces/jump-bar.ts +5 -6
- package/src/surfaces/jxsuite-update.ts +16 -22
- package/src/surfaces/library-pane.json +670 -437
- package/src/surfaces/library-pane.ts +111 -77
- package/src/surfaces/logic-panel.ts +17 -30
- package/src/surfaces/logic-workspace.ts +13 -15
- package/src/surfaces/media-browser.json +62 -6
- package/src/surfaces/media-browser.ts +26 -11
- package/src/surfaces/media-field.json +1 -1
- package/src/surfaces/media-field.ts +4 -5
- package/src/surfaces/media-library.json +1586 -0
- package/src/surfaces/media-library.ts +282 -0
- package/src/surfaces/media-pane.ts +8 -7
- package/src/surfaces/media-pick-dialog.json +71 -0
- package/src/surfaces/media-pick-dialog.ts +132 -0
- package/src/surfaces/menu.ts +47 -23
- package/src/surfaces/navigator-dock.ts +11 -12
- package/src/surfaces/new-project.ts +27 -26
- package/src/surfaces/pane-context.json +144 -77
- package/src/surfaces/pane-context.ts +44 -25
- package/src/surfaces/pane-grid.ts +15 -10
- package/src/surfaces/panel-activity.ts +5 -6
- package/src/surfaces/panel-data.ts +3 -4
- package/src/surfaces/panel-deploy-checklist.json +12 -6
- package/src/surfaces/panel-deploy-checklist.ts +8 -7
- package/src/surfaces/panel-elements.ts +5 -7
- package/src/surfaces/panel-i18n.ts +5 -7
- package/src/surfaces/panel-imports.ts +6 -13
- package/src/surfaces/panel-outline.ts +25 -19
- package/src/surfaces/panel-page.json +72 -2
- package/src/surfaces/panel-page.ts +49 -25
- package/src/surfaces/panel-problems.ts +5 -7
- package/src/surfaces/panel-signals.json +1 -1
- package/src/surfaces/panel-signals.ts +25 -39
- package/src/surfaces/panel-stylebook-layers.json +71 -204
- package/src/surfaces/panel-stylebook-layers.ts +5 -29
- package/src/surfaces/preferences.json +120 -48
- package/src/surfaces/preferences.ts +29 -11
- package/src/surfaces/progress-modal.ts +15 -9
- package/src/surfaces/properties-panel.json +1 -1
- package/src/surfaces/properties-panel.ts +20 -42
- package/src/surfaces/publish-quick.json +428 -0
- package/src/surfaces/publish-quick.ts +165 -0
- package/src/surfaces/publish-workspace.json +2892 -0
- package/src/surfaces/publish-workspace.ts +391 -0
- package/src/surfaces/publish.ts +18 -18
- package/src/surfaces/push-plan.ts +7 -8
- package/src/surfaces/rail.json +1 -159
- package/src/surfaces/rail.ts +22 -79
- package/src/surfaces/reference-field.ts +11 -15
- package/src/surfaces/schema-builder.ts +16 -22
- package/src/surfaces/schema-form.json +10 -2
- package/src/surfaces/schema-form.ts +17 -25
- package/src/surfaces/secret-field.ts +9 -6
- package/src/surfaces/seo.json +1 -1
- package/src/surfaces/seo.ts +21 -15
- package/src/surfaces/settings-contexts.ts +9 -7
- package/src/surfaces/settings-contributed.json +5 -5
- package/src/surfaces/settings-contributed.ts +32 -12
- package/src/surfaces/settings-css-vars.json +44 -36
- package/src/surfaces/settings-css-vars.ts +82 -16
- package/src/surfaces/settings-defs.json +2 -2
- package/src/surfaces/settings-defs.ts +17 -21
- package/src/surfaces/settings-deploy.json +2 -15
- package/src/surfaces/settings-deploy.ts +9 -16
- package/src/surfaces/settings-dialog.json +51 -0
- package/src/surfaces/settings-dialog.ts +169 -0
- package/src/surfaces/settings-extensions.ts +5 -6
- package/src/surfaces/settings-head.ts +33 -39
- package/src/surfaces/settings-locales.ts +8 -20
- package/src/surfaces/settings-overview.json +3 -3
- package/src/surfaces/settings-overview.ts +14 -8
- package/src/surfaces/settings-packages.ts +8 -7
- package/src/surfaces/settings-pane.json +269 -46
- package/src/surfaces/settings-pane.ts +88 -36
- package/src/surfaces/settings-rawjson.ts +5 -6
- package/src/surfaces/shell.json +2 -1
- package/src/surfaces/shell.ts +1 -2
- package/src/surfaces/site-panel.json +1029 -0
- package/src/surfaces/site-panel.ts +233 -0
- package/src/surfaces/slash-menu.json +63 -21
- package/src/surfaces/slash-menu.ts +42 -9
- package/src/surfaces/statements.ts +13 -18
- package/src/surfaces/statusbar.ts +56 -29
- package/src/surfaces/style-panel.ts +18 -31
- package/src/surfaces/stylebook-chrome.ts +3 -5
- package/src/surfaces/styles-panel.json +735 -0
- package/src/surfaces/styles-panel.ts +195 -0
- package/src/surfaces/styles-variables.json +149 -0
- package/src/surfaces/styles-variables.ts +145 -0
- package/src/surfaces/tab-strip.json +4 -4
- package/src/surfaces/tab-strip.ts +14 -13
- package/src/surfaces/target-line.ts +6 -7
- package/src/surfaces/welcome.ts +6 -8
- package/src/surfaces/writing-banner.json +94 -0
- package/src/surfaces/writing-banner.ts +80 -0
- package/src/tabs/bare-repeaters.ts +101 -0
- package/src/tabs/patch-ops.ts +4 -3
- package/src/tabs/project-config.ts +32 -21
- package/src/tabs/selection.ts +36 -8
- package/src/tabs/tab.ts +99 -48
- package/src/tabs/transact.ts +98 -53
- package/src/types.ts +53 -43
- package/src/ui/ai-credentials-form.ts +10 -13
- package/src/ui/ai-model-picker.ts +3 -3
- package/src/ui/cf-account-picker.ts +7 -9
- package/src/ui/color-selector.ts +9 -5
- package/src/ui/dynamic-slot.ts +7 -8
- package/src/ui/expression-editor.ts +112 -105
- package/src/ui/form-controls.ts +104 -56
- package/src/ui/formula-catalog.ts +239 -230
- package/src/ui/formula-chips.ts +33 -18
- package/src/ui/layers.ts +57 -31
- package/src/ui/media-picker.ts +300 -47
- package/src/ui/popover-surface.ts +20 -12
- package/src/ui/progress-modal.ts +13 -8
- package/src/ui/regions.ts +14 -12
- package/src/ui/schema-form.ts +372 -97
- package/src/ui/surface.ts +71 -8
- package/src/ui/timing.ts +9 -0
- package/src/ui/value-source.ts +44 -31
- package/src/ui/virtual-window.ts +29 -3
- package/src/utils/base64.ts +6 -4
- package/src/utils/edit-display.ts +366 -111
- package/src/utils/element-selectors.ts +3 -2
- package/src/utils/google-fonts.ts +15 -14
- package/src/utils/inherited-style.ts +18 -20
- package/src/utils/link-target.ts +1 -1
- package/src/utils/local-day.ts +18 -0
- package/src/utils/preview-format.ts +25 -3
- package/src/utils/strip-events.ts +49 -22
- package/src/utils/studio-utils.ts +29 -14
- package/src/view.ts +2 -3
- package/src/workspace/pane-derive.ts +14 -16
- package/src/workspace/session.ts +81 -50
- package/src/workspace/tab-workspace.ts +137 -0
- package/src/workspace/workspace-back.ts +189 -0
- package/src/workspace/workspace-home.ts +133 -0
- package/src/workspace/workspace-ids.ts +129 -0
- package/src/workspace/workspace-switch.ts +372 -0
- package/src/workspace/workspace.ts +165 -47
- package/styles/shell-frame.css +30 -7
- package/styles/shell-frame.json +15 -3
- package/dist/chunks/2020-va2wwra4.js +0 -4
- package/dist/chunks/adapter-f93pafd7.js +0 -4
- package/dist/chunks/cf-account-picker-af1h381v.js +0 -4
- package/dist/chunks/cf-settings-125tdm0w.js +0 -4
- package/dist/chunks/color-area-jqhna8zy.js +0 -4
- package/dist/chunks/color-field-embq5ctg.js +0 -4
- package/dist/chunks/color-fpezvnkt.js +0 -4
- package/dist/chunks/color-slider-1qmw7wqy.js +0 -4
- package/dist/chunks/combobox-773hdzyj.js +0 -4
- package/dist/chunks/components-ax2f1fnn.js +0 -4
- package/dist/chunks/content-source-108aqtk1.js +0 -4
- package/dist/chunks/convert-to-repeater-ry5rmppr.js +0 -4
- package/dist/chunks/dialog-mtm9fq5t.js +0 -4
- package/dist/chunks/editor-pfgdmkb0.js +0 -4
- package/dist/chunks/entry-commands-t0k1q0kx.js +0 -4
- package/dist/chunks/extension-sections-6mwh2hf8.js +0 -4
- package/dist/chunks/file-ops-meej5mqf.js +0 -4
- package/dist/chunks/files-44vp8a2s.js +0 -4
- package/dist/chunks/format-host-7q1petb9.js +0 -4
- package/dist/chunks/fs-events-h2mwnxaz.js +0 -4
- package/dist/chunks/git-panel-zngbymvd.js +0 -4
- package/dist/chunks/grid-view-sx9vynsp.js +0 -51
- package/dist/chunks/icons-p44xhjf0.js +0 -4
- package/dist/chunks/iframe-entry-f7mqjwpm.js +0 -5
- package/dist/chunks/iframe-entry-haw7jkvz.js +0 -5
- package/dist/chunks/iframe-entry-z6qrytv3.js +0 -5
- package/dist/chunks/iframe-host-qk3ycq87.js +0 -4
- package/dist/chunks/index-wkyfjeqz.js +0 -4
- package/dist/chunks/jsonMode-s8kt9dsj.js +0 -13
- package/dist/chunks/jx-validate-psgd7vsx.js +0 -4
- package/dist/chunks/layers-panel-1kq2jyfk.js +0 -4
- package/dist/chunks/layers-xd92fg8d.js +0 -4
- package/dist/chunks/listbox-s8fkmnq8.js +0 -4
- package/dist/chunks/lit-html-ac4cwwr4.js +0 -4
- package/dist/chunks/media-picker-0svzkdyb.js +0 -4
- package/dist/chunks/menu-37d07z9m.js +0 -4
- package/dist/chunks/menu-5c55ea3d.js +0 -4
- package/dist/chunks/monaco-binding-z6r70pdt.js +0 -4
- package/dist/chunks/monaco-buffer-fz6gq5y7.js +0 -4
- package/dist/chunks/monaco-setup-q4axkgj7.js +0 -4
- package/dist/chunks/notify-0xgtn8q1.js +0 -4
- package/dist/chunks/number-field-gw7sq8rn.js +0 -4
- package/dist/chunks/parse-897fvqah.js +0 -4
- package/dist/chunks/platform-v1qctbe6.js +0 -4
- package/dist/chunks/popover-8htra4er.js +0 -4
- package/dist/chunks/publish-panel-ym1fmgq5.js +0 -4
- package/dist/chunks/quick-search-a54e6t5n.js +0 -4
- package/dist/chunks/references-gmqp82fs.js +0 -4
- package/dist/chunks/right-panel-v7t9awbk.js +0 -4
- package/dist/chunks/section-registry-vhyf3zsr.js +0 -4
- package/dist/chunks/select-n3v7gwas.js +0 -4
- package/dist/chunks/split-pff8f3ze.js +0 -4
- package/dist/chunks/studio-0bhx5hz6.js +0 -5
- package/dist/chunks/studio-0k1ddnyy.js +0 -6
- package/dist/chunks/studio-1b04pd0j.js +0 -64
- package/dist/chunks/studio-4dwbj6gb.js +0 -5
- package/dist/chunks/studio-4tanh828.js +0 -5
- package/dist/chunks/studio-55h4mstj.js +0 -4
- package/dist/chunks/studio-5tnvjkz4.js +0 -5
- package/dist/chunks/studio-60dqgb0c.js +0 -5
- package/dist/chunks/studio-61dp09qg.js +0 -9
- package/dist/chunks/studio-63epcrj2.js +0 -5
- package/dist/chunks/studio-74k29dy9.js +0 -5
- package/dist/chunks/studio-7vg6jcd3.js +0 -5
- package/dist/chunks/studio-7zx31knw.js +0 -9
- package/dist/chunks/studio-8bxk97km.js +0 -5
- package/dist/chunks/studio-933e30n4.js +0 -5
- package/dist/chunks/studio-98wnwhbg.js +0 -5
- package/dist/chunks/studio-9mccjwjh.js +0 -14
- package/dist/chunks/studio-a2ke1e4t.js +0 -5
- package/dist/chunks/studio-e3a2a6v3.js +0 -4
- package/dist/chunks/studio-e81q1vb9.js +0 -5
- package/dist/chunks/studio-epgrmqqm.js +0 -5
- package/dist/chunks/studio-ery42sqr.js +0 -4
- package/dist/chunks/studio-g1shz58g.js +0 -5
- package/dist/chunks/studio-gf0fz03c.js +0 -5
- package/dist/chunks/studio-gjtpe62q.js +0 -6
- package/dist/chunks/studio-gkskhg7m.js +0 -5
- package/dist/chunks/studio-gx4dnjzd.js +0 -5
- package/dist/chunks/studio-j03zga3y.js +0 -9
- package/dist/chunks/studio-jhpxeckz.js +0 -5
- package/dist/chunks/studio-k01r7ykp.js +0 -5
- package/dist/chunks/studio-kk7h30ne.js +0 -7
- package/dist/chunks/studio-kt1zqney.js +0 -5
- package/dist/chunks/studio-m3cwhvye.js +0 -5
- package/dist/chunks/studio-mcayt6hz.js +0 -5
- package/dist/chunks/studio-myjcghv3.js +0 -5
- package/dist/chunks/studio-n8bxwc3y.js +0 -4
- package/dist/chunks/studio-ngm8gvpb.js +0 -5
- package/dist/chunks/studio-nj5a01jy.js +0 -928
- package/dist/chunks/studio-pcgz8heb.js +0 -5
- package/dist/chunks/studio-qcsq0t15.js +0 -5
- package/dist/chunks/studio-qkstvve9.js +0 -5
- package/dist/chunks/studio-qv1pwd3c.js +0 -5
- package/dist/chunks/studio-rc6dvxjb.js +0 -7
- package/dist/chunks/studio-s8dmmz66.js +0 -5
- package/dist/chunks/studio-sp5xzbj4.js +0 -6
- package/dist/chunks/studio-szsjbj0g.js +0 -5
- package/dist/chunks/studio-t1xzawhr.js +0 -16
- package/dist/chunks/studio-tdcprbqb.js +0 -5
- package/dist/chunks/studio-vrmcjf9g.js +0 -7
- package/dist/chunks/studio-vyc0b4he.js +0 -10
- package/dist/chunks/studio-w0cgf6jg.js +0 -5
- package/dist/chunks/studio-w3hskzqk.js +0 -5
- package/dist/chunks/studio-xgrgcdyh.js +0 -9
- package/dist/chunks/studio-xz2yxfcb.js +0 -5
- package/dist/chunks/studio-y6n42tgs.js +0 -5
- package/dist/chunks/studio-yb560vxr.js +0 -5
- package/dist/chunks/studio-yn9f8vtx.js +0 -5
- package/dist/chunks/studio-yw05w8f0.js +0 -7
- package/dist/chunks/studio-z16sgavc.js +0 -5
- package/dist/chunks/studio-zey7zsdw.js +0 -12
- package/dist/chunks/studio-zyqn40w4.js +0 -5
- package/dist/chunks/swatch-group-8qh9a3bm.js +0 -4
- package/dist/chunks/tabs-jwthg40w.js +0 -4
- package/dist/chunks/textfield-spy3hc77.js +0 -4
- package/dist/chunks/toast-4d35zd64.js +0 -4
- package/dist/chunks/toast-host-8sjmfed3.js +0 -4
- package/dist/chunks/tooltip-fd6g9xy3.js +0 -4
- package/dist/chunks/tree-h19v1jfz.js +0 -4
- package/dist/chunks/tsMode-2frah6h1.js +0 -14
- package/dist/chunks/workspace-zt81g1ms.js +0 -4
- package/dist/chunks/ws-client-n2bh4hkf.js +0 -4
- package/src/panels/frontmatter-panel.ts +0 -701
- package/src/panels/git-panel.ts +0 -1120
- package/src/surfaces/doc-header.json +0 -776
- package/src/surfaces/doc-header.ts +0 -231
- package/src/surfaces/git-panel.json +0 -1880
- package/src/surfaces/git-panel.ts +0 -272
|
@@ -7,11 +7,13 @@
|
|
|
7
7
|
|
|
8
8
|
import { postMessageChannel } from "./iframe-channel";
|
|
9
9
|
import { rectOf } from "../utils/geometry";
|
|
10
|
-
import { displayTagName } from "@jxsuite/schema/guards";
|
|
10
|
+
import { displayTagName, isNonNullObject } from "@jxsuite/schema/guards";
|
|
11
11
|
import {
|
|
12
12
|
applyCanvasDialogOpen,
|
|
13
13
|
applyCanvasPopoverOpen,
|
|
14
14
|
applyPreviewColorScheme,
|
|
15
|
+
applyPreviewLocale,
|
|
16
|
+
captureLocaleBaseline,
|
|
15
17
|
applySiteStyle,
|
|
16
18
|
installCanvasImageRetry,
|
|
17
19
|
renderResolvedDocument,
|
|
@@ -54,21 +56,24 @@ import {
|
|
|
54
56
|
redefineElement,
|
|
55
57
|
resetDocumentStyles,
|
|
56
58
|
setCanvasAssetResolver,
|
|
59
|
+
setNpmModuleResolver,
|
|
57
60
|
setResolveToken,
|
|
58
61
|
} from "@jxsuite/runtime";
|
|
59
62
|
import { resolveAssetRef } from "./asset-resolve";
|
|
63
|
+
import { npmModuleUrl } from "./npm-modules";
|
|
60
64
|
import type { AssetContext } from "./asset-resolve";
|
|
61
65
|
import { KIT_LOADERS } from "@jxsuite/ui/loaders";
|
|
62
|
-
import type { IframeChannel } from "./iframe-channel";
|
|
66
|
+
import type { CanvasEnvelope, IframeChannel } from "./iframe-channel";
|
|
63
67
|
import type {
|
|
64
68
|
CanvasMode,
|
|
69
|
+
DragOverMsg,
|
|
65
70
|
DragSrcKind,
|
|
66
71
|
FileDropHit,
|
|
67
72
|
IframeToParent,
|
|
68
73
|
LayoutHit,
|
|
69
74
|
ParentToIframe,
|
|
70
75
|
} from "./iframe-protocol";
|
|
71
|
-
import type { JxDocument, JxMutableNode
|
|
76
|
+
import type { JxDocument, JxMutableNode } from "@jxsuite/schema/types";
|
|
72
77
|
import type { IframeRenderCtx, RenderHandle } from "./iframe-render";
|
|
73
78
|
import { setBundleBase } from "../services/bundle-base";
|
|
74
79
|
|
|
@@ -91,6 +96,14 @@ for (const [specifier, load] of Object.entries(KIT_LOADERS)) {
|
|
|
91
96
|
preloadModule(specifier, load);
|
|
92
97
|
}
|
|
93
98
|
|
|
99
|
+
/*
|
|
100
|
+
* A document's `npm:` sidecar, from the package the project installed. The build bundles one
|
|
101
|
+
* (`compiler/src/site/bundler.ts`); this frame asks the dev server, which bundles
|
|
102
|
+
* `/node_modules/<package>/<subpath>` on demand through the package's own `exports`, the URL space
|
|
103
|
+
* `registerElements` already imports a bare `$elements` specifier from.
|
|
104
|
+
*/
|
|
105
|
+
setNpmModuleResolver((specifier) => npmModuleUrl(specifier, location.href));
|
|
106
|
+
|
|
94
107
|
/**
|
|
95
108
|
* Resolve the drop placement for a forwarded cursor: point hit-test → nearest `[data-jx-path]` →
|
|
96
109
|
* pure {@link computeDropInstruction}. Returns null when the cursor resolves to no droppable target.
|
|
@@ -153,12 +166,12 @@ export function fileDropHitFor(
|
|
|
153
166
|
targetEl: HTMLElement,
|
|
154
167
|
shadowDoc: JxMutableNode | null,
|
|
155
168
|
): FileDropHit | null {
|
|
156
|
-
const serialized = targetEl.dataset
|
|
169
|
+
const serialized = targetEl.dataset.jxPath;
|
|
157
170
|
if (serialized == null) {
|
|
158
171
|
return null;
|
|
159
172
|
}
|
|
160
173
|
const path = parseJxPath(serialized);
|
|
161
|
-
const node = shadowDoc ?
|
|
174
|
+
const node = shadowDoc ? getNodeAtPath(shadowDoc, path) : undefined;
|
|
162
175
|
return {
|
|
163
176
|
path,
|
|
164
177
|
rect: rectFor(targetEl),
|
|
@@ -186,7 +199,8 @@ export function layoutHitFor(target: EventTarget | null): LayoutHit | null {
|
|
|
186
199
|
return null;
|
|
187
200
|
}
|
|
188
201
|
return {
|
|
189
|
-
|
|
202
|
+
// An `HTMLElement`'s `className` is always the string form (only SVG's is an animated value).
|
|
203
|
+
className: el.className,
|
|
190
204
|
layoutFile: el.dataset.jxLayoutFile ?? "",
|
|
191
205
|
layoutPath: parseJxPath(el.dataset.jxLayoutPath ?? "[]"),
|
|
192
206
|
rect: rectFor(el),
|
|
@@ -194,6 +208,34 @@ export function layoutHitFor(target: EventTarget | null): LayoutHit | null {
|
|
|
194
208
|
};
|
|
195
209
|
}
|
|
196
210
|
|
|
211
|
+
/**
|
|
212
|
+
* The text a failed patch or render reports: the thrown value's `message` when it has one, the
|
|
213
|
+
* value itself otherwise.
|
|
214
|
+
*/
|
|
215
|
+
function failureText(cause: unknown): string {
|
|
216
|
+
const message = isNonNullObject(cause) && "message" in cause ? cause.message : undefined;
|
|
217
|
+
return String(message ?? cause);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/** The edge-hold auto-scroll loop's last cursor, and the drag it belongs to. */
|
|
221
|
+
interface AutoScrollCursor {
|
|
222
|
+
x: number;
|
|
223
|
+
y: number;
|
|
224
|
+
dragSeq: number;
|
|
225
|
+
withCursor: boolean;
|
|
226
|
+
src?: DragSrcKind;
|
|
227
|
+
gen?: number;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* The two document APIs the `idle` sample reads, as a frame may or may not provide them. lib.dom
|
|
232
|
+
* declares both unconditionally; happy-dom implements neither.
|
|
233
|
+
*/
|
|
234
|
+
interface IdleProbeDocument {
|
|
235
|
+
getAnimations?: Document["getAnimations"];
|
|
236
|
+
fonts?: FontFaceSet;
|
|
237
|
+
}
|
|
238
|
+
|
|
197
239
|
/** Set-key keys the patcher applies IN PLACE (never a subtree re-render) — safe under a live edit. */
|
|
198
240
|
const IN_PLACE_KEYS = new Set(["style", "textContent"]);
|
|
199
241
|
|
|
@@ -270,6 +312,8 @@ export function startCanvasIframe(opts: {
|
|
|
270
312
|
// Alongside the handle so a superseded render's refs can't keep posting.
|
|
271
313
|
let stopDataScopeWatch: (() => void) | null = null;
|
|
272
314
|
let latestGen = -1;
|
|
315
|
+
// The root's language as the frame booted it, which a render with no language goes back to.
|
|
316
|
+
const localeBaseline = captureLocaleBaseline(container.ownerDocument);
|
|
273
317
|
// The raw page doc the current DOM was rendered from — the patch source-of-truth. `renderedGen`
|
|
274
318
|
// Tracks which generation it (and the DOM) reflect, so patches for an in-flight/superseded render
|
|
275
319
|
// Are handled correctly rather than applied against the wrong tree.
|
|
@@ -317,14 +361,7 @@ export function startCanvasIframe(opts: {
|
|
|
317
361
|
// (the parent has no pointer of its own then). Parent-driven flows (1/2/4) leave `src` undefined
|
|
318
362
|
// And `withCursor` false — the tick falls back to `dragSrc`/`dragGen` and the parent moves the
|
|
319
363
|
// Ghost from its own raw pointer.
|
|
320
|
-
let autoScrollCursor:
|
|
321
|
-
x: number;
|
|
322
|
-
y: number;
|
|
323
|
-
dragSeq: number;
|
|
324
|
-
withCursor: boolean;
|
|
325
|
-
src?: DragSrcKind;
|
|
326
|
-
gen?: number;
|
|
327
|
-
} | null = null;
|
|
364
|
+
let autoScrollCursor: AutoScrollCursor | null = null;
|
|
328
365
|
const win = container.ownerDocument.defaultView;
|
|
329
366
|
|
|
330
367
|
function stopAutoScroll(): void {
|
|
@@ -353,16 +390,17 @@ export function startCanvasIframe(opts: {
|
|
|
353
390
|
return;
|
|
354
391
|
}
|
|
355
392
|
const preview = previewAt(autoScrollCursor, src, shadowDoc, container.ownerDocument);
|
|
356
|
-
|
|
357
|
-
// Flow 3 (withCursor) re-posts the cursor so the parent keeps tracking the ghost at an edge-hold.
|
|
358
|
-
...(autoScrollCursor.withCursor
|
|
359
|
-
? { cursor: { x: autoScrollCursor.x, y: autoScrollCursor.y } }
|
|
360
|
-
: {}),
|
|
393
|
+
const over: DragOverMsg = {
|
|
361
394
|
dragSeq: autoScrollCursor.dragSeq,
|
|
362
395
|
gen: autoScrollCursor.gen ?? dragGen,
|
|
363
396
|
kind: "dragOver",
|
|
364
397
|
preview,
|
|
365
|
-
}
|
|
398
|
+
};
|
|
399
|
+
// Flow 3 (withCursor) re-posts the cursor so the parent keeps tracking the ghost at an edge-hold.
|
|
400
|
+
if (autoScrollCursor.withCursor) {
|
|
401
|
+
over.cursor = { x: autoScrollCursor.x, y: autoScrollCursor.y };
|
|
402
|
+
}
|
|
403
|
+
channel.post(over);
|
|
366
404
|
autoScrollFrame = win.requestAnimationFrame(autoScrollTick);
|
|
367
405
|
}
|
|
368
406
|
|
|
@@ -381,13 +419,12 @@ export function startCanvasIframe(opts: {
|
|
|
381
419
|
stopAutoScroll();
|
|
382
420
|
return;
|
|
383
421
|
}
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
};
|
|
422
|
+
const next: AutoScrollCursor = { dragSeq, withCursor: flow3 != null, x: cursor.x, y: cursor.y };
|
|
423
|
+
if (flow3) {
|
|
424
|
+
next.gen = flow3.gen;
|
|
425
|
+
next.src = flow3.src;
|
|
426
|
+
}
|
|
427
|
+
autoScrollCursor = next;
|
|
391
428
|
if (!autoScrollFrame) {
|
|
392
429
|
autoScrollFrame = win.requestAnimationFrame(autoScrollTick);
|
|
393
430
|
}
|
|
@@ -522,13 +559,11 @@ export function startCanvasIframe(opts: {
|
|
|
522
559
|
}
|
|
523
560
|
|
|
524
561
|
function sampleIdle(): Extract<IframeToParent, { kind: "idle" }> {
|
|
525
|
-
const
|
|
526
|
-
|
|
527
|
-
? frameDoc.getAnimations().filter((a) => a.playState === "running").length
|
|
528
|
-
: 0;
|
|
562
|
+
const probe: IdleProbeDocument = frameDoc;
|
|
563
|
+
const running = probe.getAnimations?.().filter((a) => a.playState === "running").length ?? 0;
|
|
529
564
|
return {
|
|
530
565
|
animations: running,
|
|
531
|
-
fonts:
|
|
566
|
+
fonts: probe.fonts ? probe.fonts.status === "loaded" : true,
|
|
532
567
|
gen: renderedGen,
|
|
533
568
|
images: pendingImageRetries(),
|
|
534
569
|
kind: "idle",
|
|
@@ -750,12 +785,7 @@ export function startCanvasIframe(opts: {
|
|
|
750
785
|
// The wrong scope); the parent additionally gen-gates the reply against its own state.
|
|
751
786
|
const results =
|
|
752
787
|
msg.gen === renderedGen && renderCtx && shadowDoc
|
|
753
|
-
? evaluateLiveExprs(
|
|
754
|
-
msg.exprs,
|
|
755
|
-
renderCtx.defs as Record<string, unknown>,
|
|
756
|
-
shadowDoc,
|
|
757
|
-
msg.contextPath,
|
|
758
|
-
)
|
|
788
|
+
? evaluateLiveExprs(msg.exprs, renderCtx.defs, shadowDoc, msg.contextPath)
|
|
759
789
|
: [];
|
|
760
790
|
channel.post({ gen: msg.gen, kind: "evalResult", reqId: msg.reqId, results });
|
|
761
791
|
return;
|
|
@@ -820,11 +850,7 @@ export function startCanvasIframe(opts: {
|
|
|
820
850
|
channel.post({ gen, kind: "patchComplete" });
|
|
821
851
|
armIdleWatch();
|
|
822
852
|
} catch (error) {
|
|
823
|
-
channel.post({
|
|
824
|
-
gen,
|
|
825
|
-
kind: "patchError",
|
|
826
|
-
message: String((error as Error)?.message ?? error),
|
|
827
|
-
});
|
|
853
|
+
channel.post({ gen, kind: "patchError", message: failureText(error) });
|
|
828
854
|
}
|
|
829
855
|
return;
|
|
830
856
|
}
|
|
@@ -835,14 +861,10 @@ export function startCanvasIframe(opts: {
|
|
|
835
861
|
if (msg.gen !== renderedGen || !shadowDoc) {
|
|
836
862
|
return;
|
|
837
863
|
}
|
|
838
|
-
|
|
864
|
+
shadowDoc.style = msg.style;
|
|
839
865
|
const rootEl = container.firstElementChild;
|
|
840
866
|
if (rootEl instanceof HTMLElement) {
|
|
841
|
-
reapplyStyle(
|
|
842
|
-
rootEl,
|
|
843
|
-
msg.style as JxStyle,
|
|
844
|
-
(shadowDoc as { $media?: Record<string, string> }).$media ?? {},
|
|
845
|
-
);
|
|
867
|
+
reapplyStyle(rootEl, msg.style, shadowDoc.$media ?? {});
|
|
846
868
|
}
|
|
847
869
|
return;
|
|
848
870
|
}
|
|
@@ -945,24 +967,22 @@ export function startCanvasIframe(opts: {
|
|
|
945
967
|
if (msg.kind === "redefineElement") {
|
|
946
968
|
/* The canvas half of embedding.md §7. The definition is replaced in THIS realm; instances
|
|
947
969
|
already on the canvas keep the old one until the host's next render replaces them. */
|
|
948
|
-
|
|
970
|
+
/* SAFETY: The host posts only the component definition a save just wrote
|
|
971
|
+
(`redefineElementOnCanvases`), a whole `.json` element document, and `redefineElement`
|
|
972
|
+
itself rejects one whose `tagName` is not a hyphenated literal. */
|
|
973
|
+
void redefineElement(msg.doc as JxDocument, msg.base);
|
|
949
974
|
return;
|
|
950
975
|
}
|
|
951
976
|
if (msg.kind === "setLocale") {
|
|
952
977
|
/* The other document-level attribute flip, and the whole visible half of an axis-3 locale:
|
|
953
978
|
`dir` is what makes an RTL preview actually mirror, and `lang` is what CSS's `:lang()` and
|
|
954
979
|
the font stack select on. Patch-free like the scheme above — the TEXT is whatever file is
|
|
955
|
-
open, because a translation in Jx is a different file rather than a different rendering.
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
root.removeAttribute("dir");
|
|
962
|
-
} else {
|
|
963
|
-
root.setAttribute("lang", msg.locale);
|
|
964
|
-
root.setAttribute("dir", msg.dir);
|
|
965
|
-
}
|
|
980
|
+
open, because a translation in Jx is a different file rather than a different rendering. */
|
|
981
|
+
applyPreviewLocale(
|
|
982
|
+
container.ownerDocument,
|
|
983
|
+
msg.locale === null ? null : { dir: msg.dir, locale: msg.locale },
|
|
984
|
+
localeBaseline,
|
|
985
|
+
);
|
|
966
986
|
return;
|
|
967
987
|
}
|
|
968
988
|
if (msg.kind === "siteStyleUpdate") {
|
|
@@ -974,6 +994,7 @@ export function startCanvasIframe(opts: {
|
|
|
974
994
|
return;
|
|
975
995
|
}
|
|
976
996
|
applyPreviewColorScheme(container.ownerDocument, msg.colorScheme ?? null);
|
|
997
|
+
applyPreviewLocale(container.ownerDocument, msg.locale ?? null, localeBaseline);
|
|
977
998
|
// A render replaces the DOM under a live edit session — COMMIT it first (never discard). The
|
|
978
999
|
// Resulting editCommit/editEnd post synchronously here, so on the FIFO channel they precede
|
|
979
1000
|
// This render's renderComplete and the parent routes them by the host's not-yet-flipped tab
|
|
@@ -988,6 +1009,8 @@ export function startCanvasIframe(opts: {
|
|
|
988
1009
|
// A document with no format, where the studio's own element metadata answers on its own.
|
|
989
1010
|
setEditableVerdicts(msg.editableTags ?? null);
|
|
990
1011
|
const { gen, mapperCtx } = msg;
|
|
1012
|
+
/* SAFETY: The host posts `shadowDoc` as a JSON round-trip of the tab's raw page document (or of
|
|
1013
|
+
the stylebook specimen), so it is a `JxMutableNode` in the forward-op coordinate space. */
|
|
991
1014
|
const rawDoc = msg.shadowDoc as JxMutableNode;
|
|
992
1015
|
void (async () => {
|
|
993
1016
|
try {
|
|
@@ -1002,9 +1025,11 @@ export function startCanvasIframe(opts: {
|
|
|
1002
1025
|
than a theoretical one. It used to be exactly that, one orphaned `<style>` per styled
|
|
1003
1026
|
element per render. */
|
|
1004
1027
|
resetDocumentStyles(container.ownerDocument);
|
|
1005
|
-
|
|
1028
|
+
const renderOpts: Parameters<typeof renderResolvedDocument>[0] = {
|
|
1006
1029
|
assets: versionedAssets(msg.assets ?? null),
|
|
1007
1030
|
container,
|
|
1031
|
+
/* SAFETY: The host posts `doc` as a JSON round-trip of `resolveCanvasDocument`'s render
|
|
1032
|
+
document (or the stylebook specimen), which is the resolved `JxDocument` it renders. */
|
|
1008
1033
|
doc: msg.doc as JxDocument,
|
|
1009
1034
|
docBase: msg.docBase,
|
|
1010
1035
|
mapperCtx: {
|
|
@@ -1019,8 +1044,11 @@ export function startCanvasIframe(opts: {
|
|
|
1019
1044
|
popoverOpen: msg.popoverOpen ? serializeJxPath(msg.popoverOpen) : null,
|
|
1020
1045
|
dialogOpen: msg.dialogOpen ? serializeJxPath(msg.dialogOpen) : null,
|
|
1021
1046
|
siteStyle: msg.siteStyle,
|
|
1022
|
-
|
|
1023
|
-
|
|
1047
|
+
};
|
|
1048
|
+
if (msg.allowAutoRequests) {
|
|
1049
|
+
renderOpts.allowAutoRequests = true;
|
|
1050
|
+
}
|
|
1051
|
+
handle = await renderResolvedDocument(renderOpts);
|
|
1024
1052
|
if (gen === latestGen) {
|
|
1025
1053
|
/* A render replaces the DOM, so the open attribute goes with it. The host sends the value
|
|
1026
1054
|
on the render message for exactly this reason; a frame that kept only its own copy
|
|
@@ -1042,7 +1070,7 @@ export function startCanvasIframe(opts: {
|
|
|
1042
1070
|
// BuildScope returns, and serializeDataScope reads defs[key], so the effect tracks those
|
|
1043
1071
|
// Refs and RE-POSTS an updated snapshot when the data settles (the host gen-gates stale
|
|
1044
1072
|
// Ones). Isolated in try/catch: a serialization failure never breaks the render ack above.
|
|
1045
|
-
const defs = handle.ctx
|
|
1073
|
+
const { defs } = handle.ctx;
|
|
1046
1074
|
stopDataScopeWatch = observeScope(() => {
|
|
1047
1075
|
try {
|
|
1048
1076
|
channel.post({ gen, kind: "dataScope", scope: serializeDataScope(defs) });
|
|
@@ -1054,11 +1082,7 @@ export function startCanvasIframe(opts: {
|
|
|
1054
1082
|
postContentHeight();
|
|
1055
1083
|
}
|
|
1056
1084
|
} catch (error) {
|
|
1057
|
-
channel.post({
|
|
1058
|
-
gen,
|
|
1059
|
-
kind: "renderError",
|
|
1060
|
-
message: String((error as Error)?.message ?? error),
|
|
1061
|
-
});
|
|
1085
|
+
channel.post({ gen, kind: "renderError", message: failureText(error) });
|
|
1062
1086
|
}
|
|
1063
1087
|
})();
|
|
1064
1088
|
});
|
|
@@ -1066,6 +1090,8 @@ export function startCanvasIframe(opts: {
|
|
|
1066
1090
|
channel.post({ kind: "ready" });
|
|
1067
1091
|
return () => {
|
|
1068
1092
|
off();
|
|
1093
|
+
// Leave the root as it booted, so a frame started after this one captures the same baseline.
|
|
1094
|
+
applyPreviewLocale(container.ownerDocument, null, localeBaseline);
|
|
1069
1095
|
stopInteraction();
|
|
1070
1096
|
stopKeyForwarding();
|
|
1071
1097
|
stopInlineEdit();
|
|
@@ -1094,7 +1120,9 @@ export function startCanvasIframe(opts: {
|
|
|
1094
1120
|
interface BootWindow {
|
|
1095
1121
|
location: { search: string };
|
|
1096
1122
|
document: { querySelector: (selectors: string) => Element | null; body: HTMLElement };
|
|
1097
|
-
parent: {
|
|
1123
|
+
parent: {
|
|
1124
|
+
postMessage: (message: CanvasEnvelope<IframeToParent>, targetOrigin: string) => void;
|
|
1125
|
+
};
|
|
1098
1126
|
addEventListener: (type: "message", listener: (event: MessageEvent) => void) => void;
|
|
1099
1127
|
removeEventListener: (type: "message", listener: (event: MessageEvent) => void) => void;
|
|
1100
1128
|
}
|
|
@@ -1111,7 +1139,7 @@ export function bootCanvasIframe(win: BootWindow): () => void {
|
|
|
1111
1139
|
setResolveToken(params.get("rpcToken"));
|
|
1112
1140
|
// ParentOrigin authenticates the parent peer. The host (iframe-host.ts) passes it ONLY for an
|
|
1113
1141
|
// Http(s) parent (dev / chromium — same-origin, the origin round-trips). It OMITS it for a
|
|
1114
|
-
// Non-http(s) parent (
|
|
1142
|
+
// Non-http(s) parent (a custom scheme), whose custom scheme may not surface as a postMessage
|
|
1115
1143
|
// Origin: a missing value here means fall back to "*" — token-gated, NOT a silent omission — and
|
|
1116
1144
|
// Log it loudly so the looser origin check is visible.
|
|
1117
1145
|
const explicitParentOrigin = params.get("parentOrigin");
|
|
@@ -1122,8 +1150,9 @@ export function bootCanvasIframe(win: BootWindow): () => void {
|
|
|
1122
1150
|
"The parent origin did not round-trip; the channel relies on the shared token alone.",
|
|
1123
1151
|
);
|
|
1124
1152
|
}
|
|
1125
|
-
|
|
1126
|
-
|
|
1153
|
+
// `canvas.html` draws `#jx-canvas-root` as a `<div>`; a page without it renders into `<body>`.
|
|
1154
|
+
const root = win.document.querySelector("#jx-canvas-root");
|
|
1155
|
+
const container = root instanceof HTMLElement ? root : win.document.body;
|
|
1127
1156
|
const channel = postMessageChannel<IframeToParent, ParentToIframe>({
|
|
1128
1157
|
acceptOrigin: parentOrigin,
|
|
1129
1158
|
source: win,
|
|
@@ -1136,5 +1165,5 @@ export function bootCanvasIframe(win: BootWindow): () => void {
|
|
|
1136
1165
|
|
|
1137
1166
|
// Boot only when actually loaded as the iframe document (has a real parent frame), never in tests.
|
|
1138
1167
|
if (typeof window !== "undefined" && window.parent !== window) {
|
|
1139
|
-
bootCanvasIframe(window
|
|
1168
|
+
bootCanvasIframe(window);
|
|
1140
1169
|
}
|
|
@@ -13,22 +13,39 @@
|
|
|
13
13
|
|
|
14
14
|
import { evaluateExpression } from "@jxsuite/runtime/expression";
|
|
15
15
|
import { resolveRef } from "@jxsuite/runtime";
|
|
16
|
+
import { isFunction, isJsonObject, isNonNullObject, isRef } from "@jxsuite/schema/guards";
|
|
16
17
|
import { formatPreviewValue } from "../utils/preview-format";
|
|
18
|
+
import type { PreviewValue } from "../utils/preview-format";
|
|
17
19
|
|
|
18
|
-
import type {
|
|
20
|
+
import type { JxScope } from "@jxsuite/runtime/types";
|
|
21
|
+
import type {
|
|
22
|
+
JsonValue,
|
|
23
|
+
JxDocumentValue,
|
|
24
|
+
JxExpressionNode,
|
|
25
|
+
JxMutableNode,
|
|
26
|
+
JxStateDefinition,
|
|
27
|
+
} from "@jxsuite/schema/types";
|
|
19
28
|
import type { EvalExprResult } from "./iframe-protocol";
|
|
20
29
|
|
|
21
|
-
|
|
30
|
+
/**
|
|
31
|
+
* Whether the raw (document) state entry is a pure named-formula (`$expression` + parameters).
|
|
32
|
+
*
|
|
33
|
+
* Looser than `isNamedFormulaDef`: an empty `parameters` array, or an `$expression` that is not an
|
|
34
|
+
* object, still qualifies.
|
|
35
|
+
*/
|
|
36
|
+
function isNamedFormulaEntry(
|
|
37
|
+
entry: JxStateDefinition | undefined,
|
|
38
|
+
): entry is JxStateDefinition & { parameters: JxDocumentValue[] } {
|
|
39
|
+
return isJsonObject(entry) && "$expression" in entry && Array.isArray(entry["parameters"]);
|
|
40
|
+
}
|
|
22
41
|
|
|
23
|
-
/**
|
|
24
|
-
function
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
Array.isArray((entry as { parameters?: unknown }).parameters)
|
|
31
|
-
);
|
|
42
|
+
/** A structured clone of `value`, or null when it holds something uncloneable (a function, a node). */
|
|
43
|
+
function cloneOrNull<T>(value: T): T | null {
|
|
44
|
+
try {
|
|
45
|
+
return structuredClone(value);
|
|
46
|
+
} catch {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
32
49
|
}
|
|
33
50
|
|
|
34
51
|
/**
|
|
@@ -38,21 +55,27 @@ function isNamedFormulaEntry(entry: unknown): boolean {
|
|
|
38
55
|
* callable (event handlers, structured-body functions, server fns) is dropped so a stray `call`
|
|
39
56
|
* can't run a side effect against the live canvas.
|
|
40
57
|
*/
|
|
41
|
-
export function cloneLiveScope(
|
|
42
|
-
|
|
58
|
+
export function cloneLiveScope(
|
|
59
|
+
defs: JxScope,
|
|
60
|
+
rawState: Record<string, JxStateDefinition> | null,
|
|
61
|
+
): JxScope {
|
|
62
|
+
const out: JxScope = {};
|
|
43
63
|
for (const key of Object.keys(defs)) {
|
|
44
64
|
try {
|
|
45
65
|
// Reading through the reactive proxy auto-unwraps a top-level ref/computed — and can throw (a
|
|
46
66
|
// Computed getter that throws), which maps the key to null instead of aborting the clone.
|
|
47
67
|
const value = defs[key];
|
|
48
|
-
if (
|
|
68
|
+
if (isFunction(value)) {
|
|
49
69
|
if (isNamedFormulaEntry(rawState?.[key])) {
|
|
50
70
|
out[key] = value; // A pure formula callable — safe (and needed) for `call` nodes.
|
|
51
71
|
}
|
|
52
72
|
continue;
|
|
53
73
|
}
|
|
54
|
-
|
|
55
|
-
|
|
74
|
+
/* SAFETY: A widening. `JSON.stringify` answers undefined for undefined, a symbol or a function,
|
|
75
|
+
which lib.d.ts's `string` return type leaves out. */
|
|
76
|
+
const json = JSON.stringify(value) as string | undefined;
|
|
77
|
+
// SAFETY: `json` is JSON.stringify's own output above, so it parses back to JSON data.
|
|
78
|
+
out[key] = json === undefined ? null : (JSON.parse(json) as JsonValue);
|
|
56
79
|
} catch {
|
|
57
80
|
out[key] = null;
|
|
58
81
|
}
|
|
@@ -69,44 +92,41 @@ export function cloneLiveScope(defs: Scope, rawState: Record<string, unknown> |
|
|
|
69
92
|
* chain naturally (an inner `items` ref may read the outer `$map/item`).
|
|
70
93
|
*/
|
|
71
94
|
export function bindRepeaterContext(
|
|
72
|
-
scope:
|
|
73
|
-
shadowDoc:
|
|
95
|
+
scope: JxScope,
|
|
96
|
+
shadowDoc: JxMutableNode | null,
|
|
74
97
|
contextPath: (string | number)[] | null,
|
|
75
|
-
):
|
|
98
|
+
): JxScope {
|
|
76
99
|
if (!contextPath || contextPath.length === 0) {
|
|
77
100
|
return scope;
|
|
78
101
|
}
|
|
79
|
-
let node:
|
|
102
|
+
let node: JxDocumentValue | undefined = shadowDoc;
|
|
80
103
|
let bound = scope;
|
|
81
104
|
for (const seg of contextPath) {
|
|
82
|
-
if (!node
|
|
105
|
+
if (!isNonNullObject(node)) {
|
|
83
106
|
break;
|
|
84
107
|
}
|
|
85
|
-
|
|
86
|
-
|
|
108
|
+
/* SAFETY: The shadow doc is JSON, so every non-null object on the walk is a document object or
|
|
109
|
+
array, and indexing either by a path segment yields another document value or undefined. */
|
|
110
|
+
const rec = node as Record<string, JxDocumentValue | undefined>;
|
|
111
|
+
if (rec["$prototype"] === "Array" && seg === "map") {
|
|
87
112
|
// Entering the repeater's template — bind the first item's context before descending.
|
|
88
|
-
const itemsDef = rec
|
|
89
|
-
const items:
|
|
90
|
-
itemsDef && typeof itemsDef === "object" && "$ref" in itemsDef
|
|
91
|
-
? resolveRef((itemsDef as { $ref: string }).$ref, bound)
|
|
92
|
-
: itemsDef;
|
|
113
|
+
const itemsDef = rec["items"];
|
|
114
|
+
const items = isRef(itemsDef) ? resolveRef(itemsDef.$ref, bound) : itemsDef;
|
|
93
115
|
if (Array.isArray(items) && items.length > 0) {
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
}
|
|
102
|
-
const child = Object.create(bound) as Scope;
|
|
103
|
-
child.$map = { index: 0, item };
|
|
116
|
+
const [first] = items;
|
|
117
|
+
// Items resolved from the shadow doc (a literal array) must not be mutable through the
|
|
118
|
+
// Preview scope — clone; scope-resolved items are already clone data, so this is free.
|
|
119
|
+
const item = cloneOrNull(first);
|
|
120
|
+
/* SAFETY: `Object.create(bound)` is an empty object whose prototype is the scope built so far,
|
|
121
|
+
so it is a scope that reads every outer key through and owns only the three set below. */
|
|
122
|
+
const child = Object.create(bound) as JxScope;
|
|
123
|
+
child["$map"] = { index: 0, item };
|
|
104
124
|
child["$map/item"] = item;
|
|
105
125
|
child["$map/index"] = 0;
|
|
106
126
|
bound = child;
|
|
107
127
|
}
|
|
108
128
|
}
|
|
109
|
-
node = rec[seg
|
|
129
|
+
node = rec[seg];
|
|
110
130
|
}
|
|
111
131
|
return bound;
|
|
112
132
|
}
|
|
@@ -118,30 +138,34 @@ export function bindRepeaterContext(
|
|
|
118
138
|
*/
|
|
119
139
|
export function evaluateLiveExprs(
|
|
120
140
|
exprs: { id: string; node: unknown }[],
|
|
121
|
-
defs:
|
|
122
|
-
shadowDoc:
|
|
141
|
+
defs: JxScope,
|
|
142
|
+
shadowDoc: JxMutableNode | null,
|
|
123
143
|
contextPath: (string | number)[] | null,
|
|
124
144
|
): EvalExprResult[] {
|
|
125
|
-
const rawState =
|
|
126
|
-
shadowDoc && typeof shadowDoc === "object"
|
|
127
|
-
? ((shadowDoc as { state?: Record<string, unknown> }).state ?? null)
|
|
128
|
-
: null;
|
|
145
|
+
const rawState = shadowDoc?.state ?? null;
|
|
129
146
|
return exprs.map(({ id, node }) => {
|
|
130
147
|
const values = new Map<string, string>();
|
|
131
148
|
// A fresh scope per expression: a mutating operator writes into this clone only, and can never
|
|
132
149
|
// Leak into the next expression's evaluation (or the live canvas).
|
|
133
|
-
let scope:
|
|
150
|
+
let scope: JxScope;
|
|
134
151
|
try {
|
|
135
152
|
scope = bindRepeaterContext(cloneLiveScope(defs, rawState), shadowDoc, contextPath);
|
|
136
153
|
} catch (error) {
|
|
137
154
|
return { error: error instanceof Error ? error.message : String(error), id, values: [] };
|
|
138
155
|
}
|
|
139
156
|
try {
|
|
140
|
-
if (!node ||
|
|
157
|
+
if (!isNonNullObject(node) || !("operator" in node)) {
|
|
141
158
|
throw new Error("not an expression node");
|
|
142
159
|
}
|
|
143
|
-
|
|
144
|
-
|
|
160
|
+
/* SAFETY: `operator` is the key every expression node carries, and `evaluateExpression`
|
|
161
|
+
validates the operator itself, throwing on an unknown one into the catch below. */
|
|
162
|
+
void evaluateExpression(node as JxExpressionNode, scope, null, undefined, {
|
|
163
|
+
report: (path, value) => {
|
|
164
|
+
/* SAFETY: the trace reports raw runtime values, and PreviewValue names every category a JS
|
|
165
|
+
value falls in (primitive, bigint, symbol, function, array, record); formatting relies on
|
|
166
|
+
nothing beyond what JSON.stringify and String() accept for any value. */
|
|
167
|
+
values.set(path.join("/"), formatPreviewValue(value as PreviewValue));
|
|
168
|
+
},
|
|
145
169
|
});
|
|
146
170
|
return { id, values: [...values.entries()] };
|
|
147
171
|
} catch (error) {
|