@jxsuite/studio 4.0.0 → 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/data/elements-meta.json +5 -15
- package/data/html-meta.json +51 -6
- package/dist/chunks/{2020-xp8vnwma.js → 2020-g79n01v9.js} +14 -14
- package/dist/chunks/action-group-sp6tna8v.js +118 -0
- package/dist/chunks/adapter-nj7tnjfn.js +13 -0
- package/dist/chunks/cf-account-picker-fyf63pmy.js +495 -0
- package/dist/chunks/cf-settings-71bv5zn9.js +20 -0
- package/dist/chunks/color-area-v17df7b8.js +154 -0
- package/dist/chunks/color-field-anwybnkn.js +208 -0
- package/dist/chunks/color-slider-44ez96fc.js +79 -0
- package/dist/chunks/color-xgg3kfw7.js +35 -0
- package/dist/chunks/combobox-5e7jev23.js +236 -0
- package/dist/chunks/components-2w1f35qs.js +18 -0
- package/dist/chunks/content-source-3wqeas45.js +46 -0
- package/dist/chunks/convert-to-repeater-d0cgnb6d.js +639 -0
- package/dist/chunks/dialog-s890b918.js +85 -0
- package/dist/chunks/editor-3qhbg51x.js +35 -0
- package/dist/chunks/entry-commands-d6g50j7s.js +42 -0
- package/dist/chunks/extension-sections-fy7q4fe9.js +651 -0
- package/dist/chunks/file-ops-3btj6st0.js +47 -0
- package/dist/chunks/files-ef8fgs3w.js +72 -0
- package/dist/chunks/format-host-3c33nwr8.js +40 -0
- package/dist/chunks/fs-events-13tj6sex.js +18 -0
- package/dist/chunks/git-panel-4wp2rn9b.js +49 -0
- package/dist/chunks/icons-yy10wk9r.js +402 -0
- package/dist/chunks/iframe-entry-15g3n6xv.js +114 -0
- package/dist/chunks/iframe-entry-b27vq81n.js +203 -0
- package/dist/chunks/iframe-entry-nbyxee1y.js +154 -0
- package/dist/chunks/iframe-host-jgesd924.js +115 -0
- package/dist/chunks/{index-nj44jpzj.js → index-mdmyx6s2.js} +11 -11
- package/dist/chunks/index-n4j7qxyr.js +109 -0
- package/dist/chunks/{javascript-q8kpmfah.js → javascript-xvrfrpkb.js} +8 -9
- package/dist/chunks/{jsonMode-dkr040ga.js → jsonMode-tyx2kj6p.js} +526 -527
- package/dist/chunks/jx-validate-j0wxk72w.js +15 -0
- package/dist/chunks/layers-1nq5evsh.js +29 -0
- package/dist/chunks/layers-panel-ar2gh90g.js +40 -0
- package/dist/chunks/listbox-6v2ac08j.js +44 -0
- package/dist/chunks/lit-html-m244w9nh.js +17 -0
- package/dist/chunks/media-picker-2qbetq73.js +33 -0
- package/dist/chunks/menu-q99sy9rf.js +285 -0
- package/dist/chunks/menu-rf7n72mf.js +14 -0
- package/dist/chunks/{monaco-binding-rj6xpx9y.js → monaco-binding-sw6en4dw.js} +12 -15
- package/dist/chunks/monaco-buffer-bhy3hb6m.js +24 -0
- package/dist/chunks/{monaco-setup-rws7k4br.js → monaco-setup-8r62fj6y.js} +27 -37
- package/dist/chunks/notify-628t0anh.js +21 -0
- package/dist/chunks/number-field-5cndyft8.js +72 -0
- package/dist/chunks/parse-0zx14y15.js +10 -0
- package/dist/chunks/platform-ts9cg1a4.js +15 -0
- package/dist/chunks/popover-47z3ytva.js +25 -0
- package/dist/chunks/publish-panel-98f7sr3g.js +27 -0
- package/dist/chunks/quick-search-srzz83k2.js +45 -0
- package/dist/chunks/references-n553f0e1.js +26 -0
- package/dist/chunks/right-panel-rrgx2dn3.js +45 -0
- package/dist/chunks/section-registry-5pq32t0q.js +25 -0
- package/dist/chunks/select-2r16ez41.js +49 -0
- package/dist/chunks/split-g7nm1rgb.js +191 -0
- package/dist/chunks/studio-0hqbpbd0.js +62 -0
- package/dist/chunks/studio-18avnhjp.js +2430 -0
- package/dist/chunks/{studio-kryvsw6j.js → studio-1k325pwf.js} +48 -48
- package/dist/chunks/{studio-hbtp0eh1.js → studio-25hkdrkw.js} +356 -85
- package/dist/chunks/studio-26d7myd1.js +258 -0
- package/dist/chunks/{studio-p8j86wag.js → studio-38emantv.js} +22 -5
- package/dist/chunks/studio-3gxv60tn.js +422 -0
- package/dist/chunks/{studio-8swrjbny.js → studio-3hxkd92t.js} +275 -163
- package/dist/chunks/studio-4m0haseg.js +185 -0
- package/dist/chunks/{studio-ynxwkrzd.js → studio-4wbb9ct0.js} +1953 -1785
- package/dist/chunks/{studio-gv8vvshc.js → studio-5523bpzt.js} +11 -11
- package/dist/chunks/{studio-5q69gfag.js → studio-57mf66w2.js} +1753 -2484
- package/dist/chunks/studio-5jy81t3s.js +17463 -0
- package/dist/chunks/studio-5rt7sqa0.js +1168 -0
- package/dist/chunks/studio-5te5tqng.js +81 -0
- package/dist/chunks/{studio-p4ngc046.js → studio-6ewqv390.js} +9 -9
- package/dist/chunks/{studio-9ab8gqsm.js → studio-6nzaktvy.js} +7 -7
- package/dist/chunks/studio-6xa21ej9.js +28 -0
- package/dist/chunks/{studio-5ehhackm.js → studio-727xh0e3.js} +19 -19
- package/dist/chunks/{studio-eenfkt4e.js → studio-79y5sz51.js} +52 -38
- package/dist/chunks/{studio-4q0wznzf.js → studio-7e11jpa9.js} +461 -145
- package/dist/chunks/{studio-q7v10cg2.js → studio-7r42c6ca.js} +17 -7
- package/dist/chunks/studio-7xptrg0j.js +954 -0
- package/dist/chunks/{studio-cft9r4r7.js → studio-81390n6f.js} +22 -22
- package/dist/chunks/{studio-q43a5y9h.js → studio-8jn5yhyn.js} +16 -16
- package/dist/chunks/studio-8qtrpzr3.js +839 -0
- package/dist/chunks/{studio-dg7zyt5x.js → studio-98b3z07n.js} +1 -1
- package/dist/chunks/studio-9xxz1q69.js +1356 -0
- package/dist/chunks/studio-akbww0j5.js +13615 -0
- package/dist/chunks/studio-arfpe389.js +195 -0
- package/dist/chunks/{studio-2zkz8evn.js → studio-az3zd49t.js} +473 -281
- package/dist/chunks/studio-cpvb2ed1.js +1171 -0
- package/dist/chunks/{studio-9r6j5ev1.js → studio-d0300636.js} +5078 -19
- package/dist/chunks/{studio-bgxt93ga.js → studio-d055c37e.js} +13 -13
- package/dist/chunks/studio-d1ja2x9r.js +362 -0
- package/dist/chunks/{studio-b9b6t1dg.js → studio-e1f24eff.js} +5664 -5666
- package/dist/chunks/{studio-4pqqxbrt.js → studio-em9nw8eh.js} +301 -112
- package/dist/chunks/studio-erdatzvp.js +1190 -0
- package/dist/chunks/{studio-g1wdche0.js → studio-esrxgwh6.js} +80 -80
- package/dist/chunks/studio-fabxk6r9.js +2811 -0
- package/dist/chunks/{studio-3n4ndrzh.js → studio-h4nvnjvz.js} +303 -303
- package/dist/chunks/studio-hhvs4sdg.js +195 -0
- package/dist/chunks/{studio-68n67094.js → studio-kcgff4r0.js} +15 -18
- package/dist/chunks/{studio-685s0ytq.js → studio-nqgawfks.js} +572 -572
- package/dist/chunks/{studio-xrapxwwc.js → studio-p1dw8wfw.js} +55 -29
- package/dist/chunks/studio-pm6hgy7r.js +4763 -0
- package/dist/chunks/studio-q0a3yk4n.js +33 -0
- package/dist/chunks/{studio-wcy8trfx.js → studio-q3x06vmj.js} +23 -22
- package/dist/chunks/studio-qahxvnan.js +111 -0
- package/dist/chunks/{studio-53n8bp04.js → studio-r6xmmtfh.js} +1 -1
- package/dist/chunks/{studio-kjjsjak4.js → studio-rkstz940.js} +3661 -6136
- package/dist/chunks/{studio-tvgyw9xw.js → studio-rnyf3f8e.js} +83 -250
- package/dist/chunks/studio-rpyah2ew.js +2805 -0
- package/dist/chunks/studio-rs76k67r.js +12 -0
- package/dist/chunks/{studio-yxrkyv8a.js → studio-s6z853aq.js} +12108 -11766
- package/dist/chunks/{studio-sf7zjgv1.js → studio-sgdc5pfc.js} +8 -8
- package/dist/chunks/studio-tb3ev01j.js +763 -0
- package/dist/chunks/{studio-t5wqwzdh.js → studio-tjjk7jvk.js} +1 -1
- package/dist/chunks/studio-vhv5tgxm.js +51 -0
- package/dist/chunks/{studio-htsf0w6m.js → studio-vz68yn9e.js} +31 -154
- package/dist/chunks/studio-wqpngpsk.js +174 -0
- package/dist/chunks/{studio-eesa1myv.js → studio-x3rty6tr.js} +58 -58
- package/dist/chunks/studio-xsykpvsh.js +8448 -0
- package/dist/chunks/{studio-92ab2jqe.js → studio-y9zedyjn.js} +14 -14
- package/dist/chunks/studio-yxa81f45.js +12 -0
- package/dist/chunks/swatch-group-t0n6h2rn.js +139 -0
- package/dist/chunks/tabs-wbp1cdws.js +156 -0
- package/dist/chunks/textfield-abk6qyee.js +73 -0
- package/dist/chunks/toast-780pvfbv.js +27 -0
- package/dist/chunks/toast-host-3sqv46sn.js +116 -0
- package/dist/chunks/toolbar-xbh5bhtr.js +194 -0
- package/dist/chunks/tooltip-eptb614w.js +369 -0
- package/dist/chunks/tree-a73p0pqm.js +367 -0
- package/dist/chunks/{tsMode-76kr53q0.js → tsMode-jy4m86rv.js} +83 -85
- package/dist/chunks/workspace-wrew8zk4.js +69 -0
- package/dist/chunks/{ws-client-6shc5rze.js → ws-client-ny4zc51r.js} +20 -22
- package/dist/iframe-entry.js +1812 -698
- package/dist/manifest.json +7 -0
- package/dist/studio.js +52900 -36573
- package/dist/workers/editor.worker.js +1040 -1085
- package/dist/workers/json.worker.js +1946 -1991
- package/dist/workers/ts.worker.js +4960 -5005
- package/favicon.ico +0 -0
- package/index.html +2 -0
- package/package.json +22 -55
- package/src/about/about-modal.ts +73 -123
- package/src/browse/library-commands.ts +20 -49
- package/src/browse/library-layouts.ts +87 -218
- package/src/browse/library-pane.ts +406 -438
- package/src/canvas/canvas-helpers.ts +0 -49
- package/src/canvas/canvas-live-render.ts +25 -2
- package/src/canvas/canvas-render.ts +666 -231
- package/src/canvas/canvas-surface.ts +0 -1
- package/src/canvas/canvas-utils.ts +310 -117
- package/src/canvas/dialog-path.ts +76 -0
- package/src/canvas/dialog-state.ts +67 -0
- package/src/canvas/diff-marks.ts +252 -0
- package/src/canvas/diff-toolbar.ts +349 -0
- package/src/canvas/diff-view.ts +123 -0
- package/src/canvas/edit-width-drag.ts +187 -0
- package/src/canvas/edit-width.ts +150 -0
- package/src/canvas/iframe-entry.ts +125 -8
- package/src/canvas/iframe-host.ts +271 -15
- package/src/canvas/iframe-interaction.ts +133 -13
- package/src/canvas/iframe-patch.ts +7 -1
- package/src/canvas/iframe-position.ts +5 -6
- package/src/canvas/iframe-protocol.ts +106 -5
- package/src/canvas/iframe-render.ts +373 -5
- package/src/canvas/iframe-slash.ts +2 -2
- package/src/canvas/iframe-subtree.ts +5 -8
- package/src/canvas/path-mapping.ts +25 -3
- package/src/canvas/popover-path.ts +106 -0
- package/src/canvas/popover-state.ts +155 -0
- package/src/canvas/surface-registry.ts +21 -10
- package/src/collab/presence-chips.ts +51 -73
- package/src/commands/app-commands.ts +10 -0
- package/src/commands/budget.ts +12 -0
- package/src/commands/command-args.ts +369 -6
- package/src/commands/defaults.ts +44 -14
- package/src/commands/live-context.ts +11 -5
- package/src/commands/reference.ts +12 -2
- package/src/commands/registry.ts +165 -8
- package/src/content/entry-commands.ts +16 -23
- package/src/content/entry-editor.ts +144 -101
- package/src/editor/canvas-slash-bridge.ts +2 -2
- package/src/editor/context-menu.ts +49 -200
- package/src/editor/convert-to-component.ts +42 -82
- package/src/editor/convert-to-repeater.ts +132 -173
- package/src/editor/inline-edit.ts +11 -0
- package/src/editor/shortcuts.ts +65 -26
- package/src/editor/slash-menu.ts +150 -157
- package/src/files/file-ops.ts +117 -11
- package/src/files/files.ts +949 -664
- package/src/files/json-layout.ts +474 -0
- package/src/files/media-paths.ts +13 -42
- package/src/files/media-usage.ts +41 -131
- package/src/files/serialize-document.ts +8 -1
- package/src/format/convert-file.ts +16 -10
- package/src/format/format-host.ts +50 -1
- package/src/github/github-auth.ts +71 -29
- package/src/github/github-publish.ts +57 -65
- package/src/grid/cell-editors.ts +46 -4
- package/src/grid/cell-popovers.ts +65 -62
- package/src/grid/grid-open.ts +86 -64
- package/src/grid/grid-panel.ts +390 -469
- package/src/grid/redirects-grid.ts +40 -44
- package/src/hosting/document.ts +2 -0
- package/src/hosting/layout.ts +10 -0
- package/src/i18n/i18n-commands.ts +127 -62
- package/src/media/media-pane.ts +83 -133
- package/src/new-project/add-repo-modal.ts +125 -176
- package/src/new-project/import-tab.ts +201 -250
- package/src/new-project/location-fields.ts +101 -165
- package/src/new-project/new-project-modal.ts +376 -367
- package/src/packages/jxsuite-update.ts +76 -18
- package/src/panels/activity-panel.ts +137 -104
- package/src/panels/ai-chat/chat-markdown.ts +15 -13
- package/src/panels/ai-chat/chat-view.ts +307 -472
- package/src/panels/ai-chat/composer.ts +175 -153
- package/src/panels/ai-chat/sessions-view.ts +31 -62
- package/src/panels/ai-panel.ts +210 -185
- package/src/panels/block-action-bar.ts +437 -643
- package/src/panels/bottom-dock.ts +112 -47
- package/src/panels/chat-panel.ts +19 -14
- package/src/panels/data-explorer.ts +141 -102
- package/src/panels/data-grid.ts +183 -150
- package/src/panels/dnd.ts +75 -20
- package/src/panels/editors.ts +26 -19
- package/src/panels/elements-panel.ts +243 -186
- package/src/panels/empty-state.ts +26 -42
- package/src/panels/events-panel.ts +950 -729
- package/src/panels/formula-workspace.ts +434 -207
- package/src/panels/frontmatter-fields.ts +185 -153
- package/src/panels/frontmatter-panel.ts +411 -187
- package/src/panels/git-diff-open.ts +148 -0
- package/src/panels/git-panel.ts +679 -605
- package/src/panels/head-panel.ts +617 -435
- package/src/panels/i18n-panel.ts +153 -133
- package/src/panels/imports-panel.ts +388 -414
- package/src/panels/jump-bar.ts +174 -147
- package/src/panels/layers-panel.ts +785 -671
- package/src/panels/left-panel.ts +166 -94
- package/src/panels/navigator-panels.ts +1 -1
- package/src/panels/pane-context.ts +529 -677
- package/src/panels/pane-grid.ts +265 -241
- package/src/panels/panel-registry.ts +15 -4
- package/src/panels/problems-panel.ts +177 -99
- package/src/panels/properties-panel.ts +1525 -966
- package/src/panels/provenance.ts +31 -113
- package/src/panels/quick-search.ts +217 -172
- package/src/panels/right-panel.ts +135 -169
- package/src/panels/seo-modal.ts +346 -167
- package/src/panels/settings-menu.ts +109 -646
- package/src/panels/settings-pane.ts +102 -86
- package/src/panels/signals-panel.ts +1318 -1172
- package/src/panels/statement-editor.ts +556 -428
- package/src/panels/style-panel.ts +1367 -630
- package/src/panels/style-utils.ts +36 -32
- package/src/panels/stylebook-doc.ts +30 -73
- package/src/panels/stylebook-layers-panel.ts +202 -109
- package/src/panels/stylebook-panel.ts +124 -88
- package/src/panels/tab-strip.ts +385 -287
- package/src/platforms/cloud.ts +347 -86
- package/src/platforms/devserver.ts +13 -0
- package/src/publish/deploy-checklist.ts +124 -78
- package/src/publish/publish-commands.ts +4 -12
- package/src/publish/publish-panel.ts +165 -299
- package/src/services/a11y-report.ts +100 -43
- package/src/services/ai-command-tools.ts +468 -0
- package/src/services/ai-import-tools.ts +50 -12
- package/src/services/ai-models.ts +108 -1
- package/src/services/ai-session-store.ts +6 -0
- package/src/services/ai-system-prompt.ts +110 -18
- package/src/services/ai-tools.ts +28 -143
- package/src/services/ai-write-report.ts +174 -0
- package/src/services/context-manager.ts +12 -1
- package/src/services/document-assistant.ts +50 -2
- package/src/services/idle.ts +16 -14
- package/src/services/live-surfaces.ts +237 -0
- package/src/services/model-uri.ts +75 -0
- package/src/services/notify.ts +63 -6
- package/src/services/popover-report.ts +325 -0
- package/src/services/surface-registry.ts +56 -0
- package/src/services/tool-executor.ts +17 -0
- package/src/settings/contexts-section.ts +301 -299
- package/src/settings/contributed-section.ts +361 -222
- package/src/settings/css-vars-editor.ts +320 -325
- package/src/settings/defs-editor.ts +572 -535
- package/src/settings/dependencies-editor.ts +79 -107
- package/src/settings/extension-commands.ts +379 -0
- package/src/settings/extension-rows.ts +113 -0
- package/src/settings/extensions-section.ts +287 -0
- package/src/settings/general-settings.ts +130 -181
- package/src/settings/head-editor.ts +10 -305
- package/src/settings/locales-section.ts +146 -196
- package/src/settings/preferences-accounts.ts +193 -12
- package/src/settings/preferences-dialog.ts +384 -307
- package/src/settings/project-sections.ts +108 -181
- package/src/settings/schema-field-ui.ts +11 -399
- package/src/settings/section-registry.ts +8 -1
- package/src/settings/settings-document.ts +31 -29
- package/src/shell/tree.ts +42 -87
- package/src/shell.ts +48 -36
- package/src/studio.ts +90 -67
- package/src/style/token-ref.ts +0 -39
- package/src/surfaces/about.json +263 -0
- package/src/surfaces/about.ts +163 -0
- package/src/surfaces/add-repo.json +486 -0
- package/src/surfaces/add-repo.ts +236 -0
- package/src/surfaces/ai-chat.json +2185 -0
- package/src/surfaces/ai-chat.ts +549 -0
- package/src/surfaces/ai-credentials-form.json +332 -0
- package/src/surfaces/ai-credentials-form.ts +151 -0
- package/src/surfaces/ai-managed-connect.json +108 -0
- package/src/surfaces/ai-managed-connect.ts +123 -0
- package/src/surfaces/ai-model-picker.json +114 -0
- package/src/surfaces/ai-model-picker.ts +139 -0
- package/src/surfaces/block-action-bar.json +640 -0
- package/src/surfaces/block-action-bar.ts +368 -0
- package/src/surfaces/bottom-dock.json +154 -0
- package/src/surfaces/bottom-dock.ts +125 -0
- package/src/surfaces/canvas-stage.json +444 -0
- package/src/surfaces/canvas-stage.ts +253 -0
- package/src/surfaces/cf-account-picker.json +300 -0
- package/src/surfaces/cf-account-picker.ts +214 -0
- package/src/surfaces/commandbar.json +984 -0
- package/src/{panels/toolbar.ts → surfaces/commandbar.ts} +414 -389
- package/src/surfaces/convert-repeater.json +309 -0
- package/src/surfaces/convert-repeater.ts +276 -0
- package/src/surfaces/data-actions.json +157 -0
- package/src/surfaces/data-actions.ts +115 -0
- package/src/surfaces/dialog.json +289 -0
- package/src/surfaces/dialog.ts +343 -0
- package/src/surfaces/diff-toolbar.json +266 -0
- package/src/surfaces/diff-toolbar.ts +139 -0
- package/src/surfaces/doc-header.json +739 -0
- package/src/surfaces/doc-header.ts +223 -0
- package/src/surfaces/empty-state.json +152 -0
- package/src/surfaces/empty-state.ts +173 -0
- package/src/surfaces/entry-editor.json +281 -0
- package/src/surfaces/entry-editor.ts +191 -0
- package/src/surfaces/expression-editor.json +977 -0
- package/src/surfaces/expression-editor.ts +266 -0
- package/src/surfaces/files-panel.json +592 -0
- package/src/surfaces/files-panel.ts +301 -0
- package/src/surfaces/formula-palette.json +364 -0
- package/src/surfaces/formula-palette.ts +340 -0
- package/src/surfaces/git-panel.json +1822 -0
- package/src/surfaces/git-panel.ts +272 -0
- package/src/surfaces/github-auth.json +112 -0
- package/src/surfaces/github-auth.ts +139 -0
- package/src/surfaces/github-publish.json +206 -0
- package/src/surfaces/github-publish.ts +169 -0
- package/src/surfaces/grid-cell.json +218 -0
- package/src/surfaces/grid-cell.ts +120 -0
- package/src/surfaces/grid-open.json +147 -0
- package/src/surfaces/grid-open.ts +87 -0
- package/src/surfaces/grid-panel.json +706 -0
- package/src/surfaces/grid-panel.ts +206 -0
- package/src/surfaces/grid-replace.json +179 -0
- package/src/surfaces/grid-replace.ts +89 -0
- package/src/surfaces/grid-views.json +446 -0
- package/src/surfaces/grid-views.ts +172 -0
- package/src/surfaces/inspector-dock.json +187 -0
- package/src/surfaces/inspector-dock.ts +161 -0
- package/src/surfaces/jump-bar.json +243 -0
- package/src/surfaces/jump-bar.ts +129 -0
- package/src/surfaces/jxsuite-update.json +146 -0
- package/src/surfaces/jxsuite-update.ts +149 -0
- package/src/surfaces/library-pane.json +1509 -0
- package/src/surfaces/library-pane.ts +363 -0
- package/src/surfaces/logic-panel.json +1949 -0
- package/src/surfaces/logic-panel.ts +369 -0
- package/src/surfaces/logic-workspace.json +685 -0
- package/src/surfaces/logic-workspace.ts +238 -0
- package/src/surfaces/media-browser.json +303 -0
- package/src/surfaces/media-browser.ts +145 -0
- package/src/surfaces/media-field.json +163 -0
- package/src/surfaces/media-field.ts +116 -0
- package/src/surfaces/media-pane.json +513 -0
- package/src/surfaces/media-pane.ts +197 -0
- package/src/surfaces/menu.json +232 -0
- package/src/surfaces/menu.ts +375 -0
- package/src/surfaces/navigator-dock.json +113 -0
- package/src/surfaces/navigator-dock.ts +130 -0
- package/src/surfaces/new-project.json +1654 -0
- package/src/surfaces/new-project.ts +411 -0
- package/src/surfaces/palette.json +535 -0
- package/src/surfaces/pane-context.json +1497 -0
- package/src/surfaces/pane-context.ts +513 -0
- package/src/surfaces/pane-grid.json +188 -0
- package/src/surfaces/pane-grid.ts +250 -0
- package/src/surfaces/panel-activity.json +563 -0
- package/src/surfaces/panel-activity.ts +187 -0
- package/src/surfaces/panel-data.json +141 -0
- package/src/surfaces/panel-data.ts +156 -0
- package/src/surfaces/panel-deploy-checklist.json +283 -0
- package/src/surfaces/panel-deploy-checklist.ts +175 -0
- package/src/surfaces/panel-elements.json +367 -0
- package/src/surfaces/panel-elements.ts +175 -0
- package/src/surfaces/panel-i18n.json +569 -0
- package/src/surfaces/panel-i18n.ts +212 -0
- package/src/surfaces/panel-imports.json +780 -0
- package/src/surfaces/panel-imports.ts +209 -0
- package/src/surfaces/panel-outline.json +734 -0
- package/src/surfaces/panel-outline.ts +326 -0
- package/src/surfaces/panel-page.json +1017 -0
- package/src/surfaces/panel-page.ts +240 -0
- package/src/surfaces/panel-problems.json +497 -0
- package/src/surfaces/panel-problems.ts +157 -0
- package/src/surfaces/panel-signals.json +1973 -0
- package/src/surfaces/panel-signals.ts +436 -0
- package/src/surfaces/panel-stylebook-layers.json +317 -0
- package/src/surfaces/panel-stylebook-layers.ts +155 -0
- package/src/surfaces/preferences.json +850 -0
- package/src/surfaces/preferences.ts +332 -0
- package/src/surfaces/progress-modal.json +110 -0
- package/src/surfaces/progress-modal.ts +150 -0
- package/src/surfaces/properties-panel.json +1578 -0
- package/src/surfaces/properties-panel.ts +337 -0
- package/src/surfaces/publish.json +945 -0
- package/src/surfaces/publish.ts +392 -0
- package/src/surfaces/push-plan.json +110 -0
- package/src/surfaces/push-plan.ts +87 -0
- package/src/surfaces/rail.json +255 -0
- package/src/surfaces/rail.ts +206 -0
- package/src/surfaces/reference-field.json +191 -0
- package/src/surfaces/reference-field.ts +168 -0
- package/src/surfaces/schema-builder.json +1011 -0
- package/src/surfaces/schema-builder.ts +181 -0
- package/src/surfaces/schema-form.json +1013 -0
- package/src/surfaces/schema-form.ts +287 -0
- package/src/surfaces/secret-field.json +60 -0
- package/src/surfaces/secret-field.ts +146 -0
- package/src/surfaces/seo.json +932 -0
- package/src/surfaces/seo.ts +334 -0
- package/src/surfaces/settings-contexts.json +538 -0
- package/src/surfaces/settings-contexts.ts +196 -0
- package/src/surfaces/settings-contributed.json +489 -0
- package/src/surfaces/settings-contributed.ts +199 -0
- package/src/surfaces/settings-css-vars.json +820 -0
- package/src/surfaces/settings-css-vars.ts +199 -0
- package/src/surfaces/settings-defs.json +1363 -0
- package/src/surfaces/settings-defs.ts +232 -0
- package/src/surfaces/settings-deploy.json +108 -0
- package/src/surfaces/settings-deploy.ts +135 -0
- package/src/surfaces/settings-extensions.json +486 -0
- package/src/surfaces/settings-extensions.ts +201 -0
- package/src/surfaces/settings-head.json +779 -0
- package/src/surfaces/settings-head.ts +397 -0
- package/src/surfaces/settings-locales.json +420 -0
- package/src/surfaces/settings-locales.ts +137 -0
- package/src/surfaces/settings-overview.json +423 -0
- package/src/surfaces/settings-overview.ts +218 -0
- package/src/surfaces/settings-packages.json +549 -0
- package/src/surfaces/settings-packages.ts +158 -0
- package/src/surfaces/settings-pane.json +147 -0
- package/src/surfaces/settings-pane.ts +150 -0
- package/src/surfaces/settings-rawjson.json +104 -0
- package/src/surfaces/settings-rawjson.ts +107 -0
- package/src/surfaces/shell.json +99 -0
- package/src/surfaces/shell.ts +30 -0
- package/src/surfaces/slash-menu.json +180 -0
- package/src/surfaces/slash-menu.ts +272 -0
- package/src/surfaces/statements.json +607 -0
- package/src/surfaces/statements.ts +238 -0
- package/src/surfaces/statusbar.json +94 -0
- package/src/{panels → surfaces}/statusbar.ts +163 -90
- package/src/surfaces/style-panel.json +1643 -0
- package/src/surfaces/style-panel.ts +338 -0
- package/src/surfaces/stylebook-chrome.json +122 -0
- package/src/surfaces/stylebook-chrome.ts +122 -0
- package/src/surfaces/tab-strip.json +448 -0
- package/src/surfaces/tab-strip.ts +200 -0
- package/src/surfaces/target-line.json +419 -0
- package/src/surfaces/target-line.ts +349 -0
- package/src/surfaces/toasts.json +189 -0
- package/src/surfaces/welcome.json +571 -0
- package/src/surfaces/welcome.ts +338 -0
- package/src/tabs/project-config.ts +71 -15
- package/src/tabs/tab.ts +52 -1
- package/src/types.ts +49 -3
- package/src/ui/ai-credentials-form.ts +104 -100
- package/src/ui/ai-managed-connect.ts +116 -49
- package/src/ui/ai-model-picker.ts +102 -47
- package/src/ui/cf-account-picker.ts +135 -0
- package/src/ui/color-selector.ts +80 -301
- package/src/ui/dynamic-slot.ts +43 -283
- package/src/ui/expression-editor.ts +797 -576
- package/src/ui/field-input.ts +8 -181
- package/src/ui/form-controls.ts +838 -366
- package/src/ui/formula-chips.ts +80 -85
- package/src/ui/kit.ts +33 -0
- package/src/ui/layers.ts +293 -593
- package/src/ui/media-picker.ts +203 -284
- package/src/ui/panel-resize.ts +251 -64
- package/src/ui/popover-surface.ts +153 -0
- package/src/ui/progress-modal.ts +22 -60
- package/src/ui/regions.ts +13 -7
- package/src/ui/schema-form.ts +906 -440
- package/src/ui/surface.ts +122 -0
- package/src/ui/unit-selector.ts +15 -131
- package/src/ui/value-source.ts +14 -0
- package/src/ui/virtual-window.ts +88 -9
- package/src/utils/canvas-media.ts +72 -0
- package/src/utils/edit-display.ts +7 -2
- package/src/utils/element-selectors.ts +69 -0
- package/src/utils/link-target.ts +2 -2
- package/src/utils/studio-utils.ts +0 -10
- package/src/view.ts +15 -0
- package/src/workspace/pane-derive.ts +36 -14
- package/src/workspace/workspace.ts +15 -6
- package/styles/canvas.css +72 -467
- package/styles/forced-colors.css +48 -82
- package/styles/forced-colors.json +41 -0
- package/styles/inspector.css +2 -1301
- package/styles/overlays.css +96 -2823
- package/styles/panels.css +6 -1423
- package/styles/shell-frame.css +272 -0
- package/styles/shell-frame.json +227 -0
- package/styles/shell.css +0 -1532
- package/styles/tokens.css +65 -136
- package/styles/tokens.json +84 -0
- package/dist/chunks/Overlay.dev-723bv0df.js +0 -23
- package/dist/chunks/adapter-jkcyhgtr.js +0 -14
- package/dist/chunks/cf-settings-45fgyx8y.js +0 -21
- package/dist/chunks/components-zmx10t62.js +0 -21
- package/dist/chunks/content-source-t88vb2dr.js +0 -49
- package/dist/chunks/convert-to-repeater-dhw1nrz9.js +0 -268
- package/dist/chunks/editor-cptq5jp1.js +0 -37
- package/dist/chunks/entry-commands-6z6bhxg0.js +0 -46
- package/dist/chunks/extension-sections-3ydgjbdy.js +0 -311
- package/dist/chunks/file-ops-rskmhxyq.js +0 -48
- package/dist/chunks/files-0cratsr0.js +0 -92
- package/dist/chunks/flow-qbfgrpeh.js +0 -634
- package/dist/chunks/focus-trap.esm-ggawf1hy.js +0 -1024
- package/dist/chunks/focus-visible-6eg70z18.js +0 -167
- package/dist/chunks/format-host-tgcmfs4p.js +0 -43
- package/dist/chunks/fs-events-hrrg328g.js +0 -21
- package/dist/chunks/git-panel-0yywyk76.js +0 -58
- package/dist/chunks/index-zqxmqxmh.js +0 -109
- package/dist/chunks/jx-validate-8q2g05x1.js +0 -19
- package/dist/chunks/layers-panel-z3tqe5cd.js +0 -67
- package/dist/chunks/layers-q75tj2mf.js +0 -45
- package/dist/chunks/lit-html-j055mkh8.js +0 -22
- package/dist/chunks/monaco-buffer-dqw0xxpx.js +0 -25
- package/dist/chunks/notify-yjm79n4s.js +0 -30
- package/dist/chunks/parse-24d0gay3.js +0 -19
- package/dist/chunks/platform-ba1j1gbh.js +0 -16
- package/dist/chunks/publish-panel-54jvhskq.js +0 -28
- package/dist/chunks/quick-search-cgfmjwq5.js +0 -65
- package/dist/chunks/references-3qx8fkyp.js +0 -29
- package/dist/chunks/right-panel-cqp8bc4v.js +0 -46
- package/dist/chunks/section-registry-sx1ykvkw.js +0 -30
- package/dist/chunks/sp-overlay.dev-yztmtrs1.js +0 -18
- package/dist/chunks/sp-popover.dev-n2etmqdp.js +0 -9
- package/dist/chunks/sp-progress-circle.dev-hryhj0es.js +0 -15
- package/dist/chunks/sp-tooltip.dev-xcvpnqr0.js +0 -15
- package/dist/chunks/sp-tray.dev-tkbscm06.js +0 -199
- package/dist/chunks/studio-0a5qrh01.js +0 -3
- package/dist/chunks/studio-18j3bmcz.js +0 -14
- package/dist/chunks/studio-1hbqnt19.js +0 -1823
- package/dist/chunks/studio-4rzyrtjz.js +0 -426
- package/dist/chunks/studio-5rywrkxz.js +0 -1903
- package/dist/chunks/studio-7afd21nw.js +0 -67
- package/dist/chunks/studio-7nte2hj4.js +0 -613
- package/dist/chunks/studio-8jpzqk5s.js +0 -128
- package/dist/chunks/studio-8q517dfr.js +0 -24
- package/dist/chunks/studio-9c4k4vhv.js +0 -357
- package/dist/chunks/studio-9n4mrmnb.js +0 -184
- package/dist/chunks/studio-a0tswy0w.js +0 -58
- package/dist/chunks/studio-ahjfdy6e.js +0 -387
- package/dist/chunks/studio-ahnzd9rg.js +0 -23
- package/dist/chunks/studio-bw5dz6km.js +0 -608
- package/dist/chunks/studio-cb12yz9w.js +0 -15055
- package/dist/chunks/studio-d1ks410h.js +0 -175
- package/dist/chunks/studio-eqq1w638.js +0 -113
- package/dist/chunks/studio-ex8zyp98.js +0 -1813
- package/dist/chunks/studio-h4rxscfc.js +0 -10
- package/dist/chunks/studio-kyh9avvv.js +0 -28
- package/dist/chunks/studio-kyk2v92a.js +0 -659
- package/dist/chunks/studio-m3hwn7y1.js +0 -120
- package/dist/chunks/studio-mmv72a27.js +0 -4344
- package/dist/chunks/studio-n8b9wqwy.js +0 -291
- package/dist/chunks/studio-pdfjntbk.js +0 -6939
- package/dist/chunks/studio-qq6jym04.js +0 -53
- package/dist/chunks/studio-r1r7afxx.js +0 -1066
- package/dist/chunks/studio-rdx8jcxy.js +0 -83
- package/dist/chunks/studio-rn9ta2mz.js +0 -111
- package/dist/chunks/studio-t7qb9db8.js +0 -665
- package/dist/chunks/studio-tmc5emrw.js +0 -8
- package/dist/chunks/studio-txwkm6p9.js +0 -12
- package/dist/chunks/studio-v38hmvx1.js +0 -390
- package/dist/chunks/studio-vadzgkrz.js +0 -318
- package/dist/chunks/studio-wx5609xd.js +0 -341
- package/dist/chunks/studio-z6nw2ek2.js +0 -18
- package/dist/chunks/studio-zczps70q.js +0 -378
- package/dist/chunks/workspace-xpres40v.js +0 -89
- package/src/panels/activity-bar.ts +0 -251
- package/src/panels/panel-scheduler.ts +0 -219
- package/src/panels/style-inputs.ts +0 -237
- package/src/panels/target-line.ts +0 -274
- package/src/panels/welcome-screen.ts +0 -346
- package/src/ui/button-group.ts +0 -102
- package/src/ui/choice-field.ts +0 -72
- package/src/ui/field-row.ts +0 -249
- package/src/ui/formula-palette.ts +0 -213
- package/src/ui/icons.ts +0 -52
- package/src/ui/jx-theme.ts +0 -130
- package/src/ui/spectrum.ts +0 -340
- package/src/ui/value-selector.ts +0 -174
- package/src/ui/widgets.ts +0 -172
- /package/dist/chunks/{javascript-s56a8dpk.css → javascript-4abzjcy9.css} +0 -0
- /package/dist/chunks/{jsonMode-zr9sw0c7.css → jsonMode-vvmpmk34.css} +0 -0
- /package/dist/chunks/{monaco-setup-pav68602.css → monaco-setup-8vbyqnhr.css} +0 -0
- /package/dist/chunks/{tsMode-ef187txx.css → tsMode-hnxxb73h.css} +0 -0
|
@@ -0,0 +1,436 @@
|
|
|
1
|
+
/// <reference lib="dom" />
|
|
2
|
+
/**
|
|
3
|
+
* The Navigator's Data panel, as a mounted document.
|
|
4
|
+
*
|
|
5
|
+
* `panels/signals-panel.ts` is the flow — what category an entry falls in, what its badge and its
|
|
6
|
+
* summary say, which control each field of a `$prototype` gets, what a commit is worth, what a
|
|
7
|
+
* rename collides with, and every transaction that follows — and this is the surface it draws into:
|
|
8
|
+
* the reactive scope the document reads, and the mount that stays put while the Navigator repaints
|
|
9
|
+
* around it.
|
|
10
|
+
*
|
|
11
|
+
* **The field list is a projection, not a shape per category.** A `Request` entry and an
|
|
12
|
+
* `IndexedDB` entry differ only in the rows the flow hands over, so a new `$prototype` is a case in
|
|
13
|
+
* TypeScript and no markup at all. Nothing in the document knows what `LocalStorage` is.
|
|
14
|
+
*
|
|
15
|
+
* **Every control hands back the names that place it.** The maps nest four deep — category, entry,
|
|
16
|
+
* field, and a table field's rows and cells — and inside the innermost one `$map/item` is the cell,
|
|
17
|
+
* so a control genuinely cannot see the entry it belongs to. Each record therefore carries the
|
|
18
|
+
* entry name, the field key and (for a cell) its row and column, which the flow looks straight back
|
|
19
|
+
* up. That is the same answer `surfaces/git-panel.json` gives for its nested file rows.
|
|
20
|
+
*
|
|
21
|
+
* **Five islands, all through `onNodeCreated`** (specs/studio-ui-guidelines.md §9.4). The
|
|
22
|
+
* expression editor, the statement-card editor and the media picker are lit surfaces of their own
|
|
23
|
+
* that other panels embed; the shared schema form hands back a HOST rather than a template; and the
|
|
24
|
+
* resolved-value tree is a document of its own (`surfaces/panel-data.ts`). The document renders an
|
|
25
|
+
* empty host for each and the flow fills it.
|
|
26
|
+
*
|
|
27
|
+
* **The container is not cleared**, for the reason `surfaces/git-panel.ts` states: a panel body is
|
|
28
|
+
* a node lit renders into and its comment markers are how lit finds its own content again. So the
|
|
29
|
+
* document is APPENDED, and {@link SignalsSurfaceHandle.attached} is how the panel finds out that
|
|
30
|
+
* the Navigator has since painted another panel over the top of it.
|
|
31
|
+
*
|
|
32
|
+
* @docs studio/logic/data
|
|
33
|
+
*/
|
|
34
|
+
|
|
35
|
+
import { reactive } from "../reactivity";
|
|
36
|
+
import { mountSurface, registerSurface } from "../ui/surface";
|
|
37
|
+
import signalsDoc from "./panel-signals.json";
|
|
38
|
+
import type { JxDocument } from "@jxsuite/schema/types";
|
|
39
|
+
import type { JxScope } from "@jxsuite/runtime/types";
|
|
40
|
+
import type { SurfaceHandle } from "../ui/surface";
|
|
41
|
+
|
|
42
|
+
registerSurface("panel-signals", signalsDoc as unknown as JxDocument);
|
|
43
|
+
|
|
44
|
+
/** One row of a picker, as `jx-select` reads it. */
|
|
45
|
+
export interface SignalOption {
|
|
46
|
+
value: string;
|
|
47
|
+
label: string;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/** A named run of picker rows. `jx-select` draws both halves of a group's delimiter. */
|
|
51
|
+
export interface SignalOptionGroup {
|
|
52
|
+
id: string;
|
|
53
|
+
label: string;
|
|
54
|
+
rows: SignalOption[];
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/** One chip of the basic parameter editor. */
|
|
58
|
+
export interface SignalChipView {
|
|
59
|
+
key: string;
|
|
60
|
+
label: string;
|
|
61
|
+
/** The entry this chip belongs to, because inside the chip map nothing else can see it. */
|
|
62
|
+
signal: string;
|
|
63
|
+
/** The field key — `parameters`. */
|
|
64
|
+
field: string;
|
|
65
|
+
removeLabel: string;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/** One cell of a table field: one column of one row. */
|
|
69
|
+
export interface SignalCellView {
|
|
70
|
+
key: string;
|
|
71
|
+
kind: "text" | "checkbox";
|
|
72
|
+
label: string;
|
|
73
|
+
value: string;
|
|
74
|
+
placeholder: string;
|
|
75
|
+
checked: boolean;
|
|
76
|
+
/** This column's share of the row, written as a custom property the one shared rule reads. */
|
|
77
|
+
grow: string;
|
|
78
|
+
signal: string;
|
|
79
|
+
field: string;
|
|
80
|
+
row: string;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/** One row of a table field — a CEM parameter, or an emitted event. */
|
|
84
|
+
export interface SignalCellRowView {
|
|
85
|
+
key: string;
|
|
86
|
+
cells: SignalCellView[];
|
|
87
|
+
removeLabel: string;
|
|
88
|
+
signal: string;
|
|
89
|
+
field: string;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/** One segment of a `bar` field's mode switch. */
|
|
93
|
+
export interface SignalSegmentView {
|
|
94
|
+
key: string;
|
|
95
|
+
label: string;
|
|
96
|
+
selected: boolean;
|
|
97
|
+
signal: string;
|
|
98
|
+
field: string;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/** One icon button on a `bar` field. */
|
|
102
|
+
export interface SignalBarButtonView {
|
|
103
|
+
key: string;
|
|
104
|
+
icon: string;
|
|
105
|
+
label: string;
|
|
106
|
+
signal: string;
|
|
107
|
+
field: string;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Which control a field is drawn as.
|
|
112
|
+
*
|
|
113
|
+
* Three pairs are the same thing in two dresses, and each pair is a real distinction rather than a
|
|
114
|
+
* convenience: `slot` and `slot-field` are an island full width or inside a labelled row (the media
|
|
115
|
+
* picker is one control among several, the expression editor owns its row); `multiline` and `code`
|
|
116
|
+
* are a labelled text box and a bare one, because a function body already has the `bar` above it
|
|
117
|
+
* saying "Body" and a labelled field would print the word twice; `note` and `hint` are a fact
|
|
118
|
+
* beside a label and a sentence about the whole entry, which has no value to name.
|
|
119
|
+
*/
|
|
120
|
+
export type SignalFieldKind =
|
|
121
|
+
| "text"
|
|
122
|
+
| "multiline"
|
|
123
|
+
| "code"
|
|
124
|
+
| "select"
|
|
125
|
+
| "checkbox"
|
|
126
|
+
| "note"
|
|
127
|
+
| "hint"
|
|
128
|
+
| "slot"
|
|
129
|
+
| "slot-field"
|
|
130
|
+
| "bar"
|
|
131
|
+
| "chips"
|
|
132
|
+
| "rows";
|
|
133
|
+
|
|
134
|
+
/** One field of one entry's editor. Every value is a value: no records, no closures. */
|
|
135
|
+
export interface SignalFieldView {
|
|
136
|
+
/** Unique within the entry, the repeater's key, and the name the flow looks its writer up by. */
|
|
137
|
+
key: string;
|
|
138
|
+
/**
|
|
139
|
+
* What `data-prop` says — the id the region grammar reads (`ui/regions.ts`). It is the label for
|
|
140
|
+
* every row that had one, because that is what `ui/field-row.ts` was passed.
|
|
141
|
+
*/
|
|
142
|
+
prop: string;
|
|
143
|
+
kind: SignalFieldKind;
|
|
144
|
+
/** The entry this field edits. */
|
|
145
|
+
signal: string;
|
|
146
|
+
label: string;
|
|
147
|
+
/** Whether the row collapses to one column: a wide control reads better with its label above it. */
|
|
148
|
+
span: boolean;
|
|
149
|
+
value: string;
|
|
150
|
+
placeholder: string;
|
|
151
|
+
mono: boolean;
|
|
152
|
+
/** How many lines a multiline field is tall before it grows. */
|
|
153
|
+
rows: string;
|
|
154
|
+
error: string;
|
|
155
|
+
hasError: boolean;
|
|
156
|
+
checked: boolean;
|
|
157
|
+
options: SignalOption[];
|
|
158
|
+
/** Which island this host is for — `expression`, `statements`, `media` or `schema`. */
|
|
159
|
+
slot: string;
|
|
160
|
+
chips: SignalChipView[];
|
|
161
|
+
cellRows: SignalCellRowView[];
|
|
162
|
+
addLabel: string;
|
|
163
|
+
segments: SignalSegmentView[];
|
|
164
|
+
buttons: SignalBarButtonView[];
|
|
165
|
+
/** The basic/advanced switch's label, or `""` for a field that has no second view. */
|
|
166
|
+
footer: string;
|
|
167
|
+
hasFooter: boolean;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/** One state entry, as the row list draws it. */
|
|
171
|
+
export interface SignalRowView {
|
|
172
|
+
/** The entry's name, which is also its reconcile key and what every control hands back. */
|
|
173
|
+
key: string;
|
|
174
|
+
name: string;
|
|
175
|
+
badge: string;
|
|
176
|
+
/** `state`, `computed`, `data`, `expression` or `function` — the badge's tint, and its tooltip. */
|
|
177
|
+
category: string;
|
|
178
|
+
categoryLabel: string;
|
|
179
|
+
expanded: boolean;
|
|
180
|
+
/** The one summary slot: the definition hint, or what the canvas resolved the entry to. */
|
|
181
|
+
summary: string;
|
|
182
|
+
summaryTitle: string;
|
|
183
|
+
/** `hint`, `value` or `pending` — only the last is dimmed, and only it pulses on a refresh. */
|
|
184
|
+
summaryTone: string;
|
|
185
|
+
deleteLabel: string;
|
|
186
|
+
liveLabel: string;
|
|
187
|
+
fields: SignalFieldView[];
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/** One category section. Which sections are collapsed is the panel's record, not the document's. */
|
|
191
|
+
export interface SignalCategoryView {
|
|
192
|
+
key: string;
|
|
193
|
+
/** "State (3)" — the count is part of the heading, not a badge of its own. */
|
|
194
|
+
label: string;
|
|
195
|
+
open: boolean;
|
|
196
|
+
rows: SignalRowView[];
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/** Everything the panel says the surface should be showing right now. */
|
|
200
|
+
export interface SignalsView {
|
|
201
|
+
/** `none` while there is nothing to refresh, `idle` for the button, `busy` while one is out. */
|
|
202
|
+
refreshState: "none" | "idle" | "busy";
|
|
203
|
+
/** Whether a refresh is in flight — the one moment a pending value pulses rather than resting. */
|
|
204
|
+
refreshing: boolean;
|
|
205
|
+
listState: "listed" | "empty";
|
|
206
|
+
emptyMessage: string;
|
|
207
|
+
categories: SignalCategoryView[];
|
|
208
|
+
addOptions: SignalOption[];
|
|
209
|
+
addGroups: SignalOptionGroup[];
|
|
210
|
+
/** What the add picker holds. Always `""` at rest — see {@link SignalsActions.addSignal}. */
|
|
211
|
+
addValue: string;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/** What a control can ask the panel to do. Every one of them is a decision the flow owns. */
|
|
215
|
+
export interface SignalsActions {
|
|
216
|
+
toggleCategory: (key: string, open: boolean) => void;
|
|
217
|
+
toggleRow: (name: string) => void;
|
|
218
|
+
dropSignal: (name: string) => void;
|
|
219
|
+
refresh: () => void;
|
|
220
|
+
/**
|
|
221
|
+
* Add an entry of the picked kind.
|
|
222
|
+
*
|
|
223
|
+
* The picker never rests on what was picked, so the flow announces the pick on the scope and then
|
|
224
|
+
* the empty string: a controlled input is authoritative only while the scope value MOVES
|
|
225
|
+
* (studio-ui-guidelines.md §9.3), and writing `""` over `""` is a no-op the binding skips.
|
|
226
|
+
*/
|
|
227
|
+
addSignal: (type: string) => void;
|
|
228
|
+
/** The reader typed. What that is worth — nothing, a debounce, a commit — is the field's own. */
|
|
229
|
+
inputField: (signal: string, field: string, value: string) => void;
|
|
230
|
+
/** The reader left the control, or pressed Enter in it. Always a commit. */
|
|
231
|
+
commitField: (signal: string, field: string, value: string) => void;
|
|
232
|
+
checkField: (signal: string, field: string, checked: boolean) => void;
|
|
233
|
+
/** A segment, an icon button or the basic/advanced switch was pressed. */
|
|
234
|
+
pressField: (signal: string, field: string, action: string) => void;
|
|
235
|
+
editCell: (signal: string, field: string, row: string, cell: string, value: string) => void;
|
|
236
|
+
checkCell: (signal: string, field: string, row: string, cell: string, checked: boolean) => void;
|
|
237
|
+
dropRow: (signal: string, field: string, row: string) => void;
|
|
238
|
+
addRow: (signal: string, field: string) => void;
|
|
239
|
+
addChip: (signal: string, field: string, value: string) => void;
|
|
240
|
+
dropChip: (signal: string, field: string, chip: string) => void;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* Fill one island the document has drawn an empty host for.
|
|
245
|
+
*
|
|
246
|
+
* @param {HTMLElement} host The empty node the document created.
|
|
247
|
+
* @param {string} signal The entry it belongs to.
|
|
248
|
+
* @param {string} slot Which island it is: `expression`, `statements`, `media`, `schema`, `tree`.
|
|
249
|
+
*/
|
|
250
|
+
export type SignalIslandPainter = (host: HTMLElement, signal: string, slot: string) => void;
|
|
251
|
+
|
|
252
|
+
export interface SignalsSurfaceHandle {
|
|
253
|
+
/** Bring the mounted document up to date with a whole projection. */
|
|
254
|
+
update: (view: SignalsView) => void;
|
|
255
|
+
/** Whether the document this mounted is still standing in the container it was given. */
|
|
256
|
+
attached: () => boolean;
|
|
257
|
+
/** Take the document down. Idempotent. */
|
|
258
|
+
dispose: () => void;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
interface SignalsScope extends Record<string, unknown>, SignalsView, SignalsActions {}
|
|
262
|
+
|
|
263
|
+
/** One island's host, and what it is a host for. */
|
|
264
|
+
interface IslandRecord {
|
|
265
|
+
host: HTMLElement;
|
|
266
|
+
signal: string;
|
|
267
|
+
slot: string;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
/** The `part` a node was authored with, or `""` — the only thing this adapter asks about a node. */
|
|
271
|
+
function partOf(def: unknown): string {
|
|
272
|
+
const attributes = (def as { attributes?: Record<string, unknown> } | null)?.attributes;
|
|
273
|
+
const part = attributes?.["part"];
|
|
274
|
+
return typeof part === "string" ? part : "";
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
/** The `$map` item a node was rendered inside, if it was rendered inside one. */
|
|
278
|
+
function mapItem(state: JxScope | undefined): Record<string, unknown> | null {
|
|
279
|
+
const map = state?.["$map"] as { item?: unknown } | undefined;
|
|
280
|
+
const item = map?.item;
|
|
281
|
+
return item !== null && typeof item === "object" ? (item as Record<string, unknown>) : null;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
/** A string field off a `$map` item, or `""`. */
|
|
285
|
+
function itemString(item: Record<string, unknown> | null, field: string): string {
|
|
286
|
+
const value = item?.[field];
|
|
287
|
+
return typeof value === "string" ? value : "";
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
/** The scope's starting shape, before the first projection lands on it. */
|
|
291
|
+
function emptyView(): SignalsView {
|
|
292
|
+
return {
|
|
293
|
+
addGroups: [],
|
|
294
|
+
addOptions: [],
|
|
295
|
+
addValue: "",
|
|
296
|
+
categories: [],
|
|
297
|
+
emptyMessage: "",
|
|
298
|
+
listState: "empty",
|
|
299
|
+
refreshState: "none",
|
|
300
|
+
refreshing: false,
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
/** Write a projection into the scope. Assignment by assignment, so an unchanged field is inert. */
|
|
305
|
+
function project(scope: SignalsScope, view: SignalsView): void {
|
|
306
|
+
scope.refreshState = view.refreshState;
|
|
307
|
+
scope.refreshing = view.refreshing;
|
|
308
|
+
scope.listState = view.listState;
|
|
309
|
+
scope.emptyMessage = view.emptyMessage;
|
|
310
|
+
scope.categories = view.categories;
|
|
311
|
+
scope.addOptions = view.addOptions;
|
|
312
|
+
scope.addGroups = view.addGroups;
|
|
313
|
+
scope.addValue = view.addValue;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
/**
|
|
317
|
+
* Mount the Data document into `container`, which is the `.panel-content` the Navigator painted.
|
|
318
|
+
*
|
|
319
|
+
* @param {HTMLElement} container The panel body's content node.
|
|
320
|
+
* @param {SignalsView} view What to draw first.
|
|
321
|
+
* @param {SignalsActions} actions What each control does.
|
|
322
|
+
* @param {SignalIslandPainter} paint Fills one island — see {@link SignalIslandPainter}.
|
|
323
|
+
* @returns {SignalsSurfaceHandle}
|
|
324
|
+
*/
|
|
325
|
+
export function mountSignalsSurface(
|
|
326
|
+
container: HTMLElement,
|
|
327
|
+
view: SignalsView,
|
|
328
|
+
actions: SignalsActions,
|
|
329
|
+
paint: SignalIslandPainter,
|
|
330
|
+
): SignalsSurfaceHandle {
|
|
331
|
+
const scope = reactive<SignalsScope>({
|
|
332
|
+
...emptyView(),
|
|
333
|
+
...actions,
|
|
334
|
+
/* The picker never rests on what was picked. A controlled input is authoritative only while
|
|
335
|
+
the scope value MOVES (studio-ui-guidelines.md §9.3), and the projection that follows a pick
|
|
336
|
+
carries the same empty string it already had — so the raw pick is announced first, and the
|
|
337
|
+
empty string after it is a change the binding writes back. This is the surface's business
|
|
338
|
+
rather than the flow's: what the flow is being asked is "add one of these", and the control's
|
|
339
|
+
resting state is not part of that question. */
|
|
340
|
+
addSignal: (type: string) => {
|
|
341
|
+
scope.addValue = type;
|
|
342
|
+
actions.addSignal(type);
|
|
343
|
+
scope.addValue = "";
|
|
344
|
+
},
|
|
345
|
+
}) as SignalsScope;
|
|
346
|
+
project(scope, view);
|
|
347
|
+
|
|
348
|
+
/**
|
|
349
|
+
* Every island host the document has announced, by the entry and field it belongs to.
|
|
350
|
+
*
|
|
351
|
+
* Keyed rather than listed, so a host rebuilt for the same field replaces its predecessor instead
|
|
352
|
+
* of accumulating beside it — which is what a `$switch` case does every time a row is reopened.
|
|
353
|
+
*/
|
|
354
|
+
const islands = new Map<string, IslandRecord>();
|
|
355
|
+
let painting = false;
|
|
356
|
+
|
|
357
|
+
/**
|
|
358
|
+
* Fill every standing island, once, after the DOM has settled.
|
|
359
|
+
*
|
|
360
|
+
* A microtask rather than a synchronous pass, because a `$map`'s re-render is COALESCED into one
|
|
361
|
+
* (`runtime.ts`: the first render is synchronous, every re-render is one microtask), so a host
|
|
362
|
+
* created by a projection does not exist yet when the projection returns. By the time this runs
|
|
363
|
+
* it does — and it is in the page, which is what makes `isConnected` a truthful answer to "has
|
|
364
|
+
* this row been collapsed?" rather than "was this node built a moment ago?".
|
|
365
|
+
*/
|
|
366
|
+
const repaint = (): void => {
|
|
367
|
+
if (painting) {
|
|
368
|
+
return;
|
|
369
|
+
}
|
|
370
|
+
painting = true;
|
|
371
|
+
queueMicrotask(() => {
|
|
372
|
+
painting = false;
|
|
373
|
+
for (const [key, record] of islands) {
|
|
374
|
+
if (record.host.isConnected) {
|
|
375
|
+
paint(record.host, record.signal, record.slot);
|
|
376
|
+
} else {
|
|
377
|
+
islands.delete(key);
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
});
|
|
381
|
+
};
|
|
382
|
+
|
|
383
|
+
let mounted: SurfaceHandle | null = null;
|
|
384
|
+
let disposed = false;
|
|
385
|
+
void mountSurface("panel-signals", scope, container, {
|
|
386
|
+
onNodeCreated: (element, _path, def, state) => {
|
|
387
|
+
if (!(element instanceof HTMLElement)) {
|
|
388
|
+
return;
|
|
389
|
+
}
|
|
390
|
+
const part = partOf(def);
|
|
391
|
+
if (part !== "slot-host" && part !== "tree-host") {
|
|
392
|
+
return;
|
|
393
|
+
}
|
|
394
|
+
const item = mapItem(state);
|
|
395
|
+
/* The tree host is drawn inside the ENTRY map rather than the field map, so its item is the
|
|
396
|
+
row and the entry's name is that row's own key. */
|
|
397
|
+
const tree = part === "tree-host";
|
|
398
|
+
const signal = tree ? itemString(item, "key") : itemString(item, "signal");
|
|
399
|
+
const slot = tree ? "tree" : itemString(item, "slot");
|
|
400
|
+
if (!signal || !slot) {
|
|
401
|
+
return;
|
|
402
|
+
}
|
|
403
|
+
/* Keyed by the entry and the SLOT rather than by the field, which is also how the flow looks
|
|
404
|
+
a painter up: an entry has at most one of each island, and two records under one key would
|
|
405
|
+
be two hosts for one painter — the first of them orphaned and never filled. */
|
|
406
|
+
islands.set(`${signal}/${slot}`, { host: element, signal, slot });
|
|
407
|
+
repaint();
|
|
408
|
+
},
|
|
409
|
+
}).then((surface) => {
|
|
410
|
+
if (disposed) {
|
|
411
|
+
surface.dispose();
|
|
412
|
+
return;
|
|
413
|
+
}
|
|
414
|
+
mounted = surface;
|
|
415
|
+
repaint();
|
|
416
|
+
});
|
|
417
|
+
|
|
418
|
+
return {
|
|
419
|
+
/* While the mount is in flight there is nothing in the container to ask about, so the answer is
|
|
420
|
+
whether this handle is still wanted — answering no would start a second mount racing the
|
|
421
|
+
first. Once mounted, the question is whether the root is still where it was put: a Navigator
|
|
422
|
+
that painted another panel cleared this document out from under it. */
|
|
423
|
+
attached: () =>
|
|
424
|
+
!disposed && (mounted === null || (mounted.root as Node).parentNode === container),
|
|
425
|
+
dispose() {
|
|
426
|
+
disposed = true;
|
|
427
|
+
mounted?.dispose();
|
|
428
|
+
mounted = null;
|
|
429
|
+
islands.clear();
|
|
430
|
+
},
|
|
431
|
+
update(next) {
|
|
432
|
+
project(scope, next);
|
|
433
|
+
repaint();
|
|
434
|
+
},
|
|
435
|
+
};
|
|
436
|
+
}
|