@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
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What makes a component's tag name usable, decided once.
|
|
3
|
+
*
|
|
4
|
+
* Two rules used to answer this and they disagreed: Convert to Component accepted
|
|
5
|
+
* `/^[a-z][a-z0-9]*(-[a-z0-9]+)+$/`, which refused `x-card.v2` and `my_el-x`, and the Library's
|
|
6
|
+
* component seed accepted `/^[a-z][\d.a-z]*-[\d.a-z-]*$/`, which allowed a trailing hyphen the
|
|
7
|
+
* first refused. Neither was the rule the browser applies, which is the only one that matters: a
|
|
8
|
+
* definition whose tag `customElements.define` rejects is a component nothing can register. So this
|
|
9
|
+
* module states HTML's own production — the [valid custom element
|
|
10
|
+
* name](https://html.spec.whatwg.org/multipage/custom-elements.html#valid-custom-element-name) —
|
|
11
|
+
* and every creation flow asks it: Add new (`create/add-new.ts`) and Convert to Component
|
|
12
|
+
* (`editor/convert-to-component.ts`).
|
|
13
|
+
*
|
|
14
|
+
* The DERIVER is the other half. A name the reader typed as a title ("Pricing table") becomes a tag
|
|
15
|
+
* (`pricing-table`), and a name with no hyphen gains a `site-` prefix rather than being refused,
|
|
16
|
+
* because "Hero" is a perfectly good thing to call a component and a refusal there teaches nothing
|
|
17
|
+
* but the syntax of a rule the app can satisfy itself (`specs/studio.md` §9.1.1).
|
|
18
|
+
*
|
|
19
|
+
* DOM-free, so the command records and the pure derivation can import it in a bare Bun process.
|
|
20
|
+
*
|
|
21
|
+
* @docs studio/design/components
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
import { slugify } from "../files/new-file-name";
|
|
25
|
+
|
|
26
|
+
/** The prefix a hyphenless slug gains, so the derived tag is a valid custom element name. */
|
|
27
|
+
export const TAG_PREFIX = "site-";
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Names HTML reserves: they match the production but are SVG and MathML elements that predate it,
|
|
31
|
+
* so `customElements.define` refuses each one.
|
|
32
|
+
*/
|
|
33
|
+
export const RESERVED_ELEMENT_NAMES: ReadonlySet<string> = new Set([
|
|
34
|
+
"annotation-xml",
|
|
35
|
+
"color-profile",
|
|
36
|
+
"font-face",
|
|
37
|
+
"font-face-format",
|
|
38
|
+
"font-face-name",
|
|
39
|
+
"font-face-src",
|
|
40
|
+
"font-face-uri",
|
|
41
|
+
"missing-glyph",
|
|
42
|
+
]);
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* HTML's `PCENChar`: the characters a potential custom element name may hold after its first
|
|
46
|
+
* letter. ASCII upper case is deliberately absent, which is why a tag name is lower case.
|
|
47
|
+
*/
|
|
48
|
+
const PCEN_RANGES: readonly (readonly [number, number])[] = [
|
|
49
|
+
[0xb7, 0xb7],
|
|
50
|
+
[0xc0, 0xd6],
|
|
51
|
+
[0xd8, 0xf6],
|
|
52
|
+
[0xf8, 0x3_7d],
|
|
53
|
+
[0x3_7f, 0x1f_ff],
|
|
54
|
+
[0x20_0c, 0x20_0d],
|
|
55
|
+
[0x20_3f, 0x20_40],
|
|
56
|
+
[0x20_70, 0x21_8f],
|
|
57
|
+
[0x2c_00, 0x2f_ef],
|
|
58
|
+
[0x30_01, 0xd7_ff],
|
|
59
|
+
[0xf9_00, 0xfd_cf],
|
|
60
|
+
[0xfd_f0, 0xff_fd],
|
|
61
|
+
[0x1_00_00, 0xe_ff_ff],
|
|
62
|
+
];
|
|
63
|
+
|
|
64
|
+
/** A code point as a `u`-flag regular expression escape, so no invisible character is in source. */
|
|
65
|
+
function escapeCodePoint(cp: number): string {
|
|
66
|
+
return `${String.fromCodePoint(92)}u{${cp.toString(16)}}`;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/** The whole class body: ASCII first, then each range by its escaped ends. */
|
|
70
|
+
const PCEN_CHAR = [
|
|
71
|
+
String.raw`\-.0-9_a-z`,
|
|
72
|
+
...PCEN_RANGES.map(([from, to]) => `${escapeCodePoint(from)}-${escapeCodePoint(to)}`),
|
|
73
|
+
].join("");
|
|
74
|
+
|
|
75
|
+
/** One character that may appear after the first letter. */
|
|
76
|
+
const ONE_PCEN_CHAR = new RegExp(`^[${PCEN_CHAR}]$`, "u");
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* The sentence a tag name earns, or `""` when it is valid.
|
|
80
|
+
*
|
|
81
|
+
* Each sentence names the one thing to change, in the order a reader fixes them: say something,
|
|
82
|
+
* start with a letter, lose the character the browser refuses, add the hyphen, avoid a reserved
|
|
83
|
+
* name.
|
|
84
|
+
*/
|
|
85
|
+
export function customElementNameProblem(name: string): string {
|
|
86
|
+
if (name === "") {
|
|
87
|
+
return "Enter a tag name.";
|
|
88
|
+
}
|
|
89
|
+
if (!/^[a-z]/.test(name)) {
|
|
90
|
+
return "A tag name starts with a lower-case letter.";
|
|
91
|
+
}
|
|
92
|
+
for (const char of name.slice(1)) {
|
|
93
|
+
if (!ONE_PCEN_CHAR.test(char)) {
|
|
94
|
+
return /[A-Z]/.test(char)
|
|
95
|
+
? "A tag name is lower case."
|
|
96
|
+
: `“${char}” cannot appear in a tag name.`;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
if (!name.includes("-")) {
|
|
100
|
+
return "A tag name needs a hyphen, such as my-card.";
|
|
101
|
+
}
|
|
102
|
+
if (RESERVED_ELEMENT_NAMES.has(name)) {
|
|
103
|
+
return `<${name}> is reserved by HTML.`;
|
|
104
|
+
}
|
|
105
|
+
return "";
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* The tag a display name derives to: slugified, its hyphens tidied, and prefixed with
|
|
110
|
+
* {@link TAG_PREFIX} when it would otherwise have no hyphen or would start with a digit.
|
|
111
|
+
*
|
|
112
|
+
* `"Pricing table"` → `pricing-table`, `"Hero"` → `site-hero`, `"2 columns"` → `site-2-columns`,
|
|
113
|
+
* and a name with nothing usable in it → `""`, which {@link customElementNameProblem} refuses.
|
|
114
|
+
*/
|
|
115
|
+
export function deriveTagName(input: string): string {
|
|
116
|
+
const slug = slugify(input).replaceAll(/-+/g, "-").replaceAll(/^-|-$/g, "");
|
|
117
|
+
if (slug === "") {
|
|
118
|
+
return "";
|
|
119
|
+
}
|
|
120
|
+
return /^[a-z]/.test(slug) && slug.includes("-") ? slug : `${TAG_PREFIX}${slug}`;
|
|
121
|
+
}
|
|
@@ -15,7 +15,6 @@ import { dismissContextMenu, showContextMenu } from "./context-menu";
|
|
|
15
15
|
import { bubbleInlinePath } from "../canvas/canvas-helpers";
|
|
16
16
|
import { activeTab } from "../workspace/workspace";
|
|
17
17
|
import type { CanvasContextMenuHandler } from "../canvas/iframe-host";
|
|
18
|
-
import type { JxPath } from "../state";
|
|
19
18
|
|
|
20
19
|
/**
|
|
21
20
|
* Build the handler.
|
|
@@ -34,7 +33,7 @@ export function makeCanvasContextMenuHandler(): CanvasContextMenuHandler {
|
|
|
34
33
|
}
|
|
35
34
|
// Lift inline-element paths (a <strong> inside a <p>) to their block parent — right-clicking
|
|
36
35
|
// Formatted text should act on the block, matching the legacy handler.
|
|
37
|
-
const bubbled = bubbleInlinePath(activeTab.value?.doc.document, path
|
|
36
|
+
const bubbled = bubbleInlinePath(activeTab.value?.doc.document, path);
|
|
38
37
|
// ShowContextMenu reads only preventDefault/clientX/clientY from the event, so a synthetic
|
|
39
38
|
// MouseEvent carries the converted coords safely.
|
|
40
39
|
const evt = new MouseEvent("contextmenu", { clientX, clientY });
|
|
@@ -18,11 +18,8 @@ export const canvasSlashHandler: CanvasSlashHandler = {
|
|
|
18
18
|
opened. Typing "/" needs none — the author keeps typing into the iframe's contenteditable and
|
|
19
19
|
the engine re-posts `slashShow` with the updated filter. A menu opened BY NAME
|
|
20
20
|
(`insert.openSlashMenu`) has no "/…" run to type into, so without the field the only way past
|
|
21
|
-
fifteen blocks is scrolling.
|
|
21
|
+
fifteen blocks is scrolling. The menu reads `showFilter` for truthiness alone, so `false` and an
|
|
22
|
+
absent key are one state to it. */
|
|
22
23
|
show: ({ rect, filter, showFilter, onSelect, onDismiss }) =>
|
|
23
|
-
showSlashMenuAtRect(rect, filter, {
|
|
24
|
-
onDismiss,
|
|
25
|
-
onSelect,
|
|
26
|
-
...(showFilter === true ? { showFilter: true } : {}),
|
|
27
|
-
}),
|
|
24
|
+
showSlashMenuAtRect(rect, filter, { onDismiss, onSelect, showFilter: showFilter === true }),
|
|
28
25
|
};
|
|
@@ -14,11 +14,18 @@
|
|
|
14
14
|
* @docs studio/editing/writing
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
+
import { isString } from "@jxsuite/schema/guards";
|
|
17
18
|
import type { JxMutableNode } from "@jxsuite/schema/types";
|
|
18
19
|
|
|
19
20
|
/** A block's content as a children array — the form both storage shapes normalize to. */
|
|
20
21
|
export type Content = (JxMutableNode | string)[];
|
|
21
22
|
|
|
23
|
+
/** A block's content in the form it is stored: `children` for markup, folded `textContent` else. */
|
|
24
|
+
export interface StoredContent {
|
|
25
|
+
children?: Content;
|
|
26
|
+
textContent?: string;
|
|
27
|
+
}
|
|
28
|
+
|
|
22
29
|
/**
|
|
23
30
|
* The content of `node` as a children array, whichever way it is stored.
|
|
24
31
|
*
|
|
@@ -30,18 +37,16 @@ export function contentOf(node: JxMutableNode | undefined | null): Content {
|
|
|
30
37
|
return [];
|
|
31
38
|
}
|
|
32
39
|
if (Array.isArray(node.children)) {
|
|
33
|
-
return node.children
|
|
40
|
+
return node.children;
|
|
34
41
|
}
|
|
35
|
-
return
|
|
36
|
-
? [node.textContent]
|
|
37
|
-
: [];
|
|
42
|
+
return isString(node.textContent) && node.textContent.length > 0 ? [node.textContent] : [];
|
|
38
43
|
}
|
|
39
44
|
|
|
40
45
|
/** The rendered text length of a content array. */
|
|
41
46
|
export function contentLength(children: Content): number {
|
|
42
47
|
let n = 0;
|
|
43
48
|
for (const child of children) {
|
|
44
|
-
n +=
|
|
49
|
+
n += isString(child) ? child.length : contentLength(contentOf(child));
|
|
45
50
|
}
|
|
46
51
|
return n;
|
|
47
52
|
}
|
|
@@ -60,7 +65,7 @@ export function sliceContent(children: Content, start: number, end: number): Con
|
|
|
60
65
|
if (pos >= end) {
|
|
61
66
|
break;
|
|
62
67
|
}
|
|
63
|
-
if (
|
|
68
|
+
if (isString(child)) {
|
|
64
69
|
const childEnd = pos + child.length;
|
|
65
70
|
if (childEnd > start) {
|
|
66
71
|
const text = child.slice(
|
|
@@ -102,7 +107,7 @@ function withContent(node: JxMutableNode, children: Content): JxMutableNode {
|
|
|
102
107
|
if (children.length === 0) {
|
|
103
108
|
return { ...rest, textContent: "" };
|
|
104
109
|
}
|
|
105
|
-
if (children.length === 1 &&
|
|
110
|
+
if (children.length === 1 && isString(children[0])) {
|
|
106
111
|
return { ...rest, textContent: children[0] };
|
|
107
112
|
}
|
|
108
113
|
return { ...rest, children };
|
|
@@ -115,12 +120,12 @@ function withContent(node: JxMutableNode, children: Content): JxMutableNode {
|
|
|
115
120
|
export function normalizeContent(children: Content): Content {
|
|
116
121
|
const out: Content = [];
|
|
117
122
|
for (const child of children) {
|
|
118
|
-
if (
|
|
123
|
+
if (isString(child)) {
|
|
119
124
|
if (child.length === 0) {
|
|
120
125
|
continue;
|
|
121
126
|
}
|
|
122
127
|
const prev = out.at(-1);
|
|
123
|
-
if (
|
|
128
|
+
if (isString(prev)) {
|
|
124
129
|
out[out.length - 1] = prev + child;
|
|
125
130
|
continue;
|
|
126
131
|
}
|
|
@@ -152,15 +157,12 @@ export function spliceAcross(
|
|
|
152
157
|
}
|
|
153
158
|
|
|
154
159
|
/** `{ children }` when the content carries markup, else the folded `{ textContent }` form. */
|
|
155
|
-
export function toStored(children: Content): {
|
|
156
|
-
children?: Content;
|
|
157
|
-
textContent?: string;
|
|
158
|
-
} {
|
|
160
|
+
export function toStored(children: Content): StoredContent {
|
|
159
161
|
const normalized = normalizeContent(children);
|
|
160
162
|
if (normalized.length === 0) {
|
|
161
163
|
return { textContent: "" };
|
|
162
164
|
}
|
|
163
|
-
if (normalized.length === 1 &&
|
|
165
|
+
if (normalized.length === 1 && isString(normalized[0])) {
|
|
164
166
|
return { textContent: normalized[0] };
|
|
165
167
|
}
|
|
166
168
|
return { children: normalized };
|
|
@@ -21,10 +21,11 @@
|
|
|
21
21
|
* is left here is the projection: the menu itself is the `menu` surface (`surfaces/menu.json`), a
|
|
22
22
|
* `jx-menu` the kit gives its keyboard contract, its popover and its dismissal.
|
|
23
23
|
*/
|
|
24
|
-
import {
|
|
24
|
+
import { getNodeAtPath } from "@jxsuite/schema/doc-ops";
|
|
25
|
+
import { displayTagName, isNodeObject, isNonNullObject, isString } from "@jxsuite/schema/guards";
|
|
25
26
|
import { jsonClone } from "../utils/studio-utils";
|
|
26
27
|
import { htmlToJx } from "@jxsuite/markup/html-to-jx";
|
|
27
|
-
import { childIndex,
|
|
28
|
+
import { childIndex, parentElementPath } from "../store";
|
|
28
29
|
import { activeTab, workspace } from "../workspace/workspace";
|
|
29
30
|
import { isSelected, isSpliceablePath, primarySelection } from "../tabs/selection";
|
|
30
31
|
import {
|
|
@@ -58,17 +59,15 @@ import type { AnyCommand, CommandRegistry } from "../commands/registry";
|
|
|
58
59
|
import type { CommandContext } from "../commands/context";
|
|
59
60
|
import type { Placement } from "../commands/levels";
|
|
60
61
|
import type { JxPath } from "../state";
|
|
61
|
-
import type { JxMutableNode, JxStyle } from "@jxsuite/schema/types";
|
|
62
|
-
|
|
63
|
-
type JxNode = JxMutableNode;
|
|
62
|
+
import type { JxAttributeValue, JxMutableNode, JxStyle } from "@jxsuite/schema/types";
|
|
64
63
|
|
|
65
64
|
// ─── Clipboard helpers ───────────────────────────────────────────────────────
|
|
66
65
|
|
|
67
|
-
const JX_MIME = "web application/jx+json";
|
|
66
|
+
export const JX_MIME = "web application/jx+json";
|
|
68
67
|
|
|
69
|
-
/** @param {
|
|
70
|
-
function nodeToHtml(node:
|
|
71
|
-
if (
|
|
68
|
+
/** @param {JxMutableNode | string} node */
|
|
69
|
+
function nodeToHtml(node: JxMutableNode | string): string {
|
|
70
|
+
if (isString(node)) {
|
|
72
71
|
return node;
|
|
73
72
|
}
|
|
74
73
|
/* A chosen tag cannot be serialised to one HTML string, so the copy takes the branch the
|
|
@@ -77,9 +76,10 @@ function nodeToHtml(node: JxNode | string): string {
|
|
|
77
76
|
const tag = displayTagName(node.tagName).split("|")[0] || "div";
|
|
78
77
|
let attrs = "";
|
|
79
78
|
if (node.attributes) {
|
|
80
|
-
|
|
79
|
+
// A document's attribute value is read as possibly JSON `null`, which is skipped with the refs.
|
|
80
|
+
for (const [k, v] of Object.entries<JxAttributeValue | null>(node.attributes)) {
|
|
81
81
|
// Bound ($ref) attribute values have no static HTML representation — skip.
|
|
82
|
-
if (
|
|
82
|
+
if (v === null || isNonNullObject(v)) {
|
|
83
83
|
continue;
|
|
84
84
|
}
|
|
85
85
|
attrs += v === "" ? ` ${k}` : ` ${k}="${String(v).replaceAll('"', """)}"`;
|
|
@@ -94,7 +94,7 @@ function nodeToHtml(node: JxNode | string): string {
|
|
|
94
94
|
}
|
|
95
95
|
}
|
|
96
96
|
let inner = "";
|
|
97
|
-
if (
|
|
97
|
+
if (isString(node.textContent)) {
|
|
98
98
|
inner = node.textContent;
|
|
99
99
|
} else if (Array.isArray(node.children)) {
|
|
100
100
|
inner = node.children.map((c) => nodeToHtml(c)).join("");
|
|
@@ -105,9 +105,9 @@ function nodeToHtml(node: JxNode | string): string {
|
|
|
105
105
|
/**
|
|
106
106
|
* Write a Jx node to the system clipboard with both jx+json and text/html types.
|
|
107
107
|
*
|
|
108
|
-
* @param {
|
|
108
|
+
* @param {JxMutableNode} json
|
|
109
109
|
*/
|
|
110
|
-
async function writeToClipboard(json:
|
|
110
|
+
async function writeToClipboard(json: JxMutableNode) {
|
|
111
111
|
workspace.clipboard = json;
|
|
112
112
|
try {
|
|
113
113
|
const jxBlob = new Blob([JSON.stringify(json)], { type: JX_MIME });
|
|
@@ -131,7 +131,7 @@ async function writeToClipboard(json: Record<string, unknown>) {
|
|
|
131
131
|
/**
|
|
132
132
|
* Read from the system clipboard. Returns Jx node(s) or null.
|
|
133
133
|
*
|
|
134
|
-
* @returns {Promise<
|
|
134
|
+
* @returns {Promise<JxMutableNode[] | null>}
|
|
135
135
|
*/
|
|
136
136
|
async function readFromClipboard() {
|
|
137
137
|
try {
|
|
@@ -139,16 +139,18 @@ async function readFromClipboard() {
|
|
|
139
139
|
for (const item of items) {
|
|
140
140
|
if (item.types.includes(JX_MIME)) {
|
|
141
141
|
const blob = await item.getType(JX_MIME);
|
|
142
|
-
|
|
142
|
+
/* SAFETY: `web application/jx+json` is Jx's own clipboard type, and `writeToClipboard` puts a
|
|
143
|
+
node there serialized with JSON.stringify; malformed text throws into the fallback below. */
|
|
144
|
+
const json = JSON.parse(await blob.text()) as JxMutableNode;
|
|
143
145
|
return [json];
|
|
144
146
|
}
|
|
145
147
|
if (item.types.includes("text/html")) {
|
|
146
148
|
const blob = await item.getType("text/html");
|
|
147
149
|
const htmlStr = await blob.text();
|
|
148
150
|
const nodes = htmlToJx(htmlStr);
|
|
149
|
-
const jxNodes = nodes.map((n) =>
|
|
150
|
-
|
|
151
|
-
)
|
|
151
|
+
const jxNodes: JxMutableNode[] = nodes.map((n) =>
|
|
152
|
+
isString(n) ? { tagName: "p", textContent: n } : n,
|
|
153
|
+
);
|
|
152
154
|
if (jxNodes.length > 0) {
|
|
153
155
|
return jxNodes;
|
|
154
156
|
}
|
|
@@ -158,8 +160,8 @@ async function readFromClipboard() {
|
|
|
158
160
|
const text = await blob.text();
|
|
159
161
|
// Try parsing as Jx JSON
|
|
160
162
|
try {
|
|
161
|
-
const parsed = JSON.parse(text)
|
|
162
|
-
if (parsed && parsed.tagName) {
|
|
163
|
+
const parsed: unknown = JSON.parse(text);
|
|
164
|
+
if (isNodeObject(parsed) && parsed.tagName) {
|
|
163
165
|
return [parsed];
|
|
164
166
|
}
|
|
165
167
|
} catch {
|
|
@@ -241,7 +243,12 @@ export async function pasteNode() {
|
|
|
241
243
|
}
|
|
242
244
|
|
|
243
245
|
if (selected && selected.length >= 2) {
|
|
246
|
+
// SAFETY: parentElementPath returns a path for any path of two or more segments, checked above.
|
|
244
247
|
const pp = parentElementPath(selected) as JxPath;
|
|
248
|
+
/* SAFETY: a selection with a sibling position ends in `"children", <index>`, so this is the
|
|
249
|
+
numeric child index. A selected repeater template (`…, "map"`) or `$switch` case also has two
|
|
250
|
+
or more segments; callers do not exclude that case yet, so it reaches here with a string
|
|
251
|
+
segment exactly as before this cast. */
|
|
245
252
|
const idx = childIndex(selected) as number;
|
|
246
253
|
transactDoc(tab, (t) => {
|
|
247
254
|
for (let i = 0; i < nodes.length; i++) {
|
|
@@ -408,7 +415,10 @@ export function elementCommands(deps: ElementCommandDeps): AnyCommand[] {
|
|
|
408
415
|
if (!target || !nodes || nodes.length === 0) {
|
|
409
416
|
return;
|
|
410
417
|
}
|
|
418
|
+
/* SAFETY: this record runs only when enabled, and `spliceable` admits a target whose path
|
|
419
|
+
ends in `"children", <index>` — so it has a parent element path. */
|
|
411
420
|
const parent = parentElementPath(target.path) as JxPath;
|
|
421
|
+
// SAFETY: the same `spliceable` check proved the last segment is a numeric child index.
|
|
412
422
|
const idx = childIndex(target.path) as number;
|
|
413
423
|
transactDoc(activeTab.value, (t) => {
|
|
414
424
|
for (const [offset, node] of nodes.entries()) {
|
|
@@ -576,7 +586,10 @@ function insertSiblingParagraph(target: ElementMenuTarget | null, offset: number
|
|
|
576
586
|
if (!target) {
|
|
577
587
|
return;
|
|
578
588
|
}
|
|
589
|
+
/* SAFETY: both callers are records enabled only by `spliceable`, which admits a target whose path
|
|
590
|
+
ends in `"children", <index>` — so it has a parent element path. */
|
|
579
591
|
const parent = parentElementPath(target.path) as JxPath;
|
|
592
|
+
// SAFETY: the same `spliceable` check proved the last segment is a numeric child index.
|
|
580
593
|
const idx = childIndex(target.path) as number;
|
|
581
594
|
transactDoc(activeTab.value, (t) =>
|
|
582
595
|
mutateInsertNode(t, parent, idx + offset, { children: [], tagName: "p" }),
|
|
@@ -681,7 +694,7 @@ function commandTarget(): ElementMenuTarget | null {
|
|
|
681
694
|
if (!tab || !path) {
|
|
682
695
|
return null;
|
|
683
696
|
}
|
|
684
|
-
const node = getNodeAtPath(tab.doc.document, path)
|
|
697
|
+
const node = getNodeAtPath(tab.doc.document, path);
|
|
685
698
|
return node ? { node, path } : null;
|
|
686
699
|
}
|
|
687
700
|
|
|
@@ -1,34 +1,33 @@
|
|
|
1
1
|
import elementsMeta from "../../data/elements-meta.json";
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
}
|
|
3
|
+
import { ELEMENT_DEFS } from "./editable-tags";
|
|
4
|
+
import type { SlashCommand } from "./inline-edit";
|
|
5
|
+
|
|
6
|
+
export type { SlashCommand } from "./inline-edit";
|
|
8
7
|
|
|
9
|
-
const TAG_LABELS =
|
|
10
|
-
article
|
|
11
|
-
aside
|
|
12
|
-
blockquote
|
|
13
|
-
div
|
|
14
|
-
footer
|
|
15
|
-
h1
|
|
16
|
-
h2
|
|
17
|
-
h3
|
|
18
|
-
h4
|
|
19
|
-
h5
|
|
20
|
-
h6
|
|
21
|
-
header
|
|
22
|
-
main
|
|
23
|
-
nav
|
|
24
|
-
ol
|
|
25
|
-
p
|
|
26
|
-
search
|
|
27
|
-
section
|
|
28
|
-
ul
|
|
29
|
-
|
|
8
|
+
const TAG_LABELS = new Map<string, string>([
|
|
9
|
+
["article", "Article"],
|
|
10
|
+
["aside", "Aside"],
|
|
11
|
+
["blockquote", "Blockquote"],
|
|
12
|
+
["div", "Div"],
|
|
13
|
+
["footer", "Footer"],
|
|
14
|
+
["h1", "Heading 1"],
|
|
15
|
+
["h2", "Heading 2"],
|
|
16
|
+
["h3", "Heading 3"],
|
|
17
|
+
["h4", "Heading 4"],
|
|
18
|
+
["h5", "Heading 5"],
|
|
19
|
+
["h6", "Heading 6"],
|
|
20
|
+
["header", "Header"],
|
|
21
|
+
["main", "Main"],
|
|
22
|
+
["nav", "Nav"],
|
|
23
|
+
["ol", "Numbered List"],
|
|
24
|
+
["p", "Paragraph"],
|
|
25
|
+
["search", "Search"],
|
|
26
|
+
["section", "Section"],
|
|
27
|
+
["ul", "Bulleted List"],
|
|
28
|
+
]);
|
|
30
29
|
|
|
31
|
-
const groups
|
|
30
|
+
const groups: Readonly<Record<string, string[]>> = elementsMeta.$convertGroups;
|
|
32
31
|
|
|
33
32
|
/**
|
|
34
33
|
* Get the list of tags the current element can be converted to.
|
|
@@ -37,18 +36,14 @@ const groups = (elementsMeta.$convertGroups || {}) as Record<string, string[]>;
|
|
|
37
36
|
* @param {boolean} isEmpty
|
|
38
37
|
* @returns {SlashCommand[]}
|
|
39
38
|
*/
|
|
40
|
-
export function getConvertTargets(currentTag: string, isEmpty: boolean) {
|
|
41
|
-
const def =
|
|
42
|
-
| Record<string, unknown>
|
|
43
|
-
| undefined;
|
|
39
|
+
export function getConvertTargets(currentTag: string, isEmpty: boolean): SlashCommand[] {
|
|
40
|
+
const def = ELEMENT_DEFS[currentTag];
|
|
44
41
|
if (!def?.$convertTo) {
|
|
45
42
|
return [];
|
|
46
43
|
}
|
|
47
44
|
|
|
48
45
|
const groupNames =
|
|
49
|
-
isEmpty && def.$convertToWhenEmpty
|
|
50
|
-
? (def.$convertToWhenEmpty as string[])
|
|
51
|
-
: [def.$convertTo as string];
|
|
46
|
+
isEmpty && def.$convertToWhenEmpty ? def.$convertToWhenEmpty : [def.$convertTo];
|
|
52
47
|
|
|
53
48
|
const tags = new Set<string>();
|
|
54
49
|
for (const name of groupNames) {
|
|
@@ -61,7 +56,7 @@ export function getConvertTargets(currentTag: string, isEmpty: boolean) {
|
|
|
61
56
|
|
|
62
57
|
return [...tags].map((tag) => ({
|
|
63
58
|
description: "",
|
|
64
|
-
label: TAG_LABELS
|
|
59
|
+
label: TAG_LABELS.get(tag) || tag.charAt(0).toUpperCase() + tag.slice(1),
|
|
65
60
|
tag,
|
|
66
61
|
}));
|
|
67
62
|
}
|