@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,233 @@
|
|
|
1
|
+
/// <reference lib="dom" />
|
|
2
|
+
/**
|
|
3
|
+
* The Site panel, as a mounted document (`specs/studio.md` §5.7).
|
|
4
|
+
*
|
|
5
|
+
* `panels/site-panel.ts` is the flow — which files are pages and in what order, how a collection
|
|
6
|
+
* nests its pages, what a click opens and what a drag inserts — and this is the surface it draws
|
|
7
|
+
* into: the reactive scope `site-panel.json` reads, and the mount that stays put while the
|
|
8
|
+
* Navigator repaints around it.
|
|
9
|
+
*
|
|
10
|
+
* **Three islands, all through `onNodeCreated`.** A component card's preview box is filled with the
|
|
11
|
+
* component rendered live, a component card is a drag source, and a media thumbnail is a drag
|
|
12
|
+
* source. Each is announced to the flow as its node is CREATED, with the mapped row it was drawn
|
|
13
|
+
* for, which is the compliant seam for registering behaviour on a node a document created
|
|
14
|
+
* (studio-ui-guidelines.md §9.4) — never a query over the mounted DOM. The `disposed` guard comes
|
|
15
|
+
* first for the reason `surfaces/files-panel.ts` gives: a panel taken down inside the same turn
|
|
16
|
+
* still walks this callback for every row, and a registration made then would outlive it.
|
|
17
|
+
*
|
|
18
|
+
* @docs studio/interface
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
import { isJsonObject, isString } from "@jxsuite/schema/guards";
|
|
22
|
+
import { reactive } from "../reactivity";
|
|
23
|
+
import { mountSurface, registerSurface } from "../ui/surface";
|
|
24
|
+
import sitePanelDoc from "./site-panel.json";
|
|
25
|
+
import type { JsonObject, JxElement } from "@jxsuite/schema/types";
|
|
26
|
+
import type { JxScope } from "@jxsuite/runtime/types";
|
|
27
|
+
import type { SurfaceHandle } from "../ui/surface";
|
|
28
|
+
import type {
|
|
29
|
+
SiteComponentRow,
|
|
30
|
+
SiteMediaRow,
|
|
31
|
+
SitePageRow,
|
|
32
|
+
SiteTemplateRow,
|
|
33
|
+
} from "../panels/site-model";
|
|
34
|
+
|
|
35
|
+
registerSurface("site-panel", sitePanelDoc);
|
|
36
|
+
|
|
37
|
+
/** What a section draws: a sentence while reading, one when empty or filtered out, or its rows. */
|
|
38
|
+
export type SiteSectionState = "loading" | "empty" | "nomatch" | "listed";
|
|
39
|
+
|
|
40
|
+
/** Everything the document reads. Every field is a value. */
|
|
41
|
+
export interface SitePanelValues {
|
|
42
|
+
/** `none` draws one sentence asking for a project; `project` draws the four sections. */
|
|
43
|
+
body: "none" | "project";
|
|
44
|
+
filter: string;
|
|
45
|
+
pages: SitePageRow[];
|
|
46
|
+
pagesState: SiteSectionState;
|
|
47
|
+
pagesCount: string;
|
|
48
|
+
templates: SiteTemplateRow[];
|
|
49
|
+
templatesState: SiteSectionState;
|
|
50
|
+
templatesCount: string;
|
|
51
|
+
components: SiteComponentRow[];
|
|
52
|
+
componentsState: SiteSectionState;
|
|
53
|
+
componentsCount: string;
|
|
54
|
+
media: SiteMediaRow[];
|
|
55
|
+
mediaState: SiteSectionState;
|
|
56
|
+
mediaCount: string;
|
|
57
|
+
/**
|
|
58
|
+
* The line under a strip that does not show every thumbnail the filter admits ("Show all 766 in
|
|
59
|
+
* Media"), or `""` when it shows them all.
|
|
60
|
+
*/
|
|
61
|
+
mediaMore: string;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/** What a control can ask the panel to do. Read once, when the scope is made. */
|
|
65
|
+
export interface SitePanelActions {
|
|
66
|
+
/** The filter field now holds `value`. */
|
|
67
|
+
setFilter: (value: string) => void;
|
|
68
|
+
/** Open a page, a template or a media file by its project path. */
|
|
69
|
+
open: (path: string) => void;
|
|
70
|
+
/** Open a component's definition by its tag. */
|
|
71
|
+
openComponent: (tagName: string) => void;
|
|
72
|
+
/** The `+` was pressed: open Add new. */
|
|
73
|
+
add: () => void;
|
|
74
|
+
/** Switch to the Media workspace. */
|
|
75
|
+
openMedia: () => void;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/** The islands the flow attaches behaviour to, each announced as it is created. */
|
|
79
|
+
export interface SitePanelIslands {
|
|
80
|
+
/** A component card's empty preview box, for the component with this tag. */
|
|
81
|
+
preview: (element: HTMLElement, tagName: string) => void;
|
|
82
|
+
/** A component card, which drags an instance of the component with this tag. */
|
|
83
|
+
componentSource: (element: HTMLElement, tagName: string) => void;
|
|
84
|
+
/** A media thumbnail, which drags an element referencing the file at this path. */
|
|
85
|
+
mediaSource: (element: HTMLElement, path: string) => void;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export interface SitePanelSurfaceHandle {
|
|
89
|
+
/** Settles once the document is mounted. */
|
|
90
|
+
readonly ready: Promise<unknown>;
|
|
91
|
+
/** Whether the mounted root is still where it was put. */
|
|
92
|
+
connected: () => boolean;
|
|
93
|
+
update: (values: SitePanelValues) => void;
|
|
94
|
+
dispose: () => void;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
interface SitePanelScope extends SitePanelValues, SitePanelActions {}
|
|
98
|
+
|
|
99
|
+
/** The scope's shape before the first projection lands on it. */
|
|
100
|
+
export function emptySitePanelValues(): SitePanelValues {
|
|
101
|
+
return {
|
|
102
|
+
body: "none",
|
|
103
|
+
components: [],
|
|
104
|
+
componentsCount: "",
|
|
105
|
+
componentsState: "loading",
|
|
106
|
+
filter: "",
|
|
107
|
+
media: [],
|
|
108
|
+
mediaCount: "",
|
|
109
|
+
mediaMore: "",
|
|
110
|
+
mediaState: "loading",
|
|
111
|
+
pages: [],
|
|
112
|
+
pagesCount: "",
|
|
113
|
+
pagesState: "loading",
|
|
114
|
+
templates: [],
|
|
115
|
+
templatesCount: "",
|
|
116
|
+
templatesState: "loading",
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/** Write a projection in, field by field, so an unchanged field is inert. */
|
|
121
|
+
function project(scope: SitePanelScope, values: SitePanelValues): void {
|
|
122
|
+
scope.body = values.body;
|
|
123
|
+
scope.filter = values.filter;
|
|
124
|
+
scope.pages = values.pages;
|
|
125
|
+
scope.pagesState = values.pagesState;
|
|
126
|
+
scope.pagesCount = values.pagesCount;
|
|
127
|
+
scope.templates = values.templates;
|
|
128
|
+
scope.templatesState = values.templatesState;
|
|
129
|
+
scope.templatesCount = values.templatesCount;
|
|
130
|
+
scope.components = values.components;
|
|
131
|
+
scope.componentsState = values.componentsState;
|
|
132
|
+
scope.componentsCount = values.componentsCount;
|
|
133
|
+
scope.media = values.media;
|
|
134
|
+
scope.mediaState = values.mediaState;
|
|
135
|
+
scope.mediaCount = values.mediaCount;
|
|
136
|
+
scope.mediaMore = values.mediaMore;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/** The `part` a node was declared with, or the empty string. */
|
|
140
|
+
function partOf(def: JxElement | string): string {
|
|
141
|
+
const part = isString(def) ? undefined : def.attributes?.["part"];
|
|
142
|
+
return isString(part) ? part : "";
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/** The `$map` item a node was rendered inside, if it was rendered inside one. */
|
|
146
|
+
function mapItem(state: JxScope | undefined): JsonObject | null {
|
|
147
|
+
const map = state?.["$map"];
|
|
148
|
+
const item = isJsonObject(map) ? map["item"] : undefined;
|
|
149
|
+
return isJsonObject(item) ? item : null;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/** One string field of the mapped row, or the empty string. */
|
|
153
|
+
function itemField(state: JxScope | undefined, field: string): string {
|
|
154
|
+
const value = mapItem(state)?.[field];
|
|
155
|
+
return isString(value) ? value : "";
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Mount the Site panel into `container`, the content box the Navigator painted.
|
|
160
|
+
*
|
|
161
|
+
* @param container Where the document goes.
|
|
162
|
+
* @param values What it shows to begin with.
|
|
163
|
+
* @param actions What its controls do.
|
|
164
|
+
* @param islands Where the flow attaches previews and drag sources.
|
|
165
|
+
*/
|
|
166
|
+
export function mountSitePanelSurface(
|
|
167
|
+
container: HTMLElement,
|
|
168
|
+
values: SitePanelValues,
|
|
169
|
+
actions: SitePanelActions,
|
|
170
|
+
islands: SitePanelIslands,
|
|
171
|
+
): SitePanelSurfaceHandle {
|
|
172
|
+
const scope: SitePanelScope = reactive<SitePanelScope>({
|
|
173
|
+
...emptySitePanelValues(),
|
|
174
|
+
...actions,
|
|
175
|
+
});
|
|
176
|
+
project(scope, values);
|
|
177
|
+
|
|
178
|
+
let mounted: SurfaceHandle | null = null;
|
|
179
|
+
let disposed = false;
|
|
180
|
+
const ready = mountSurface("site-panel", scope, container, {
|
|
181
|
+
onNodeCreated: (element, _path, def, state) => {
|
|
182
|
+
if (disposed || !(element instanceof HTMLElement)) {
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
switch (partOf(def)) {
|
|
186
|
+
case "card-preview": {
|
|
187
|
+
const tag = itemField(state, "tagName");
|
|
188
|
+
if (tag !== "") {
|
|
189
|
+
islands.preview(element, tag);
|
|
190
|
+
}
|
|
191
|
+
break;
|
|
192
|
+
}
|
|
193
|
+
case "component-card": {
|
|
194
|
+
const tag = itemField(state, "tagName");
|
|
195
|
+
if (tag !== "") {
|
|
196
|
+
islands.componentSource(element, tag);
|
|
197
|
+
}
|
|
198
|
+
break;
|
|
199
|
+
}
|
|
200
|
+
case "media-thumb": {
|
|
201
|
+
const path = itemField(state, "path");
|
|
202
|
+
if (path !== "") {
|
|
203
|
+
islands.mediaSource(element, path);
|
|
204
|
+
}
|
|
205
|
+
break;
|
|
206
|
+
}
|
|
207
|
+
default: {
|
|
208
|
+
break;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
},
|
|
212
|
+
}).then((surface) => {
|
|
213
|
+
if (disposed) {
|
|
214
|
+
surface.dispose();
|
|
215
|
+
return surface;
|
|
216
|
+
}
|
|
217
|
+
mounted = surface;
|
|
218
|
+
return surface;
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
return {
|
|
222
|
+
connected: () => !disposed && (mounted === null || mounted.root.parentNode === container),
|
|
223
|
+
dispose() {
|
|
224
|
+
disposed = true;
|
|
225
|
+
mounted?.dispose();
|
|
226
|
+
mounted = null;
|
|
227
|
+
},
|
|
228
|
+
ready,
|
|
229
|
+
update: (next) => {
|
|
230
|
+
project(scope, next);
|
|
231
|
+
},
|
|
232
|
+
};
|
|
233
|
+
}
|
|
@@ -140,36 +140,78 @@
|
|
|
140
140
|
{
|
|
141
141
|
"$prototype": "Array",
|
|
142
142
|
"items": {
|
|
143
|
-
"$ref": "#/state/
|
|
143
|
+
"$ref": "#/state/groups"
|
|
144
144
|
},
|
|
145
145
|
"key": {
|
|
146
146
|
"$ref": "$map/item/key"
|
|
147
147
|
},
|
|
148
148
|
"map": {
|
|
149
|
-
"tagName": "
|
|
149
|
+
"tagName": "div",
|
|
150
150
|
"attributes": {
|
|
151
|
-
"part": "
|
|
152
|
-
"
|
|
153
|
-
"
|
|
154
|
-
"label": "${$map.item.label}",
|
|
155
|
-
"description": "${$map.item.description}"
|
|
151
|
+
"part": "group",
|
|
152
|
+
"role": "group",
|
|
153
|
+
"aria-label": "${$map.item.name}"
|
|
156
154
|
},
|
|
157
|
-
"
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
{
|
|
161
|
-
"
|
|
162
|
-
"
|
|
163
|
-
|
|
155
|
+
"children": [
|
|
156
|
+
{
|
|
157
|
+
"tagName": "div",
|
|
158
|
+
"attributes": {
|
|
159
|
+
"part": "group-label-slot",
|
|
160
|
+
"role": "none"
|
|
161
|
+
},
|
|
162
|
+
"style": {
|
|
163
|
+
"display": "contents"
|
|
164
|
+
},
|
|
165
|
+
"$switch": {
|
|
166
|
+
"$ref": "$map/item/hasLabel"
|
|
167
|
+
},
|
|
168
|
+
"cases": {
|
|
169
|
+
"true": {
|
|
170
|
+
"tagName": "div",
|
|
171
|
+
"attributes": {
|
|
172
|
+
"part": "group-heading",
|
|
173
|
+
"aria-hidden": "true"
|
|
174
|
+
},
|
|
175
|
+
"textContent": "${$map.item.label}"
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
"$prototype": "Array",
|
|
181
|
+
"items": {
|
|
182
|
+
"$ref": "$map/item/rows"
|
|
183
|
+
},
|
|
184
|
+
"key": {
|
|
185
|
+
"$ref": "$map/item/key"
|
|
186
|
+
},
|
|
187
|
+
"map": {
|
|
188
|
+
"tagName": "jx-option",
|
|
189
|
+
"attributes": {
|
|
190
|
+
"part": "option",
|
|
191
|
+
"id": "slash-menu-option-${$map.item.index}",
|
|
192
|
+
"value": "${$map.item.key}",
|
|
193
|
+
"label": "${$map.item.label}",
|
|
194
|
+
"description": "${$map.item.description}"
|
|
164
195
|
},
|
|
165
|
-
"
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
196
|
+
"onmouseenter": {
|
|
197
|
+
"$prototype": "Function",
|
|
198
|
+
"body": [
|
|
199
|
+
{
|
|
200
|
+
"operator": "call",
|
|
201
|
+
"target": {
|
|
202
|
+
"$ref": "#/state/hover"
|
|
203
|
+
},
|
|
204
|
+
"value": [
|
|
205
|
+
{
|
|
206
|
+
"$ref": "$map/item/index"
|
|
207
|
+
}
|
|
208
|
+
]
|
|
209
|
+
}
|
|
210
|
+
]
|
|
211
|
+
}
|
|
170
212
|
}
|
|
171
|
-
|
|
172
|
-
|
|
213
|
+
}
|
|
214
|
+
]
|
|
173
215
|
}
|
|
174
216
|
}
|
|
175
217
|
]
|
|
@@ -41,17 +41,16 @@ import { clearLayerSlot, getLayerSlot } from "../ui/layers";
|
|
|
41
41
|
import { mountSurface, registerSurface } from "../ui/surface";
|
|
42
42
|
import { overlayRegion, REGION_ATTR } from "../ui/regions";
|
|
43
43
|
import slashMenuDoc from "./slash-menu.json";
|
|
44
|
-
import type { JxDocument } from "@jxsuite/schema/types";
|
|
45
44
|
import type { JxScope } from "@jxsuite/runtime/types";
|
|
46
45
|
import type { SurfaceHandle } from "../ui/surface";
|
|
47
46
|
|
|
48
|
-
registerSurface("slash-menu", slashMenuDoc
|
|
47
|
+
registerSurface("slash-menu", slashMenuDoc);
|
|
49
48
|
|
|
50
49
|
/** The popover slot id; the region is `overlay.menu:slash-menu`, which is what the shots crop. */
|
|
51
50
|
const SLOT = "slash-menu";
|
|
52
51
|
|
|
53
52
|
/** One offer, as the document reads it. */
|
|
54
|
-
export interface SlashMenuRow
|
|
53
|
+
export interface SlashMenuRow {
|
|
55
54
|
/**
|
|
56
55
|
* The element's tag — unique in the list, so it is the repeater's key AND the row's `value`,
|
|
57
56
|
* which is what a picked row names in its `select` event.
|
|
@@ -60,6 +59,23 @@ export interface SlashMenuRow extends Record<string, unknown> {
|
|
|
60
59
|
label: string;
|
|
61
60
|
/** A muted note at the end of the row. Empty draws no box: `jx-option` hides its own part. */
|
|
62
61
|
description: string;
|
|
62
|
+
/** The row's position in the FLAT list — its id, and what a hover reports. */
|
|
63
|
+
index: number;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* One headed run of rows: the HTML elements (no heading), then the project's components under
|
|
68
|
+
* "Components" (§5.7). A `role="group"` wrapper is what `jx-listbox` reads headings from, and its
|
|
69
|
+
* rows stay its own (`optionsOf` keeps every descendant option whose nearest listbox is this one).
|
|
70
|
+
*/
|
|
71
|
+
export interface SlashMenuGroup {
|
|
72
|
+
key: string;
|
|
73
|
+
/** The visible heading; empty for the unheaded first group. */
|
|
74
|
+
label: string;
|
|
75
|
+
/** The group's accessible name, which the unheaded group needs too. */
|
|
76
|
+
name: string;
|
|
77
|
+
hasLabel: boolean;
|
|
78
|
+
rows: SlashMenuRow[];
|
|
63
79
|
}
|
|
64
80
|
|
|
65
81
|
/** What the panel is showing right now. */
|
|
@@ -72,7 +88,10 @@ export interface SlashMenuView {
|
|
|
72
88
|
showFilter: boolean;
|
|
73
89
|
/** What that field contains. */
|
|
74
90
|
filter: string;
|
|
91
|
+
/** Every row, flat, in the order the keyboard walks them. */
|
|
75
92
|
rows: SlashMenuRow[];
|
|
93
|
+
/** The same rows as the panel draws them, headed. */
|
|
94
|
+
groups: SlashMenuGroup[];
|
|
76
95
|
/** The highlighted row, as an index into {@link SlashMenuView.rows}. */
|
|
77
96
|
activeIndex: number;
|
|
78
97
|
}
|
|
@@ -103,12 +122,13 @@ export interface SlashMenuSurface {
|
|
|
103
122
|
}
|
|
104
123
|
|
|
105
124
|
/** The scope `slash-menu.json` reads. */
|
|
106
|
-
interface SlashMenuScope
|
|
125
|
+
interface SlashMenuScope {
|
|
107
126
|
x: number;
|
|
108
127
|
y: number;
|
|
109
128
|
showFilter: boolean;
|
|
110
129
|
filter: string;
|
|
111
130
|
rows: SlashMenuRow[];
|
|
131
|
+
groups: SlashMenuGroup[];
|
|
112
132
|
/**
|
|
113
133
|
* The active row's id — the ONE string the highlight is written as. The listbox turns it into a
|
|
114
134
|
* row's `selected`, and the filter field, when there is one, puts the same string in its
|
|
@@ -168,7 +188,7 @@ export function openSlashMenuSurface(
|
|
|
168
188
|
let mounted: SurfaceHandle | null = null;
|
|
169
189
|
let closed = false;
|
|
170
190
|
|
|
171
|
-
const scope = reactive<SlashMenuScope>({
|
|
191
|
+
const scope: SlashMenuScope = reactive<SlashMenuScope>({
|
|
172
192
|
activeId: activeIdOf(view),
|
|
173
193
|
expanded: view.rows.length > 0,
|
|
174
194
|
filter: view.filter,
|
|
@@ -184,6 +204,9 @@ export function openSlashMenuSurface(
|
|
|
184
204
|
one bubbling handler on the listbox replaces a closure per row, and the position the flow
|
|
185
205
|
wants is resolved here against the list the panel is showing rather than baked into the
|
|
186
206
|
row when it was drawn. */
|
|
207
|
+
/* SAFETY: `slash-menu.json` binds this handler to the listbox's `onselect` alone, and `select`
|
|
208
|
+
is raised by the `dispatchEvent` statement in `jx-option.json`, which the runtime always
|
|
209
|
+
constructs as a `CustomEvent` whose `detail` is the row's value. */
|
|
187
210
|
const tag = String((event as CustomEvent<unknown>).detail);
|
|
188
211
|
const index = scope.rows.findIndex((row) => row.key === tag);
|
|
189
212
|
if (index !== -1) {
|
|
@@ -191,10 +214,11 @@ export function openSlashMenuSurface(
|
|
|
191
214
|
}
|
|
192
215
|
},
|
|
193
216
|
rows: [...view.rows],
|
|
217
|
+
groups: [...view.groups],
|
|
194
218
|
showFilter: view.showFilter,
|
|
195
219
|
x: view.x,
|
|
196
220
|
y: view.y,
|
|
197
|
-
})
|
|
221
|
+
});
|
|
198
222
|
|
|
199
223
|
const finish = (fromPlatform: boolean): void => {
|
|
200
224
|
if (closed) {
|
|
@@ -210,12 +234,20 @@ export function openSlashMenuSurface(
|
|
|
210
234
|
}
|
|
211
235
|
};
|
|
212
236
|
|
|
237
|
+
/* Read through a call, not the property path: `close()` can abort the controller while the panel
|
|
238
|
+
is awaiting `jx-ready`, and a direct test after that `await` would be narrowed to the value the
|
|
239
|
+
test before it saw. */
|
|
240
|
+
const aborted = (): boolean => controller.signal.aborted;
|
|
241
|
+
|
|
213
242
|
const ready = (async () => {
|
|
214
243
|
const surface = await mountSurface("slash-menu", scope, slot, { signal: controller.signal });
|
|
215
|
-
if (
|
|
244
|
+
if (aborted()) {
|
|
216
245
|
return;
|
|
217
246
|
}
|
|
218
247
|
mounted = surface;
|
|
248
|
+
/* SAFETY: `slash-menu.json`'s root definition carries `tagName: "jx-popover"`, so the mounted
|
|
249
|
+
root is the kit's popover element, which reflects `open` and inherits `showPopover` and
|
|
250
|
+
`hidePopover` from HTMLElement. */
|
|
219
251
|
panel = surface.root as PopoverElement;
|
|
220
252
|
/* The region rides on the PANEL as well as on the slot `getLayerSlot` stamped: a popover is
|
|
221
253
|
`position: fixed` in the top layer, so the slot around it has a zero-height box and the
|
|
@@ -223,7 +255,7 @@ export function openSlashMenuSurface(
|
|
|
223
255
|
takes the last match in document order, which is the panel. */
|
|
224
256
|
panel.setAttribute(REGION_ATTR, overlayRegion("popover", SLOT));
|
|
225
257
|
panel.addEventListener("toggle", (event) => {
|
|
226
|
-
if (
|
|
258
|
+
if (event.newState === "closed") {
|
|
227
259
|
finish(true);
|
|
228
260
|
}
|
|
229
261
|
});
|
|
@@ -234,7 +266,7 @@ export function openSlashMenuSurface(
|
|
|
234
266
|
panel!.addEventListener("jx-ready", () => resolve(), { once: true });
|
|
235
267
|
});
|
|
236
268
|
}
|
|
237
|
-
if (
|
|
269
|
+
if (aborted()) {
|
|
238
270
|
return;
|
|
239
271
|
}
|
|
240
272
|
panel.showPopover(anchor instanceof HTMLElement ? { source: anchor } : undefined);
|
|
@@ -264,6 +296,7 @@ export function openSlashMenuSurface(
|
|
|
264
296
|
scope.showFilter = next.showFilter;
|
|
265
297
|
scope.filter = next.filter;
|
|
266
298
|
scope.rows = [...next.rows];
|
|
299
|
+
scope.groups = [...next.groups];
|
|
267
300
|
scope.activeId = activeIdOf(next);
|
|
268
301
|
scope.isEmpty = next.rows.length === 0;
|
|
269
302
|
scope.expanded = next.rows.length > 0;
|
|
@@ -26,25 +26,20 @@
|
|
|
26
26
|
* @docs studio/logic/statements
|
|
27
27
|
*/
|
|
28
28
|
|
|
29
|
+
import { isJsonObject, isString } from "@jxsuite/schema/guards";
|
|
29
30
|
import { reactive } from "../reactivity";
|
|
30
31
|
import { REGION_ATTR } from "../ui/regions";
|
|
31
32
|
import { mountSurface, registerSurface } from "../ui/surface";
|
|
32
33
|
import statementsDoc from "./statements.json";
|
|
33
|
-
import type {
|
|
34
|
+
import type { JxElement } from "@jxsuite/schema/types";
|
|
34
35
|
import type { JxScope } from "@jxsuite/runtime/types";
|
|
35
|
-
import type { SurfaceHandle } from "../ui/surface";
|
|
36
|
+
import type { SurfaceHandle, SurfaceOption } from "../ui/surface";
|
|
36
37
|
|
|
37
|
-
registerSurface("statements", statementsDoc
|
|
38
|
+
registerSurface("statements", statementsDoc);
|
|
38
39
|
|
|
39
40
|
/** Which control one operand of a statement draws. The flow picks it; the document switches on it. */
|
|
40
41
|
export type StatementFieldKind = "control" | "text" | "select" | "flags";
|
|
41
42
|
|
|
42
|
-
/** A closed list of choices, in the shape the kit's select reads. */
|
|
43
|
-
export interface StatementOption {
|
|
44
|
-
value: string;
|
|
45
|
-
label: string;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
43
|
/** One `eventInit` flag of a `dispatchEvent` statement. */
|
|
49
44
|
export interface StatementFlagView {
|
|
50
45
|
/** `<row>::<prop>::<flag>` — self-contained, because a third `$map` shadows both above it. */
|
|
@@ -64,7 +59,7 @@ export interface StatementFieldView {
|
|
|
64
59
|
/** What a `text` or `select` control holds. Empty for the other two kinds. */
|
|
65
60
|
value: string;
|
|
66
61
|
placeholder: string;
|
|
67
|
-
options:
|
|
62
|
+
options: SurfaceOption[];
|
|
68
63
|
flags: StatementFlagView[];
|
|
69
64
|
}
|
|
70
65
|
|
|
@@ -119,7 +114,7 @@ export interface StatementIslands {
|
|
|
119
114
|
controlSlot: (id: string, host: HTMLElement) => void;
|
|
120
115
|
}
|
|
121
116
|
|
|
122
|
-
interface StatementScope extends
|
|
117
|
+
interface StatementScope extends StatementActions {
|
|
123
118
|
rows: StatementRowView[];
|
|
124
119
|
}
|
|
125
120
|
|
|
@@ -171,7 +166,7 @@ export function renderStatementsSurface(
|
|
|
171
166
|
region is a fact about the HOST — who is drawing this editor — not about the document inside
|
|
172
167
|
it, so it should be true the moment the host is claimed rather than a frame later. */
|
|
173
168
|
host.setAttribute(REGION_ATTR, region);
|
|
174
|
-
const scope = reactive({ ...actions, rows })
|
|
169
|
+
const scope: StatementScope = reactive<StatementScope>({ ...actions, rows });
|
|
175
170
|
const record: Mounted = { disposed: false, handle: null, scope };
|
|
176
171
|
mounts.set(host, record);
|
|
177
172
|
/* No race to arbitrate: a repaint arriving while this is in flight takes the branch above — a
|
|
@@ -200,16 +195,16 @@ export function renderStatementsSurface(
|
|
|
200
195
|
|
|
201
196
|
/** The `part` a node was rendered with, or "". */
|
|
202
197
|
function partOf(def: JxElement | string): string {
|
|
203
|
-
const part =
|
|
204
|
-
return
|
|
198
|
+
const part = isString(def) ? undefined : def.attributes?.["part"];
|
|
199
|
+
return isString(part) ? part : "";
|
|
205
200
|
}
|
|
206
201
|
|
|
207
202
|
/** The `key` of the `$map` item a node was rendered inside, or "". */
|
|
208
203
|
function itemKey(state: JxScope | undefined): string {
|
|
209
|
-
const
|
|
210
|
-
const
|
|
211
|
-
|
|
212
|
-
return
|
|
204
|
+
const map = state?.["$map"];
|
|
205
|
+
const item = isJsonObject(map) ? map["item"] : undefined;
|
|
206
|
+
const key = isJsonObject(item) ? item["key"] : "";
|
|
207
|
+
return isString(key) ? key : "";
|
|
213
208
|
}
|
|
214
209
|
|
|
215
210
|
/**
|