@jxsuite/studio 2.0.0 → 2.1.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/canvas.html +21 -0
- package/dist/chunks/Overlay.dev-qfjzkms8.js +23 -0
- package/dist/chunks/{Overlay.dev-cszx7yn5.js.map → Overlay.dev-qfjzkms8.js.map} +1 -1
- package/dist/chunks/{adapter-z8fkmbmv.js → adapter-qfnesn5v.js} +2 -2
- package/dist/chunks/{cf-settings-mmyv436d.js → cf-settings-73sh5z4p.js} +3 -3
- package/dist/chunks/{components-0hzentwq.js → components-2bpqp4mq.js} +5 -7
- package/dist/chunks/{components-0hzentwq.js.map → components-2bpqp4mq.js.map} +1 -1
- package/dist/chunks/content-source-34gnkbnn.js +38 -0
- package/dist/chunks/content-source-34gnkbnn.js.map +9 -0
- package/dist/chunks/convert-to-repeater-t8kxre5s.js +258 -0
- package/dist/chunks/convert-to-repeater-t8kxre5s.js.map +10 -0
- package/dist/chunks/extension-sections-6mqydz35.js +301 -0
- package/dist/chunks/extension-sections-6mqydz35.js.map +11 -0
- package/dist/chunks/files-8kn321h1.js +70 -0
- package/dist/chunks/files-8kn321h1.js.map +9 -0
- package/dist/chunks/{format-host-2c188n41.js → format-host-mkwsmt8d.js} +3 -3
- package/dist/chunks/git-panel-tjbr191d.js +51 -0
- package/dist/chunks/git-panel-tjbr191d.js.map +9 -0
- package/dist/chunks/{index-baeg2x3y.js → index-7pxchcce.js} +4 -3
- package/dist/chunks/{index-baeg2x3y.js.map → index-7pxchcce.js.map} +3 -3
- package/dist/chunks/{jx-validate-qx8degj7.js → jx-validate-v6qgknrs.js} +3 -3
- package/dist/chunks/layers-panel-87pb25km.js +58 -0
- package/dist/chunks/layers-panel-87pb25km.js.map +9 -0
- package/dist/chunks/{monaco-setup-zjdp9zdw.js → monaco-setup-e0yh25j4.js} +4 -75
- package/dist/chunks/{monaco-setup-zjdp9zdw.js.map → monaco-setup-e0yh25j4.js.map} +3 -4
- package/dist/chunks/publish-panel-m0fcgdrt.js +21 -0
- package/dist/chunks/publish-panel-m0fcgdrt.js.map +9 -0
- package/dist/chunks/quick-search-rhs6cbsb.js +53 -0
- package/dist/chunks/quick-search-rhs6cbsb.js.map +9 -0
- package/dist/chunks/right-panel-zpdxd98t.js +37 -0
- package/dist/chunks/right-panel-zpdxd98t.js.map +9 -0
- package/dist/chunks/section-registry-zmckaxf4.js +30 -0
- package/dist/chunks/section-registry-zmckaxf4.js.map +9 -0
- package/dist/chunks/sp-overlay.dev-9ran0sfq.js +18 -0
- package/dist/chunks/sp-overlay.dev-9ran0sfq.js.map +9 -0
- package/dist/chunks/sp-popover.dev-rebmdncr.js +9 -0
- package/dist/chunks/sp-popover.dev-rebmdncr.js.map +9 -0
- package/dist/chunks/sp-progress-circle.dev-5vkppfkt.js +15 -0
- package/dist/chunks/sp-progress-circle.dev-5vkppfkt.js.map +9 -0
- package/dist/chunks/sp-tooltip.dev-ykqrg8h5.js +15 -0
- package/dist/chunks/sp-tooltip.dev-ykqrg8h5.js.map +9 -0
- package/dist/chunks/{sp-tray.dev-pb2fsd65.js → sp-tray.dev-ey59vfh7.js} +10 -8
- package/dist/chunks/{sp-tray.dev-pb2fsd65.js.map → sp-tray.dev-ey59vfh7.js.map} +2 -2
- package/dist/chunks/{studio-9qr6fq7p.js → studio-0rqqhrdy.js} +10 -378
- package/dist/chunks/{studio-9qr6fq7p.js.map → studio-0rqqhrdy.js.map} +4 -14
- package/dist/chunks/{studio-5x6tqqec.js → studio-2sj1jj3v.js} +10 -8
- package/dist/chunks/{studio-5x6tqqec.js.map → studio-2sj1jj3v.js.map} +2 -2
- package/dist/chunks/{studio-h3fw0wn8.js → studio-3fk1ac9z.js} +6 -4
- package/dist/chunks/{studio-h3fw0wn8.js.map → studio-3fk1ac9z.js.map} +2 -2
- package/dist/chunks/studio-41exgzhq.js +6690 -0
- package/dist/chunks/studio-41exgzhq.js.map +38 -0
- package/dist/chunks/{studio-7v2bpweq.js → studio-4mqb9a0j.js} +6 -4
- package/dist/chunks/{studio-7v2bpweq.js.map → studio-4mqb9a0j.js.map} +2 -2
- package/dist/chunks/studio-50k77cca.js +1787 -0
- package/dist/chunks/studio-50k77cca.js.map +18 -0
- package/dist/chunks/{studio-56v3zwk6.js → studio-6a0h7sne.js} +10 -8
- package/dist/chunks/{studio-56v3zwk6.js.map → studio-6a0h7sne.js.map} +2 -2
- package/dist/chunks/studio-6f0am8f2.js +53 -0
- package/dist/chunks/studio-6f0am8f2.js.map +10 -0
- package/dist/chunks/studio-6nmjc5qk.js +7002 -0
- package/dist/chunks/studio-6nmjc5qk.js.map +32 -0
- package/dist/chunks/studio-7afd21nw.js +67 -0
- package/dist/chunks/studio-7afd21nw.js.map +10 -0
- package/dist/chunks/{studio-xze4zrs1.js → studio-7bmdvzne.js} +2 -2
- package/dist/chunks/studio-7bmdvzne.js.map +10 -0
- package/dist/chunks/studio-8jpzqk5s.js +128 -0
- package/dist/chunks/studio-8jpzqk5s.js.map +10 -0
- package/dist/chunks/studio-94m77tgk.js +1482 -0
- package/dist/chunks/studio-94m77tgk.js.map +13 -0
- package/dist/chunks/studio-9je6w5sq.js +1000 -0
- package/dist/chunks/studio-9je6w5sq.js.map +16 -0
- package/dist/chunks/{studio-w7c6kvk7.js → studio-a7pzveq1.js} +2 -2
- package/dist/chunks/{studio-97qcgvdn.js → studio-adn0z1k3.js} +14 -8
- package/dist/chunks/{studio-97qcgvdn.js.map → studio-adn0z1k3.js.map} +3 -3
- package/dist/chunks/{studio-kr88ryr7.js → studio-bsxxx3x2.js} +17 -15
- package/dist/chunks/{studio-kr88ryr7.js.map → studio-bsxxx3x2.js.map} +7 -6
- package/dist/chunks/studio-bw5dz6km.js +608 -0
- package/dist/chunks/studio-bw5dz6km.js.map +21 -0
- package/dist/chunks/studio-c6s5getc.js +4232 -0
- package/dist/chunks/studio-c6s5getc.js.map +39 -0
- package/dist/chunks/studio-cjm7fdjf.js +451 -0
- package/dist/chunks/studio-cjm7fdjf.js.map +14 -0
- package/dist/chunks/{studio-cx91mnh8.js → studio-ckwz4d3x.js} +53 -53
- package/dist/chunks/{studio-cx91mnh8.js.map → studio-ckwz4d3x.js.map} +5 -5
- package/dist/chunks/studio-dg7zyt5x.js +28 -0
- package/dist/chunks/studio-dg7zyt5x.js.map +10 -0
- package/dist/chunks/studio-dzcyvvvz.js +166 -0
- package/dist/chunks/studio-dzcyvvvz.js.map +10 -0
- package/dist/chunks/{studio-7kqe41sa.js → studio-evkr5d3b.js} +15 -7
- package/dist/chunks/{studio-7kqe41sa.js.map → studio-evkr5d3b.js.map} +5 -4
- package/dist/chunks/studio-f12h6177.js +411 -0
- package/dist/chunks/studio-f12h6177.js.map +13 -0
- package/dist/chunks/studio-hbp1s8m9.js +1817 -0
- package/dist/chunks/studio-hbp1s8m9.js.map +14 -0
- package/dist/chunks/studio-k2sxjph5.js +15295 -0
- package/dist/chunks/studio-k2sxjph5.js.map +235 -0
- package/dist/chunks/studio-myje51t3.js +385 -0
- package/dist/chunks/studio-myje51t3.js.map +12 -0
- package/dist/chunks/studio-na6rwzhw.js +353 -0
- package/dist/chunks/studio-na6rwzhw.js.map +11 -0
- package/dist/chunks/{studio-4k0m4fmp.js → studio-p471gg5n.js} +126 -3
- package/dist/chunks/studio-p471gg5n.js.map +14 -0
- package/dist/chunks/{studio-9bjwf0d4.js → studio-rgwcpast.js} +5 -46
- package/dist/chunks/{studio-9bjwf0d4.js.map → studio-rgwcpast.js.map} +4 -5
- package/dist/chunks/{studio-hhj92gcr.js → studio-s519zc99.js} +3 -3
- package/dist/chunks/studio-sas7mt3k.js +75 -0
- package/dist/chunks/studio-sas7mt3k.js.map +10 -0
- package/dist/chunks/studio-t5wqwzdh.js +74 -0
- package/dist/chunks/studio-t5wqwzdh.js.map +10 -0
- package/dist/chunks/{studio-9qpspwfn.js → studio-temv5bw4.js} +5 -5
- package/dist/chunks/{studio-9qpspwfn.js.map → studio-temv5bw4.js.map} +1 -1
- package/dist/chunks/{studio-qkvt37c0.js → studio-tr20m8g8.js} +669 -18
- package/dist/chunks/studio-tr20m8g8.js.map +9 -0
- package/dist/chunks/{studio-ygzav7z5.js → studio-v96qfnww.js} +5514 -4291
- package/dist/chunks/studio-v96qfnww.js.map +54 -0
- package/dist/chunks/studio-vcetc91k.js +659 -0
- package/dist/chunks/studio-vcetc91k.js.map +10 -0
- package/dist/chunks/{studio-n9zmpxjg.js → studio-vmymjefp.js} +2972 -4937
- package/dist/chunks/studio-vmymjefp.js.map +98 -0
- package/dist/chunks/{studio-bghqfmea.js → studio-wwseqyw0.js} +2 -2
- package/dist/chunks/studio-x9hmy5kr.js +390 -0
- package/dist/chunks/studio-x9hmy5kr.js.map +10 -0
- package/dist/chunks/studio-xa0ce0n7.js +335 -0
- package/dist/chunks/studio-xa0ce0n7.js.map +10 -0
- package/dist/chunks/studio-xm3dbxvn.js +378 -0
- package/dist/chunks/studio-xm3dbxvn.js.map +19 -0
- package/dist/chunks/{studio-nqw433kv.js → studio-xmvbhg31.js} +2 -2
- package/dist/chunks/studio-zv37yrfa.js +1054 -0
- package/dist/chunks/studio-zv37yrfa.js.map +13 -0
- package/dist/chunks/{ws-client-q7hkz3j9.js → ws-client-654ts66j.js} +6 -4
- package/dist/chunks/ws-client-654ts66j.js.map +11 -0
- package/dist/iframe-entry.js +668 -230
- package/dist/studio.js +23711 -35185
- package/index.html +35 -4685
- package/package.json +17 -15
- package/src/about/about-modal.ts +42 -11
- package/src/browse/library-commands.ts +240 -0
- package/src/browse/library-layouts.ts +369 -0
- package/src/browse/library-model.ts +396 -0
- package/src/browse/library-pane.ts +1049 -0
- package/src/browse/library-preview.ts +252 -0
- package/src/browse/library-source.ts +150 -0
- package/src/canvas/canvas-helpers.ts +33 -9
- package/src/canvas/canvas-live-render.ts +45 -29
- package/src/canvas/canvas-patcher.ts +151 -31
- package/src/canvas/canvas-perf.ts +46 -7
- package/src/canvas/canvas-render.ts +1092 -220
- package/src/canvas/canvas-surface.ts +240 -0
- package/src/canvas/canvas-utils.ts +1166 -124
- package/src/canvas/iframe-drop.ts +2 -1
- package/src/canvas/iframe-entry.ts +241 -4
- package/src/canvas/iframe-host.ts +1226 -143
- package/src/canvas/iframe-inline-edit.ts +31 -0
- package/src/canvas/iframe-interaction.ts +76 -16
- package/src/canvas/iframe-keys.ts +107 -45
- package/src/canvas/iframe-overlay.ts +38 -1
- package/src/canvas/iframe-protocol.ts +137 -2
- package/src/canvas/iframe-render.ts +70 -2
- package/src/canvas/iframe-slash.ts +6 -0
- package/src/canvas/path-mapping.ts +56 -6
- package/src/canvas/surface-registry.ts +292 -0
- package/src/collab/collab-commands.ts +244 -0
- package/src/collab/collab-session.ts +198 -32
- package/src/collab/collab-state.ts +28 -2
- package/src/collab/presence-chips.ts +100 -9
- package/src/commands/active-registry.ts +42 -0
- package/src/commands/app-commands.ts +176 -0
- package/src/commands/budget.ts +158 -0
- package/src/commands/command-args.ts +253 -0
- package/src/commands/context.ts +387 -0
- package/src/commands/defaults.ts +580 -0
- package/src/commands/keymap.ts +571 -0
- package/src/commands/levels.ts +345 -0
- package/src/commands/live-context.ts +193 -0
- package/src/commands/reference.ts +227 -0
- package/src/commands/registry.ts +293 -0
- package/src/component-props.ts +3 -2
- package/src/content/draft-state.ts +106 -0
- package/src/content/entry-commands.ts +282 -0
- package/src/content/entry-editor.ts +327 -0
- package/src/content/entry-fields.ts +116 -0
- package/src/content/entry-model.ts +175 -0
- package/src/editor/canvas-context-menu.ts +17 -11
- package/src/editor/canvas-slash-bridge.ts +11 -4
- package/src/editor/context-menu.ts +804 -204
- package/src/editor/convert-to-component.ts +31 -10
- package/src/editor/convert-to-repeater.ts +3 -2
- package/src/editor/inline-edit-apply.ts +5 -5
- package/src/editor/inline-edit.ts +86 -50
- package/src/editor/insert-zone-action.ts +1 -1
- package/src/editor/shortcuts.ts +1043 -329
- package/src/editor/slash-menu.ts +1 -0
- package/src/files/elements.ts +166 -0
- package/src/files/file-ops.ts +178 -31
- package/src/files/files.ts +898 -268
- package/src/files/fs-events.ts +21 -0
- package/src/files/media-meta.ts +203 -0
- package/src/files/media-paths.ts +141 -0
- package/src/files/media-upload.ts +7 -3
- package/src/files/media-usage.ts +189 -0
- package/src/github/github-auth.ts +235 -33
- package/src/github/github-publish.ts +80 -21
- package/src/grid/grid-controller.ts +152 -12
- package/src/grid/grid-layout.ts +225 -20
- package/src/grid/grid-open.ts +120 -0
- package/src/grid/grid-panel.ts +554 -39
- package/src/grid/grid-source.ts +27 -1
- package/src/grid/redirects-grid.ts +599 -0
- package/src/grid/redirects.ts +398 -0
- package/src/grid/sources/content-source.ts +108 -2
- package/src/i18n/i18n-commands.ts +322 -0
- package/src/new-project/add-repo-modal.ts +8 -10
- package/src/new-project/import-tab.ts +34 -9
- package/src/new-project/location-fields.ts +9 -1
- package/src/new-project/new-project-modal.ts +270 -262
- package/src/packages/jxsuite-update.ts +97 -48
- package/src/packages/pull-package-sync.ts +18 -9
- package/src/page-params.ts +2 -1
- package/src/panels/activity-bar.ts +152 -91
- package/src/panels/activity-panel.ts +481 -0
- package/src/panels/ai-chat/chat-markdown.ts +8 -3
- package/src/panels/ai-chat/chat-view.ts +245 -18
- package/src/panels/ai-chat/composer.ts +31 -5
- package/src/panels/ai-chat/sessions-view.ts +17 -10
- package/src/panels/ai-panel.ts +279 -120
- package/src/panels/block-action-bar.ts +1115 -224
- package/src/panels/bottom-dock.ts +337 -0
- package/src/panels/canvas-dnd-bridge.ts +37 -8
- package/src/panels/chat-panel.ts +29 -12
- package/src/panels/data-explorer.ts +254 -112
- package/src/panels/data-grid.ts +10 -4
- package/src/panels/dnd.ts +28 -51
- package/src/panels/editors.ts +434 -107
- package/src/panels/elements-panel.ts +66 -2
- package/src/panels/empty-state.ts +112 -0
- package/src/panels/events-panel.ts +596 -82
- package/src/panels/formula-workspace.ts +408 -218
- package/src/panels/frontmatter-fields.ts +51 -10
- package/src/panels/frontmatter-panel.ts +357 -79
- package/src/panels/git-panel.ts +375 -164
- package/src/panels/head-panel.ts +791 -85
- package/src/panels/i18n-panel.ts +592 -0
- package/src/panels/imports-panel.ts +95 -85
- package/src/panels/jump-bar.ts +584 -0
- package/src/panels/layers-panel.ts +1106 -328
- package/src/panels/left-panel.ts +109 -204
- package/src/panels/navigator-panels.ts +131 -0
- package/src/panels/overlays.ts +7 -2
- package/src/panels/pane-context.ts +1477 -0
- package/src/panels/pane-grid.ts +406 -0
- package/src/panels/panel-registry.ts +340 -0
- package/src/panels/panel-scheduler.ts +75 -0
- package/src/panels/problems-panel.ts +234 -0
- package/src/panels/properties-panel.ts +946 -1139
- package/src/panels/provenance.ts +258 -0
- package/src/panels/quick-search.ts +791 -122
- package/src/panels/right-panel.ts +228 -102
- package/src/panels/seo-modal.ts +395 -0
- package/src/panels/settings-pane.ts +203 -0
- package/src/panels/signals-panel.ts +354 -137
- package/src/panels/statement-editor.ts +41 -25
- package/src/panels/statusbar.ts +342 -106
- package/src/panels/style-panel.ts +974 -463
- package/src/panels/style-utils.ts +3 -3
- package/src/panels/stylebook-doc.ts +4 -2
- package/src/panels/stylebook-layers-panel.ts +3 -2
- package/src/panels/stylebook-panel.ts +51 -26
- package/src/panels/tab-strip.ts +1058 -78
- package/src/panels/target-line.ts +274 -0
- package/src/panels/toolbar.ts +631 -484
- package/src/panels/welcome-screen.ts +301 -198
- package/src/platform-errors.ts +26 -3
- package/src/platform.ts +96 -2
- package/src/platforms/cloud.ts +71 -8
- package/src/platforms/devserver.ts +92 -29
- package/src/publish/deploy-checklist.ts +383 -0
- package/src/publish/pages-service.ts +10 -1
- package/src/publish/publish-commands.ts +218 -0
- package/src/publish/publish-panel.ts +110 -16
- package/src/recent-projects.ts +3 -2
- package/src/services/a11y-report.ts +505 -0
- package/src/services/ai-models.ts +75 -2
- package/src/services/ai-project-tools.ts +29 -10
- package/src/services/ai-system-prompt.ts +53 -14
- package/src/services/ai-tools.ts +39 -3
- package/src/services/ai-writes.ts +154 -0
- package/src/services/announce.ts +97 -0
- package/src/services/automation.ts +424 -175
- package/src/services/cem-export.ts +9 -4
- package/src/services/clock.ts +61 -0
- package/src/services/document-assistant.ts +36 -8
- package/src/services/idle.ts +179 -0
- package/src/services/import-client.ts +26 -0
- package/src/services/monaco-buffer.ts +627 -0
- package/src/services/monaco-lazy.ts +36 -0
- package/src/services/notify.ts +271 -0
- package/src/services/profile.ts +155 -0
- package/src/services/references.ts +0 -0
- package/src/services/token-lint.ts +3 -2
- package/src/services/tool-executor.ts +53 -7
- package/src/services/trusted-types.ts +123 -0
- package/src/settings/contexts-section.ts +427 -0
- package/src/settings/contributed-section.ts +149 -11
- package/src/settings/css-vars-editor.ts +306 -349
- package/src/settings/defs-editor.ts +93 -34
- package/src/settings/dependencies-editor.ts +7 -7
- package/src/settings/extension-sections.ts +37 -5
- package/src/settings/general-settings.ts +204 -121
- package/src/settings/locales-section.ts +347 -0
- package/src/settings/preferences-accounts.ts +140 -0
- package/src/settings/preferences-dialog.ts +620 -0
- package/src/settings/preferences-keymap.ts +270 -0
- package/src/settings/project-sections.ts +260 -0
- package/src/settings/section-registry.ts +169 -0
- package/src/settings/settings-document.ts +385 -0
- package/src/shell.ts +1549 -0
- package/src/site-context.ts +45 -20
- package/src/state.ts +14 -275
- package/src/store.ts +88 -43
- package/src/studio.ts +790 -346
- package/src/style/live-preview.ts +36 -0
- package/src/style/project-styles.ts +349 -0
- package/src/style/token-ref.ts +123 -0
- package/src/tabs/patch-ops.ts +16 -4
- package/src/tabs/project-config.ts +416 -0
- package/src/tabs/selection.ts +323 -0
- package/src/tabs/tab.ts +182 -47
- package/src/tabs/transact.ts +209 -28
- package/src/types.ts +68 -13
- package/src/ui/ai-credentials-form.ts +39 -35
- package/src/ui/ai-managed-connect.ts +113 -0
- package/src/ui/dynamic-slot.ts +224 -81
- package/src/ui/expression-editor.ts +71 -63
- package/src/ui/field-input.ts +4 -6
- package/src/ui/field-row.ts +215 -38
- package/src/ui/form-controls.ts +194 -7
- package/src/ui/layers.ts +492 -69
- package/src/ui/media-picker.ts +115 -25
- package/src/ui/panel-resize.ts +109 -91
- package/src/ui/progress-modal.ts +131 -50
- package/src/ui/regions.ts +462 -0
- package/src/ui/schema-form.ts +229 -45
- package/src/ui/spectrum.ts +24 -8
- package/src/ui/timing.ts +49 -0
- package/src/ui/value-selector.ts +20 -0
- package/src/ui/value-source.ts +348 -0
- package/src/ui/virtual-window.ts +400 -0
- package/src/utils/edit-display.ts +3 -2
- package/src/utils/inherited-style.ts +67 -37
- package/src/view.ts +64 -78
- package/src/workspace/pane-derive.ts +1258 -0
- package/src/workspace/session.ts +317 -0
- package/src/workspace/workspace.ts +1345 -23
- package/styles/canvas.css +653 -0
- package/styles/forced-colors.css +106 -0
- package/styles/inspector.css +1454 -0
- package/styles/overlays.css +2704 -0
- package/styles/panels.css +1701 -0
- package/styles/shell.css +1423 -0
- package/styles/tokens.css +151 -0
- package/dist/chunks/Overlay.dev-cszx7yn5.js +0 -22
- package/dist/chunks/extension-sections-qct0gt8f.js +0 -531
- package/dist/chunks/extension-sections-qct0gt8f.js.map +0 -12
- package/dist/chunks/files-02zn5y24.js +0 -50
- package/dist/chunks/files-02zn5y24.js.map +0 -9
- package/dist/chunks/git-panel-mbb0y0hz.js +0 -28
- package/dist/chunks/git-panel-mbb0y0hz.js.map +0 -9
- package/dist/chunks/layers-panel-9qekmqk1.js +0 -26
- package/dist/chunks/layers-panel-9qekmqk1.js.map +0 -9
- package/dist/chunks/settings-modal-gj0hrah4.js +0 -29
- package/dist/chunks/settings-modal-gj0hrah4.js.map +0 -9
- package/dist/chunks/sp-overlay.dev-earn5as8.js +0 -17
- package/dist/chunks/sp-overlay.dev-earn5as8.js.map +0 -9
- package/dist/chunks/sp-popover.dev-frxtfejn.js +0 -8
- package/dist/chunks/sp-popover.dev-frxtfejn.js.map +0 -9
- package/dist/chunks/sp-progress-circle.dev-7tvw34h8.js +0 -14
- package/dist/chunks/sp-progress-circle.dev-7tvw34h8.js.map +0 -9
- package/dist/chunks/sp-tooltip.dev-a9fywesm.js +0 -21
- package/dist/chunks/sp-tooltip.dev-a9fywesm.js.map +0 -10
- package/dist/chunks/studio-4k0m4fmp.js.map +0 -13
- package/dist/chunks/studio-568nx4t5.js +0 -469
- package/dist/chunks/studio-568nx4t5.js.map +0 -14
- package/dist/chunks/studio-9smfzqhc.js +0 -19
- package/dist/chunks/studio-9smfzqhc.js.map +0 -10
- package/dist/chunks/studio-asvf0j9e.js +0 -429
- package/dist/chunks/studio-asvf0j9e.js.map +0 -13
- package/dist/chunks/studio-d77qm3pk.js +0 -3427
- package/dist/chunks/studio-d77qm3pk.js.map +0 -26
- package/dist/chunks/studio-j6gqyjf4.js +0 -1854
- package/dist/chunks/studio-j6gqyjf4.js.map +0 -18
- package/dist/chunks/studio-n9zmpxjg.js.map +0 -115
- package/dist/chunks/studio-qkvt37c0.js.map +0 -9
- package/dist/chunks/studio-rq0vxb19.js +0 -3744
- package/dist/chunks/studio-rq0vxb19.js.map +0 -22
- package/dist/chunks/studio-wd6ewdvd.js +0 -853
- package/dist/chunks/studio-wd6ewdvd.js.map +0 -12
- package/dist/chunks/studio-xq0t7n5t.js +0 -140
- package/dist/chunks/studio-xq0t7n5t.js.map +0 -10
- package/dist/chunks/studio-xze4zrs1.js.map +0 -10
- package/dist/chunks/studio-ygzav7z5.js.map +0 -46
- package/dist/chunks/studio-zmy7241e.js +0 -399
- package/dist/chunks/studio-zmy7241e.js.map +0 -12
- package/dist/chunks/ws-client-q7hkz3j9.js.map +0 -11
- package/src/browse/browse-modal.ts +0 -69
- package/src/browse/browse.ts +0 -904
- package/src/canvas/canvas-diff.ts +0 -216
- package/src/canvas/nested-site-style.ts +0 -58
- package/src/new-project/design-fields.ts +0 -264
- package/src/new-project/templates.ts +0 -61
- package/src/panels/tab-bar.ts +0 -548
- package/src/settings/settings-modal.ts +0 -203
- /package/dist/chunks/{adapter-z8fkmbmv.js.map → adapter-qfnesn5v.js.map} +0 -0
- /package/dist/chunks/{cf-settings-mmyv436d.js.map → cf-settings-73sh5z4p.js.map} +0 -0
- /package/dist/chunks/{format-host-2c188n41.js.map → format-host-mkwsmt8d.js.map} +0 -0
- /package/dist/chunks/{jx-validate-qx8degj7.js.map → jx-validate-v6qgknrs.js.map} +0 -0
- /package/dist/chunks/{studio-w7c6kvk7.js.map → studio-a7pzveq1.js.map} +0 -0
- /package/dist/chunks/{studio-hhj92gcr.js.map → studio-s519zc99.js.map} +0 -0
- /package/dist/chunks/{studio-bghqfmea.js.map → studio-wwseqyw0.js.map} +0 -0
- /package/dist/chunks/{studio-nqw433kv.js.map → studio-xmvbhg31.js.map} +0 -0
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* **Where a content entry's fields live**, and the one mutation that writes them.
|
|
3
|
+
*
|
|
4
|
+
* A collection has two storage shapes and exactly one editor, so the question "what record am I
|
|
5
|
+
* editing?" has to be answered once, here, rather than assumed at every read site.
|
|
6
|
+
*
|
|
7
|
+
* - A **markdown** entry (or any file a format class parsed) is a frontmatter block plus a body. Its
|
|
8
|
+
* fields are `tab.doc.content.frontmatter`; `tab.doc.document` is the prose.
|
|
9
|
+
* - A **JSON** entry (site-architecture.md §6.2's native collection shape) has no frontmatter block
|
|
10
|
+
* to split off. `files/files.ts` parses it straight into `tab.doc.document`, and
|
|
11
|
+
* `files/file-ops.ts` writes that object back as the whole file. Its fields ARE the document.
|
|
12
|
+
*
|
|
13
|
+
* The Entry editor read `content.frontmatter` unconditionally. For a JSON entry that record is `{}`
|
|
14
|
+
* — so the form drew blank rows for an entry full of data, `absentRequiredErrors` accused a valid
|
|
15
|
+
* entry of missing its required fields, and every keystroke was committed to a record that
|
|
16
|
+
* `serializeDocument` never writes: the edit marked the tab dirty, survived undo, and was discarded
|
|
17
|
+
* by ⌘S under a "Saved" toast. Three symptoms, one wrong assumption about storage.
|
|
18
|
+
*
|
|
19
|
+
* **The discriminator is the serializer's own ladder, not a guess about the extension.**
|
|
20
|
+
* `serializeDocument` writes `JSON.stringify(tab.doc.document)` for exactly one kind of tab: no
|
|
21
|
+
* format class claimed it (`sourceFormat === null`) and it is not a content-mode document. Those
|
|
22
|
+
* are the two reads {@link fieldsAreDocument} makes, so "which record does the form edit" and
|
|
23
|
+
* "which record does save write" cannot drift apart — and if a project ever registers a format
|
|
24
|
+
* class for `.json`, both answers move together to frontmatter.
|
|
25
|
+
*
|
|
26
|
+
* Both shapes mutate with the same semantics — `undefined`, `null` and `""` remove the key, every
|
|
27
|
+
* other value is written — so an author cannot tell from the form's behaviour which one they are
|
|
28
|
+
* editing. That is the point.
|
|
29
|
+
*/
|
|
30
|
+
|
|
31
|
+
import { cloneValue } from "@jxsuite/collab/ops";
|
|
32
|
+
import { recordDocOp } from "../tabs/patch-ops";
|
|
33
|
+
import { mutateUpdateFrontmatter, transactDoc } from "../tabs/transact";
|
|
34
|
+
import type { Tab } from "../tabs/tab";
|
|
35
|
+
import type { JsonValue } from "../types";
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Whether this tab's entry fields are the document itself rather than a frontmatter block.
|
|
39
|
+
*
|
|
40
|
+
* Mirrors `files/file-ops.ts`'s `serializeDocument` fall-through: a tab with no serializing format
|
|
41
|
+
* and no content mode round-trips as raw JSON, so anything not in `tab.doc.document` is not saved.
|
|
42
|
+
*
|
|
43
|
+
* Deliberately NOT exported. The answer is only ever useful as the record it selects, and a second
|
|
44
|
+
* caller branching on it would be the beginning of the fork this module exists to prevent —
|
|
45
|
+
* {@link entryFields} and {@link mutateEntryField} are the whole interface.
|
|
46
|
+
*/
|
|
47
|
+
function fieldsAreDocument(tab: Tab): boolean {
|
|
48
|
+
return tab.doc.sourceFormat == null && tab.doc.mode !== "content";
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* The record this entry's fields live in — the one the form draws, validates and repaints from.
|
|
53
|
+
*
|
|
54
|
+
* Returned live, not copied: the caller reads it during a render that is already tracking the
|
|
55
|
+
* reactive tab, and a copy would break that. It is also the identity a caller can compare against
|
|
56
|
+
* `tab.doc.document` to see which store answered.
|
|
57
|
+
*/
|
|
58
|
+
export function entryFields(tab: Tab): Record<string, unknown> {
|
|
59
|
+
return fieldsAreDocument(tab)
|
|
60
|
+
? (tab.doc.document as unknown as Record<string, unknown>)
|
|
61
|
+
: (tab.doc.content?.frontmatter ?? {});
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Set one document-root key, recording the forward/inverse pair history and the collab bridge
|
|
66
|
+
* replay from. The same shape `mutateUpdateFrontmatter` records for a frontmatter key, against the
|
|
67
|
+
* other store — a JSON entry's field change is a genuine document op, so unlike a frontmatter op it
|
|
68
|
+
* also reaches a co-editor.
|
|
69
|
+
*
|
|
70
|
+
* No canvas patch op: a JSON entry has no rendered node for the key, and an unrecorded patch batch
|
|
71
|
+
* is already the "not surgically patchable, fall back" signal `transactDoc` reads.
|
|
72
|
+
*/
|
|
73
|
+
function mutateDocumentField(tab: Tab, field: string, value?: JsonValue): void {
|
|
74
|
+
const doc = tab.doc.document as unknown as Record<string, unknown>;
|
|
75
|
+
const before = Object.hasOwn(doc, field) ? cloneValue(doc[field]) : undefined;
|
|
76
|
+
const deletes = value === undefined || value === null || value === "";
|
|
77
|
+
if (deletes) {
|
|
78
|
+
delete doc[field];
|
|
79
|
+
} else {
|
|
80
|
+
doc[field] = value;
|
|
81
|
+
}
|
|
82
|
+
const after = deletes ? undefined : cloneValue(value);
|
|
83
|
+
recordDocOp({
|
|
84
|
+
forward: { key: field, op: "set-key", path: [], value: after },
|
|
85
|
+
inverse: { key: field, op: "set-key", path: [], value: before },
|
|
86
|
+
});
|
|
87
|
+
tab.doc.dirty = true;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Set one entry field, in whichever record this entry keeps its fields in.
|
|
92
|
+
*
|
|
93
|
+
* A mutation, not a transaction: callers wrap it in `transactDoc` so a multi-key change is one undo
|
|
94
|
+
* step.
|
|
95
|
+
*/
|
|
96
|
+
export function mutateEntryField(tab: Tab, field: string, value?: JsonValue): void {
|
|
97
|
+
if (fieldsAreDocument(tab)) {
|
|
98
|
+
mutateDocumentField(tab, field, value);
|
|
99
|
+
} else {
|
|
100
|
+
mutateUpdateFrontmatter(tab, field, value);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Commit a form patch onto this entry's fields, in ONE transaction.
|
|
106
|
+
*
|
|
107
|
+
* `renderForm` emits single-key patches today, but committing per key would put a multi-key patch
|
|
108
|
+
* on the undo stack as several steps — and an author who changed one thing expects one ⌘Z.
|
|
109
|
+
*/
|
|
110
|
+
export function commitEntryFields(tab: Tab, patch: Record<string, unknown>): void {
|
|
111
|
+
transactDoc(tab, (t) => {
|
|
112
|
+
for (const [field, value] of Object.entries(patch)) {
|
|
113
|
+
mutateEntryField(t, field, value as JsonValue);
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The content-entry model — which collection an entry belongs to, and what a NEW one contains. Pure
|
|
3
|
+
* over its inputs (the project config it reads, the schema it is handed), so the seeding rules can
|
|
4
|
+
* be asserted without a DOM, a platform or a tab.
|
|
5
|
+
*
|
|
6
|
+
* **Two facts this module exists to stop being restated.**
|
|
7
|
+
*
|
|
8
|
+
* 1. **A new entry is seeded, not blank.** `library-pane.ts`'s collection branch created the file
|
|
9
|
+
* through the shared creation flow with no extension and no body, so a new `blog` entry landed
|
|
10
|
+
* as `content/blog/untitled` — no `.md`, therefore matched by no format, therefore not an entry
|
|
11
|
+
* of the collection it was created in, and its required fields were absent rather than empty.
|
|
12
|
+
* {@link seedEntry} answers with the schema's own defaults, and every REQUIRED property that
|
|
13
|
+
* declares none gets a typed empty, because "present and blank" is a valid entry the author can
|
|
14
|
+
* fill in and "absent" is a validation failure they did not cause.
|
|
15
|
+
* 2. **Where the entry files are** is `collectionInfo`'s answer, imported rather than recomputed.
|
|
16
|
+
* Three copies of "which collection owns this path, and what extension do its entries carry"
|
|
17
|
+
* already exist (`utils/studio-utils.ts`'s `findContentTypeSchema`, `grid/sources/content-
|
|
18
|
+
* source.ts`'s `collectionInfo`, `browse/library-model.ts`'s `contentTypeFor`); this module adds
|
|
19
|
+
* no fourth and calls the two that are exported.
|
|
20
|
+
*
|
|
21
|
+
* **The draft axis is NOT here.** `content/draft-state.ts` owns what a draft is and whether drafts
|
|
22
|
+
* are listed, because this module imports `content-source.ts` and the grid source must be able to
|
|
23
|
+
* ask what a draft is — the reverse edge would be a cycle, and `import/no-cycle` is an error here.
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
import { collectionInfo } from "../grid/sources/content-source";
|
|
27
|
+
import { projectState } from "../store";
|
|
28
|
+
import { findContentTypeSchema } from "../utils/studio-utils";
|
|
29
|
+
import type { ContentSectionEntry } from "../types";
|
|
30
|
+
import type { ContentTypeSchema, ContentTypeSchemaField } from "@jxsuite/schema/types";
|
|
31
|
+
|
|
32
|
+
// ─── Collections ─────────────────────────────────────────────────────────────
|
|
33
|
+
|
|
34
|
+
/** One content collection, as the entry surfaces need it. */
|
|
35
|
+
export interface EntryCollection {
|
|
36
|
+
name: string;
|
|
37
|
+
/** Source directory, project-relative and without a trailing slash. */
|
|
38
|
+
dir: string;
|
|
39
|
+
/** The extension a new entry of this collection is written with (`.md`, `.json`, …). */
|
|
40
|
+
ext: string;
|
|
41
|
+
schema: ContentTypeSchema | null;
|
|
42
|
+
def: ContentSectionEntry;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/** Every content type the project declares, in declaration order. */
|
|
46
|
+
export function collectionNames(): string[] {
|
|
47
|
+
return Object.keys((projectState?.projectConfig?.content ?? {}) as Record<string, unknown>);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* The collection named `name`, or null when the project declares no such directory-backed type.
|
|
52
|
+
*
|
|
53
|
+
* A collection whose `source` names a FILE (a CSV catalogue) has no per-entry files, so it has no
|
|
54
|
+
* entry editor and no New Entry — `collectionInfo` still answers for it, and this rejects it here
|
|
55
|
+
* rather than letting a caller compose `products/catalog.csv/untitled.csv`.
|
|
56
|
+
*/
|
|
57
|
+
export function entryCollection(name: string): EntryCollection | null {
|
|
58
|
+
const info = collectionInfo(name);
|
|
59
|
+
if (!info) {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
if (/\.[a-z\d]+$/i.test(info.dir)) {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
return {
|
|
66
|
+
def: info.def,
|
|
67
|
+
dir: info.dir,
|
|
68
|
+
ext: info.ext,
|
|
69
|
+
name: info.name,
|
|
70
|
+
schema: info.def.schema ?? null,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/** The collections a New Entry can be created in — directory-backed types only. */
|
|
75
|
+
export function entryCollections(): EntryCollection[] {
|
|
76
|
+
return collectionNames()
|
|
77
|
+
.map((name) => entryCollection(name))
|
|
78
|
+
.filter((collection): collection is EntryCollection => collection !== null);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* The collection a document path belongs to, or null.
|
|
83
|
+
*
|
|
84
|
+
* Delegates to `findContentTypeSchema`, which is the matcher the frontmatter surfaces already use —
|
|
85
|
+
* including its Windows backslash normalisation and its file-source (CSV) branch. A path that
|
|
86
|
+
* matches a type with no `schema` is NOT a match there, and that is the right answer here too: an
|
|
87
|
+
* entry editor over a collection that declares no shape has no form to draw.
|
|
88
|
+
*/
|
|
89
|
+
export function collectionOfPath(path: string | null): EntryCollection | null {
|
|
90
|
+
const matched = findContentTypeSchema(path ?? null, projectState?.projectConfig);
|
|
91
|
+
return matched ? entryCollection(matched.name) : null;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// ─── Seeding a new entry ─────────────────────────────────────────────────────
|
|
95
|
+
|
|
96
|
+
/** Deep copy of a schema `default`, so two entries seeded from one schema never share an object. */
|
|
97
|
+
function cloneDefault(value: unknown): unknown {
|
|
98
|
+
if (value === null || typeof value !== "object") {
|
|
99
|
+
return value;
|
|
100
|
+
}
|
|
101
|
+
// oxlint-disable-next-line unicorn/prefer-structured-clone
|
|
102
|
+
return JSON.parse(JSON.stringify(value)) as unknown;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* The empty value of a declared type — what a REQUIRED property with no `default` is seeded with.
|
|
107
|
+
*
|
|
108
|
+
* A reference (`$ref` to another collection) seeds as `""`: it is required, so the key must exist,
|
|
109
|
+
* and picking an arbitrary entry of the target collection on the author's behalf would be inventing
|
|
110
|
+
* a relationship they never stated.
|
|
111
|
+
*/
|
|
112
|
+
function emptyForField(field: ContentTypeSchemaField): unknown {
|
|
113
|
+
if (typeof field.$ref === "string") {
|
|
114
|
+
return "";
|
|
115
|
+
}
|
|
116
|
+
switch (field.type) {
|
|
117
|
+
case "boolean": {
|
|
118
|
+
return false;
|
|
119
|
+
}
|
|
120
|
+
case "integer":
|
|
121
|
+
case "number": {
|
|
122
|
+
return 0;
|
|
123
|
+
}
|
|
124
|
+
case "array": {
|
|
125
|
+
return [];
|
|
126
|
+
}
|
|
127
|
+
case "object": {
|
|
128
|
+
return seedEntry(field as ContentTypeSchema);
|
|
129
|
+
}
|
|
130
|
+
default: {
|
|
131
|
+
return "";
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* The frontmatter a new entry of this schema starts life with.
|
|
138
|
+
*
|
|
139
|
+
* Two rules, and nothing else:
|
|
140
|
+
*
|
|
141
|
+
* - A property that declares a `default` gets it (cloned);
|
|
142
|
+
* - A property listed in `required` that declares no default gets its type's empty value.
|
|
143
|
+
*
|
|
144
|
+
* An optional property with no default is **omitted**. Seeding every declared field would write the
|
|
145
|
+
* author's file full of keys they never asked for, and "the schema mentions it" is not a reason for
|
|
146
|
+
* it to exist on disk — the form still draws a row for it, because the form draws the SCHEMA.
|
|
147
|
+
*/
|
|
148
|
+
export function seedEntry(schema: ContentTypeSchema | null | undefined): Record<string, unknown> {
|
|
149
|
+
const properties = schema?.properties;
|
|
150
|
+
if (!properties) {
|
|
151
|
+
return {};
|
|
152
|
+
}
|
|
153
|
+
const required = new Set(Array.isArray(schema?.required) ? schema.required : []);
|
|
154
|
+
const seed: Record<string, unknown> = {};
|
|
155
|
+
for (const [name, field] of Object.entries(properties)) {
|
|
156
|
+
if (field.default !== undefined) {
|
|
157
|
+
seed[name] = cloneDefault(field.default);
|
|
158
|
+
} else if (required.has(name)) {
|
|
159
|
+
seed[name] = emptyForField(field);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return seed;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Required properties this record leaves absent — what a caller checks before claiming an entry is
|
|
167
|
+
* valid. `seedEntry`'s whole promise is that this is empty for a freshly seeded entry.
|
|
168
|
+
*/
|
|
169
|
+
export function missingRequired(
|
|
170
|
+
schema: ContentTypeSchema | null | undefined,
|
|
171
|
+
value: Record<string, unknown>,
|
|
172
|
+
): string[] {
|
|
173
|
+
const required = Array.isArray(schema?.required) ? schema.required : [];
|
|
174
|
+
return required.filter((name) => value[name] === undefined);
|
|
175
|
+
}
|
|
@@ -2,9 +2,13 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Parent-realm adapter for canvas right-clicks: the iframe suppresses the browser menu and posts
|
|
4
4
|
* `contextMenu` with the nearest element path + iframe-viewport coords; the host converts to
|
|
5
|
-
* parent-viewport coords and calls this handler, which shows the Jx element context menu
|
|
6
|
-
*
|
|
7
|
-
*
|
|
5
|
+
* parent-viewport coords and calls this handler, which shows the Jx element context menu. Replaces
|
|
6
|
+
* the legacy panel-events canvas contextmenu handler that died with the in-parent <div> canvas.
|
|
7
|
+
*
|
|
8
|
+
* The canvas menu IS the `context/element` placement — this adapter contributes coordinates and the
|
|
9
|
+
* component-navigation hook, and never a list of verbs. Which rows appear, what they are called,
|
|
10
|
+
* whether they are enabled and what chord they teach all come from the registry
|
|
11
|
+
* (`context-menu.ts`).
|
|
8
12
|
*/
|
|
9
13
|
|
|
10
14
|
import { dismissContextMenu, showContextMenu } from "./context-menu";
|
|
@@ -14,12 +18,14 @@ import type { CanvasContextMenuHandler } from "../canvas/iframe-host";
|
|
|
14
18
|
import type { JxPath } from "../state";
|
|
15
19
|
|
|
16
20
|
/**
|
|
17
|
-
* Build the handler
|
|
18
|
-
*
|
|
21
|
+
* Build the handler.
|
|
22
|
+
*
|
|
23
|
+
* It took a `navigateToComponent` dep, threaded into the menu as a per-target `onEditComponent`
|
|
24
|
+
* hook. "Edit Component" is `panels/block-action-bar.ts`'s record now and navigates through the
|
|
25
|
+
* same function this host was handing over, so the dep became a second way to say one thing — and a
|
|
26
|
+
* component right-clicked from a host that forgot to pass it showed neither Edit nor Convert.
|
|
19
27
|
*/
|
|
20
|
-
export function makeCanvasContextMenuHandler(
|
|
21
|
-
navigateToComponent: (path: string) => void | Promise<void>;
|
|
22
|
-
}): CanvasContextMenuHandler {
|
|
28
|
+
export function makeCanvasContextMenuHandler(): CanvasContextMenuHandler {
|
|
23
29
|
return {
|
|
24
30
|
dismiss: () => dismissContextMenu(),
|
|
25
31
|
show: ({ path, clientX, clientY }) => {
|
|
@@ -32,9 +38,9 @@ export function makeCanvasContextMenuHandler(deps: {
|
|
|
32
38
|
// ShowContextMenu reads only preventDefault/clientX/clientY from the event, so a synthetic
|
|
33
39
|
// MouseEvent carries the converted coords safely.
|
|
34
40
|
const evt = new MouseEvent("contextmenu", { clientX, clientY });
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
41
|
+
// No `onEditComponent` hook: "Edit Component" is `block-action-bar.ts`'s record now, and it
|
|
42
|
+
// Navigates through the same `navigateToComponent` this host was handing over.
|
|
43
|
+
showContextMenu(evt, bubbled);
|
|
38
44
|
},
|
|
39
45
|
};
|
|
40
46
|
}
|
|
@@ -14,8 +14,15 @@ import type { CanvasSlashHandler } from "../canvas/iframe-host";
|
|
|
14
14
|
export const canvasSlashHandler: CanvasSlashHandler = {
|
|
15
15
|
dismiss: () => dismissSlashMenu(),
|
|
16
16
|
nav: (key) => handleSlashMenuKey(key),
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
17
|
+
/* The filter field appears only when the frame asks for it, and only the frame knows why the menu
|
|
18
|
+
opened. Typing "/" needs none — the author keeps typing into the iframe's contenteditable and
|
|
19
|
+
the engine re-posts `slashShow` with the updated filter. A menu opened BY NAME
|
|
20
|
+
(`insert.openSlashMenu`) has no "/…" run to type into, so without the field the only way past
|
|
21
|
+
fifteen blocks is scrolling. */
|
|
22
|
+
show: ({ rect, filter, showFilter, onSelect, onDismiss }) =>
|
|
23
|
+
showSlashMenuAtRect(rect, filter, {
|
|
24
|
+
onDismiss,
|
|
25
|
+
onSelect,
|
|
26
|
+
...(showFilter === true ? { showFilter: true } : {}),
|
|
27
|
+
}),
|
|
21
28
|
};
|