@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
|
@@ -20,8 +20,10 @@
|
|
|
20
20
|
* @docs studio/design/elements
|
|
21
21
|
*/
|
|
22
22
|
|
|
23
|
+
import { isString } from "@jxsuite/schema/guards";
|
|
23
24
|
import { nothing } from "lit-html";
|
|
24
25
|
import { buildComponentInstance, componentRegistry } from "../files/components";
|
|
26
|
+
import { mutateImportComponent } from "../editor/insert-component";
|
|
25
27
|
import { childList, getNodeAtPath } from "../store";
|
|
26
28
|
import { getEffectiveElements } from "../site-context";
|
|
27
29
|
import { mountElementsSurface } from "../surfaces/panel-elements";
|
|
@@ -44,7 +46,7 @@ import type { NavigatorPanelContext, NavigatorPanelDeps, PanelBody } from "./pan
|
|
|
44
46
|
|
|
45
47
|
/** The palette's source of blocks, as `NavigatorPanelDeps.webdata` carries it. */
|
|
46
48
|
interface ElementsWebdata {
|
|
47
|
-
elements
|
|
49
|
+
elements?: Record<string, { tag: string }[]>;
|
|
48
50
|
}
|
|
49
51
|
|
|
50
52
|
/** The Components section's name — its accordion label AND its key in `view.elementsCollapsed`. */
|
|
@@ -99,12 +101,15 @@ function categoryViews(webdata: ElementsWebdata, filter: string): ElementCategor
|
|
|
99
101
|
*/
|
|
100
102
|
function enabledNpmTags(): Set<string> {
|
|
101
103
|
const tab = activeTab.value;
|
|
104
|
+
/* SAFETY: getEffectiveElements reads nothing off an object entry but `$ref` (its dedup key), and
|
|
105
|
+
this function keeps only the string entries, so typing the document's node entries as
|
|
106
|
+
JxElement is never observed. */
|
|
102
107
|
const entries = getEffectiveElements(
|
|
103
108
|
tab?.doc.document?.$elements as (string | JxElement)[] | undefined,
|
|
104
109
|
);
|
|
105
110
|
const tags = new Set<string>();
|
|
106
111
|
for (const entry of entries) {
|
|
107
|
-
if (
|
|
112
|
+
if (!isString(entry)) {
|
|
108
113
|
continue;
|
|
109
114
|
}
|
|
110
115
|
const named = componentRegistry.find(
|
|
@@ -143,7 +148,9 @@ function componentViews(filter: string): ComponentCardView[] {
|
|
|
143
148
|
/** Everything the document draws, as one value. */
|
|
144
149
|
function panelValues(source: NavigatorPanelDeps): ElementsValues {
|
|
145
150
|
const filter = needle();
|
|
146
|
-
|
|
151
|
+
/* SAFETY: `webdata` is wired in studio.ts from the bundled data/webdata.json, whose `elements`
|
|
152
|
+
maps each category name to an array of `{ tag }` entries. */
|
|
153
|
+
const categories = categoryViews(source.webdata as ElementsWebdata, filter);
|
|
147
154
|
const components = componentViews(filter);
|
|
148
155
|
const bare = categories.length === 0 && components.length === 0;
|
|
149
156
|
return {
|
|
@@ -158,7 +165,10 @@ function panelValues(source: NavigatorPanelDeps): ElementsValues {
|
|
|
158
165
|
};
|
|
159
166
|
}
|
|
160
167
|
|
|
161
|
-
/**
|
|
168
|
+
/**
|
|
169
|
+
* Insert a node as the last child of the selected element — what both kinds of card do — and import
|
|
170
|
+
* it when it is a component, as a drag of the same card does (§5.7: insertion has one meaning).
|
|
171
|
+
*/
|
|
162
172
|
function insertAtSelection(def: JxMutableNode): void {
|
|
163
173
|
const tab = activeTab.value;
|
|
164
174
|
if (!tab) {
|
|
@@ -167,7 +177,10 @@ function insertAtSelection(def: JxMutableNode): void {
|
|
|
167
177
|
const parentPath = primarySelection(tab.session.selection) ?? [];
|
|
168
178
|
const parent = getNodeAtPath(tab.doc.document, parentPath);
|
|
169
179
|
const index = childList(parent).length;
|
|
170
|
-
transactDoc(tab, (tr) =>
|
|
180
|
+
transactDoc(tab, (tr) => {
|
|
181
|
+
mutateInsertNode(tr, parentPath, index, structuredClone(def));
|
|
182
|
+
mutateImportComponent(tr, def.tagName);
|
|
183
|
+
});
|
|
171
184
|
}
|
|
172
185
|
|
|
173
186
|
/**
|
|
@@ -206,6 +219,7 @@ const ACTIONS: ElementsActions = {
|
|
|
206
219
|
},
|
|
207
220
|
insertElement: (tag) => {
|
|
208
221
|
if (panelDeps) {
|
|
222
|
+
// SAFETY: studio.ts wires `defaultDef` to shared.ts defaultDef, which returns a JxMutableNode.
|
|
209
223
|
insertAtSelection(panelDeps.defaultDef(tag) as JxMutableNode);
|
|
210
224
|
}
|
|
211
225
|
},
|
|
@@ -24,8 +24,8 @@
|
|
|
24
24
|
* There is no `icon` here any more, and its absence is the point rather than an omission: it was
|
|
25
25
|
* typed `TemplateResult` and every value passed to it was an `sp-icon-*`, which is a Spectrum
|
|
26
26
|
* element smuggled through a shared vocabulary into surfaces that have no other Spectrum in them.
|
|
27
|
-
*
|
|
28
|
-
* `surfaces/empty-state.json` draws a word, and a region that needs a glyph beside one is asking
|
|
27
|
+
* The Source Control panel was the last caller and it became a document, so the field went with it
|
|
28
|
+
* — `surfaces/empty-state.json` draws a word, and a region that needs a glyph beside one is asking
|
|
29
29
|
* for a control the kit declares rather than for a hole in this type.
|
|
30
30
|
*/
|
|
31
31
|
export interface EmptyStateAction {
|
|
@@ -42,7 +42,8 @@
|
|
|
42
42
|
* @docs studio/logic/events
|
|
43
43
|
*/
|
|
44
44
|
|
|
45
|
-
import { getNodeAtPath
|
|
45
|
+
import { getNodeAtPath } from "@jxsuite/schema/doc-ops";
|
|
46
|
+
import { renderOnly } from "../store";
|
|
46
47
|
import { activeTab } from "../workspace/workspace";
|
|
47
48
|
import { primarySelection, unifyValues } from "../tabs/selection";
|
|
48
49
|
import {
|
|
@@ -68,6 +69,7 @@ import {
|
|
|
68
69
|
import { VALUE_SOURCE_LABELS, capsForPosition, slotCaps, slotMode } from "../ui/value-source";
|
|
69
70
|
import { cloneValue } from "../tabs/doc-op-apply";
|
|
70
71
|
import { openMenu } from "../surfaces/menu";
|
|
72
|
+
import type { MenuRowProjection } from "../surfaces/menu";
|
|
71
73
|
import { showPromptDialog } from "../ui/layers";
|
|
72
74
|
import { effect, effectScope } from "../reactivity";
|
|
73
75
|
import {
|
|
@@ -86,30 +88,28 @@ import {
|
|
|
86
88
|
isFunctionDef,
|
|
87
89
|
isJsonObject,
|
|
88
90
|
isRef,
|
|
91
|
+
isString,
|
|
89
92
|
} from "@jxsuite/schema/guards";
|
|
90
93
|
|
|
91
94
|
import type {
|
|
92
95
|
LogicBindingView,
|
|
93
96
|
LogicBodyKind,
|
|
94
|
-
LogicEmptyAction,
|
|
95
97
|
LogicFieldView,
|
|
96
|
-
LogicOption,
|
|
97
98
|
LogicSurface,
|
|
98
99
|
LogicView,
|
|
99
100
|
} from "../surfaces/logic-panel";
|
|
100
101
|
import type { JsonValue } from "../types";
|
|
101
102
|
import type { EffectScope } from "@vue/reactivity";
|
|
102
|
-
import type { SignalOption } from "../ui/dynamic-slot";
|
|
103
103
|
import type { SlotCapsSource, SlotMode } from "../ui/value-source";
|
|
104
104
|
import type { JxPath } from "../state";
|
|
105
105
|
import type {
|
|
106
|
-
|
|
106
|
+
JxDocumentValue,
|
|
107
107
|
JxEventBinding,
|
|
108
108
|
JxFunctionDef,
|
|
109
109
|
JxMutableNode,
|
|
110
|
-
|
|
111
|
-
JxStatement,
|
|
110
|
+
JxStateDefinition,
|
|
112
111
|
} from "@jxsuite/schema/types";
|
|
112
|
+
import type { SurfaceAction, SurfaceOption } from "../ui/surface";
|
|
113
113
|
|
|
114
114
|
/**
|
|
115
115
|
* The events worth SUGGESTING — not the events an element may have.
|
|
@@ -146,7 +146,10 @@ const EVENT_NAME_PATTERN = /^on[a-z][\da-z-]*$/i;
|
|
|
146
146
|
const HANDLER_MODES: SlotMode[] = capsForPosition("eventHandler");
|
|
147
147
|
|
|
148
148
|
/** The value a handler starts at on each rung, when the user has never been on that rung before. */
|
|
149
|
-
function seedForHandlerMode(
|
|
149
|
+
function seedForHandlerMode(
|
|
150
|
+
mode: SlotMode,
|
|
151
|
+
functionDefs: [string, JxStateDefinition][],
|
|
152
|
+
): JsonValue {
|
|
150
153
|
if (mode === "function") {
|
|
151
154
|
return { $prototype: "Function", body: "", parameters: [] };
|
|
152
155
|
}
|
|
@@ -202,7 +205,7 @@ function mixedEventCount(doc: JxMutableNode, targets: readonly JxPath[], evKey:
|
|
|
202
205
|
return 0;
|
|
203
206
|
}
|
|
204
207
|
const values = targets.map((path) => {
|
|
205
|
-
const n = getNodeAtPath(doc, path)
|
|
208
|
+
const n = getNodeAtPath(doc, path);
|
|
206
209
|
return n ? (getEventBinding(n, evKey) ?? null) : null;
|
|
207
210
|
});
|
|
208
211
|
return unifyValues(values).mixed ? targets.length : 0;
|
|
@@ -214,12 +217,13 @@ function mixedEventCount(doc: JxMutableNode, targets: readonly JxPath[], evKey:
|
|
|
214
217
|
interface FieldPlan {
|
|
215
218
|
label: string;
|
|
216
219
|
caps: SlotCapsSource;
|
|
217
|
-
|
|
220
|
+
/** What the selected node holds at the row's position. */
|
|
221
|
+
value: JxDocumentValue | undefined;
|
|
218
222
|
mode: SlotMode;
|
|
219
223
|
offered: SlotMode[];
|
|
220
224
|
onChange: (v?: JsonValue) => void;
|
|
221
225
|
onClear?: (() => void) | undefined;
|
|
222
|
-
extraSignals:
|
|
226
|
+
extraSignals: SurfaceOption[] | null;
|
|
223
227
|
literalDefault: JsonValue | undefined;
|
|
224
228
|
stateDefs: readonly string[];
|
|
225
229
|
/** Fills the row's control host when the active rung is a formula. */
|
|
@@ -229,7 +233,7 @@ interface FieldPlan {
|
|
|
229
233
|
/** Everything an event binding needs. */
|
|
230
234
|
interface BindingPlan {
|
|
231
235
|
key: string;
|
|
232
|
-
value:
|
|
236
|
+
value: JxEventBinding;
|
|
233
237
|
mode: SlotMode;
|
|
234
238
|
fn: JxFunctionDef | null;
|
|
235
239
|
body: LogicBodyKind;
|
|
@@ -245,7 +249,7 @@ interface Plans {
|
|
|
245
249
|
targets: JxPath[];
|
|
246
250
|
/** The primary selection — the one whose bodies are edited. */
|
|
247
251
|
selection: JxPath | null;
|
|
248
|
-
functionDefs: [string,
|
|
252
|
+
functionDefs: [string, JxStateDefinition][];
|
|
249
253
|
}
|
|
250
254
|
|
|
251
255
|
let plans: Plans = {
|
|
@@ -280,7 +284,7 @@ function sourceHint(mode: SlotMode, offered: readonly SlotMode[]): string {
|
|
|
280
284
|
}
|
|
281
285
|
|
|
282
286
|
/** Every pointer the From data… rung offers on a bindable position. */
|
|
283
|
-
function refOptions(plan: FieldPlan):
|
|
287
|
+
function refOptions(plan: FieldPlan): SurfaceOption[] {
|
|
284
288
|
return [
|
|
285
289
|
...plan.stateDefs.map((name) => ({ label: name, value: `#/state/${name}` })),
|
|
286
290
|
...(plan.extraSignals ?? []),
|
|
@@ -334,11 +338,13 @@ function addField(
|
|
|
334
338
|
const mode = effectiveSlotMode(key, spec.value);
|
|
335
339
|
const plan: FieldPlan = { ...spec, mode, offered };
|
|
336
340
|
if (mode === "expression") {
|
|
337
|
-
|
|
341
|
+
// The rung is "expression" only for an object carrying `$expression` (value-source.ts slotMode).
|
|
342
|
+
const node = isJsonObject(spec.value) ? spec.value.$expression : undefined;
|
|
338
343
|
plan.paint = (host) =>
|
|
339
344
|
mountExpressionEditor(
|
|
340
345
|
host,
|
|
341
346
|
node,
|
|
347
|
+
// SAFETY: the expression editor reports the tree it edits, built of JSON operator/operand nodes.
|
|
342
348
|
(next) => spec.onChange({ $expression: next } as JsonValue),
|
|
343
349
|
{
|
|
344
350
|
allowEventRef: false,
|
|
@@ -367,7 +373,7 @@ export function projectLogicPanel(): LogicView {
|
|
|
367
373
|
const tab = activeTab.value;
|
|
368
374
|
const selection = primarySelection(tab?.session.selection);
|
|
369
375
|
const doc = tab?.doc.document;
|
|
370
|
-
const nothingToWire = (message: string, actions:
|
|
376
|
+
const nothingToWire = (message: string, actions: SurfaceAction[] = []): LogicView => {
|
|
371
377
|
plans = { bindings, cases, fields, functionDefs: [], selection: null, targets: [] };
|
|
372
378
|
view.emptyActions = actions;
|
|
373
379
|
view.emptyMessage = message;
|
|
@@ -387,7 +393,7 @@ export function projectLogicPanel(): LogicView {
|
|
|
387
393
|
if (!selection) {
|
|
388
394
|
return nothingToWire(clickAnythingTo("wire it up"));
|
|
389
395
|
}
|
|
390
|
-
const node = getNodeAtPath(doc, selection)
|
|
396
|
+
const node = getNodeAtPath(doc, selection);
|
|
391
397
|
if (!node) {
|
|
392
398
|
return nothingToWire(staleSelectionMessage());
|
|
393
399
|
}
|
|
@@ -395,8 +401,7 @@ export function projectLogicPanel(): LogicView {
|
|
|
395
401
|
view.state = "ready";
|
|
396
402
|
const defs = doc.state || {};
|
|
397
403
|
const functionDefs = Object.entries(defs).filter(
|
|
398
|
-
([, d]) =>
|
|
399
|
-
(d as JxPrototypeDef)?.$prototype === "Function" || (d as Record<string, unknown>)?.$handler,
|
|
404
|
+
([, d]) => isJsonObject(d) && (d.$prototype === "Function" || Boolean(d.$handler)),
|
|
400
405
|
);
|
|
401
406
|
// The whole selection the Logic tab wires. `[selection]` when one element is selected — which is
|
|
402
407
|
// Every existing call site's behaviour, unchanged.
|
|
@@ -416,7 +421,7 @@ export function projectLogicPanel(): LogicView {
|
|
|
416
421
|
const key = selection.join("/");
|
|
417
422
|
/* De-escalating to Fixed value restores the bound signal's declared default — the old unbind
|
|
418
423
|
behaviour, and the reason the ladder has to be told what a position's default IS. */
|
|
419
|
-
const literalDefaultOf = (raw:
|
|
424
|
+
const literalDefaultOf = (raw: JxDocumentValue | undefined): JsonValue | undefined => {
|
|
420
425
|
const bound = isRef(raw) ? raw.$ref : null;
|
|
421
426
|
if (!bound) {
|
|
422
427
|
return undefined;
|
|
@@ -501,13 +506,13 @@ export function projectLogicPanel(): LogicView {
|
|
|
501
506
|
const declared: LogicView["declared"] = [];
|
|
502
507
|
for (const [fnName, d] of Object.entries(defs)) {
|
|
503
508
|
if (isFunctionDef(d) && Array.isArray(d.emits)) {
|
|
504
|
-
for (const [i, ev] of
|
|
509
|
+
for (const [i, ev] of d.emits.entries()) {
|
|
505
510
|
declared.push({
|
|
506
511
|
key: `${fnName}:${ev.name || i}`,
|
|
507
512
|
name: ev.name || "(unnamed)",
|
|
508
513
|
source: `← ${fnName}`,
|
|
509
514
|
title: ev.description || "",
|
|
510
|
-
type: isJsonObject(ev.type) &&
|
|
515
|
+
type: isJsonObject(ev.type) && isString(ev.type.text) ? ev.type.text : "",
|
|
511
516
|
});
|
|
512
517
|
}
|
|
513
518
|
}
|
|
@@ -528,23 +533,25 @@ export function projectLogicPanel(): LogicView {
|
|
|
528
533
|
|
|
529
534
|
// ── The custom element's outward contract ────────────────────────────────
|
|
530
535
|
if (isCustomElement && isRoot) {
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
)
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
const def = d as Record<string, unknown>;
|
|
539
|
-
return {
|
|
536
|
+
// A state entry that declares an `attribute` is an object; a primitive entry declares none.
|
|
537
|
+
const observed: LogicView["observed"] = [];
|
|
538
|
+
for (const [name, def] of Object.entries(defs)) {
|
|
539
|
+
if (!isJsonObject(def) || !def.attribute) {
|
|
540
|
+
continue;
|
|
541
|
+
}
|
|
542
|
+
observed.push({
|
|
540
543
|
detail: `→ ${name}`,
|
|
541
544
|
key: name,
|
|
542
545
|
name: String(def.attribute),
|
|
543
546
|
prop: `attribute:${name}`,
|
|
544
547
|
tags: def.reflects ? "reflects" : "",
|
|
545
548
|
value: def.type ? String(def.type) : "",
|
|
546
|
-
};
|
|
547
|
-
}
|
|
549
|
+
});
|
|
550
|
+
}
|
|
551
|
+
view.hasObserved = true;
|
|
552
|
+
view.observedOpen = isInspectorSectionOpen("__observed", false);
|
|
553
|
+
view.observedEmpty = observed.length === 0;
|
|
554
|
+
view.observed = observed;
|
|
548
555
|
|
|
549
556
|
const cssProps = Object.entries(node.style || {}).filter(([k]) => k.startsWith("--"));
|
|
550
557
|
view.hasCssProps = cssProps.length > 0;
|
|
@@ -579,14 +586,15 @@ function bindingView(
|
|
|
579
586
|
bindings: Map<string, BindingPlan>,
|
|
580
587
|
evKey: string,
|
|
581
588
|
evVal: JxEventBinding,
|
|
582
|
-
defs: Record<string,
|
|
589
|
+
defs: Record<string, JxStateDefinition>,
|
|
583
590
|
): LogicBindingView {
|
|
584
591
|
const { functionDefs, selection, targets } = plans;
|
|
585
592
|
const tab = activeTab.value!;
|
|
586
593
|
const fn: JxFunctionDef | null = isFunctionDef(evVal) ? evVal : null;
|
|
587
594
|
const expression = isExpressionDef(evVal) ? evVal.$expression : null;
|
|
588
595
|
const mode = slotMode(evVal);
|
|
589
|
-
const
|
|
596
|
+
const statements = fn && Array.isArray(fn.body) ? fn.body : null;
|
|
597
|
+
const structured = statements !== null;
|
|
590
598
|
const body: LogicBodyKind = fn
|
|
591
599
|
? structured
|
|
592
600
|
? "statements"
|
|
@@ -597,16 +605,16 @@ function bindingView(
|
|
|
597
605
|
const mixed = mixedEventCount(tab.doc.document, targets, evKey) > 0;
|
|
598
606
|
const plan: BindingPlan = { body, fn, key: evKey, mode, value: evVal };
|
|
599
607
|
|
|
600
|
-
if (fn &&
|
|
608
|
+
if (fn && statements && selection) {
|
|
601
609
|
plan.mountStatements = (host) =>
|
|
602
610
|
mountStatementEditor(
|
|
603
611
|
host,
|
|
604
|
-
|
|
612
|
+
statements,
|
|
605
613
|
(next) =>
|
|
606
614
|
transactDoc(activeTab.value, (t) =>
|
|
607
615
|
mutateUpdateProperty(t, selection, evKey, {
|
|
608
616
|
...fn,
|
|
609
|
-
body: next
|
|
617
|
+
body: next,
|
|
610
618
|
}),
|
|
611
619
|
),
|
|
612
620
|
{
|
|
@@ -619,7 +627,7 @@ function bindingView(
|
|
|
619
627
|
second. */
|
|
620
628
|
region: inspectorStatementsRegion(evKey),
|
|
621
629
|
stateDefs: Object.keys(defs),
|
|
622
|
-
stateEntries: defs
|
|
630
|
+
stateEntries: defs,
|
|
623
631
|
},
|
|
624
632
|
);
|
|
625
633
|
}
|
|
@@ -634,12 +642,16 @@ function bindingView(
|
|
|
634
642
|
selection,
|
|
635
643
|
() => renderOnly("rightPanel"),
|
|
636
644
|
);
|
|
637
|
-
const commitExpression = (newNode
|
|
645
|
+
const commitExpression: Parameters<typeof mountExpressionEditor>[2] = (newNode) =>
|
|
638
646
|
transactDoc(activeTab.value, (t) =>
|
|
647
|
+
// SAFETY: the expression editor reports the tree it edits, built of JSON operator/operand nodes.
|
|
639
648
|
mutateUpdateProperty(t, selection, evKey, { $expression: newNode as JsonValue }),
|
|
640
649
|
);
|
|
641
|
-
const insertDef = (defName: string, def:
|
|
650
|
+
const insertDef = (defName: string, def: JxStateDefinition) =>
|
|
642
651
|
transactDoc(activeTab.value, (t) =>
|
|
652
|
+
/* SAFETY: the only def the expression editor inserts is a packaged formula's vendored entry
|
|
653
|
+
(formula-catalog.ts `ensure`): `$description`, `$expression` and `parameters`, all JSON
|
|
654
|
+
from @jxsuite/formulas. */
|
|
643
655
|
mutateAddDef(t, defName, def as Record<string, JsonValue>),
|
|
644
656
|
);
|
|
645
657
|
plan.paint = (host) =>
|
|
@@ -648,7 +660,7 @@ function bindingView(
|
|
|
648
660
|
onInsertDef: insertDef,
|
|
649
661
|
preview,
|
|
650
662
|
stateDefs: Object.keys(defs),
|
|
651
|
-
stateEntries: defs
|
|
663
|
+
stateEntries: defs,
|
|
652
664
|
});
|
|
653
665
|
}
|
|
654
666
|
bindings.set(evKey, plan);
|
|
@@ -658,7 +670,7 @@ function bindingView(
|
|
|
658
670
|
clearTitle: mixed
|
|
659
671
|
? `${targets.length} selected elements bind ${evKey} differently — clearing removes it from all of them`
|
|
660
672
|
: `Clear ${evKey}`,
|
|
661
|
-
code: fn && !structured &&
|
|
673
|
+
code: fn && !structured && isString(fn.body) ? fn.body : "",
|
|
662
674
|
codeChecked: body === "code" ? "true" : "false",
|
|
663
675
|
dotState: mixed ? "mixed" : "set",
|
|
664
676
|
key: evKey,
|
|
@@ -689,14 +701,14 @@ const expressionHosts = new Map<string, HTMLElement>();
|
|
|
689
701
|
const statementHosts = new Map<string, HTMLElement>();
|
|
690
702
|
|
|
691
703
|
/** The section ids the document names, and the keys `inspectorSections` stores them under. */
|
|
692
|
-
const SECTION_KEYS
|
|
693
|
-
condition
|
|
694
|
-
cssparts
|
|
695
|
-
cssprops
|
|
696
|
-
events
|
|
697
|
-
observed
|
|
698
|
-
repeater
|
|
699
|
-
|
|
704
|
+
const SECTION_KEYS = new Map([
|
|
705
|
+
["condition", "__condition"],
|
|
706
|
+
["cssparts", "__cssparts"],
|
|
707
|
+
["cssprops", "__cssprops"],
|
|
708
|
+
["events", "__events"],
|
|
709
|
+
["observed", "__observed"],
|
|
710
|
+
["repeater", "__repeater"],
|
|
711
|
+
]);
|
|
700
712
|
|
|
701
713
|
/**
|
|
702
714
|
* Mount the Logic tab into the container the Inspector owns, and subscribe to what it draws.
|
|
@@ -784,7 +796,7 @@ export function bindLogicPanelHost(el: HTMLElement | null): void {
|
|
|
784
796
|
mutateUpdateProperty(t, selection, key, {
|
|
785
797
|
$prototype: "Function",
|
|
786
798
|
body: value,
|
|
787
|
-
parameters:
|
|
799
|
+
parameters: plan.fn?.parameters || [],
|
|
788
800
|
}),
|
|
789
801
|
);
|
|
790
802
|
}
|
|
@@ -795,7 +807,7 @@ export function bindLogicPanelHost(el: HTMLElement | null): void {
|
|
|
795
807
|
return;
|
|
796
808
|
}
|
|
797
809
|
if (plan.mode === "ref") {
|
|
798
|
-
plan.onChange(value ?
|
|
810
|
+
plan.onChange(value ? { $ref: value } : undefined);
|
|
799
811
|
return;
|
|
800
812
|
}
|
|
801
813
|
plan.onChange(value);
|
|
@@ -810,7 +822,7 @@ export function bindLogicPanelHost(el: HTMLElement | null): void {
|
|
|
810
822
|
);
|
|
811
823
|
},
|
|
812
824
|
setSection: (id, open) => {
|
|
813
|
-
const stored = SECTION_KEYS
|
|
825
|
+
const stored = SECTION_KEYS.get(id);
|
|
814
826
|
if (stored) {
|
|
815
827
|
setInspectorSection(stored, open);
|
|
816
828
|
}
|
|
@@ -929,7 +941,7 @@ function openSourceMenu(key: string, anchor: HTMLElement): void {
|
|
|
929
941
|
opener: anchor,
|
|
930
942
|
region: "value-source",
|
|
931
943
|
rows: plan.offered.map((rung) => ({
|
|
932
|
-
checked:
|
|
944
|
+
checked: rung === plan.mode ? "true" : "false",
|
|
933
945
|
destructive: false,
|
|
934
946
|
disabled: false,
|
|
935
947
|
dividerAbove: false,
|
|
@@ -937,8 +949,9 @@ function openSourceMenu(key: string, anchor: HTMLElement): void {
|
|
|
937
949
|
title: VALUE_SOURCE_LABELS[rung],
|
|
938
950
|
})),
|
|
939
951
|
run: (id) => {
|
|
940
|
-
|
|
941
|
-
|
|
952
|
+
// The rows are `plan.offered`, so the id names one of its rungs.
|
|
953
|
+
const next = plan.offered.find((rung) => rung === id);
|
|
954
|
+
if (next === undefined || next === plan.mode) {
|
|
942
955
|
return;
|
|
943
956
|
}
|
|
944
957
|
/* Leaving From data… seeds an empty Fixed value stash with the signal's declared default, so
|
|
@@ -955,6 +968,8 @@ function openSourceMenu(key: string, anchor: HTMLElement): void {
|
|
|
955
968
|
key,
|
|
956
969
|
plan.mode,
|
|
957
970
|
next,
|
|
971
|
+
/* SAFETY: `plan.value` is a property read straight off the selected node, and a document is
|
|
972
|
+
JSON however the editor's node type spells its open keys. */
|
|
958
973
|
cloneValue(plan.value as JsonValue | undefined),
|
|
959
974
|
slotModeSeed(next, {
|
|
960
975
|
extraSignals: plan.extraSignals,
|
|
@@ -978,7 +993,7 @@ function openHandlerMenu(key: string, anchor: HTMLElement): void {
|
|
|
978
993
|
opener: anchor,
|
|
979
994
|
region: "value-source",
|
|
980
995
|
rows: HANDLER_MODES.map((rung) => ({
|
|
981
|
-
checked:
|
|
996
|
+
checked: rung === plan.mode ? "true" : "false",
|
|
982
997
|
destructive: false,
|
|
983
998
|
disabled: false,
|
|
984
999
|
dividerAbove: false,
|
|
@@ -986,8 +1001,9 @@ function openHandlerMenu(key: string, anchor: HTMLElement): void {
|
|
|
986
1001
|
title: VALUE_SOURCE_LABELS[rung],
|
|
987
1002
|
})),
|
|
988
1003
|
run: (id) => {
|
|
989
|
-
|
|
990
|
-
|
|
1004
|
+
// The rows are HANDLER_MODES, so the id names one of its rungs.
|
|
1005
|
+
const next = HANDLER_MODES.find((rung) => rung === id);
|
|
1006
|
+
if (next === undefined || next === plan.mode) {
|
|
991
1007
|
return;
|
|
992
1008
|
}
|
|
993
1009
|
const seed = seedForHandlerMode(next, plans.functionDefs);
|
|
@@ -998,6 +1014,7 @@ function openHandlerMenu(key: string, anchor: HTMLElement): void {
|
|
|
998
1014
|
`event|${plans.selection?.join("/") ?? ""}|${key}`,
|
|
999
1015
|
plan.mode,
|
|
1000
1016
|
next,
|
|
1017
|
+
// SAFETY: an event binding (a `$ref`, function def or expression def) is a JSON object.
|
|
1001
1018
|
plan.value as JsonValue,
|
|
1002
1019
|
seed,
|
|
1003
1020
|
) ?? seed,
|
|
@@ -1020,8 +1037,8 @@ function openEventNameMenu(key: string, anchor: HTMLElement): void {
|
|
|
1020
1037
|
opener: anchor,
|
|
1021
1038
|
region: "event-name",
|
|
1022
1039
|
rows: [
|
|
1023
|
-
...suggestions.map((name) => ({
|
|
1024
|
-
checked:
|
|
1040
|
+
...suggestions.map((name): MenuRowProjection => ({
|
|
1041
|
+
checked: name === key ? "true" : "false",
|
|
1025
1042
|
destructive: false,
|
|
1026
1043
|
disabled: false,
|
|
1027
1044
|
dividerAbove: false,
|
|
@@ -1062,15 +1079,13 @@ function renameEvent(evKey: string, newKey: string): void {
|
|
|
1062
1079
|
}
|
|
1063
1080
|
transactDoc(activeTab.value, (t) => {
|
|
1064
1081
|
for (const target of plans.targets) {
|
|
1065
|
-
const
|
|
1066
|
-
|
|
1067
|
-
evKey,
|
|
1068
|
-
);
|
|
1082
|
+
const node = getNodeAtPath(t.doc.document, target);
|
|
1083
|
+
const existing = node ? getEventBinding(node, evKey) : undefined;
|
|
1069
1084
|
if (existing === undefined) {
|
|
1070
1085
|
continue;
|
|
1071
1086
|
}
|
|
1072
1087
|
mutateUpdateProperty(t, target, evKey);
|
|
1073
|
-
mutateUpdateProperty(t, target, newKey, existing
|
|
1088
|
+
mutateUpdateProperty(t, target, newKey, existing);
|
|
1074
1089
|
}
|
|
1075
1090
|
});
|
|
1076
1091
|
}
|
|
@@ -1095,7 +1110,7 @@ function setHandlerBodyMode(key: string, mode: string): void {
|
|
|
1095
1110
|
transactDoc(activeTab.value, (t) =>
|
|
1096
1111
|
mutateUpdateProperty(t, selection, key, {
|
|
1097
1112
|
...fn,
|
|
1098
|
-
body:
|
|
1113
|
+
body: mode === "statements" ? [] : "",
|
|
1099
1114
|
}),
|
|
1100
1115
|
);
|
|
1101
1116
|
}
|
|
@@ -1107,7 +1122,7 @@ function addEventBinding(): void {
|
|
|
1107
1122
|
if (!selection || !tab) {
|
|
1108
1123
|
return;
|
|
1109
1124
|
}
|
|
1110
|
-
const node = getNodeAtPath(tab.doc.document, selection)
|
|
1125
|
+
const node = getNodeAtPath(tab.doc.document, selection);
|
|
1111
1126
|
let evName = "onclick";
|
|
1112
1127
|
for (const name of EVENT_NAMES) {
|
|
1113
1128
|
if (!node?.[name]) {
|