@jxsuite/studio 4.0.0 → 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/data/elements-meta.json +5 -15
- package/data/html-meta.json +51 -6
- package/dist/chunks/{2020-xp8vnwma.js → 2020-g79n01v9.js} +14 -14
- package/dist/chunks/action-group-sp6tna8v.js +118 -0
- package/dist/chunks/adapter-nj7tnjfn.js +13 -0
- package/dist/chunks/cf-account-picker-fyf63pmy.js +495 -0
- package/dist/chunks/cf-settings-71bv5zn9.js +20 -0
- package/dist/chunks/color-area-v17df7b8.js +154 -0
- package/dist/chunks/color-field-anwybnkn.js +208 -0
- package/dist/chunks/color-slider-44ez96fc.js +79 -0
- package/dist/chunks/color-xgg3kfw7.js +35 -0
- package/dist/chunks/combobox-5e7jev23.js +236 -0
- package/dist/chunks/components-2w1f35qs.js +18 -0
- package/dist/chunks/content-source-3wqeas45.js +46 -0
- package/dist/chunks/convert-to-repeater-d0cgnb6d.js +639 -0
- package/dist/chunks/dialog-s890b918.js +85 -0
- package/dist/chunks/editor-3qhbg51x.js +35 -0
- package/dist/chunks/entry-commands-d6g50j7s.js +42 -0
- package/dist/chunks/extension-sections-fy7q4fe9.js +651 -0
- package/dist/chunks/file-ops-3btj6st0.js +47 -0
- package/dist/chunks/files-ef8fgs3w.js +72 -0
- package/dist/chunks/format-host-3c33nwr8.js +40 -0
- package/dist/chunks/fs-events-13tj6sex.js +18 -0
- package/dist/chunks/git-panel-4wp2rn9b.js +49 -0
- package/dist/chunks/icons-yy10wk9r.js +402 -0
- package/dist/chunks/iframe-entry-15g3n6xv.js +114 -0
- package/dist/chunks/iframe-entry-b27vq81n.js +203 -0
- package/dist/chunks/iframe-entry-nbyxee1y.js +154 -0
- package/dist/chunks/iframe-host-jgesd924.js +115 -0
- package/dist/chunks/{index-nj44jpzj.js → index-mdmyx6s2.js} +11 -11
- package/dist/chunks/index-n4j7qxyr.js +109 -0
- package/dist/chunks/{javascript-q8kpmfah.js → javascript-xvrfrpkb.js} +8 -9
- package/dist/chunks/{jsonMode-dkr040ga.js → jsonMode-tyx2kj6p.js} +526 -527
- package/dist/chunks/jx-validate-j0wxk72w.js +15 -0
- package/dist/chunks/layers-1nq5evsh.js +29 -0
- package/dist/chunks/layers-panel-ar2gh90g.js +40 -0
- package/dist/chunks/listbox-6v2ac08j.js +44 -0
- package/dist/chunks/lit-html-m244w9nh.js +17 -0
- package/dist/chunks/media-picker-2qbetq73.js +33 -0
- package/dist/chunks/menu-q99sy9rf.js +285 -0
- package/dist/chunks/menu-rf7n72mf.js +14 -0
- package/dist/chunks/{monaco-binding-rj6xpx9y.js → monaco-binding-sw6en4dw.js} +12 -15
- package/dist/chunks/monaco-buffer-bhy3hb6m.js +24 -0
- package/dist/chunks/{monaco-setup-rws7k4br.js → monaco-setup-8r62fj6y.js} +27 -37
- package/dist/chunks/notify-628t0anh.js +21 -0
- package/dist/chunks/number-field-5cndyft8.js +72 -0
- package/dist/chunks/parse-0zx14y15.js +10 -0
- package/dist/chunks/platform-ts9cg1a4.js +15 -0
- package/dist/chunks/popover-47z3ytva.js +25 -0
- package/dist/chunks/publish-panel-98f7sr3g.js +27 -0
- package/dist/chunks/quick-search-srzz83k2.js +45 -0
- package/dist/chunks/references-n553f0e1.js +26 -0
- package/dist/chunks/right-panel-rrgx2dn3.js +45 -0
- package/dist/chunks/section-registry-5pq32t0q.js +25 -0
- package/dist/chunks/select-2r16ez41.js +49 -0
- package/dist/chunks/split-g7nm1rgb.js +191 -0
- package/dist/chunks/studio-0hqbpbd0.js +62 -0
- package/dist/chunks/studio-18avnhjp.js +2430 -0
- package/dist/chunks/{studio-kryvsw6j.js → studio-1k325pwf.js} +48 -48
- package/dist/chunks/{studio-hbtp0eh1.js → studio-25hkdrkw.js} +356 -85
- package/dist/chunks/studio-26d7myd1.js +258 -0
- package/dist/chunks/{studio-p8j86wag.js → studio-38emantv.js} +22 -5
- package/dist/chunks/studio-3gxv60tn.js +422 -0
- package/dist/chunks/{studio-8swrjbny.js → studio-3hxkd92t.js} +275 -163
- package/dist/chunks/studio-4m0haseg.js +185 -0
- package/dist/chunks/{studio-ynxwkrzd.js → studio-4wbb9ct0.js} +1953 -1785
- package/dist/chunks/{studio-gv8vvshc.js → studio-5523bpzt.js} +11 -11
- package/dist/chunks/{studio-5q69gfag.js → studio-57mf66w2.js} +1753 -2484
- package/dist/chunks/studio-5jy81t3s.js +17463 -0
- package/dist/chunks/studio-5rt7sqa0.js +1168 -0
- package/dist/chunks/studio-5te5tqng.js +81 -0
- package/dist/chunks/{studio-p4ngc046.js → studio-6ewqv390.js} +9 -9
- package/dist/chunks/{studio-9ab8gqsm.js → studio-6nzaktvy.js} +7 -7
- package/dist/chunks/studio-6xa21ej9.js +28 -0
- package/dist/chunks/{studio-5ehhackm.js → studio-727xh0e3.js} +19 -19
- package/dist/chunks/{studio-eenfkt4e.js → studio-79y5sz51.js} +52 -38
- package/dist/chunks/{studio-4q0wznzf.js → studio-7e11jpa9.js} +461 -145
- package/dist/chunks/{studio-q7v10cg2.js → studio-7r42c6ca.js} +17 -7
- package/dist/chunks/studio-7xptrg0j.js +954 -0
- package/dist/chunks/{studio-cft9r4r7.js → studio-81390n6f.js} +22 -22
- package/dist/chunks/{studio-q43a5y9h.js → studio-8jn5yhyn.js} +16 -16
- package/dist/chunks/studio-8qtrpzr3.js +839 -0
- package/dist/chunks/{studio-dg7zyt5x.js → studio-98b3z07n.js} +1 -1
- package/dist/chunks/studio-9xxz1q69.js +1356 -0
- package/dist/chunks/studio-akbww0j5.js +13615 -0
- package/dist/chunks/studio-arfpe389.js +195 -0
- package/dist/chunks/{studio-2zkz8evn.js → studio-az3zd49t.js} +473 -281
- package/dist/chunks/studio-cpvb2ed1.js +1171 -0
- package/dist/chunks/{studio-9r6j5ev1.js → studio-d0300636.js} +5078 -19
- package/dist/chunks/{studio-bgxt93ga.js → studio-d055c37e.js} +13 -13
- package/dist/chunks/studio-d1ja2x9r.js +362 -0
- package/dist/chunks/{studio-b9b6t1dg.js → studio-e1f24eff.js} +5664 -5666
- package/dist/chunks/{studio-4pqqxbrt.js → studio-em9nw8eh.js} +301 -112
- package/dist/chunks/studio-erdatzvp.js +1190 -0
- package/dist/chunks/{studio-g1wdche0.js → studio-esrxgwh6.js} +80 -80
- package/dist/chunks/studio-fabxk6r9.js +2811 -0
- package/dist/chunks/{studio-3n4ndrzh.js → studio-h4nvnjvz.js} +303 -303
- package/dist/chunks/studio-hhvs4sdg.js +195 -0
- package/dist/chunks/{studio-68n67094.js → studio-kcgff4r0.js} +15 -18
- package/dist/chunks/{studio-685s0ytq.js → studio-nqgawfks.js} +572 -572
- package/dist/chunks/{studio-xrapxwwc.js → studio-p1dw8wfw.js} +55 -29
- package/dist/chunks/studio-pm6hgy7r.js +4763 -0
- package/dist/chunks/studio-q0a3yk4n.js +33 -0
- package/dist/chunks/{studio-wcy8trfx.js → studio-q3x06vmj.js} +23 -22
- package/dist/chunks/studio-qahxvnan.js +111 -0
- package/dist/chunks/{studio-53n8bp04.js → studio-r6xmmtfh.js} +1 -1
- package/dist/chunks/{studio-kjjsjak4.js → studio-rkstz940.js} +3661 -6136
- package/dist/chunks/{studio-tvgyw9xw.js → studio-rnyf3f8e.js} +83 -250
- package/dist/chunks/studio-rpyah2ew.js +2805 -0
- package/dist/chunks/studio-rs76k67r.js +12 -0
- package/dist/chunks/{studio-yxrkyv8a.js → studio-s6z853aq.js} +12108 -11766
- package/dist/chunks/{studio-sf7zjgv1.js → studio-sgdc5pfc.js} +8 -8
- package/dist/chunks/studio-tb3ev01j.js +763 -0
- package/dist/chunks/{studio-t5wqwzdh.js → studio-tjjk7jvk.js} +1 -1
- package/dist/chunks/studio-vhv5tgxm.js +51 -0
- package/dist/chunks/{studio-htsf0w6m.js → studio-vz68yn9e.js} +31 -154
- package/dist/chunks/studio-wqpngpsk.js +174 -0
- package/dist/chunks/{studio-eesa1myv.js → studio-x3rty6tr.js} +58 -58
- package/dist/chunks/studio-xsykpvsh.js +8448 -0
- package/dist/chunks/{studio-92ab2jqe.js → studio-y9zedyjn.js} +14 -14
- package/dist/chunks/studio-yxa81f45.js +12 -0
- package/dist/chunks/swatch-group-t0n6h2rn.js +139 -0
- package/dist/chunks/tabs-wbp1cdws.js +156 -0
- package/dist/chunks/textfield-abk6qyee.js +73 -0
- package/dist/chunks/toast-780pvfbv.js +27 -0
- package/dist/chunks/toast-host-3sqv46sn.js +116 -0
- package/dist/chunks/toolbar-xbh5bhtr.js +194 -0
- package/dist/chunks/tooltip-eptb614w.js +369 -0
- package/dist/chunks/tree-a73p0pqm.js +367 -0
- package/dist/chunks/{tsMode-76kr53q0.js → tsMode-jy4m86rv.js} +83 -85
- package/dist/chunks/workspace-wrew8zk4.js +69 -0
- package/dist/chunks/{ws-client-6shc5rze.js → ws-client-ny4zc51r.js} +20 -22
- package/dist/iframe-entry.js +1812 -698
- package/dist/manifest.json +7 -0
- package/dist/studio.js +52900 -36573
- package/dist/workers/editor.worker.js +1040 -1085
- package/dist/workers/json.worker.js +1946 -1991
- package/dist/workers/ts.worker.js +4960 -5005
- package/favicon.ico +0 -0
- package/index.html +2 -0
- package/package.json +22 -55
- package/src/about/about-modal.ts +73 -123
- package/src/browse/library-commands.ts +20 -49
- package/src/browse/library-layouts.ts +87 -218
- package/src/browse/library-pane.ts +406 -438
- package/src/canvas/canvas-helpers.ts +0 -49
- package/src/canvas/canvas-live-render.ts +25 -2
- package/src/canvas/canvas-render.ts +666 -231
- package/src/canvas/canvas-surface.ts +0 -1
- package/src/canvas/canvas-utils.ts +310 -117
- package/src/canvas/dialog-path.ts +76 -0
- package/src/canvas/dialog-state.ts +67 -0
- package/src/canvas/diff-marks.ts +252 -0
- package/src/canvas/diff-toolbar.ts +349 -0
- package/src/canvas/diff-view.ts +123 -0
- package/src/canvas/edit-width-drag.ts +187 -0
- package/src/canvas/edit-width.ts +150 -0
- package/src/canvas/iframe-entry.ts +125 -8
- package/src/canvas/iframe-host.ts +271 -15
- package/src/canvas/iframe-interaction.ts +133 -13
- package/src/canvas/iframe-patch.ts +7 -1
- package/src/canvas/iframe-position.ts +5 -6
- package/src/canvas/iframe-protocol.ts +106 -5
- package/src/canvas/iframe-render.ts +373 -5
- package/src/canvas/iframe-slash.ts +2 -2
- package/src/canvas/iframe-subtree.ts +5 -8
- package/src/canvas/path-mapping.ts +25 -3
- package/src/canvas/popover-path.ts +106 -0
- package/src/canvas/popover-state.ts +155 -0
- package/src/canvas/surface-registry.ts +21 -10
- package/src/collab/presence-chips.ts +51 -73
- package/src/commands/app-commands.ts +10 -0
- package/src/commands/budget.ts +12 -0
- package/src/commands/command-args.ts +369 -6
- package/src/commands/defaults.ts +44 -14
- package/src/commands/live-context.ts +11 -5
- package/src/commands/reference.ts +12 -2
- package/src/commands/registry.ts +165 -8
- package/src/content/entry-commands.ts +16 -23
- package/src/content/entry-editor.ts +144 -101
- package/src/editor/canvas-slash-bridge.ts +2 -2
- package/src/editor/context-menu.ts +49 -200
- package/src/editor/convert-to-component.ts +42 -82
- package/src/editor/convert-to-repeater.ts +132 -173
- package/src/editor/inline-edit.ts +11 -0
- package/src/editor/shortcuts.ts +65 -26
- package/src/editor/slash-menu.ts +150 -157
- package/src/files/file-ops.ts +117 -11
- package/src/files/files.ts +949 -664
- package/src/files/json-layout.ts +474 -0
- package/src/files/media-paths.ts +13 -42
- package/src/files/media-usage.ts +41 -131
- package/src/files/serialize-document.ts +8 -1
- package/src/format/convert-file.ts +16 -10
- package/src/format/format-host.ts +50 -1
- package/src/github/github-auth.ts +71 -29
- package/src/github/github-publish.ts +57 -65
- package/src/grid/cell-editors.ts +46 -4
- package/src/grid/cell-popovers.ts +65 -62
- package/src/grid/grid-open.ts +86 -64
- package/src/grid/grid-panel.ts +390 -469
- package/src/grid/redirects-grid.ts +40 -44
- package/src/hosting/document.ts +2 -0
- package/src/hosting/layout.ts +10 -0
- package/src/i18n/i18n-commands.ts +127 -62
- package/src/media/media-pane.ts +83 -133
- package/src/new-project/add-repo-modal.ts +125 -176
- package/src/new-project/import-tab.ts +201 -250
- package/src/new-project/location-fields.ts +101 -165
- package/src/new-project/new-project-modal.ts +376 -367
- package/src/packages/jxsuite-update.ts +76 -18
- package/src/panels/activity-panel.ts +137 -104
- package/src/panels/ai-chat/chat-markdown.ts +15 -13
- package/src/panels/ai-chat/chat-view.ts +307 -472
- package/src/panels/ai-chat/composer.ts +175 -153
- package/src/panels/ai-chat/sessions-view.ts +31 -62
- package/src/panels/ai-panel.ts +210 -185
- package/src/panels/block-action-bar.ts +437 -643
- package/src/panels/bottom-dock.ts +112 -47
- package/src/panels/chat-panel.ts +19 -14
- package/src/panels/data-explorer.ts +141 -102
- package/src/panels/data-grid.ts +183 -150
- package/src/panels/dnd.ts +75 -20
- package/src/panels/editors.ts +26 -19
- package/src/panels/elements-panel.ts +243 -186
- package/src/panels/empty-state.ts +26 -42
- package/src/panels/events-panel.ts +950 -729
- package/src/panels/formula-workspace.ts +434 -207
- package/src/panels/frontmatter-fields.ts +185 -153
- package/src/panels/frontmatter-panel.ts +411 -187
- package/src/panels/git-diff-open.ts +148 -0
- package/src/panels/git-panel.ts +679 -605
- package/src/panels/head-panel.ts +617 -435
- package/src/panels/i18n-panel.ts +153 -133
- package/src/panels/imports-panel.ts +388 -414
- package/src/panels/jump-bar.ts +174 -147
- package/src/panels/layers-panel.ts +785 -671
- package/src/panels/left-panel.ts +166 -94
- package/src/panels/navigator-panels.ts +1 -1
- package/src/panels/pane-context.ts +529 -677
- package/src/panels/pane-grid.ts +265 -241
- package/src/panels/panel-registry.ts +15 -4
- package/src/panels/problems-panel.ts +177 -99
- package/src/panels/properties-panel.ts +1525 -966
- package/src/panels/provenance.ts +31 -113
- package/src/panels/quick-search.ts +217 -172
- package/src/panels/right-panel.ts +135 -169
- package/src/panels/seo-modal.ts +346 -167
- package/src/panels/settings-menu.ts +109 -646
- package/src/panels/settings-pane.ts +102 -86
- package/src/panels/signals-panel.ts +1318 -1172
- package/src/panels/statement-editor.ts +556 -428
- package/src/panels/style-panel.ts +1367 -630
- package/src/panels/style-utils.ts +36 -32
- package/src/panels/stylebook-doc.ts +30 -73
- package/src/panels/stylebook-layers-panel.ts +202 -109
- package/src/panels/stylebook-panel.ts +124 -88
- package/src/panels/tab-strip.ts +385 -287
- package/src/platforms/cloud.ts +347 -86
- package/src/platforms/devserver.ts +13 -0
- package/src/publish/deploy-checklist.ts +124 -78
- package/src/publish/publish-commands.ts +4 -12
- package/src/publish/publish-panel.ts +165 -299
- package/src/services/a11y-report.ts +100 -43
- package/src/services/ai-command-tools.ts +468 -0
- package/src/services/ai-import-tools.ts +50 -12
- package/src/services/ai-models.ts +108 -1
- package/src/services/ai-session-store.ts +6 -0
- package/src/services/ai-system-prompt.ts +110 -18
- package/src/services/ai-tools.ts +28 -143
- package/src/services/ai-write-report.ts +174 -0
- package/src/services/context-manager.ts +12 -1
- package/src/services/document-assistant.ts +50 -2
- package/src/services/idle.ts +16 -14
- package/src/services/live-surfaces.ts +237 -0
- package/src/services/model-uri.ts +75 -0
- package/src/services/notify.ts +63 -6
- package/src/services/popover-report.ts +325 -0
- package/src/services/surface-registry.ts +56 -0
- package/src/services/tool-executor.ts +17 -0
- package/src/settings/contexts-section.ts +301 -299
- package/src/settings/contributed-section.ts +361 -222
- package/src/settings/css-vars-editor.ts +320 -325
- package/src/settings/defs-editor.ts +572 -535
- package/src/settings/dependencies-editor.ts +79 -107
- package/src/settings/extension-commands.ts +379 -0
- package/src/settings/extension-rows.ts +113 -0
- package/src/settings/extensions-section.ts +287 -0
- package/src/settings/general-settings.ts +130 -181
- package/src/settings/head-editor.ts +10 -305
- package/src/settings/locales-section.ts +146 -196
- package/src/settings/preferences-accounts.ts +193 -12
- package/src/settings/preferences-dialog.ts +384 -307
- package/src/settings/project-sections.ts +108 -181
- package/src/settings/schema-field-ui.ts +11 -399
- package/src/settings/section-registry.ts +8 -1
- package/src/settings/settings-document.ts +31 -29
- package/src/shell/tree.ts +42 -87
- package/src/shell.ts +48 -36
- package/src/studio.ts +90 -67
- package/src/style/token-ref.ts +0 -39
- package/src/surfaces/about.json +263 -0
- package/src/surfaces/about.ts +163 -0
- package/src/surfaces/add-repo.json +486 -0
- package/src/surfaces/add-repo.ts +236 -0
- package/src/surfaces/ai-chat.json +2185 -0
- package/src/surfaces/ai-chat.ts +549 -0
- package/src/surfaces/ai-credentials-form.json +332 -0
- package/src/surfaces/ai-credentials-form.ts +151 -0
- package/src/surfaces/ai-managed-connect.json +108 -0
- package/src/surfaces/ai-managed-connect.ts +123 -0
- package/src/surfaces/ai-model-picker.json +114 -0
- package/src/surfaces/ai-model-picker.ts +139 -0
- package/src/surfaces/block-action-bar.json +640 -0
- package/src/surfaces/block-action-bar.ts +368 -0
- package/src/surfaces/bottom-dock.json +154 -0
- package/src/surfaces/bottom-dock.ts +125 -0
- package/src/surfaces/canvas-stage.json +444 -0
- package/src/surfaces/canvas-stage.ts +253 -0
- package/src/surfaces/cf-account-picker.json +300 -0
- package/src/surfaces/cf-account-picker.ts +214 -0
- package/src/surfaces/commandbar.json +984 -0
- package/src/{panels/toolbar.ts → surfaces/commandbar.ts} +414 -389
- package/src/surfaces/convert-repeater.json +309 -0
- package/src/surfaces/convert-repeater.ts +276 -0
- package/src/surfaces/data-actions.json +157 -0
- package/src/surfaces/data-actions.ts +115 -0
- package/src/surfaces/dialog.json +289 -0
- package/src/surfaces/dialog.ts +343 -0
- package/src/surfaces/diff-toolbar.json +266 -0
- package/src/surfaces/diff-toolbar.ts +139 -0
- package/src/surfaces/doc-header.json +739 -0
- package/src/surfaces/doc-header.ts +223 -0
- package/src/surfaces/empty-state.json +152 -0
- package/src/surfaces/empty-state.ts +173 -0
- package/src/surfaces/entry-editor.json +281 -0
- package/src/surfaces/entry-editor.ts +191 -0
- package/src/surfaces/expression-editor.json +977 -0
- package/src/surfaces/expression-editor.ts +266 -0
- package/src/surfaces/files-panel.json +592 -0
- package/src/surfaces/files-panel.ts +301 -0
- package/src/surfaces/formula-palette.json +364 -0
- package/src/surfaces/formula-palette.ts +340 -0
- package/src/surfaces/git-panel.json +1822 -0
- package/src/surfaces/git-panel.ts +272 -0
- package/src/surfaces/github-auth.json +112 -0
- package/src/surfaces/github-auth.ts +139 -0
- package/src/surfaces/github-publish.json +206 -0
- package/src/surfaces/github-publish.ts +169 -0
- package/src/surfaces/grid-cell.json +218 -0
- package/src/surfaces/grid-cell.ts +120 -0
- package/src/surfaces/grid-open.json +147 -0
- package/src/surfaces/grid-open.ts +87 -0
- package/src/surfaces/grid-panel.json +706 -0
- package/src/surfaces/grid-panel.ts +206 -0
- package/src/surfaces/grid-replace.json +179 -0
- package/src/surfaces/grid-replace.ts +89 -0
- package/src/surfaces/grid-views.json +446 -0
- package/src/surfaces/grid-views.ts +172 -0
- package/src/surfaces/inspector-dock.json +187 -0
- package/src/surfaces/inspector-dock.ts +161 -0
- package/src/surfaces/jump-bar.json +243 -0
- package/src/surfaces/jump-bar.ts +129 -0
- package/src/surfaces/jxsuite-update.json +146 -0
- package/src/surfaces/jxsuite-update.ts +149 -0
- package/src/surfaces/library-pane.json +1509 -0
- package/src/surfaces/library-pane.ts +363 -0
- package/src/surfaces/logic-panel.json +1949 -0
- package/src/surfaces/logic-panel.ts +369 -0
- package/src/surfaces/logic-workspace.json +685 -0
- package/src/surfaces/logic-workspace.ts +238 -0
- package/src/surfaces/media-browser.json +303 -0
- package/src/surfaces/media-browser.ts +145 -0
- package/src/surfaces/media-field.json +163 -0
- package/src/surfaces/media-field.ts +116 -0
- package/src/surfaces/media-pane.json +513 -0
- package/src/surfaces/media-pane.ts +197 -0
- package/src/surfaces/menu.json +232 -0
- package/src/surfaces/menu.ts +375 -0
- package/src/surfaces/navigator-dock.json +113 -0
- package/src/surfaces/navigator-dock.ts +130 -0
- package/src/surfaces/new-project.json +1654 -0
- package/src/surfaces/new-project.ts +411 -0
- package/src/surfaces/palette.json +535 -0
- package/src/surfaces/pane-context.json +1497 -0
- package/src/surfaces/pane-context.ts +513 -0
- package/src/surfaces/pane-grid.json +188 -0
- package/src/surfaces/pane-grid.ts +250 -0
- package/src/surfaces/panel-activity.json +563 -0
- package/src/surfaces/panel-activity.ts +187 -0
- package/src/surfaces/panel-data.json +141 -0
- package/src/surfaces/panel-data.ts +156 -0
- package/src/surfaces/panel-deploy-checklist.json +283 -0
- package/src/surfaces/panel-deploy-checklist.ts +175 -0
- package/src/surfaces/panel-elements.json +367 -0
- package/src/surfaces/panel-elements.ts +175 -0
- package/src/surfaces/panel-i18n.json +569 -0
- package/src/surfaces/panel-i18n.ts +212 -0
- package/src/surfaces/panel-imports.json +780 -0
- package/src/surfaces/panel-imports.ts +209 -0
- package/src/surfaces/panel-outline.json +734 -0
- package/src/surfaces/panel-outline.ts +326 -0
- package/src/surfaces/panel-page.json +1017 -0
- package/src/surfaces/panel-page.ts +240 -0
- package/src/surfaces/panel-problems.json +497 -0
- package/src/surfaces/panel-problems.ts +157 -0
- package/src/surfaces/panel-signals.json +1973 -0
- package/src/surfaces/panel-signals.ts +436 -0
- package/src/surfaces/panel-stylebook-layers.json +317 -0
- package/src/surfaces/panel-stylebook-layers.ts +155 -0
- package/src/surfaces/preferences.json +850 -0
- package/src/surfaces/preferences.ts +332 -0
- package/src/surfaces/progress-modal.json +110 -0
- package/src/surfaces/progress-modal.ts +150 -0
- package/src/surfaces/properties-panel.json +1578 -0
- package/src/surfaces/properties-panel.ts +337 -0
- package/src/surfaces/publish.json +945 -0
- package/src/surfaces/publish.ts +392 -0
- package/src/surfaces/push-plan.json +110 -0
- package/src/surfaces/push-plan.ts +87 -0
- package/src/surfaces/rail.json +255 -0
- package/src/surfaces/rail.ts +206 -0
- package/src/surfaces/reference-field.json +191 -0
- package/src/surfaces/reference-field.ts +168 -0
- package/src/surfaces/schema-builder.json +1011 -0
- package/src/surfaces/schema-builder.ts +181 -0
- package/src/surfaces/schema-form.json +1013 -0
- package/src/surfaces/schema-form.ts +287 -0
- package/src/surfaces/secret-field.json +60 -0
- package/src/surfaces/secret-field.ts +146 -0
- package/src/surfaces/seo.json +932 -0
- package/src/surfaces/seo.ts +334 -0
- package/src/surfaces/settings-contexts.json +538 -0
- package/src/surfaces/settings-contexts.ts +196 -0
- package/src/surfaces/settings-contributed.json +489 -0
- package/src/surfaces/settings-contributed.ts +199 -0
- package/src/surfaces/settings-css-vars.json +820 -0
- package/src/surfaces/settings-css-vars.ts +199 -0
- package/src/surfaces/settings-defs.json +1363 -0
- package/src/surfaces/settings-defs.ts +232 -0
- package/src/surfaces/settings-deploy.json +108 -0
- package/src/surfaces/settings-deploy.ts +135 -0
- package/src/surfaces/settings-extensions.json +486 -0
- package/src/surfaces/settings-extensions.ts +201 -0
- package/src/surfaces/settings-head.json +779 -0
- package/src/surfaces/settings-head.ts +397 -0
- package/src/surfaces/settings-locales.json +420 -0
- package/src/surfaces/settings-locales.ts +137 -0
- package/src/surfaces/settings-overview.json +423 -0
- package/src/surfaces/settings-overview.ts +218 -0
- package/src/surfaces/settings-packages.json +549 -0
- package/src/surfaces/settings-packages.ts +158 -0
- package/src/surfaces/settings-pane.json +147 -0
- package/src/surfaces/settings-pane.ts +150 -0
- package/src/surfaces/settings-rawjson.json +104 -0
- package/src/surfaces/settings-rawjson.ts +107 -0
- package/src/surfaces/shell.json +99 -0
- package/src/surfaces/shell.ts +30 -0
- package/src/surfaces/slash-menu.json +180 -0
- package/src/surfaces/slash-menu.ts +272 -0
- package/src/surfaces/statements.json +607 -0
- package/src/surfaces/statements.ts +238 -0
- package/src/surfaces/statusbar.json +94 -0
- package/src/{panels → surfaces}/statusbar.ts +163 -90
- package/src/surfaces/style-panel.json +1643 -0
- package/src/surfaces/style-panel.ts +338 -0
- package/src/surfaces/stylebook-chrome.json +122 -0
- package/src/surfaces/stylebook-chrome.ts +122 -0
- package/src/surfaces/tab-strip.json +448 -0
- package/src/surfaces/tab-strip.ts +200 -0
- package/src/surfaces/target-line.json +419 -0
- package/src/surfaces/target-line.ts +349 -0
- package/src/surfaces/toasts.json +189 -0
- package/src/surfaces/welcome.json +571 -0
- package/src/surfaces/welcome.ts +338 -0
- package/src/tabs/project-config.ts +71 -15
- package/src/tabs/tab.ts +52 -1
- package/src/types.ts +49 -3
- package/src/ui/ai-credentials-form.ts +104 -100
- package/src/ui/ai-managed-connect.ts +116 -49
- package/src/ui/ai-model-picker.ts +102 -47
- package/src/ui/cf-account-picker.ts +135 -0
- package/src/ui/color-selector.ts +80 -301
- package/src/ui/dynamic-slot.ts +43 -283
- package/src/ui/expression-editor.ts +797 -576
- package/src/ui/field-input.ts +8 -181
- package/src/ui/form-controls.ts +838 -366
- package/src/ui/formula-chips.ts +80 -85
- package/src/ui/kit.ts +33 -0
- package/src/ui/layers.ts +293 -593
- package/src/ui/media-picker.ts +203 -284
- package/src/ui/panel-resize.ts +251 -64
- package/src/ui/popover-surface.ts +153 -0
- package/src/ui/progress-modal.ts +22 -60
- package/src/ui/regions.ts +13 -7
- package/src/ui/schema-form.ts +906 -440
- package/src/ui/surface.ts +122 -0
- package/src/ui/unit-selector.ts +15 -131
- package/src/ui/value-source.ts +14 -0
- package/src/ui/virtual-window.ts +88 -9
- package/src/utils/canvas-media.ts +72 -0
- package/src/utils/edit-display.ts +7 -2
- package/src/utils/element-selectors.ts +69 -0
- package/src/utils/link-target.ts +2 -2
- package/src/utils/studio-utils.ts +0 -10
- package/src/view.ts +15 -0
- package/src/workspace/pane-derive.ts +36 -14
- package/src/workspace/workspace.ts +15 -6
- package/styles/canvas.css +72 -467
- package/styles/forced-colors.css +48 -82
- package/styles/forced-colors.json +41 -0
- package/styles/inspector.css +2 -1301
- package/styles/overlays.css +96 -2823
- package/styles/panels.css +6 -1423
- package/styles/shell-frame.css +272 -0
- package/styles/shell-frame.json +227 -0
- package/styles/shell.css +0 -1532
- package/styles/tokens.css +65 -136
- package/styles/tokens.json +84 -0
- package/dist/chunks/Overlay.dev-723bv0df.js +0 -23
- package/dist/chunks/adapter-jkcyhgtr.js +0 -14
- package/dist/chunks/cf-settings-45fgyx8y.js +0 -21
- package/dist/chunks/components-zmx10t62.js +0 -21
- package/dist/chunks/content-source-t88vb2dr.js +0 -49
- package/dist/chunks/convert-to-repeater-dhw1nrz9.js +0 -268
- package/dist/chunks/editor-cptq5jp1.js +0 -37
- package/dist/chunks/entry-commands-6z6bhxg0.js +0 -46
- package/dist/chunks/extension-sections-3ydgjbdy.js +0 -311
- package/dist/chunks/file-ops-rskmhxyq.js +0 -48
- package/dist/chunks/files-0cratsr0.js +0 -92
- package/dist/chunks/flow-qbfgrpeh.js +0 -634
- package/dist/chunks/focus-trap.esm-ggawf1hy.js +0 -1024
- package/dist/chunks/focus-visible-6eg70z18.js +0 -167
- package/dist/chunks/format-host-tgcmfs4p.js +0 -43
- package/dist/chunks/fs-events-hrrg328g.js +0 -21
- package/dist/chunks/git-panel-0yywyk76.js +0 -58
- package/dist/chunks/index-zqxmqxmh.js +0 -109
- package/dist/chunks/jx-validate-8q2g05x1.js +0 -19
- package/dist/chunks/layers-panel-z3tqe5cd.js +0 -67
- package/dist/chunks/layers-q75tj2mf.js +0 -45
- package/dist/chunks/lit-html-j055mkh8.js +0 -22
- package/dist/chunks/monaco-buffer-dqw0xxpx.js +0 -25
- package/dist/chunks/notify-yjm79n4s.js +0 -30
- package/dist/chunks/parse-24d0gay3.js +0 -19
- package/dist/chunks/platform-ba1j1gbh.js +0 -16
- package/dist/chunks/publish-panel-54jvhskq.js +0 -28
- package/dist/chunks/quick-search-cgfmjwq5.js +0 -65
- package/dist/chunks/references-3qx8fkyp.js +0 -29
- package/dist/chunks/right-panel-cqp8bc4v.js +0 -46
- package/dist/chunks/section-registry-sx1ykvkw.js +0 -30
- package/dist/chunks/sp-overlay.dev-yztmtrs1.js +0 -18
- package/dist/chunks/sp-popover.dev-n2etmqdp.js +0 -9
- package/dist/chunks/sp-progress-circle.dev-hryhj0es.js +0 -15
- package/dist/chunks/sp-tooltip.dev-xcvpnqr0.js +0 -15
- package/dist/chunks/sp-tray.dev-tkbscm06.js +0 -199
- package/dist/chunks/studio-0a5qrh01.js +0 -3
- package/dist/chunks/studio-18j3bmcz.js +0 -14
- package/dist/chunks/studio-1hbqnt19.js +0 -1823
- package/dist/chunks/studio-4rzyrtjz.js +0 -426
- package/dist/chunks/studio-5rywrkxz.js +0 -1903
- package/dist/chunks/studio-7afd21nw.js +0 -67
- package/dist/chunks/studio-7nte2hj4.js +0 -613
- package/dist/chunks/studio-8jpzqk5s.js +0 -128
- package/dist/chunks/studio-8q517dfr.js +0 -24
- package/dist/chunks/studio-9c4k4vhv.js +0 -357
- package/dist/chunks/studio-9n4mrmnb.js +0 -184
- package/dist/chunks/studio-a0tswy0w.js +0 -58
- package/dist/chunks/studio-ahjfdy6e.js +0 -387
- package/dist/chunks/studio-ahnzd9rg.js +0 -23
- package/dist/chunks/studio-bw5dz6km.js +0 -608
- package/dist/chunks/studio-cb12yz9w.js +0 -15055
- package/dist/chunks/studio-d1ks410h.js +0 -175
- package/dist/chunks/studio-eqq1w638.js +0 -113
- package/dist/chunks/studio-ex8zyp98.js +0 -1813
- package/dist/chunks/studio-h4rxscfc.js +0 -10
- package/dist/chunks/studio-kyh9avvv.js +0 -28
- package/dist/chunks/studio-kyk2v92a.js +0 -659
- package/dist/chunks/studio-m3hwn7y1.js +0 -120
- package/dist/chunks/studio-mmv72a27.js +0 -4344
- package/dist/chunks/studio-n8b9wqwy.js +0 -291
- package/dist/chunks/studio-pdfjntbk.js +0 -6939
- package/dist/chunks/studio-qq6jym04.js +0 -53
- package/dist/chunks/studio-r1r7afxx.js +0 -1066
- package/dist/chunks/studio-rdx8jcxy.js +0 -83
- package/dist/chunks/studio-rn9ta2mz.js +0 -111
- package/dist/chunks/studio-t7qb9db8.js +0 -665
- package/dist/chunks/studio-tmc5emrw.js +0 -8
- package/dist/chunks/studio-txwkm6p9.js +0 -12
- package/dist/chunks/studio-v38hmvx1.js +0 -390
- package/dist/chunks/studio-vadzgkrz.js +0 -318
- package/dist/chunks/studio-wx5609xd.js +0 -341
- package/dist/chunks/studio-z6nw2ek2.js +0 -18
- package/dist/chunks/studio-zczps70q.js +0 -378
- package/dist/chunks/workspace-xpres40v.js +0 -89
- package/src/panels/activity-bar.ts +0 -251
- package/src/panels/panel-scheduler.ts +0 -219
- package/src/panels/style-inputs.ts +0 -237
- package/src/panels/target-line.ts +0 -274
- package/src/panels/welcome-screen.ts +0 -346
- package/src/ui/button-group.ts +0 -102
- package/src/ui/choice-field.ts +0 -72
- package/src/ui/field-row.ts +0 -249
- package/src/ui/formula-palette.ts +0 -213
- package/src/ui/icons.ts +0 -52
- package/src/ui/jx-theme.ts +0 -130
- package/src/ui/spectrum.ts +0 -340
- package/src/ui/value-selector.ts +0 -174
- package/src/ui/widgets.ts +0 -172
- /package/dist/chunks/{javascript-s56a8dpk.css → javascript-4abzjcy9.css} +0 -0
- /package/dist/chunks/{jsonMode-zr9sw0c7.css → jsonMode-vvmpmk34.css} +0 -0
- /package/dist/chunks/{monaco-setup-pav68602.css → monaco-setup-8vbyqnhr.css} +0 -0
- /package/dist/chunks/{tsMode-ef187txx.css → tsMode-hnxxb73h.css} +0 -0
|
@@ -1,34 +1,43 @@
|
|
|
1
1
|
/// <reference lib="dom" />
|
|
2
2
|
/**
|
|
3
|
-
* Publish panel — the one-click Cloudflare Pages publish flow, driven by the
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* connected → deployment status (publishing rides every commit).
|
|
3
|
+
* Publish panel — the one-click Cloudflare Pages publish flow, driven by the PAL's cf* members.
|
|
4
|
+
* States: unsupported platform → info; no credential → connect (hosted OAuth via cfConnect, or an
|
|
5
|
+
* API-token form backed by cf-settings); connected without `build.deploy` → create-and-connect
|
|
6
|
+
* form; connected → deployment status (publishing rides every commit).
|
|
8
7
|
*
|
|
9
|
-
*
|
|
10
|
-
* `
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
* token is now reported as *stored*, the field is only ever drawn empty for a
|
|
16
|
-
* REPLACEMENT the reader asked for, and revoking lives where every other
|
|
17
|
-
* credential's does — Preferences › Accounts (`studio.md` §15 rule 1: a surface
|
|
18
|
-
* never prints the secret it describes).
|
|
8
|
+
* This module is the FLOW. The panel it draws into is `surfaces/publish.json`, a `jx-dialog`
|
|
9
|
+
* mounted by `surfaces/publish.ts`: the markup, the eight bodies, the ARIA and the styling are the
|
|
10
|
+
* document's, and everything below decides what is true. The template it replaced re-rendered its
|
|
11
|
+
* whole body into the modal slot on every landing, which is what made a five-field form over a
|
|
12
|
+
* mutable `_form` record the surface's only state; the scope holds it now, and a listing that
|
|
13
|
+
* arrives late changes only what it names.
|
|
19
14
|
*
|
|
15
|
+
* **The token was in the DOM, on every open.** `credentialTpl` rendered `value=${getCfToken()}`
|
|
16
|
+
* into an `sp-textfield` whenever a token was stored and the platform had no hosted broker — a
|
|
17
|
+
* control the reader had not asked to edit, on a surface `scripts/screenshots` photographs.
|
|
18
|
+
* `type="password"` masks pixels and nothing else: the value is in the attribute, in the serialized
|
|
19
|
+
* HTML, in the accessibility tree and in every DOM dump. It is gone, and the document is now the
|
|
20
|
+
* thing that makes it impossible rather than the thing that remembers not to — the field binds no
|
|
21
|
+
* `value` at all, and the draft lives in the adapter's closure until {@link saveToken} reads it. A
|
|
22
|
+
* stored token is reported as *stored*, the field is only ever drawn for a REPLACEMENT the reader
|
|
23
|
+
* asked for, and revoking lives where every other credential's does — Preferences › Accounts
|
|
24
|
+
* (`studio.md` §15 rule 1: a surface never prints the secret it describes).
|
|
25
|
+
*
|
|
26
|
+
* @docs studio/publish/cloudflare
|
|
20
27
|
* @license MIT
|
|
21
28
|
*/
|
|
22
29
|
|
|
23
|
-
import { html } from "lit-html";
|
|
24
30
|
import type { DeployConfig, ProjectConfig } from "@jxsuite/schema/types";
|
|
25
31
|
import { activeRegistry } from "../commands/active-registry";
|
|
26
32
|
import { currentDeploy, noteDeployment } from "./deploy-checklist";
|
|
27
33
|
import { getPlatform } from "../platform";
|
|
28
34
|
import { getCfToken, setCfToken } from "../services/cf-settings";
|
|
35
|
+
import { resetModelCache } from "../services/ai-models";
|
|
29
36
|
import { projectState } from "../store";
|
|
30
37
|
import type { CfConnection } from "../types";
|
|
31
|
-
import {
|
|
38
|
+
import { layerHost } from "../ui/layers";
|
|
39
|
+
import { openPublishSurface } from "../surfaces/publish";
|
|
40
|
+
import type { PublishForm, PublishSurfaceHandle, PublishView } from "../surfaces/publish";
|
|
32
41
|
import type { CfAccount, PagesDeploymentInfo } from "./pages-service";
|
|
33
42
|
import {
|
|
34
43
|
connectDeploy,
|
|
@@ -38,9 +47,7 @@ import {
|
|
|
38
47
|
writeDeployConfig,
|
|
39
48
|
} from "./pages-service";
|
|
40
49
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
let _handle: ReturnType<typeof openModal> | null = null;
|
|
50
|
+
let _handle: PublishSurfaceHandle | null = null;
|
|
44
51
|
let _connection: CfConnection | null | "loading" = "loading";
|
|
45
52
|
let _accounts: CfAccount[] = [];
|
|
46
53
|
let _deployment: PagesDeploymentInfo | null = null;
|
|
@@ -48,7 +55,7 @@ let _error = "";
|
|
|
48
55
|
let _busy = false;
|
|
49
56
|
/** Whether the reader has asked to replace a token that is already stored. */
|
|
50
57
|
let _replacing = false;
|
|
51
|
-
let _form = { accountId: "", branch: "main", owner: "", projectName: "", repo: "" };
|
|
58
|
+
let _form: PublishForm = { accountId: "", branch: "main", owner: "", projectName: "", repo: "" };
|
|
52
59
|
|
|
53
60
|
function currentConfig(): ProjectConfig | null {
|
|
54
61
|
return (projectState?.projectConfig as ProjectConfig | undefined) ?? null;
|
|
@@ -64,21 +71,105 @@ function deriveSlug(name: string): string {
|
|
|
64
71
|
);
|
|
65
72
|
}
|
|
66
73
|
|
|
67
|
-
/**
|
|
74
|
+
/**
|
|
75
|
+
* Prefill owner/repo from cloud root keys ("owner/repo@branch", or the older "owner/repo"); blank
|
|
76
|
+
* elsewhere. The branch is part of the key the cloud adapter reports as its `projectRoot` — without
|
|
77
|
+
* the optional suffix here, the whole key failed to match and the form opened empty.
|
|
78
|
+
*/
|
|
68
79
|
function prefillRepo(): { owner: string; repo: string } {
|
|
69
80
|
const root = getPlatform().projectRoot;
|
|
70
|
-
const match = /^([\w.-]+)\/([\w.-]+)
|
|
81
|
+
const match = /^([\w.-]+)\/([\w.-]+)(?:@.+)?$/.exec(root);
|
|
71
82
|
return match ? { owner: match[1]!, repo: match[2]! } : { owner: "", repo: "" };
|
|
72
83
|
}
|
|
73
84
|
|
|
85
|
+
/** The connected Pages project, as the surface takes it: strings, never a config object. */
|
|
86
|
+
function deployView(): { projectName: string; productionUrl: string } | null {
|
|
87
|
+
const deploy: DeployConfig | undefined = currentDeploy();
|
|
88
|
+
return deploy
|
|
89
|
+
? { productionUrl: deploy.productionUrl ?? "", projectName: deploy.projectName }
|
|
90
|
+
: null;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/** Everything the surface needs to know, as facts. Which body they add up to is the surface's. */
|
|
94
|
+
function viewOf(): PublishView {
|
|
95
|
+
const supported = platformSupportsPublish();
|
|
96
|
+
const connection = _connection === "loading" ? null : _connection;
|
|
97
|
+
return {
|
|
98
|
+
accounts: _accounts.map((account) => ({ label: account.name, value: account.id })),
|
|
99
|
+
busy: _busy,
|
|
100
|
+
connected: connection?.connected === true,
|
|
101
|
+
deploy: deployView(),
|
|
102
|
+
deployment: _deployment
|
|
103
|
+
? {
|
|
104
|
+
environment: _deployment.environment,
|
|
105
|
+
stage: _deployment.stage,
|
|
106
|
+
status: _deployment.status,
|
|
107
|
+
url: _deployment.url,
|
|
108
|
+
}
|
|
109
|
+
: null,
|
|
110
|
+
error: _error,
|
|
111
|
+
form: { ..._form },
|
|
112
|
+
// Asked only of a host that answered `true` above, which is the one that is known to exist.
|
|
113
|
+
hosted: supported && typeof getPlatform().cfConnect === "function",
|
|
114
|
+
lapsed: connection?.connected === true && connection.needsReconnect === true,
|
|
115
|
+
loading: _connection === "loading",
|
|
116
|
+
replacing: _replacing,
|
|
117
|
+
supported,
|
|
118
|
+
tokenStored: getCfToken() !== "",
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/** Bring the panel up to date, opening it if it is not up. */
|
|
123
|
+
function paint(): void {
|
|
124
|
+
if (_handle) {
|
|
125
|
+
_handle.update(viewOf());
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
_handle = openPublishSurface({
|
|
129
|
+
layer: layerHost("modal"),
|
|
130
|
+
onClosed: close,
|
|
131
|
+
onConnect: () => {
|
|
132
|
+
void hostedConnect();
|
|
133
|
+
},
|
|
134
|
+
onDisconnect: () => {
|
|
135
|
+
void disconnect();
|
|
136
|
+
},
|
|
137
|
+
onField: (field, value) => {
|
|
138
|
+
_form = { ..._form, [field]: value };
|
|
139
|
+
},
|
|
140
|
+
onOpenAccounts: openAccounts,
|
|
141
|
+
onRefresh: () => {
|
|
142
|
+
void loadConnection();
|
|
143
|
+
},
|
|
144
|
+
onReplaceToken: () => {
|
|
145
|
+
_replacing = true;
|
|
146
|
+
_error = "";
|
|
147
|
+
paint();
|
|
148
|
+
},
|
|
149
|
+
onSaveToken: (token) => {
|
|
150
|
+
void saveToken(token);
|
|
151
|
+
},
|
|
152
|
+
onSubmit: () => {
|
|
153
|
+
void submitConnect();
|
|
154
|
+
},
|
|
155
|
+
view: viewOf(),
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
|
|
74
159
|
async function loadConnection(): Promise<void> {
|
|
75
160
|
_connection = "loading";
|
|
76
|
-
|
|
161
|
+
paint();
|
|
77
162
|
try {
|
|
78
163
|
_connection = (await getPlatform().cfConnection?.()) ?? null;
|
|
79
|
-
|
|
164
|
+
/*
|
|
165
|
+
* A lapsed brokered connection is `connected: true`, and asking Cloudflare anything through one
|
|
166
|
+
* is a guaranteed 401. Every such call landed in the catch below, which nulled the connection —
|
|
167
|
+
* so the panel showed the FIRST-TIME "Connect Cloudflare" invitation next to a raw
|
|
168
|
+
* "Cloudflare API: …" string, and never the one sentence that was true: it expired.
|
|
169
|
+
*/
|
|
170
|
+
if (_connection?.connected && !_connection.needsReconnect) {
|
|
80
171
|
_accounts = await listAccounts();
|
|
81
|
-
_form
|
|
172
|
+
_form = { ..._form, accountId: _connection.accountId ?? _accounts[0]?.id ?? "" };
|
|
82
173
|
const deploy = currentDeploy();
|
|
83
174
|
if (deploy) {
|
|
84
175
|
_deployment = await latestDeployment(deploy);
|
|
@@ -91,27 +182,23 @@ async function loadConnection(): Promise<void> {
|
|
|
91
182
|
_connection = null;
|
|
92
183
|
_error = error instanceof Error ? error.message : String(error);
|
|
93
184
|
}
|
|
94
|
-
|
|
185
|
+
paint();
|
|
95
186
|
}
|
|
96
187
|
|
|
97
188
|
/**
|
|
98
|
-
* Take the token
|
|
189
|
+
* Take the token the reader typed straight to storage.
|
|
99
190
|
*
|
|
100
|
-
* It
|
|
191
|
+
* It arrives as an argument and is never written back, which is the whole asymmetry: a secret may
|
|
101
192
|
* pass through a field the user typed it into, and may not be painted into one they did not.
|
|
102
193
|
*/
|
|
103
|
-
async function saveToken(
|
|
104
|
-
const
|
|
105
|
-
const value = (input?.value ?? "").trim();
|
|
194
|
+
async function saveToken(token: string): Promise<void> {
|
|
195
|
+
const value = token.trim();
|
|
106
196
|
if (!value) {
|
|
107
197
|
_error = "Paste a token, or use Preferences › Accounts to forget the stored one.";
|
|
108
|
-
|
|
198
|
+
paint();
|
|
109
199
|
return;
|
|
110
200
|
}
|
|
111
201
|
setCfToken(value);
|
|
112
|
-
if (input) {
|
|
113
|
-
input.value = "";
|
|
114
|
-
}
|
|
115
202
|
_replacing = false;
|
|
116
203
|
_error = "";
|
|
117
204
|
await loadConnection();
|
|
@@ -122,15 +209,37 @@ function openAccounts(): void {
|
|
|
122
209
|
void activeRegistry()?.run("app.preferences", { section: "accounts" });
|
|
123
210
|
}
|
|
124
211
|
|
|
212
|
+
/**
|
|
213
|
+
* Run the hosted OAuth flow and act on how it ended.
|
|
214
|
+
*
|
|
215
|
+
* The four endings are not interchangeable, and collapsing them is what left a user staring at an
|
|
216
|
+
* unchanged panel: a deadline that passed and a popup the browser turned into a full-page redirect
|
|
217
|
+
* both resolved null, and both were reported as "not completed" — one of them while the document
|
|
218
|
+
* was already navigating away.
|
|
219
|
+
*/
|
|
125
220
|
async function hostedConnect(): Promise<void> {
|
|
126
221
|
_busy = true;
|
|
127
|
-
|
|
222
|
+
_error = "";
|
|
223
|
+
paint();
|
|
128
224
|
try {
|
|
129
|
-
await getPlatform().cfConnect?.();
|
|
225
|
+
const outcome = (await getPlatform().cfConnect?.()) ?? null;
|
|
226
|
+
if (outcome?.status === "timeout") {
|
|
227
|
+
_error =
|
|
228
|
+
"The Cloudflare window didn't finish. Sign in there, then reconnect — nothing was changed.";
|
|
229
|
+
} else if (outcome?.status === "connected" && !outcome.connection.accountId) {
|
|
230
|
+
/* Lazily: this module is the publish panel, and the picker drags the dialog layer with it. */
|
|
231
|
+
const { openCfAccountPicker } = await import("../ui/cf-account-picker");
|
|
232
|
+
await openCfAccountPicker();
|
|
233
|
+
}
|
|
234
|
+
/* `canceled` and `redirect` say nothing. The user closed the popup, or the page is on its way
|
|
235
|
+
to Cloudflare — an apology painted over either one is noise. */
|
|
130
236
|
} catch (error) {
|
|
131
237
|
_error = error instanceof Error ? error.message : String(error);
|
|
132
238
|
}
|
|
133
239
|
_busy = false;
|
|
240
|
+
// The assistant's gate reads the same grant through /models, so a reconnect it does not hear
|
|
241
|
+
// About leaves it insisting the connection is dead.
|
|
242
|
+
resetModelCache();
|
|
134
243
|
await loadConnection();
|
|
135
244
|
}
|
|
136
245
|
|
|
@@ -141,12 +250,12 @@ async function submitConnect(): Promise<void> {
|
|
|
141
250
|
}
|
|
142
251
|
if (!_form.projectName || !_form.owner || !_form.repo || !_form.accountId) {
|
|
143
252
|
_error = "Account, project name, and the GitHub owner/repo are all required.";
|
|
144
|
-
|
|
253
|
+
paint();
|
|
145
254
|
return;
|
|
146
255
|
}
|
|
147
256
|
_busy = true;
|
|
148
257
|
_error = "";
|
|
149
|
-
|
|
258
|
+
paint();
|
|
150
259
|
try {
|
|
151
260
|
const deploy = await connectDeploy(config, {
|
|
152
261
|
accountId: _form.accountId,
|
|
@@ -160,7 +269,7 @@ async function submitConnect(): Promise<void> {
|
|
|
160
269
|
_error = error instanceof Error ? error.message : String(error);
|
|
161
270
|
}
|
|
162
271
|
_busy = false;
|
|
163
|
-
|
|
272
|
+
paint();
|
|
164
273
|
}
|
|
165
274
|
|
|
166
275
|
async function disconnect(): Promise<void> {
|
|
@@ -169,7 +278,7 @@ async function disconnect(): Promise<void> {
|
|
|
169
278
|
return;
|
|
170
279
|
}
|
|
171
280
|
_busy = true;
|
|
172
|
-
|
|
281
|
+
paint();
|
|
173
282
|
try {
|
|
174
283
|
await writeDeployConfig(config, null);
|
|
175
284
|
_deployment = null;
|
|
@@ -177,267 +286,24 @@ async function disconnect(): Promise<void> {
|
|
|
177
286
|
_error = error instanceof Error ? error.message : String(error);
|
|
178
287
|
}
|
|
179
288
|
_busy = false;
|
|
180
|
-
|
|
289
|
+
paint();
|
|
181
290
|
}
|
|
182
291
|
|
|
292
|
+
/**
|
|
293
|
+
* Take the panel down.
|
|
294
|
+
*
|
|
295
|
+
* The handle is dropped BEFORE it is closed, because closing provokes the platform's own `close`
|
|
296
|
+
* event, which the document hands back as `onClosed` — which is this function. Nulling first is
|
|
297
|
+
* what makes the second pass a no-op rather than a loop.
|
|
298
|
+
*/
|
|
183
299
|
function close(): void {
|
|
184
|
-
_handle
|
|
300
|
+
const handle = _handle;
|
|
185
301
|
_handle = null;
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
function fieldRow(label: string, input: unknown) {
|
|
189
|
-
return html`
|
|
190
|
-
<label class="publish-field">
|
|
191
|
-
<span>${label}</span>
|
|
192
|
-
${input}
|
|
193
|
-
</label>
|
|
194
|
-
`;
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
function credentialTpl() {
|
|
198
|
-
const platform = getPlatform();
|
|
199
|
-
if (platform.cfConnect) {
|
|
200
|
-
return html`
|
|
201
|
-
<p>Connect your Cloudflare account to publish this site.</p>
|
|
202
|
-
<sp-button
|
|
203
|
-
?disabled=${_busy}
|
|
204
|
-
@click=${() => {
|
|
205
|
-
void hostedConnect();
|
|
206
|
-
}}
|
|
207
|
-
>
|
|
208
|
-
Connect Cloudflare
|
|
209
|
-
</sp-button>
|
|
210
|
-
`;
|
|
211
|
-
}
|
|
212
|
-
const stored = getCfToken() !== "";
|
|
213
|
-
if (stored && !_replacing) {
|
|
214
|
-
// The token is STORED, and that is the whole of what this says. It was rejected or has expired
|
|
215
|
-
// — otherwise `_connection.connected` would be true and this branch unreachable — so the two
|
|
216
|
-
// Honest moves are to replace it or to forget it, and neither needs to see it.
|
|
217
|
-
return html`
|
|
218
|
-
<p>
|
|
219
|
-
A Cloudflare API token is stored on this machine, and Cloudflare did not accept it. It may
|
|
220
|
-
have been revoked, or it may be missing the Account Settings Read and Pages Read/Write
|
|
221
|
-
permissions.
|
|
222
|
-
</p>
|
|
223
|
-
<div class="publish-actions">
|
|
224
|
-
<sp-button
|
|
225
|
-
?disabled=${_busy}
|
|
226
|
-
@click=${() => {
|
|
227
|
-
_replacing = true;
|
|
228
|
-
_error = "";
|
|
229
|
-
render();
|
|
230
|
-
}}
|
|
231
|
-
>
|
|
232
|
-
Replace token
|
|
233
|
-
</sp-button>
|
|
234
|
-
<sp-button variant="secondary" @click=${openAccounts}>Preferences › Accounts</sp-button>
|
|
235
|
-
</div>
|
|
236
|
-
`;
|
|
237
|
-
}
|
|
238
|
-
return html`
|
|
239
|
-
<p>
|
|
240
|
-
Paste a Cloudflare API token (permissions: Account Settings Read, Pages Read/Write). It is
|
|
241
|
-
stored on this machine and only sent to the same-origin proxy — Studio never renders it back.
|
|
242
|
-
</p>
|
|
243
|
-
${fieldRow(
|
|
244
|
-
"API token",
|
|
245
|
-
html`<sp-textfield
|
|
246
|
-
id="cf-token-input"
|
|
247
|
-
type="password"
|
|
248
|
-
value=""
|
|
249
|
-
placeholder="cf_..."
|
|
250
|
-
></sp-textfield>`,
|
|
251
|
-
)}
|
|
252
|
-
<div class="publish-actions">
|
|
253
|
-
<sp-button
|
|
254
|
-
?disabled=${_busy}
|
|
255
|
-
@click=${(e: Event) => {
|
|
256
|
-
void saveToken(hostOf(e));
|
|
257
|
-
}}
|
|
258
|
-
>
|
|
259
|
-
Verify & Connect
|
|
260
|
-
</sp-button>
|
|
261
|
-
<sp-button variant="secondary" @click=${openAccounts}>Preferences › Accounts</sp-button>
|
|
262
|
-
</div>
|
|
263
|
-
`;
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
function hostOf(e: Event): HTMLElement {
|
|
267
|
-
return (e.target as HTMLElement).closest(".publish-modal") ?? document.body;
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
function connectFormTpl() {
|
|
271
|
-
return html`
|
|
272
|
-
<p>
|
|
273
|
-
Create a Cloudflare Pages project connected to this repository. Every commit then builds and
|
|
274
|
-
publishes automatically (<code>bunx jx build</code>).
|
|
275
|
-
</p>
|
|
276
|
-
${fieldRow(
|
|
277
|
-
"Account",
|
|
278
|
-
html`
|
|
279
|
-
<sp-picker
|
|
280
|
-
value=${_form.accountId}
|
|
281
|
-
@change=${(e: Event) => {
|
|
282
|
-
_form.accountId = (e.target as HTMLInputElement).value;
|
|
283
|
-
}}
|
|
284
|
-
>
|
|
285
|
-
${_accounts.map((a) => html`<sp-menu-item value=${a.id}>${a.name}</sp-menu-item>`)}
|
|
286
|
-
</sp-picker>
|
|
287
|
-
`,
|
|
288
|
-
)}
|
|
289
|
-
${fieldRow(
|
|
290
|
-
"Pages project name",
|
|
291
|
-
html`<sp-textfield
|
|
292
|
-
value=${_form.projectName}
|
|
293
|
-
@input=${(e: Event) => {
|
|
294
|
-
_form.projectName = (e.target as HTMLInputElement).value;
|
|
295
|
-
}}
|
|
296
|
-
></sp-textfield>`,
|
|
297
|
-
)}
|
|
298
|
-
${fieldRow(
|
|
299
|
-
"GitHub owner",
|
|
300
|
-
html`<sp-textfield
|
|
301
|
-
value=${_form.owner}
|
|
302
|
-
@input=${(e: Event) => {
|
|
303
|
-
_form.owner = (e.target as HTMLInputElement).value;
|
|
304
|
-
}}
|
|
305
|
-
></sp-textfield>`,
|
|
306
|
-
)}
|
|
307
|
-
${fieldRow(
|
|
308
|
-
"GitHub repository",
|
|
309
|
-
html`<sp-textfield
|
|
310
|
-
value=${_form.repo}
|
|
311
|
-
@input=${(e: Event) => {
|
|
312
|
-
_form.repo = (e.target as HTMLInputElement).value;
|
|
313
|
-
}}
|
|
314
|
-
></sp-textfield>`,
|
|
315
|
-
)}
|
|
316
|
-
${fieldRow(
|
|
317
|
-
"Production branch",
|
|
318
|
-
html`<sp-textfield
|
|
319
|
-
value=${_form.branch}
|
|
320
|
-
@input=${(e: Event) => {
|
|
321
|
-
_form.branch = (e.target as HTMLInputElement).value;
|
|
322
|
-
}}
|
|
323
|
-
></sp-textfield>`,
|
|
324
|
-
)}
|
|
325
|
-
<sp-button
|
|
326
|
-
?disabled=${_busy}
|
|
327
|
-
@click=${() => {
|
|
328
|
-
void submitConnect();
|
|
329
|
-
}}
|
|
330
|
-
>
|
|
331
|
-
${_busy ? "Connecting…" : "Create & Connect"}
|
|
332
|
-
</sp-button>
|
|
333
|
-
`;
|
|
334
|
-
}
|
|
335
|
-
|
|
336
|
-
function statusTpl(deploy: DeployConfig) {
|
|
337
|
-
return html`
|
|
338
|
-
<p>
|
|
339
|
-
Connected to Pages project <strong>${deploy.projectName}</strong>
|
|
340
|
-
${
|
|
341
|
-
deploy.productionUrl
|
|
342
|
-
? html` —
|
|
343
|
-
<a href=${deploy.productionUrl} target="_blank" rel="noreferrer">
|
|
344
|
-
${deploy.productionUrl}
|
|
345
|
-
</a>`
|
|
346
|
-
: ""
|
|
347
|
-
}
|
|
348
|
-
</p>
|
|
349
|
-
${
|
|
350
|
-
_deployment
|
|
351
|
-
? html`
|
|
352
|
-
<p>
|
|
353
|
-
Latest deployment: <strong>${_deployment.stage}: ${_deployment.status}</strong>
|
|
354
|
-
(${_deployment.environment}) —
|
|
355
|
-
<a href=${_deployment.url} target="_blank" rel="noreferrer">preview</a>
|
|
356
|
-
</p>
|
|
357
|
-
`
|
|
358
|
-
: html`<p>No deployments yet — the first commit after connecting triggers one.</p>`
|
|
359
|
-
}
|
|
360
|
-
<p class="publish-hint">Publishing happens automatically on every commit.</p>
|
|
361
|
-
<div class="publish-actions">
|
|
362
|
-
<sp-button
|
|
363
|
-
variant="secondary"
|
|
364
|
-
?disabled=${_busy}
|
|
365
|
-
@click=${() => {
|
|
366
|
-
void loadConnection();
|
|
367
|
-
}}
|
|
368
|
-
>
|
|
369
|
-
Refresh
|
|
370
|
-
</sp-button>
|
|
371
|
-
<sp-button
|
|
372
|
-
variant="negative"
|
|
373
|
-
?disabled=${_busy}
|
|
374
|
-
@click=${() => {
|
|
375
|
-
void disconnect();
|
|
376
|
-
}}
|
|
377
|
-
>
|
|
378
|
-
Disconnect
|
|
379
|
-
</sp-button>
|
|
380
|
-
</div>
|
|
381
|
-
`;
|
|
382
|
-
}
|
|
383
|
-
|
|
384
|
-
function bodyTpl() {
|
|
385
|
-
if (!platformSupportsPublish()) {
|
|
386
|
-
return html`
|
|
387
|
-
<p>
|
|
388
|
-
This platform cannot reach the Cloudflare API. Publish by committing and pushing — your host
|
|
389
|
-
builds <code>bunx jx build</code> and serves <code>dist/</code>.
|
|
390
|
-
</p>
|
|
391
|
-
`;
|
|
392
|
-
}
|
|
393
|
-
if (_connection === "loading") {
|
|
394
|
-
return html`<p>Checking Cloudflare connection…</p>`;
|
|
395
|
-
}
|
|
396
|
-
if (!_connection?.connected) {
|
|
397
|
-
return credentialTpl();
|
|
398
|
-
}
|
|
399
|
-
const deploy = currentDeploy();
|
|
400
|
-
return deploy ? statusTpl(deploy) : connectFormTpl();
|
|
401
|
-
}
|
|
402
|
-
|
|
403
|
-
function errorTpl() {
|
|
404
|
-
if (!_error) {
|
|
405
|
-
return "";
|
|
406
|
-
}
|
|
407
|
-
const needsPagesApp = /github/i.test(_error) && /app|install|source|repo/i.test(_error);
|
|
408
|
-
return html`
|
|
409
|
-
<p class="publish-error">
|
|
410
|
-
${_error}
|
|
411
|
-
${
|
|
412
|
-
needsPagesApp
|
|
413
|
-
? html` — if the Cloudflare Pages GitHub App is not installed on the repository,
|
|
414
|
-
<a href=${PAGES_APP_INSTALL_URL} target="_blank" rel="noreferrer">install it</a> and
|
|
415
|
-
retry.`
|
|
416
|
-
: ""
|
|
417
|
-
}
|
|
418
|
-
</p>
|
|
419
|
-
`;
|
|
420
|
-
}
|
|
421
|
-
|
|
422
|
-
function render(): void {
|
|
423
|
-
const tpl = html`
|
|
424
|
-
<div class="new-project-modal publish-modal" data-jx-region="overlay.dialog:publish">
|
|
425
|
-
<div class="new-project-modal-header">
|
|
426
|
-
<h2 class="new-project-modal-title">Publish</h2>
|
|
427
|
-
<sp-action-button size="s" quiet @click=${close}>✕</sp-action-button>
|
|
428
|
-
</div>
|
|
429
|
-
<div class="new-project-modal-body">${bodyTpl()} ${errorTpl()}</div>
|
|
430
|
-
</div>
|
|
431
|
-
`;
|
|
432
|
-
if (_handle) {
|
|
433
|
-
_handle.update(tpl);
|
|
434
|
-
} else {
|
|
435
|
-
_handle = openModal(tpl, { label: "Publish", onDismiss: close });
|
|
436
|
-
}
|
|
302
|
+
handle?.close();
|
|
437
303
|
}
|
|
438
304
|
|
|
439
305
|
/**
|
|
440
|
-
* Automation-only seam (scripts/screenshots): open the
|
|
306
|
+
* Automation-only seam (scripts/screenshots): open the panel directly in its connected state with a
|
|
441
307
|
* canned deployment, bypassing {@link loadConnection} so no Cloudflare request ever fires. The
|
|
442
308
|
* active project's `build.deploy` block still supplies the connected project/URL line.
|
|
443
309
|
*/
|
|
@@ -452,10 +318,10 @@ export function seedPublishConnected(options: {
|
|
|
452
318
|
_error = "";
|
|
453
319
|
_busy = false;
|
|
454
320
|
_replacing = false;
|
|
455
|
-
|
|
321
|
+
paint();
|
|
456
322
|
}
|
|
457
323
|
|
|
458
|
-
/** Open the publish
|
|
324
|
+
/** Open the publish panel for the active project. */
|
|
459
325
|
export function openPublishPanel(): void {
|
|
460
326
|
const config = currentConfig();
|
|
461
327
|
const { owner, repo } = prefillRepo();
|
|
@@ -472,6 +338,6 @@ export function openPublishPanel(): void {
|
|
|
472
338
|
projectName: currentDeploy()?.projectName ?? deriveSlug(config?.name ?? ""),
|
|
473
339
|
repo,
|
|
474
340
|
};
|
|
475
|
-
|
|
341
|
+
paint();
|
|
476
342
|
void loadConnection();
|
|
477
343
|
}
|