@jxsuite/studio 4.1.0 → 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/data/elements-meta.json +5 -15
- package/data/html-meta.json +51 -6
- package/dist/chunks/{2020-n6tfwnda.js → 2020-g79n01v9.js} +14 -14
- package/dist/chunks/action-group-sp6tna8v.js +118 -0
- package/dist/chunks/adapter-nj7tnjfn.js +13 -0
- package/dist/chunks/cf-account-picker-fyf63pmy.js +495 -0
- package/dist/chunks/cf-settings-71bv5zn9.js +20 -0
- package/dist/chunks/color-area-v17df7b8.js +154 -0
- package/dist/chunks/color-field-anwybnkn.js +208 -0
- package/dist/chunks/color-slider-44ez96fc.js +79 -0
- package/dist/chunks/color-xgg3kfw7.js +35 -0
- package/dist/chunks/combobox-5e7jev23.js +236 -0
- package/dist/chunks/components-2w1f35qs.js +18 -0
- package/dist/chunks/content-source-3wqeas45.js +46 -0
- package/dist/chunks/convert-to-repeater-d0cgnb6d.js +639 -0
- package/dist/chunks/dialog-s890b918.js +85 -0
- package/dist/chunks/editor-3qhbg51x.js +35 -0
- package/dist/chunks/entry-commands-d6g50j7s.js +42 -0
- package/dist/chunks/extension-sections-fy7q4fe9.js +651 -0
- package/dist/chunks/file-ops-3btj6st0.js +47 -0
- package/dist/chunks/files-ef8fgs3w.js +72 -0
- package/dist/chunks/format-host-3c33nwr8.js +40 -0
- package/dist/chunks/fs-events-13tj6sex.js +18 -0
- package/dist/chunks/git-panel-4wp2rn9b.js +49 -0
- package/dist/chunks/icons-yy10wk9r.js +402 -0
- package/dist/chunks/iframe-entry-15g3n6xv.js +114 -0
- package/dist/chunks/iframe-entry-b27vq81n.js +203 -0
- package/dist/chunks/iframe-entry-nbyxee1y.js +154 -0
- package/dist/chunks/iframe-host-jgesd924.js +115 -0
- package/dist/chunks/{index-wcnt3r9g.js → index-mdmyx6s2.js} +11 -11
- package/dist/chunks/index-n4j7qxyr.js +109 -0
- package/dist/chunks/{javascript-q8kpmfah.js → javascript-xvrfrpkb.js} +8 -9
- package/dist/chunks/{jsonMode-dkr040ga.js → jsonMode-tyx2kj6p.js} +526 -527
- package/dist/chunks/jx-validate-j0wxk72w.js +15 -0
- package/dist/chunks/layers-1nq5evsh.js +29 -0
- package/dist/chunks/layers-panel-ar2gh90g.js +40 -0
- package/dist/chunks/listbox-6v2ac08j.js +44 -0
- package/dist/chunks/lit-html-m244w9nh.js +17 -0
- package/dist/chunks/media-picker-2qbetq73.js +33 -0
- package/dist/chunks/menu-q99sy9rf.js +285 -0
- package/dist/chunks/menu-rf7n72mf.js +14 -0
- package/dist/chunks/{monaco-binding-rj6xpx9y.js → monaco-binding-sw6en4dw.js} +12 -15
- package/dist/chunks/monaco-buffer-bhy3hb6m.js +24 -0
- package/dist/chunks/{monaco-setup-vx9bhp1d.js → monaco-setup-8r62fj6y.js} +27 -37
- package/dist/chunks/notify-628t0anh.js +21 -0
- package/dist/chunks/number-field-5cndyft8.js +72 -0
- package/dist/chunks/parse-0zx14y15.js +10 -0
- package/dist/chunks/platform-ts9cg1a4.js +15 -0
- package/dist/chunks/popover-47z3ytva.js +25 -0
- package/dist/chunks/publish-panel-98f7sr3g.js +27 -0
- package/dist/chunks/quick-search-srzz83k2.js +45 -0
- package/dist/chunks/references-n553f0e1.js +26 -0
- package/dist/chunks/right-panel-rrgx2dn3.js +45 -0
- package/dist/chunks/section-registry-5pq32t0q.js +25 -0
- package/dist/chunks/select-2r16ez41.js +49 -0
- package/dist/chunks/split-g7nm1rgb.js +191 -0
- package/dist/chunks/studio-0hqbpbd0.js +62 -0
- package/dist/chunks/studio-18avnhjp.js +2430 -0
- package/dist/chunks/{studio-kryvsw6j.js → studio-1k325pwf.js} +48 -48
- package/dist/chunks/{studio-msd847zn.js → studio-25hkdrkw.js} +357 -86
- package/dist/chunks/studio-26d7myd1.js +258 -0
- package/dist/chunks/{studio-4r1pv6zf.js → studio-38emantv.js} +22 -5
- package/dist/chunks/studio-3gxv60tn.js +422 -0
- package/dist/chunks/{studio-fbf92ckf.js → studio-3hxkd92t.js} +275 -163
- package/dist/chunks/studio-4m0haseg.js +185 -0
- package/dist/chunks/{studio-ynxwkrzd.js → studio-4wbb9ct0.js} +1953 -1785
- package/dist/chunks/{studio-1wagb550.js → studio-5523bpzt.js} +11 -11
- package/dist/chunks/{studio-x4qkdat5.js → studio-57mf66w2.js} +1749 -2481
- package/dist/chunks/studio-5jy81t3s.js +17463 -0
- package/dist/chunks/studio-5rt7sqa0.js +1168 -0
- package/dist/chunks/studio-5te5tqng.js +81 -0
- package/dist/chunks/{studio-p4ngc046.js → studio-6ewqv390.js} +9 -9
- package/dist/chunks/{studio-9ab8gqsm.js → studio-6nzaktvy.js} +7 -7
- package/dist/chunks/studio-6xa21ej9.js +28 -0
- package/dist/chunks/{studio-5ehhackm.js → studio-727xh0e3.js} +19 -19
- package/dist/chunks/{studio-ahn3pdgx.js → studio-79y5sz51.js} +52 -38
- package/dist/chunks/{studio-gcye7qka.js → studio-7e11jpa9.js} +21 -21
- package/dist/chunks/{studio-q7v10cg2.js → studio-7r42c6ca.js} +17 -7
- package/dist/chunks/studio-7xptrg0j.js +954 -0
- package/dist/chunks/{studio-cft9r4r7.js → studio-81390n6f.js} +22 -22
- package/dist/chunks/{studio-q43a5y9h.js → studio-8jn5yhyn.js} +16 -16
- package/dist/chunks/studio-8qtrpzr3.js +839 -0
- package/dist/chunks/{studio-dg7zyt5x.js → studio-98b3z07n.js} +1 -1
- package/dist/chunks/studio-9xxz1q69.js +1356 -0
- package/dist/chunks/studio-akbww0j5.js +13615 -0
- package/dist/chunks/{studio-x813zp48.js → studio-arfpe389.js} +30 -30
- package/dist/chunks/{studio-trxrabqf.js → studio-az3zd49t.js} +475 -283
- package/dist/chunks/studio-cpvb2ed1.js +1171 -0
- package/dist/chunks/{studio-f3wqjtk5.js → studio-d0300636.js} +5076 -18
- package/dist/chunks/{studio-bgxt93ga.js → studio-d055c37e.js} +13 -13
- package/dist/chunks/studio-d1ja2x9r.js +362 -0
- package/dist/chunks/{studio-b9b6t1dg.js → studio-e1f24eff.js} +5664 -5666
- package/dist/chunks/{studio-3bqpr0zh.js → studio-em9nw8eh.js} +299 -110
- package/dist/chunks/studio-erdatzvp.js +1190 -0
- package/dist/chunks/{studio-g1wdche0.js → studio-esrxgwh6.js} +80 -80
- package/dist/chunks/studio-fabxk6r9.js +2811 -0
- package/dist/chunks/{studio-3n4ndrzh.js → studio-h4nvnjvz.js} +303 -303
- package/dist/chunks/{studio-dm19q43r.js → studio-hhvs4sdg.js} +10 -10
- package/dist/chunks/{studio-q9jd1a60.js → studio-kcgff4r0.js} +15 -18
- package/dist/chunks/{studio-685s0ytq.js → studio-nqgawfks.js} +572 -572
- package/dist/chunks/{studio-xrapxwwc.js → studio-p1dw8wfw.js} +55 -29
- package/dist/chunks/studio-pm6hgy7r.js +4763 -0
- package/dist/chunks/studio-q0a3yk4n.js +33 -0
- package/dist/chunks/{studio-wcy8trfx.js → studio-q3x06vmj.js} +23 -22
- package/dist/chunks/studio-qahxvnan.js +111 -0
- package/dist/chunks/{studio-53n8bp04.js → studio-r6xmmtfh.js} +1 -1
- package/dist/chunks/{studio-2b946z26.js → studio-rkstz940.js} +3658 -6134
- package/dist/chunks/{studio-tvgyw9xw.js → studio-rnyf3f8e.js} +83 -250
- package/dist/chunks/studio-rpyah2ew.js +2805 -0
- package/dist/chunks/studio-rs76k67r.js +12 -0
- package/dist/chunks/{studio-jkftxyvz.js → studio-s6z853aq.js} +5858 -2152
- package/dist/chunks/{studio-6yw4y3my.js → studio-sgdc5pfc.js} +8 -8
- package/dist/chunks/studio-tb3ev01j.js +763 -0
- package/dist/chunks/{studio-t5wqwzdh.js → studio-tjjk7jvk.js} +1 -1
- package/dist/chunks/studio-vhv5tgxm.js +51 -0
- package/dist/chunks/{studio-qjy2z9bv.js → studio-vz68yn9e.js} +32 -137
- package/dist/chunks/studio-wqpngpsk.js +174 -0
- package/dist/chunks/{studio-b55y6ewx.js → studio-x3rty6tr.js} +58 -58
- package/dist/chunks/studio-xsykpvsh.js +8448 -0
- package/dist/chunks/{studio-92ab2jqe.js → studio-y9zedyjn.js} +14 -14
- package/dist/chunks/studio-yxa81f45.js +12 -0
- package/dist/chunks/swatch-group-t0n6h2rn.js +139 -0
- package/dist/chunks/tabs-wbp1cdws.js +156 -0
- package/dist/chunks/textfield-abk6qyee.js +73 -0
- package/dist/chunks/toast-780pvfbv.js +27 -0
- package/dist/chunks/toast-host-3sqv46sn.js +116 -0
- package/dist/chunks/toolbar-xbh5bhtr.js +194 -0
- package/dist/chunks/tooltip-eptb614w.js +369 -0
- package/dist/chunks/tree-a73p0pqm.js +367 -0
- package/dist/chunks/{tsMode-76kr53q0.js → tsMode-jy4m86rv.js} +83 -85
- package/dist/chunks/workspace-wrew8zk4.js +69 -0
- package/dist/chunks/{ws-client-6shc5rze.js → ws-client-ny4zc51r.js} +20 -22
- package/dist/iframe-entry.js +1780 -667
- package/dist/studio.js +52819 -36480
- package/dist/workers/editor.worker.js +1040 -1085
- package/dist/workers/json.worker.js +1946 -1991
- package/dist/workers/ts.worker.js +4960 -5005
- package/index.html +1 -0
- package/package.json +18 -52
- package/src/about/about-modal.ts +72 -123
- package/src/browse/library-commands.ts +20 -49
- package/src/browse/library-layouts.ts +87 -218
- package/src/browse/library-pane.ts +406 -438
- package/src/canvas/canvas-helpers.ts +0 -49
- package/src/canvas/canvas-live-render.ts +25 -2
- package/src/canvas/canvas-render.ts +666 -231
- package/src/canvas/canvas-surface.ts +0 -1
- package/src/canvas/canvas-utils.ts +310 -117
- package/src/canvas/dialog-path.ts +76 -0
- package/src/canvas/dialog-state.ts +67 -0
- package/src/canvas/diff-marks.ts +252 -0
- package/src/canvas/diff-toolbar.ts +349 -0
- package/src/canvas/diff-view.ts +123 -0
- package/src/canvas/edit-width-drag.ts +187 -0
- package/src/canvas/edit-width.ts +150 -0
- package/src/canvas/iframe-entry.ts +125 -8
- package/src/canvas/iframe-host.ts +271 -15
- package/src/canvas/iframe-interaction.ts +133 -13
- package/src/canvas/iframe-patch.ts +7 -1
- package/src/canvas/iframe-position.ts +5 -6
- package/src/canvas/iframe-protocol.ts +106 -5
- package/src/canvas/iframe-render.ts +373 -5
- package/src/canvas/iframe-slash.ts +2 -2
- package/src/canvas/iframe-subtree.ts +5 -8
- package/src/canvas/path-mapping.ts +25 -3
- package/src/canvas/popover-path.ts +106 -0
- package/src/canvas/popover-state.ts +155 -0
- package/src/canvas/surface-registry.ts +21 -10
- package/src/collab/presence-chips.ts +51 -73
- package/src/commands/app-commands.ts +10 -0
- package/src/commands/budget.ts +12 -0
- package/src/commands/command-args.ts +369 -6
- package/src/commands/defaults.ts +44 -14
- package/src/commands/live-context.ts +11 -5
- package/src/commands/reference.ts +12 -2
- package/src/commands/registry.ts +165 -8
- package/src/content/entry-commands.ts +16 -23
- package/src/content/entry-editor.ts +144 -101
- package/src/editor/canvas-slash-bridge.ts +2 -2
- package/src/editor/context-menu.ts +49 -200
- package/src/editor/convert-to-component.ts +42 -82
- package/src/editor/convert-to-repeater.ts +132 -173
- package/src/editor/inline-edit.ts +11 -0
- package/src/editor/shortcuts.ts +65 -26
- package/src/editor/slash-menu.ts +150 -157
- package/src/files/file-ops.ts +117 -11
- package/src/files/files.ts +943 -660
- package/src/files/json-layout.ts +474 -0
- package/src/files/serialize-document.ts +8 -1
- package/src/format/convert-file.ts +16 -10
- package/src/format/format-host.ts +50 -1
- package/src/github/github-auth.ts +71 -29
- package/src/github/github-publish.ts +57 -65
- package/src/grid/cell-editors.ts +46 -4
- package/src/grid/cell-popovers.ts +65 -62
- package/src/grid/grid-open.ts +86 -64
- package/src/grid/grid-panel.ts +390 -469
- package/src/grid/redirects-grid.ts +40 -44
- package/src/hosting/layout.ts +2 -0
- package/src/i18n/i18n-commands.ts +127 -62
- package/src/media/media-pane.ts +83 -133
- package/src/new-project/add-repo-modal.ts +125 -176
- package/src/new-project/import-tab.ts +181 -252
- package/src/new-project/location-fields.ts +93 -160
- package/src/new-project/new-project-modal.ts +376 -367
- package/src/packages/jxsuite-update.ts +76 -18
- package/src/panels/activity-panel.ts +137 -104
- package/src/panels/ai-chat/chat-markdown.ts +15 -13
- package/src/panels/ai-chat/chat-view.ts +307 -472
- package/src/panels/ai-chat/composer.ts +175 -163
- package/src/panels/ai-chat/sessions-view.ts +31 -62
- package/src/panels/ai-panel.ts +210 -185
- package/src/panels/block-action-bar.ts +437 -643
- package/src/panels/bottom-dock.ts +112 -47
- package/src/panels/chat-panel.ts +19 -14
- package/src/panels/data-explorer.ts +141 -102
- package/src/panels/data-grid.ts +183 -150
- package/src/panels/dnd.ts +75 -20
- package/src/panels/editors.ts +26 -19
- package/src/panels/elements-panel.ts +243 -186
- package/src/panels/empty-state.ts +26 -42
- package/src/panels/events-panel.ts +950 -729
- package/src/panels/formula-workspace.ts +434 -207
- package/src/panels/frontmatter-fields.ts +185 -153
- package/src/panels/frontmatter-panel.ts +411 -187
- package/src/panels/git-diff-open.ts +148 -0
- package/src/panels/git-panel.ts +679 -605
- package/src/panels/head-panel.ts +617 -435
- package/src/panels/i18n-panel.ts +153 -133
- package/src/panels/imports-panel.ts +388 -414
- package/src/panels/jump-bar.ts +174 -147
- package/src/panels/layers-panel.ts +785 -671
- package/src/panels/left-panel.ts +166 -94
- package/src/panels/navigator-panels.ts +1 -1
- package/src/panels/pane-context.ts +529 -677
- package/src/panels/pane-grid.ts +265 -241
- package/src/panels/panel-registry.ts +15 -4
- package/src/panels/problems-panel.ts +177 -99
- package/src/panels/properties-panel.ts +1525 -966
- package/src/panels/provenance.ts +31 -113
- package/src/panels/quick-search.ts +217 -172
- package/src/panels/right-panel.ts +135 -169
- package/src/panels/seo-modal.ts +346 -167
- package/src/panels/settings-menu.ts +109 -646
- package/src/panels/settings-pane.ts +102 -86
- package/src/panels/signals-panel.ts +1318 -1172
- package/src/panels/statement-editor.ts +556 -428
- package/src/panels/style-panel.ts +1367 -630
- package/src/panels/style-utils.ts +36 -32
- package/src/panels/stylebook-doc.ts +30 -73
- package/src/panels/stylebook-layers-panel.ts +202 -109
- package/src/panels/stylebook-panel.ts +124 -88
- package/src/panels/tab-strip.ts +385 -287
- package/src/platforms/cloud.ts +106 -16
- package/src/platforms/devserver.ts +13 -0
- package/src/publish/deploy-checklist.ts +124 -78
- package/src/publish/publish-commands.ts +4 -12
- package/src/publish/publish-panel.ts +134 -328
- package/src/services/a11y-report.ts +100 -43
- package/src/services/ai-command-tools.ts +468 -0
- package/src/services/ai-session-store.ts +6 -0
- package/src/services/ai-system-prompt.ts +110 -18
- package/src/services/ai-tools.ts +28 -143
- package/src/services/ai-write-report.ts +174 -0
- package/src/services/document-assistant.ts +50 -2
- package/src/services/idle.ts +16 -14
- package/src/services/live-surfaces.ts +237 -0
- package/src/services/model-uri.ts +75 -0
- package/src/services/notify.ts +63 -6
- package/src/services/popover-report.ts +325 -0
- package/src/services/surface-registry.ts +56 -0
- package/src/services/tool-executor.ts +6 -0
- package/src/settings/contexts-section.ts +301 -299
- package/src/settings/contributed-section.ts +361 -222
- package/src/settings/css-vars-editor.ts +320 -325
- package/src/settings/defs-editor.ts +572 -535
- package/src/settings/dependencies-editor.ts +79 -107
- package/src/settings/extension-commands.ts +379 -0
- package/src/settings/extension-rows.ts +113 -0
- package/src/settings/extensions-section.ts +287 -0
- package/src/settings/general-settings.ts +130 -181
- package/src/settings/head-editor.ts +10 -305
- package/src/settings/locales-section.ts +146 -196
- package/src/settings/preferences-accounts.ts +1 -1
- package/src/settings/preferences-dialog.ts +350 -330
- package/src/settings/project-sections.ts +108 -181
- package/src/settings/schema-field-ui.ts +11 -399
- package/src/settings/section-registry.ts +8 -1
- package/src/settings/settings-document.ts +31 -29
- package/src/shell/tree.ts +42 -87
- package/src/shell.ts +48 -36
- package/src/studio.ts +90 -67
- package/src/style/token-ref.ts +0 -39
- package/src/surfaces/about.json +263 -0
- package/src/surfaces/about.ts +163 -0
- package/src/surfaces/add-repo.json +486 -0
- package/src/surfaces/add-repo.ts +236 -0
- package/src/surfaces/ai-chat.json +2185 -0
- package/src/surfaces/ai-chat.ts +549 -0
- package/src/surfaces/ai-credentials-form.json +332 -0
- package/src/surfaces/ai-credentials-form.ts +151 -0
- package/src/surfaces/ai-managed-connect.json +108 -0
- package/src/surfaces/ai-managed-connect.ts +123 -0
- package/src/surfaces/ai-model-picker.json +114 -0
- package/src/surfaces/ai-model-picker.ts +139 -0
- package/src/surfaces/block-action-bar.json +640 -0
- package/src/surfaces/block-action-bar.ts +368 -0
- package/src/surfaces/bottom-dock.json +154 -0
- package/src/surfaces/bottom-dock.ts +125 -0
- package/src/surfaces/canvas-stage.json +444 -0
- package/src/surfaces/canvas-stage.ts +253 -0
- package/src/surfaces/cf-account-picker.json +300 -0
- package/src/surfaces/cf-account-picker.ts +214 -0
- package/src/surfaces/commandbar.json +984 -0
- package/src/{panels/toolbar.ts → surfaces/commandbar.ts} +414 -389
- package/src/surfaces/convert-repeater.json +309 -0
- package/src/surfaces/convert-repeater.ts +276 -0
- package/src/surfaces/data-actions.json +157 -0
- package/src/surfaces/data-actions.ts +115 -0
- package/src/surfaces/dialog.json +289 -0
- package/src/surfaces/dialog.ts +343 -0
- package/src/surfaces/diff-toolbar.json +266 -0
- package/src/surfaces/diff-toolbar.ts +139 -0
- package/src/surfaces/doc-header.json +739 -0
- package/src/surfaces/doc-header.ts +223 -0
- package/src/surfaces/empty-state.json +152 -0
- package/src/surfaces/empty-state.ts +173 -0
- package/src/surfaces/entry-editor.json +281 -0
- package/src/surfaces/entry-editor.ts +191 -0
- package/src/surfaces/expression-editor.json +977 -0
- package/src/surfaces/expression-editor.ts +266 -0
- package/src/surfaces/files-panel.json +592 -0
- package/src/surfaces/files-panel.ts +301 -0
- package/src/surfaces/formula-palette.json +364 -0
- package/src/surfaces/formula-palette.ts +340 -0
- package/src/surfaces/git-panel.json +1822 -0
- package/src/surfaces/git-panel.ts +272 -0
- package/src/surfaces/github-auth.json +112 -0
- package/src/surfaces/github-auth.ts +139 -0
- package/src/surfaces/github-publish.json +206 -0
- package/src/surfaces/github-publish.ts +169 -0
- package/src/surfaces/grid-cell.json +218 -0
- package/src/surfaces/grid-cell.ts +120 -0
- package/src/surfaces/grid-open.json +147 -0
- package/src/surfaces/grid-open.ts +87 -0
- package/src/surfaces/grid-panel.json +706 -0
- package/src/surfaces/grid-panel.ts +206 -0
- package/src/surfaces/grid-replace.json +179 -0
- package/src/surfaces/grid-replace.ts +89 -0
- package/src/surfaces/grid-views.json +446 -0
- package/src/surfaces/grid-views.ts +172 -0
- package/src/surfaces/inspector-dock.json +187 -0
- package/src/surfaces/inspector-dock.ts +161 -0
- package/src/surfaces/jump-bar.json +243 -0
- package/src/surfaces/jump-bar.ts +129 -0
- package/src/surfaces/jxsuite-update.json +146 -0
- package/src/surfaces/jxsuite-update.ts +149 -0
- package/src/surfaces/library-pane.json +1509 -0
- package/src/surfaces/library-pane.ts +363 -0
- package/src/surfaces/logic-panel.json +1949 -0
- package/src/surfaces/logic-panel.ts +369 -0
- package/src/surfaces/logic-workspace.json +685 -0
- package/src/surfaces/logic-workspace.ts +238 -0
- package/src/surfaces/media-browser.json +303 -0
- package/src/surfaces/media-browser.ts +145 -0
- package/src/surfaces/media-field.json +163 -0
- package/src/surfaces/media-field.ts +116 -0
- package/src/surfaces/media-pane.json +513 -0
- package/src/surfaces/media-pane.ts +197 -0
- package/src/surfaces/menu.json +232 -0
- package/src/surfaces/menu.ts +375 -0
- package/src/surfaces/navigator-dock.json +113 -0
- package/src/surfaces/navigator-dock.ts +130 -0
- package/src/surfaces/new-project.json +1654 -0
- package/src/surfaces/new-project.ts +411 -0
- package/src/surfaces/palette.json +535 -0
- package/src/surfaces/pane-context.json +1497 -0
- package/src/surfaces/pane-context.ts +513 -0
- package/src/surfaces/pane-grid.json +188 -0
- package/src/surfaces/pane-grid.ts +250 -0
- package/src/surfaces/panel-activity.json +563 -0
- package/src/surfaces/panel-activity.ts +187 -0
- package/src/surfaces/panel-data.json +141 -0
- package/src/surfaces/panel-data.ts +156 -0
- package/src/surfaces/panel-deploy-checklist.json +283 -0
- package/src/surfaces/panel-deploy-checklist.ts +175 -0
- package/src/surfaces/panel-elements.json +367 -0
- package/src/surfaces/panel-elements.ts +175 -0
- package/src/surfaces/panel-i18n.json +569 -0
- package/src/surfaces/panel-i18n.ts +212 -0
- package/src/surfaces/panel-imports.json +780 -0
- package/src/surfaces/panel-imports.ts +209 -0
- package/src/surfaces/panel-outline.json +734 -0
- package/src/surfaces/panel-outline.ts +326 -0
- package/src/surfaces/panel-page.json +1017 -0
- package/src/surfaces/panel-page.ts +240 -0
- package/src/surfaces/panel-problems.json +497 -0
- package/src/surfaces/panel-problems.ts +157 -0
- package/src/surfaces/panel-signals.json +1973 -0
- package/src/surfaces/panel-signals.ts +436 -0
- package/src/surfaces/panel-stylebook-layers.json +317 -0
- package/src/surfaces/panel-stylebook-layers.ts +155 -0
- package/src/surfaces/preferences.json +850 -0
- package/src/surfaces/preferences.ts +332 -0
- package/src/surfaces/progress-modal.json +110 -0
- package/src/surfaces/progress-modal.ts +150 -0
- package/src/surfaces/properties-panel.json +1578 -0
- package/src/surfaces/properties-panel.ts +337 -0
- package/src/surfaces/publish.json +945 -0
- package/src/surfaces/publish.ts +392 -0
- package/src/surfaces/push-plan.json +110 -0
- package/src/surfaces/push-plan.ts +87 -0
- package/src/surfaces/rail.json +255 -0
- package/src/surfaces/rail.ts +206 -0
- package/src/surfaces/reference-field.json +191 -0
- package/src/surfaces/reference-field.ts +168 -0
- package/src/surfaces/schema-builder.json +1011 -0
- package/src/surfaces/schema-builder.ts +181 -0
- package/src/surfaces/schema-form.json +1013 -0
- package/src/surfaces/schema-form.ts +287 -0
- package/src/surfaces/secret-field.json +60 -0
- package/src/surfaces/secret-field.ts +146 -0
- package/src/surfaces/seo.json +932 -0
- package/src/surfaces/seo.ts +334 -0
- package/src/surfaces/settings-contexts.json +538 -0
- package/src/surfaces/settings-contexts.ts +196 -0
- package/src/surfaces/settings-contributed.json +489 -0
- package/src/surfaces/settings-contributed.ts +199 -0
- package/src/surfaces/settings-css-vars.json +820 -0
- package/src/surfaces/settings-css-vars.ts +199 -0
- package/src/surfaces/settings-defs.json +1363 -0
- package/src/surfaces/settings-defs.ts +232 -0
- package/src/surfaces/settings-deploy.json +108 -0
- package/src/surfaces/settings-deploy.ts +135 -0
- package/src/surfaces/settings-extensions.json +486 -0
- package/src/surfaces/settings-extensions.ts +201 -0
- package/src/surfaces/settings-head.json +779 -0
- package/src/surfaces/settings-head.ts +397 -0
- package/src/surfaces/settings-locales.json +420 -0
- package/src/surfaces/settings-locales.ts +137 -0
- package/src/surfaces/settings-overview.json +423 -0
- package/src/surfaces/settings-overview.ts +218 -0
- package/src/surfaces/settings-packages.json +549 -0
- package/src/surfaces/settings-packages.ts +158 -0
- package/src/surfaces/settings-pane.json +147 -0
- package/src/surfaces/settings-pane.ts +150 -0
- package/src/surfaces/settings-rawjson.json +104 -0
- package/src/surfaces/settings-rawjson.ts +107 -0
- package/src/surfaces/shell.json +99 -0
- package/src/surfaces/shell.ts +30 -0
- package/src/surfaces/slash-menu.json +180 -0
- package/src/surfaces/slash-menu.ts +272 -0
- package/src/surfaces/statements.json +607 -0
- package/src/surfaces/statements.ts +238 -0
- package/src/surfaces/statusbar.json +94 -0
- package/src/{panels → surfaces}/statusbar.ts +163 -90
- package/src/surfaces/style-panel.json +1643 -0
- package/src/surfaces/style-panel.ts +338 -0
- package/src/surfaces/stylebook-chrome.json +122 -0
- package/src/surfaces/stylebook-chrome.ts +122 -0
- package/src/surfaces/tab-strip.json +448 -0
- package/src/surfaces/tab-strip.ts +200 -0
- package/src/surfaces/target-line.json +419 -0
- package/src/surfaces/target-line.ts +349 -0
- package/src/surfaces/toasts.json +189 -0
- package/src/surfaces/welcome.json +571 -0
- package/src/surfaces/welcome.ts +338 -0
- package/src/tabs/project-config.ts +71 -15
- package/src/tabs/tab.ts +52 -1
- package/src/types.ts +22 -0
- package/src/ui/ai-credentials-form.ts +104 -100
- package/src/ui/ai-managed-connect.ts +54 -36
- package/src/ui/ai-model-picker.ts +75 -47
- package/src/ui/cf-account-picker.ts +76 -141
- package/src/ui/color-selector.ts +80 -301
- package/src/ui/dynamic-slot.ts +43 -283
- package/src/ui/expression-editor.ts +797 -576
- package/src/ui/field-input.ts +8 -181
- package/src/ui/form-controls.ts +838 -366
- package/src/ui/formula-chips.ts +80 -85
- package/src/ui/kit.ts +33 -0
- package/src/ui/layers.ts +293 -593
- package/src/ui/media-picker.ts +203 -284
- package/src/ui/panel-resize.ts +251 -64
- package/src/ui/popover-surface.ts +153 -0
- package/src/ui/progress-modal.ts +22 -60
- package/src/ui/regions.ts +13 -7
- package/src/ui/schema-form.ts +906 -440
- package/src/ui/surface.ts +122 -0
- package/src/ui/unit-selector.ts +15 -131
- package/src/ui/value-source.ts +14 -0
- package/src/ui/virtual-window.ts +88 -9
- package/src/utils/canvas-media.ts +72 -0
- package/src/utils/edit-display.ts +7 -2
- package/src/utils/element-selectors.ts +69 -0
- package/src/utils/link-target.ts +2 -2
- package/src/utils/studio-utils.ts +0 -10
- package/src/view.ts +15 -0
- package/src/workspace/pane-derive.ts +36 -14
- package/src/workspace/workspace.ts +15 -6
- package/styles/canvas.css +72 -467
- package/styles/forced-colors.css +48 -82
- package/styles/forced-colors.json +41 -0
- package/styles/inspector.css +2 -1301
- package/styles/overlays.css +96 -2823
- package/styles/panels.css +6 -1423
- package/styles/shell-frame.css +272 -0
- package/styles/shell-frame.json +227 -0
- package/styles/shell.css +0 -1568
- package/styles/tokens.css +65 -136
- package/styles/tokens.json +84 -0
- package/dist/chunks/Overlay.dev-etqjwyf9.js +0 -23
- package/dist/chunks/adapter-jkcyhgtr.js +0 -14
- package/dist/chunks/cf-account-picker-en86v7x7.js +0 -163
- package/dist/chunks/cf-settings-45fgyx8y.js +0 -21
- package/dist/chunks/components-zmx10t62.js +0 -21
- package/dist/chunks/content-source-48xg86wj.js +0 -49
- package/dist/chunks/convert-to-repeater-43tfn7cs.js +0 -268
- package/dist/chunks/editor-cptq5jp1.js +0 -37
- package/dist/chunks/entry-commands-e63f1xc0.js +0 -46
- package/dist/chunks/extension-sections-txv08xxg.js +0 -311
- package/dist/chunks/file-ops-wbh4hhsx.js +0 -48
- package/dist/chunks/files-3kfkwhk4.js +0 -93
- package/dist/chunks/flow-qbfgrpeh.js +0 -634
- package/dist/chunks/focus-trap.esm-9t2drp0g.js +0 -1025
- package/dist/chunks/focus-visible-6eg70z18.js +0 -167
- package/dist/chunks/format-host-w16q81tf.js +0 -43
- package/dist/chunks/fs-events-hrrg328g.js +0 -21
- package/dist/chunks/git-panel-532whr1y.js +0 -59
- package/dist/chunks/index-zqxmqxmh.js +0 -109
- package/dist/chunks/jx-validate-8er6gbxy.js +0 -19
- package/dist/chunks/layers-panel-07hm7g5j.js +0 -67
- package/dist/chunks/layers-q75tj2mf.js +0 -45
- package/dist/chunks/lit-html-j055mkh8.js +0 -22
- package/dist/chunks/monaco-buffer-dqw0xxpx.js +0 -25
- package/dist/chunks/notify-yjm79n4s.js +0 -30
- package/dist/chunks/parse-24d0gay3.js +0 -19
- package/dist/chunks/platform-ba1j1gbh.js +0 -16
- package/dist/chunks/publish-panel-v9st96ja.js +0 -29
- package/dist/chunks/quick-search-zccjp6gv.js +0 -66
- package/dist/chunks/references-3qx8fkyp.js +0 -29
- package/dist/chunks/right-panel-vm3b6kwy.js +0 -46
- package/dist/chunks/section-registry-sx1ykvkw.js +0 -30
- package/dist/chunks/sp-overlay.dev-qgvhnxf4.js +0 -18
- package/dist/chunks/sp-popover.dev-n2etmqdp.js +0 -9
- package/dist/chunks/sp-progress-circle.dev-hryhj0es.js +0 -15
- package/dist/chunks/sp-tooltip.dev-4sastdnw.js +0 -15
- package/dist/chunks/sp-tray.dev-tkbscm06.js +0 -199
- package/dist/chunks/studio-0a5qrh01.js +0 -3
- package/dist/chunks/studio-0bq6eh7v.js +0 -12
- package/dist/chunks/studio-18j3bmcz.js +0 -14
- package/dist/chunks/studio-1ngbejft.js +0 -181
- package/dist/chunks/studio-4b5z1x43.js +0 -424
- package/dist/chunks/studio-4n2b5gzb.js +0 -357
- package/dist/chunks/studio-4rzyrtjz.js +0 -426
- package/dist/chunks/studio-5fx3g9jg.js +0 -4325
- package/dist/chunks/studio-5myknm0a.js +0 -1903
- package/dist/chunks/studio-7afd21nw.js +0 -67
- package/dist/chunks/studio-7nte2hj4.js +0 -613
- package/dist/chunks/studio-8jpzqk5s.js +0 -128
- package/dist/chunks/studio-8q517dfr.js +0 -24
- package/dist/chunks/studio-950k0dx6.js +0 -6939
- package/dist/chunks/studio-9n4mrmnb.js +0 -184
- package/dist/chunks/studio-a0tswy0w.js +0 -58
- package/dist/chunks/studio-ahnzd9rg.js +0 -23
- package/dist/chunks/studio-cmb03bg5.js +0 -13890
- package/dist/chunks/studio-d1ks410h.js +0 -175
- package/dist/chunks/studio-ef49pnzx.js +0 -387
- package/dist/chunks/studio-eqq1w638.js +0 -113
- package/dist/chunks/studio-ew0djmhg.js +0 -341
- package/dist/chunks/studio-gfgb8pe6.js +0 -1652
- package/dist/chunks/studio-h4rxscfc.js +0 -10
- package/dist/chunks/studio-jc994dnr.js +0 -1066
- package/dist/chunks/studio-kyh9avvv.js +0 -28
- package/dist/chunks/studio-m3hwn7y1.js +0 -120
- package/dist/chunks/studio-mtfnaqs9.js +0 -659
- package/dist/chunks/studio-n6j9t10q.js +0 -318
- package/dist/chunks/studio-n8b9wqwy.js +0 -291
- package/dist/chunks/studio-qcy05dp8.js +0 -1743
- package/dist/chunks/studio-qq6jym04.js +0 -53
- package/dist/chunks/studio-rdx8jcxy.js +0 -83
- package/dist/chunks/studio-rn9ta2mz.js +0 -111
- package/dist/chunks/studio-t7qb9db8.js +0 -665
- package/dist/chunks/studio-tmc5emrw.js +0 -8
- package/dist/chunks/studio-z6nw2ek2.js +0 -18
- package/dist/chunks/studio-zczps70q.js +0 -378
- package/dist/chunks/studio-zqazsct2.js +0 -1823
- package/dist/chunks/workspace-fjx52ryv.js +0 -89
- package/src/panels/activity-bar.ts +0 -251
- package/src/panels/panel-scheduler.ts +0 -219
- package/src/panels/style-inputs.ts +0 -237
- package/src/panels/target-line.ts +0 -274
- package/src/panels/welcome-screen.ts +0 -346
- package/src/ui/button-group.ts +0 -102
- package/src/ui/choice-field.ts +0 -72
- package/src/ui/field-row.ts +0 -249
- package/src/ui/formula-palette.ts +0 -213
- package/src/ui/icons.ts +0 -52
- package/src/ui/jx-theme.ts +0 -130
- package/src/ui/spectrum.ts +0 -340
- package/src/ui/value-selector.ts +0 -174
- package/src/ui/widgets.ts +0 -172
- /package/dist/chunks/{javascript-s56a8dpk.css → javascript-4abzjcy9.css} +0 -0
- /package/dist/chunks/{jsonMode-zr9sw0c7.css → jsonMode-vvmpmk34.css} +0 -0
- /package/dist/chunks/{monaco-setup-pav68602.css → monaco-setup-8vbyqnhr.css} +0 -0
- /package/dist/chunks/{tsMode-ef187txx.css → tsMode-hnxxb73h.css} +0 -0
|
@@ -16,17 +16,19 @@
|
|
|
16
16
|
* holding a pasted API token (desktop, dev server) keeps its own local account field and this
|
|
17
17
|
* resolves null without opening anything.
|
|
18
18
|
*
|
|
19
|
+
* The dialog itself is `src/surfaces/cf-account-picker.json`, a `jx-dialog`; this module is the
|
|
20
|
+
* flow around it. It used to be a lit template rendered through `showDialog`, with its own
|
|
21
|
+
* `repaint()` re-rendering the whole body into the slot's parent whenever anything landed — the
|
|
22
|
+
* surface is reactive now, so a listing that arrives late, or a refusal, changes only what it names.
|
|
23
|
+
*
|
|
19
24
|
* @docs studio/ai
|
|
20
25
|
* @license MIT
|
|
21
26
|
*/
|
|
22
27
|
|
|
23
|
-
import { html, render as litRender, nothing } from "lit-html";
|
|
24
|
-
import { ref } from "lit-html/directives/ref.js";
|
|
25
|
-
import type { TemplateResult } from "lit-html";
|
|
26
28
|
import { getPlatform, hasPlatform } from "../platform";
|
|
27
29
|
import { notifyCredentialsChanged } from "../settings/preferences-accounts";
|
|
28
|
-
import {
|
|
29
|
-
import {
|
|
30
|
+
import { openCfAccountPickerSurface } from "../surfaces/cf-account-picker";
|
|
31
|
+
import { layerHost } from "./layers";
|
|
30
32
|
import type { CfAccountSummary } from "../types";
|
|
31
33
|
|
|
32
34
|
/** Whether this platform brokers the connection, and so can be asked which accounts it reaches. */
|
|
@@ -38,6 +40,11 @@ function canPick(): boolean {
|
|
|
38
40
|
return Boolean(platform.cfAccounts && platform.cfSelectAccount);
|
|
39
41
|
}
|
|
40
42
|
|
|
43
|
+
/** What a thrown thing says, for a line the reader has to act on. */
|
|
44
|
+
function reasonOf(error: unknown): string {
|
|
45
|
+
return error instanceof Error ? error.message : String(error);
|
|
46
|
+
}
|
|
47
|
+
|
|
41
48
|
/**
|
|
42
49
|
* Ask which Cloudflare account this connection should use, and store the answer.
|
|
43
50
|
*
|
|
@@ -51,150 +58,78 @@ export function openCfAccountPicker(): Promise<CfAccountSummary | null> {
|
|
|
51
58
|
if (!canPick()) {
|
|
52
59
|
return Promise.resolve(null);
|
|
53
60
|
}
|
|
54
|
-
return
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
let failure = "";
|
|
60
|
-
/** The id being committed, so its own row can say so rather than the whole list going grey. */
|
|
61
|
-
let choosing = "";
|
|
62
|
-
let settled = false;
|
|
63
|
-
let wrapperEl: HTMLElement | null = null;
|
|
61
|
+
return new Promise<CfAccountSummary | null>((resolve) => {
|
|
62
|
+
let accounts: CfAccountSummary[] = [];
|
|
63
|
+
/** The id being committed. Held here as well as in the scope: it is what guards a second press. */
|
|
64
|
+
let choosing = "";
|
|
65
|
+
let settled = false;
|
|
64
66
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
67
|
+
/* Resolve once, and take the dialog down with it. `close()` provokes the platform's own
|
|
68
|
+
`close`, which comes back as `onClosed` — so the guard is what keeps a chosen account from
|
|
69
|
+
being overwritten by the dismissal its own commit caused. */
|
|
70
|
+
const finish = (account: CfAccountSummary | null): void => {
|
|
71
|
+
if (settled) {
|
|
72
|
+
return;
|
|
68
73
|
}
|
|
74
|
+
settled = true;
|
|
75
|
+
handle.close();
|
|
76
|
+
resolve(account);
|
|
77
|
+
};
|
|
69
78
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
79
|
+
async function load(): Promise<void> {
|
|
80
|
+
handle.update({ failure: "", loading: true });
|
|
81
|
+
let failure = "";
|
|
82
|
+
try {
|
|
83
|
+
accounts = (await getPlatform().cfAccounts?.()) ?? [];
|
|
84
|
+
} catch (error) {
|
|
85
|
+
accounts = [];
|
|
86
|
+
failure = reasonOf(error);
|
|
77
87
|
}
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
try {
|
|
84
|
-
accounts = (await getPlatform().cfAccounts?.()) ?? [];
|
|
85
|
-
} catch (error) {
|
|
86
|
-
failure = error instanceof Error ? error.message : String(error);
|
|
87
|
-
}
|
|
88
|
-
loading = false;
|
|
89
|
-
repaint();
|
|
88
|
+
/* `done` released the slot, so a late listing landing after a dismissal would otherwise be a
|
|
89
|
+
write into a disposed surface. The lit version guarded the same moment by resolving its
|
|
90
|
+
host lazily and finding none. */
|
|
91
|
+
if (settled) {
|
|
92
|
+
return;
|
|
90
93
|
}
|
|
94
|
+
handle.update({ accounts, failure, loading: false });
|
|
95
|
+
}
|
|
91
96
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
try {
|
|
97
|
-
await getPlatform().cfSelectAccount?.({ id: account.id, name: account.name });
|
|
98
|
-
} catch (error) {
|
|
99
|
-
failure = error instanceof Error ? error.message : String(error);
|
|
100
|
-
choosing = "";
|
|
101
|
-
repaint();
|
|
102
|
-
return;
|
|
103
|
-
}
|
|
104
|
-
/* The stored account is a credential like any other: the assistant's gate, the publish
|
|
105
|
-
panel and the Preferences row all re-read from the same announcement. */
|
|
106
|
-
notifyCredentialsChanged();
|
|
107
|
-
finish(account);
|
|
97
|
+
async function choose(id: string): Promise<void> {
|
|
98
|
+
const account = accounts.find((candidate) => candidate.id === id);
|
|
99
|
+
if (!account || choosing !== "") {
|
|
100
|
+
return;
|
|
108
101
|
}
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
102
|
+
choosing = id;
|
|
103
|
+
handle.update({ choosing: id, failure: "" });
|
|
104
|
+
try {
|
|
105
|
+
await getPlatform().cfSelectAccount?.({ id: account.id, name: account.name });
|
|
106
|
+
} catch (error) {
|
|
107
|
+
choosing = "";
|
|
108
|
+
if (!settled) {
|
|
109
|
+
/* The list survives a refusal, and the reason sits above it: listing again is not what
|
|
110
|
+
would fix an account the broker will not accept, so this state offers no retry. */
|
|
111
|
+
handle.update({ choosing: "", failure: reasonOf(error) });
|
|
113
112
|
}
|
|
114
|
-
|
|
115
|
-
refused (below) keeps the list, because listing again is not what would fix it. */
|
|
116
|
-
if (accounts.length === 0) {
|
|
117
|
-
return html`
|
|
118
|
-
<p class="cf-account-picker-empty">
|
|
119
|
-
${
|
|
120
|
-
failure
|
|
121
|
-
? `Cloudflare could not be reached: ${failure}`
|
|
122
|
-
: "This Cloudflare login reaches no accounts. Create one at dash.cloudflare.com, then try again."
|
|
123
|
-
}
|
|
124
|
-
</p>
|
|
125
|
-
${
|
|
126
|
-
failure
|
|
127
|
-
? html`<sp-button
|
|
128
|
-
size="s"
|
|
129
|
-
treatment="outline"
|
|
130
|
-
@click=${() => {
|
|
131
|
-
void load();
|
|
132
|
-
}}
|
|
133
|
-
>
|
|
134
|
-
Try again
|
|
135
|
-
</sp-button>`
|
|
136
|
-
: nothing
|
|
137
|
-
}
|
|
138
|
-
`;
|
|
139
|
-
}
|
|
140
|
-
/* The row shape is Preferences › Accounts', deliberately reused: this IS an account list,
|
|
141
|
-
and a second stylesheet entry for the same shape is how two lists drift apart. */
|
|
142
|
-
return html`
|
|
143
|
-
${failure ? html`<p class="cf-account-picker-error">${failure}</p>` : nothing}
|
|
144
|
-
<div class="prefs-accounts">
|
|
145
|
-
${accounts.map(
|
|
146
|
-
(account) => html`
|
|
147
|
-
<div class="prefs-account" data-account=${account.id}>
|
|
148
|
-
<div class="prefs-account-text">
|
|
149
|
-
<span class="prefs-account-label">${account.name}</span>
|
|
150
|
-
<span class="prefs-account-detail">${account.id}</span>
|
|
151
|
-
</div>
|
|
152
|
-
<sp-button
|
|
153
|
-
size="s"
|
|
154
|
-
variant="accent"
|
|
155
|
-
?disabled=${choosing !== ""}
|
|
156
|
-
@click=${() => {
|
|
157
|
-
void choose(account);
|
|
158
|
-
}}
|
|
159
|
-
>
|
|
160
|
-
${choosing === account.id ? "Selecting…" : "Use this account"}
|
|
161
|
-
</sp-button>
|
|
162
|
-
</div>
|
|
163
|
-
`,
|
|
164
|
-
)}
|
|
165
|
-
</div>
|
|
166
|
-
`;
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
function build(): TemplateResult {
|
|
170
|
-
return html`
|
|
171
|
-
<sp-dialog-wrapper
|
|
172
|
-
open
|
|
173
|
-
underlay
|
|
174
|
-
headline="Choose a Cloudflare account"
|
|
175
|
-
cancel-label="Cancel"
|
|
176
|
-
@cancel=${() => finish(null)}
|
|
177
|
-
@close=${() => finish(null)}
|
|
178
|
-
${ref((el?: Element) => {
|
|
179
|
-
if (el) {
|
|
180
|
-
wrapperEl = el as HTMLElement;
|
|
181
|
-
}
|
|
182
|
-
})}
|
|
183
|
-
>
|
|
184
|
-
<div class="cf-account-picker">
|
|
185
|
-
<p class="cf-account-picker-lede">
|
|
186
|
-
Your Cloudflare login reaches more than one account. Publishing and the assistant
|
|
187
|
-
both run against the one you pick; you can change it in Preferences › Accounts.
|
|
188
|
-
</p>
|
|
189
|
-
${listTpl()}
|
|
190
|
-
</div>
|
|
191
|
-
</sp-dialog-wrapper>
|
|
192
|
-
`;
|
|
113
|
+
return;
|
|
193
114
|
}
|
|
115
|
+
/* The stored account is a credential like any other: the assistant's gate, the publish
|
|
116
|
+
panel and the Preferences row all re-read from the same announcement. */
|
|
117
|
+
notifyCredentialsChanged();
|
|
118
|
+
finish(account);
|
|
119
|
+
}
|
|
194
120
|
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
121
|
+
const handle = openCfAccountPickerSurface({
|
|
122
|
+
layer: layerHost("dialog"),
|
|
123
|
+
onChoose: (id) => {
|
|
124
|
+
void choose(id);
|
|
125
|
+
},
|
|
126
|
+
onClosed: () => {
|
|
127
|
+
finish(null);
|
|
128
|
+
},
|
|
129
|
+
onRetry: () => {
|
|
130
|
+
void load();
|
|
131
|
+
},
|
|
132
|
+
});
|
|
133
|
+
void load();
|
|
134
|
+
});
|
|
200
135
|
}
|
package/src/ui/color-selector.ts
CHANGED
|
@@ -1,330 +1,109 @@
|
|
|
1
|
-
/// <reference lib="dom" />
|
|
2
1
|
/**
|
|
3
|
-
*
|
|
2
|
+
* The project's colour tokens, as a projection.
|
|
4
3
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
4
|
+
* This module used to be a CONTROL — a swatch, a text field and an `sp-overlay` holding an
|
|
5
|
+
* `sp-color-area`, an `sp-color-slider` and an `sp-swatch-group` — because `specs/ui.md` §5.6 was
|
|
6
|
+
* Pending and there was no colour element in the kit to draw a colour row with. It was the last
|
|
7
|
+
* Spectrum surface in Studio, and the island `studio-ui-guidelines.md` §9.4 describes: the Style
|
|
8
|
+
* tab and the Content tab each drew an empty `[part="control-host"]` and this filled it with lit.
|
|
8
9
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
10
|
+
* §5.6 landed, so the control is `jx-color-field` and both tabs draw it inline in their own
|
|
11
|
+
* documents. What no kit element can answer is what is LEFT here: which colours this project has
|
|
12
|
+
* given a name to. That is a question about the document being edited — the `--color-*` custom
|
|
13
|
+
* properties of the effective style, site and document together — and it is Studio's to answer.
|
|
14
|
+
*
|
|
15
|
+
* A token is projected as three separate things on purpose, because they are three:
|
|
16
|
+
*
|
|
17
|
+
* - `value` is what choosing it COMMITS, and it is the reference (`var(--color-accent)`) rather than
|
|
18
|
+
* the colour behind it. Committing the literal would resolve the token at the moment of the click
|
|
19
|
+
* and quietly opt that one declaration out of the palette for ever.
|
|
20
|
+
* - `color` is how the chip LOOKS, which is the literal, and is not what the swatch means.
|
|
21
|
+
* - `label` is the word a reader would use. A colour is not a name: `jx-swatch` announces its own
|
|
22
|
+
* `value` when it is given no label, and "var(--color-primary-blue)" read one character at a time
|
|
23
|
+
* is a name in the same sense that a licence plate is.
|
|
24
|
+
*
|
|
25
|
+
* @docs studio/design/style-inspector
|
|
12
26
|
*/
|
|
13
27
|
|
|
14
|
-
import { LitElement, html, nothing } from "lit";
|
|
15
|
-
import { html as litHtml } from "lit-html";
|
|
16
|
-
import { live } from "lit-html/directives/live.js";
|
|
17
|
-
import { debouncedStyleCommit } from "../store";
|
|
18
28
|
import { activeTab } from "../workspace/workspace";
|
|
19
29
|
import { getEffectiveStyle } from "../site-context";
|
|
30
|
+
import { resolveTokenValue, tokenRefName } from "../style/token-ref";
|
|
20
31
|
import { kebabToLabel } from "../utils/studio-utils";
|
|
21
32
|
|
|
22
|
-
|
|
23
|
-
|
|
33
|
+
/**
|
|
34
|
+
* One colour the project has named, as a swatch reads it.
|
|
35
|
+
*
|
|
36
|
+
* `Record<string, unknown>` because it is a `$map` item: a repeater's scope is a record, and a
|
|
37
|
+
* shape that is not one cannot be read through `$map/item/...`.
|
|
38
|
+
*/
|
|
39
|
+
export interface ColorTokenView extends Record<string, unknown> {
|
|
40
|
+
/** What choosing this swatch commits — the reference, never the literal behind it. */
|
|
24
41
|
value: string;
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
/** Extract --color-* CSS custom properties from the effective (site + document) style. */
|
|
30
|
-
function getColorVars() {
|
|
31
|
-
const style = getEffectiveStyle(activeTab.value?.doc.document?.style);
|
|
32
|
-
if (!style) {
|
|
33
|
-
return [];
|
|
34
|
-
}
|
|
35
|
-
const vars = [];
|
|
36
|
-
for (const [k, v] of Object.entries(style)) {
|
|
37
|
-
if (k.startsWith("--color") && (typeof v === "string" || typeof v === "number")) {
|
|
38
|
-
vars.push({ name: k, value: String(v) });
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
return vars;
|
|
42
|
+
/** The chip's colour: how the token looks, which is not what it means. */
|
|
43
|
+
color: string;
|
|
44
|
+
/** The token's name, title-cased — "Primary Blue" — and the swatch's accessible name. */
|
|
45
|
+
label: string;
|
|
42
46
|
}
|
|
43
47
|
|
|
44
48
|
/**
|
|
45
|
-
* Convert a
|
|
46
|
-
*
|
|
49
|
+
* Convert a colour variable's name to a title-case label.
|
|
50
|
+
*
|
|
51
|
+
* Strips the `--color-` prefix and converts kebab to title case, so `--color-primary-blue` becomes
|
|
52
|
+
* "Primary Blue". A token named `--color` alone has nothing left after the prefix, and falls back
|
|
53
|
+
* to its own name rather than announcing itself as the empty string.
|
|
54
|
+
*
|
|
55
|
+
* @param {string} name The custom property's name, with its leading dashes.
|
|
56
|
+
* @returns {string}
|
|
47
57
|
*/
|
|
48
|
-
function varToLabel(name: string) {
|
|
49
|
-
return kebabToLabel(name.replace(/^--color-?/, ""));
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
/** Resolve a color value for display — if it's a var() reference, look up the actual color. */
|
|
53
|
-
function resolveColorForDisplay(val: string | number | undefined) {
|
|
54
|
-
if (!val) {
|
|
55
|
-
return "transparent";
|
|
56
|
-
}
|
|
57
|
-
const s = String(val);
|
|
58
|
-
const m = s.match(/^var\((--[^)]+)\)$/);
|
|
59
|
-
if (m) {
|
|
60
|
-
const style = getEffectiveStyle(activeTab.value?.doc.document?.style);
|
|
61
|
-
const resolved = style?.[m[1]!];
|
|
62
|
-
if (typeof resolved === "string") {
|
|
63
|
-
return resolved;
|
|
64
|
-
}
|
|
65
|
-
return "transparent";
|
|
66
|
-
}
|
|
67
|
-
return s;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
function safeColor(val: string | number | undefined) {
|
|
71
|
-
if (!val) {
|
|
72
|
-
return "transparent";
|
|
73
|
-
}
|
|
74
|
-
return resolveColorForDisplay(val);
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
/** Normalize a color string to include # prefix for hex values. */
|
|
78
|
-
function normalizeHex(c: string) {
|
|
79
|
-
if (!c) {
|
|
80
|
-
return c;
|
|
81
|
-
}
|
|
82
|
-
if (c.startsWith("var(") || c.startsWith("rgb") || c.startsWith("hsl")) {
|
|
83
|
-
return c;
|
|
84
|
-
}
|
|
85
|
-
return c.replace(/^#?/, "#");
|
|
58
|
+
function varToLabel(name: string): string {
|
|
59
|
+
return kebabToLabel(name.replace(/^--color-?/, "")) || name;
|
|
86
60
|
}
|
|
87
61
|
|
|
88
62
|
/**
|
|
89
|
-
*
|
|
63
|
+
* The `--color-*` custom properties of the effective (site + document) style, in the order they are
|
|
64
|
+
* written.
|
|
65
|
+
*
|
|
66
|
+
* Only scalars are taken. A custom property whose value is an object is a nested rule rather than a
|
|
67
|
+
* colour, and a swatch drawn from one would be a chip of nothing labelled with a name that commits
|
|
68
|
+
* a reference to something that is not a colour.
|
|
90
69
|
*
|
|
91
|
-
* @
|
|
92
|
-
* @param {{ name: string; value: string }[]} colorVars
|
|
70
|
+
* @returns {ColorTokenView[]} The palette, empty when the document defines no colours.
|
|
93
71
|
*/
|
|
94
|
-
function
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
return null;
|
|
104
|
-
}
|
|
105
|
-
return colorVars.find((cv) => cv.name === m[1]) || null;
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
// ─── JxColorPopover LitElement ──────────────────────────────────────────────
|
|
109
|
-
|
|
110
|
-
export class JxColorPopover extends LitElement {
|
|
111
|
-
static override properties = {
|
|
112
|
-
color: { type: String },
|
|
113
|
-
colorVars: { attribute: false },
|
|
114
|
-
displayColor: { attribute: false, type: String },
|
|
115
|
-
};
|
|
116
|
-
|
|
117
|
-
declare color: string;
|
|
118
|
-
declare displayColor: string;
|
|
119
|
-
declare colorVars: ColorVar[];
|
|
120
|
-
|
|
121
|
-
constructor() {
|
|
122
|
-
super();
|
|
123
|
-
this.color = "";
|
|
124
|
-
this.displayColor = "#000000";
|
|
125
|
-
this.colorVars = [];
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
/** No shadow DOM — render directly into light DOM for Spectrum theming */
|
|
129
|
-
override createRenderRoot() {
|
|
130
|
-
return this;
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
/** @param {Map<string, unknown>} changed */
|
|
134
|
-
override willUpdate(changed: Map<string, unknown>) {
|
|
135
|
-
if (changed.has("color")) {
|
|
136
|
-
const raw = resolveColorForDisplay(this.color);
|
|
137
|
-
if (!raw || raw === "transparent") {
|
|
138
|
-
this.displayColor = "#000000";
|
|
139
|
-
} else if (raw.startsWith("#") || raw.startsWith("rgb") || raw.startsWith("hsl")) {
|
|
140
|
-
this.displayColor = raw;
|
|
141
|
-
} else {
|
|
142
|
-
this.displayColor = `#${raw}`;
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
_handleArea(e: Event) {
|
|
148
|
-
const color = normalizeHex(String((e.target as HTMLElement & { color: string }).color));
|
|
149
|
-
this.displayColor = color;
|
|
150
|
-
this.color = color;
|
|
151
|
-
this.dispatchEvent(new CustomEvent("color-change", { bubbles: true, detail: color }));
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
_handleSlider(e: Event) {
|
|
155
|
-
const color = normalizeHex(String((e.target as HTMLElement & { color: string }).color));
|
|
156
|
-
this.displayColor = color;
|
|
157
|
-
this.color = color;
|
|
158
|
-
this.dispatchEvent(new CustomEvent("color-change", { bubbles: true, detail: color }));
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
_handleText(e: Event) {
|
|
162
|
-
const val = (e.target as HTMLInputElement).value.trim();
|
|
163
|
-
if (!val) {
|
|
164
|
-
return;
|
|
72
|
+
export function colorTokens(): ColorTokenView[] {
|
|
73
|
+
/* `getEffectiveStyle` answers with an object whatever it is given — the site's, the document's,
|
|
74
|
+
the two merged, or an empty one — so there is no absent case to guard, and the guard that used
|
|
75
|
+
to stand here was a branch no test could reach because nothing could produce it. */
|
|
76
|
+
const style = getEffectiveStyle(activeTab.value?.doc.document?.style);
|
|
77
|
+
const tokens: ColorTokenView[] = [];
|
|
78
|
+
for (const [name, value] of Object.entries(style)) {
|
|
79
|
+
if (name.startsWith("--color") && (typeof value === "string" || typeof value === "number")) {
|
|
80
|
+
tokens.push({ color: String(value), label: varToLabel(name), value: `var(${name})` });
|
|
165
81
|
}
|
|
166
|
-
this.displayColor = val;
|
|
167
|
-
this.color = val;
|
|
168
|
-
this.dispatchEvent(new CustomEvent("color-change", { bubbles: true, detail: val }));
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
_handleSwatch(e: Event, varName: string) {
|
|
172
|
-
e.stopPropagation();
|
|
173
|
-
const varRef = `var(${varName})`;
|
|
174
|
-
this.color = varRef;
|
|
175
|
-
this.dispatchEvent(new CustomEvent("color-change", { bubbles: true, detail: varRef }));
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
override render() {
|
|
179
|
-
return html`
|
|
180
|
-
<div class="color-popover-inner">
|
|
181
|
-
<sp-color-area
|
|
182
|
-
style="width:200px; height:150px; --mod-colorarea-width:200px; --mod-colorarea-height:150px"
|
|
183
|
-
.color=${this.displayColor}
|
|
184
|
-
@input=${this._handleArea}
|
|
185
|
-
></sp-color-area>
|
|
186
|
-
<sp-color-slider
|
|
187
|
-
style="width:200px; --mod-colorslider-length:200px"
|
|
188
|
-
.color=${this.displayColor}
|
|
189
|
-
@input=${this._handleSlider}
|
|
190
|
-
></sp-color-slider>
|
|
191
|
-
<sp-textfield
|
|
192
|
-
size="s"
|
|
193
|
-
style="width:200px"
|
|
194
|
-
.value=${live(this.color || "")}
|
|
195
|
-
placeholder="#000000"
|
|
196
|
-
@change=${this._handleText}
|
|
197
|
-
></sp-textfield>
|
|
198
|
-
${
|
|
199
|
-
this.colorVars.length > 0
|
|
200
|
-
? html`
|
|
201
|
-
<sp-divider size="s"></sp-divider>
|
|
202
|
-
<span class="color-popover-swatches-label">Color Tokens</span>
|
|
203
|
-
<sp-swatch-group size="xs" border="light" rounding="none">
|
|
204
|
-
${this.colorVars.map(
|
|
205
|
-
(cv) => html`
|
|
206
|
-
<sp-swatch
|
|
207
|
-
color=${cv.value}
|
|
208
|
-
.value=${cv.name}
|
|
209
|
-
title=${cv.name}
|
|
210
|
-
@click=${(e: Event) => this._handleSwatch(e, cv.name)}
|
|
211
|
-
></sp-swatch>
|
|
212
|
-
`,
|
|
213
|
-
)}
|
|
214
|
-
</sp-swatch-group>
|
|
215
|
-
`
|
|
216
|
-
: nothing
|
|
217
|
-
}
|
|
218
|
-
</div>
|
|
219
|
-
`;
|
|
220
82
|
}
|
|
83
|
+
return tokens;
|
|
221
84
|
}
|
|
222
85
|
|
|
223
|
-
// ─── Color input widget ─────────────────────────────────────────────────────
|
|
224
|
-
|
|
225
86
|
/**
|
|
226
|
-
*
|
|
227
|
-
*
|
|
87
|
+
* The literal behind a colour value that is a token reference, for a chip to draw.
|
|
88
|
+
*
|
|
89
|
+
* `var(--color-accent)` is a perfectly good value for the document being edited and nothing at all
|
|
90
|
+
* for the page drawing the Inspector: the token lives in the project's style, which the canvas
|
|
91
|
+
* iframe loads and Studio's own chrome never sees, so a `jx-color-field` handed the reference alone
|
|
92
|
+
* drew the no-colour checkerboard the moment a palette swatch was picked. This is the answer both
|
|
93
|
+
* tabs hand the field's `resolved` prop (ui.md §5.6): the chain followed through the effective
|
|
94
|
+
* style to the colour at its end.
|
|
228
95
|
*
|
|
229
|
-
*
|
|
230
|
-
*
|
|
96
|
+
* Empty for a literal, which draws itself, and for a reference the style cannot resolve — a token a
|
|
97
|
+
* stylesheet defines, or an alias loop — where the field's own fallback is the right one.
|
|
231
98
|
*
|
|
232
|
-
* @param {string}
|
|
233
|
-
* @
|
|
234
|
-
* @param {(color: string) => void} onChange — commit callback
|
|
235
|
-
* @returns {import("lit-html").TemplateResult}
|
|
99
|
+
* @param {string} value The row's value as the field holds it.
|
|
100
|
+
* @returns {string} The colour to draw, or the empty string.
|
|
236
101
|
*/
|
|
237
|
-
export function
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
/** @type {(color: string) => void} */ onChange: (color: string) => void,
|
|
241
|
-
) {
|
|
242
|
-
const colorVars = getColorVars();
|
|
243
|
-
const matchedVar = matchesColorVar(value, colorVars);
|
|
244
|
-
const triggerId = `color-trigger-${prop}`;
|
|
245
|
-
const pickerTriggerId = `color-picker-${prop}`;
|
|
246
|
-
|
|
247
|
-
// ─── Picker mode: value matches a defined color variable ───
|
|
248
|
-
if (matchedVar) {
|
|
249
|
-
return litHtml`
|
|
250
|
-
<div class="style-input-color">
|
|
251
|
-
<sp-swatch
|
|
252
|
-
size="s"
|
|
253
|
-
rounding="none"
|
|
254
|
-
border="light"
|
|
255
|
-
color=${matchedVar.value}
|
|
256
|
-
id=${triggerId}
|
|
257
|
-
></sp-swatch>
|
|
258
|
-
<sp-overlay trigger="${triggerId}@click" placement="bottom-start" type="auto">
|
|
259
|
-
<sp-popover style="padding:12px">
|
|
260
|
-
<jx-color-popover
|
|
261
|
-
.color=${value || ""}
|
|
262
|
-
.colorVars=${colorVars}
|
|
263
|
-
@color-change=${(e: CustomEvent) => onChange(e.detail as string)}
|
|
264
|
-
></jx-color-popover>
|
|
265
|
-
</sp-popover>
|
|
266
|
-
</sp-overlay>
|
|
267
|
-
<sp-picker
|
|
268
|
-
id=${pickerTriggerId}
|
|
269
|
-
size="s"
|
|
270
|
-
style="flex:1; min-width:0"
|
|
271
|
-
.value=${`var(${matchedVar.name})`}
|
|
272
|
-
@change=${(e: Event) => {
|
|
273
|
-
e.stopPropagation();
|
|
274
|
-
onChange((e.target as HTMLInputElement).value);
|
|
275
|
-
}}
|
|
276
|
-
>
|
|
277
|
-
${colorVars.map(
|
|
278
|
-
(cv) => litHtml`
|
|
279
|
-
<sp-menu-item value=${`var(${cv.name})`}>
|
|
280
|
-
<sp-swatch
|
|
281
|
-
slot="icon"
|
|
282
|
-
size="xs"
|
|
283
|
-
rounding="none"
|
|
284
|
-
border="light"
|
|
285
|
-
color=${cv.value}
|
|
286
|
-
></sp-swatch>
|
|
287
|
-
${varToLabel(cv.name)}
|
|
288
|
-
</sp-menu-item>
|
|
289
|
-
`,
|
|
290
|
-
)}
|
|
291
|
-
</sp-picker>
|
|
292
|
-
</div>
|
|
293
|
-
`;
|
|
102
|
+
export function resolvedColor(value: string): string {
|
|
103
|
+
if (tokenRefName(value) === null) {
|
|
104
|
+
return "";
|
|
294
105
|
}
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
return
|
|
298
|
-
<div class="style-input-color" id=${triggerId}>
|
|
299
|
-
<sp-swatch
|
|
300
|
-
size="s"
|
|
301
|
-
rounding="none"
|
|
302
|
-
border="light"
|
|
303
|
-
color=${safeColor(value)}
|
|
304
|
-
></sp-swatch>
|
|
305
|
-
<sp-textfield
|
|
306
|
-
size="s"
|
|
307
|
-
style="flex:1; min-width:0"
|
|
308
|
-
.value=${live(value || "")}
|
|
309
|
-
@click=${(e: Event) => e.stopPropagation()}
|
|
310
|
-
@input=${debouncedStyleCommit(`color:${prop}`, 400, (e: Event) => {
|
|
311
|
-
onChange((e.target as HTMLInputElement).value.trim());
|
|
312
|
-
})}
|
|
313
|
-
></sp-textfield>
|
|
314
|
-
<sp-overlay trigger="${triggerId}@click" placement="bottom-start" type="auto">
|
|
315
|
-
<sp-popover style="padding:12px">
|
|
316
|
-
<jx-color-popover
|
|
317
|
-
.color=${value || ""}
|
|
318
|
-
.colorVars=${colorVars}
|
|
319
|
-
@color-change=${(e: CustomEvent) => onChange(e.detail as string)}
|
|
320
|
-
></jx-color-popover>
|
|
321
|
-
</sp-popover>
|
|
322
|
-
</sp-overlay>
|
|
323
|
-
</div>
|
|
324
|
-
`;
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
/** Whether any color popover is currently open. */
|
|
328
|
-
export function isColorPopoverOpen() {
|
|
329
|
-
return Boolean(document.querySelector(".style-input-color sp-overlay[open]"));
|
|
106
|
+
const style = getEffectiveStyle(activeTab.value?.doc.document?.style);
|
|
107
|
+
const resolved = resolveTokenValue(style, value);
|
|
108
|
+
return resolved === undefined ? "" : String(resolved);
|
|
330
109
|
}
|