@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
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/// <reference lib="dom" />
|
|
2
|
+
/**
|
|
3
|
+
* The Extensions row model — what this project could turn on, what it has, and what is on.
|
|
4
|
+
*
|
|
5
|
+
* Its own module because BOTH the section that renders the rows and the commands that act on them
|
|
6
|
+
* need it, and one shared definition is what keeps "what the switch shows" and "what the verb
|
|
7
|
+
* refuses" a single answer. It is also what stops the two forming an import cycle.
|
|
8
|
+
*
|
|
9
|
+
* Three sources, and the split is the point: the catalogue says what is OFFERED, the package list
|
|
10
|
+
* says what is HERE, and `project.json` says what is ON. None can answer for the others, which is
|
|
11
|
+
* why the row carries all three rather than a single "state".
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { getExtensionCatalog, getExtensions } from "../format/format-host";
|
|
15
|
+
import { projectState } from "../store";
|
|
16
|
+
import type { PackageInfo } from "../types";
|
|
17
|
+
import type { ProjectConfig } from "@jxsuite/schema/types";
|
|
18
|
+
|
|
19
|
+
/** Where a row came from — decides its group heading and whether Remove is offered. */
|
|
20
|
+
export type ExtensionOrigin = "catalog" | "installed" | "configured";
|
|
21
|
+
|
|
22
|
+
/** One rendered row: an offer, its state in this project, and why it may not be actionable. */
|
|
23
|
+
export interface ExtensionRow {
|
|
24
|
+
/** Package name — the row key, and what addPackage/removePackage take. */
|
|
25
|
+
name: string;
|
|
26
|
+
/** The string that is (or would be) in `project.json` `extensions[]`. */
|
|
27
|
+
specifier: string;
|
|
28
|
+
title: string;
|
|
29
|
+
description?: string | undefined;
|
|
30
|
+
/** `project.json` keys this extension owns. */
|
|
31
|
+
sections: string[];
|
|
32
|
+
origin: ExtensionOrigin;
|
|
33
|
+
enabled: boolean;
|
|
34
|
+
installed: boolean;
|
|
35
|
+
/** The host resolves it without a project install, so enabling is a config write alone. */
|
|
36
|
+
bundled: boolean;
|
|
37
|
+
/** Why this backend cannot run it, as one sentence. Absent means it can. */
|
|
38
|
+
unavailable?: string | undefined;
|
|
39
|
+
/** Enabled but not installed — the state that fails the next build. */
|
|
40
|
+
broken: boolean;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** The live project configuration, or an empty one before a project is open. */
|
|
44
|
+
export function projectConfig(): ProjectConfig {
|
|
45
|
+
return (projectState?.projectConfig ?? {}) as ProjectConfig;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** The specifiers `project.json` currently enables. */
|
|
49
|
+
export function enabledSpecifiers(): string[] {
|
|
50
|
+
return projectConfig().extensions ?? [];
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Compose the rows.
|
|
55
|
+
*
|
|
56
|
+
* `sections` for an ENABLED row comes from the extensions payload, because the backend resolved
|
|
57
|
+
* that one for real; for an offer it comes from the catalogue, which is the only source that can
|
|
58
|
+
* describe a package the project has not installed yet.
|
|
59
|
+
*
|
|
60
|
+
* @param {PackageInfo[] | null} packages - The project's dependencies, when they have been read
|
|
61
|
+
* @returns {ExtensionRow[]}
|
|
62
|
+
*/
|
|
63
|
+
export function buildRows(packages: PackageInfo[] | null = null): ExtensionRow[] {
|
|
64
|
+
const enabled = new Set(enabledSpecifiers());
|
|
65
|
+
const installed = new Set((packages ?? []).map((p) => p.name));
|
|
66
|
+
const resolved = new Map(getExtensions().map((e) => [e.name, e]));
|
|
67
|
+
const rows: ExtensionRow[] = [];
|
|
68
|
+
|
|
69
|
+
for (const entry of getExtensionCatalog()) {
|
|
70
|
+
const specifier = entry.specifier ?? entry.name;
|
|
71
|
+
const here = entry.installed ?? installed.has(entry.name);
|
|
72
|
+
const bundled = entry.bundled ?? false;
|
|
73
|
+
const info = resolved.get(entry.name);
|
|
74
|
+
rows.push({
|
|
75
|
+
broken: enabled.has(specifier) && !here && !bundled,
|
|
76
|
+
bundled,
|
|
77
|
+
enabled: enabled.has(specifier),
|
|
78
|
+
installed: here,
|
|
79
|
+
name: entry.name,
|
|
80
|
+
origin: entry.source === "first-party" ? "catalog" : "installed",
|
|
81
|
+
sections: info
|
|
82
|
+
? info.contributions.map((c) => c.project.key)
|
|
83
|
+
: entry.sections.map((s) => s.key),
|
|
84
|
+
specifier,
|
|
85
|
+
title: entry.title ?? entry.name,
|
|
86
|
+
...(entry.description === undefined ? {} : { description: entry.description }),
|
|
87
|
+
...(entry.problem === undefined ? {} : { unavailable: entry.problem }),
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Anything project.json names that the backend did not describe. It can still be turned OFF,
|
|
92
|
+
// Which is what matters most for exactly the rows nothing can explain.
|
|
93
|
+
for (const specifier of enabled) {
|
|
94
|
+
if (rows.some((row) => row.specifier === specifier)) {
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
const info = resolved.get(specifier);
|
|
98
|
+
rows.push({
|
|
99
|
+
broken: !installed.has(specifier) && info === undefined,
|
|
100
|
+
bundled: false,
|
|
101
|
+
enabled: true,
|
|
102
|
+
installed: installed.has(specifier),
|
|
103
|
+
name: specifier,
|
|
104
|
+
origin: "configured",
|
|
105
|
+
sections: info ? info.contributions.map((c) => c.project.key) : [],
|
|
106
|
+
specifier,
|
|
107
|
+
title: info?.title ?? specifier,
|
|
108
|
+
...(info?.description === undefined ? {} : { description: info.description }),
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
return rows;
|
|
113
|
+
}
|
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
/// <reference lib="dom" />
|
|
2
|
+
/**
|
|
3
|
+
* The Extensions section of Project Settings — what this project can turn on, and what it has.
|
|
4
|
+
*
|
|
5
|
+
* **The section exists because enabling an extension is two writes, and nothing kept them
|
|
6
|
+
* together.** A project names an extension in `project.json` `extensions[]`, and the package has to
|
|
7
|
+
* be a dependency for the registry to resolve it. The section this replaces wrote only the first,
|
|
8
|
+
* so typing a name that was not installed appended a string and the next build threw `Extension "…"
|
|
9
|
+
* is not resolvable`. A toggle here does both halves, in the one order that cannot leave the
|
|
10
|
+
* project broken (see `enableExtension`).
|
|
11
|
+
*
|
|
12
|
+
* **What is offered comes from the backend, not from a list here.** Not every host can run every
|
|
13
|
+
* extension — a Worker ships a fixed set of packages (specs/extensions.md §5.5) — so the catalogue
|
|
14
|
+
* is a platform capability, and a host that cannot answer simply offers nothing. That is also why
|
|
15
|
+
* there is no `@jxsuite/` prefix test below: which extensions are first-party is the backend's
|
|
16
|
+
* answer, and a second definition of it here would be wrong for a fork.
|
|
17
|
+
*
|
|
18
|
+
* **The markup left.** The section is the `settings-extensions` surface
|
|
19
|
+
* (`surfaces/settings-extensions.json`), mounted by `surfaces/settings-extensions.ts`; what is here
|
|
20
|
+
* is what was always this module's — what the three sources add up to, which sentence a row's state
|
|
21
|
+
* deserves, why a control cannot be used, and what a failed operation says.
|
|
22
|
+
* `renderExtensionsSection` is unchanged as a contract: the registry hands a container to a
|
|
23
|
+
* `render`, and this one mounts a document into it instead of rendering lit.
|
|
24
|
+
*
|
|
25
|
+
* @docs studio/projects/settings
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
import { errorMessage } from "@jxsuite/schema/parse";
|
|
29
|
+
import { buildRows } from "./extension-rows";
|
|
30
|
+
import { getPlatform } from "../platform";
|
|
31
|
+
import {
|
|
32
|
+
disableExtension,
|
|
33
|
+
enableExtension,
|
|
34
|
+
extensionOpInFlight,
|
|
35
|
+
removeExtensionPackage,
|
|
36
|
+
} from "./extension-commands";
|
|
37
|
+
import { mountExtensionsSurface } from "../surfaces/settings-extensions";
|
|
38
|
+
import type { ExtensionOrigin, ExtensionRow } from "./extension-rows";
|
|
39
|
+
import type {
|
|
40
|
+
ExtensionGroupView,
|
|
41
|
+
ExtensionRowView,
|
|
42
|
+
ExtensionsActions,
|
|
43
|
+
ExtensionsSurfaceHandle,
|
|
44
|
+
ExtensionsView,
|
|
45
|
+
} from "../surfaces/settings-extensions";
|
|
46
|
+
import type { PackageInfo } from "../types";
|
|
47
|
+
|
|
48
|
+
/** Group headings, in render order, each with the sentence that says what the group is. */
|
|
49
|
+
const GROUPS: { origin: ExtensionOrigin; label: string; blurb: string }[] = [
|
|
50
|
+
{
|
|
51
|
+
blurb:
|
|
52
|
+
"Extensions this project can turn on. Enabling one installs its package first if it is missing.",
|
|
53
|
+
label: "Available",
|
|
54
|
+
origin: "catalog",
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
blurb: "Extension packages already in this project's dependencies.",
|
|
58
|
+
label: "Installed",
|
|
59
|
+
origin: "installed",
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
blurb:
|
|
63
|
+
"Named in project.json, but this backend does not describe them. You can still turn them off.",
|
|
64
|
+
label: "Named in project.json",
|
|
65
|
+
origin: "configured",
|
|
66
|
+
},
|
|
67
|
+
];
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* The project's dependencies, re-read whenever an operation may have changed them.
|
|
71
|
+
*
|
|
72
|
+
* Module-level rather than per container, because it is a fact about the PROJECT: two panes showing
|
|
73
|
+
* this section are not looking at two dependency lists.
|
|
74
|
+
*/
|
|
75
|
+
let _packages: PackageInfo[] | null = null;
|
|
76
|
+
|
|
77
|
+
/** The surface mounted in each container, so a redraw updates one rather than making another. */
|
|
78
|
+
const mounted = new WeakMap<HTMLElement, ExtensionsSurfaceHandle>();
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* The last failed operation, per rendered section, shown under the section title.
|
|
82
|
+
*
|
|
83
|
+
* Keyed by container, the shape `general-settings.ts` and `locales-section.ts` use, and for the
|
|
84
|
+
* reason they use it: a message belongs to the copy of the section the reader was looking at when
|
|
85
|
+
* the operation failed. It is cleared when the next operation starts and when one succeeds, and a
|
|
86
|
+
* section the reader navigated away from and back is drawn into a fresh host
|
|
87
|
+
* (`panels/settings-pane.ts`), so it starts with nothing to say rather than with a stale
|
|
88
|
+
* complaint.
|
|
89
|
+
*/
|
|
90
|
+
const errors = new WeakMap<HTMLElement, string>();
|
|
91
|
+
|
|
92
|
+
/** The sentence a row's state deserves, and the tone it is said in. */
|
|
93
|
+
function noteFor(row: ExtensionRow): { note: string; noteTone: ExtensionRowView["noteTone"] } {
|
|
94
|
+
if (row.unavailable !== undefined) {
|
|
95
|
+
return { note: row.unavailable, noteTone: "warn" };
|
|
96
|
+
}
|
|
97
|
+
if (row.broken) {
|
|
98
|
+
return {
|
|
99
|
+
note:
|
|
100
|
+
`${row.name} is named in project.json but is not installed, so the next build will fail. ` +
|
|
101
|
+
`Turn it off, or turn it off and on again to install it.`,
|
|
102
|
+
noteTone: "warn",
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
if (!row.installed && !row.bundled) {
|
|
106
|
+
return { note: "Not installed. Turning this on installs it first.", noteTone: "note" };
|
|
107
|
+
}
|
|
108
|
+
if (row.bundled) {
|
|
109
|
+
return { note: "Ships with this backend, so it needs no install.", noteTone: "note" };
|
|
110
|
+
}
|
|
111
|
+
return { note: "", noteTone: "none" };
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/** Why a row's toggle cannot be used right now, or `""` when it can. */
|
|
115
|
+
function blockedReason(row: ExtensionRow): string {
|
|
116
|
+
// Turning something OFF is always safe, even on a backend that cannot run it — otherwise a row
|
|
117
|
+
// That arrived unsupported could never be removed from the project that names it.
|
|
118
|
+
if (row.unavailable !== undefined && !row.enabled) {
|
|
119
|
+
return row.unavailable;
|
|
120
|
+
}
|
|
121
|
+
const busy = extensionOpInFlight();
|
|
122
|
+
return busy === null ? "" : `Waiting for ${busy} to finish.`;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* The per-row Remove, as the document reads it.
|
|
127
|
+
*
|
|
128
|
+
* Refused while the extension is still enabled, and DISABLED with the reason rather than hidden
|
|
129
|
+
* (guidelines §10): removing the package while `project.json` still names it manufactures exactly
|
|
130
|
+
* the broken state this section exists to eliminate. It is absent only when there is nothing to
|
|
131
|
+
* remove — a package the project never installed, or one the backend bundles.
|
|
132
|
+
*/
|
|
133
|
+
function removeFor(
|
|
134
|
+
row: ExtensionRow,
|
|
135
|
+
): Pick<ExtensionRowView, "canRemove" | "removeDisabled" | "removeHint" | "removeLabel"> {
|
|
136
|
+
const refusal = row.enabled
|
|
137
|
+
? `Turn ${row.title} off first. Removing the package while project.json still names it would fail the next build.`
|
|
138
|
+
: "";
|
|
139
|
+
return {
|
|
140
|
+
canRemove: row.installed && !row.bundled,
|
|
141
|
+
removeDisabled: refusal !== "" || extensionOpInFlight() !== null,
|
|
142
|
+
removeHint: refusal === "" ? `Remove ${row.name}` : refusal,
|
|
143
|
+
removeLabel: `Remove ${row.name}`,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/** One row, projected. */
|
|
148
|
+
function rowView(row: ExtensionRow): ExtensionRowView {
|
|
149
|
+
const blocked = blockedReason(row);
|
|
150
|
+
return {
|
|
151
|
+
blocked: blocked !== "",
|
|
152
|
+
blockedReason: blocked,
|
|
153
|
+
broken: row.broken,
|
|
154
|
+
description: row.description ?? "",
|
|
155
|
+
enabled: row.enabled,
|
|
156
|
+
hasDescription: (row.description ?? "") !== "",
|
|
157
|
+
hasSections: row.sections.length > 0,
|
|
158
|
+
name: row.name,
|
|
159
|
+
sections: row.sections.map((key) => ({ key })),
|
|
160
|
+
specifier: row.specifier,
|
|
161
|
+
title: row.title,
|
|
162
|
+
...noteFor(row),
|
|
163
|
+
...removeFor(row),
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* What the section shows right now.
|
|
169
|
+
*
|
|
170
|
+
* A group with no rows is left out rather than drawn empty: the three origins are a classification
|
|
171
|
+
* of what happens to exist, not a set of shelves a project is expected to fill.
|
|
172
|
+
*/
|
|
173
|
+
function view(container: HTMLElement): ExtensionsView {
|
|
174
|
+
const rows = buildRows(_packages);
|
|
175
|
+
const groups: ExtensionGroupView[] = [];
|
|
176
|
+
for (const group of GROUPS) {
|
|
177
|
+
const matching = rows.filter((row) => row.origin === group.origin);
|
|
178
|
+
if (matching.length > 0) {
|
|
179
|
+
groups.push({
|
|
180
|
+
blurb: group.blurb,
|
|
181
|
+
label: group.label,
|
|
182
|
+
origin: group.origin,
|
|
183
|
+
rows: matching.map((row) => rowView(row)),
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
return { error: errors.get(container) ?? "", groups };
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/** Draw the section, or bring the surface already there up to date. */
|
|
191
|
+
function refresh(container: HTMLElement): void {
|
|
192
|
+
const standing = mounted.get(container);
|
|
193
|
+
if (standing?.connected()) {
|
|
194
|
+
standing.update(view(container));
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
standing?.dispose();
|
|
198
|
+
mounted.set(container, mountExtensionsSurface(container, view(container), actions(container)));
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/** Re-read the package list, then repaint. Installed-ness is what a config write cannot move. */
|
|
202
|
+
async function reload(container: HTMLElement): Promise<void> {
|
|
203
|
+
try {
|
|
204
|
+
_packages = await getPlatform().listPackages();
|
|
205
|
+
} catch {
|
|
206
|
+
_packages = [];
|
|
207
|
+
}
|
|
208
|
+
refresh(container);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
async function onToggle(
|
|
212
|
+
container: HTMLElement,
|
|
213
|
+
specifier: string,
|
|
214
|
+
checked: boolean,
|
|
215
|
+
): Promise<void> {
|
|
216
|
+
/* The echo, first and before anything is decided: the scope is made to agree with the switch, so
|
|
217
|
+
that the projection which follows — the file's answer — is a real move rather than a
|
|
218
|
+
restatement of a value the scope never left. */
|
|
219
|
+
mounted.get(container)?.echo(specifier, checked);
|
|
220
|
+
errors.delete(container);
|
|
221
|
+
// Intent is the DOCUMENT's truth inverted, never the switch's own `checked` — the browser has
|
|
222
|
+
// Already moved that by the time this fires, so reading it would compound a double event.
|
|
223
|
+
const row = buildRows(_packages).find((candidate) => candidate.specifier === specifier);
|
|
224
|
+
if (row === undefined) {
|
|
225
|
+
refresh(container);
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
// Started, THEN painted: both operations take the in-flight latch synchronously before their
|
|
229
|
+
// First await, so this repaint is what disables every other switch for the duration.
|
|
230
|
+
const op = row.enabled ? disableExtension(row.specifier) : enableExtension(row.specifier);
|
|
231
|
+
refresh(container);
|
|
232
|
+
try {
|
|
233
|
+
await op;
|
|
234
|
+
} catch (error) {
|
|
235
|
+
errors.set(container, errorMessage(error));
|
|
236
|
+
}
|
|
237
|
+
// Either way the row repaints from `project.json`, so a switch the operation did not earn is put
|
|
238
|
+
// Back where the document says it belongs.
|
|
239
|
+
await reload(container);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
async function onRemove(container: HTMLElement, name: string): Promise<void> {
|
|
243
|
+
errors.delete(container);
|
|
244
|
+
const op = removeExtensionPackage(name);
|
|
245
|
+
refresh(container);
|
|
246
|
+
try {
|
|
247
|
+
await op;
|
|
248
|
+
} catch (error) {
|
|
249
|
+
errors.set(container, errorMessage(error));
|
|
250
|
+
}
|
|
251
|
+
await reload(container);
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* What the reader may do, bound to one container.
|
|
256
|
+
*
|
|
257
|
+
* Memoized per container so the surface is handed the same functions every time: they are read
|
|
258
|
+
* once, when it mounts, and a fresh pair on every refresh would be a scope write that says
|
|
259
|
+
* nothing.
|
|
260
|
+
*/
|
|
261
|
+
const bound = new WeakMap<HTMLElement, ExtensionsActions>();
|
|
262
|
+
|
|
263
|
+
function actions(container: HTMLElement): ExtensionsActions {
|
|
264
|
+
let acts = bound.get(container);
|
|
265
|
+
if (!acts) {
|
|
266
|
+
acts = {
|
|
267
|
+
remove: (name: string) => {
|
|
268
|
+
void onRemove(container, name);
|
|
269
|
+
},
|
|
270
|
+
toggle: (specifier: string, checked: boolean) => {
|
|
271
|
+
void onToggle(container, specifier, checked);
|
|
272
|
+
},
|
|
273
|
+
};
|
|
274
|
+
bound.set(container, acts);
|
|
275
|
+
}
|
|
276
|
+
return acts;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
/**
|
|
280
|
+
* Render the Extensions section into a settings-document container.
|
|
281
|
+
*
|
|
282
|
+
* @param {HTMLElement} container
|
|
283
|
+
*/
|
|
284
|
+
export function renderExtensionsSection(container: HTMLElement): void {
|
|
285
|
+
refresh(container);
|
|
286
|
+
void reload(container);
|
|
287
|
+
}
|