@jxsuite/studio 6.1.1 → 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-va2wwra4.js → 2020-f2gkpy8d.js} +3 -3
- 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-2veqmnhr.js → index-zpjmzqfk.js} +3 -3
- package/dist/chunks/{javascript-8nbvs12s.js → javascript-m54mnwp6.js} +3 -3
- package/dist/chunks/{jsonMode-s8kt9dsj.js → jsonMode-w15cmrcm.js} +8 -8
- 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-1q1sh2ax.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-h46vtzk8.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-rv11kfwa.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-8grwxtqk.js → studio-90pq9km1.js} +4 -4
- package/dist/chunks/studio-924p1tm1.js +6 -0
- package/dist/chunks/{studio-pre0skq6.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-vrmcjf9g.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-wszjyh0j.js → studio-tq0rtfwj.js} +4 -4
- package/dist/chunks/{studio-kggey1jt.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-zey7zsdw.js → studio-y64hrt8p.js} +7 -7
- 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-2frah6h1.js → tsMode-sf49ee9x.js} +7 -7
- 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 +97 -97
- package/package.json +6 -6
- 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 +62 -41
- package/src/canvas/canvas-surface.ts +5 -3
- package/src/canvas/canvas-utils.ts +90 -49
- 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 +135 -96
- 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-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 +12 -16
- package/src/canvas/iframe-render.ts +36 -34
- 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/keymap.ts +47 -43
- package/src/commands/levels.ts +3 -3
- package/src/commands/live-context.ts +7 -7
- 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 +32 -20
- 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 +3 -0
- 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 +52 -21
- 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 +218 -205
- 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 +129 -117
- 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 +25 -75
- 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 +19 -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.ts +13 -13
- 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/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 +73 -73
- 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 +40 -36
- 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/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-t6b6qe31.js +0 -5
- package/dist/chunks/studio-tdcprbqb.js +0 -5
- 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-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/workspace-zt81g1ms.js +0 -4
- package/dist/chunks/ws-client-n2bh4hkf.js +0 -4
|
@@ -21,7 +21,13 @@
|
|
|
21
21
|
* @docs studio/logic/data
|
|
22
22
|
*/
|
|
23
23
|
|
|
24
|
-
import {
|
|
24
|
+
import {
|
|
25
|
+
displayTagName,
|
|
26
|
+
isJsonObject,
|
|
27
|
+
isNonNullObject,
|
|
28
|
+
isRef,
|
|
29
|
+
isString,
|
|
30
|
+
} from "@jxsuite/schema/guards";
|
|
25
31
|
import { dynamicRouteParams } from "../page-params";
|
|
26
32
|
import { projectState } from "../state";
|
|
27
33
|
import type { JsonValue } from "../types";
|
|
@@ -52,12 +58,15 @@ import { mountMediaPicker } from "../ui/media-picker";
|
|
|
52
58
|
import { renderOnly } from "../store";
|
|
53
59
|
import { mountSchemaForm } from "../ui/schema-form";
|
|
54
60
|
import { resolveContextPointer } from "../services/context-resolver";
|
|
61
|
+
import type { ResolveContextOptions } from "../services/context-resolver";
|
|
55
62
|
import { mountSignalsSurface } from "../surfaces/panel-signals";
|
|
56
|
-
import type { JsonSchema } from "../ui/schema-form";
|
|
57
|
-
import type { TabUi } from "../tabs/tab";
|
|
63
|
+
import type { JsonSchema, SchemaFormContext } from "../ui/schema-form";
|
|
64
|
+
import type { Tab, TabUi } from "../tabs/tab";
|
|
58
65
|
import type {
|
|
59
66
|
CemEvent,
|
|
60
67
|
CemParameter,
|
|
68
|
+
JsonObject,
|
|
69
|
+
JxDocumentValue,
|
|
61
70
|
JxMutableNode,
|
|
62
71
|
JxStatement,
|
|
63
72
|
JxStateDefinition,
|
|
@@ -74,19 +83,19 @@ import type {
|
|
|
74
83
|
SignalChipView,
|
|
75
84
|
SignalFieldKind,
|
|
76
85
|
SignalFieldView,
|
|
77
|
-
SignalOptionGroup,
|
|
78
86
|
SignalRowView,
|
|
79
87
|
SignalsActions,
|
|
80
88
|
SignalsSurfaceHandle,
|
|
81
89
|
SignalsView,
|
|
82
90
|
} from "../surfaces/panel-signals";
|
|
91
|
+
import type { SurfaceOptionGroup } from "../ui/surface";
|
|
83
92
|
|
|
84
93
|
interface SignalsPanelState {
|
|
85
94
|
document: JxMutableNode;
|
|
86
|
-
ui?: TabUi
|
|
95
|
+
ui?: TabUi;
|
|
87
96
|
mode?: string;
|
|
88
97
|
selection?: (string | number)[][];
|
|
89
|
-
canvas?:
|
|
98
|
+
canvas?: Tab["session"]["canvas"] | null;
|
|
90
99
|
_collapsedSignalCats?: Set<string>;
|
|
91
100
|
documentPath?: string | null | undefined;
|
|
92
101
|
}
|
|
@@ -117,15 +126,15 @@ export interface SignalDef {
|
|
|
117
126
|
$export?: string;
|
|
118
127
|
$compute?: string;
|
|
119
128
|
$deps?: string[];
|
|
120
|
-
$expression?:
|
|
129
|
+
$expression?: JsonObject;
|
|
121
130
|
$handler?: string;
|
|
122
131
|
type?: string;
|
|
123
|
-
default?:
|
|
124
|
-
body?: string |
|
|
125
|
-
parameters?: string[];
|
|
132
|
+
default?: JsonValue;
|
|
133
|
+
body?: string | JxStatement[];
|
|
134
|
+
parameters?: (string | CemParameter)[];
|
|
126
135
|
timing?: string;
|
|
127
136
|
description?: string;
|
|
128
|
-
fields?:
|
|
137
|
+
fields?: JsonObject;
|
|
129
138
|
url?: string;
|
|
130
139
|
method?: string;
|
|
131
140
|
key?: string;
|
|
@@ -138,7 +147,7 @@ export interface SignalDef {
|
|
|
138
147
|
deprecated?: string | boolean;
|
|
139
148
|
format?: string;
|
|
140
149
|
emits?: CemEvent[];
|
|
141
|
-
[key: string]:
|
|
150
|
+
[key: string]: JxDocumentValue | undefined;
|
|
142
151
|
}
|
|
143
152
|
|
|
144
153
|
// ─── Module-local state ─────────────────────────────────────────────────────
|
|
@@ -155,22 +164,25 @@ let renameError: { name: string; message: string } | null = null;
|
|
|
155
164
|
/** Track which functions have the advanced param editor open. */
|
|
156
165
|
const advancedParamOpen = new Set<string>();
|
|
157
166
|
|
|
158
|
-
/**
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
167
|
+
/** A field write: the def members to set, with `undefined` dropping one (`mutateUpdateDef`). */
|
|
168
|
+
type DefPatch = Record<string, JxDocumentValue | undefined>;
|
|
169
|
+
|
|
170
|
+
/** Default templates for creating new signal definitions, by the add picker's value. */
|
|
171
|
+
const DEF_TEMPLATES = new Map<string, JsonObject>([
|
|
172
|
+
["computed", { $compute: "", $deps: [] }],
|
|
173
|
+
["cookie", { $prototype: "Cookie", default: "", name: "" }],
|
|
174
|
+
["expression", { $expression: { operator: "=", target: null } }],
|
|
175
|
+
["external", { $prototype: "", $src: "" }],
|
|
176
|
+
["formData", { $prototype: "FormData", fields: {} }],
|
|
177
|
+
["function", { $prototype: "Function", body: "", parameters: [] }],
|
|
178
|
+
["indexedDB", { $prototype: "IndexedDB", database: "", store: "", version: 1 }],
|
|
179
|
+
["localStorage", { $prototype: "LocalStorage", default: null, key: "" }],
|
|
180
|
+
["map", { $prototype: "Map", default: {} }],
|
|
181
|
+
["request", { $prototype: "Request", method: "GET", timing: "client", url: "" }],
|
|
182
|
+
["sessionStorage", { $prototype: "SessionStorage", default: null, key: "" }],
|
|
183
|
+
["set", { $prototype: "Set", default: [] }],
|
|
184
|
+
["state", { default: "", type: "string" }],
|
|
185
|
+
]);
|
|
174
186
|
|
|
175
187
|
/** Keys handled by the framework — skip when rendering schema fields. */
|
|
176
188
|
const STUDIO_RESERVED_KEYS = new Set([
|
|
@@ -194,23 +206,27 @@ const DEBOUNCE_MS = 500;
|
|
|
194
206
|
|
|
195
207
|
// ─── Signals / defs helpers ──────────────────────────────────────────────────
|
|
196
208
|
|
|
209
|
+
/** One manifest state class the add picker offers, with the def fields it seeds. */
|
|
210
|
+
export interface ExtensionStateClass {
|
|
211
|
+
name: string;
|
|
212
|
+
stateDefaults?: JsonObject;
|
|
213
|
+
}
|
|
214
|
+
|
|
197
215
|
/**
|
|
198
216
|
* Extension-manifest state classes for the add-state picker: plain `$prototype` targets (no
|
|
199
217
|
* admission blocks) across the enabled extensions, each with its `$studio.stateDefaults` hint
|
|
200
218
|
* (specs/extensions.md §10). Manifest classes need no `$src` — the registry resolves them.
|
|
201
219
|
*/
|
|
202
|
-
export function extensionStateClasses(): {
|
|
203
|
-
|
|
204
|
-
stateDefaults?: Record<string, unknown>;
|
|
205
|
-
}[] {
|
|
206
|
-
const out: { name: string; stateDefaults?: Record<string, unknown> }[] = [];
|
|
220
|
+
export function extensionStateClasses(): ExtensionStateClass[] {
|
|
221
|
+
const out: ExtensionStateClass[] = [];
|
|
207
222
|
for (const ext of getExtensions()) {
|
|
208
223
|
for (const cls of ext.classes ?? []) {
|
|
209
224
|
if (cls.state) {
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
}
|
|
225
|
+
const entry: ExtensionStateClass = { name: cls.name };
|
|
226
|
+
if (cls.stateDefaults !== undefined) {
|
|
227
|
+
entry.stateDefaults = cls.stateDefaults;
|
|
228
|
+
}
|
|
229
|
+
out.push(entry);
|
|
214
230
|
}
|
|
215
231
|
}
|
|
216
232
|
}
|
|
@@ -220,24 +236,25 @@ export function extensionStateClasses(): {
|
|
|
220
236
|
/**
|
|
221
237
|
* View a state entry through the panel's flattened editing lens. Naked primitive and array entries
|
|
222
238
|
* surface as an empty view — the builders guard every field access.
|
|
223
|
-
*
|
|
224
|
-
* @param {import("@jxsuite/schema/types").JxStateDefinition} def
|
|
225
|
-
* @returns {SignalDef}
|
|
226
239
|
*/
|
|
227
|
-
function asSignalDef(def: JxStateDefinition): SignalDef {
|
|
228
|
-
|
|
240
|
+
function asSignalDef(def: SignalDef | JxStateDefinition): SignalDef {
|
|
241
|
+
if (!isNonNullObject(def) || Array.isArray(def)) {
|
|
242
|
+
return {};
|
|
243
|
+
}
|
|
244
|
+
/* SAFETY: `def` is one of a state entry's object shapes (function, prototype, expression, server
|
|
245
|
+
function or plain object), and SignalDef is their union flattened into one all-optional record.
|
|
246
|
+
The two places it is narrower than a shape are read only behind the branch that owns them:
|
|
247
|
+
`body` as statements or source for a Function entry, and `$expression` (a JSON node) for an
|
|
248
|
+
expression entry, which is all `expressionHint` and the expression editor take it as. */
|
|
249
|
+
return def as SignalDef;
|
|
229
250
|
}
|
|
230
251
|
|
|
231
|
-
/**
|
|
232
|
-
|
|
233
|
-
*
|
|
234
|
-
* @param {SignalDef | unknown} def
|
|
235
|
-
*/
|
|
236
|
-
export function defCategory(def: SignalDef | unknown) {
|
|
252
|
+
/** Classify a state entry into a category string. */
|
|
253
|
+
export function defCategory(def: SignalDef | JxStateDefinition | undefined) {
|
|
237
254
|
if (!def) {
|
|
238
255
|
return "state";
|
|
239
256
|
}
|
|
240
|
-
const d = def
|
|
257
|
+
const d = asSignalDef(def);
|
|
241
258
|
if (d.$expression) {
|
|
242
259
|
return "expression";
|
|
243
260
|
}
|
|
@@ -253,16 +270,12 @@ export function defCategory(def: SignalDef | unknown) {
|
|
|
253
270
|
return "state";
|
|
254
271
|
}
|
|
255
272
|
|
|
256
|
-
/**
|
|
257
|
-
|
|
258
|
-
*
|
|
259
|
-
* @param {SignalDef | unknown} def
|
|
260
|
-
*/
|
|
261
|
-
export function defBadgeLabel(def: SignalDef | unknown) {
|
|
273
|
+
/** Badge label for a def category. */
|
|
274
|
+
export function defBadgeLabel(def: SignalDef | JxStateDefinition | undefined) {
|
|
262
275
|
if (!def) {
|
|
263
276
|
return "S";
|
|
264
277
|
}
|
|
265
|
-
const d = def
|
|
278
|
+
const d = asSignalDef(def);
|
|
266
279
|
if (d.$expression) {
|
|
267
280
|
return "E";
|
|
268
281
|
}
|
|
@@ -350,12 +363,12 @@ export function collectCssParts(
|
|
|
350
363
|
parts: { name: string; tag: string }[] = [],
|
|
351
364
|
) {
|
|
352
365
|
const part = node?.attributes?.part;
|
|
353
|
-
if (
|
|
354
|
-
parts.push({ name: part, tag: displayTagName(node
|
|
366
|
+
if (isString(part) && part) {
|
|
367
|
+
parts.push({ name: part, tag: displayTagName(node.tagName) || "div" });
|
|
355
368
|
}
|
|
356
369
|
if (Array.isArray(node?.children)) {
|
|
357
370
|
for (const c of node.children) {
|
|
358
|
-
if (
|
|
371
|
+
if (!isString(c)) {
|
|
359
372
|
collectCssParts(c, parts);
|
|
360
373
|
}
|
|
361
374
|
}
|
|
@@ -367,17 +380,18 @@ export function collectCssParts(
|
|
|
367
380
|
* Resolve a $ref value to a display string using signal defaults. Used by the canvas to show real
|
|
368
381
|
* values instead of raw refs.
|
|
369
382
|
*
|
|
370
|
-
* @param {
|
|
371
|
-
* @param {Record<string,
|
|
383
|
+
* @param {JsonValue | undefined} value
|
|
384
|
+
* @param {Record<string, JxStateDefinition> | null | undefined} defs
|
|
372
385
|
*/
|
|
373
386
|
export function resolveDefaultForCanvas(
|
|
374
|
-
value:
|
|
387
|
+
value: JsonValue | undefined,
|
|
375
388
|
defs: Record<string, JxStateDefinition> | null | undefined,
|
|
376
389
|
) {
|
|
377
|
-
|
|
390
|
+
// Anything but a `{ $ref }` with a non-empty pointer is a literal, shown as it is.
|
|
391
|
+
if (!isRef(value) || !value.$ref) {
|
|
378
392
|
return value;
|
|
379
393
|
}
|
|
380
|
-
const ref =
|
|
394
|
+
const ref = value.$ref;
|
|
381
395
|
/** @type {string | undefined} */
|
|
382
396
|
let defName;
|
|
383
397
|
if (ref.startsWith("#/state/")) {
|
|
@@ -397,7 +411,7 @@ export function resolveDefaultForCanvas(
|
|
|
397
411
|
// State signal → use default
|
|
398
412
|
if (!def.$compute && !def.$prototype) {
|
|
399
413
|
if (def.default !== undefined && def.default !== null) {
|
|
400
|
-
if (
|
|
414
|
+
if (isNonNullObject(def.default)) {
|
|
401
415
|
return JSON.stringify(def.default);
|
|
402
416
|
}
|
|
403
417
|
return String(def.default);
|
|
@@ -415,7 +429,7 @@ export function resolveDefaultForCanvas(
|
|
|
415
429
|
// Storage → use default or key
|
|
416
430
|
if (def.$prototype === "LocalStorage" || def.$prototype === "SessionStorage") {
|
|
417
431
|
if (def.default !== undefined && def.default !== null) {
|
|
418
|
-
if (
|
|
432
|
+
if (isNonNullObject(def.default)) {
|
|
419
433
|
return JSON.stringify(def.default);
|
|
420
434
|
}
|
|
421
435
|
return String(def.default);
|
|
@@ -430,14 +444,14 @@ export function resolveDefaultForCanvas(
|
|
|
430
444
|
|
|
431
445
|
/** Normalize a parameter entry to a CEM object. */
|
|
432
446
|
export function normParam(p: string | CemParameter): CemParameter {
|
|
433
|
-
return
|
|
447
|
+
return isString(p) ? { name: p } : p;
|
|
434
448
|
}
|
|
435
449
|
|
|
436
450
|
/** Extract the display text from a CEM `{ text }` type value, if present. */
|
|
437
451
|
function cemTypeText(type: JsonValue | undefined): string {
|
|
438
|
-
if (
|
|
452
|
+
if (isJsonObject(type)) {
|
|
439
453
|
const { text } = type;
|
|
440
|
-
if (
|
|
454
|
+
if (isString(text)) {
|
|
441
455
|
return text;
|
|
442
456
|
}
|
|
443
457
|
}
|
|
@@ -445,11 +459,11 @@ function cemTypeText(type: JsonValue | undefined): string {
|
|
|
445
459
|
}
|
|
446
460
|
|
|
447
461
|
/** A value as a field shows it: JSON for a structure, the string for anything else. */
|
|
448
|
-
function asText(value:
|
|
462
|
+
function asText(value: JsonValue | undefined, indent = false): string {
|
|
449
463
|
if (value === undefined || value === null) {
|
|
450
464
|
return "";
|
|
451
465
|
}
|
|
452
|
-
if (
|
|
466
|
+
if (isNonNullObject(value)) {
|
|
453
467
|
return indent ? JSON.stringify(value, null, 2) : JSON.stringify(value);
|
|
454
468
|
}
|
|
455
469
|
return String(value);
|
|
@@ -621,7 +635,7 @@ function nameField(S: SignalsPanelState, name: string): SignalFieldView {
|
|
|
621
635
|
|
|
622
636
|
/** A plain value entry: its type, its default, and the CEM facts a custom element adds. */
|
|
623
637
|
function stateFields(S: SignalsPanelState, name: string, def: SignalDef): SignalFieldView[] {
|
|
624
|
-
const patch = (value:
|
|
638
|
+
const patch = (value: DefPatch): void => {
|
|
625
639
|
transactDoc(activeTab.value, (t) => mutateUpdateDef(t, name, value));
|
|
626
640
|
};
|
|
627
641
|
const defaultVal = asText(def.default);
|
|
@@ -661,7 +675,7 @@ function stateFields(S: SignalsPanelState, name: string, def: SignalDef): Signal
|
|
|
661
675
|
} else {
|
|
662
676
|
out.push(
|
|
663
677
|
textField(name, "default", "Default", defaultVal, (v: string) => {
|
|
664
|
-
let parsed:
|
|
678
|
+
let parsed: JsonValue = v;
|
|
665
679
|
if (def.type === "integer") {
|
|
666
680
|
parsed = Math.trunc(Number(v)) || 0;
|
|
667
681
|
} else if (def.type === "number") {
|
|
@@ -670,12 +684,13 @@ function stateFields(S: SignalsPanelState, name: string, def: SignalDef): Signal
|
|
|
670
684
|
parsed = v === "true";
|
|
671
685
|
} else if (def.type === "array" || def.type === "object") {
|
|
672
686
|
try {
|
|
673
|
-
|
|
687
|
+
// SAFETY: whatever `JSON.parse` returns without throwing is a JSON value.
|
|
688
|
+
parsed = JSON.parse(v) as JsonValue;
|
|
674
689
|
} catch {
|
|
675
690
|
parsed = v;
|
|
676
691
|
}
|
|
677
692
|
}
|
|
678
|
-
patch({ default: parsed
|
|
693
|
+
patch({ default: parsed });
|
|
679
694
|
}),
|
|
680
695
|
);
|
|
681
696
|
}
|
|
@@ -708,7 +723,7 @@ function stateFields(S: SignalsPanelState, name: string, def: SignalDef): Signal
|
|
|
708
723
|
name,
|
|
709
724
|
"deprecated",
|
|
710
725
|
"Deprecated",
|
|
711
|
-
|
|
726
|
+
isString(def.deprecated) ? def.deprecated : "",
|
|
712
727
|
(v) => patch({ deprecated: v || undefined }),
|
|
713
728
|
),
|
|
714
729
|
);
|
|
@@ -760,7 +775,7 @@ function computedFields(name: string, def: SignalDef): SignalFieldView[] {
|
|
|
760
775
|
|
|
761
776
|
/** A fetched, stored or constructed value — one case per `$prototype`. */
|
|
762
777
|
function dataFields(S: SignalsPanelState, name: string, def: SignalDef): SignalFieldView[] {
|
|
763
|
-
const patch = (value:
|
|
778
|
+
const patch = (value: DefPatch): void => {
|
|
764
779
|
transactDoc(activeTab.value, (t) => mutateUpdateDef(t, name, value));
|
|
765
780
|
};
|
|
766
781
|
const proto = def.$prototype;
|
|
@@ -800,8 +815,8 @@ function dataFields(S: SignalsPanelState, name: string, def: SignalDef): SignalF
|
|
|
800
815
|
value: stored,
|
|
801
816
|
write: (v: string) => {
|
|
802
817
|
try {
|
|
803
|
-
|
|
804
|
-
|
|
818
|
+
/* SAFETY: `JSON.parse` answers `any`, but whatever it returns without throwing is a
|
|
819
|
+
JSON value — and a document default is exactly that. */
|
|
805
820
|
patch({ default: JSON.parse(v) as JsonValue });
|
|
806
821
|
} catch {
|
|
807
822
|
patch({ default: v });
|
|
@@ -846,6 +861,7 @@ function dataFields(S: SignalsPanelState, name: string, def: SignalDef): SignalF
|
|
|
846
861
|
value: text,
|
|
847
862
|
write: (v: string) => {
|
|
848
863
|
try {
|
|
864
|
+
// SAFETY: whatever `JSON.parse` returns without throwing is a JSON value.
|
|
849
865
|
patch({ [key]: JSON.parse(v) as JsonValue });
|
|
850
866
|
} catch {}
|
|
851
867
|
},
|
|
@@ -863,7 +879,7 @@ function dataFields(S: SignalsPanelState, name: string, def: SignalDef): SignalF
|
|
|
863
879
|
* and the fetch's resolution is what repaints the panel with the form in it.
|
|
864
880
|
*/
|
|
865
881
|
function externalFields(S: SignalsPanelState, name: string, def: SignalDef): SignalFieldView[] {
|
|
866
|
-
const patch = (value:
|
|
882
|
+
const patch = (value: DefPatch): void => {
|
|
867
883
|
transactDoc(activeTab.value, (t) => mutateUpdateDef(t, name, value));
|
|
868
884
|
};
|
|
869
885
|
const importedPath = def.$prototype
|
|
@@ -928,6 +944,9 @@ function externalFields(S: SignalsPanelState, name: string, def: SignalDef): Sig
|
|
|
928
944
|
}
|
|
929
945
|
out.push(field({ key: "schema", kind: "slot", signal: name, slot: "schema" }));
|
|
930
946
|
islands.set(`${name}/schema`, (host) => {
|
|
947
|
+
/* SAFETY: the cache holds what `fetchPluginSchema` read from the plugin's own schema export,
|
|
948
|
+
which is a JSON Schema object; `JsonSchema` is the form's all-optional view of those same
|
|
949
|
+
keywords. */
|
|
931
950
|
placeSchemaForm(host, schema as JsonSchema, def, name, S);
|
|
932
951
|
});
|
|
933
952
|
return out;
|
|
@@ -944,9 +963,13 @@ function writeCemField<T extends CemParameter | CemEvent>(
|
|
|
944
963
|
}
|
|
945
964
|
if (column === "type") {
|
|
946
965
|
const { type: _type, ...rest } = entry;
|
|
966
|
+
/* SAFETY: `rest` is `entry` less `type`, which CemParameter and CemEvent both declare optional,
|
|
967
|
+
so it is still a `T` whether `type` comes back as `{ text }` or stays dropped. */
|
|
947
968
|
return (value ? { ...rest, type: { text: value } } : rest) as T;
|
|
948
969
|
}
|
|
949
970
|
const { description: _description, ...rest } = entry;
|
|
971
|
+
/* SAFETY: `rest` is `entry` less `description`, which CemParameter and CemEvent both declare
|
|
972
|
+
optional, so it is still a `T` whether `description` comes back or stays dropped. */
|
|
950
973
|
return (value ? { ...rest, description: value } : rest) as T;
|
|
951
974
|
}
|
|
952
975
|
|
|
@@ -1091,7 +1114,7 @@ function parameterField(name: string, def: SignalDef): SignalFieldView {
|
|
|
1091
1114
|
|
|
1092
1115
|
/** The CEM emits editor — the same table shape, over `emits`. */
|
|
1093
1116
|
function emitsField(name: string, def: SignalDef): SignalFieldView {
|
|
1094
|
-
const emits = def.emits
|
|
1117
|
+
const emits = def.emits ?? [];
|
|
1095
1118
|
const write = (next: CemEvent[]): void => {
|
|
1096
1119
|
transactDoc(activeTab.value, (t) =>
|
|
1097
1120
|
mutateUpdateDef(t, name, { emits: next.length > 0 ? next : undefined }),
|
|
@@ -1145,7 +1168,7 @@ function emitsField(name: string, def: SignalDef): SignalFieldView {
|
|
|
1145
1168
|
* change, nothing is converted.
|
|
1146
1169
|
*/
|
|
1147
1170
|
function functionFields(S: SignalsPanelState, name: string, def: SignalDef): SignalFieldView[] {
|
|
1148
|
-
const patch = (value:
|
|
1171
|
+
const patch = (value: DefPatch): void => {
|
|
1149
1172
|
transactDoc(activeTab.value, (t) => mutateUpdateDef(t, name, value));
|
|
1150
1173
|
};
|
|
1151
1174
|
const out: SignalFieldView[] = [
|
|
@@ -1168,7 +1191,8 @@ function functionFields(S: SignalsPanelState, name: string, def: SignalDef): Sig
|
|
|
1168
1191
|
return out;
|
|
1169
1192
|
}
|
|
1170
1193
|
|
|
1171
|
-
const
|
|
1194
|
+
const statementBody = Array.isArray(def.body) ? def.body : null;
|
|
1195
|
+
const statements = statementBody !== null;
|
|
1172
1196
|
out.push(
|
|
1173
1197
|
field(
|
|
1174
1198
|
{
|
|
@@ -1224,14 +1248,14 @@ function functionFields(S: SignalsPanelState, name: string, def: SignalDef): Sig
|
|
|
1224
1248
|
),
|
|
1225
1249
|
);
|
|
1226
1250
|
|
|
1227
|
-
if (
|
|
1251
|
+
if (statementBody) {
|
|
1228
1252
|
out.push(field({ key: "statements", kind: "slot", signal: name, slot: "statements" }));
|
|
1229
1253
|
islands.set(`${name}/statements`, (host) => {
|
|
1230
1254
|
mountStatementEditor(
|
|
1231
1255
|
host,
|
|
1232
|
-
|
|
1256
|
+
statementBody,
|
|
1233
1257
|
(next) => {
|
|
1234
|
-
patch({ body: next
|
|
1258
|
+
patch({ body: next });
|
|
1235
1259
|
repaint();
|
|
1236
1260
|
},
|
|
1237
1261
|
{
|
|
@@ -1246,7 +1270,7 @@ function functionFields(S: SignalsPanelState, name: string, def: SignalDef): Sig
|
|
|
1246
1270
|
});
|
|
1247
1271
|
return out;
|
|
1248
1272
|
}
|
|
1249
|
-
const source =
|
|
1273
|
+
const source = isString(def.body) ? def.body : "";
|
|
1250
1274
|
out.push(
|
|
1251
1275
|
field(
|
|
1252
1276
|
{
|
|
@@ -1302,10 +1326,10 @@ function expressionFields(S: SignalsPanelState, name: string, def: SignalDef): S
|
|
|
1302
1326
|
mountExpressionEditor(
|
|
1303
1327
|
host,
|
|
1304
1328
|
exprNode,
|
|
1305
|
-
(newNode
|
|
1329
|
+
(newNode) =>
|
|
1306
1330
|
transactDoc(activeTab.value, (t) =>
|
|
1307
|
-
// Expression editors emit JSON expression nodes.
|
|
1308
|
-
mutateUpdateDef(t, name, { $expression: newNode
|
|
1331
|
+
// Expression editors emit JSON expression nodes, written back as the editor built them.
|
|
1332
|
+
mutateUpdateDef(t, name, { $expression: newNode }),
|
|
1309
1333
|
),
|
|
1310
1334
|
{
|
|
1311
1335
|
allowEventRef: false,
|
|
@@ -1316,6 +1340,9 @@ function expressionFields(S: SignalsPanelState, name: string, def: SignalDef): S
|
|
|
1316
1340
|
),
|
|
1317
1341
|
onInsertDef: (defName, vendored) =>
|
|
1318
1342
|
transactDoc(activeTab.value, (t) =>
|
|
1343
|
+
/* SAFETY: the one caller is `applyCatalogPick`, vending a packaged formula's entry
|
|
1344
|
+
(`packagedFormulaEntries` in ui/formula-catalog.ts): the object literal
|
|
1345
|
+
`{ $description, $expression, parameters }`, copied from the formulas' JSON. */
|
|
1319
1346
|
mutateAddDef(t, defName, vendored as Record<string, JsonValue>),
|
|
1320
1347
|
),
|
|
1321
1348
|
stateDefs: Object.keys(S.document.state || {}),
|
|
@@ -1360,22 +1387,23 @@ function editorFields(S: SignalsPanelState, name: string, def: SignalDef): Signa
|
|
|
1360
1387
|
* the `#/$context/content` root, while the deprecated `"$contentTypes"` string sentinel and the
|
|
1361
1388
|
* legacy `#/$context/contentTypes` root keep resolving bit-for-bit for old class descriptors.
|
|
1362
1389
|
*
|
|
1363
|
-
*
|
|
1364
|
-
*
|
|
1365
|
-
* @returns {unknown}
|
|
1390
|
+
* Typed by the schema form's own context contract, which owns both what a `scope` is (the form's
|
|
1391
|
+
* value record, for `{@param}` substitution) and what an answer may be.
|
|
1366
1392
|
*/
|
|
1367
|
-
|
|
1393
|
+
const resolveSignalsContextPointer: SchemaFormContext["resolvePointer"] = (pointer, scope) => {
|
|
1368
1394
|
if (pointer === "#/$context/content") {
|
|
1369
1395
|
return projectState?.projectConfig?.content ?? {};
|
|
1370
1396
|
}
|
|
1371
1397
|
if (pointer === "$contentTypes" || pointer === "#/$context/contentTypes") {
|
|
1372
1398
|
return projectState?.projectConfig?.contentTypes ?? {};
|
|
1373
1399
|
}
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
}
|
|
1400
|
+
const options: ResolveContextOptions = { projectConfig: projectState?.projectConfig ?? {} };
|
|
1401
|
+
// The form hands over its own value record — the def being configured — for `{@param}` lookups.
|
|
1402
|
+
if (isJsonObject(scope)) {
|
|
1403
|
+
options.scope = scope;
|
|
1404
|
+
}
|
|
1405
|
+
return resolveContextPointer(pointer, options);
|
|
1406
|
+
};
|
|
1379
1407
|
|
|
1380
1408
|
/**
|
|
1381
1409
|
* Put the shared schema form into the node the document made for it.
|
|
@@ -1405,22 +1433,19 @@ function placeSchemaForm(
|
|
|
1405
1433
|
const properties = Object.fromEntries(
|
|
1406
1434
|
Object.entries(schema.properties).filter(([prop]) => !STUDIO_RESERVED_KEYS.has(prop)),
|
|
1407
1435
|
);
|
|
1408
|
-
|
|
1409
|
-
|
|
1410
|
-
|
|
1411
|
-
|
|
1412
|
-
|
|
1413
|
-
|
|
1414
|
-
|
|
1415
|
-
|
|
1416
|
-
|
|
1417
|
-
// A config value may point at any signal but this one — a def that reads itself is a cycle.
|
|
1418
|
-
signals: bindableSignalNames(S.document).filter((signal) => signal !== name),
|
|
1419
|
-
},
|
|
1420
|
-
onChange: (patch) => transactDoc(activeTab.value, (t) => mutateUpdateDef(t, name, patch)),
|
|
1421
|
-
rerender: repaint,
|
|
1436
|
+
/* SAFETY: `def` is a state entry read from the parsed document (JSON on disk), so every member
|
|
1437
|
+
is JSON; the typed members SignalDef names are views of those same JSON values. */
|
|
1438
|
+
const form = mountSchemaForm(`signal:${name}`, { ...schema, properties }, def as JsonObject, {
|
|
1439
|
+
context: {
|
|
1440
|
+
fieldKeyPrefix: name,
|
|
1441
|
+
params: dynamicRouteParams(S.documentPath),
|
|
1442
|
+
resolvePointer: resolveSignalsContextPointer,
|
|
1443
|
+
// A config value may point at any signal but this one — a def that reads itself is a cycle.
|
|
1444
|
+
signals: bindableSignalNames(S.document).filter((signal) => signal !== name),
|
|
1422
1445
|
},
|
|
1423
|
-
|
|
1446
|
+
onChange: (patch) => transactDoc(activeTab.value, (t) => mutateUpdateDef(t, name, patch)),
|
|
1447
|
+
rerender: repaint,
|
|
1448
|
+
});
|
|
1424
1449
|
if (form.parentNode !== host) {
|
|
1425
1450
|
host.replaceChildren(form);
|
|
1426
1451
|
}
|
|
@@ -1450,9 +1475,9 @@ function placeSchemaForm(
|
|
|
1450
1475
|
function summary(
|
|
1451
1476
|
name: string,
|
|
1452
1477
|
def: SignalDef,
|
|
1453
|
-
live:
|
|
1478
|
+
live: JsonValue | undefined,
|
|
1454
1479
|
resolved: boolean,
|
|
1455
|
-
):
|
|
1480
|
+
): Pick<SignalRowView, "summary" | "summaryTitle" | "summaryTone"> {
|
|
1456
1481
|
const holdsNoValue =
|
|
1457
1482
|
defCategory(def) === "function" ||
|
|
1458
1483
|
(def.$expression != null && isActionExpression(def.$expression));
|
|
@@ -1482,7 +1507,7 @@ const CATEGORY_LABELS: readonly { key: string; label: string }[] = [
|
|
|
1482
1507
|
* GROUPED rather than divided: `jx-select` draws both halves of a group's delimiter, so the three
|
|
1483
1508
|
* unlabelled `sp-menu-divider`s this replaces are named runs a reader can aim at.
|
|
1484
1509
|
*/
|
|
1485
|
-
const ADD_GROUPS: readonly
|
|
1510
|
+
const ADD_GROUPS: readonly SurfaceOptionGroup[] = [
|
|
1486
1511
|
{
|
|
1487
1512
|
id: "values",
|
|
1488
1513
|
label: "Values",
|
|
@@ -1524,8 +1549,10 @@ export function signalsView(S: SignalsPanelState, ctx: SignalsPanelCtx): Signals
|
|
|
1524
1549
|
const defs = S.document.state || {};
|
|
1525
1550
|
const entries = Object.entries(defs);
|
|
1526
1551
|
/* What the canvas actually resolved these to. `S.canvas` is the session's canvas record, so this
|
|
1527
|
-
costs a property read — the panel already had the scope in hand.
|
|
1528
|
-
|
|
1552
|
+
costs a property read — the panel already had the scope in hand.
|
|
1553
|
+
SAFETY: the canvas scope's one writer (iframe-host.ts, on a `dataScope` message) stores that
|
|
1554
|
+
message's `scope`, a JsonObject of deep-cloned values (serialize-scope.ts). */
|
|
1555
|
+
const liveScope = (S.canvas?.scope ?? null) as JsonObject | null;
|
|
1529
1556
|
const scope = liveScope ?? {};
|
|
1530
1557
|
/* A Refresh is out and the canvas has not answered. Read off the tab, so it survives the repaints
|
|
1531
1558
|
between the press and the `dataScope` that ends it. */
|
|
@@ -1542,7 +1569,7 @@ export function signalsView(S: SignalsPanelState, ctx: SignalsPanelCtx): Signals
|
|
|
1542
1569
|
grouped.get(defCategory(raw))?.push([name, asSignalDef(raw)]);
|
|
1543
1570
|
}
|
|
1544
1571
|
|
|
1545
|
-
S._collapsedSignalCats
|
|
1572
|
+
S._collapsedSignalCats ??= new Set();
|
|
1546
1573
|
const collapsed = S._collapsedSignalCats;
|
|
1547
1574
|
|
|
1548
1575
|
const categories: SignalCategoryView[] = [];
|
|
@@ -1625,14 +1652,12 @@ function freeName(S: SignalsPanelState, base: string): string {
|
|
|
1625
1652
|
* by the "+ Add…" picker and the panel's empty state, so both create the same thing.
|
|
1626
1653
|
*/
|
|
1627
1654
|
function addTemplateDef(type: string, S: SignalsPanelState): void {
|
|
1628
|
-
const template = DEF_TEMPLATES
|
|
1655
|
+
const template = DEF_TEMPLATES.get(type);
|
|
1629
1656
|
if (!template) {
|
|
1630
1657
|
return;
|
|
1631
1658
|
}
|
|
1632
1659
|
const name = freeName(S, type === "function" ? "newFunction" : "$newSignal");
|
|
1633
|
-
transactDoc(activeTab.value, (t) =>
|
|
1634
|
-
mutateAddDef(t, name, structuredClone(template) as Record<string, JsonValue>),
|
|
1635
|
-
);
|
|
1660
|
+
transactDoc(activeTab.value, (t) => mutateAddDef(t, name, structuredClone(template)));
|
|
1636
1661
|
setDataRowExpanded(name, true);
|
|
1637
1662
|
repaint();
|
|
1638
1663
|
}
|
|
@@ -1658,7 +1683,7 @@ function addSignalOfType(type: string): void {
|
|
|
1658
1683
|
mutateAddDef(t, name, {
|
|
1659
1684
|
$prototype: proto,
|
|
1660
1685
|
...cls?.stateDefaults,
|
|
1661
|
-
}
|
|
1686
|
+
}),
|
|
1662
1687
|
);
|
|
1663
1688
|
setDataRowExpanded(name, true);
|
|
1664
1689
|
repaint();
|
|
@@ -1671,9 +1696,7 @@ function addSignalOfType(type: string): void {
|
|
|
1671
1696
|
if (type.startsWith("import:")) {
|
|
1672
1697
|
const proto = type.slice(7);
|
|
1673
1698
|
const name = prototypeName(S, proto);
|
|
1674
|
-
transactDoc(activeTab.value, (t) =>
|
|
1675
|
-
mutateAddDef(t, name, { $prototype: proto } as Record<string, JsonValue>),
|
|
1676
|
-
);
|
|
1699
|
+
transactDoc(activeTab.value, (t) => mutateAddDef(t, name, { $prototype: proto }));
|
|
1677
1700
|
setDataRowExpanded(name, true);
|
|
1678
1701
|
repaint();
|
|
1679
1702
|
return;
|
|
@@ -1877,8 +1900,7 @@ function definedSignalNames(): string[] {
|
|
|
1877
1900
|
export function signalsCommands(): AnyCommand[] {
|
|
1878
1901
|
/** The named entry, or a refusal listing what the document does define. */
|
|
1879
1902
|
function requireDef(commandId: string, name: string): SignalDef {
|
|
1880
|
-
const
|
|
1881
|
-
const def = defs[name];
|
|
1903
|
+
const def = activeTab.value?.doc.document?.state?.[name];
|
|
1882
1904
|
if (!def) {
|
|
1883
1905
|
const defined = definedSignalNames();
|
|
1884
1906
|
throw new RangeError(
|
|
@@ -1886,7 +1908,7 @@ export function signalsCommands(): AnyCommand[] {
|
|
|
1886
1908
|
`defines — it defines: ${defined.length > 0 ? defined.join(", ") : "nothing"}`,
|
|
1887
1909
|
);
|
|
1888
1910
|
}
|
|
1889
|
-
return def;
|
|
1911
|
+
return asSignalDef(def);
|
|
1890
1912
|
}
|
|
1891
1913
|
|
|
1892
1914
|
return [
|