@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
|
@@ -32,6 +32,7 @@ import {
|
|
|
32
32
|
setDiffView,
|
|
33
33
|
stepDiff,
|
|
34
34
|
} from "./diff-view";
|
|
35
|
+
import { isString } from "@jxsuite/schema/guards";
|
|
35
36
|
import type { DiffView } from "./diff-view";
|
|
36
37
|
import type { ChangeStep } from "./diff-marks";
|
|
37
38
|
import { panToParentRect } from "./canvas-utils";
|
|
@@ -158,7 +159,7 @@ function describeStep(step: ChangeStep, index: number, total: number): string {
|
|
|
158
159
|
* it is, so a reveal that could not measure leaves a correct toolbar over an unmoved canvas.
|
|
159
160
|
*/
|
|
160
161
|
function onStepClick(paneId: string, delta: 1 | -1): void {
|
|
161
|
-
stepDiffAndReveal(paneId, delta).catch((error
|
|
162
|
+
stepDiffAndReveal(paneId, delta).catch((error) => {
|
|
162
163
|
console.warn("stepDiffAndReveal:", error);
|
|
163
164
|
});
|
|
164
165
|
}
|
|
@@ -180,8 +181,8 @@ export async function stepDiffAndReveal(paneId: string, delta: 1 | -1): Promise<
|
|
|
180
181
|
renderDiffToolbar(paneId);
|
|
181
182
|
const step = diffChangeMapOf(paneId)?.steps[landed];
|
|
182
183
|
const { panels } = surfaceForPane(paneId);
|
|
183
|
-
const original = panels[0]?.canvas
|
|
184
|
-
const current = panels[1]?.canvas
|
|
184
|
+
const original = panels[0]?.canvas;
|
|
185
|
+
const current = panels[1]?.canvas;
|
|
185
186
|
if (!step) {
|
|
186
187
|
return;
|
|
187
188
|
}
|
|
@@ -252,10 +253,10 @@ export function diffToolbarView(paneId: string): DiffToolbarView {
|
|
|
252
253
|
return {
|
|
253
254
|
codeChecked: showing === "code" ? "true" : "false",
|
|
254
255
|
countLabel,
|
|
255
|
-
degraded: !code && map
|
|
256
|
+
degraded: !code && map.degraded ? "shown" : "hidden",
|
|
256
257
|
nextDisabled: index >= total - 1,
|
|
257
258
|
prevDisabled: index <= 0,
|
|
258
|
-
rootKeys: !code && map
|
|
259
|
+
rootKeys: !code && map.rootKeys.length > 0 ? "shown" : "hidden",
|
|
259
260
|
rootKeysTitle: `Changed: ${map?.rootKeys.join(", ") ?? ""}`,
|
|
260
261
|
stepper: total === 0 ? "hidden" : "shown",
|
|
261
262
|
// A file the canvas cannot render arrives with a null map: there is no visual half to offer.
|
|
@@ -266,8 +267,8 @@ export function diffToolbarView(paneId: string): DiffToolbarView {
|
|
|
266
267
|
|
|
267
268
|
/** The pane a diff verb addresses: named, or the focused one. */
|
|
268
269
|
function paneOfArgs(args: CommandArgValues): string {
|
|
269
|
-
const { pane } = args
|
|
270
|
-
return
|
|
270
|
+
const { pane } = args;
|
|
271
|
+
return isString(pane) ? pane : workspace.activePaneId;
|
|
271
272
|
}
|
|
272
273
|
|
|
273
274
|
const paneProperty = stringProperty("Which pane to act on. Defaults to the focused one.");
|
|
@@ -58,7 +58,7 @@ export function applyEditWidth(surface: CanvasSurface, column: HTMLElement, widt
|
|
|
58
58
|
return;
|
|
59
59
|
}
|
|
60
60
|
column.style.maxWidth = `${Math.round(width)}px`;
|
|
61
|
-
if (
|
|
61
|
+
if (tab.session.ui.editZoom !== 1) {
|
|
62
62
|
applyEditZoom(surface);
|
|
63
63
|
}
|
|
64
64
|
const rendered = rectOf(column).width || width;
|
|
@@ -183,5 +183,8 @@ export function mountEditWidthHandle(
|
|
|
183
183
|
if (!handle || !column || _wired.has(handle)) {
|
|
184
184
|
return;
|
|
185
185
|
}
|
|
186
|
+
/* SAFETY: Every caller passes one of the two `jx-split` slots `surfaces/canvas-stage.json` draws
|
|
187
|
+
beside the column, and a `jx-split` carries the `value`/`min`/`max`/`collapse` share
|
|
188
|
+
properties `SplitElement` names; `bindSplit` only writes them. */
|
|
186
189
|
_wired.set(handle, bindSplit(handle as SplitElement, editWidthTarget(surface, column, grow)));
|
|
187
190
|
}
|
package/src/canvas/edit-width.ts
CHANGED
|
@@ -78,9 +78,7 @@ const _editWidths = new Map<string, EditWidthRecord>();
|
|
|
78
78
|
|
|
79
79
|
/** The size breakpoints and base width a tab renders against, site context included. */
|
|
80
80
|
function mediaEntriesOfTab(tab: Tab) {
|
|
81
|
-
return parseMediaEntries(
|
|
82
|
-
getEffectiveMedia(tab.doc.document?.$media as Record<string, string> | undefined),
|
|
83
|
-
);
|
|
81
|
+
return parseMediaEntries(getEffectiveMedia(tab.doc.document.$media));
|
|
84
82
|
}
|
|
85
83
|
|
|
86
84
|
/**
|
|
@@ -9,6 +9,8 @@
|
|
|
9
9
|
* plus an in-memory `fakeChannelPair` so cross-frame logic is unit-testable without a live iframe.
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
|
+
import { isNonNullObject } from "@jxsuite/schema/guards";
|
|
13
|
+
|
|
12
14
|
/**
|
|
13
15
|
* A typed, bidirectional message channel. `TOut` is what this side sends; `TIn` is what it
|
|
14
16
|
* receives. Implementations: a real `postMessage` channel over an `<iframe>` (added with the iframe
|
|
@@ -26,8 +28,14 @@ export interface IframeChannel<TOut, TIn> {
|
|
|
26
28
|
/** Envelope key that tags every cross-frame message so foreign `message` events are ignored. */
|
|
27
29
|
const ENVELOPE = "jx:canvas";
|
|
28
30
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
+
/** What crosses the frame boundary: the session token beside the typed message it authenticates. */
|
|
32
|
+
export interface CanvasEnvelope<T> {
|
|
33
|
+
[ENVELOPE]: string;
|
|
34
|
+
payload: T;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
interface PostMessageTarget<TOut> {
|
|
38
|
+
postMessage: (message: CanvasEnvelope<TOut>, targetOrigin: string) => void;
|
|
31
39
|
}
|
|
32
40
|
|
|
33
41
|
interface MessageSource {
|
|
@@ -46,7 +54,7 @@ interface MessageSource {
|
|
|
46
54
|
* origin.
|
|
47
55
|
*/
|
|
48
56
|
export function postMessageChannel<TOut, TIn>(opts: {
|
|
49
|
-
target: PostMessageTarget
|
|
57
|
+
target: PostMessageTarget<TOut>;
|
|
50
58
|
source: MessageSource;
|
|
51
59
|
targetOrigin: string;
|
|
52
60
|
acceptOrigin: string;
|
|
@@ -59,12 +67,15 @@ export function postMessageChannel<TOut, TIn>(opts: {
|
|
|
59
67
|
if (acceptOrigin !== "*" && event.origin !== acceptOrigin) {
|
|
60
68
|
return;
|
|
61
69
|
}
|
|
62
|
-
const
|
|
63
|
-
if (!
|
|
70
|
+
const envelope: unknown = event.data;
|
|
71
|
+
if (!isNonNullObject(envelope) || !(ENVELOPE in envelope) || envelope[ENVELOPE] !== token) {
|
|
64
72
|
return;
|
|
65
73
|
}
|
|
74
|
+
/* SAFETY: The envelope carries this session's secret token, which only the peer channel holds,
|
|
75
|
+
and that peer's `post` is typed to send exactly `TIn`; a foreign page cannot forge the token. */
|
|
76
|
+
const payload = ("payload" in envelope ? envelope.payload : undefined) as TIn;
|
|
66
77
|
for (const handler of handlers) {
|
|
67
|
-
handler(
|
|
78
|
+
handler(payload);
|
|
68
79
|
}
|
|
69
80
|
};
|
|
70
81
|
source.addEventListener("message", listener);
|
|
@@ -84,19 +95,22 @@ export function postMessageChannel<TOut, TIn>(opts: {
|
|
|
84
95
|
};
|
|
85
96
|
}
|
|
86
97
|
|
|
98
|
+
/** Both ends of an in-memory channel, and the controls that deliver what they posted. */
|
|
99
|
+
export interface FakeChannelPair<ParentOut, IframeOut> {
|
|
100
|
+
parent: IframeChannel<ParentOut, IframeOut>;
|
|
101
|
+
iframe: IframeChannel<IframeOut, ParentOut>;
|
|
102
|
+
flush: () => void;
|
|
103
|
+
/** Number of messages waiting to be delivered (both directions). */
|
|
104
|
+
pending: () => number;
|
|
105
|
+
}
|
|
106
|
+
|
|
87
107
|
/**
|
|
88
108
|
* Two in-memory channels wired to each other for tests. A message `parent.post(x)` is delivered to
|
|
89
109
|
* the `iframe` side's handlers (and vice versa) only when `flush()` is called — so tests drive the
|
|
90
110
|
* inherently-async postMessage ordering deterministically. Messages posted _during_ a flush are
|
|
91
111
|
* queued for the next flush, never delivered re-entrantly.
|
|
92
112
|
*/
|
|
93
|
-
export function fakeChannelPair<ParentOut, IframeOut>(): {
|
|
94
|
-
parent: IframeChannel<ParentOut, IframeOut>;
|
|
95
|
-
iframe: IframeChannel<IframeOut, ParentOut>;
|
|
96
|
-
flush: () => void;
|
|
97
|
-
/** Number of messages waiting to be delivered (both directions). */
|
|
98
|
-
pending: () => number;
|
|
99
|
-
} {
|
|
113
|
+
export function fakeChannelPair<ParentOut, IframeOut>(): FakeChannelPair<ParentOut, IframeOut> {
|
|
100
114
|
let toIframe: ParentOut[] = [];
|
|
101
115
|
let toParent: IframeOut[] = [];
|
|
102
116
|
const iframeHandlers = new Set<(m: ParentOut) => void>();
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
*/
|
|
18
18
|
|
|
19
19
|
import { parseJxPath } from "./path-mapping";
|
|
20
|
-
import { displayTagName } from "@jxsuite/schema/guards";
|
|
20
|
+
import { displayTagName, isNonNullObject } from "@jxsuite/schema/guards";
|
|
21
21
|
import { rectOf, elementAtPoint } from "../utils/geometry";
|
|
22
22
|
import { getNodeAtPath, isAncestor, pathsEqual } from "../state";
|
|
23
23
|
import type { DragSrcKind, DropPreview } from "./iframe-protocol";
|
|
@@ -46,15 +46,104 @@ const VOID_TAGS = new Set([
|
|
|
46
46
|
"wbr",
|
|
47
47
|
]);
|
|
48
48
|
|
|
49
|
+
/**
|
|
50
|
+
* Phrasing content (HTML's content model) that is NOT also an embedded or interactive block an
|
|
51
|
+
* author drops as its own block: text-level elements. Only these may land inside a paragraph. An
|
|
52
|
+
* image, a video and a component are phrasing by the letter of HTML, but a card dragged from the
|
|
53
|
+
* Site panel onto a paragraph means "put it here", not "glue it into this sentence": in Markdown
|
|
54
|
+
* the latter serialises as an inline directive or image stuck to the text.
|
|
55
|
+
*/
|
|
56
|
+
const TEXT_LEVEL_TAGS = new Set([
|
|
57
|
+
"a",
|
|
58
|
+
"abbr",
|
|
59
|
+
"b",
|
|
60
|
+
"bdi",
|
|
61
|
+
"bdo",
|
|
62
|
+
"br",
|
|
63
|
+
"cite",
|
|
64
|
+
"code",
|
|
65
|
+
"data",
|
|
66
|
+
"del",
|
|
67
|
+
"dfn",
|
|
68
|
+
"em",
|
|
69
|
+
"i",
|
|
70
|
+
"ins",
|
|
71
|
+
"kbd",
|
|
72
|
+
"mark",
|
|
73
|
+
"q",
|
|
74
|
+
"s",
|
|
75
|
+
"samp",
|
|
76
|
+
"small",
|
|
77
|
+
"span",
|
|
78
|
+
"strong",
|
|
79
|
+
"sub",
|
|
80
|
+
"sup",
|
|
81
|
+
"time",
|
|
82
|
+
"u",
|
|
83
|
+
"var",
|
|
84
|
+
"wbr",
|
|
85
|
+
]);
|
|
86
|
+
|
|
87
|
+
/** Elements whose content model is phrasing only: a block dropped inside one breaks it. */
|
|
88
|
+
const PHRASING_HOSTS = new Set([
|
|
89
|
+
...TEXT_LEVEL_TAGS,
|
|
90
|
+
"button",
|
|
91
|
+
"dt",
|
|
92
|
+
"h1",
|
|
93
|
+
"h2",
|
|
94
|
+
"h3",
|
|
95
|
+
"h4",
|
|
96
|
+
"h5",
|
|
97
|
+
"h6",
|
|
98
|
+
"label",
|
|
99
|
+
"legend",
|
|
100
|
+
"p",
|
|
101
|
+
"pre",
|
|
102
|
+
"summary",
|
|
103
|
+
]);
|
|
104
|
+
|
|
105
|
+
/** A node's tag, lower-cased, `div` when it names none. */
|
|
106
|
+
function tagOf(node: JxMutableNode | null | undefined): string {
|
|
107
|
+
return (displayTagName(node?.tagName) || "div").toLowerCase();
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/** Whether the dragged thing is text-level content, which may be placed inside a paragraph. */
|
|
111
|
+
function isTextLevelSource(src: DragSrcKind, shadowDoc: JxMutableNode): boolean {
|
|
112
|
+
const tag = src.type === "block" ? (src.tag ?? "") : tagOf(getNodeAtPath(shadowDoc, src.path));
|
|
113
|
+
return TEXT_LEVEL_TAGS.has(tag.toLowerCase());
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* The outermost phrasing host at or above `el` (the paragraph around a `<strong>`), or null when
|
|
118
|
+
* `el` is in none. A block is placed beside that host, never inside it.
|
|
119
|
+
*/
|
|
120
|
+
function phrasingHostOf(el: HTMLElement, shadowDoc: JxMutableNode): HTMLElement | null {
|
|
121
|
+
let host: HTMLElement | null = null;
|
|
122
|
+
let current: HTMLElement | null = el;
|
|
123
|
+
while (current) {
|
|
124
|
+
const path = parseJxPath(current.dataset.jxPath ?? "");
|
|
125
|
+
if (path.length === 0) {
|
|
126
|
+
break;
|
|
127
|
+
}
|
|
128
|
+
if (PHRASING_HOSTS.has(tagOf(getNodeAtPath(shadowDoc, path)))) {
|
|
129
|
+
host = current;
|
|
130
|
+
}
|
|
131
|
+
current = nearestPathEl(current.parentElement);
|
|
132
|
+
}
|
|
133
|
+
return host;
|
|
134
|
+
}
|
|
135
|
+
|
|
49
136
|
/**
|
|
50
137
|
* Walk up from an element to the nearest ancestor carrying a `data-jx-path`. Refactored out of the
|
|
51
138
|
* `nearestHit` walk (iframe-interaction.ts) to take an element directly so the hit-test adapter can
|
|
52
139
|
* reuse it. Returns null when no addressable node is found.
|
|
53
140
|
*/
|
|
54
141
|
function nearestPathEl(start: Element | null): HTMLElement | null {
|
|
55
|
-
|
|
142
|
+
// Only an `HTMLElement` is ever stamped (`makeStamper` skips every other node), so the walk
|
|
143
|
+
// Passes over SVG and other foreign elements on its way up.
|
|
144
|
+
let el = start;
|
|
56
145
|
while (el) {
|
|
57
|
-
if (el.dataset
|
|
146
|
+
if (el instanceof HTMLElement && el.dataset.jxPath) {
|
|
58
147
|
return el;
|
|
59
148
|
}
|
|
60
149
|
el = el.parentElement;
|
|
@@ -94,15 +183,15 @@ export function computeDropInstruction(
|
|
|
94
183
|
shadowDoc: JxMutableNode,
|
|
95
184
|
src: DragSrcKind,
|
|
96
185
|
): DropPreview | null {
|
|
97
|
-
const serialized = targetEl.dataset
|
|
186
|
+
const serialized = targetEl.dataset.jxPath;
|
|
98
187
|
if (serialized == null) {
|
|
99
188
|
return null;
|
|
100
189
|
}
|
|
101
|
-
const targetPath = parseJxPath(serialized)
|
|
190
|
+
const targetPath = parseJxPath(serialized);
|
|
102
191
|
|
|
103
192
|
// Root: pick the nearest child edge among the element's element children.
|
|
104
193
|
if (targetPath.length === 0) {
|
|
105
|
-
const children = [...targetEl.children]
|
|
194
|
+
const children = [...targetEl.children];
|
|
106
195
|
if (children.length === 0) {
|
|
107
196
|
return canDrop(src, targetPath)
|
|
108
197
|
? {
|
|
@@ -120,11 +209,30 @@ export function computeDropInstruction(
|
|
|
120
209
|
return null;
|
|
121
210
|
}
|
|
122
211
|
|
|
123
|
-
|
|
212
|
+
/* A block over a paragraph (or anything inside one) lands above or below the paragraph: a
|
|
213
|
+
component or an image nested in a `<p>` is serialised glued to its text. */
|
|
214
|
+
const host = isTextLevelSource(src, shadowDoc) ? null : phrasingHostOf(targetEl, shadowDoc);
|
|
215
|
+
if (host) {
|
|
216
|
+
const hostPath = parseJxPath(host.dataset.jxPath ?? "");
|
|
217
|
+
if (!canDrop(src, hostPath)) {
|
|
218
|
+
return null;
|
|
219
|
+
}
|
|
220
|
+
const hostRect = rectFor(host);
|
|
221
|
+
const hostRelY = hostRect.height === 0 ? 0 : (cursorY - hostRect.y) / hostRect.height;
|
|
222
|
+
return hostRelY < 0.5
|
|
223
|
+
? { edge: "top", instruction: "reorder-above", referenceRect: hostRect, targetPath: hostPath }
|
|
224
|
+
: {
|
|
225
|
+
edge: "bottom",
|
|
226
|
+
instruction: "reorder-below",
|
|
227
|
+
referenceRect: hostRect,
|
|
228
|
+
targetPath: hostPath,
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
const node = getNodeAtPath(shadowDoc, targetPath);
|
|
124
233
|
const tag = (displayTagName(node?.tagName) || "div").toLowerCase();
|
|
125
234
|
const hasElementChildren =
|
|
126
|
-
Array.isArray(node?.children) &&
|
|
127
|
-
node.children.some((c: unknown) => c != null && typeof c === "object");
|
|
235
|
+
Array.isArray(node?.children) && node.children.some((c) => isNonNullObject(c));
|
|
128
236
|
const isLeaf = VOID_TAGS.has(tag) || !hasElementChildren;
|
|
129
237
|
|
|
130
238
|
const rect = rectFor(targetEl);
|
|
@@ -150,7 +258,7 @@ export function computeDropInstruction(
|
|
|
150
258
|
* parentElementPath(slice(0,-2)) / childIndex(at(-1)) read the same parent + index.
|
|
151
259
|
*/
|
|
152
260
|
function nearestChildEdge(
|
|
153
|
-
children:
|
|
261
|
+
children: Element[],
|
|
154
262
|
cursorY: number,
|
|
155
263
|
parentPath: JxPath,
|
|
156
264
|
src: DragSrcKind,
|
|
@@ -175,7 +283,7 @@ function nearestChildEdge(
|
|
|
175
283
|
}
|
|
176
284
|
}
|
|
177
285
|
|
|
178
|
-
const childPath = [...parentPath, "children", closestIdx]
|
|
286
|
+
const childPath: JxPath = [...parentPath, "children", closestIdx];
|
|
179
287
|
if (!canDrop(src, childPath)) {
|
|
180
288
|
return null;
|
|
181
289
|
}
|
|
@@ -192,7 +300,7 @@ function canDrop(src: DragSrcKind, targetPath: JxPath): boolean {
|
|
|
192
300
|
if (src.type !== "tree-node") {
|
|
193
301
|
return true;
|
|
194
302
|
}
|
|
195
|
-
const srcPath = src.path
|
|
303
|
+
const srcPath = src.path;
|
|
196
304
|
if (pathsEqual(srcPath, targetPath)) {
|
|
197
305
|
return false;
|
|
198
306
|
}
|
|
@@ -35,6 +35,7 @@ import {
|
|
|
35
35
|
toDomPosition,
|
|
36
36
|
} from "./iframe-position";
|
|
37
37
|
import { serializeJxPath } from "./path-mapping";
|
|
38
|
+
import { isFunction } from "@jxsuite/schema/guards";
|
|
38
39
|
import type { DocPos, DocRange, EditablePredicate } from "./iframe-position";
|
|
39
40
|
import type { JxPath } from "../state";
|
|
40
41
|
|
|
@@ -167,6 +168,14 @@ export interface EditableRootHandle {
|
|
|
167
168
|
isComposing: () => boolean;
|
|
168
169
|
}
|
|
169
170
|
|
|
171
|
+
/**
|
|
172
|
+
* Whether an element carries `dataset`. HTML, SVG and MathML elements all mix in
|
|
173
|
+
* `HTMLOrSVGElement`; an element from any other namespace has no `dataset` at all.
|
|
174
|
+
*/
|
|
175
|
+
function hasDataset(el: Element): el is Element & HTMLOrSVGElement {
|
|
176
|
+
return "dataset" in el;
|
|
177
|
+
}
|
|
178
|
+
|
|
170
179
|
/** Wire the editing host on `container`. */
|
|
171
180
|
export function startEditableRoot(
|
|
172
181
|
container: HTMLElement,
|
|
@@ -183,13 +192,13 @@ export function startEditableRoot(
|
|
|
183
192
|
return mode === undefined || mode === "design" || mode === "edit";
|
|
184
193
|
};
|
|
185
194
|
|
|
186
|
-
/** Pending idle-commit timer, or
|
|
187
|
-
let commitTimer =
|
|
195
|
+
/** Pending idle-commit timer, or null when none is armed. */
|
|
196
|
+
let commitTimer: ReturnType<typeof setTimeout> | null = null;
|
|
188
197
|
|
|
189
198
|
const cancelCommitTick = () => {
|
|
190
|
-
if (commitTimer) {
|
|
199
|
+
if (commitTimer !== null) {
|
|
191
200
|
clearTimeout(commitTimer);
|
|
192
|
-
commitTimer =
|
|
201
|
+
commitTimer = null;
|
|
193
202
|
}
|
|
194
203
|
};
|
|
195
204
|
|
|
@@ -202,7 +211,7 @@ export function startEditableRoot(
|
|
|
202
211
|
* idle commit invisible — without it, typing would jump the caret every time you paused.
|
|
203
212
|
*/
|
|
204
213
|
const commitTick = () => {
|
|
205
|
-
commitTimer =
|
|
214
|
+
commitTimer = null;
|
|
206
215
|
if (!activeEl || !deps.onCommitTick) {
|
|
207
216
|
return;
|
|
208
217
|
}
|
|
@@ -233,7 +242,7 @@ export function startEditableRoot(
|
|
|
233
242
|
return;
|
|
234
243
|
}
|
|
235
244
|
cancelCommitTick();
|
|
236
|
-
commitTimer = setTimeout(commitTick, deps.commitDelayMs ?? COMMIT_IDLE_MS)
|
|
245
|
+
commitTimer = setTimeout(commitTick, deps.commitDelayMs ?? COMMIT_IDLE_MS);
|
|
237
246
|
};
|
|
238
247
|
|
|
239
248
|
const onCompositionStart = () => {
|
|
@@ -349,7 +358,8 @@ export function startEditableRoot(
|
|
|
349
358
|
const affectedRange = (
|
|
350
359
|
e: InputEvent,
|
|
351
360
|
): { from: DocPos; to: DocPos; endEl: HTMLElement } | null => {
|
|
352
|
-
|
|
361
|
+
// Happy-dom ships no `getTargetRanges` at all, so the method's presence is probed, not assumed.
|
|
362
|
+
const [target] = isFunction(e.getTargetRanges) ? e.getTargetRanges() : [];
|
|
353
363
|
const sel = doc.getSelection();
|
|
354
364
|
const useSelection = sel && sel.rangeCount > 0 && (sel.isCollapsed || !target);
|
|
355
365
|
let startNode: Node | null;
|
|
@@ -370,8 +380,7 @@ export function startEditableRoot(
|
|
|
370
380
|
return from && to && endBlock ? { endEl: endBlock.el, from, to } : null;
|
|
371
381
|
};
|
|
372
382
|
|
|
373
|
-
const onBeforeInput = (
|
|
374
|
-
const e = event as InputEvent;
|
|
383
|
+
const onBeforeInput = (e: InputEvent) => {
|
|
375
384
|
if (!editingAllowed()) {
|
|
376
385
|
return;
|
|
377
386
|
}
|
|
@@ -435,21 +444,25 @@ export function startEditableRoot(
|
|
|
435
444
|
if (!editingAllowed() || !deps.onPropActivate) {
|
|
436
445
|
return;
|
|
437
446
|
}
|
|
438
|
-
let el = e.target instanceof Element ?
|
|
447
|
+
let el = e.target instanceof Element ? e.target : null;
|
|
439
448
|
while (el && el !== container) {
|
|
440
|
-
if (el.dataset
|
|
441
|
-
|
|
449
|
+
if (hasDataset(el) && el.dataset.jxBoundProp) {
|
|
450
|
+
/* SAFETY: The runtime builds SVG and MathML nodes as `createElementNS(...) as HTMLElement`
|
|
451
|
+
and stamps `data-jx-bound-prop` through that same `HTMLElement`-typed path, so a
|
|
452
|
+
foreign-namespace prop host already travels downstream as an `HTMLElement`. */
|
|
453
|
+
const host = el as HTMLElement;
|
|
454
|
+
if (host !== activeEl) {
|
|
442
455
|
deactivate();
|
|
443
|
-
if (deps.onPropActivate(
|
|
456
|
+
if (deps.onPropActivate(host)) {
|
|
444
457
|
// Adopt the nested host so the caret landing inside it is not read as a block change.
|
|
445
|
-
activeEl =
|
|
458
|
+
activeEl = host;
|
|
446
459
|
activeKey = null;
|
|
447
460
|
}
|
|
448
461
|
}
|
|
449
462
|
return;
|
|
450
463
|
}
|
|
451
464
|
// A stamped page block first means this is ordinary page DOM, not component internals.
|
|
452
|
-
if (el.dataset
|
|
465
|
+
if (hasDataset(el) && el.dataset.jxPath) {
|
|
453
466
|
return;
|
|
454
467
|
}
|
|
455
468
|
el = el.parentElement;
|
|
@@ -493,7 +506,7 @@ export function startEditableRoot(
|
|
|
493
506
|
if (composing) {
|
|
494
507
|
return;
|
|
495
508
|
}
|
|
496
|
-
if (commitTimer) {
|
|
509
|
+
if (commitTimer !== null) {
|
|
497
510
|
cancelCommitTick();
|
|
498
511
|
commitTick();
|
|
499
512
|
}
|