@jxsuite/studio 4.1.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-n6tfwnda.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-wcnt3r9g.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-vx9bhp1d.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-msd847zn.js → studio-25hkdrkw.js} +357 -86
- package/dist/chunks/studio-26d7myd1.js +258 -0
- package/dist/chunks/{studio-4r1pv6zf.js → studio-38emantv.js} +22 -5
- package/dist/chunks/studio-3gxv60tn.js +422 -0
- package/dist/chunks/{studio-fbf92ckf.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-1wagb550.js → studio-5523bpzt.js} +11 -11
- package/dist/chunks/{studio-x4qkdat5.js → studio-57mf66w2.js} +1749 -2481
- 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-ahn3pdgx.js → studio-79y5sz51.js} +52 -38
- package/dist/chunks/{studio-gcye7qka.js → studio-7e11jpa9.js} +21 -21
- 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-x813zp48.js → studio-arfpe389.js} +30 -30
- package/dist/chunks/{studio-trxrabqf.js → studio-az3zd49t.js} +475 -283
- package/dist/chunks/studio-cpvb2ed1.js +1171 -0
- package/dist/chunks/{studio-f3wqjtk5.js → studio-d0300636.js} +5076 -18
- 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-3bqpr0zh.js → studio-em9nw8eh.js} +299 -110
- 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-dm19q43r.js → studio-hhvs4sdg.js} +10 -10
- package/dist/chunks/{studio-q9jd1a60.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-2b946z26.js → studio-rkstz940.js} +3658 -6134
- 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-jkftxyvz.js → studio-s6z853aq.js} +5858 -2152
- package/dist/chunks/{studio-6yw4y3my.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-qjy2z9bv.js → studio-vz68yn9e.js} +32 -137
- package/dist/chunks/studio-wqpngpsk.js +174 -0
- package/dist/chunks/{studio-b55y6ewx.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 +1780 -667
- package/dist/studio.js +52819 -36480
- 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/index.html +1 -0
- package/package.json +18 -52
- package/src/about/about-modal.ts +72 -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 +943 -660
- package/src/files/json-layout.ts +474 -0
- 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/layout.ts +2 -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 +181 -252
- package/src/new-project/location-fields.ts +93 -160
- 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 -163
- 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 +106 -16
- 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 +134 -328
- package/src/services/a11y-report.ts +100 -43
- package/src/services/ai-command-tools.ts +468 -0
- 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/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 +6 -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 +1 -1
- package/src/settings/preferences-dialog.ts +350 -330
- 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 +22 -0
- package/src/ui/ai-credentials-form.ts +104 -100
- package/src/ui/ai-managed-connect.ts +54 -36
- package/src/ui/ai-model-picker.ts +75 -47
- package/src/ui/cf-account-picker.ts +76 -141
- 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 -1568
- package/styles/tokens.css +65 -136
- package/styles/tokens.json +84 -0
- package/dist/chunks/Overlay.dev-etqjwyf9.js +0 -23
- package/dist/chunks/adapter-jkcyhgtr.js +0 -14
- package/dist/chunks/cf-account-picker-en86v7x7.js +0 -163
- package/dist/chunks/cf-settings-45fgyx8y.js +0 -21
- package/dist/chunks/components-zmx10t62.js +0 -21
- package/dist/chunks/content-source-48xg86wj.js +0 -49
- package/dist/chunks/convert-to-repeater-43tfn7cs.js +0 -268
- package/dist/chunks/editor-cptq5jp1.js +0 -37
- package/dist/chunks/entry-commands-e63f1xc0.js +0 -46
- package/dist/chunks/extension-sections-txv08xxg.js +0 -311
- package/dist/chunks/file-ops-wbh4hhsx.js +0 -48
- package/dist/chunks/files-3kfkwhk4.js +0 -93
- package/dist/chunks/flow-qbfgrpeh.js +0 -634
- package/dist/chunks/focus-trap.esm-9t2drp0g.js +0 -1025
- package/dist/chunks/focus-visible-6eg70z18.js +0 -167
- package/dist/chunks/format-host-w16q81tf.js +0 -43
- package/dist/chunks/fs-events-hrrg328g.js +0 -21
- package/dist/chunks/git-panel-532whr1y.js +0 -59
- package/dist/chunks/index-zqxmqxmh.js +0 -109
- package/dist/chunks/jx-validate-8er6gbxy.js +0 -19
- package/dist/chunks/layers-panel-07hm7g5j.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-v9st96ja.js +0 -29
- package/dist/chunks/quick-search-zccjp6gv.js +0 -66
- package/dist/chunks/references-3qx8fkyp.js +0 -29
- package/dist/chunks/right-panel-vm3b6kwy.js +0 -46
- package/dist/chunks/section-registry-sx1ykvkw.js +0 -30
- package/dist/chunks/sp-overlay.dev-qgvhnxf4.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-4sastdnw.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-0bq6eh7v.js +0 -12
- package/dist/chunks/studio-18j3bmcz.js +0 -14
- package/dist/chunks/studio-1ngbejft.js +0 -181
- package/dist/chunks/studio-4b5z1x43.js +0 -424
- package/dist/chunks/studio-4n2b5gzb.js +0 -357
- package/dist/chunks/studio-4rzyrtjz.js +0 -426
- package/dist/chunks/studio-5fx3g9jg.js +0 -4325
- package/dist/chunks/studio-5myknm0a.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-950k0dx6.js +0 -6939
- package/dist/chunks/studio-9n4mrmnb.js +0 -184
- package/dist/chunks/studio-a0tswy0w.js +0 -58
- package/dist/chunks/studio-ahnzd9rg.js +0 -23
- package/dist/chunks/studio-cmb03bg5.js +0 -13890
- package/dist/chunks/studio-d1ks410h.js +0 -175
- package/dist/chunks/studio-ef49pnzx.js +0 -387
- package/dist/chunks/studio-eqq1w638.js +0 -113
- package/dist/chunks/studio-ew0djmhg.js +0 -341
- package/dist/chunks/studio-gfgb8pe6.js +0 -1652
- package/dist/chunks/studio-h4rxscfc.js +0 -10
- package/dist/chunks/studio-jc994dnr.js +0 -1066
- package/dist/chunks/studio-kyh9avvv.js +0 -28
- package/dist/chunks/studio-m3hwn7y1.js +0 -120
- package/dist/chunks/studio-mtfnaqs9.js +0 -659
- package/dist/chunks/studio-n6j9t10q.js +0 -318
- package/dist/chunks/studio-n8b9wqwy.js +0 -291
- package/dist/chunks/studio-qcy05dp8.js +0 -1743
- package/dist/chunks/studio-qq6jym04.js +0 -53
- 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-z6nw2ek2.js +0 -18
- package/dist/chunks/studio-zczps70q.js +0 -378
- package/dist/chunks/studio-zqazsct2.js +0 -1823
- package/dist/chunks/workspace-fjx52ryv.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,340 @@
|
|
|
1
|
+
/// <reference lib="dom" />
|
|
2
|
+
/**
|
|
3
|
+
* The formula palette (spec §19.9): a search over the formula catalog, mounted into the popover
|
|
4
|
+
* layer as a Jx document.
|
|
5
|
+
*
|
|
6
|
+
* `formula-palette.json` is the markup, the ARIA and the style; this is the decisions — which
|
|
7
|
+
* entries match the query, how they group, which one the highlight is on, and what a pick hands
|
|
8
|
+
* back. Two controls open it, the expression editor's ⟨⟩ button and the formula workspace's Catalog
|
|
9
|
+
* button, and both pass the same three things: the catalog to browse, what to do with a pick, and
|
|
10
|
+
* the control the panel should hang under.
|
|
11
|
+
*
|
|
12
|
+
* **The mount is standing.** One slot in the popover layer, one document in it, and `open` is a
|
|
13
|
+
* field of the scope rather than a render call — so opening the palette twice reuses the same
|
|
14
|
+
* element tree and the `$switch` on `open` is what puts the overlay on screen and takes it away.
|
|
15
|
+
* `getLayerSlot` hands back the same slot every time until something clears it, which is the one
|
|
16
|
+
* case that re-mounts: a slot the layer no longer holds is not one this module may render into.
|
|
17
|
+
*
|
|
18
|
+
* **The rows and the highlight are separate fields**, exactly as `surfaces/palette.json`'s are —
|
|
19
|
+
* and the highlight is now ONE field rather than a per-row comparison. A key moves `activeId`, the
|
|
20
|
+
* kit's `jx-listbox` is handed that id as `active`, and its sidecar is the single writer of every
|
|
21
|
+
* `jx-option`'s `selected`; `groups` changes only when the query does, and the keyed lists
|
|
22
|
+
* reconcile then and only then. The same string is what the field points `aria-activedescendant`
|
|
23
|
+
* at, so the row a reader hears and the row a reader sees cannot come apart. That is also why each
|
|
24
|
+
* row carries the FLAT index it occupies across all the groups: the rows are a nested `$map`, an
|
|
25
|
+
* inner map cannot reach the outer one's counter, and the index is what the id, the row's `value`
|
|
26
|
+
* and a hover all name.
|
|
27
|
+
*
|
|
28
|
+
* @docs studio/logic/formulas
|
|
29
|
+
*/
|
|
30
|
+
|
|
31
|
+
import { reactive } from "../reactivity";
|
|
32
|
+
import { getLayerSlot } from "../ui/layers";
|
|
33
|
+
import { mountSurface, registerSurface } from "../ui/surface";
|
|
34
|
+
import { rectOf } from "../utils/geometry";
|
|
35
|
+
import formulaPaletteDoc from "./formula-palette.json";
|
|
36
|
+
|
|
37
|
+
import type { FormulaCatalogEntry } from "../ui/formula-catalog";
|
|
38
|
+
import type { SurfaceHandle } from "../ui/surface";
|
|
39
|
+
import type { JxDocument } from "@jxsuite/schema/types";
|
|
40
|
+
|
|
41
|
+
registerSurface("formula-palette", formulaPaletteDoc as unknown as JxDocument);
|
|
42
|
+
|
|
43
|
+
/** The popover slot id, and so the `overlay.popover:formula-palette` region the shots address. */
|
|
44
|
+
const SLOT = "formula-palette";
|
|
45
|
+
|
|
46
|
+
/** The panel's width, needed to keep an anchored panel inside the right-hand edge. */
|
|
47
|
+
const PANEL_WIDTH = 568;
|
|
48
|
+
|
|
49
|
+
export interface FormulaPaletteOpts {
|
|
50
|
+
entries: FormulaCatalogEntry[];
|
|
51
|
+
onPick: (entry: FormulaCatalogEntry) => void;
|
|
52
|
+
/** Optional anchor element the panel is positioned under; centered when absent. */
|
|
53
|
+
anchor?: HTMLElement | null;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/** One catalog entry, as the document draws it. */
|
|
57
|
+
interface RowProjection {
|
|
58
|
+
/** Identity across updates: the entry's kind and name, which no two entries share. */
|
|
59
|
+
key: string;
|
|
60
|
+
/**
|
|
61
|
+
* Where this row sits in the FLAT list of matches — what a key, a click and a hover all address.
|
|
62
|
+
*
|
|
63
|
+
* The rows are a `$map` inside a `$map`, and the inner one's `$map.index` counts within its own
|
|
64
|
+
* group. A row that only knew that could neither build the id the highlight is named by nor carry
|
|
65
|
+
* it as the `value` its own `select` event hands back.
|
|
66
|
+
*/
|
|
67
|
+
index: number;
|
|
68
|
+
label: string;
|
|
69
|
+
description: string;
|
|
70
|
+
kind: string;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/** One catalog group, in the catalog's own first-seen order. */
|
|
74
|
+
interface GroupProjection {
|
|
75
|
+
key: string;
|
|
76
|
+
label: string;
|
|
77
|
+
rows: RowProjection[];
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/** The scope `formula-palette.json` reads, and the six things a gesture asks of this module. */
|
|
81
|
+
interface FormulaPaletteScope extends Record<string, unknown> {
|
|
82
|
+
open: boolean;
|
|
83
|
+
query: string;
|
|
84
|
+
groups: GroupProjection[];
|
|
85
|
+
/**
|
|
86
|
+
* The highlighted row's element id — the field's `aria-activedescendant` AND the listbox's
|
|
87
|
+
* `active`, which is the one string this surface writes to move the caret. `""` when no row can
|
|
88
|
+
* take it.
|
|
89
|
+
*/
|
|
90
|
+
activeId: string;
|
|
91
|
+
/** Whether the listbox has anything in it — the combobox's `aria-expanded`. */
|
|
92
|
+
expanded: boolean;
|
|
93
|
+
isEmpty: boolean;
|
|
94
|
+
/** Which empty state: nothing matched what was typed, or there was nothing to match. */
|
|
95
|
+
emptyHint: string;
|
|
96
|
+
anchored: boolean;
|
|
97
|
+
/** An anchored panel's inline-start edge in viewport pixels; ignored while `anchored` is false. */
|
|
98
|
+
anchorLeft: number;
|
|
99
|
+
/** An anchored panel's block-start edge in viewport pixels. */
|
|
100
|
+
anchorTop: number;
|
|
101
|
+
close: () => void;
|
|
102
|
+
input: (value: string) => void;
|
|
103
|
+
move: (delta: number) => void;
|
|
104
|
+
activate: () => void;
|
|
105
|
+
hover: (index: number) => void;
|
|
106
|
+
activateRow: (value: unknown) => void;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
let _open = false;
|
|
110
|
+
let _opts: FormulaPaletteOpts | null = null;
|
|
111
|
+
let _query = "";
|
|
112
|
+
let _selectedIndex = 0;
|
|
113
|
+
/** The matches as last projected, so a key or a click addresses the row the reader sees. */
|
|
114
|
+
let _matches: FormulaCatalogEntry[] = [];
|
|
115
|
+
|
|
116
|
+
let _scope: FormulaPaletteScope | null = null;
|
|
117
|
+
let _mount: Promise<SurfaceHandle> | null = null;
|
|
118
|
+
let _host: HTMLElement | null = null;
|
|
119
|
+
|
|
120
|
+
/** The element id of the row at `index`; the document spells the same string. */
|
|
121
|
+
function optionId(index: number): string {
|
|
122
|
+
return `formula-palette-option-${index}`;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/** Entries matching the current query (label, name, group, or description substring). */
|
|
126
|
+
function filteredEntries(): FormulaCatalogEntry[] {
|
|
127
|
+
const entries = _opts?.entries ?? [];
|
|
128
|
+
const needle = _query.trim().toLowerCase();
|
|
129
|
+
if (!needle) {
|
|
130
|
+
return entries;
|
|
131
|
+
}
|
|
132
|
+
return entries.filter(
|
|
133
|
+
(e) =>
|
|
134
|
+
e.label.toLowerCase().includes(needle) ||
|
|
135
|
+
e.name.toLowerCase().includes(needle) ||
|
|
136
|
+
e.group.toLowerCase().includes(needle) ||
|
|
137
|
+
e.description.toLowerCase().includes(needle),
|
|
138
|
+
);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/** Group entries for display, preserving first-seen group order and carrying the flat index. */
|
|
142
|
+
function groupRows(entries: readonly FormulaCatalogEntry[]): GroupProjection[] {
|
|
143
|
+
const groups = new Map<string, GroupProjection>();
|
|
144
|
+
for (const [index, entry] of entries.entries()) {
|
|
145
|
+
const row: RowProjection = {
|
|
146
|
+
description: entry.description,
|
|
147
|
+
index,
|
|
148
|
+
key: `${entry.kind}:${entry.name}`,
|
|
149
|
+
kind: entry.kind,
|
|
150
|
+
label: entry.label,
|
|
151
|
+
};
|
|
152
|
+
const bucket = groups.get(entry.group);
|
|
153
|
+
if (bucket) {
|
|
154
|
+
bucket.rows.push(row);
|
|
155
|
+
} else {
|
|
156
|
+
groups.set(entry.group, { key: entry.group, label: entry.group, rows: [row] });
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return [...groups.values()];
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* The panel's position for `anchor`, or null for a centred panel.
|
|
164
|
+
*
|
|
165
|
+
* A rect belongs to the moment it was measured, so this is taken once per open and handed to the
|
|
166
|
+
* document as state; the two declarations that read it are in `formula-palette.json`'s own style
|
|
167
|
+
* object. A zero box is what a detached or unlaid-out anchor gives back, and pinning the panel to
|
|
168
|
+
* the top-left corner of the window is worse than centring it.
|
|
169
|
+
*/
|
|
170
|
+
function anchorAt(anchor: HTMLElement | null): { left: number; top: number } | null {
|
|
171
|
+
if (!anchor) {
|
|
172
|
+
return null;
|
|
173
|
+
}
|
|
174
|
+
const rect = rectOf(anchor);
|
|
175
|
+
if (rect.top === 0 && rect.left === 0 && rect.width === 0) {
|
|
176
|
+
return null;
|
|
177
|
+
}
|
|
178
|
+
return {
|
|
179
|
+
left: Math.max(8, Math.min(rect.left, (globalThis.innerWidth || 1200) - PANEL_WIDTH)),
|
|
180
|
+
top: rect.bottom + 4,
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/** The document's scope, created once. */
|
|
185
|
+
function scope(): FormulaPaletteScope {
|
|
186
|
+
_scope ??= reactive<FormulaPaletteScope>({
|
|
187
|
+
activate: () => {
|
|
188
|
+
const entry = _matches[_selectedIndex];
|
|
189
|
+
if (entry) {
|
|
190
|
+
pickEntry(entry);
|
|
191
|
+
}
|
|
192
|
+
},
|
|
193
|
+
activateRow: (value) => {
|
|
194
|
+
/* The row's own `select` carries its `value`, which is the flat index as the document spelled
|
|
195
|
+
it — a string, because an attribute is what a row's value is. */
|
|
196
|
+
const entry = _matches[Number(value)];
|
|
197
|
+
if (entry) {
|
|
198
|
+
pickEntry(entry);
|
|
199
|
+
}
|
|
200
|
+
},
|
|
201
|
+
activeId: "",
|
|
202
|
+
anchored: false,
|
|
203
|
+
anchorLeft: 0,
|
|
204
|
+
anchorTop: 0,
|
|
205
|
+
close: closeFormulaPalette,
|
|
206
|
+
emptyHint: "",
|
|
207
|
+
expanded: false,
|
|
208
|
+
groups: [],
|
|
209
|
+
hover: (index) => {
|
|
210
|
+
select(index);
|
|
211
|
+
},
|
|
212
|
+
input: (value) => {
|
|
213
|
+
_query = value;
|
|
214
|
+
_selectedIndex = 0;
|
|
215
|
+
project();
|
|
216
|
+
},
|
|
217
|
+
isEmpty: true,
|
|
218
|
+
move: (delta) => {
|
|
219
|
+
/* Nothing to move through, nothing to name. Clamping an empty list lands on index 0, and now
|
|
220
|
+
that the id IS the highlight that would point the field at a row which is not there. */
|
|
221
|
+
if (_matches.length === 0) {
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
select(Math.max(0, Math.min(_selectedIndex + delta, _matches.length - 1)));
|
|
225
|
+
},
|
|
226
|
+
open: false,
|
|
227
|
+
query: "",
|
|
228
|
+
}) as FormulaPaletteScope;
|
|
229
|
+
return _scope;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* Move the highlight without touching the rows, so nothing reconciles on an arrow key.
|
|
234
|
+
*
|
|
235
|
+
* ONE field is written. The listbox turns that id into the active row's `selected`; before the kit
|
|
236
|
+
* owned it, this wrote a second field as well and every row re-decided its own `aria-selected` and
|
|
237
|
+
* `data-selected` against it.
|
|
238
|
+
*/
|
|
239
|
+
function select(index: number): void {
|
|
240
|
+
_selectedIndex = index;
|
|
241
|
+
scope().activeId = optionId(index);
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* Mount the document into the popover slot, once.
|
|
246
|
+
*
|
|
247
|
+
* `getLayerSlot` hands back the same element until something clears it; a different one means the
|
|
248
|
+
* slot this module was rendering into is gone from the layer, and the standing mount goes with it.
|
|
249
|
+
*/
|
|
250
|
+
function ensureMounted(): void {
|
|
251
|
+
const host = getLayerSlot("popover", SLOT);
|
|
252
|
+
if (_host === host) {
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
const stale = _mount;
|
|
256
|
+
_host = host;
|
|
257
|
+
_mount = mountSurface("formula-palette", scope(), host);
|
|
258
|
+
if (stale) {
|
|
259
|
+
void stale.then((handle) => {
|
|
260
|
+
handle.dispose();
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
/** Project the palette's state onto the document's scope. */
|
|
266
|
+
function project(): void {
|
|
267
|
+
const state = scope();
|
|
268
|
+
state.open = _open;
|
|
269
|
+
if (!_open) {
|
|
270
|
+
_matches = [];
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
273
|
+
const entries = filteredEntries();
|
|
274
|
+
_matches = entries;
|
|
275
|
+
state.query = _query;
|
|
276
|
+
state.groups = groupRows(entries);
|
|
277
|
+
state.isEmpty = entries.length === 0;
|
|
278
|
+
state.emptyHint = _query.trim() === "" ? "No entries available" : "No results";
|
|
279
|
+
state.expanded = entries.length > 0;
|
|
280
|
+
/* No rows, no active descendant: an id pointing at a row that is not there is a field claiming a
|
|
281
|
+
highlight a reader would never find. */
|
|
282
|
+
state.activeId = entries.length > 0 ? optionId(_selectedIndex) : "";
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
/**
|
|
286
|
+
* Focus the field once the document has drawn it.
|
|
287
|
+
*
|
|
288
|
+
* The mount settling means the DOCUMENT rendered; the `$switch` on `open` reconciles one microtask
|
|
289
|
+
* later, so the field exists a turn after that — which is why this waits for the mount and then for
|
|
290
|
+
* a turn, rather than reaching for the element straight away.
|
|
291
|
+
*/
|
|
292
|
+
function focusInput(): void {
|
|
293
|
+
const pending = _mount;
|
|
294
|
+
if (!pending) {
|
|
295
|
+
return;
|
|
296
|
+
}
|
|
297
|
+
void pending.then(() => {
|
|
298
|
+
setTimeout(() => {
|
|
299
|
+
if (_open) {
|
|
300
|
+
_host?.querySelector<HTMLInputElement>('[part="input"]')?.focus();
|
|
301
|
+
}
|
|
302
|
+
}, 0);
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
/** Close first, then hand the entry over: the caller usually opens something of its own. */
|
|
307
|
+
function pickEntry(entry: FormulaCatalogEntry): void {
|
|
308
|
+
const opts = _opts;
|
|
309
|
+
closeFormulaPalette();
|
|
310
|
+
opts?.onPick(entry);
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
/**
|
|
314
|
+
* Open the palette over `opts.entries`.
|
|
315
|
+
*
|
|
316
|
+
* @param {FormulaPaletteOpts} opts
|
|
317
|
+
*/
|
|
318
|
+
export function openFormulaPalette(opts: FormulaPaletteOpts): void {
|
|
319
|
+
_open = true;
|
|
320
|
+
_opts = opts;
|
|
321
|
+
_query = "";
|
|
322
|
+
_selectedIndex = 0;
|
|
323
|
+
const state = scope();
|
|
324
|
+
const at = anchorAt(opts.anchor ?? null);
|
|
325
|
+
state.anchorLeft = at?.left ?? 0;
|
|
326
|
+
state.anchorTop = at?.top ?? 0;
|
|
327
|
+
state.anchored = at !== null;
|
|
328
|
+
ensureMounted();
|
|
329
|
+
project();
|
|
330
|
+
focusInput();
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
/** Close the palette. A no-op when it is not up. */
|
|
334
|
+
export function closeFormulaPalette(): void {
|
|
335
|
+
_open = false;
|
|
336
|
+
_opts = null;
|
|
337
|
+
if (_mount) {
|
|
338
|
+
project();
|
|
339
|
+
}
|
|
340
|
+
}
|