@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,7 +7,9 @@
|
|
|
7
7
|
* boundary.
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
|
-
import {
|
|
10
|
+
import { getNodeAtPath } from "@jxsuite/schema/doc-ops";
|
|
11
|
+
import { isNonNullObject, isNumber, isString } from "@jxsuite/schema/guards";
|
|
12
|
+
import { childIndex, parentElementPath } from "../store";
|
|
11
13
|
import { isAncestor } from "../state";
|
|
12
14
|
import { isTabActive } from "../workspace/workspace";
|
|
13
15
|
import {
|
|
@@ -18,12 +20,14 @@ import {
|
|
|
18
20
|
transactDoc,
|
|
19
21
|
} from "../tabs/transact";
|
|
20
22
|
import { defaultDef } from "../panels/shared";
|
|
23
|
+
import { componentInstance, mutateImportComponent } from "./insert-component";
|
|
21
24
|
|
|
22
25
|
import { contentLength, contentOf, spliceAcross, toStored } from "./content-slice";
|
|
23
26
|
import type { JxContentResult, SlashCommand } from "./inline-edit";
|
|
24
27
|
import type { JxPath } from "../state";
|
|
25
28
|
import type { Tab } from "../tabs/tab";
|
|
26
29
|
import type { JxMutableNode } from "@jxsuite/schema/types";
|
|
30
|
+
import type { SpliceCoordinate } from "../tabs/selection";
|
|
27
31
|
|
|
28
32
|
/**
|
|
29
33
|
* Whether a committed inline-edit result is effectively empty (blank text / lone whitespace /
|
|
@@ -43,10 +47,21 @@ export function isEmptyContent(commitData?: JxContentResult): boolean {
|
|
|
43
47
|
if (kids.length === 0) {
|
|
44
48
|
return true;
|
|
45
49
|
}
|
|
46
|
-
|
|
50
|
+
const [only] = kids;
|
|
51
|
+
if (kids.length === 1 && isString(only) && only.trim() === "") {
|
|
47
52
|
return true;
|
|
48
53
|
}
|
|
49
|
-
|
|
54
|
+
// The result crossed the frame boundary as JSON, so a `null` child is excluded here explicitly.
|
|
55
|
+
return kids.length === 1 && isNonNullObject(only) && only.tagName === "br";
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/** The slot of the block at `path`. */
|
|
59
|
+
function blockSlot(path: JxPath): SpliceCoordinate {
|
|
60
|
+
/* SAFETY: a block with a sibling position has an element path ending in `"children", <index>`, so
|
|
61
|
+
it has a parent element path and its last segment is the numeric child index. A repeater's
|
|
62
|
+
template root (`…, "map"`) is editable too; callers do not exclude that case yet, so it reaches
|
|
63
|
+
here with a string segment exactly as before this cast. */
|
|
64
|
+
return { index: childIndex(path) as number, parentPath: parentElementPath(path) as JxPath };
|
|
50
65
|
}
|
|
51
66
|
|
|
52
67
|
/**
|
|
@@ -126,7 +141,7 @@ export function applyInlinePropCommit(
|
|
|
126
141
|
if (!node) {
|
|
127
142
|
return false;
|
|
128
143
|
}
|
|
129
|
-
const current =
|
|
144
|
+
const current = node.$props?.[prop];
|
|
130
145
|
if (`${current ?? ""}` === value) {
|
|
131
146
|
return false;
|
|
132
147
|
}
|
|
@@ -155,8 +170,8 @@ export function applyBlockMerge(
|
|
|
155
170
|
if (!tab) {
|
|
156
171
|
return null;
|
|
157
172
|
}
|
|
158
|
-
const from = getNodeAtPath(tab.doc.document, fromPath)
|
|
159
|
-
const into = getNodeAtPath(tab.doc.document, intoPath)
|
|
173
|
+
const from = getNodeAtPath(tab.doc.document, fromPath);
|
|
174
|
+
const into = getNodeAtPath(tab.doc.document, intoPath);
|
|
160
175
|
if (!from || !into) {
|
|
161
176
|
return null;
|
|
162
177
|
}
|
|
@@ -184,8 +199,11 @@ export function applyBlockMerge(
|
|
|
184
199
|
mutateUpdateProperty(t, intoPath, "textContent", merged.textContent ?? "");
|
|
185
200
|
}
|
|
186
201
|
mutateRemoveNode(t, fromPath);
|
|
187
|
-
|
|
188
|
-
|
|
202
|
+
/* A container emptied by the removal (the `<ul>` behind a list's last item) would otherwise
|
|
203
|
+
linger as invisible structure that still occupies layout and shows up in the layers panel.
|
|
204
|
+
SAFETY: `fromPath` is not the root (the ancestor check above refuses `[]`), and any node below
|
|
205
|
+
the root is addressed by at least two segments (`"children", <index>`, `"cases", <name>`, or
|
|
206
|
+
`"map"` under its repeater), so parentElementPath returns a path. */
|
|
189
207
|
pruneEmptyAncestors(t, parentElementPath(fromPath) as JxPath);
|
|
190
208
|
if (isTabActive(tab)) {
|
|
191
209
|
t.session.selection = [intoPath];
|
|
@@ -202,12 +220,12 @@ export function applyBlockMerge(
|
|
|
202
220
|
function pruneEmptyAncestors(tab: Tab, path: JxPath): void {
|
|
203
221
|
let cur = path;
|
|
204
222
|
while (cur.length > 0) {
|
|
205
|
-
const node = getNodeAtPath(tab.doc.document, cur)
|
|
223
|
+
const node = getNodeAtPath(tab.doc.document, cur);
|
|
206
224
|
const kids = node?.children;
|
|
207
225
|
if (!node || !Array.isArray(kids) || kids.length > 0) {
|
|
208
226
|
return;
|
|
209
227
|
}
|
|
210
|
-
const parent = parentElementPath(cur)
|
|
228
|
+
const parent = parentElementPath(cur);
|
|
211
229
|
mutateRemoveNode(tab, cur);
|
|
212
230
|
if (!parent) {
|
|
213
231
|
return;
|
|
@@ -227,8 +245,7 @@ export function applyInlineSplit(
|
|
|
227
245
|
before: JxContentResult,
|
|
228
246
|
after: JxContentResult,
|
|
229
247
|
): JxPath {
|
|
230
|
-
const parentPath =
|
|
231
|
-
const idx = childIndex(path) as number;
|
|
248
|
+
const { parentPath, index: idx } = blockSlot(path);
|
|
232
249
|
const newPath = [...parentPath, "children", idx + 1];
|
|
233
250
|
if (!tab) {
|
|
234
251
|
return newPath;
|
|
@@ -260,6 +277,45 @@ export function applyInlineSplit(
|
|
|
260
277
|
return newPath;
|
|
261
278
|
}
|
|
262
279
|
|
|
280
|
+
/**
|
|
281
|
+
* A slash pick from the Components group (§5.7): the empty block the "/" was typed in is REPLACED
|
|
282
|
+
* by an instance of the component, and a block with content keeps it and gets the instance after
|
|
283
|
+
* it. Either way the component is imported, as a drop of the same component would import it. An
|
|
284
|
+
* instance is a whole element with its own `$props` and slot content, so swapping a tag in place —
|
|
285
|
+
* what an HTML pick does — would leave a paragraph's leftovers inside a component.
|
|
286
|
+
*/
|
|
287
|
+
function insertComponentBlock(
|
|
288
|
+
tab: Tab | null,
|
|
289
|
+
path: JxPath,
|
|
290
|
+
instance: JxMutableNode,
|
|
291
|
+
commitData: JxContentResult | undefined,
|
|
292
|
+
): JxPath {
|
|
293
|
+
const { parentPath, index: idx } = blockSlot(path);
|
|
294
|
+
const replace = isEmptyContent(commitData);
|
|
295
|
+
const at = replace ? idx : idx + 1;
|
|
296
|
+
const newPath = [...parentPath, "children", at];
|
|
297
|
+
if (!tab) {
|
|
298
|
+
return newPath;
|
|
299
|
+
}
|
|
300
|
+
transactDoc(tab, (t) => {
|
|
301
|
+
if (replace) {
|
|
302
|
+
mutateRemoveNode(t, path);
|
|
303
|
+
} else if (commitData?.children) {
|
|
304
|
+
mutateUpdateProperty(t, path, "textContent");
|
|
305
|
+
mutateUpdateProperty(t, path, "children", commitData.children);
|
|
306
|
+
} else if (commitData?.textContent != null) {
|
|
307
|
+
mutateUpdateProperty(t, path, "children");
|
|
308
|
+
mutateUpdateProperty(t, path, "textContent", commitData.textContent);
|
|
309
|
+
}
|
|
310
|
+
mutateInsertNode(t, parentPath, at, instance);
|
|
311
|
+
mutateImportComponent(t, instance.tagName);
|
|
312
|
+
if (isTabActive(tab)) {
|
|
313
|
+
t.session.selection = [newPath];
|
|
314
|
+
}
|
|
315
|
+
});
|
|
316
|
+
return newPath;
|
|
317
|
+
}
|
|
318
|
+
|
|
263
319
|
/**
|
|
264
320
|
* Apply a slash-insert at `path` of `tab`'s document: swap the (empty) node's tag in place, or
|
|
265
321
|
* commit pending content and insert a new element after it. Returns the path to edit next (the
|
|
@@ -271,6 +327,10 @@ export function applyInlineInsert(
|
|
|
271
327
|
cmd: SlashCommand,
|
|
272
328
|
commitData: JxContentResult | undefined,
|
|
273
329
|
): JxPath {
|
|
330
|
+
const instance = cmd.component === true ? componentInstance(cmd.tag) : null;
|
|
331
|
+
if (instance) {
|
|
332
|
+
return insertComponentBlock(tab, path, instance, commitData);
|
|
333
|
+
}
|
|
274
334
|
if (isEmptyContent(commitData)) {
|
|
275
335
|
if (!tab) {
|
|
276
336
|
return path;
|
|
@@ -291,8 +351,7 @@ export function applyInlineInsert(
|
|
|
291
351
|
return path;
|
|
292
352
|
}
|
|
293
353
|
|
|
294
|
-
const parentPath =
|
|
295
|
-
const idx = childIndex(path) as number;
|
|
354
|
+
const { parentPath, index: idx } = blockSlot(path);
|
|
296
355
|
const newPath = [...parentPath, "children", idx + 1];
|
|
297
356
|
if (!tab) {
|
|
298
357
|
return newPath;
|
|
@@ -336,8 +395,8 @@ export function applyRangeReplace(
|
|
|
336
395
|
if (!tab) {
|
|
337
396
|
return null;
|
|
338
397
|
}
|
|
339
|
-
const head = getNodeAtPath(tab.doc.document, from.path)
|
|
340
|
-
const tail = getNodeAtPath(tab.doc.document, to.path)
|
|
398
|
+
const head = getNodeAtPath(tab.doc.document, from.path);
|
|
399
|
+
const tail = getNodeAtPath(tab.doc.document, to.path);
|
|
341
400
|
if (!head || !tail) {
|
|
342
401
|
return null;
|
|
343
402
|
}
|
|
@@ -366,6 +425,9 @@ export function applyRangeReplace(
|
|
|
366
425
|
for (const path of removals) {
|
|
367
426
|
if (getNodeAtPath(t.doc.document, path)) {
|
|
368
427
|
mutateRemoveNode(t, path);
|
|
428
|
+
/* SAFETY: every removal is the range's tail or a rendered block the iframe named between its
|
|
429
|
+
ends; none is the root, which contains both ends, and any node below the root is
|
|
430
|
+
addressed by at least two segments, so parentElementPath returns a path. */
|
|
369
431
|
pruneEmptyAncestors(t, parentElementPath(path) as JxPath);
|
|
370
432
|
}
|
|
371
433
|
}
|
|
@@ -389,7 +451,7 @@ function comparePathsDescending(a: JxPath, b: JxPath): number {
|
|
|
389
451
|
if (av === bv) {
|
|
390
452
|
continue;
|
|
391
453
|
}
|
|
392
|
-
if (
|
|
454
|
+
if (isNumber(av) && isNumber(bv)) {
|
|
393
455
|
return bv - av;
|
|
394
456
|
}
|
|
395
457
|
return String(bv).localeCompare(String(av));
|
|
@@ -7,13 +7,13 @@
|
|
|
7
7
|
* text formatting, Enter for new paragraphs, and slash commands for inserting elements.
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
|
-
import
|
|
11
|
-
import { displayTagName } from "@jxsuite/schema/guards";
|
|
10
|
+
import { displayTagName, isNonNullObject, isString } from "@jxsuite/schema/guards";
|
|
12
11
|
import { normalizeInlineContent } from "./inline-format";
|
|
13
|
-
import {
|
|
12
|
+
import { execEditingCommand } from "./inline-link";
|
|
13
|
+
import { ELEMENT_DEFS, isEditableTag } from "./editable-tags";
|
|
14
14
|
import type { EditableVerdicts } from "./editable-tags";
|
|
15
15
|
import type { JxPath } from "../state";
|
|
16
|
-
import type { JxMutableNode } from "@jxsuite/schema/types";
|
|
16
|
+
import type { JsonPrimitive, JxMutableNode } from "@jxsuite/schema/types";
|
|
17
17
|
|
|
18
18
|
/**
|
|
19
19
|
* The slash-menu surface inline editing drives. Injected (rather than imported) so this module
|
|
@@ -21,12 +21,15 @@ import type { JxMutableNode } from "@jxsuite/schema/types";
|
|
|
21
21
|
* real menu, the canvas iframe supplies its own (or a no-op) without bloating the slim iframe
|
|
22
22
|
* bundle.
|
|
23
23
|
*/
|
|
24
|
+
/** What a slash menu is opened with: the pick handler, and how the list is filtered and sourced. */
|
|
25
|
+
export interface SlashMenuOptions {
|
|
26
|
+
onSelect: (cmd: SlashCommand) => void;
|
|
27
|
+
showFilter?: boolean;
|
|
28
|
+
commands?: SlashCommand[];
|
|
29
|
+
}
|
|
30
|
+
|
|
24
31
|
export interface SlashController {
|
|
25
|
-
show: (
|
|
26
|
-
anchorEl: HTMLElement,
|
|
27
|
-
filter: string,
|
|
28
|
-
cbs: { onSelect: (cmd: SlashCommand) => void; showFilter?: boolean; commands?: SlashCommand[] },
|
|
29
|
-
) => void;
|
|
32
|
+
show: (anchorEl: HTMLElement, filter: string, cbs: SlashMenuOptions) => void;
|
|
30
33
|
dismiss: () => void;
|
|
31
34
|
isOpen: () => boolean;
|
|
32
35
|
}
|
|
@@ -74,15 +77,20 @@ export interface InlineAction {
|
|
|
74
77
|
shortcut?: string;
|
|
75
78
|
}
|
|
76
79
|
|
|
77
|
-
interface ElementDef {
|
|
78
|
-
$inlineChildren?: string[];
|
|
79
|
-
$inlineActions?: InlineAction[] | string;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
80
|
export interface SlashCommand {
|
|
83
81
|
label: string;
|
|
84
82
|
tag: string;
|
|
85
83
|
description: string;
|
|
84
|
+
/**
|
|
85
|
+
* The heading the offer is listed under. Absent for the HTML elements, which are the menu's
|
|
86
|
+
* first, unheaded group; `"Components"` for the project's components (§5.7).
|
|
87
|
+
*/
|
|
88
|
+
group?: string;
|
|
89
|
+
/**
|
|
90
|
+
* Whether `tag` names a project component: the pick inserts `buildComponentInstance` and imports
|
|
91
|
+
* the component (`editor/insert-component.ts`) rather than an element's default definition.
|
|
92
|
+
*/
|
|
93
|
+
component?: boolean;
|
|
86
94
|
}
|
|
87
95
|
|
|
88
96
|
export interface JxContentResult {
|
|
@@ -124,7 +132,7 @@ export function isInlineInContext(childTag: string, parentTag: string) {
|
|
|
124
132
|
if (!parentTag) {
|
|
125
133
|
return INLINE_TAGS.has(childTag);
|
|
126
134
|
}
|
|
127
|
-
const parentDef =
|
|
135
|
+
const parentDef = ELEMENT_DEFS[parentTag];
|
|
128
136
|
if (!parentDef || !parentDef.$inlineChildren) {
|
|
129
137
|
return false;
|
|
130
138
|
}
|
|
@@ -139,13 +147,13 @@ export function isInlineInContext(childTag: string, parentTag: string) {
|
|
|
139
147
|
* @returns {InlineAction[] | null}
|
|
140
148
|
*/
|
|
141
149
|
export function getInlineActions(tag: string) {
|
|
142
|
-
const def =
|
|
150
|
+
const def = ELEMENT_DEFS[tag];
|
|
143
151
|
if (!def) {
|
|
144
152
|
return null;
|
|
145
153
|
}
|
|
146
154
|
let actions = def.$inlineActions;
|
|
147
|
-
if (
|
|
148
|
-
const refDef =
|
|
155
|
+
if (isString(actions)) {
|
|
156
|
+
const refDef = ELEMENT_DEFS[actions];
|
|
149
157
|
actions = refDef?.$inlineActions ?? undefined;
|
|
150
158
|
}
|
|
151
159
|
if (!Array.isArray(actions)) {
|
|
@@ -233,12 +241,13 @@ export function isEditableBlock(el: HTMLElement) {
|
|
|
233
241
|
* Check if a node is an inline child. When parentNode is provided, uses context-aware scoping from
|
|
234
242
|
* metadata. Without parent, uses the fallback INLINE_TAGS set.
|
|
235
243
|
*
|
|
236
|
-
* @param {JxMutableNode} node
|
|
244
|
+
* @param {JxMutableNode | JsonPrimitive} node A document child entry; a text or other scalar child
|
|
245
|
+
* is never an inline element.
|
|
237
246
|
* @param {JxMutableNode} [parentNode]
|
|
238
247
|
* @returns {boolean}
|
|
239
248
|
*/
|
|
240
|
-
export function isInlineElement(node: JxMutableNode, parentNode?: JxMutableNode) {
|
|
241
|
-
if (!node
|
|
249
|
+
export function isInlineElement(node: JxMutableNode | JsonPrimitive, parentNode?: JxMutableNode) {
|
|
250
|
+
if (!isNonNullObject(node)) {
|
|
242
251
|
return false;
|
|
243
252
|
}
|
|
244
253
|
const childTag = (displayTagName(node.tagName) || "div").toLowerCase();
|
|
@@ -304,7 +313,7 @@ export function startEditing(
|
|
|
304
313
|
insertFn = callbacks.onInsert;
|
|
305
314
|
endFn = callbacks.onEnd;
|
|
306
315
|
_plainMode = opts?.plainText === true;
|
|
307
|
-
_plainOriginal = _plainMode ?
|
|
316
|
+
_plainOriginal = _plainMode ? el.textContent : "";
|
|
308
317
|
_plainPosted = false;
|
|
309
318
|
|
|
310
319
|
// Mark the caret's block so the empty-block slash hint can target it. The editing host itself is
|
|
@@ -495,7 +504,7 @@ function handlePaste(e: ClipboardEvent) {
|
|
|
495
504
|
e.preventDefault();
|
|
496
505
|
// Paste as plain text to avoid foreign HTML
|
|
497
506
|
const text = e.clipboardData?.getData("text/plain") ?? "";
|
|
498
|
-
|
|
507
|
+
execEditingCommand("insertText", text);
|
|
499
508
|
}
|
|
500
509
|
|
|
501
510
|
// ─── Enter: split the active block ─────────────────────────────────────────
|
|
@@ -594,7 +603,7 @@ function commitChanges(inPlace: boolean) {
|
|
|
594
603
|
if (_plainMode) {
|
|
595
604
|
// A prop value is a plain single-line string (a directive attribute) — flatten any newline
|
|
596
605
|
// That survived plaintext editing and skip the rich DOM→Jx serialization entirely.
|
|
597
|
-
const text =
|
|
606
|
+
const text = activeEl.textContent.replaceAll("\n", " ");
|
|
598
607
|
/*
|
|
599
608
|
* A SESSION THAT CHANGED NOTHING MUST WRITE NOTHING.
|
|
600
609
|
*
|
|
@@ -635,17 +644,18 @@ export function normalizeChildren(node: { children?: (JxMutableNode | string)[]
|
|
|
635
644
|
}
|
|
636
645
|
|
|
637
646
|
// Step 1: Merge adjacent text nodes
|
|
638
|
-
const merged = [];
|
|
647
|
+
const merged: (JxMutableNode | string)[] = [];
|
|
639
648
|
for (const child of node.children) {
|
|
640
|
-
|
|
641
|
-
|
|
649
|
+
const last = merged.at(-1);
|
|
650
|
+
if (isString(child) && isString(last)) {
|
|
651
|
+
merged[merged.length - 1] = last + child;
|
|
642
652
|
} else {
|
|
643
653
|
merged.push(child);
|
|
644
654
|
}
|
|
645
655
|
}
|
|
646
656
|
|
|
647
657
|
// Step 2: If all children are text, fold into textContent
|
|
648
|
-
if (merged.every((c
|
|
658
|
+
if (merged.every((c) => isString(c))) {
|
|
649
659
|
return { textContent: merged.join("") };
|
|
650
660
|
}
|
|
651
661
|
|
|
@@ -674,7 +684,7 @@ function elementToJx(el: HTMLElement): JxContentResult {
|
|
|
674
684
|
const children: (JxMutableNode | string)[] = [];
|
|
675
685
|
for (const child of nodes) {
|
|
676
686
|
const jsx = domNodeToJx(child);
|
|
677
|
-
if (jsx !== null
|
|
687
|
+
if (jsx !== null) {
|
|
678
688
|
children.push(jsx);
|
|
679
689
|
}
|
|
680
690
|
}
|
|
@@ -683,6 +693,23 @@ function elementToJx(el: HTMLElement): JxContentResult {
|
|
|
683
693
|
return normalizeChildren({ children });
|
|
684
694
|
}
|
|
685
695
|
|
|
696
|
+
/**
|
|
697
|
+
* Whether `node` is an element carrying `dataset` — an HTML, SVG or MathML element, which is every
|
|
698
|
+
* element an HTML editing host can hold. Decided by node type and feature, not `instanceof`, so it
|
|
699
|
+
* holds for a node of any realm.
|
|
700
|
+
*/
|
|
701
|
+
function isDatasetElementNode(node: Node): node is Element & HTMLOrSVGElement {
|
|
702
|
+
return node.nodeType === Node.ELEMENT_NODE && "dataset" in node;
|
|
703
|
+
}
|
|
704
|
+
|
|
705
|
+
/** Browser execCommand output tags, mapped to the tags Jx documents use for the same formatting. */
|
|
706
|
+
const BROWSER_TAG_CONVENTIONS = new Map([
|
|
707
|
+
["b", "strong"],
|
|
708
|
+
["i", "em"],
|
|
709
|
+
["s", "del"],
|
|
710
|
+
["strike", "del"],
|
|
711
|
+
]);
|
|
712
|
+
|
|
686
713
|
/**
|
|
687
714
|
* Convert a DOM node to a Jx element definition.
|
|
688
715
|
*
|
|
@@ -698,23 +725,17 @@ function domNodeToJx(node: Node) {
|
|
|
698
725
|
return text; // Bare string — text node child
|
|
699
726
|
}
|
|
700
727
|
|
|
701
|
-
if (node
|
|
728
|
+
if (!isDatasetElementNode(node)) {
|
|
702
729
|
return null;
|
|
703
730
|
}
|
|
704
731
|
|
|
705
|
-
const el = node
|
|
732
|
+
const el = node;
|
|
706
733
|
const tag = el.tagName.toLowerCase();
|
|
707
734
|
const result: JxMutableNode = { tagName: tag };
|
|
708
735
|
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
i: "em",
|
|
713
|
-
s: "del",
|
|
714
|
-
strike: "del",
|
|
715
|
-
};
|
|
716
|
-
if (tagMap[tag]) {
|
|
717
|
-
result.tagName = tagMap[tag];
|
|
736
|
+
const conventional = BROWSER_TAG_CONVENTIONS.get(tag);
|
|
737
|
+
if (conventional) {
|
|
738
|
+
result.tagName = conventional;
|
|
718
739
|
}
|
|
719
740
|
|
|
720
741
|
// Attributes
|
|
@@ -725,8 +746,9 @@ function domNodeToJx(node: Node) {
|
|
|
725
746
|
const href = el.dataset.jxHref ?? el.getAttribute("href");
|
|
726
747
|
if (tag === "a" && href != null) {
|
|
727
748
|
result.attributes = { href };
|
|
728
|
-
|
|
729
|
-
|
|
749
|
+
// `title` is an HTMLElement property: an HTML `<a>` reflects the attribute, an SVG `<a>` has none.
|
|
750
|
+
if ("title" in el && isString(el.title) && el.title) {
|
|
751
|
+
result.attributes.title = el.title;
|
|
730
752
|
}
|
|
731
753
|
}
|
|
732
754
|
if (tag === "code") {
|
|
@@ -776,13 +798,15 @@ function fragmentToJx(frag: DocumentFragment) {
|
|
|
776
798
|
}
|
|
777
799
|
}
|
|
778
800
|
|
|
801
|
+
const [only] = children;
|
|
779
802
|
if (
|
|
780
803
|
children.length === 1 &&
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
804
|
+
only !== undefined &&
|
|
805
|
+
!isString(only) &&
|
|
806
|
+
only.tagName === "span" &&
|
|
807
|
+
isString(only.textContent)
|
|
784
808
|
) {
|
|
785
|
-
return { textContent:
|
|
809
|
+
return { textContent: only.textContent };
|
|
786
810
|
}
|
|
787
811
|
|
|
788
812
|
return children.length > 0 ? { children } : { textContent: "" };
|
|
@@ -855,10 +879,11 @@ export function openSlashMenu(opts?: { anchored?: boolean }): void {
|
|
|
855
879
|
|
|
856
880
|
// An unanchored menu carries its own filter field: there is no "/…" run in the document for the
|
|
857
881
|
// Author to type into, so without one the list could only ever be filtered by scrolling it.
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
}
|
|
882
|
+
const menu: SlashMenuOptions = { onSelect: handleSlashSelect };
|
|
883
|
+
if (!_slashAnchored) {
|
|
884
|
+
menu.showFilter = true;
|
|
885
|
+
}
|
|
886
|
+
slash.show(activeEl, "", menu);
|
|
862
887
|
}
|
|
863
888
|
|
|
864
889
|
/**
|
|
@@ -935,6 +960,7 @@ function handleSlashSelect(cmd: SlashCommand) {
|
|
|
935
960
|
let slashNode: Text | null = null;
|
|
936
961
|
let slashOffset = 0;
|
|
937
962
|
while (walker.nextNode()) {
|
|
963
|
+
// SAFETY: the walker shows only text nodes (SHOW_TEXT), and nextNode() just landed on one.
|
|
938
964
|
const node = walker.currentNode as Text;
|
|
939
965
|
if (charCount + node.length > slashIdx) {
|
|
940
966
|
slashNode = node;
|