@jxsuite/studio 6.1.0 → 6.1.2
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/dist/chunks/2020-f2gkpy8d.js +4 -0
- package/dist/chunks/{action-group-2mqby73c.js → action-group-4aan7g6g.js} +3 -3
- package/dist/chunks/adapter-4912g339.js +4 -0
- package/dist/chunks/cf-account-picker-wccaenh6.js +4 -0
- package/dist/chunks/cf-settings-br6105tr.js +4 -0
- package/dist/chunks/color-28ksk2qm.js +4 -0
- package/dist/chunks/color-area-0fj8a4ga.js +4 -0
- package/dist/chunks/color-field-xch8kx2g.js +4 -0
- package/dist/chunks/color-slider-jxd8v350.js +4 -0
- package/dist/chunks/combobox-p0efwjke.js +4 -0
- package/dist/chunks/components-db68vsn7.js +4 -0
- package/dist/chunks/content-source-1449qesq.js +4 -0
- package/dist/chunks/convert-to-repeater-5h457egj.js +4 -0
- package/dist/chunks/dialog-c4x05vyx.js +4 -0
- package/dist/chunks/editor-x9jn86a7.js +4 -0
- package/dist/chunks/entry-commands-may24cpt.js +4 -0
- package/dist/chunks/extension-sections-pvr14vxr.js +4 -0
- package/dist/chunks/file-ops-x9v54pcj.js +4 -0
- package/dist/chunks/files-j3knqf0s.js +4 -0
- package/dist/chunks/format-host-tyre2trb.js +4 -0
- package/dist/chunks/fs-events-64ma9htc.js +4 -0
- package/dist/chunks/git-panel-84ps5dex.js +4 -0
- package/dist/chunks/grid-view-d2wq9ezg.js +51 -0
- package/dist/chunks/icons-pnfz478q.js +4 -0
- package/dist/chunks/iframe-entry-fvbk89gm.js +5 -0
- package/dist/chunks/iframe-entry-jdcktez8.js +5 -0
- package/dist/chunks/iframe-entry-x0ygf2yr.js +5 -0
- package/dist/chunks/iframe-entry-zap785cw.js +5 -0
- package/dist/chunks/iframe-host-ck6vejt5.js +4 -0
- package/dist/chunks/index-b8xw3vy9.js +4 -0
- package/dist/chunks/{index-gybvv7a6.js → index-zpjmzqfk.js} +3 -3
- package/dist/chunks/{javascript-rnvdp3k4.js → javascript-m54mnwp6.js} +3 -3
- package/dist/chunks/jsonMode-w15cmrcm.js +13 -0
- package/dist/chunks/jx-validate-at3zn8wa.js +4 -0
- package/dist/chunks/layers-h4xp1pss.js +4 -0
- package/dist/chunks/layers-panel-m5hw1d7g.js +4 -0
- package/dist/chunks/listbox-e74qjyq6.js +4 -0
- package/dist/chunks/lit-html-8t8t3dnr.js +4 -0
- package/dist/chunks/media-picker-2cweexc5.js +4 -0
- package/dist/chunks/menu-n6yzswmy.js +4 -0
- package/dist/chunks/menu-ynw13y0s.js +4 -0
- package/dist/chunks/monaco-binding-7gx83x3r.js +4 -0
- package/dist/chunks/monaco-buffer-qzxn567r.js +4 -0
- package/dist/chunks/monaco-setup-gxf6656g.js +4 -0
- package/dist/chunks/notify-cj5zbrs2.js +4 -0
- package/dist/chunks/number-field-y62xq0ty.js +4 -0
- package/dist/chunks/parse-b7ddhr8m.js +4 -0
- package/dist/chunks/platform-3dfws9js.js +4 -0
- package/dist/chunks/popover-jt2gxmzs.js +4 -0
- package/dist/chunks/publish-panel-1gvxbj21.js +4 -0
- package/dist/chunks/quick-search-0dajrwqg.js +4 -0
- package/dist/chunks/references-49qgt404.js +4 -0
- package/dist/chunks/right-panel-jm1bwe53.js +4 -0
- package/dist/chunks/section-registry-6kwc4fky.js +4 -0
- package/dist/chunks/select-rzds841e.js +4 -0
- package/dist/chunks/split-n2gfpm5m.js +4 -0
- package/dist/chunks/{studio-5g0ag7c0.js → studio-0q988f9w.js} +3 -3
- package/dist/chunks/studio-0rt52vpq.js +5 -0
- package/dist/chunks/studio-18vgbhs5.js +5 -0
- package/dist/chunks/{studio-pxg4ap1e.js → studio-1fxkaaea.js} +4 -4
- package/dist/chunks/studio-24mccdrj.js +5 -0
- package/dist/chunks/studio-2eh507zk.js +9 -0
- package/dist/chunks/studio-2hcbccfv.js +5 -0
- package/dist/chunks/studio-2j1cb95x.js +5 -0
- package/dist/chunks/studio-2jbs3rxv.js +5 -0
- package/dist/chunks/{studio-qbj760tx.js → studio-485046te.js} +7 -7
- package/dist/chunks/studio-4h8k4dw9.js +5 -0
- package/dist/chunks/studio-5f6n18kx.js +5 -0
- package/dist/chunks/studio-5gthpky6.js +5 -0
- package/dist/chunks/studio-5ve6bbep.js +5 -0
- package/dist/chunks/studio-6ep3js6b.js +9 -0
- package/dist/chunks/studio-6wkmf3wz.js +9 -0
- package/dist/chunks/studio-841rf3cg.js +5 -0
- package/dist/chunks/studio-8gmwgheg.js +5 -0
- package/dist/chunks/studio-8qm0ep50.js +5 -0
- package/dist/chunks/{studio-anyrgzvb.js → studio-90pq9km1.js} +4 -4
- package/dist/chunks/studio-924p1tm1.js +6 -0
- package/dist/chunks/{studio-v2bvmbjj.js → studio-a3g98wjr.js} +4 -4
- package/dist/chunks/studio-a3shpz9y.js +5 -0
- package/dist/chunks/studio-amsbaaar.js +6 -0
- package/dist/chunks/studio-at5spjbc.js +7 -0
- package/dist/chunks/studio-b2xv945e.js +5 -0
- package/dist/chunks/studio-bn5nkafw.js +5 -0
- package/dist/chunks/studio-bw6q5xjf.js +9 -0
- package/dist/chunks/studio-c7q0t9x1.js +5 -0
- package/dist/chunks/studio-camnhc96.js +6 -0
- package/dist/chunks/studio-cffqvnzd.js +5 -0
- package/dist/chunks/studio-d81xfh1g.js +5 -0
- package/dist/chunks/studio-dgz8d0c1.js +5 -0
- package/dist/chunks/studio-efvfrsf8.js +5 -0
- package/dist/chunks/studio-er30bpcx.js +5 -0
- package/dist/chunks/studio-ezscgr64.js +5 -0
- package/dist/chunks/studio-ffrrncvz.js +5 -0
- package/dist/chunks/studio-fpphgn8y.js +10 -0
- package/dist/chunks/studio-j1kvhdjk.js +4 -0
- package/dist/chunks/{studio-txjjzrsm.js → studio-j430n16g.js} +5 -5
- package/dist/chunks/studio-jjkg84nj.js +5 -0
- package/dist/chunks/studio-m0q32ars.js +4 -0
- package/dist/chunks/studio-m6bdst11.js +5 -0
- package/dist/chunks/studio-nv2cptd4.js +64 -0
- package/dist/chunks/studio-nwfrc98n.js +5 -0
- package/dist/chunks/studio-p1wgvp7r.js +5 -0
- package/dist/chunks/studio-pag2wncm.js +5 -0
- package/dist/chunks/studio-qvanvzfd.js +5 -0
- package/dist/chunks/studio-qwa64kt7.js +5 -0
- package/dist/chunks/studio-rk1zc4x3.js +928 -0
- package/dist/chunks/studio-se2r3ptc.js +5 -0
- package/dist/chunks/studio-sg2a0dh0.js +5 -0
- package/dist/chunks/studio-tjzjhe68.js +5 -0
- package/dist/chunks/{studio-0x3jyb8r.js → studio-tq0rtfwj.js} +4 -4
- package/dist/chunks/{studio-cpxkgjrj.js → studio-v0jzqdjm.js} +4 -4
- package/dist/chunks/studio-v2w7q8r1.js +7 -0
- package/dist/chunks/studio-v5vjq1h0.js +4 -0
- package/dist/chunks/studio-v8aga3vp.js +14 -0
- package/dist/chunks/studio-vfcdrfmv.js +5 -0
- package/dist/chunks/studio-vmfkgdjf.js +5 -0
- package/dist/chunks/studio-wt1816jj.js +5 -0
- package/dist/chunks/studio-wz73q5kq.js +4 -0
- package/dist/chunks/studio-y04qtxvp.js +7 -0
- package/dist/chunks/studio-y21g8zzg.js +5 -0
- package/dist/chunks/studio-y64hrt8p.js +12 -0
- package/dist/chunks/studio-ynn90f58.js +16 -0
- package/dist/chunks/studio-yxz682sx.js +5 -0
- package/dist/chunks/studio-zp7snvkq.js +5 -0
- package/dist/chunks/studio-zq4z6tm6.js +5 -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-c9fn075p.js +4 -0
- package/dist/chunks/toast-host-ke5z4ng7.js +4 -0
- package/dist/chunks/{toolbar-2nnzqhrj.js → toolbar-44cm5cta.js} +3 -3
- package/dist/chunks/tooltip-5v8ngwj2.js +4 -0
- package/dist/chunks/tree-mdq3v5cw.js +4 -0
- package/dist/chunks/tsMode-sf49ee9x.js +14 -0
- package/dist/chunks/workspace-jtfahpee.js +4 -0
- package/dist/chunks/ws-client-nze0k6mv.js +4 -0
- package/dist/iframe-entry.js +16 -16
- package/dist/manifest.json +63 -63
- package/dist/studio.js +98 -98
- package/dist/workers/ts.worker.js +3 -3
- package/package.json +11 -11
- 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/library-layouts.ts +8 -5
- package/src/browse/library-model.ts +18 -6
- package/src/browse/library-pane.ts +37 -21
- package/src/browse/library-preview.ts +14 -9
- package/src/browse/library-source.ts +1 -1
- package/src/canvas/asset-refs.ts +24 -9
- package/src/canvas/asset-resolve.ts +19 -23
- package/src/canvas/canvas-helpers.ts +7 -6
- package/src/canvas/canvas-live-render.ts +44 -53
- package/src/canvas/canvas-patcher.ts +30 -30
- package/src/canvas/canvas-perf.ts +11 -5
- package/src/canvas/canvas-render.ts +66 -42
- package/src/canvas/canvas-surface.ts +5 -3
- package/src/canvas/canvas-utils.ts +163 -64
- 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 +13 -12
- package/src/canvas/iframe-editable-root.ts +29 -16
- package/src/canvas/iframe-entry.ts +80 -63
- package/src/canvas/iframe-eval.ts +73 -49
- package/src/canvas/iframe-host.ts +203 -118
- package/src/canvas/iframe-inline-edit.ts +69 -32
- package/src/canvas/iframe-insert.ts +5 -4
- package/src/canvas/iframe-interaction.ts +37 -26
- package/src/canvas/iframe-overlay.ts +1 -1
- package/src/canvas/iframe-patch.ts +18 -15
- package/src/canvas/iframe-position.ts +12 -6
- package/src/canvas/iframe-protocol.ts +15 -16
- package/src/canvas/iframe-render.ts +41 -36
- package/src/canvas/iframe-slash.ts +24 -11
- package/src/canvas/iframe-subtree.ts +6 -2
- 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/serialize-scope.ts +13 -5
- package/src/canvas/stage-scrollbar.ts +2 -1
- package/src/canvas/surface-registry.ts +21 -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/budget.ts +3 -3
- package/src/commands/command-args.ts +103 -71
- package/src/commands/context.ts +22 -20
- package/src/commands/defaults.ts +4 -1
- package/src/commands/keymap.ts +47 -43
- package/src/commands/levels.ts +3 -3
- package/src/commands/live-context.ts +10 -8
- package/src/commands/reference.ts +2 -1
- package/src/commands/registry.ts +12 -10
- package/src/commands/run-reported.ts +15 -10
- package/src/component-props.ts +46 -30
- package/src/content/collection-match.ts +5 -4
- package/src/content/draft-state.ts +4 -3
- package/src/content/entry-commands.ts +3 -2
- package/src/content/entry-editor.ts +29 -17
- package/src/content/entry-fields.ts +12 -7
- package/src/content/entry-model.ts +21 -12
- 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 +11 -5
- package/src/editor/convert-to-repeater.ts +34 -22
- package/src/editor/editable-tags.ts +17 -2
- package/src/editor/file-drop-action.ts +21 -22
- package/src/editor/inline-edit-apply.ts +35 -17
- package/src/editor/inline-edit.ts +66 -50
- package/src/editor/inline-format.ts +59 -56
- package/src/editor/inline-link.ts +40 -15
- package/src/editor/insert-zone-action.ts +1 -1
- package/src/editor/merge-tags.ts +58 -19
- package/src/editor/repeater-scope.ts +39 -28
- package/src/editor/shortcuts.ts +87 -47
- package/src/editor/slash-menu.ts +1 -6
- package/src/files/asset-versions.ts +4 -4
- package/src/files/components.ts +15 -10
- package/src/files/elements.ts +5 -6
- package/src/files/file-ops.ts +77 -36
- package/src/files/files.ts +90 -95
- package/src/files/media-meta.ts +2 -1
- package/src/files/media-paths.ts +6 -1
- package/src/files/serialize-document.ts +2 -2
- 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 +76 -50
- package/src/github/github-auth-status.ts +27 -3
- package/src/github/github-auth.ts +19 -9
- package/src/github/github-publish.ts +24 -20
- 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 +20 -22
- package/src/grid/grid-layout.ts +21 -5
- package/src/grid/grid-open.ts +3 -6
- package/src/grid/grid-panel.ts +11 -4
- package/src/grid/grid-source.ts +8 -8
- package/src/grid/grid-view.ts +14 -17
- 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 +25 -24
- package/src/grid/sources/csv-file-source.ts +2 -2
- package/src/grid/tabulator-tables.d.ts +55 -34
- package/src/hosting/stage.ts +7 -7
- package/src/i18n/i18n-commands.ts +1 -2
- package/src/media/media-pane.ts +4 -1
- 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 +17 -9
- package/src/panels/ai-chat/attached-context.ts +13 -7
- 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 +46 -35
- package/src/panels/bottom-dock.ts +5 -3
- package/src/panels/canvas-dnd-bridge.ts +31 -24
- package/src/panels/data-explorer.ts +62 -25
- package/src/panels/data-grid.ts +14 -11
- package/src/panels/dnd.ts +108 -118
- package/src/panels/editors.ts +55 -22
- package/src/panels/elements-panel.ts +10 -3
- package/src/panels/events-panel.ts +84 -69
- package/src/panels/formula-workspace.ts +76 -51
- package/src/panels/frontmatter-fields.ts +24 -19
- package/src/panels/frontmatter-panel.ts +44 -34
- package/src/panels/git-diff-open.ts +4 -4
- package/src/panels/git-panel.ts +49 -61
- package/src/panels/head-panel.ts +131 -111
- package/src/panels/i18n-panel.ts +10 -3
- package/src/panels/imports-panel.ts +23 -47
- package/src/panels/jump-bar.ts +48 -29
- package/src/panels/layers-panel.ts +97 -74
- package/src/panels/left-panel.ts +3 -3
- package/src/panels/pane-context.ts +31 -22
- package/src/panels/pane-grid.ts +49 -20
- package/src/panels/panel-registry.ts +22 -37
- package/src/panels/properties-panel.ts +175 -121
- package/src/panels/quick-search.ts +53 -31
- package/src/panels/right-panel.ts +3 -3
- package/src/panels/seo-modal.ts +13 -17
- package/src/panels/settings-menu.ts +15 -15
- package/src/panels/signals-panel.ts +153 -131
- package/src/panels/statement-editor.ts +230 -140
- package/src/panels/style-panel.ts +254 -216
- package/src/panels/style-utils.ts +114 -51
- package/src/panels/stylebook-doc.ts +57 -54
- package/src/panels/stylebook-layers-panel.ts +9 -9
- package/src/panels/stylebook-panel.ts +13 -17
- package/src/panels/tab-drop.ts +27 -11
- package/src/panels/tab-strip.ts +36 -26
- package/src/platform-errors.ts +57 -43
- package/src/platform.ts +58 -30
- package/src/platforms/cloud.ts +345 -175
- package/src/platforms/default-platform.ts +10 -4
- package/src/platforms/devserver.ts +174 -127
- package/src/platforms/read-batcher.ts +16 -8
- package/src/project-list.ts +2 -1
- package/src/publish/deploy-checklist.ts +8 -2
- package/src/publish/pages-service.ts +28 -13
- package/src/publish/publish-commands.ts +5 -4
- package/src/publish/publish-panel.ts +10 -6
- 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 +58 -31
- package/src/services/cem-export.ts +149 -58
- package/src/services/clock.ts +6 -1
- package/src/services/code-services.ts +37 -31
- 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 +18 -12
- 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 +8 -7
- 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 +79 -60
- package/src/settings/css-vars-editor.ts +37 -16
- package/src/settings/defs-editor.ts +38 -35
- package/src/settings/extension-rows.ts +16 -8
- package/src/settings/extension-sections.ts +23 -13
- package/src/settings/extensions-section.ts +4 -1
- package/src/settings/general-settings.ts +11 -8
- package/src/settings/locales-section.ts +20 -12
- package/src/settings/preferences-dialog.ts +9 -6
- package/src/settings/preferences-keymap.ts +7 -5
- package/src/settings/preferences-sections.ts +11 -5
- package/src/settings/project-sections.ts +1 -1
- package/src/settings/schema-field-ui.ts +9 -0
- package/src/settings/settings-document.ts +5 -5
- package/src/shell/tree.ts +6 -5
- package/src/shell.ts +104 -81
- package/src/site-context.ts +37 -22
- package/src/state.ts +41 -49
- package/src/store.ts +54 -34
- package/src/studio.ts +39 -77
- package/src/style/live-preview.ts +1 -1
- package/src/style/project-styles.ts +6 -7
- package/src/style/token-ref.ts +5 -4
- package/src/surfaces/about.ts +18 -19
- package/src/surfaces/add-repo.ts +17 -19
- package/src/surfaces/ai-chat.ts +31 -36
- 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.ts +4 -5
- package/src/surfaces/bottom-dock.ts +9 -18
- package/src/surfaces/canvas-stage.ts +12 -11
- package/src/surfaces/cf-account-picker.ts +17 -18
- package/src/surfaces/commandbar.ts +14 -9
- 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/doc-header.ts +10 -19
- package/src/surfaces/empty-state.ts +7 -10
- package/src/surfaces/entry-editor.ts +14 -11
- 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/git-panel.ts +7 -15
- 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.ts +13 -12
- package/src/surfaces/jump-bar.ts +5 -6
- package/src/surfaces/jxsuite-update.ts +16 -22
- package/src/surfaces/library-pane.ts +25 -20
- package/src/surfaces/logic-panel.ts +17 -30
- package/src/surfaces/logic-workspace.ts +13 -15
- package/src/surfaces/media-browser.ts +11 -10
- package/src/surfaces/media-field.ts +4 -5
- package/src/surfaces/media-pane.ts +8 -7
- package/src/surfaces/menu.ts +29 -23
- package/src/surfaces/navigator-dock.ts +11 -12
- package/src/surfaces/new-project.ts +27 -26
- package/src/surfaces/pane-context.ts +20 -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.ts +5 -6
- 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.ts +11 -18
- package/src/surfaces/panel-problems.ts +5 -7
- package/src/surfaces/panel-signals.ts +20 -34
- package/src/surfaces/panel-stylebook-layers.ts +5 -8
- package/src/surfaces/preferences.ts +21 -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.ts +18 -18
- package/src/surfaces/push-plan.ts +7 -8
- package/src/surfaces/rail.json +126 -73
- package/src/surfaces/rail.ts +38 -12
- package/src/surfaces/reference-field.ts +11 -15
- package/src/surfaces/schema-builder.ts +16 -22
- package/src/surfaces/schema-form.ts +15 -25
- package/src/surfaces/secret-field.ts +9 -6
- package/src/surfaces/seo.ts +21 -15
- package/src/surfaces/settings-contexts.ts +9 -7
- package/src/surfaces/settings-contributed.ts +14 -10
- package/src/surfaces/settings-css-vars.ts +5 -12
- package/src/surfaces/settings-defs.json +2 -2
- package/src/surfaces/settings-defs.ts +17 -21
- package/src/surfaces/settings-deploy.ts +8 -15
- 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.ts +5 -6
- package/src/surfaces/settings-packages.ts +8 -7
- package/src/surfaces/settings-pane.ts +9 -18
- package/src/surfaces/settings-rawjson.ts +5 -6
- package/src/surfaces/shell.ts +1 -2
- package/src/surfaces/slash-menu.ts +19 -9
- package/src/surfaces/statements.ts +13 -18
- package/src/surfaces/statusbar.ts +17 -14
- package/src/surfaces/style-panel.ts +18 -31
- package/src/surfaces/stylebook-chrome.ts +3 -5
- package/src/surfaces/tab-strip.ts +14 -13
- package/src/surfaces/target-line.ts +6 -7
- package/src/surfaces/welcome.ts +5 -7
- 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 +52 -41
- package/src/tabs/transact.ts +98 -53
- package/src/tabs/typing.ts +31 -0
- package/src/types.ts +32 -17
- 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 +57 -48
- package/src/ui/formula-catalog.ts +239 -230
- package/src/ui/formula-chips.ts +33 -18
- package/src/ui/layers.ts +44 -31
- package/src/ui/media-picker.ts +18 -9
- package/src/ui/popover-surface.ts +20 -12
- package/src/ui/progress-modal.ts +13 -8
- package/src/ui/regions.ts +7 -6
- package/src/ui/schema-form.ts +113 -70
- 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 +3 -2
- package/src/utils/base64.ts +3 -1
- package/src/utils/edit-display.ts +103 -74
- 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/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 +10 -12
- package/src/workspace/session.ts +53 -43
- package/src/workspace/workspace.ts +47 -36
- package/dist/chunks/2020-nkxms0ay.js +0 -4
- package/dist/chunks/adapter-m948ab5f.js +0 -4
- package/dist/chunks/cf-account-picker-n8hr38v7.js +0 -4
- package/dist/chunks/cf-settings-356xdtne.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-yk3t844e.js +0 -4
- package/dist/chunks/content-source-bawmyc09.js +0 -4
- package/dist/chunks/convert-to-repeater-7wns8kf1.js +0 -4
- package/dist/chunks/dialog-mtm9fq5t.js +0 -4
- package/dist/chunks/editor-6sc8nacq.js +0 -4
- package/dist/chunks/entry-commands-8ay9fh81.js +0 -4
- package/dist/chunks/extension-sections-na7rj3nr.js +0 -4
- package/dist/chunks/file-ops-gye0qw56.js +0 -4
- package/dist/chunks/files-dmc2xvcq.js +0 -4
- package/dist/chunks/format-host-t76b53f8.js +0 -4
- package/dist/chunks/fs-events-cg4tpz06.js +0 -4
- package/dist/chunks/git-panel-yef7bshy.js +0 -4
- package/dist/chunks/grid-view-7tt4bxw1.js +0 -51
- package/dist/chunks/icons-qbh8akb1.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-tmz30gfp.js +0 -4
- package/dist/chunks/index-nag78a9h.js +0 -4
- package/dist/chunks/jsonMode-zhwsprqk.js +0 -13
- package/dist/chunks/jx-validate-3gbp5nkn.js +0 -4
- package/dist/chunks/layers-fvz99859.js +0 -4
- package/dist/chunks/layers-panel-gchmbf9p.js +0 -4
- package/dist/chunks/listbox-s8fkmnq8.js +0 -4
- package/dist/chunks/lit-html-9agdspkt.js +0 -4
- package/dist/chunks/media-picker-rhjvyy00.js +0 -4
- package/dist/chunks/menu-2e4y9j7b.js +0 -4
- package/dist/chunks/menu-37d07z9m.js +0 -4
- package/dist/chunks/monaco-binding-2jnhjjvr.js +0 -4
- package/dist/chunks/monaco-buffer-rp21359g.js +0 -4
- package/dist/chunks/monaco-setup-vhh7gayr.js +0 -4
- package/dist/chunks/notify-h3www560.js +0 -4
- package/dist/chunks/number-field-gw7sq8rn.js +0 -4
- package/dist/chunks/parse-897fvqah.js +0 -4
- package/dist/chunks/platform-hz34wcd7.js +0 -4
- package/dist/chunks/popover-8htra4er.js +0 -4
- package/dist/chunks/publish-panel-exsmjzyj.js +0 -4
- package/dist/chunks/quick-search-pgaqeh0m.js +0 -4
- package/dist/chunks/references-2cgdxnb8.js +0 -4
- package/dist/chunks/right-panel-jf856w5w.js +0 -4
- package/dist/chunks/section-registry-jnf8r5gy.js +0 -4
- package/dist/chunks/select-n3v7gwas.js +0 -4
- package/dist/chunks/split-pff8f3ze.js +0 -4
- package/dist/chunks/studio-0f55h9ye.js +0 -5
- package/dist/chunks/studio-0sqdhnew.js +0 -12
- package/dist/chunks/studio-19x1c75w.js +0 -5
- package/dist/chunks/studio-2sqcndak.js +0 -5
- package/dist/chunks/studio-3aey7dd3.js +0 -5
- package/dist/chunks/studio-3bpdkq2s.js +0 -5
- package/dist/chunks/studio-47y6fbpf.js +0 -5
- package/dist/chunks/studio-4m3826v2.js +0 -5
- package/dist/chunks/studio-4nx2dj1g.js +0 -4
- package/dist/chunks/studio-4xv5s47r.js +0 -9
- package/dist/chunks/studio-5g4t8v6w.js +0 -5
- package/dist/chunks/studio-5py436sf.js +0 -5
- package/dist/chunks/studio-77kt594t.js +0 -5
- package/dist/chunks/studio-8f87n763.js +0 -10
- package/dist/chunks/studio-8mb00b84.js +0 -5
- package/dist/chunks/studio-8p51gq2h.js +0 -6
- package/dist/chunks/studio-954ds834.js +0 -5
- package/dist/chunks/studio-9ft45c83.js +0 -9
- package/dist/chunks/studio-a2138x5k.js +0 -7
- package/dist/chunks/studio-a9yzstqj.js +0 -5
- package/dist/chunks/studio-acdksxx6.js +0 -5
- package/dist/chunks/studio-ar8jcf2y.js +0 -5
- package/dist/chunks/studio-bmn4mn9j.js +0 -7
- package/dist/chunks/studio-e7xxa0sj.js +0 -5
- package/dist/chunks/studio-ecaz25vk.js +0 -5
- package/dist/chunks/studio-ery42sqr.js +0 -4
- package/dist/chunks/studio-fzdywr6p.js +0 -9
- package/dist/chunks/studio-g5fmf0c1.js +0 -5
- package/dist/chunks/studio-g7nse7zb.js +0 -5
- package/dist/chunks/studio-geq1ea6k.js +0 -14
- package/dist/chunks/studio-ghkb32r8.js +0 -5
- package/dist/chunks/studio-ghrhy2y7.js +0 -5
- package/dist/chunks/studio-grawhey1.js +0 -5
- package/dist/chunks/studio-h0xgswew.js +0 -5
- package/dist/chunks/studio-h9c4p2tx.js +0 -5
- package/dist/chunks/studio-jyzj5cxs.js +0 -5
- package/dist/chunks/studio-mgx8yhnz.js +0 -64
- package/dist/chunks/studio-mpb04y1d.js +0 -6
- package/dist/chunks/studio-n17mty64.js +0 -5
- package/dist/chunks/studio-nwh2eqsk.js +0 -6
- package/dist/chunks/studio-q1h883bt.js +0 -16
- package/dist/chunks/studio-q4tv82h7.js +0 -9
- package/dist/chunks/studio-qpqa7vk3.js +0 -5
- package/dist/chunks/studio-qqz8e5gk.js +0 -5
- package/dist/chunks/studio-qvasen3f.js +0 -5
- package/dist/chunks/studio-rggdb3hm.js +0 -5
- package/dist/chunks/studio-sghy936h.js +0 -4
- package/dist/chunks/studio-skprc6ef.js +0 -5
- package/dist/chunks/studio-tt2nactf.js +0 -5
- package/dist/chunks/studio-tyasmc39.js +0 -5
- package/dist/chunks/studio-vk9ezads.js +0 -5
- package/dist/chunks/studio-vzacdfsc.js +0 -4
- package/dist/chunks/studio-w4c0xmrw.js +0 -5
- package/dist/chunks/studio-wfjqhhbk.js +0 -5
- package/dist/chunks/studio-wgh5kxpj.js +0 -5
- package/dist/chunks/studio-xasj0796.js +0 -5
- package/dist/chunks/studio-y78s8r2n.js +0 -5
- package/dist/chunks/studio-z8w183sh.js +0 -5
- package/dist/chunks/studio-zscd9ty4.js +0 -928
- package/dist/chunks/studio-zxp13sss.js +0 -7
- package/dist/chunks/studio-zygnmm01.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-gr0m4dzr.js +0 -14
- package/dist/chunks/workspace-m15qtcqp.js +0 -4
- package/dist/chunks/ws-client-nf61frr1.js +0 -4
|
@@ -39,7 +39,7 @@ import {
|
|
|
39
39
|
attachInstruction,
|
|
40
40
|
extractInstruction,
|
|
41
41
|
} from "@atlaskit/pragmatic-drag-and-drop-hitbox/tree-item";
|
|
42
|
-
import { isJsonObject } from "@jxsuite/schema/guards";
|
|
42
|
+
import { isJsonObject, isNumber, isString } from "@jxsuite/schema/guards";
|
|
43
43
|
import { mountExpressionEditor, mountOperandEditor } from "../ui/expression-editor";
|
|
44
44
|
import { openMenu } from "../surfaces/menu";
|
|
45
45
|
import { disposeDetachedStatementEditors, renderStatementsSurface } from "../surfaces/statements";
|
|
@@ -47,12 +47,14 @@ import { disposeDetachedStatementEditors, renderStatementsSurface } from "../sur
|
|
|
47
47
|
import type {
|
|
48
48
|
CemEvent,
|
|
49
49
|
JxDispatchStatement,
|
|
50
|
+
JxDocumentValue,
|
|
50
51
|
JxIfStatement,
|
|
51
52
|
JxStatement,
|
|
52
53
|
JxStateDefinition,
|
|
53
54
|
JxSwitchStatement,
|
|
54
55
|
} from "@jxsuite/schema/types";
|
|
55
|
-
import type { StatementFieldView, StatementRowView
|
|
56
|
+
import type { StatementFieldView, StatementRowView } from "../surfaces/statements";
|
|
57
|
+
import type { SurfaceOption } from "../ui/surface";
|
|
56
58
|
|
|
57
59
|
// ─── Options ─────────────────────────────────────────────────────────────────
|
|
58
60
|
|
|
@@ -91,8 +93,15 @@ type LanePath = (string | number)[];
|
|
|
91
93
|
|
|
92
94
|
// ─── Statement Kind Detection ────────────────────────────────────────────────
|
|
93
95
|
|
|
94
|
-
/**
|
|
95
|
-
|
|
96
|
+
/**
|
|
97
|
+
* Discriminate a statement's kind, mirroring the runtime's detection order (`spec.md` §20.2).
|
|
98
|
+
*
|
|
99
|
+
* Takes any document value, not only a well-formed statement: a body is read from a document, and
|
|
100
|
+
* whatever an entry holds falls back to `"expression"` rather than throwing.
|
|
101
|
+
*/
|
|
102
|
+
export function statementKind(
|
|
103
|
+
stmt: JxDocumentValue | undefined,
|
|
104
|
+
): "expression" | "if" | "switch" | "dispatch" {
|
|
96
105
|
if (isJsonObject(stmt)) {
|
|
97
106
|
if ("operator" in stmt) {
|
|
98
107
|
return "expression";
|
|
@@ -112,8 +121,23 @@ export function statementKind(stmt: unknown): "expression" | "if" | "switch" | "
|
|
|
112
121
|
|
|
113
122
|
const ASSIGN_OPS = new Set(["=", "+=", "-=", "*=", "/="]);
|
|
114
123
|
|
|
124
|
+
/** A statement {@link statementKind} reads as an `if`/`then`/`else` branch. */
|
|
125
|
+
function isIfStatement(stmt: JxStatement): stmt is JxIfStatement {
|
|
126
|
+
return statementKind(stmt) === "if";
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/** A statement {@link statementKind} reads as a `$switch`/`cases` multiway branch. */
|
|
130
|
+
function isSwitchStatement(stmt: JxStatement): stmt is JxSwitchStatement {
|
|
131
|
+
return statementKind(stmt) === "switch";
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/** A statement {@link statementKind} reads as a WHATWG `dispatchEvent`. */
|
|
135
|
+
function isDispatchStatement(stmt: JxStatement): stmt is JxDispatchStatement {
|
|
136
|
+
return statementKind(stmt) === "dispatch";
|
|
137
|
+
}
|
|
138
|
+
|
|
115
139
|
/** Card header label — ECMA/WHATWG naming (`spec.md` §20.2). */
|
|
116
|
-
function kindLabel(stmt:
|
|
140
|
+
function kindLabel(stmt: JxStatement): string {
|
|
117
141
|
switch (statementKind(stmt)) {
|
|
118
142
|
case "if": {
|
|
119
143
|
return "If / Else";
|
|
@@ -139,22 +163,25 @@ function kindLabel(stmt: unknown): string {
|
|
|
139
163
|
|
|
140
164
|
// ─── Add-statement Seeds (spec.md §20 shapes) ────────────────────────────────
|
|
141
165
|
|
|
142
|
-
const STATEMENT_SEEDS
|
|
143
|
-
call
|
|
144
|
-
dispatch
|
|
145
|
-
|
|
146
|
-
if
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
166
|
+
const STATEMENT_SEEDS = new Map<string, () => JxStatement>([
|
|
167
|
+
["call", () => ({ operator: "call", target: { $ref: "" }, value: [] })],
|
|
168
|
+
["dispatch", () => ({ dispatchEvent: "" })],
|
|
169
|
+
[
|
|
170
|
+
"if",
|
|
171
|
+
() => ({
|
|
172
|
+
if: { operator: "===", target: { $ref: "" }, value: null },
|
|
173
|
+
then: [],
|
|
174
|
+
}),
|
|
175
|
+
],
|
|
176
|
+
["set", () => ({ operator: "=", target: { $ref: "" }, value: null })],
|
|
177
|
+
["switch", () => ({ $switch: { $ref: "" }, cases: {} })],
|
|
178
|
+
]);
|
|
152
179
|
|
|
153
180
|
/**
|
|
154
181
|
* The add-statement menu, in the order the rows read. One list, and this is it
|
|
155
182
|
* (`studio-ui-guidelines.md` §12.5).
|
|
156
183
|
*/
|
|
157
|
-
const STATEMENT_CHOICES: readonly
|
|
184
|
+
const STATEMENT_CHOICES: readonly SurfaceOption[] = [
|
|
158
185
|
{ label: "Set state", value: "set" },
|
|
159
186
|
{ label: "Call function", value: "call" },
|
|
160
187
|
{ label: "If / Else", value: "if" },
|
|
@@ -164,34 +191,84 @@ const STATEMENT_CHOICES: readonly StatementOption[] = [
|
|
|
164
191
|
|
|
165
192
|
// ─── Lane Addressing (immutable read/write through nested statement lists) ───
|
|
166
193
|
|
|
194
|
+
/**
|
|
195
|
+
* The lane one statement holds under a lane-path step: `then`/`else` on an `if`, a named case or
|
|
196
|
+
* `default` on a `$switch`. Undefined for any other step, which is how a stale path reads.
|
|
197
|
+
*/
|
|
198
|
+
function laneUnder(
|
|
199
|
+
stmt: JxStatement,
|
|
200
|
+
key: string | number | undefined,
|
|
201
|
+
caseKey: string | number | undefined,
|
|
202
|
+
): JxStatement[] | undefined {
|
|
203
|
+
if (isIfStatement(stmt)) {
|
|
204
|
+
if (key === "then") {
|
|
205
|
+
return stmt.then;
|
|
206
|
+
}
|
|
207
|
+
if (key === "else") {
|
|
208
|
+
return stmt.else;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
if (isSwitchStatement(stmt)) {
|
|
212
|
+
if (key === "default") {
|
|
213
|
+
return stmt.default;
|
|
214
|
+
}
|
|
215
|
+
if (key === "cases" && isString(caseKey) && isJsonObject(stmt.cases)) {
|
|
216
|
+
return stmt.cases[caseKey];
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
return undefined;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/** How many entries a lane path's first step consumes: three for a case, two otherwise. */
|
|
223
|
+
function stepLength(key: string | number | undefined): number {
|
|
224
|
+
return key === "cases" ? 3 : 2;
|
|
225
|
+
}
|
|
226
|
+
|
|
167
227
|
/** Resolve the statement list a lane path points at; null when the path is stale. */
|
|
168
228
|
export function laneListAt(list: JxStatement[], path: LanePath): JxStatement[] | null {
|
|
169
229
|
if (path.length === 0) {
|
|
170
230
|
return list;
|
|
171
231
|
}
|
|
172
|
-
const [idx, key] = path;
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
* with no index signature, so asserting one into an open bag is a lie TypeScript rightly refuses
|
|
176
|
-
* — and it was buying nothing, because `isJsonObject` takes `unknown` and narrows to exactly the
|
|
177
|
-
* open bag this wants. The guard on the next line is the real check either way.
|
|
178
|
-
*/
|
|
179
|
-
const stmt: unknown = typeof idx === "number" ? list[idx] : null;
|
|
180
|
-
if (!isJsonObject(stmt) || typeof key !== "string") {
|
|
232
|
+
const [idx, key, caseKey] = path;
|
|
233
|
+
const stmt = isNumber(idx) ? list[idx] : undefined;
|
|
234
|
+
if (stmt === undefined) {
|
|
181
235
|
return null;
|
|
182
236
|
}
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
237
|
+
/* A lane is document data, so the array check stays: a `then` the document holds as anything
|
|
238
|
+
else is a stale path here, not a list to walk. */
|
|
239
|
+
const lane = laneUnder(stmt, key, caseKey);
|
|
240
|
+
return Array.isArray(lane) ? laneListAt(lane, path.slice(stepLength(key))) : null;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* The statement with the lane at one lane-path step rewritten, or null when the statement holds no
|
|
245
|
+
* lane there. The step's key stays where it was in the statement, or is appended when new.
|
|
246
|
+
*/
|
|
247
|
+
function withLaneUnder(
|
|
248
|
+
stmt: JxStatement,
|
|
249
|
+
key: string | number | undefined,
|
|
250
|
+
caseKey: string | number | undefined,
|
|
251
|
+
rewrite: (lane: JxStatement[]) => JxStatement[],
|
|
252
|
+
): JxStatement | null {
|
|
253
|
+
if (isIfStatement(stmt)) {
|
|
254
|
+
if (key === "then") {
|
|
255
|
+
return { ...stmt, then: rewrite(Array.isArray(stmt.then) ? stmt.then : []) };
|
|
256
|
+
}
|
|
257
|
+
if (key === "else") {
|
|
258
|
+
return { ...stmt, else: rewrite(stmt.else ?? []) };
|
|
188
259
|
}
|
|
189
|
-
return laneListAt(cases[caseKey] as unknown as JxStatement[], path.slice(3));
|
|
190
260
|
}
|
|
191
|
-
if (
|
|
192
|
-
|
|
261
|
+
if (isSwitchStatement(stmt)) {
|
|
262
|
+
if (key === "default") {
|
|
263
|
+
return { ...stmt, default: rewrite(stmt.default ?? []) };
|
|
264
|
+
}
|
|
265
|
+
if (key === "cases" && isString(caseKey)) {
|
|
266
|
+
const cases = { ...stmt.cases };
|
|
267
|
+
cases[caseKey] = rewrite(cases[caseKey] ?? []);
|
|
268
|
+
return { ...stmt, cases };
|
|
269
|
+
}
|
|
193
270
|
}
|
|
194
|
-
return
|
|
271
|
+
return null;
|
|
195
272
|
}
|
|
196
273
|
|
|
197
274
|
/** Rebuild the statement tree with the lane at `path` replaced by `next` — fully immutable. */
|
|
@@ -203,22 +280,18 @@ export function withLaneList(
|
|
|
203
280
|
if (path.length === 0) {
|
|
204
281
|
return next;
|
|
205
282
|
}
|
|
206
|
-
const idx
|
|
207
|
-
const
|
|
208
|
-
const
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
updated = {
|
|
217
|
-
...stmt,
|
|
218
|
-
[key]: withLaneList((stmt[key] as JxStatement[] | undefined) ?? [], path.slice(2), next),
|
|
219
|
-
};
|
|
283
|
+
const [idx, key, caseKey] = path;
|
|
284
|
+
const stmt = isNumber(idx) ? list[idx] : undefined;
|
|
285
|
+
const updated =
|
|
286
|
+
stmt === undefined
|
|
287
|
+
? null
|
|
288
|
+
: withLaneUnder(stmt, key, caseKey, (lane) =>
|
|
289
|
+
withLaneList(lane, path.slice(stepLength(key)), next),
|
|
290
|
+
);
|
|
291
|
+
if (updated === null) {
|
|
292
|
+
throw new RangeError(`No statement lane at ${JSON.stringify(path)}`);
|
|
220
293
|
}
|
|
221
|
-
return list.map((s, i) => (i === idx ?
|
|
294
|
+
return list.map((s, i) => (i === idx ? updated : s));
|
|
222
295
|
}
|
|
223
296
|
|
|
224
297
|
// ─── The plan: what every key in the projection addresses ────────────────────
|
|
@@ -391,45 +464,57 @@ export function flattenStatements(
|
|
|
391
464
|
/** The operands of one card, and the plans that commit them. */
|
|
392
465
|
function fieldsOf(cardKey: string, plan: CardPlan): StatementFieldView[] {
|
|
393
466
|
const { commit, stmt } = plan;
|
|
394
|
-
const kind = statementKind(stmt);
|
|
395
467
|
const field = (prop: string) => `${cardKey}::${prop}`;
|
|
396
|
-
|
|
397
|
-
|
|
468
|
+
/* Every operand editor below reports what its own controls built — a `{ $ref }`, a JSON literal
|
|
469
|
+
or an expression node, the `JxExpressionOperand` members an operand admits — so each
|
|
470
|
+
assertion back to a statement only restores the operand type `mountOperandEditor` erases. */
|
|
471
|
+
if (isIfStatement(stmt)) {
|
|
398
472
|
fields.set(field("if"), {
|
|
399
473
|
paint: (host) =>
|
|
400
|
-
mountOperandEditor(
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
474
|
+
mountOperandEditor(
|
|
475
|
+
host,
|
|
476
|
+
stmt.if,
|
|
477
|
+
// SAFETY: `v` is an operand the operand editor built (see above), so this is an `if`.
|
|
478
|
+
(v) => commit({ ...stmt, if: v } as JxIfStatement),
|
|
479
|
+
{
|
|
480
|
+
...operandOpts(opts),
|
|
481
|
+
label: "If",
|
|
482
|
+
prop: "if",
|
|
483
|
+
},
|
|
484
|
+
),
|
|
405
485
|
});
|
|
406
486
|
return [emptyField({ key: field("if"), kind: "control", label: "If", prop: "if" })];
|
|
407
487
|
}
|
|
408
|
-
if (
|
|
409
|
-
const s = stmt as JxSwitchStatement;
|
|
488
|
+
if (isSwitchStatement(stmt)) {
|
|
410
489
|
fields.set(field("$switch"), {
|
|
411
490
|
paint: (host) =>
|
|
412
|
-
mountOperandEditor(
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
491
|
+
mountOperandEditor(
|
|
492
|
+
host,
|
|
493
|
+
stmt.$switch,
|
|
494
|
+
// SAFETY: `v` is an operand the operand editor built (see above), so this is a `$switch`.
|
|
495
|
+
(v) => commit({ ...stmt, $switch: v } as JxSwitchStatement),
|
|
496
|
+
{
|
|
497
|
+
...operandOpts(opts),
|
|
498
|
+
label: "Switch on",
|
|
499
|
+
prop: "$switch",
|
|
500
|
+
},
|
|
501
|
+
),
|
|
417
502
|
});
|
|
418
503
|
return [
|
|
419
504
|
emptyField({ key: field("$switch"), kind: "control", label: "Switch on", prop: "$switch" }),
|
|
420
505
|
];
|
|
421
506
|
}
|
|
422
|
-
if (
|
|
423
|
-
const s = stmt as JxDispatchStatement;
|
|
507
|
+
if (isDispatchStatement(stmt)) {
|
|
424
508
|
fields.set(field("dispatchEvent"), {
|
|
425
|
-
set: (value) => commit({ ...
|
|
509
|
+
set: (value) => commit({ ...stmt, dispatchEvent: value }),
|
|
426
510
|
});
|
|
427
511
|
fields.set(field("detail"), {
|
|
428
512
|
paint: (host) =>
|
|
429
513
|
mountOperandEditor(
|
|
430
514
|
host,
|
|
431
|
-
|
|
432
|
-
|
|
515
|
+
stmt.detail ?? null,
|
|
516
|
+
// SAFETY: `v` is an operand the operand editor built (see above), a valid `detail`.
|
|
517
|
+
(v) => commit({ ...stmt, detail: v } as JxDispatchStatement),
|
|
433
518
|
{
|
|
434
519
|
...operandOpts(opts),
|
|
435
520
|
label: "Detail",
|
|
@@ -439,8 +524,16 @@ export function flattenStatements(
|
|
|
439
524
|
});
|
|
440
525
|
fields.set(field("eventInit"), {
|
|
441
526
|
flag: (name, checked) => {
|
|
442
|
-
|
|
443
|
-
|
|
527
|
+
// The two CustomEventInit members the Options row draws, and nothing else.
|
|
528
|
+
if (name === "bubbles" || name === "composed") {
|
|
529
|
+
// Removed, then re-added, so a checked flag lands last, where it always has.
|
|
530
|
+
const next: JxDispatchStatement = { ...stmt };
|
|
531
|
+
delete next[name];
|
|
532
|
+
if (checked) {
|
|
533
|
+
next[name] = true;
|
|
534
|
+
}
|
|
535
|
+
commit(next);
|
|
536
|
+
}
|
|
444
537
|
},
|
|
445
538
|
});
|
|
446
539
|
return [
|
|
@@ -451,18 +544,19 @@ export function flattenStatements(
|
|
|
451
544
|
options: emitNames.map((n) => ({ label: n, value: n })),
|
|
452
545
|
placeholder: "event-name",
|
|
453
546
|
prop: "dispatchEvent",
|
|
454
|
-
|
|
547
|
+
// The document may hold anything under the key `statementKind` found; only a string shows.
|
|
548
|
+
value: isString(stmt.dispatchEvent) ? stmt.dispatchEvent : "",
|
|
455
549
|
}),
|
|
456
550
|
emptyField({ key: field("detail"), kind: "control", label: "Detail", prop: "detail" }),
|
|
457
551
|
emptyField({
|
|
458
552
|
flags: [
|
|
459
553
|
{
|
|
460
|
-
checked: Boolean(
|
|
554
|
+
checked: Boolean(stmt.bubbles),
|
|
461
555
|
key: `${field("eventInit")}::bubbles`,
|
|
462
556
|
label: "Bubbles",
|
|
463
557
|
},
|
|
464
558
|
{
|
|
465
|
-
checked: Boolean(
|
|
559
|
+
checked: Boolean(stmt.composed),
|
|
466
560
|
key: `${field("eventInit")}::composed`,
|
|
467
561
|
label: "Composed",
|
|
468
562
|
},
|
|
@@ -476,11 +570,18 @@ export function flattenStatements(
|
|
|
476
570
|
}
|
|
477
571
|
fields.set(field("expression"), {
|
|
478
572
|
paint: (host) =>
|
|
479
|
-
mountExpressionEditor(
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
573
|
+
mountExpressionEditor(
|
|
574
|
+
host,
|
|
575
|
+
stmt,
|
|
576
|
+
/* SAFETY: the expression editor reports the node it was handed with one operand or its
|
|
577
|
+
operator replaced, so the expression statement it was given comes back as one. */
|
|
578
|
+
(n) => commit(n as JxStatement),
|
|
579
|
+
{
|
|
580
|
+
allowEventRef: opts.allowEventRef,
|
|
581
|
+
stateDefs: opts.stateDefs,
|
|
582
|
+
stateEntries: opts.stateEntries ?? null,
|
|
583
|
+
},
|
|
584
|
+
),
|
|
484
585
|
});
|
|
485
586
|
/* No label: the card header already names the statement, and the expression editor draws its
|
|
486
587
|
own Operator / Target / Value rows underneath. The surface hides an empty label node. */
|
|
@@ -523,35 +624,33 @@ export function flattenStatements(
|
|
|
523
624
|
title: "Delete statement",
|
|
524
625
|
});
|
|
525
626
|
|
|
526
|
-
|
|
527
|
-
if (kind === "if") {
|
|
528
|
-
const s = stmt as JxIfStatement;
|
|
627
|
+
if (isIfStatement(stmt)) {
|
|
529
628
|
const thenPath = [...path, index, "then"];
|
|
530
|
-
|
|
629
|
+
// A document's `then` is whatever it holds; anything but a list draws as an empty lane.
|
|
630
|
+
const thenList = Array.isArray(stmt.then) ? stmt.then : [];
|
|
631
|
+
const thenPlan = lanePlan(thenPath, thenList);
|
|
531
632
|
laneRow(thenPlan, depth + 1, "Then");
|
|
532
|
-
walk(
|
|
533
|
-
if (Array.isArray(
|
|
633
|
+
walk(thenList, thenPath, depth + 1, thenPlan.commit);
|
|
634
|
+
if (Array.isArray(stmt.else)) {
|
|
534
635
|
const elsePath = [...path, index, "else"];
|
|
535
636
|
const elsePlan: LanePlan = {
|
|
536
|
-
...lanePlan(elsePath,
|
|
637
|
+
...lanePlan(elsePath, stmt.else),
|
|
537
638
|
remove: () => {
|
|
538
|
-
const { else: _else, ...rest } =
|
|
539
|
-
commit(rest
|
|
639
|
+
const { else: _else, ...rest } = stmt;
|
|
640
|
+
commit(rest);
|
|
540
641
|
},
|
|
541
642
|
};
|
|
542
643
|
laneRow(elsePlan, depth + 1, "Else", { title: "Remove branch" });
|
|
543
|
-
walk(
|
|
644
|
+
walk(stmt.else, elsePath, depth + 1, elsePlan.commit);
|
|
544
645
|
} else {
|
|
545
646
|
actionRow(`act:${cardKey}:else`, depth + 1, "Add else", () =>
|
|
546
|
-
commit({ ...
|
|
647
|
+
commit({ ...stmt, else: [] }),
|
|
547
648
|
);
|
|
548
649
|
}
|
|
549
|
-
} else if (
|
|
550
|
-
const
|
|
551
|
-
const cases = isJsonObject(s.cases) ? (s.cases as Record<string, JxStatement[]>) : {};
|
|
650
|
+
} else if (isSwitchStatement(stmt)) {
|
|
651
|
+
const cases: Record<string, JxStatement[]> = isJsonObject(stmt.cases) ? stmt.cases : {};
|
|
552
652
|
const entries = Object.entries(cases);
|
|
553
|
-
const setCases = (next: Record<string, JxStatement[]>) =>
|
|
554
|
-
commit({ ...s, cases: next } as JxStatement);
|
|
653
|
+
const setCases = (next: Record<string, JxStatement[]>) => commit({ ...stmt, cases: next });
|
|
555
654
|
for (const [caseKey, caseList] of entries) {
|
|
556
655
|
const casePath = [...path, index, "cases", caseKey];
|
|
557
656
|
const list_ = Array.isArray(caseList) ? caseList : [];
|
|
@@ -577,18 +676,18 @@ export function flattenStatements(
|
|
|
577
676
|
walk(list_, casePath, depth + 1, casePlan.commit);
|
|
578
677
|
}
|
|
579
678
|
const defaultPath = [...path, index, "default"];
|
|
580
|
-
const defaultList = Array.isArray(
|
|
679
|
+
const defaultList = Array.isArray(stmt.default) ? stmt.default : [];
|
|
581
680
|
const defaultPlan: LanePlan = {
|
|
582
681
|
...lanePlan(defaultPath, defaultList),
|
|
583
682
|
commit: (next) => {
|
|
584
683
|
/* The key goes with its last statement. A `default: []` left behind is a branch the
|
|
585
684
|
runtime still matches, so an emptied lane has to delete the key rather than clear it. */
|
|
586
685
|
if (next.length === 0) {
|
|
587
|
-
const { default: _default, ...rest } =
|
|
588
|
-
commit(rest
|
|
686
|
+
const { default: _default, ...rest } = stmt;
|
|
687
|
+
commit(rest);
|
|
589
688
|
return;
|
|
590
689
|
}
|
|
591
|
-
commit({ ...
|
|
690
|
+
commit({ ...stmt, default: next });
|
|
592
691
|
},
|
|
593
692
|
};
|
|
594
693
|
laneRow(defaultPlan, depth + 1, "Default");
|
|
@@ -636,45 +735,38 @@ function registerStatementsDnD(
|
|
|
636
735
|
dndRegistrations.get(root)?.();
|
|
637
736
|
const cleanups: (() => void)[] = [];
|
|
638
737
|
|
|
639
|
-
for (const row of root.querySelectorAll("[data-stmt-row]")
|
|
738
|
+
for (const row of root.querySelectorAll<HTMLElement>("[data-stmt-row]")) {
|
|
640
739
|
const laneId = row.dataset.stmtLane ?? "[]";
|
|
641
740
|
const index = Math.trunc(Number(row.dataset.stmtIndex)) || 0;
|
|
642
741
|
const handle = row.querySelector('[part="drag"]');
|
|
742
|
+
const dragArgs: Parameters<typeof draggable>[0] = {
|
|
743
|
+
element: row,
|
|
744
|
+
getInitialData() {
|
|
745
|
+
return { index, lane: laneId, type: "statement" };
|
|
746
|
+
},
|
|
747
|
+
onGenerateDragPreview({ nativeSetDragImage }) {
|
|
748
|
+
disableNativeDragPreview({ nativeSetDragImage });
|
|
749
|
+
},
|
|
750
|
+
onDragStart() {
|
|
751
|
+
row.dataset.dragging = "";
|
|
752
|
+
},
|
|
753
|
+
onDrop() {
|
|
754
|
+
delete row.dataset.dragging;
|
|
755
|
+
},
|
|
756
|
+
};
|
|
757
|
+
if (handle) {
|
|
758
|
+
dragArgs.dragHandle = handle;
|
|
759
|
+
}
|
|
643
760
|
|
|
644
761
|
cleanups.push(
|
|
645
762
|
combine(
|
|
646
|
-
draggable(
|
|
647
|
-
element: row,
|
|
648
|
-
...(handle ? { dragHandle: handle } : {}),
|
|
649
|
-
getInitialData() {
|
|
650
|
-
return { index, lane: laneId, type: "statement" };
|
|
651
|
-
},
|
|
652
|
-
onGenerateDragPreview({
|
|
653
|
-
nativeSetDragImage,
|
|
654
|
-
}: {
|
|
655
|
-
nativeSetDragImage: ((image: Element, x: number, y: number) => void) | null;
|
|
656
|
-
}) {
|
|
657
|
-
disableNativeDragPreview({ nativeSetDragImage });
|
|
658
|
-
},
|
|
659
|
-
onDragStart() {
|
|
660
|
-
row.dataset.dragging = "";
|
|
661
|
-
},
|
|
662
|
-
onDrop() {
|
|
663
|
-
delete row.dataset.dragging;
|
|
664
|
-
},
|
|
665
|
-
}),
|
|
763
|
+
draggable(dragArgs),
|
|
666
764
|
dropTargetForElements({
|
|
667
765
|
element: row,
|
|
668
|
-
canDrop({ source }
|
|
766
|
+
canDrop({ source }) {
|
|
669
767
|
return source.data.type === "statement" && source.data.lane === laneId;
|
|
670
768
|
},
|
|
671
|
-
getData({
|
|
672
|
-
input,
|
|
673
|
-
element,
|
|
674
|
-
}: {
|
|
675
|
-
input: Parameters<typeof attachInstruction>[1]["input"];
|
|
676
|
-
element: Element;
|
|
677
|
-
}) {
|
|
769
|
+
getData({ input, element }) {
|
|
678
770
|
return attachInstruction(
|
|
679
771
|
{ index },
|
|
680
772
|
{
|
|
@@ -685,22 +777,16 @@ function registerStatementsDnD(
|
|
|
685
777
|
input,
|
|
686
778
|
mode: "standard",
|
|
687
779
|
},
|
|
688
|
-
)
|
|
780
|
+
);
|
|
689
781
|
},
|
|
690
|
-
onDrag({ self }
|
|
782
|
+
onDrag({ self }) {
|
|
691
783
|
const instruction = extractInstruction(self.data);
|
|
692
784
|
markDrop(row, instruction?.type);
|
|
693
785
|
},
|
|
694
786
|
onDragLeave() {
|
|
695
787
|
markDrop(row);
|
|
696
788
|
},
|
|
697
|
-
onDrop({
|
|
698
|
-
self,
|
|
699
|
-
source,
|
|
700
|
-
}: {
|
|
701
|
-
self: { data: Record<string, unknown> };
|
|
702
|
-
source: { data: Record<string, unknown> };
|
|
703
|
-
}) {
|
|
789
|
+
onDrop({ self, source }) {
|
|
704
790
|
markDrop(row);
|
|
705
791
|
const instruction = extractInstruction(self.data);
|
|
706
792
|
if (
|
|
@@ -709,10 +795,14 @@ function registerStatementsDnD(
|
|
|
709
795
|
) {
|
|
710
796
|
return;
|
|
711
797
|
}
|
|
712
|
-
|
|
798
|
+
// `canDrop` admitted only this lane's statement rows, whose data carries a number.
|
|
799
|
+
const from = source.data.index;
|
|
800
|
+
/* SAFETY: `laneId` is this row's `data-stmt-lane`, which the surface writes from the
|
|
801
|
+
row's `lane`: `JSON.stringify` of a LanePath in flattenStatements, or the "[]"
|
|
802
|
+
fallback above. */
|
|
713
803
|
const lanePath = JSON.parse(laneId) as LanePath;
|
|
714
804
|
const lane = laneListAt(statements, lanePath);
|
|
715
|
-
if (!lane || from === index) {
|
|
805
|
+
if (!lane || !isNumber(from) || from === index) {
|
|
716
806
|
return;
|
|
717
807
|
}
|
|
718
808
|
let insertAt = instruction.type === "reorder-above" ? index : index + 1;
|
|
@@ -815,7 +905,7 @@ export function mountStatementEditor(
|
|
|
815
905
|
title: choice.label,
|
|
816
906
|
})),
|
|
817
907
|
run: (id) => {
|
|
818
|
-
const seed = STATEMENT_SEEDS
|
|
908
|
+
const seed = STATEMENT_SEEDS.get(id);
|
|
819
909
|
if (seed) {
|
|
820
910
|
plan.commit([...plan.list, seed()]);
|
|
821
911
|
}
|