@jxsuite/studio 4.1.0 → 5.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/data/elements-meta.json +5 -15
- package/data/html-meta.json +51 -6
- package/dist/chunks/{2020-n6tfwnda.js → 2020-g79n01v9.js} +14 -14
- package/dist/chunks/action-group-sp6tna8v.js +118 -0
- package/dist/chunks/adapter-nj7tnjfn.js +13 -0
- package/dist/chunks/cf-account-picker-qwkm9zrf.js +495 -0
- package/dist/chunks/cf-settings-71bv5zn9.js +20 -0
- package/dist/chunks/color-area-v17df7b8.js +154 -0
- package/dist/chunks/color-field-anwybnkn.js +208 -0
- package/dist/chunks/color-slider-44ez96fc.js +79 -0
- package/dist/chunks/color-xgg3kfw7.js +35 -0
- package/dist/chunks/combobox-5e7jev23.js +236 -0
- package/dist/chunks/components-vj72gqtq.js +20 -0
- package/dist/chunks/content-source-5mex4x1h.js +46 -0
- package/dist/chunks/convert-to-repeater-n64h8znc.js +639 -0
- package/dist/chunks/dialog-s890b918.js +85 -0
- package/dist/chunks/editor-3qhbg51x.js +35 -0
- package/dist/chunks/entry-commands-234hjnqw.js +42 -0
- package/dist/chunks/extension-sections-3hpcambp.js +651 -0
- package/dist/chunks/file-ops-8yhd83xr.js +47 -0
- package/dist/chunks/files-hnxqxtsg.js +72 -0
- package/dist/chunks/format-host-779sfp2n.js +40 -0
- package/dist/chunks/fs-events-b88z7g4h.js +18 -0
- package/dist/chunks/git-panel-xwj8fpab.js +49 -0
- package/dist/chunks/icons-yy10wk9r.js +402 -0
- package/dist/chunks/iframe-entry-15g3n6xv.js +114 -0
- package/dist/chunks/iframe-entry-b27vq81n.js +203 -0
- package/dist/chunks/iframe-entry-nbyxee1y.js +154 -0
- package/dist/chunks/iframe-host-syr0f9sb.js +115 -0
- package/dist/chunks/{index-wcnt3r9g.js → index-mdmyx6s2.js} +11 -11
- package/dist/chunks/index-n4j7qxyr.js +109 -0
- package/dist/chunks/{javascript-q8kpmfah.js → javascript-xvrfrpkb.js} +8 -9
- package/dist/chunks/{jsonMode-dkr040ga.js → jsonMode-tyx2kj6p.js} +526 -527
- package/dist/chunks/jx-validate-j0wxk72w.js +15 -0
- package/dist/chunks/layers-ff81wthn.js +30 -0
- package/dist/chunks/layers-panel-pnnghw12.js +40 -0
- package/dist/chunks/listbox-6v2ac08j.js +44 -0
- package/dist/chunks/lit-html-m244w9nh.js +17 -0
- package/dist/chunks/media-picker-cqhhxhhe.js +33 -0
- package/dist/chunks/menu-9p2w46gj.js +15 -0
- package/dist/chunks/menu-q99sy9rf.js +285 -0
- package/dist/chunks/{monaco-binding-rj6xpx9y.js → monaco-binding-sw6en4dw.js} +12 -15
- package/dist/chunks/monaco-buffer-bhy3hb6m.js +24 -0
- package/dist/chunks/{monaco-setup-vx9bhp1d.js → monaco-setup-8r62fj6y.js} +27 -37
- package/dist/chunks/notify-628t0anh.js +21 -0
- package/dist/chunks/number-field-5cndyft8.js +72 -0
- package/dist/chunks/parse-0zx14y15.js +10 -0
- package/dist/chunks/platform-ts9cg1a4.js +15 -0
- package/dist/chunks/popover-47z3ytva.js +25 -0
- package/dist/chunks/publish-panel-5zt840sy.js +27 -0
- package/dist/chunks/quick-search-3748564r.js +45 -0
- package/dist/chunks/references-qvvxej7h.js +26 -0
- package/dist/chunks/right-panel-eccz92qt.js +45 -0
- package/dist/chunks/section-registry-5pq32t0q.js +25 -0
- package/dist/chunks/select-2r16ez41.js +49 -0
- package/dist/chunks/split-g7nm1rgb.js +191 -0
- package/dist/chunks/studio-0hqbpbd0.js +62 -0
- package/dist/chunks/{studio-kryvsw6j.js → studio-1k325pwf.js} +48 -48
- package/dist/chunks/{studio-b55y6ewx.js → studio-1knfqgy7.js} +58 -58
- package/dist/chunks/{studio-2b946z26.js → studio-1z1kcjv4.js} +3628 -6095
- package/dist/chunks/studio-3773086z.js +111 -0
- package/dist/chunks/{studio-4r1pv6zf.js → studio-38emantv.js} +22 -5
- package/dist/chunks/{studio-x813zp48.js → studio-3rz5md06.js} +30 -30
- package/dist/chunks/{studio-ynxwkrzd.js → studio-4wbb9ct0.js} +1953 -1785
- package/dist/chunks/studio-5te5tqng.js +81 -0
- package/dist/chunks/studio-5wt9nvhd.js +4763 -0
- package/dist/chunks/{studio-p4ngc046.js → studio-6ewqv390.js} +9 -9
- package/dist/chunks/{studio-9ab8gqsm.js → studio-6nzaktvy.js} +7 -7
- package/dist/chunks/studio-6xa21ej9.js +28 -0
- package/dist/chunks/{studio-5ehhackm.js → studio-727xh0e3.js} +19 -19
- package/dist/chunks/{studio-gcye7qka.js → studio-7e11jpa9.js} +21 -21
- package/dist/chunks/{studio-q7v10cg2.js → studio-7r42c6ca.js} +17 -7
- package/dist/chunks/studio-7xnmgv66.js +13615 -0
- package/dist/chunks/studio-8scdew0e.js +258 -0
- package/dist/chunks/{studio-fbf92ckf.js → studio-93zafjcm.js} +275 -163
- package/dist/chunks/{studio-dg7zyt5x.js → studio-98b3z07n.js} +1 -1
- package/dist/chunks/studio-a79k90n9.js +1162 -0
- package/dist/chunks/studio-aj37eer3.js +422 -0
- package/dist/chunks/studio-b0k5tqgp.js +2432 -0
- package/dist/chunks/studio-b4s9eykd.js +2811 -0
- package/dist/chunks/{studio-f3wqjtk5.js → studio-d0300636.js} +5076 -18
- package/dist/chunks/{studio-b9b6t1dg.js → studio-e1f24eff.js} +5664 -5666
- package/dist/chunks/studio-e1pgga3k.js +839 -0
- package/dist/chunks/{studio-g1wdche0.js → studio-esrxgwh6.js} +80 -80
- package/dist/chunks/{studio-q43a5y9h.js → studio-g3jevyjt.js} +16 -16
- package/dist/chunks/studio-gb13095a.js +2806 -0
- package/dist/chunks/{studio-3n4ndrzh.js → studio-h4nvnjvz.js} +303 -303
- package/dist/chunks/{studio-dm19q43r.js → studio-hhvs4sdg.js} +10 -10
- package/dist/chunks/{studio-x4qkdat5.js → studio-js8nv53n.js} +1749 -2481
- package/dist/chunks/{studio-qjy2z9bv.js → studio-jxp12rnj.js} +32 -137
- package/dist/chunks/{studio-trxrabqf.js → studio-k75n7vhp.js} +527 -283
- package/dist/chunks/{studio-q9jd1a60.js → studio-kcgff4r0.js} +15 -18
- package/dist/chunks/studio-kkqkcp3d.js +17668 -0
- package/dist/chunks/studio-mhhyamxf.js +763 -0
- package/dist/chunks/{studio-cft9r4r7.js → studio-nq5yf5mp.js} +22 -22
- package/dist/chunks/{studio-685s0ytq.js → studio-nqgawfks.js} +572 -572
- package/dist/chunks/studio-nzzpvzx9.js +185 -0
- package/dist/chunks/{studio-xrapxwwc.js → studio-p1dw8wfw.js} +55 -29
- package/dist/chunks/{studio-3bqpr0zh.js → studio-pxbgypmg.js} +299 -110
- package/dist/chunks/studio-q0a3yk4n.js +33 -0
- package/dist/chunks/{studio-wcy8trfx.js → studio-q3x06vmj.js} +23 -22
- package/dist/chunks/{studio-6yw4y3my.js → studio-qhhm6hbt.js} +8 -8
- package/dist/chunks/studio-qk4bfsq2.js +362 -0
- package/dist/chunks/{studio-msd847zn.js → studio-qk90fgqm.js} +361 -90
- package/dist/chunks/{studio-jkftxyvz.js → studio-r6nvacqs.js} +5861 -2154
- package/dist/chunks/{studio-53n8bp04.js → studio-r6xmmtfh.js} +1 -1
- package/dist/chunks/{studio-tvgyw9xw.js → studio-rnyf3f8e.js} +83 -250
- package/dist/chunks/studio-rs76k67r.js +12 -0
- package/dist/chunks/studio-sbjyc8bt.js +954 -0
- package/dist/chunks/{studio-1wagb550.js → studio-syg2tadj.js} +11 -11
- package/dist/chunks/{studio-t5wqwzdh.js → studio-tjjk7jvk.js} +1 -1
- package/dist/chunks/studio-tqgryxwg.js +1171 -0
- package/dist/chunks/studio-try13h8c.js +8448 -0
- package/dist/chunks/studio-vfq8qpjt.js +1219 -0
- package/dist/chunks/studio-vhv5tgxm.js +51 -0
- package/dist/chunks/{studio-ahn3pdgx.js → studio-vw7mzp6z.js} +52 -38
- package/dist/chunks/studio-wqpngpsk.js +174 -0
- package/dist/chunks/studio-wqz6dggm.js +1356 -0
- package/dist/chunks/{studio-92ab2jqe.js → studio-y9zedyjn.js} +14 -14
- package/dist/chunks/studio-yxa81f45.js +12 -0
- package/dist/chunks/studio-zdn2g6dt.js +148 -0
- package/dist/chunks/swatch-group-t0n6h2rn.js +139 -0
- package/dist/chunks/tabs-wbp1cdws.js +156 -0
- package/dist/chunks/textfield-abk6qyee.js +73 -0
- package/dist/chunks/toast-780pvfbv.js +27 -0
- package/dist/chunks/toast-host-3sqv46sn.js +116 -0
- package/dist/chunks/toolbar-xbh5bhtr.js +194 -0
- package/dist/chunks/tooltip-eptb614w.js +369 -0
- package/dist/chunks/tree-a73p0pqm.js +367 -0
- package/dist/chunks/{tsMode-76kr53q0.js → tsMode-jy4m86rv.js} +83 -85
- package/dist/chunks/workspace-t55jdjbx.js +69 -0
- package/dist/chunks/{ws-client-6shc5rze.js → ws-client-ny4zc51r.js} +20 -22
- package/dist/iframe-entry.js +1873 -673
- package/dist/studio.js +52757 -36535
- package/dist/workers/editor.worker.js +1040 -1085
- package/dist/workers/json.worker.js +1946 -1991
- package/dist/workers/ts.worker.js +4960 -5005
- package/index.html +1 -0
- package/package.json +18 -52
- package/src/about/about-modal.ts +72 -123
- package/src/browse/library-commands.ts +20 -49
- package/src/browse/library-layouts.ts +87 -218
- package/src/browse/library-pane.ts +406 -438
- package/src/canvas/canvas-helpers.ts +0 -49
- package/src/canvas/canvas-live-render.ts +25 -2
- package/src/canvas/canvas-render.ts +666 -231
- package/src/canvas/canvas-surface.ts +0 -1
- package/src/canvas/canvas-utils.ts +333 -113
- package/src/canvas/dialog-path.ts +76 -0
- package/src/canvas/dialog-state.ts +67 -0
- package/src/canvas/diff-marks.ts +252 -0
- package/src/canvas/diff-toolbar.ts +349 -0
- package/src/canvas/diff-view.ts +123 -0
- package/src/canvas/edit-width-drag.ts +187 -0
- package/src/canvas/edit-width.ts +150 -0
- package/src/canvas/iframe-entry.ts +125 -8
- package/src/canvas/iframe-host.ts +271 -15
- package/src/canvas/iframe-interaction.ts +133 -13
- package/src/canvas/iframe-patch.ts +7 -1
- package/src/canvas/iframe-position.ts +5 -6
- package/src/canvas/iframe-protocol.ts +106 -5
- package/src/canvas/iframe-render.ts +373 -5
- package/src/canvas/iframe-slash.ts +2 -2
- package/src/canvas/iframe-subtree.ts +5 -8
- package/src/canvas/path-mapping.ts +25 -3
- package/src/canvas/popover-path.ts +106 -0
- package/src/canvas/popover-state.ts +155 -0
- package/src/canvas/surface-registry.ts +21 -10
- package/src/collab/presence-chips.ts +51 -73
- package/src/commands/app-commands.ts +10 -0
- package/src/commands/budget.ts +12 -0
- package/src/commands/command-args.ts +404 -6
- package/src/commands/defaults.ts +44 -14
- package/src/commands/live-context.ts +11 -5
- package/src/commands/reference.ts +12 -2
- package/src/commands/registry.ts +177 -10
- package/src/commands/run-reported.ts +120 -0
- package/src/content/entry-commands.ts +16 -23
- package/src/content/entry-editor.ts +144 -101
- package/src/editor/canvas-slash-bridge.ts +2 -2
- package/src/editor/context-menu.ts +49 -200
- package/src/editor/convert-to-component.ts +42 -82
- package/src/editor/convert-to-repeater.ts +132 -173
- package/src/editor/inline-edit.ts +11 -0
- package/src/editor/shortcuts.ts +76 -49
- package/src/editor/slash-menu.ts +150 -157
- package/src/files/components.ts +39 -0
- package/src/files/file-ops.ts +117 -11
- package/src/files/files.ts +944 -660
- package/src/files/json-layout.ts +474 -0
- package/src/files/serialize-document.ts +8 -1
- package/src/format/convert-file.ts +16 -10
- package/src/format/format-host.ts +50 -1
- package/src/github/github-auth.ts +71 -29
- package/src/github/github-publish.ts +57 -65
- package/src/grid/cell-editors.ts +46 -4
- package/src/grid/cell-popovers.ts +65 -62
- package/src/grid/grid-open.ts +86 -64
- package/src/grid/grid-panel.ts +390 -469
- package/src/grid/redirects-grid.ts +40 -44
- package/src/hosting/layout.ts +2 -0
- package/src/i18n/i18n-commands.ts +137 -62
- package/src/media/media-pane.ts +83 -133
- package/src/new-project/add-repo-modal.ts +125 -176
- package/src/new-project/import-tab.ts +181 -252
- package/src/new-project/location-fields.ts +93 -160
- package/src/new-project/new-project-modal.ts +376 -367
- package/src/packages/jxsuite-update.ts +76 -18
- package/src/packages/pull-package-sync.ts +5 -1
- package/src/panels/activity-panel.ts +137 -104
- package/src/panels/ai-chat/chat-markdown.ts +15 -13
- package/src/panels/ai-chat/chat-view.ts +307 -472
- package/src/panels/ai-chat/composer.ts +175 -163
- package/src/panels/ai-chat/sessions-view.ts +31 -62
- package/src/panels/ai-panel.ts +213 -185
- package/src/panels/block-action-bar.ts +444 -645
- package/src/panels/bottom-dock.ts +112 -47
- package/src/panels/chat-panel.ts +19 -14
- package/src/panels/data-explorer.ts +141 -102
- package/src/panels/data-grid.ts +183 -150
- package/src/panels/dnd.ts +75 -20
- package/src/panels/editors.ts +26 -19
- package/src/panels/elements-panel.ts +243 -186
- package/src/panels/empty-state.ts +26 -42
- package/src/panels/events-panel.ts +950 -729
- package/src/panels/formula-workspace.ts +434 -207
- package/src/panels/frontmatter-fields.ts +185 -153
- package/src/panels/frontmatter-panel.ts +411 -187
- package/src/panels/git-diff-open.ts +148 -0
- package/src/panels/git-panel.ts +679 -605
- package/src/panels/head-panel.ts +617 -435
- package/src/panels/i18n-panel.ts +148 -135
- package/src/panels/imports-panel.ts +388 -414
- package/src/panels/jump-bar.ts +175 -147
- package/src/panels/layers-panel.ts +785 -671
- package/src/panels/left-panel.ts +166 -94
- package/src/panels/navigator-panels.ts +1 -1
- package/src/panels/pane-context.ts +529 -677
- package/src/panels/pane-grid.ts +265 -241
- package/src/panels/panel-registry.ts +15 -4
- package/src/panels/problems-panel.ts +181 -99
- package/src/panels/properties-panel.ts +1525 -966
- package/src/panels/provenance.ts +31 -113
- package/src/panels/quick-search.ts +223 -184
- package/src/panels/right-panel.ts +135 -169
- package/src/panels/seo-modal.ts +346 -167
- package/src/panels/settings-menu.ts +114 -661
- package/src/panels/settings-pane.ts +102 -86
- package/src/panels/signals-panel.ts +1318 -1172
- package/src/panels/statement-editor.ts +556 -428
- package/src/panels/style-panel.ts +1367 -630
- package/src/panels/style-utils.ts +36 -32
- package/src/panels/stylebook-doc.ts +30 -73
- package/src/panels/stylebook-layers-panel.ts +202 -109
- package/src/panels/stylebook-panel.ts +124 -88
- package/src/panels/tab-strip.ts +386 -288
- package/src/platforms/cloud.ts +106 -16
- package/src/platforms/devserver.ts +13 -0
- package/src/publish/deploy-checklist.ts +124 -78
- package/src/publish/publish-commands.ts +4 -12
- package/src/publish/publish-panel.ts +134 -328
- package/src/services/a11y-report.ts +100 -43
- package/src/services/ai-command-tools.ts +538 -0
- package/src/services/ai-project-tools.ts +8 -2
- package/src/services/ai-session-store.ts +6 -0
- package/src/services/ai-system-prompt.ts +112 -24
- package/src/services/ai-tools.ts +36 -212
- package/src/services/ai-write-report.ts +174 -0
- package/src/services/document-assistant.ts +59 -8
- package/src/services/idle.ts +16 -14
- package/src/services/live-surfaces.ts +237 -0
- package/src/services/model-uri.ts +75 -0
- package/src/services/notify.ts +63 -6
- package/src/services/popover-report.ts +325 -0
- package/src/services/surface-registry.ts +56 -0
- package/src/services/tool-executor.ts +6 -0
- package/src/settings/contexts-section.ts +301 -299
- package/src/settings/contributed-section.ts +361 -222
- package/src/settings/css-vars-editor.ts +320 -325
- package/src/settings/defs-editor.ts +572 -535
- package/src/settings/dependencies-editor.ts +79 -107
- package/src/settings/extension-commands.ts +379 -0
- package/src/settings/extension-rows.ts +113 -0
- package/src/settings/extensions-section.ts +287 -0
- package/src/settings/general-settings.ts +130 -181
- package/src/settings/head-editor.ts +10 -305
- package/src/settings/locales-section.ts +146 -196
- package/src/settings/preferences-accounts.ts +1 -1
- package/src/settings/preferences-dialog.ts +350 -330
- package/src/settings/project-sections.ts +108 -181
- package/src/settings/schema-field-ui.ts +11 -399
- package/src/settings/section-registry.ts +8 -1
- package/src/settings/settings-document.ts +31 -29
- package/src/shell/tree.ts +42 -87
- package/src/shell.ts +48 -36
- package/src/studio.ts +104 -69
- package/src/style/token-ref.ts +0 -39
- package/src/surfaces/about.json +263 -0
- package/src/surfaces/about.ts +163 -0
- package/src/surfaces/add-repo.json +486 -0
- package/src/surfaces/add-repo.ts +236 -0
- package/src/surfaces/ai-chat.json +2185 -0
- package/src/surfaces/ai-chat.ts +549 -0
- package/src/surfaces/ai-credentials-form.json +332 -0
- package/src/surfaces/ai-credentials-form.ts +151 -0
- package/src/surfaces/ai-managed-connect.json +108 -0
- package/src/surfaces/ai-managed-connect.ts +123 -0
- package/src/surfaces/ai-model-picker.json +114 -0
- package/src/surfaces/ai-model-picker.ts +139 -0
- package/src/surfaces/block-action-bar.json +640 -0
- package/src/surfaces/block-action-bar.ts +368 -0
- package/src/surfaces/bottom-dock.json +154 -0
- package/src/surfaces/bottom-dock.ts +125 -0
- package/src/surfaces/canvas-stage.json +444 -0
- package/src/surfaces/canvas-stage.ts +253 -0
- package/src/surfaces/cf-account-picker.json +300 -0
- package/src/surfaces/cf-account-picker.ts +214 -0
- package/src/surfaces/commandbar.json +985 -0
- package/src/{panels/toolbar.ts → surfaces/commandbar.ts} +417 -391
- package/src/surfaces/convert-repeater.json +309 -0
- package/src/surfaces/convert-repeater.ts +276 -0
- package/src/surfaces/data-actions.json +157 -0
- package/src/surfaces/data-actions.ts +115 -0
- package/src/surfaces/dialog.json +289 -0
- package/src/surfaces/dialog.ts +343 -0
- package/src/surfaces/diff-toolbar.json +266 -0
- package/src/surfaces/diff-toolbar.ts +139 -0
- package/src/surfaces/doc-header.json +739 -0
- package/src/surfaces/doc-header.ts +223 -0
- package/src/surfaces/empty-state.json +152 -0
- package/src/surfaces/empty-state.ts +173 -0
- package/src/surfaces/entry-editor.json +281 -0
- package/src/surfaces/entry-editor.ts +191 -0
- package/src/surfaces/expression-editor.json +977 -0
- package/src/surfaces/expression-editor.ts +266 -0
- package/src/surfaces/files-panel.json +592 -0
- package/src/surfaces/files-panel.ts +301 -0
- package/src/surfaces/formula-palette.json +364 -0
- package/src/surfaces/formula-palette.ts +340 -0
- package/src/surfaces/git-panel.json +1822 -0
- package/src/surfaces/git-panel.ts +272 -0
- package/src/surfaces/github-auth.json +112 -0
- package/src/surfaces/github-auth.ts +139 -0
- package/src/surfaces/github-publish.json +206 -0
- package/src/surfaces/github-publish.ts +169 -0
- package/src/surfaces/grid-cell.json +218 -0
- package/src/surfaces/grid-cell.ts +120 -0
- package/src/surfaces/grid-open.json +147 -0
- package/src/surfaces/grid-open.ts +87 -0
- package/src/surfaces/grid-panel.json +706 -0
- package/src/surfaces/grid-panel.ts +206 -0
- package/src/surfaces/grid-replace.json +179 -0
- package/src/surfaces/grid-replace.ts +89 -0
- package/src/surfaces/grid-views.json +446 -0
- package/src/surfaces/grid-views.ts +172 -0
- package/src/surfaces/inspector-dock.json +187 -0
- package/src/surfaces/inspector-dock.ts +161 -0
- package/src/surfaces/jump-bar.json +243 -0
- package/src/surfaces/jump-bar.ts +129 -0
- package/src/surfaces/jxsuite-update.json +146 -0
- package/src/surfaces/jxsuite-update.ts +149 -0
- package/src/surfaces/library-pane.json +1509 -0
- package/src/surfaces/library-pane.ts +363 -0
- package/src/surfaces/logic-panel.json +1949 -0
- package/src/surfaces/logic-panel.ts +369 -0
- package/src/surfaces/logic-workspace.json +685 -0
- package/src/surfaces/logic-workspace.ts +238 -0
- package/src/surfaces/media-browser.json +303 -0
- package/src/surfaces/media-browser.ts +145 -0
- package/src/surfaces/media-field.json +163 -0
- package/src/surfaces/media-field.ts +116 -0
- package/src/surfaces/media-pane.json +513 -0
- package/src/surfaces/media-pane.ts +197 -0
- package/src/surfaces/menu.json +232 -0
- package/src/surfaces/menu.ts +375 -0
- package/src/surfaces/navigator-dock.json +113 -0
- package/src/surfaces/navigator-dock.ts +130 -0
- package/src/surfaces/new-project.json +1654 -0
- package/src/surfaces/new-project.ts +411 -0
- package/src/surfaces/palette.json +535 -0
- package/src/surfaces/pane-context.json +1497 -0
- package/src/surfaces/pane-context.ts +513 -0
- package/src/surfaces/pane-grid.json +188 -0
- package/src/surfaces/pane-grid.ts +250 -0
- package/src/surfaces/panel-activity.json +563 -0
- package/src/surfaces/panel-activity.ts +187 -0
- package/src/surfaces/panel-data.json +141 -0
- package/src/surfaces/panel-data.ts +156 -0
- package/src/surfaces/panel-deploy-checklist.json +283 -0
- package/src/surfaces/panel-deploy-checklist.ts +175 -0
- package/src/surfaces/panel-elements.json +367 -0
- package/src/surfaces/panel-elements.ts +175 -0
- package/src/surfaces/panel-i18n.json +569 -0
- package/src/surfaces/panel-i18n.ts +212 -0
- package/src/surfaces/panel-imports.json +780 -0
- package/src/surfaces/panel-imports.ts +209 -0
- package/src/surfaces/panel-outline.json +734 -0
- package/src/surfaces/panel-outline.ts +326 -0
- package/src/surfaces/panel-page.json +1017 -0
- package/src/surfaces/panel-page.ts +240 -0
- package/src/surfaces/panel-problems.json +497 -0
- package/src/surfaces/panel-problems.ts +157 -0
- package/src/surfaces/panel-signals.json +1973 -0
- package/src/surfaces/panel-signals.ts +436 -0
- package/src/surfaces/panel-stylebook-layers.json +317 -0
- package/src/surfaces/panel-stylebook-layers.ts +155 -0
- package/src/surfaces/preferences.json +850 -0
- package/src/surfaces/preferences.ts +332 -0
- package/src/surfaces/progress-modal.json +110 -0
- package/src/surfaces/progress-modal.ts +150 -0
- package/src/surfaces/properties-panel.json +1578 -0
- package/src/surfaces/properties-panel.ts +337 -0
- package/src/surfaces/publish.json +945 -0
- package/src/surfaces/publish.ts +392 -0
- package/src/surfaces/push-plan.json +110 -0
- package/src/surfaces/push-plan.ts +87 -0
- package/src/surfaces/rail.json +255 -0
- package/src/surfaces/rail.ts +206 -0
- package/src/surfaces/reference-field.json +191 -0
- package/src/surfaces/reference-field.ts +168 -0
- package/src/surfaces/schema-builder.json +1011 -0
- package/src/surfaces/schema-builder.ts +181 -0
- package/src/surfaces/schema-form.json +1013 -0
- package/src/surfaces/schema-form.ts +287 -0
- package/src/surfaces/secret-field.json +60 -0
- package/src/surfaces/secret-field.ts +146 -0
- package/src/surfaces/seo.json +932 -0
- package/src/surfaces/seo.ts +334 -0
- package/src/surfaces/settings-contexts.json +538 -0
- package/src/surfaces/settings-contexts.ts +196 -0
- package/src/surfaces/settings-contributed.json +489 -0
- package/src/surfaces/settings-contributed.ts +199 -0
- package/src/surfaces/settings-css-vars.json +820 -0
- package/src/surfaces/settings-css-vars.ts +199 -0
- package/src/surfaces/settings-defs.json +1363 -0
- package/src/surfaces/settings-defs.ts +232 -0
- package/src/surfaces/settings-deploy.json +108 -0
- package/src/surfaces/settings-deploy.ts +135 -0
- package/src/surfaces/settings-extensions.json +486 -0
- package/src/surfaces/settings-extensions.ts +201 -0
- package/src/surfaces/settings-head.json +779 -0
- package/src/surfaces/settings-head.ts +397 -0
- package/src/surfaces/settings-locales.json +420 -0
- package/src/surfaces/settings-locales.ts +137 -0
- package/src/surfaces/settings-overview.json +423 -0
- package/src/surfaces/settings-overview.ts +218 -0
- package/src/surfaces/settings-packages.json +549 -0
- package/src/surfaces/settings-packages.ts +158 -0
- package/src/surfaces/settings-pane.json +147 -0
- package/src/surfaces/settings-pane.ts +150 -0
- package/src/surfaces/settings-rawjson.json +104 -0
- package/src/surfaces/settings-rawjson.ts +107 -0
- package/src/surfaces/shell.json +99 -0
- package/src/surfaces/shell.ts +30 -0
- package/src/surfaces/slash-menu.json +180 -0
- package/src/surfaces/slash-menu.ts +272 -0
- package/src/surfaces/statements.json +607 -0
- package/src/surfaces/statements.ts +238 -0
- package/src/surfaces/statusbar.json +94 -0
- package/src/{panels → surfaces}/statusbar.ts +164 -90
- package/src/surfaces/style-panel.json +1643 -0
- package/src/surfaces/style-panel.ts +338 -0
- package/src/surfaces/stylebook-chrome.json +122 -0
- package/src/surfaces/stylebook-chrome.ts +122 -0
- package/src/surfaces/tab-strip.json +448 -0
- package/src/surfaces/tab-strip.ts +200 -0
- package/src/surfaces/target-line.json +419 -0
- package/src/surfaces/target-line.ts +349 -0
- package/src/surfaces/toasts.json +189 -0
- package/src/surfaces/welcome.json +571 -0
- package/src/surfaces/welcome.ts +338 -0
- package/src/tabs/project-config.ts +111 -21
- package/src/tabs/tab.ts +52 -1
- package/src/types.ts +22 -0
- package/src/ui/ai-credentials-form.ts +104 -100
- package/src/ui/ai-managed-connect.ts +54 -36
- package/src/ui/ai-model-picker.ts +75 -47
- package/src/ui/cf-account-picker.ts +76 -141
- package/src/ui/color-selector.ts +80 -301
- package/src/ui/dynamic-slot.ts +43 -283
- package/src/ui/expression-editor.ts +797 -576
- package/src/ui/field-input.ts +8 -181
- package/src/ui/form-controls.ts +838 -366
- package/src/ui/formula-chips.ts +80 -85
- package/src/ui/kit.ts +33 -0
- package/src/ui/layers.ts +296 -593
- package/src/ui/media-picker.ts +203 -284
- package/src/ui/panel-resize.ts +251 -64
- package/src/ui/popover-surface.ts +153 -0
- package/src/ui/progress-modal.ts +22 -60
- package/src/ui/regions.ts +13 -7
- package/src/ui/schema-form.ts +906 -440
- package/src/ui/surface.ts +122 -0
- package/src/ui/unit-selector.ts +15 -131
- package/src/ui/value-source.ts +14 -0
- package/src/ui/virtual-window.ts +88 -9
- package/src/utils/canvas-media.ts +72 -0
- package/src/utils/edit-display.ts +7 -2
- package/src/utils/element-selectors.ts +69 -0
- package/src/utils/link-target.ts +2 -2
- package/src/utils/studio-utils.ts +0 -10
- package/src/view.ts +15 -0
- package/src/workspace/pane-derive.ts +36 -14
- package/src/workspace/workspace.ts +75 -6
- package/styles/canvas.css +72 -467
- package/styles/forced-colors.css +48 -82
- package/styles/forced-colors.json +41 -0
- package/styles/inspector.css +2 -1301
- package/styles/overlays.css +96 -2823
- package/styles/panels.css +6 -1423
- package/styles/shell-frame.css +272 -0
- package/styles/shell-frame.json +227 -0
- package/styles/shell.css +0 -1568
- package/styles/tokens.css +65 -136
- package/styles/tokens.json +84 -0
- package/dist/chunks/Overlay.dev-etqjwyf9.js +0 -23
- package/dist/chunks/adapter-jkcyhgtr.js +0 -14
- package/dist/chunks/cf-account-picker-en86v7x7.js +0 -163
- package/dist/chunks/cf-settings-45fgyx8y.js +0 -21
- package/dist/chunks/components-zmx10t62.js +0 -21
- package/dist/chunks/content-source-48xg86wj.js +0 -49
- package/dist/chunks/convert-to-repeater-43tfn7cs.js +0 -268
- package/dist/chunks/editor-cptq5jp1.js +0 -37
- package/dist/chunks/entry-commands-e63f1xc0.js +0 -46
- package/dist/chunks/extension-sections-txv08xxg.js +0 -311
- package/dist/chunks/file-ops-wbh4hhsx.js +0 -48
- package/dist/chunks/files-3kfkwhk4.js +0 -93
- package/dist/chunks/flow-qbfgrpeh.js +0 -634
- package/dist/chunks/focus-trap.esm-9t2drp0g.js +0 -1025
- package/dist/chunks/focus-visible-6eg70z18.js +0 -167
- package/dist/chunks/format-host-w16q81tf.js +0 -43
- package/dist/chunks/fs-events-hrrg328g.js +0 -21
- package/dist/chunks/git-panel-532whr1y.js +0 -59
- package/dist/chunks/index-zqxmqxmh.js +0 -109
- package/dist/chunks/jx-validate-8er6gbxy.js +0 -19
- package/dist/chunks/layers-panel-07hm7g5j.js +0 -67
- package/dist/chunks/layers-q75tj2mf.js +0 -45
- package/dist/chunks/lit-html-j055mkh8.js +0 -22
- package/dist/chunks/monaco-buffer-dqw0xxpx.js +0 -25
- package/dist/chunks/notify-yjm79n4s.js +0 -30
- package/dist/chunks/parse-24d0gay3.js +0 -19
- package/dist/chunks/platform-ba1j1gbh.js +0 -16
- package/dist/chunks/publish-panel-v9st96ja.js +0 -29
- package/dist/chunks/quick-search-zccjp6gv.js +0 -66
- package/dist/chunks/references-3qx8fkyp.js +0 -29
- package/dist/chunks/right-panel-vm3b6kwy.js +0 -46
- package/dist/chunks/section-registry-sx1ykvkw.js +0 -30
- package/dist/chunks/sp-overlay.dev-qgvhnxf4.js +0 -18
- package/dist/chunks/sp-popover.dev-n2etmqdp.js +0 -9
- package/dist/chunks/sp-progress-circle.dev-hryhj0es.js +0 -15
- package/dist/chunks/sp-tooltip.dev-4sastdnw.js +0 -15
- package/dist/chunks/sp-tray.dev-tkbscm06.js +0 -199
- package/dist/chunks/studio-0a5qrh01.js +0 -3
- package/dist/chunks/studio-0bq6eh7v.js +0 -12
- package/dist/chunks/studio-18j3bmcz.js +0 -14
- package/dist/chunks/studio-1ngbejft.js +0 -181
- package/dist/chunks/studio-4b5z1x43.js +0 -424
- package/dist/chunks/studio-4n2b5gzb.js +0 -357
- package/dist/chunks/studio-4rzyrtjz.js +0 -426
- package/dist/chunks/studio-5fx3g9jg.js +0 -4325
- package/dist/chunks/studio-5myknm0a.js +0 -1903
- package/dist/chunks/studio-7afd21nw.js +0 -67
- package/dist/chunks/studio-7nte2hj4.js +0 -613
- package/dist/chunks/studio-8jpzqk5s.js +0 -128
- package/dist/chunks/studio-8q517dfr.js +0 -24
- package/dist/chunks/studio-950k0dx6.js +0 -6939
- package/dist/chunks/studio-9n4mrmnb.js +0 -184
- package/dist/chunks/studio-a0tswy0w.js +0 -58
- package/dist/chunks/studio-ahnzd9rg.js +0 -23
- package/dist/chunks/studio-bgxt93ga.js +0 -62
- package/dist/chunks/studio-cmb03bg5.js +0 -13890
- package/dist/chunks/studio-d1ks410h.js +0 -175
- package/dist/chunks/studio-ef49pnzx.js +0 -387
- package/dist/chunks/studio-eqq1w638.js +0 -113
- package/dist/chunks/studio-ew0djmhg.js +0 -341
- package/dist/chunks/studio-gfgb8pe6.js +0 -1652
- package/dist/chunks/studio-h4rxscfc.js +0 -10
- package/dist/chunks/studio-jc994dnr.js +0 -1066
- package/dist/chunks/studio-kyh9avvv.js +0 -28
- package/dist/chunks/studio-m3hwn7y1.js +0 -120
- package/dist/chunks/studio-mtfnaqs9.js +0 -659
- package/dist/chunks/studio-n6j9t10q.js +0 -318
- package/dist/chunks/studio-n8b9wqwy.js +0 -291
- package/dist/chunks/studio-qcy05dp8.js +0 -1743
- package/dist/chunks/studio-qq6jym04.js +0 -53
- package/dist/chunks/studio-rdx8jcxy.js +0 -83
- package/dist/chunks/studio-rn9ta2mz.js +0 -111
- package/dist/chunks/studio-t7qb9db8.js +0 -665
- package/dist/chunks/studio-tmc5emrw.js +0 -8
- package/dist/chunks/studio-z6nw2ek2.js +0 -18
- package/dist/chunks/studio-zczps70q.js +0 -378
- package/dist/chunks/studio-zqazsct2.js +0 -1823
- package/dist/chunks/workspace-fjx52ryv.js +0 -89
- package/src/panels/activity-bar.ts +0 -251
- package/src/panels/panel-scheduler.ts +0 -219
- package/src/panels/style-inputs.ts +0 -237
- package/src/panels/target-line.ts +0 -274
- package/src/panels/welcome-screen.ts +0 -346
- package/src/ui/button-group.ts +0 -102
- package/src/ui/choice-field.ts +0 -72
- package/src/ui/field-row.ts +0 -249
- package/src/ui/formula-palette.ts +0 -213
- package/src/ui/icons.ts +0 -52
- package/src/ui/jx-theme.ts +0 -130
- package/src/ui/spectrum.ts +0 -340
- package/src/ui/value-selector.ts +0 -174
- package/src/ui/widgets.ts +0 -172
- /package/dist/chunks/{javascript-s56a8dpk.css → javascript-4abzjcy9.css} +0 -0
- /package/dist/chunks/{jsonMode-zr9sw0c7.css → jsonMode-vvmpmk34.css} +0 -0
- /package/dist/chunks/{monaco-setup-pav68602.css → monaco-setup-8vbyqnhr.css} +0 -0
- /package/dist/chunks/{tsMode-ef187txx.css → tsMode-hnxxb73h.css} +0 -0
|
@@ -1,26 +1,32 @@
|
|
|
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";
|
|
@@ -29,7 +35,9 @@ import { getCfToken, setCfToken } from "../services/cf-settings";
|
|
|
29
35
|
import { resetModelCache } from "../services/ai-models";
|
|
30
36
|
import { projectState } from "../store";
|
|
31
37
|
import type { CfConnection } from "../types";
|
|
32
|
-
import {
|
|
38
|
+
import { layerHost } from "../ui/layers";
|
|
39
|
+
import { openPublishSurface } from "../surfaces/publish";
|
|
40
|
+
import type { PublishForm, PublishSurfaceHandle, PublishView } from "../surfaces/publish";
|
|
33
41
|
import type { CfAccount, PagesDeploymentInfo } from "./pages-service";
|
|
34
42
|
import {
|
|
35
43
|
connectDeploy,
|
|
@@ -39,9 +47,7 @@ import {
|
|
|
39
47
|
writeDeployConfig,
|
|
40
48
|
} from "./pages-service";
|
|
41
49
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
let _handle: ReturnType<typeof openModal> | null = null;
|
|
50
|
+
let _handle: PublishSurfaceHandle | null = null;
|
|
45
51
|
let _connection: CfConnection | null | "loading" = "loading";
|
|
46
52
|
let _accounts: CfAccount[] = [];
|
|
47
53
|
let _deployment: PagesDeploymentInfo | null = null;
|
|
@@ -49,7 +55,7 @@ let _error = "";
|
|
|
49
55
|
let _busy = false;
|
|
50
56
|
/** Whether the reader has asked to replace a token that is already stored. */
|
|
51
57
|
let _replacing = false;
|
|
52
|
-
let _form = { accountId: "", branch: "main", owner: "", projectName: "", repo: "" };
|
|
58
|
+
let _form: PublishForm = { accountId: "", branch: "main", owner: "", projectName: "", repo: "" };
|
|
53
59
|
|
|
54
60
|
function currentConfig(): ProjectConfig | null {
|
|
55
61
|
return (projectState?.projectConfig as ProjectConfig | undefined) ?? null;
|
|
@@ -65,16 +71,94 @@ function deriveSlug(name: string): string {
|
|
|
65
71
|
);
|
|
66
72
|
}
|
|
67
73
|
|
|
68
|
-
/**
|
|
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
|
+
*/
|
|
69
79
|
function prefillRepo(): { owner: string; repo: string } {
|
|
70
80
|
const root = getPlatform().projectRoot;
|
|
71
|
-
const match = /^([\w.-]+)\/([\w.-]+)
|
|
81
|
+
const match = /^([\w.-]+)\/([\w.-]+)(?:@.+)?$/.exec(root);
|
|
72
82
|
return match ? { owner: match[1]!, repo: match[2]! } : { owner: "", repo: "" };
|
|
73
83
|
}
|
|
74
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
|
+
|
|
75
159
|
async function loadConnection(): Promise<void> {
|
|
76
160
|
_connection = "loading";
|
|
77
|
-
|
|
161
|
+
paint();
|
|
78
162
|
try {
|
|
79
163
|
_connection = (await getPlatform().cfConnection?.()) ?? null;
|
|
80
164
|
/*
|
|
@@ -85,7 +169,7 @@ async function loadConnection(): Promise<void> {
|
|
|
85
169
|
*/
|
|
86
170
|
if (_connection?.connected && !_connection.needsReconnect) {
|
|
87
171
|
_accounts = await listAccounts();
|
|
88
|
-
_form
|
|
172
|
+
_form = { ..._form, accountId: _connection.accountId ?? _accounts[0]?.id ?? "" };
|
|
89
173
|
const deploy = currentDeploy();
|
|
90
174
|
if (deploy) {
|
|
91
175
|
_deployment = await latestDeployment(deploy);
|
|
@@ -98,27 +182,23 @@ async function loadConnection(): Promise<void> {
|
|
|
98
182
|
_connection = null;
|
|
99
183
|
_error = error instanceof Error ? error.message : String(error);
|
|
100
184
|
}
|
|
101
|
-
|
|
185
|
+
paint();
|
|
102
186
|
}
|
|
103
187
|
|
|
104
188
|
/**
|
|
105
|
-
* Take the token
|
|
189
|
+
* Take the token the reader typed straight to storage.
|
|
106
190
|
*
|
|
107
|
-
* It
|
|
191
|
+
* It arrives as an argument and is never written back, which is the whole asymmetry: a secret may
|
|
108
192
|
* pass through a field the user typed it into, and may not be painted into one they did not.
|
|
109
193
|
*/
|
|
110
|
-
async function saveToken(
|
|
111
|
-
const
|
|
112
|
-
const value = (input?.value ?? "").trim();
|
|
194
|
+
async function saveToken(token: string): Promise<void> {
|
|
195
|
+
const value = token.trim();
|
|
113
196
|
if (!value) {
|
|
114
197
|
_error = "Paste a token, or use Preferences › Accounts to forget the stored one.";
|
|
115
|
-
|
|
198
|
+
paint();
|
|
116
199
|
return;
|
|
117
200
|
}
|
|
118
201
|
setCfToken(value);
|
|
119
|
-
if (input) {
|
|
120
|
-
input.value = "";
|
|
121
|
-
}
|
|
122
202
|
_replacing = false;
|
|
123
203
|
_error = "";
|
|
124
204
|
await loadConnection();
|
|
@@ -140,14 +220,14 @@ function openAccounts(): void {
|
|
|
140
220
|
async function hostedConnect(): Promise<void> {
|
|
141
221
|
_busy = true;
|
|
142
222
|
_error = "";
|
|
143
|
-
|
|
223
|
+
paint();
|
|
144
224
|
try {
|
|
145
225
|
const outcome = (await getPlatform().cfConnect?.()) ?? null;
|
|
146
226
|
if (outcome?.status === "timeout") {
|
|
147
227
|
_error =
|
|
148
228
|
"The Cloudflare window didn't finish. Sign in there, then reconnect — nothing was changed.";
|
|
149
229
|
} else if (outcome?.status === "connected" && !outcome.connection.accountId) {
|
|
150
|
-
/* Lazily: this module is the publish
|
|
230
|
+
/* Lazily: this module is the publish panel, and the picker drags the dialog layer with it. */
|
|
151
231
|
const { openCfAccountPicker } = await import("../ui/cf-account-picker");
|
|
152
232
|
await openCfAccountPicker();
|
|
153
233
|
}
|
|
@@ -170,12 +250,12 @@ async function submitConnect(): Promise<void> {
|
|
|
170
250
|
}
|
|
171
251
|
if (!_form.projectName || !_form.owner || !_form.repo || !_form.accountId) {
|
|
172
252
|
_error = "Account, project name, and the GitHub owner/repo are all required.";
|
|
173
|
-
|
|
253
|
+
paint();
|
|
174
254
|
return;
|
|
175
255
|
}
|
|
176
256
|
_busy = true;
|
|
177
257
|
_error = "";
|
|
178
|
-
|
|
258
|
+
paint();
|
|
179
259
|
try {
|
|
180
260
|
const deploy = await connectDeploy(config, {
|
|
181
261
|
accountId: _form.accountId,
|
|
@@ -189,7 +269,7 @@ async function submitConnect(): Promise<void> {
|
|
|
189
269
|
_error = error instanceof Error ? error.message : String(error);
|
|
190
270
|
}
|
|
191
271
|
_busy = false;
|
|
192
|
-
|
|
272
|
+
paint();
|
|
193
273
|
}
|
|
194
274
|
|
|
195
275
|
async function disconnect(): Promise<void> {
|
|
@@ -198,7 +278,7 @@ async function disconnect(): Promise<void> {
|
|
|
198
278
|
return;
|
|
199
279
|
}
|
|
200
280
|
_busy = true;
|
|
201
|
-
|
|
281
|
+
paint();
|
|
202
282
|
try {
|
|
203
283
|
await writeDeployConfig(config, null);
|
|
204
284
|
_deployment = null;
|
|
@@ -206,298 +286,24 @@ async function disconnect(): Promise<void> {
|
|
|
206
286
|
_error = error instanceof Error ? error.message : String(error);
|
|
207
287
|
}
|
|
208
288
|
_busy = false;
|
|
209
|
-
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
function close(): void {
|
|
213
|
-
_handle?.close();
|
|
214
|
-
_handle = null;
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
function fieldRow(label: string, input: unknown) {
|
|
218
|
-
return html`
|
|
219
|
-
<label class="publish-field">
|
|
220
|
-
<span>${label}</span>
|
|
221
|
-
${input}
|
|
222
|
-
</label>
|
|
223
|
-
`;
|
|
289
|
+
paint();
|
|
224
290
|
}
|
|
225
291
|
|
|
226
292
|
/**
|
|
227
|
-
*
|
|
293
|
+
* Take the panel down.
|
|
228
294
|
*
|
|
229
|
-
*
|
|
230
|
-
*
|
|
231
|
-
*
|
|
232
|
-
* user who had already done exactly that.
|
|
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.
|
|
233
298
|
*/
|
|
234
|
-
function
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
restore it — this site's Pages project and its settings are untouched.
|
|
239
|
-
</p>
|
|
240
|
-
<sp-button
|
|
241
|
-
variant="accent"
|
|
242
|
-
?disabled=${_busy}
|
|
243
|
-
@click=${() => {
|
|
244
|
-
void hostedConnect();
|
|
245
|
-
}}
|
|
246
|
-
>
|
|
247
|
-
${_busy ? "Reconnecting…" : "Reconnect Cloudflare"}
|
|
248
|
-
</sp-button>
|
|
249
|
-
`;
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
function credentialTpl() {
|
|
253
|
-
const platform = getPlatform();
|
|
254
|
-
if (platform.cfConnect) {
|
|
255
|
-
return html`
|
|
256
|
-
<p>Connect your Cloudflare account to publish this site.</p>
|
|
257
|
-
<sp-button
|
|
258
|
-
?disabled=${_busy}
|
|
259
|
-
@click=${() => {
|
|
260
|
-
void hostedConnect();
|
|
261
|
-
}}
|
|
262
|
-
>
|
|
263
|
-
Connect Cloudflare
|
|
264
|
-
</sp-button>
|
|
265
|
-
`;
|
|
266
|
-
}
|
|
267
|
-
const stored = getCfToken() !== "";
|
|
268
|
-
if (stored && !_replacing) {
|
|
269
|
-
// The token is STORED, and that is the whole of what this says. It was rejected or has expired
|
|
270
|
-
// — otherwise `_connection.connected` would be true and this branch unreachable — so the two
|
|
271
|
-
// Honest moves are to replace it or to forget it, and neither needs to see it.
|
|
272
|
-
return html`
|
|
273
|
-
<p>
|
|
274
|
-
A Cloudflare API token is stored on this machine, and Cloudflare did not accept it. It may
|
|
275
|
-
have been revoked, or it may be missing the Account Settings Read and Pages Read/Write
|
|
276
|
-
permissions.
|
|
277
|
-
</p>
|
|
278
|
-
<div class="publish-actions">
|
|
279
|
-
<sp-button
|
|
280
|
-
?disabled=${_busy}
|
|
281
|
-
@click=${() => {
|
|
282
|
-
_replacing = true;
|
|
283
|
-
_error = "";
|
|
284
|
-
render();
|
|
285
|
-
}}
|
|
286
|
-
>
|
|
287
|
-
Replace token
|
|
288
|
-
</sp-button>
|
|
289
|
-
<sp-button variant="secondary" @click=${openAccounts}>Preferences › Accounts</sp-button>
|
|
290
|
-
</div>
|
|
291
|
-
`;
|
|
292
|
-
}
|
|
293
|
-
return html`
|
|
294
|
-
<p>
|
|
295
|
-
Paste a Cloudflare API token (permissions: Account Settings Read, Pages Read/Write). It is
|
|
296
|
-
stored on this machine and only sent to the same-origin proxy — Studio never renders it back.
|
|
297
|
-
</p>
|
|
298
|
-
${fieldRow(
|
|
299
|
-
"API token",
|
|
300
|
-
html`<sp-textfield
|
|
301
|
-
id="cf-token-input"
|
|
302
|
-
type="password"
|
|
303
|
-
value=""
|
|
304
|
-
placeholder="cf_..."
|
|
305
|
-
></sp-textfield>`,
|
|
306
|
-
)}
|
|
307
|
-
<div class="publish-actions">
|
|
308
|
-
<sp-button
|
|
309
|
-
?disabled=${_busy}
|
|
310
|
-
@click=${(e: Event) => {
|
|
311
|
-
void saveToken(hostOf(e));
|
|
312
|
-
}}
|
|
313
|
-
>
|
|
314
|
-
Verify & Connect
|
|
315
|
-
</sp-button>
|
|
316
|
-
<sp-button variant="secondary" @click=${openAccounts}>Preferences › Accounts</sp-button>
|
|
317
|
-
</div>
|
|
318
|
-
`;
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
function hostOf(e: Event): HTMLElement {
|
|
322
|
-
return (e.target as HTMLElement).closest(".publish-modal") ?? document.body;
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
function connectFormTpl() {
|
|
326
|
-
return html`
|
|
327
|
-
<p>
|
|
328
|
-
Create a Cloudflare Pages project connected to this repository. Every commit then builds and
|
|
329
|
-
publishes automatically (<code>bunx jx build</code>).
|
|
330
|
-
</p>
|
|
331
|
-
${fieldRow(
|
|
332
|
-
"Account",
|
|
333
|
-
html`
|
|
334
|
-
<sp-picker
|
|
335
|
-
value=${_form.accountId}
|
|
336
|
-
@change=${(e: Event) => {
|
|
337
|
-
_form.accountId = (e.target as HTMLInputElement).value;
|
|
338
|
-
}}
|
|
339
|
-
>
|
|
340
|
-
${_accounts.map((a) => html`<sp-menu-item value=${a.id}>${a.name}</sp-menu-item>`)}
|
|
341
|
-
</sp-picker>
|
|
342
|
-
`,
|
|
343
|
-
)}
|
|
344
|
-
${fieldRow(
|
|
345
|
-
"Pages project name",
|
|
346
|
-
html`<sp-textfield
|
|
347
|
-
value=${_form.projectName}
|
|
348
|
-
@input=${(e: Event) => {
|
|
349
|
-
_form.projectName = (e.target as HTMLInputElement).value;
|
|
350
|
-
}}
|
|
351
|
-
></sp-textfield>`,
|
|
352
|
-
)}
|
|
353
|
-
${fieldRow(
|
|
354
|
-
"GitHub owner",
|
|
355
|
-
html`<sp-textfield
|
|
356
|
-
value=${_form.owner}
|
|
357
|
-
@input=${(e: Event) => {
|
|
358
|
-
_form.owner = (e.target as HTMLInputElement).value;
|
|
359
|
-
}}
|
|
360
|
-
></sp-textfield>`,
|
|
361
|
-
)}
|
|
362
|
-
${fieldRow(
|
|
363
|
-
"GitHub repository",
|
|
364
|
-
html`<sp-textfield
|
|
365
|
-
value=${_form.repo}
|
|
366
|
-
@input=${(e: Event) => {
|
|
367
|
-
_form.repo = (e.target as HTMLInputElement).value;
|
|
368
|
-
}}
|
|
369
|
-
></sp-textfield>`,
|
|
370
|
-
)}
|
|
371
|
-
${fieldRow(
|
|
372
|
-
"Production branch",
|
|
373
|
-
html`<sp-textfield
|
|
374
|
-
value=${_form.branch}
|
|
375
|
-
@input=${(e: Event) => {
|
|
376
|
-
_form.branch = (e.target as HTMLInputElement).value;
|
|
377
|
-
}}
|
|
378
|
-
></sp-textfield>`,
|
|
379
|
-
)}
|
|
380
|
-
<sp-button
|
|
381
|
-
?disabled=${_busy}
|
|
382
|
-
@click=${() => {
|
|
383
|
-
void submitConnect();
|
|
384
|
-
}}
|
|
385
|
-
>
|
|
386
|
-
${_busy ? "Connecting…" : "Create & Connect"}
|
|
387
|
-
</sp-button>
|
|
388
|
-
`;
|
|
389
|
-
}
|
|
390
|
-
|
|
391
|
-
function statusTpl(deploy: DeployConfig) {
|
|
392
|
-
return html`
|
|
393
|
-
<p>
|
|
394
|
-
Connected to Pages project <strong>${deploy.projectName}</strong>
|
|
395
|
-
${
|
|
396
|
-
deploy.productionUrl
|
|
397
|
-
? html` —
|
|
398
|
-
<a href=${deploy.productionUrl} target="_blank" rel="noreferrer">
|
|
399
|
-
${deploy.productionUrl}
|
|
400
|
-
</a>`
|
|
401
|
-
: ""
|
|
402
|
-
}
|
|
403
|
-
</p>
|
|
404
|
-
${
|
|
405
|
-
_deployment
|
|
406
|
-
? html`
|
|
407
|
-
<p>
|
|
408
|
-
Latest deployment: <strong>${_deployment.stage}: ${_deployment.status}</strong>
|
|
409
|
-
(${_deployment.environment}) —
|
|
410
|
-
<a href=${_deployment.url} target="_blank" rel="noreferrer">preview</a>
|
|
411
|
-
</p>
|
|
412
|
-
`
|
|
413
|
-
: html`<p>No deployments yet — the first commit after connecting triggers one.</p>`
|
|
414
|
-
}
|
|
415
|
-
<p class="publish-hint">Publishing happens automatically on every commit.</p>
|
|
416
|
-
<div class="publish-actions">
|
|
417
|
-
<sp-button
|
|
418
|
-
variant="secondary"
|
|
419
|
-
?disabled=${_busy}
|
|
420
|
-
@click=${() => {
|
|
421
|
-
void loadConnection();
|
|
422
|
-
}}
|
|
423
|
-
>
|
|
424
|
-
Refresh
|
|
425
|
-
</sp-button>
|
|
426
|
-
<sp-button
|
|
427
|
-
variant="negative"
|
|
428
|
-
?disabled=${_busy}
|
|
429
|
-
@click=${() => {
|
|
430
|
-
void disconnect();
|
|
431
|
-
}}
|
|
432
|
-
>
|
|
433
|
-
Disconnect
|
|
434
|
-
</sp-button>
|
|
435
|
-
</div>
|
|
436
|
-
`;
|
|
437
|
-
}
|
|
438
|
-
|
|
439
|
-
function bodyTpl() {
|
|
440
|
-
if (!platformSupportsPublish()) {
|
|
441
|
-
return html`
|
|
442
|
-
<p>
|
|
443
|
-
This platform cannot reach the Cloudflare API. Publish by committing and pushing — your host
|
|
444
|
-
builds <code>bunx jx build</code> and serves <code>dist/</code>.
|
|
445
|
-
</p>
|
|
446
|
-
`;
|
|
447
|
-
}
|
|
448
|
-
if (_connection === "loading") {
|
|
449
|
-
return html`<p>Checking Cloudflare connection…</p>`;
|
|
450
|
-
}
|
|
451
|
-
// Before the credential template, and that order is the fix: a lapsed row is `connected: true`,
|
|
452
|
-
// So neither branch below could ever have claimed it.
|
|
453
|
-
if (_connection?.connected && _connection.needsReconnect) {
|
|
454
|
-
return lapsedTpl();
|
|
455
|
-
}
|
|
456
|
-
if (!_connection?.connected) {
|
|
457
|
-
return credentialTpl();
|
|
458
|
-
}
|
|
459
|
-
const deploy = currentDeploy();
|
|
460
|
-
return deploy ? statusTpl(deploy) : connectFormTpl();
|
|
461
|
-
}
|
|
462
|
-
|
|
463
|
-
function errorTpl() {
|
|
464
|
-
if (!_error) {
|
|
465
|
-
return "";
|
|
466
|
-
}
|
|
467
|
-
const needsPagesApp = /github/i.test(_error) && /app|install|source|repo/i.test(_error);
|
|
468
|
-
return html`
|
|
469
|
-
<p class="publish-error">
|
|
470
|
-
${_error}
|
|
471
|
-
${
|
|
472
|
-
needsPagesApp
|
|
473
|
-
? html` — if the Cloudflare Pages GitHub App is not installed on the repository,
|
|
474
|
-
<a href=${PAGES_APP_INSTALL_URL} target="_blank" rel="noreferrer">install it</a> and
|
|
475
|
-
retry.`
|
|
476
|
-
: ""
|
|
477
|
-
}
|
|
478
|
-
</p>
|
|
479
|
-
`;
|
|
480
|
-
}
|
|
481
|
-
|
|
482
|
-
function render(): void {
|
|
483
|
-
const tpl = html`
|
|
484
|
-
<div class="new-project-modal publish-modal" data-jx-region="overlay.dialog:publish">
|
|
485
|
-
<div class="new-project-modal-header">
|
|
486
|
-
<h2 class="new-project-modal-title">Publish</h2>
|
|
487
|
-
<sp-action-button size="s" quiet @click=${close}>✕</sp-action-button>
|
|
488
|
-
</div>
|
|
489
|
-
<div class="new-project-modal-body">${bodyTpl()} ${errorTpl()}</div>
|
|
490
|
-
</div>
|
|
491
|
-
`;
|
|
492
|
-
if (_handle) {
|
|
493
|
-
_handle.update(tpl);
|
|
494
|
-
} else {
|
|
495
|
-
_handle = openModal(tpl, { label: "Publish", onDismiss: close });
|
|
496
|
-
}
|
|
299
|
+
function close(): void {
|
|
300
|
+
const handle = _handle;
|
|
301
|
+
_handle = null;
|
|
302
|
+
handle?.close();
|
|
497
303
|
}
|
|
498
304
|
|
|
499
305
|
/**
|
|
500
|
-
* Automation-only seam (scripts/screenshots): open the
|
|
306
|
+
* Automation-only seam (scripts/screenshots): open the panel directly in its connected state with a
|
|
501
307
|
* canned deployment, bypassing {@link loadConnection} so no Cloudflare request ever fires. The
|
|
502
308
|
* active project's `build.deploy` block still supplies the connected project/URL line.
|
|
503
309
|
*/
|
|
@@ -512,10 +318,10 @@ export function seedPublishConnected(options: {
|
|
|
512
318
|
_error = "";
|
|
513
319
|
_busy = false;
|
|
514
320
|
_replacing = false;
|
|
515
|
-
|
|
321
|
+
paint();
|
|
516
322
|
}
|
|
517
323
|
|
|
518
|
-
/** Open the publish
|
|
324
|
+
/** Open the publish panel for the active project. */
|
|
519
325
|
export function openPublishPanel(): void {
|
|
520
326
|
const config = currentConfig();
|
|
521
327
|
const { owner, repo } = prefillRepo();
|
|
@@ -532,6 +338,6 @@ export function openPublishPanel(): void {
|
|
|
532
338
|
projectName: currentDeploy()?.projectName ?? deriveSlug(config?.name ?? ""),
|
|
533
339
|
repo,
|
|
534
340
|
};
|
|
535
|
-
|
|
341
|
+
paint();
|
|
536
342
|
void loadConnection();
|
|
537
343
|
}
|