@jxsuite/studio 4.1.0 → 5.1.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-qwkm9zrf.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-vj72gqtq.js +20 -0
- package/dist/chunks/content-source-5mex4x1h.js +46 -0
- package/dist/chunks/convert-to-repeater-n64h8znc.js +639 -0
- package/dist/chunks/dialog-s890b918.js +85 -0
- package/dist/chunks/editor-3qhbg51x.js +35 -0
- package/dist/chunks/entry-commands-234hjnqw.js +42 -0
- package/dist/chunks/extension-sections-3hpcambp.js +651 -0
- package/dist/chunks/file-ops-8yhd83xr.js +47 -0
- package/dist/chunks/files-hnxqxtsg.js +72 -0
- package/dist/chunks/format-host-779sfp2n.js +40 -0
- package/dist/chunks/fs-events-b88z7g4h.js +18 -0
- package/dist/chunks/git-panel-xwj8fpab.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-syr0f9sb.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-ff81wthn.js +30 -0
- package/dist/chunks/layers-panel-pnnghw12.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-cqhhxhhe.js +33 -0
- package/dist/chunks/menu-9p2w46gj.js +15 -0
- package/dist/chunks/menu-q99sy9rf.js +285 -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-5zt840sy.js +27 -0
- package/dist/chunks/quick-search-3748564r.js +45 -0
- package/dist/chunks/references-qvvxej7h.js +26 -0
- package/dist/chunks/right-panel-eccz92qt.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-kryvsw6j.js → studio-1k325pwf.js} +48 -48
- package/dist/chunks/{studio-b55y6ewx.js → studio-1knfqgy7.js} +58 -58
- package/dist/chunks/{studio-2b946z26.js → studio-1z1kcjv4.js} +3628 -6095
- package/dist/chunks/studio-3773086z.js +111 -0
- package/dist/chunks/{studio-4r1pv6zf.js → studio-38emantv.js} +22 -5
- package/dist/chunks/{studio-x813zp48.js → studio-3rz5md06.js} +30 -30
- package/dist/chunks/{studio-ynxwkrzd.js → studio-4wbb9ct0.js} +1953 -1785
- package/dist/chunks/studio-5te5tqng.js +81 -0
- package/dist/chunks/studio-5wt9nvhd.js +4763 -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-gcye7qka.js → studio-7e11jpa9.js} +21 -21
- package/dist/chunks/{studio-q7v10cg2.js → studio-7r42c6ca.js} +17 -7
- package/dist/chunks/studio-7xnmgv66.js +13615 -0
- package/dist/chunks/studio-8scdew0e.js +258 -0
- package/dist/chunks/{studio-fbf92ckf.js → studio-93zafjcm.js} +275 -163
- package/dist/chunks/{studio-dg7zyt5x.js → studio-98b3z07n.js} +1 -1
- package/dist/chunks/studio-a79k90n9.js +1162 -0
- package/dist/chunks/studio-aj37eer3.js +422 -0
- package/dist/chunks/studio-b0k5tqgp.js +2432 -0
- package/dist/chunks/studio-b4s9eykd.js +2811 -0
- package/dist/chunks/{studio-f3wqjtk5.js → studio-d0300636.js} +5076 -18
- package/dist/chunks/{studio-b9b6t1dg.js → studio-e1f24eff.js} +5664 -5666
- package/dist/chunks/studio-e1pgga3k.js +839 -0
- package/dist/chunks/{studio-g1wdche0.js → studio-esrxgwh6.js} +80 -80
- package/dist/chunks/{studio-q43a5y9h.js → studio-g3jevyjt.js} +16 -16
- package/dist/chunks/studio-gb13095a.js +2806 -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-x4qkdat5.js → studio-js8nv53n.js} +1749 -2481
- package/dist/chunks/{studio-qjy2z9bv.js → studio-jxp12rnj.js} +32 -137
- package/dist/chunks/{studio-trxrabqf.js → studio-k75n7vhp.js} +527 -283
- package/dist/chunks/{studio-q9jd1a60.js → studio-kcgff4r0.js} +15 -18
- package/dist/chunks/studio-kkqkcp3d.js +17668 -0
- package/dist/chunks/studio-mhhyamxf.js +763 -0
- package/dist/chunks/{studio-cft9r4r7.js → studio-nq5yf5mp.js} +22 -22
- package/dist/chunks/{studio-685s0ytq.js → studio-nqgawfks.js} +572 -572
- package/dist/chunks/studio-nzzpvzx9.js +185 -0
- package/dist/chunks/{studio-xrapxwwc.js → studio-p1dw8wfw.js} +55 -29
- package/dist/chunks/{studio-3bqpr0zh.js → studio-pxbgypmg.js} +299 -110
- package/dist/chunks/studio-q0a3yk4n.js +33 -0
- package/dist/chunks/{studio-wcy8trfx.js → studio-q3x06vmj.js} +23 -22
- package/dist/chunks/{studio-6yw4y3my.js → studio-qhhm6hbt.js} +8 -8
- package/dist/chunks/studio-qk4bfsq2.js +362 -0
- package/dist/chunks/{studio-msd847zn.js → studio-qk90fgqm.js} +361 -90
- package/dist/chunks/{studio-jkftxyvz.js → studio-r6nvacqs.js} +5861 -2154
- package/dist/chunks/{studio-53n8bp04.js → studio-r6xmmtfh.js} +1 -1
- package/dist/chunks/{studio-tvgyw9xw.js → studio-rnyf3f8e.js} +83 -250
- package/dist/chunks/studio-rs76k67r.js +12 -0
- package/dist/chunks/studio-sbjyc8bt.js +954 -0
- package/dist/chunks/{studio-1wagb550.js → studio-syg2tadj.js} +11 -11
- package/dist/chunks/{studio-t5wqwzdh.js → studio-tjjk7jvk.js} +1 -1
- package/dist/chunks/studio-tqgryxwg.js +1171 -0
- package/dist/chunks/studio-try13h8c.js +8448 -0
- package/dist/chunks/studio-vfq8qpjt.js +1219 -0
- package/dist/chunks/studio-vhv5tgxm.js +51 -0
- package/dist/chunks/{studio-ahn3pdgx.js → studio-vw7mzp6z.js} +52 -38
- package/dist/chunks/studio-wqpngpsk.js +174 -0
- package/dist/chunks/studio-wqz6dggm.js +1356 -0
- package/dist/chunks/{studio-92ab2jqe.js → studio-y9zedyjn.js} +14 -14
- package/dist/chunks/studio-yxa81f45.js +12 -0
- package/dist/chunks/studio-zdn2g6dt.js +148 -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-t55jdjbx.js +69 -0
- package/dist/chunks/{ws-client-6shc5rze.js → ws-client-ny4zc51r.js} +20 -22
- package/dist/iframe-entry.js +1873 -673
- package/dist/studio.js +52757 -36535
- 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 +333 -113
- 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 +404 -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 +177 -10
- package/src/commands/run-reported.ts +120 -0
- 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 +76 -49
- package/src/editor/slash-menu.ts +150 -157
- package/src/files/components.ts +39 -0
- package/src/files/file-ops.ts +117 -11
- package/src/files/files.ts +944 -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 +137 -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/packages/pull-package-sync.ts +5 -1
- 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 +213 -185
- package/src/panels/block-action-bar.ts +444 -645
- 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 +148 -135
- package/src/panels/imports-panel.ts +388 -414
- package/src/panels/jump-bar.ts +175 -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 +181 -99
- package/src/panels/properties-panel.ts +1525 -966
- package/src/panels/provenance.ts +31 -113
- package/src/panels/quick-search.ts +223 -184
- package/src/panels/right-panel.ts +135 -169
- package/src/panels/seo-modal.ts +346 -167
- package/src/panels/settings-menu.ts +114 -661
- 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 +386 -288
- 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 +538 -0
- package/src/services/ai-project-tools.ts +8 -2
- package/src/services/ai-session-store.ts +6 -0
- package/src/services/ai-system-prompt.ts +112 -24
- package/src/services/ai-tools.ts +36 -212
- package/src/services/ai-write-report.ts +174 -0
- package/src/services/document-assistant.ts +59 -8
- 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 +104 -69
- 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 +985 -0
- package/src/{panels/toolbar.ts → surfaces/commandbar.ts} +417 -391
- 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 +164 -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 +111 -21
- 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 +296 -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 +75 -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-bgxt93ga.js +0 -62
- 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
|
@@ -30,21 +30,22 @@
|
|
|
30
30
|
* find-replace in those two call sites.
|
|
31
31
|
*/
|
|
32
32
|
|
|
33
|
-
import { html, render as litRender, nothing } from "lit-html";
|
|
34
|
-
import { classMap } from "lit-html/directives/class-map.js";
|
|
35
|
-
import { live } from "lit-html/directives/live.js";
|
|
36
|
-
import { ref } from "lit-html/directives/ref.js";
|
|
37
33
|
import { getPlatform } from "../platform";
|
|
38
34
|
import { flattenTree, nodeLabel, projectState } from "../store";
|
|
39
35
|
import { documentExtensions, formatByExtension, loadFormats } from "../format/format-host";
|
|
40
36
|
import { openFileInTab } from "../files/files";
|
|
41
37
|
import { getRecentFiles, getRecentProjects, trackRecentFile } from "../recent-projects";
|
|
42
38
|
import { getLayerSlot } from "../ui/layers";
|
|
39
|
+
import { mountSurface, registerSurface } from "../ui/surface";
|
|
40
|
+
import { reactive } from "../reactivity";
|
|
41
|
+
import paletteDoc from "../surfaces/palette.json";
|
|
43
42
|
import { activeTab } from "../workspace/workspace";
|
|
44
43
|
import { activeRegistry } from "../commands/active-registry";
|
|
44
|
+
import { runActiveReported, runReported } from "../commands/run-reported";
|
|
45
45
|
import type { PaletteMode } from "../commands/defaults";
|
|
46
46
|
import type { AnyCommand, CommandRegistry } from "../commands/registry";
|
|
47
|
-
import type { JxMutableNode } from "@jxsuite/schema/types";
|
|
47
|
+
import type { JxDocument, JxMutableNode } from "@jxsuite/schema/types";
|
|
48
|
+
import type { SurfaceHandle } from "../ui/surface";
|
|
48
49
|
import type { JxPath } from "../state";
|
|
49
50
|
|
|
50
51
|
export type { PaletteMode } from "../commands/defaults";
|
|
@@ -283,9 +284,15 @@ export function paletteArgs(command: AnyCommand): PaletteArgs {
|
|
|
283
284
|
* the literal string `"true"`, which claims a popup is showing even when the query matched
|
|
284
285
|
* nothing.
|
|
285
286
|
*/
|
|
286
|
-
const QUICK_SEARCH_LISTBOX_ID = "quick-search-listbox";
|
|
287
287
|
|
|
288
|
-
/**
|
|
288
|
+
/**
|
|
289
|
+
* A stable per-row id — the ONE string the highlight is, written once.
|
|
290
|
+
*
|
|
291
|
+
* The field points `aria-activedescendant` at it and the `jx-listbox` is handed the same string as
|
|
292
|
+
* `active`; the listbox's sidecar is what turns it into the row's `selected`. The document spells
|
|
293
|
+
* the same id on each row, which is what makes the reference resolve without either side reading
|
|
294
|
+
* the other.
|
|
295
|
+
*/
|
|
289
296
|
function optionId(index: number): string {
|
|
290
297
|
return `quick-search-option-${index}`;
|
|
291
298
|
}
|
|
@@ -409,6 +416,7 @@ export function openQuickSearch(mode: PaletteMode = "files") {
|
|
|
409
416
|
_pending = null;
|
|
410
417
|
_files = null;
|
|
411
418
|
renderOverlay();
|
|
419
|
+
focusInput();
|
|
412
420
|
void ensureFiles();
|
|
413
421
|
}
|
|
414
422
|
|
|
@@ -617,8 +625,7 @@ function currentRows(): { rows: PaletteRow[]; showingRecent: boolean } {
|
|
|
617
625
|
|
|
618
626
|
// ─── Interaction ──────────────────────────────────────────────────────────────
|
|
619
627
|
|
|
620
|
-
function onInput(
|
|
621
|
-
const raw = (e.target as HTMLInputElement).value;
|
|
628
|
+
function onInput(raw: string) {
|
|
622
629
|
const prefixed = PREFIXED_MODES.find((spec) => raw.startsWith(spec.prefix));
|
|
623
630
|
if (prefixed) {
|
|
624
631
|
// The prefix moves OUT of the input and into the chip, so the query the user reads back is the
|
|
@@ -629,6 +636,15 @@ function onInput(e: Event) {
|
|
|
629
636
|
_query = raw;
|
|
630
637
|
}
|
|
631
638
|
_selectedIndex = 0;
|
|
639
|
+
if (raw !== _query) {
|
|
640
|
+
// The field and the query have PARTED: the prefix moved to the chip, and `_query` may be
|
|
641
|
+
// Exactly what it already was — typing `>` into an empty field leaves both "". A binding only
|
|
642
|
+
// Re-runs when what it reads CHANGES, so nothing would rewrite the field, it would keep the
|
|
643
|
+
// `>` the state discarded, and the next keystroke would be parsed as a prefixed one all over
|
|
644
|
+
// Again. Announcing the raw text first makes the projection below a change the binding can
|
|
645
|
+
// See; the runtime skips a write equal to the live element, so the field still lands in one.
|
|
646
|
+
scope().query = raw;
|
|
647
|
+
}
|
|
632
648
|
renderOverlay();
|
|
633
649
|
void ensureFiles();
|
|
634
650
|
}
|
|
@@ -641,48 +657,6 @@ function clearMode() {
|
|
|
641
657
|
renderOverlay();
|
|
642
658
|
}
|
|
643
659
|
|
|
644
|
-
function onKeydown(e: KeyboardEvent) {
|
|
645
|
-
const { rows } = currentRows();
|
|
646
|
-
switch (e.key) {
|
|
647
|
-
case "ArrowDown": {
|
|
648
|
-
e.preventDefault();
|
|
649
|
-
_selectedIndex = Math.min(_selectedIndex + 1, rows.length - 1);
|
|
650
|
-
renderOverlay();
|
|
651
|
-
break;
|
|
652
|
-
}
|
|
653
|
-
case "ArrowUp": {
|
|
654
|
-
e.preventDefault();
|
|
655
|
-
_selectedIndex = Math.max(_selectedIndex - 1, 0);
|
|
656
|
-
renderOverlay();
|
|
657
|
-
break;
|
|
658
|
-
}
|
|
659
|
-
case "Enter": {
|
|
660
|
-
e.preventDefault();
|
|
661
|
-
if (rows[_selectedIndex]) {
|
|
662
|
-
selectRow(rows[_selectedIndex]!);
|
|
663
|
-
}
|
|
664
|
-
break;
|
|
665
|
-
}
|
|
666
|
-
case "Backspace": {
|
|
667
|
-
// At position zero the chip is the thing to the left of the caret, so this is the same
|
|
668
|
-
// Gesture as deleting a character — and it is why the chip is removable at all.
|
|
669
|
-
if (_query === "" && (_pending || _requested !== "picker")) {
|
|
670
|
-
e.preventDefault();
|
|
671
|
-
clearMode();
|
|
672
|
-
}
|
|
673
|
-
break;
|
|
674
|
-
}
|
|
675
|
-
case "Escape": {
|
|
676
|
-
e.preventDefault();
|
|
677
|
-
closeQuickSearch();
|
|
678
|
-
break;
|
|
679
|
-
}
|
|
680
|
-
default: {
|
|
681
|
-
break;
|
|
682
|
-
}
|
|
683
|
-
}
|
|
684
|
-
}
|
|
685
|
-
|
|
686
660
|
function enterMode(mode: PaletteMode) {
|
|
687
661
|
_requested = mode;
|
|
688
662
|
_query = "";
|
|
@@ -698,17 +672,11 @@ function runCommand(command: AnyCommand, args?: Record<string, unknown>) {
|
|
|
698
672
|
}
|
|
699
673
|
trackRecentCommand(command.id);
|
|
700
674
|
closeQuickSearch();
|
|
701
|
-
|
|
702
|
-
console.error(`palette: command "${command.id}" failed`, error);
|
|
703
|
-
};
|
|
704
|
-
// Both shapes, deliberately: `run` may throw synchronously (a coercion refusal from
|
|
675
|
+
// Both shapes, through the one helper: `run` may throw synchronously (a coercion refusal from
|
|
705
676
|
// `command-args.ts` does) or reject later. A palette that let either escape would take the
|
|
706
|
-
// Keydown listener down with it, and the overlay is already closed by then
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
} catch (error) {
|
|
710
|
-
report(error);
|
|
711
|
-
}
|
|
677
|
+
// Keydown listener down with it, and the overlay is already closed by then — and a refusal that
|
|
678
|
+
// Went to the console, as this one did, was read by nobody. Problems is where it is read.
|
|
679
|
+
void runReported(registry, command.id, args, "Palette");
|
|
712
680
|
}
|
|
713
681
|
|
|
714
682
|
function selectRow(row: PaletteRow) {
|
|
@@ -729,9 +697,8 @@ function selectRow(row: PaletteRow) {
|
|
|
729
697
|
return;
|
|
730
698
|
}
|
|
731
699
|
case "node": {
|
|
732
|
-
const registry = activeRegistry();
|
|
733
700
|
closeQuickSearch();
|
|
734
|
-
void
|
|
701
|
+
void runActiveReported("selection.set", { path: row.path }, "Palette");
|
|
735
702
|
return;
|
|
736
703
|
}
|
|
737
704
|
case "arg": {
|
|
@@ -765,74 +732,73 @@ function selectCommandRow(row: CommandRow) {
|
|
|
765
732
|
|
|
766
733
|
// ─── Rendering ────────────────────────────────────────────────────────────────
|
|
767
734
|
|
|
768
|
-
|
|
735
|
+
/** The kit glyph a file row draws, by extension. */
|
|
736
|
+
function fileIcon(name: string): string {
|
|
769
737
|
const ext = name.split(".").pop()?.toLowerCase();
|
|
770
738
|
if (ext === "json") {
|
|
771
|
-
return
|
|
739
|
+
return "file-code";
|
|
772
740
|
}
|
|
773
741
|
if (ext && formatByExtension(ext)) {
|
|
774
|
-
return
|
|
742
|
+
return "file-text";
|
|
775
743
|
}
|
|
776
|
-
return
|
|
744
|
+
return "file";
|
|
777
745
|
}
|
|
778
746
|
|
|
779
|
-
function rowIcon(row: PaletteRow) {
|
|
747
|
+
function rowIcon(row: PaletteRow): string {
|
|
780
748
|
switch (row.kind) {
|
|
781
749
|
case "project": {
|
|
782
|
-
return
|
|
750
|
+
return "folder-open";
|
|
783
751
|
}
|
|
784
752
|
case "file": {
|
|
785
753
|
return fileIcon(row.name);
|
|
786
754
|
}
|
|
787
755
|
case "command": {
|
|
788
|
-
return
|
|
756
|
+
return "play";
|
|
789
757
|
}
|
|
790
758
|
case "node": {
|
|
791
|
-
return
|
|
759
|
+
return "stack";
|
|
792
760
|
}
|
|
793
761
|
default: {
|
|
794
|
-
return
|
|
762
|
+
return "caret-right";
|
|
795
763
|
}
|
|
796
764
|
}
|
|
797
765
|
}
|
|
798
766
|
|
|
799
|
-
/**
|
|
800
|
-
function rowTrailing(row: PaletteRow, showingRecent: boolean) {
|
|
801
|
-
if (row.kind === "command" && row.chord) {
|
|
802
|
-
return
|
|
803
|
-
}
|
|
804
|
-
if (row.kind === "mode" && row.chord) {
|
|
805
|
-
return html`<kbd class="palette-chord">${row.chord}</kbd>`;
|
|
767
|
+
/** What a row prints at its right edge: its chord, a recent badge, or nothing. */
|
|
768
|
+
function rowTrailing(row: PaletteRow, showingRecent: boolean): "chord" | "recent" | "none" {
|
|
769
|
+
if ((row.kind === "command" || row.kind === "mode") && row.chord) {
|
|
770
|
+
return "chord";
|
|
806
771
|
}
|
|
807
772
|
if (row.kind === "command" && row.recent) {
|
|
808
|
-
return
|
|
809
|
-
}
|
|
810
|
-
return showingRecent ?
|
|
811
|
-
}
|
|
812
|
-
|
|
813
|
-
/**
|
|
814
|
-
function
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
}
|
|
834
|
-
|
|
835
|
-
|
|
773
|
+
return "recent";
|
|
774
|
+
}
|
|
775
|
+
return showingRecent ? "recent" : "none";
|
|
776
|
+
}
|
|
777
|
+
|
|
778
|
+
/** A row's identity across renders, so the keyed list keeps its nodes while the ranking moves. */
|
|
779
|
+
function rowKey(row: PaletteRow): string {
|
|
780
|
+
switch (row.kind) {
|
|
781
|
+
case "project": {
|
|
782
|
+
return `project:${row.root}`;
|
|
783
|
+
}
|
|
784
|
+
case "file": {
|
|
785
|
+
return `file:${row.path}`;
|
|
786
|
+
}
|
|
787
|
+
case "command": {
|
|
788
|
+
return `command:${row.id}`;
|
|
789
|
+
}
|
|
790
|
+
case "node": {
|
|
791
|
+
return `node:${row.path.join("/")}`;
|
|
792
|
+
}
|
|
793
|
+
case "mode": {
|
|
794
|
+
return `mode:${row.mode}`;
|
|
795
|
+
}
|
|
796
|
+
default: {
|
|
797
|
+
return `arg:${row.value}`;
|
|
798
|
+
}
|
|
799
|
+
}
|
|
800
|
+
}
|
|
801
|
+
|
|
836
802
|
function emptyHint(mode: PaletteMode, query: string): string {
|
|
837
803
|
if (_loading) {
|
|
838
804
|
return "Reading the project's files…";
|
|
@@ -856,94 +822,167 @@ function emptyHint(mode: PaletteMode, query: string): string {
|
|
|
856
822
|
}
|
|
857
823
|
}
|
|
858
824
|
|
|
825
|
+
/** One row, as `surfaces/palette.json` draws it. */
|
|
826
|
+
export interface PaletteRowProjection {
|
|
827
|
+
key: string;
|
|
828
|
+
kind: PaletteRow["kind"];
|
|
829
|
+
name: string;
|
|
830
|
+
detail: string;
|
|
831
|
+
icon: string;
|
|
832
|
+
disabled: boolean;
|
|
833
|
+
trailing: "chord" | "recent" | "none";
|
|
834
|
+
chord: string;
|
|
835
|
+
}
|
|
836
|
+
|
|
837
|
+
interface PaletteScope extends Record<string, unknown> {
|
|
838
|
+
open: boolean;
|
|
839
|
+
hasChip: boolean;
|
|
840
|
+
chipLabel: string;
|
|
841
|
+
placeholder: string;
|
|
842
|
+
query: string;
|
|
843
|
+
expanded: boolean;
|
|
844
|
+
/**
|
|
845
|
+
* The highlighted row's element id — the field's `aria-activedescendant` AND the listbox's
|
|
846
|
+
* `active`, which is the one string this surface writes to move the caret. `""` when there is no
|
|
847
|
+
* row to put it on.
|
|
848
|
+
*/
|
|
849
|
+
activeId: string;
|
|
850
|
+
rows: PaletteRowProjection[];
|
|
851
|
+
isEmpty: boolean;
|
|
852
|
+
emptyHint: string;
|
|
853
|
+
showSection: boolean;
|
|
854
|
+
sectionLabel: string;
|
|
855
|
+
canClearMode: boolean;
|
|
856
|
+
close: () => void;
|
|
857
|
+
input: (value: string) => void;
|
|
858
|
+
move: (delta: number) => void;
|
|
859
|
+
activate: () => void;
|
|
860
|
+
clearMode: () => void;
|
|
861
|
+
hover: (index: number) => void;
|
|
862
|
+
activateRow: (value: unknown) => void;
|
|
863
|
+
}
|
|
864
|
+
|
|
865
|
+
registerSurface("palette", paletteDoc as unknown as JxDocument);
|
|
866
|
+
|
|
867
|
+
let _scope: PaletteScope | null = null;
|
|
868
|
+
let _mount: Promise<SurfaceHandle> | null = null;
|
|
869
|
+
/** The rows as last projected, so a key or a click addresses the row the reader sees. */
|
|
870
|
+
let _rows: PaletteRow[] = [];
|
|
871
|
+
|
|
872
|
+
/** The document's scope: what it draws, and the six things a gesture can ask for. */
|
|
873
|
+
function scope(): PaletteScope {
|
|
874
|
+
_scope ??= reactive<PaletteScope>({
|
|
875
|
+
activate: () => {
|
|
876
|
+
const row = _rows[_selectedIndex];
|
|
877
|
+
if (row) {
|
|
878
|
+
selectRow(row);
|
|
879
|
+
}
|
|
880
|
+
},
|
|
881
|
+
activateRow: (value) => {
|
|
882
|
+
/* The row's own `select` carries its `value`, which is the index the document spelled — a
|
|
883
|
+
string, because an attribute is what a row's value is. */
|
|
884
|
+
const row = _rows[Number(value)];
|
|
885
|
+
if (row) {
|
|
886
|
+
selectRow(row);
|
|
887
|
+
}
|
|
888
|
+
},
|
|
889
|
+
activeId: "",
|
|
890
|
+
canClearMode: false,
|
|
891
|
+
chipLabel: "",
|
|
892
|
+
clearMode,
|
|
893
|
+
close: closeQuickSearch,
|
|
894
|
+
emptyHint: "",
|
|
895
|
+
expanded: false,
|
|
896
|
+
hasChip: false,
|
|
897
|
+
hover: (index) => {
|
|
898
|
+
_selectedIndex = index;
|
|
899
|
+
scope().activeId = optionId(index);
|
|
900
|
+
},
|
|
901
|
+
input: onInput,
|
|
902
|
+
isEmpty: true,
|
|
903
|
+
move: (delta) => {
|
|
904
|
+
/* ONE field, and the rows are not among the things it touches: the listbox is handed the id
|
|
905
|
+
and its sidecar moves every row's `selected`. Arrow keys CLAMP rather than wrap — the kit's
|
|
906
|
+
combobox wraps, and this list is a ranking whose first row is the answer, so falling off
|
|
907
|
+
the bottom onto it would undo the search. */
|
|
908
|
+
if (_rows.length === 0) {
|
|
909
|
+
/* Nothing to move through, nothing to name. Clamping an empty list lands on index 0, and
|
|
910
|
+
now that the id IS the highlight that would point the field at a row which is not
|
|
911
|
+
there. */
|
|
912
|
+
return;
|
|
913
|
+
}
|
|
914
|
+
_selectedIndex = Math.max(0, Math.min(_selectedIndex + delta, _rows.length - 1));
|
|
915
|
+
scope().activeId = optionId(_selectedIndex);
|
|
916
|
+
},
|
|
917
|
+
open: false,
|
|
918
|
+
placeholder: "",
|
|
919
|
+
query: "",
|
|
920
|
+
rows: [],
|
|
921
|
+
sectionLabel: "",
|
|
922
|
+
showSection: false,
|
|
923
|
+
}) as PaletteScope;
|
|
924
|
+
return _scope;
|
|
925
|
+
}
|
|
926
|
+
|
|
927
|
+
/** Focus the field once the document has drawn it: a turn later than the open, never sooner. */
|
|
928
|
+
function focusInput(): void {
|
|
929
|
+
setTimeout(() => {
|
|
930
|
+
if (_open) {
|
|
931
|
+
getContainer().querySelector<HTMLInputElement>('[part="input"]')?.focus();
|
|
932
|
+
}
|
|
933
|
+
}, 0);
|
|
934
|
+
}
|
|
935
|
+
|
|
936
|
+
/**
|
|
937
|
+
* Project the palette's state onto the document's scope.
|
|
938
|
+
*
|
|
939
|
+
* The rows and the highlight are separate fields on purpose: a key moves `activeId` and nothing
|
|
940
|
+
* else, while `rows` changes only when the query or the mode does and the keyed list reconciles.
|
|
941
|
+
* The kit's `jx-listbox` is handed that one id as `active` and its sidecar is the single writer of
|
|
942
|
+
* every `jx-option`'s `selected` — so the highlight costs one attribute write on the list rather
|
|
943
|
+
* than a per-row comparison, and the row a reader hears is the row the field named.
|
|
944
|
+
*/
|
|
859
945
|
function renderOverlay() {
|
|
860
|
-
const
|
|
946
|
+
const state = scope();
|
|
947
|
+
if (!_mount) {
|
|
948
|
+
_mount = mountSurface("palette", state, getContainer());
|
|
949
|
+
}
|
|
950
|
+
state.open = _open;
|
|
861
951
|
if (!_open) {
|
|
862
|
-
|
|
952
|
+
_rows = [];
|
|
863
953
|
return;
|
|
864
954
|
}
|
|
865
|
-
|
|
866
955
|
const { mode, query } = current();
|
|
867
956
|
const { rows, showingRecent } = currentRows();
|
|
868
957
|
const spec = modeSpec(mode);
|
|
869
|
-
|
|
870
|
-
|
|
958
|
+
_rows = rows;
|
|
959
|
+
state.placeholder = _pending ? `Choose a ${_pending.name}…` : spec.placeholder;
|
|
960
|
+
state.hasChip = _pending !== null || mode !== "picker";
|
|
961
|
+
state.chipLabel = _pending ? _pending.command.title : spec.chip;
|
|
962
|
+
state.query = _query;
|
|
963
|
+
state.canClearMode = _query === "" && (_pending !== null || _requested !== "picker");
|
|
964
|
+
state.rows = rows.map((row) => ({
|
|
965
|
+
chord: (row.kind === "command" || row.kind === "mode") && row.chord ? row.chord : "",
|
|
966
|
+
detail: row.detail,
|
|
967
|
+
disabled: row.kind === "command" && !row.enabled,
|
|
968
|
+
icon: rowIcon(row),
|
|
969
|
+
key: rowKey(row),
|
|
970
|
+
kind: row.kind,
|
|
971
|
+
name: row.name,
|
|
972
|
+
trailing: rowTrailing(row, showingRecent),
|
|
973
|
+
}));
|
|
974
|
+
state.expanded = rows.length > 0;
|
|
975
|
+
/* No rows, no active descendant: an id pointing at a row that is not there is a field claiming a
|
|
976
|
+
highlight a reader would never find. */
|
|
977
|
+
state.activeId = rows.length > 0 ? optionId(_selectedIndex) : "";
|
|
978
|
+
state.isEmpty = rows.length === 0;
|
|
979
|
+
state.emptyHint = emptyHint(mode, query);
|
|
980
|
+
state.showSection = showingRecent && rows.length > 0;
|
|
981
|
+
state.sectionLabel = _pending
|
|
871
982
|
? `${_pending.command.title} — ${_pending.name}`
|
|
872
983
|
: mode === "projects"
|
|
873
984
|
? "Recent projects"
|
|
874
985
|
: mode === "commands"
|
|
875
986
|
? "Recently used"
|
|
876
987
|
: "Recently opened";
|
|
877
|
-
|
|
878
|
-
const tpl = html`
|
|
879
|
-
<div class="quick-search-overlay" @click=${closeQuickSearch}>
|
|
880
|
-
<div class="quick-search-panel" @click=${(e: Event) => e.stopPropagation()}>
|
|
881
|
-
<div class="palette-input-row">
|
|
882
|
-
${chipTemplate(mode)}
|
|
883
|
-
<input
|
|
884
|
-
class="quick-search-input"
|
|
885
|
-
type="text"
|
|
886
|
-
role="combobox"
|
|
887
|
-
aria-controls=${QUICK_SEARCH_LISTBOX_ID}
|
|
888
|
-
aria-expanded=${rows.length > 0}
|
|
889
|
-
aria-activedescendant=${rows.length > 0 ? optionId(_selectedIndex) : nothing}
|
|
890
|
-
aria-autocomplete="list"
|
|
891
|
-
aria-label=${placeholder}
|
|
892
|
-
placeholder=${placeholder}
|
|
893
|
-
.value=${live(_query)}
|
|
894
|
-
@input=${onInput}
|
|
895
|
-
@keydown=${onKeydown}
|
|
896
|
-
${ref((el) => {
|
|
897
|
-
if (el) {
|
|
898
|
-
requestAnimationFrame(() => (el as HTMLInputElement).focus());
|
|
899
|
-
}
|
|
900
|
-
})}
|
|
901
|
-
/>
|
|
902
|
-
</div>
|
|
903
|
-
<div class="quick-search-results" role="listbox" id=${QUICK_SEARCH_LISTBOX_ID}>
|
|
904
|
-
${
|
|
905
|
-
rows.length === 0
|
|
906
|
-
? html`<div class="quick-search-empty">${emptyHint(mode, query)}</div>`
|
|
907
|
-
: nothing
|
|
908
|
-
}
|
|
909
|
-
${
|
|
910
|
-
showingRecent && rows.length > 0
|
|
911
|
-
? html`<div class="quick-search-section-label">${sectionLabel}</div>`
|
|
912
|
-
: nothing
|
|
913
|
-
}
|
|
914
|
-
${rows.map(
|
|
915
|
-
(row, i) => html`
|
|
916
|
-
<div
|
|
917
|
-
class=${classMap({
|
|
918
|
-
"quick-search-item": true,
|
|
919
|
-
disabled: row.kind === "command" && !row.enabled,
|
|
920
|
-
selected: i === _selectedIndex,
|
|
921
|
-
})}
|
|
922
|
-
role="option"
|
|
923
|
-
id=${optionId(i)}
|
|
924
|
-
aria-selected=${i === _selectedIndex}
|
|
925
|
-
aria-disabled=${row.kind === "command" && !row.enabled}
|
|
926
|
-
@click=${() => selectRow(row)}
|
|
927
|
-
@mouseenter=${() => {
|
|
928
|
-
_selectedIndex = i;
|
|
929
|
-
renderOverlay();
|
|
930
|
-
}}
|
|
931
|
-
>
|
|
932
|
-
<span class="quick-search-icon">${rowIcon(row)}</span>
|
|
933
|
-
<span class="quick-search-name">${row.name}</span>
|
|
934
|
-
<span class="quick-search-path">${row.detail}</span>
|
|
935
|
-
${rowTrailing(row, showingRecent)}
|
|
936
|
-
</div>
|
|
937
|
-
`,
|
|
938
|
-
)}
|
|
939
|
-
</div>
|
|
940
|
-
<div class="palette-hint">
|
|
941
|
-
<kbd>↑↓</kbd> move · <kbd>↵</kbd> run · <kbd>?</kbd> modes · <kbd>></kbd> commands ·
|
|
942
|
-
<kbd>@</kbd> elements
|
|
943
|
-
</div>
|
|
944
|
-
</div>
|
|
945
|
-
</div>
|
|
946
|
-
`;
|
|
947
|
-
|
|
948
|
-
litRender(tpl, container);
|
|
949
988
|
}
|