@jxsuite/studio 2.0.0 → 2.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/canvas.html +21 -0
- package/dist/chunks/Overlay.dev-qfjzkms8.js +23 -0
- package/dist/chunks/{Overlay.dev-cszx7yn5.js.map → Overlay.dev-qfjzkms8.js.map} +1 -1
- package/dist/chunks/{adapter-z8fkmbmv.js → adapter-qfnesn5v.js} +2 -2
- package/dist/chunks/{cf-settings-mmyv436d.js → cf-settings-73sh5z4p.js} +3 -3
- package/dist/chunks/{components-0hzentwq.js → components-2bpqp4mq.js} +5 -7
- package/dist/chunks/{components-0hzentwq.js.map → components-2bpqp4mq.js.map} +1 -1
- package/dist/chunks/content-source-34gnkbnn.js +38 -0
- package/dist/chunks/content-source-34gnkbnn.js.map +9 -0
- package/dist/chunks/convert-to-repeater-t8kxre5s.js +258 -0
- package/dist/chunks/convert-to-repeater-t8kxre5s.js.map +10 -0
- package/dist/chunks/extension-sections-6mqydz35.js +301 -0
- package/dist/chunks/extension-sections-6mqydz35.js.map +11 -0
- package/dist/chunks/files-8kn321h1.js +70 -0
- package/dist/chunks/files-8kn321h1.js.map +9 -0
- package/dist/chunks/{format-host-2c188n41.js → format-host-mkwsmt8d.js} +3 -3
- package/dist/chunks/git-panel-tjbr191d.js +51 -0
- package/dist/chunks/git-panel-tjbr191d.js.map +9 -0
- package/dist/chunks/{index-baeg2x3y.js → index-7pxchcce.js} +4 -3
- package/dist/chunks/{index-baeg2x3y.js.map → index-7pxchcce.js.map} +3 -3
- package/dist/chunks/{jx-validate-qx8degj7.js → jx-validate-v6qgknrs.js} +3 -3
- package/dist/chunks/layers-panel-87pb25km.js +58 -0
- package/dist/chunks/layers-panel-87pb25km.js.map +9 -0
- package/dist/chunks/{monaco-setup-zjdp9zdw.js → monaco-setup-e0yh25j4.js} +4 -75
- package/dist/chunks/{monaco-setup-zjdp9zdw.js.map → monaco-setup-e0yh25j4.js.map} +3 -4
- package/dist/chunks/publish-panel-m0fcgdrt.js +21 -0
- package/dist/chunks/publish-panel-m0fcgdrt.js.map +9 -0
- package/dist/chunks/quick-search-rhs6cbsb.js +53 -0
- package/dist/chunks/quick-search-rhs6cbsb.js.map +9 -0
- package/dist/chunks/right-panel-zpdxd98t.js +37 -0
- package/dist/chunks/right-panel-zpdxd98t.js.map +9 -0
- package/dist/chunks/section-registry-zmckaxf4.js +30 -0
- package/dist/chunks/section-registry-zmckaxf4.js.map +9 -0
- package/dist/chunks/sp-overlay.dev-9ran0sfq.js +18 -0
- package/dist/chunks/sp-overlay.dev-9ran0sfq.js.map +9 -0
- package/dist/chunks/sp-popover.dev-rebmdncr.js +9 -0
- package/dist/chunks/sp-popover.dev-rebmdncr.js.map +9 -0
- package/dist/chunks/sp-progress-circle.dev-5vkppfkt.js +15 -0
- package/dist/chunks/sp-progress-circle.dev-5vkppfkt.js.map +9 -0
- package/dist/chunks/sp-tooltip.dev-ykqrg8h5.js +15 -0
- package/dist/chunks/sp-tooltip.dev-ykqrg8h5.js.map +9 -0
- package/dist/chunks/{sp-tray.dev-pb2fsd65.js → sp-tray.dev-ey59vfh7.js} +10 -8
- package/dist/chunks/{sp-tray.dev-pb2fsd65.js.map → sp-tray.dev-ey59vfh7.js.map} +2 -2
- package/dist/chunks/{studio-9qr6fq7p.js → studio-0rqqhrdy.js} +10 -378
- package/dist/chunks/{studio-9qr6fq7p.js.map → studio-0rqqhrdy.js.map} +4 -14
- package/dist/chunks/{studio-5x6tqqec.js → studio-2sj1jj3v.js} +10 -8
- package/dist/chunks/{studio-5x6tqqec.js.map → studio-2sj1jj3v.js.map} +2 -2
- package/dist/chunks/{studio-h3fw0wn8.js → studio-3fk1ac9z.js} +6 -4
- package/dist/chunks/{studio-h3fw0wn8.js.map → studio-3fk1ac9z.js.map} +2 -2
- package/dist/chunks/studio-41exgzhq.js +6690 -0
- package/dist/chunks/studio-41exgzhq.js.map +38 -0
- package/dist/chunks/{studio-7v2bpweq.js → studio-4mqb9a0j.js} +6 -4
- package/dist/chunks/{studio-7v2bpweq.js.map → studio-4mqb9a0j.js.map} +2 -2
- package/dist/chunks/studio-50k77cca.js +1787 -0
- package/dist/chunks/studio-50k77cca.js.map +18 -0
- package/dist/chunks/{studio-56v3zwk6.js → studio-6a0h7sne.js} +10 -8
- package/dist/chunks/{studio-56v3zwk6.js.map → studio-6a0h7sne.js.map} +2 -2
- package/dist/chunks/studio-6f0am8f2.js +53 -0
- package/dist/chunks/studio-6f0am8f2.js.map +10 -0
- package/dist/chunks/studio-6nmjc5qk.js +7002 -0
- package/dist/chunks/studio-6nmjc5qk.js.map +32 -0
- package/dist/chunks/studio-7afd21nw.js +67 -0
- package/dist/chunks/studio-7afd21nw.js.map +10 -0
- package/dist/chunks/{studio-xze4zrs1.js → studio-7bmdvzne.js} +2 -2
- package/dist/chunks/studio-7bmdvzne.js.map +10 -0
- package/dist/chunks/studio-8jpzqk5s.js +128 -0
- package/dist/chunks/studio-8jpzqk5s.js.map +10 -0
- package/dist/chunks/studio-94m77tgk.js +1482 -0
- package/dist/chunks/studio-94m77tgk.js.map +13 -0
- package/dist/chunks/studio-9je6w5sq.js +1000 -0
- package/dist/chunks/studio-9je6w5sq.js.map +16 -0
- package/dist/chunks/{studio-w7c6kvk7.js → studio-a7pzveq1.js} +2 -2
- package/dist/chunks/{studio-97qcgvdn.js → studio-adn0z1k3.js} +14 -8
- package/dist/chunks/{studio-97qcgvdn.js.map → studio-adn0z1k3.js.map} +3 -3
- package/dist/chunks/{studio-kr88ryr7.js → studio-bsxxx3x2.js} +17 -15
- package/dist/chunks/{studio-kr88ryr7.js.map → studio-bsxxx3x2.js.map} +7 -6
- package/dist/chunks/studio-bw5dz6km.js +608 -0
- package/dist/chunks/studio-bw5dz6km.js.map +21 -0
- package/dist/chunks/studio-c6s5getc.js +4232 -0
- package/dist/chunks/studio-c6s5getc.js.map +39 -0
- package/dist/chunks/studio-cjm7fdjf.js +451 -0
- package/dist/chunks/studio-cjm7fdjf.js.map +14 -0
- package/dist/chunks/{studio-cx91mnh8.js → studio-ckwz4d3x.js} +53 -53
- package/dist/chunks/{studio-cx91mnh8.js.map → studio-ckwz4d3x.js.map} +5 -5
- package/dist/chunks/studio-dg7zyt5x.js +28 -0
- package/dist/chunks/studio-dg7zyt5x.js.map +10 -0
- package/dist/chunks/studio-dzcyvvvz.js +166 -0
- package/dist/chunks/studio-dzcyvvvz.js.map +10 -0
- package/dist/chunks/{studio-7kqe41sa.js → studio-evkr5d3b.js} +15 -7
- package/dist/chunks/{studio-7kqe41sa.js.map → studio-evkr5d3b.js.map} +5 -4
- package/dist/chunks/studio-f12h6177.js +411 -0
- package/dist/chunks/studio-f12h6177.js.map +13 -0
- package/dist/chunks/studio-hbp1s8m9.js +1817 -0
- package/dist/chunks/studio-hbp1s8m9.js.map +14 -0
- package/dist/chunks/studio-k2sxjph5.js +15295 -0
- package/dist/chunks/studio-k2sxjph5.js.map +235 -0
- package/dist/chunks/studio-myje51t3.js +385 -0
- package/dist/chunks/studio-myje51t3.js.map +12 -0
- package/dist/chunks/studio-na6rwzhw.js +353 -0
- package/dist/chunks/studio-na6rwzhw.js.map +11 -0
- package/dist/chunks/{studio-4k0m4fmp.js → studio-p471gg5n.js} +126 -3
- package/dist/chunks/studio-p471gg5n.js.map +14 -0
- package/dist/chunks/{studio-9bjwf0d4.js → studio-rgwcpast.js} +5 -46
- package/dist/chunks/{studio-9bjwf0d4.js.map → studio-rgwcpast.js.map} +4 -5
- package/dist/chunks/{studio-hhj92gcr.js → studio-s519zc99.js} +3 -3
- package/dist/chunks/studio-sas7mt3k.js +75 -0
- package/dist/chunks/studio-sas7mt3k.js.map +10 -0
- package/dist/chunks/studio-t5wqwzdh.js +74 -0
- package/dist/chunks/studio-t5wqwzdh.js.map +10 -0
- package/dist/chunks/{studio-9qpspwfn.js → studio-temv5bw4.js} +5 -5
- package/dist/chunks/{studio-9qpspwfn.js.map → studio-temv5bw4.js.map} +1 -1
- package/dist/chunks/{studio-qkvt37c0.js → studio-tr20m8g8.js} +669 -18
- package/dist/chunks/studio-tr20m8g8.js.map +9 -0
- package/dist/chunks/{studio-ygzav7z5.js → studio-v96qfnww.js} +5514 -4291
- package/dist/chunks/studio-v96qfnww.js.map +54 -0
- package/dist/chunks/studio-vcetc91k.js +659 -0
- package/dist/chunks/studio-vcetc91k.js.map +10 -0
- package/dist/chunks/{studio-n9zmpxjg.js → studio-vmymjefp.js} +2972 -4937
- package/dist/chunks/studio-vmymjefp.js.map +98 -0
- package/dist/chunks/{studio-bghqfmea.js → studio-wwseqyw0.js} +2 -2
- package/dist/chunks/studio-x9hmy5kr.js +390 -0
- package/dist/chunks/studio-x9hmy5kr.js.map +10 -0
- package/dist/chunks/studio-xa0ce0n7.js +335 -0
- package/dist/chunks/studio-xa0ce0n7.js.map +10 -0
- package/dist/chunks/studio-xm3dbxvn.js +378 -0
- package/dist/chunks/studio-xm3dbxvn.js.map +19 -0
- package/dist/chunks/{studio-nqw433kv.js → studio-xmvbhg31.js} +2 -2
- package/dist/chunks/studio-zv37yrfa.js +1054 -0
- package/dist/chunks/studio-zv37yrfa.js.map +13 -0
- package/dist/chunks/{ws-client-q7hkz3j9.js → ws-client-654ts66j.js} +6 -4
- package/dist/chunks/ws-client-654ts66j.js.map +11 -0
- package/dist/iframe-entry.js +668 -230
- package/dist/studio.js +23711 -35185
- package/index.html +35 -4685
- package/package.json +17 -15
- package/src/about/about-modal.ts +42 -11
- package/src/browse/library-commands.ts +240 -0
- package/src/browse/library-layouts.ts +369 -0
- package/src/browse/library-model.ts +396 -0
- package/src/browse/library-pane.ts +1049 -0
- package/src/browse/library-preview.ts +252 -0
- package/src/browse/library-source.ts +150 -0
- package/src/canvas/canvas-helpers.ts +33 -9
- package/src/canvas/canvas-live-render.ts +45 -29
- package/src/canvas/canvas-patcher.ts +151 -31
- package/src/canvas/canvas-perf.ts +46 -7
- package/src/canvas/canvas-render.ts +1092 -220
- package/src/canvas/canvas-surface.ts +240 -0
- package/src/canvas/canvas-utils.ts +1166 -124
- package/src/canvas/iframe-drop.ts +2 -1
- package/src/canvas/iframe-entry.ts +241 -4
- package/src/canvas/iframe-host.ts +1226 -143
- package/src/canvas/iframe-inline-edit.ts +31 -0
- package/src/canvas/iframe-interaction.ts +76 -16
- package/src/canvas/iframe-keys.ts +107 -45
- package/src/canvas/iframe-overlay.ts +38 -1
- package/src/canvas/iframe-protocol.ts +137 -2
- package/src/canvas/iframe-render.ts +70 -2
- package/src/canvas/iframe-slash.ts +6 -0
- package/src/canvas/path-mapping.ts +56 -6
- package/src/canvas/surface-registry.ts +292 -0
- package/src/collab/collab-commands.ts +244 -0
- package/src/collab/collab-session.ts +198 -32
- package/src/collab/collab-state.ts +28 -2
- package/src/collab/presence-chips.ts +100 -9
- package/src/commands/active-registry.ts +42 -0
- package/src/commands/app-commands.ts +176 -0
- package/src/commands/budget.ts +158 -0
- package/src/commands/command-args.ts +253 -0
- package/src/commands/context.ts +387 -0
- package/src/commands/defaults.ts +580 -0
- package/src/commands/keymap.ts +571 -0
- package/src/commands/levels.ts +345 -0
- package/src/commands/live-context.ts +193 -0
- package/src/commands/reference.ts +227 -0
- package/src/commands/registry.ts +293 -0
- package/src/component-props.ts +3 -2
- package/src/content/draft-state.ts +106 -0
- package/src/content/entry-commands.ts +282 -0
- package/src/content/entry-editor.ts +327 -0
- package/src/content/entry-fields.ts +116 -0
- package/src/content/entry-model.ts +175 -0
- package/src/editor/canvas-context-menu.ts +17 -11
- package/src/editor/canvas-slash-bridge.ts +11 -4
- package/src/editor/context-menu.ts +804 -204
- package/src/editor/convert-to-component.ts +31 -10
- package/src/editor/convert-to-repeater.ts +3 -2
- package/src/editor/inline-edit-apply.ts +5 -5
- package/src/editor/inline-edit.ts +86 -50
- package/src/editor/insert-zone-action.ts +1 -1
- package/src/editor/shortcuts.ts +1043 -329
- package/src/editor/slash-menu.ts +1 -0
- package/src/files/elements.ts +166 -0
- package/src/files/file-ops.ts +178 -31
- package/src/files/files.ts +898 -268
- package/src/files/fs-events.ts +21 -0
- package/src/files/media-meta.ts +203 -0
- package/src/files/media-paths.ts +141 -0
- package/src/files/media-upload.ts +7 -3
- package/src/files/media-usage.ts +189 -0
- package/src/github/github-auth.ts +235 -33
- package/src/github/github-publish.ts +80 -21
- package/src/grid/grid-controller.ts +152 -12
- package/src/grid/grid-layout.ts +225 -20
- package/src/grid/grid-open.ts +120 -0
- package/src/grid/grid-panel.ts +554 -39
- package/src/grid/grid-source.ts +27 -1
- package/src/grid/redirects-grid.ts +599 -0
- package/src/grid/redirects.ts +398 -0
- package/src/grid/sources/content-source.ts +108 -2
- package/src/i18n/i18n-commands.ts +322 -0
- package/src/new-project/add-repo-modal.ts +8 -10
- package/src/new-project/import-tab.ts +34 -9
- package/src/new-project/location-fields.ts +9 -1
- package/src/new-project/new-project-modal.ts +270 -262
- package/src/packages/jxsuite-update.ts +97 -48
- package/src/packages/pull-package-sync.ts +18 -9
- package/src/page-params.ts +2 -1
- package/src/panels/activity-bar.ts +152 -91
- package/src/panels/activity-panel.ts +481 -0
- package/src/panels/ai-chat/chat-markdown.ts +8 -3
- package/src/panels/ai-chat/chat-view.ts +245 -18
- package/src/panels/ai-chat/composer.ts +31 -5
- package/src/panels/ai-chat/sessions-view.ts +17 -10
- package/src/panels/ai-panel.ts +279 -120
- package/src/panels/block-action-bar.ts +1115 -224
- package/src/panels/bottom-dock.ts +337 -0
- package/src/panels/canvas-dnd-bridge.ts +37 -8
- package/src/panels/chat-panel.ts +29 -12
- package/src/panels/data-explorer.ts +254 -112
- package/src/panels/data-grid.ts +10 -4
- package/src/panels/dnd.ts +28 -51
- package/src/panels/editors.ts +434 -107
- package/src/panels/elements-panel.ts +66 -2
- package/src/panels/empty-state.ts +112 -0
- package/src/panels/events-panel.ts +596 -82
- package/src/panels/formula-workspace.ts +408 -218
- package/src/panels/frontmatter-fields.ts +51 -10
- package/src/panels/frontmatter-panel.ts +357 -79
- package/src/panels/git-panel.ts +375 -164
- package/src/panels/head-panel.ts +791 -85
- package/src/panels/i18n-panel.ts +592 -0
- package/src/panels/imports-panel.ts +95 -85
- package/src/panels/jump-bar.ts +584 -0
- package/src/panels/layers-panel.ts +1106 -328
- package/src/panels/left-panel.ts +109 -204
- package/src/panels/navigator-panels.ts +131 -0
- package/src/panels/overlays.ts +7 -2
- package/src/panels/pane-context.ts +1477 -0
- package/src/panels/pane-grid.ts +406 -0
- package/src/panels/panel-registry.ts +340 -0
- package/src/panels/panel-scheduler.ts +75 -0
- package/src/panels/problems-panel.ts +234 -0
- package/src/panels/properties-panel.ts +946 -1139
- package/src/panels/provenance.ts +258 -0
- package/src/panels/quick-search.ts +791 -122
- package/src/panels/right-panel.ts +228 -102
- package/src/panels/seo-modal.ts +395 -0
- package/src/panels/settings-pane.ts +203 -0
- package/src/panels/signals-panel.ts +354 -137
- package/src/panels/statement-editor.ts +41 -25
- package/src/panels/statusbar.ts +342 -106
- package/src/panels/style-panel.ts +974 -463
- package/src/panels/style-utils.ts +3 -3
- package/src/panels/stylebook-doc.ts +4 -2
- package/src/panels/stylebook-layers-panel.ts +3 -2
- package/src/panels/stylebook-panel.ts +51 -26
- package/src/panels/tab-strip.ts +1058 -78
- package/src/panels/target-line.ts +274 -0
- package/src/panels/toolbar.ts +631 -484
- package/src/panels/welcome-screen.ts +301 -198
- package/src/platform-errors.ts +26 -3
- package/src/platform.ts +96 -2
- package/src/platforms/cloud.ts +71 -8
- package/src/platforms/devserver.ts +92 -29
- package/src/publish/deploy-checklist.ts +383 -0
- package/src/publish/pages-service.ts +10 -1
- package/src/publish/publish-commands.ts +218 -0
- package/src/publish/publish-panel.ts +110 -16
- package/src/recent-projects.ts +3 -2
- package/src/services/a11y-report.ts +505 -0
- package/src/services/ai-models.ts +75 -2
- package/src/services/ai-project-tools.ts +29 -10
- package/src/services/ai-system-prompt.ts +53 -14
- package/src/services/ai-tools.ts +39 -3
- package/src/services/ai-writes.ts +154 -0
- package/src/services/announce.ts +97 -0
- package/src/services/automation.ts +424 -175
- package/src/services/cem-export.ts +9 -4
- package/src/services/clock.ts +61 -0
- package/src/services/document-assistant.ts +36 -8
- package/src/services/idle.ts +179 -0
- package/src/services/import-client.ts +26 -0
- package/src/services/monaco-buffer.ts +627 -0
- package/src/services/monaco-lazy.ts +36 -0
- package/src/services/notify.ts +271 -0
- package/src/services/profile.ts +155 -0
- package/src/services/references.ts +0 -0
- package/src/services/token-lint.ts +3 -2
- package/src/services/tool-executor.ts +53 -7
- package/src/services/trusted-types.ts +123 -0
- package/src/settings/contexts-section.ts +427 -0
- package/src/settings/contributed-section.ts +149 -11
- package/src/settings/css-vars-editor.ts +306 -349
- package/src/settings/defs-editor.ts +93 -34
- package/src/settings/dependencies-editor.ts +7 -7
- package/src/settings/extension-sections.ts +37 -5
- package/src/settings/general-settings.ts +204 -121
- package/src/settings/locales-section.ts +347 -0
- package/src/settings/preferences-accounts.ts +140 -0
- package/src/settings/preferences-dialog.ts +620 -0
- package/src/settings/preferences-keymap.ts +270 -0
- package/src/settings/project-sections.ts +260 -0
- package/src/settings/section-registry.ts +169 -0
- package/src/settings/settings-document.ts +385 -0
- package/src/shell.ts +1549 -0
- package/src/site-context.ts +45 -20
- package/src/state.ts +14 -275
- package/src/store.ts +88 -43
- package/src/studio.ts +790 -346
- package/src/style/live-preview.ts +36 -0
- package/src/style/project-styles.ts +349 -0
- package/src/style/token-ref.ts +123 -0
- package/src/tabs/patch-ops.ts +16 -4
- package/src/tabs/project-config.ts +416 -0
- package/src/tabs/selection.ts +323 -0
- package/src/tabs/tab.ts +182 -47
- package/src/tabs/transact.ts +209 -28
- package/src/types.ts +68 -13
- package/src/ui/ai-credentials-form.ts +39 -35
- package/src/ui/ai-managed-connect.ts +113 -0
- package/src/ui/dynamic-slot.ts +224 -81
- package/src/ui/expression-editor.ts +71 -63
- package/src/ui/field-input.ts +4 -6
- package/src/ui/field-row.ts +215 -38
- package/src/ui/form-controls.ts +194 -7
- package/src/ui/layers.ts +492 -69
- package/src/ui/media-picker.ts +115 -25
- package/src/ui/panel-resize.ts +109 -91
- package/src/ui/progress-modal.ts +131 -50
- package/src/ui/regions.ts +462 -0
- package/src/ui/schema-form.ts +229 -45
- package/src/ui/spectrum.ts +24 -8
- package/src/ui/timing.ts +49 -0
- package/src/ui/value-selector.ts +20 -0
- package/src/ui/value-source.ts +348 -0
- package/src/ui/virtual-window.ts +400 -0
- package/src/utils/edit-display.ts +3 -2
- package/src/utils/inherited-style.ts +67 -37
- package/src/view.ts +64 -78
- package/src/workspace/pane-derive.ts +1258 -0
- package/src/workspace/session.ts +317 -0
- package/src/workspace/workspace.ts +1345 -23
- package/styles/canvas.css +653 -0
- package/styles/forced-colors.css +106 -0
- package/styles/inspector.css +1454 -0
- package/styles/overlays.css +2704 -0
- package/styles/panels.css +1701 -0
- package/styles/shell.css +1423 -0
- package/styles/tokens.css +151 -0
- package/dist/chunks/Overlay.dev-cszx7yn5.js +0 -22
- package/dist/chunks/extension-sections-qct0gt8f.js +0 -531
- package/dist/chunks/extension-sections-qct0gt8f.js.map +0 -12
- package/dist/chunks/files-02zn5y24.js +0 -50
- package/dist/chunks/files-02zn5y24.js.map +0 -9
- package/dist/chunks/git-panel-mbb0y0hz.js +0 -28
- package/dist/chunks/git-panel-mbb0y0hz.js.map +0 -9
- package/dist/chunks/layers-panel-9qekmqk1.js +0 -26
- package/dist/chunks/layers-panel-9qekmqk1.js.map +0 -9
- package/dist/chunks/settings-modal-gj0hrah4.js +0 -29
- package/dist/chunks/settings-modal-gj0hrah4.js.map +0 -9
- package/dist/chunks/sp-overlay.dev-earn5as8.js +0 -17
- package/dist/chunks/sp-overlay.dev-earn5as8.js.map +0 -9
- package/dist/chunks/sp-popover.dev-frxtfejn.js +0 -8
- package/dist/chunks/sp-popover.dev-frxtfejn.js.map +0 -9
- package/dist/chunks/sp-progress-circle.dev-7tvw34h8.js +0 -14
- package/dist/chunks/sp-progress-circle.dev-7tvw34h8.js.map +0 -9
- package/dist/chunks/sp-tooltip.dev-a9fywesm.js +0 -21
- package/dist/chunks/sp-tooltip.dev-a9fywesm.js.map +0 -10
- package/dist/chunks/studio-4k0m4fmp.js.map +0 -13
- package/dist/chunks/studio-568nx4t5.js +0 -469
- package/dist/chunks/studio-568nx4t5.js.map +0 -14
- package/dist/chunks/studio-9smfzqhc.js +0 -19
- package/dist/chunks/studio-9smfzqhc.js.map +0 -10
- package/dist/chunks/studio-asvf0j9e.js +0 -429
- package/dist/chunks/studio-asvf0j9e.js.map +0 -13
- package/dist/chunks/studio-d77qm3pk.js +0 -3427
- package/dist/chunks/studio-d77qm3pk.js.map +0 -26
- package/dist/chunks/studio-j6gqyjf4.js +0 -1854
- package/dist/chunks/studio-j6gqyjf4.js.map +0 -18
- package/dist/chunks/studio-n9zmpxjg.js.map +0 -115
- package/dist/chunks/studio-qkvt37c0.js.map +0 -9
- package/dist/chunks/studio-rq0vxb19.js +0 -3744
- package/dist/chunks/studio-rq0vxb19.js.map +0 -22
- package/dist/chunks/studio-wd6ewdvd.js +0 -853
- package/dist/chunks/studio-wd6ewdvd.js.map +0 -12
- package/dist/chunks/studio-xq0t7n5t.js +0 -140
- package/dist/chunks/studio-xq0t7n5t.js.map +0 -10
- package/dist/chunks/studio-xze4zrs1.js.map +0 -10
- package/dist/chunks/studio-ygzav7z5.js.map +0 -46
- package/dist/chunks/studio-zmy7241e.js +0 -399
- package/dist/chunks/studio-zmy7241e.js.map +0 -12
- package/dist/chunks/ws-client-q7hkz3j9.js.map +0 -11
- package/src/browse/browse-modal.ts +0 -69
- package/src/browse/browse.ts +0 -904
- package/src/canvas/canvas-diff.ts +0 -216
- package/src/canvas/nested-site-style.ts +0 -58
- package/src/new-project/design-fields.ts +0 -264
- package/src/new-project/templates.ts +0 -61
- package/src/panels/tab-bar.ts +0 -548
- package/src/settings/settings-modal.ts +0 -203
- /package/dist/chunks/{adapter-z8fkmbmv.js.map → adapter-qfnesn5v.js.map} +0 -0
- /package/dist/chunks/{cf-settings-mmyv436d.js.map → cf-settings-73sh5z4p.js.map} +0 -0
- /package/dist/chunks/{format-host-2c188n41.js.map → format-host-mkwsmt8d.js.map} +0 -0
- /package/dist/chunks/{jx-validate-qx8degj7.js.map → jx-validate-v6qgknrs.js.map} +0 -0
- /package/dist/chunks/{studio-w7c6kvk7.js.map → studio-a7pzveq1.js.map} +0 -0
- /package/dist/chunks/{studio-hhj92gcr.js.map → studio-s519zc99.js.map} +0 -0
- /package/dist/chunks/{studio-bghqfmea.js.map → studio-wwseqyw0.js.map} +0 -0
- /package/dist/chunks/{studio-nqw433kv.js.map → studio-xmvbhg31.js.map} +0 -0
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `i18n:` family — the four verbs that are NOT a rendering context.
|
|
3
|
+
*
|
|
4
|
+
* Jx has no message catalogue. A translation is a different file in a different directory
|
|
5
|
+
* (`specs/site-architecture.md` §13.3), so "show this page in French" is two unrelated jobs, and
|
|
6
|
+
* conflating them is how a language control comes to change a chip and nothing else:
|
|
7
|
+
*
|
|
8
|
+
* | id | job |
|
|
9
|
+
* | ------------------------ | ----------------------------------------------------------- |
|
|
10
|
+
* | `i18n.openTranslation` | NAVIGATION — open the sibling file for a locale |
|
|
11
|
+
* | `i18n.createTranslation` | create that sibling, seeded from the document it translates |
|
|
12
|
+
* | `i18n.showParity` | reveal the Languages panel |
|
|
13
|
+
* | `i18n.addLocale` | declare a language in `project.json` |
|
|
14
|
+
*
|
|
15
|
+
* `i18n.switchLocale` is the fifth verb and lives in `canvas/canvas-utils.ts` with the per-tab UI
|
|
16
|
+
* state it writes: it changes how the artboard RENDERS — `lang`, `dir` and the injected `$locale` —
|
|
17
|
+
* while the text on screen stays whatever file is open. These four change which file that is, or
|
|
18
|
+
* which languages exist.
|
|
19
|
+
*
|
|
20
|
+
* **`i18n.addLocale` is the one that is not gated on `isMultilingual`.** Gating it would make the
|
|
21
|
+
* first language of a project unreachable by every door except a text editor, which is the state
|
|
22
|
+
* this family exists to end.
|
|
23
|
+
*
|
|
24
|
+
* The locale enums are GETTERS. A command record is built at module scope — `commands/
|
|
25
|
+
* app-commands.ts` builds the whole set before a project is open — so `enumProperty(locales(), …)`
|
|
26
|
+
* would freeze the list at `[]` for the lifetime of the window, a defect this repo has already
|
|
27
|
+
* shipped once (`content/entry-commands.ts` carries the post-mortem).
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
import { getPlatform } from "../platform";
|
|
31
|
+
import { getEffectiveLocales } from "../site-context";
|
|
32
|
+
import { localeLabel, translationPathFor } from "@jxsuite/schema/locale";
|
|
33
|
+
import { notify } from "../services/notify";
|
|
34
|
+
import { setActivityTab } from "../shell";
|
|
35
|
+
import { tabOfPane } from "../canvas/canvas-surface";
|
|
36
|
+
import { activeTab } from "../workspace/workspace";
|
|
37
|
+
import { addProjectLocale } from "../settings/locales-section";
|
|
38
|
+
import { argsSchema, optionalStringArg, stringArg, stringProperty } from "../commands/command-args";
|
|
39
|
+
import type { CommandArgValues } from "../commands/command-args";
|
|
40
|
+
import type { AnyCommand, CommandRegistry } from "../commands/registry";
|
|
41
|
+
import type { Tab } from "../tabs/tab";
|
|
42
|
+
|
|
43
|
+
/** The tags a translation verb may be asked for — the project's declared locales, read live. */
|
|
44
|
+
function declaredLocales(): string[] {
|
|
45
|
+
return getEffectiveLocales()?.locales ?? [];
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* An enum property whose values are derived WHEN THE SCHEMA IS READ, not when the record is built.
|
|
50
|
+
*
|
|
51
|
+
* The getter is the whole difference from `command-args.ts`'s `enumProperty`, and it is invisible
|
|
52
|
+
* in a unit test that builds the record with a project already open — see this module's header.
|
|
53
|
+
*/
|
|
54
|
+
function derivedEnumProperty(declared: () => readonly string[], description: string): object {
|
|
55
|
+
return {
|
|
56
|
+
description,
|
|
57
|
+
get enum() {
|
|
58
|
+
return [...declared()];
|
|
59
|
+
},
|
|
60
|
+
type: "string",
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* The document a translation verb acts on: the named pane's, or the focused one's.
|
|
66
|
+
*
|
|
67
|
+
* `pane` is optional because the palette addresses the focus and the pane's own context bar
|
|
68
|
+
* addresses itself. Refusing by name rather than falling back to the active tab is deliberate: a
|
|
69
|
+
* caller that named a pane meant that pane, and quietly translating a different document is worse
|
|
70
|
+
* than doing nothing.
|
|
71
|
+
*
|
|
72
|
+
* A tab with no `documentPath` is refused here too. Every one of these verbs is a statement about
|
|
73
|
+
* where a file LIVES, and a document that has never been written has no locale directory to be
|
|
74
|
+
* beside.
|
|
75
|
+
*/
|
|
76
|
+
function addressedTab(commandId: string, args: CommandArgValues): Tab & { documentPath: string } {
|
|
77
|
+
const paneId = optionalStringArg(commandId, args, "pane");
|
|
78
|
+
const tab = paneId === undefined ? (activeTab.value as Tab | null) : tabOfPane(paneId);
|
|
79
|
+
if (!tab) {
|
|
80
|
+
throw new RangeError(
|
|
81
|
+
paneId === undefined
|
|
82
|
+
? `command "${commandId}" needs a document open`
|
|
83
|
+
: `command "${commandId}" argument "pane": no document is open in pane "${paneId}"`,
|
|
84
|
+
);
|
|
85
|
+
}
|
|
86
|
+
if (tab.documentPath === null) {
|
|
87
|
+
throw new RangeError(`command "${commandId}" needs a document that has been saved to a file`);
|
|
88
|
+
}
|
|
89
|
+
return tab as Tab & { documentPath: string };
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Where this document's copy in `locale` belongs, or null with the reason already notified.
|
|
94
|
+
*
|
|
95
|
+
* `translationPathFor` answers null for three different situations and the author needs to know
|
|
96
|
+
* which: an undeclared tag, a project with no locales at all, and a path that cannot carry a locale
|
|
97
|
+
* segment (a component, a layout, a file at the project root).
|
|
98
|
+
*/
|
|
99
|
+
function siblingPath(tab: Tab & { documentPath: string }, locale: string): string | null {
|
|
100
|
+
const i18n = getEffectiveLocales();
|
|
101
|
+
const path = translationPathFor(tab.documentPath, locale, i18n);
|
|
102
|
+
if (path !== null) {
|
|
103
|
+
return path;
|
|
104
|
+
}
|
|
105
|
+
if (i18n === null || !i18n.locales.includes(locale)) {
|
|
106
|
+
notify.error(`This project does not declare ${localeLabel(locale)}.`, {
|
|
107
|
+
action: "settings.open",
|
|
108
|
+
detail: "Add it in Settings › Locales, or with the Add Language command.",
|
|
109
|
+
source: "Languages",
|
|
110
|
+
});
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
notify.error(`${tab.documentPath} cannot have a translation.`, {
|
|
114
|
+
detail:
|
|
115
|
+
"A translation is the same file under a locale directory, so only files that live under a " +
|
|
116
|
+
"routed directory — pages and content entries — have one. A layout, a component or a file " +
|
|
117
|
+
"at the project root is shared by every language.",
|
|
118
|
+
path: tab.documentPath,
|
|
119
|
+
source: "Languages",
|
|
120
|
+
});
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/** Whether a path is on disk. The platform has no `exists`, and a read is the honest probe. */
|
|
125
|
+
async function fileExists(path: string): Promise<boolean> {
|
|
126
|
+
try {
|
|
127
|
+
await getPlatform().readFile(path);
|
|
128
|
+
return true;
|
|
129
|
+
} catch {
|
|
130
|
+
// A read that fails is the answer, not an error to report: "no such file" is the whole question
|
|
131
|
+
// And an unreadable file is one the caller cannot open either.
|
|
132
|
+
return false;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/** The four records. */
|
|
137
|
+
export function i18nCommands(): AnyCommand[] {
|
|
138
|
+
return [
|
|
139
|
+
{
|
|
140
|
+
args: argsSchema(
|
|
141
|
+
{
|
|
142
|
+
locale: derivedEnumProperty(
|
|
143
|
+
declaredLocales,
|
|
144
|
+
"The language to open this document's translation in.",
|
|
145
|
+
),
|
|
146
|
+
pane: stringProperty("Pane whose document to translate. Defaults to the focused one."),
|
|
147
|
+
},
|
|
148
|
+
["locale"],
|
|
149
|
+
),
|
|
150
|
+
category: "File",
|
|
151
|
+
id: "i18n.openTranslation",
|
|
152
|
+
level: "document",
|
|
153
|
+
/* `context/tab`, not `context/file`: the subject is the document a tab holds, and
|
|
154
|
+
`commands/levels.ts` admits only `project` verbs onto a file row — a `document`-level
|
|
155
|
+
record declared there is a level × placement violation `check-command-levels.ts` fails on.
|
|
156
|
+
The brief's `context/file` was written against the file row this verb does not act on. */
|
|
157
|
+
menus: ["context/tab", "palette"],
|
|
158
|
+
group: "2_navigate",
|
|
159
|
+
requires: "a document open in a project that declares more than one language",
|
|
160
|
+
when: (ctx) => ctx.project.isMultilingual && ctx.document.open,
|
|
161
|
+
aiTool: {
|
|
162
|
+
description:
|
|
163
|
+
"Open this document's translation in another language — the sibling file under that " +
|
|
164
|
+
"locale's directory. Does not create one; use create_translation for that.",
|
|
165
|
+
name: "open_translation",
|
|
166
|
+
},
|
|
167
|
+
run: async (_ctx, args) => {
|
|
168
|
+
const tab = addressedTab("i18n.openTranslation", args);
|
|
169
|
+
const locale = stringArg("i18n.openTranslation", args, "locale");
|
|
170
|
+
const path = siblingPath(tab, locale);
|
|
171
|
+
if (path === null) {
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
if (path === tab.documentPath) {
|
|
175
|
+
notify.info(`${tab.documentPath} is already the ${localeLabel(locale)} copy.`, {
|
|
176
|
+
source: "Languages",
|
|
177
|
+
});
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
if (!(await fileExists(path))) {
|
|
181
|
+
notify.warn(`There is no ${localeLabel(locale)} translation of this document yet.`, {
|
|
182
|
+
action: "i18n.createTranslation",
|
|
183
|
+
detail: `Create Translation writes ${path}, seeded from the document you are on.`,
|
|
184
|
+
path,
|
|
185
|
+
source: "Languages",
|
|
186
|
+
});
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
const { openFileInTab } = await import("../files/files");
|
|
190
|
+
await openFileInTab(path);
|
|
191
|
+
},
|
|
192
|
+
title: "Open Translation",
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
args: argsSchema({
|
|
196
|
+
locale: derivedEnumProperty(
|
|
197
|
+
declaredLocales,
|
|
198
|
+
"The language to create this document's translation in.",
|
|
199
|
+
),
|
|
200
|
+
}),
|
|
201
|
+
category: "File",
|
|
202
|
+
id: "i18n.createTranslation",
|
|
203
|
+
level: "document",
|
|
204
|
+
menus: ["palette"],
|
|
205
|
+
group: "2_navigate",
|
|
206
|
+
requires: "a document open in a project that declares more than one language",
|
|
207
|
+
when: (ctx) => ctx.project.isMultilingual && ctx.document.open,
|
|
208
|
+
/* The document history cannot hold this: the change is a file that did not exist, and
|
|
209
|
+
`undo: "project"` would claim `project.json` moved, which it did not. */
|
|
210
|
+
undo: "none",
|
|
211
|
+
aiTool: {
|
|
212
|
+
description:
|
|
213
|
+
"Create the missing translation of this document in another language, seeded with a " +
|
|
214
|
+
"copy of the document being translated, and open it.",
|
|
215
|
+
name: "create_translation",
|
|
216
|
+
},
|
|
217
|
+
run: async (_ctx, args) => {
|
|
218
|
+
const tab = addressedTab("i18n.createTranslation", args);
|
|
219
|
+
const locale = stringArg("i18n.createTranslation", args, "locale");
|
|
220
|
+
const path = siblingPath(tab, locale);
|
|
221
|
+
if (path === null) {
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
if (await fileExists(path)) {
|
|
225
|
+
notify.info(`The ${localeLabel(locale)} translation already exists.`, {
|
|
226
|
+
action: "i18n.openTranslation",
|
|
227
|
+
path,
|
|
228
|
+
source: "Languages",
|
|
229
|
+
});
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
/* SEEDED FROM DISK, not from the open document. What is on screen may hold unsaved edits
|
|
233
|
+
and an in-memory tree would have to be re-serialized by whichever format owns the file —
|
|
234
|
+
a second serializer for the same bytes. The file the author is translating is the file
|
|
235
|
+
they saved. */
|
|
236
|
+
let content: string;
|
|
237
|
+
try {
|
|
238
|
+
content = await getPlatform().readFile(tab.documentPath);
|
|
239
|
+
} catch {
|
|
240
|
+
// An unreadable source is not a translation that can be seeded, and the path says which.
|
|
241
|
+
notify.error(`Could not read ${tab.documentPath} to copy it.`, {
|
|
242
|
+
path: tab.documentPath,
|
|
243
|
+
source: "Languages",
|
|
244
|
+
});
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
const cut = path.lastIndexOf("/");
|
|
248
|
+
const { createFileIn, openFileInTab } = await import("../files/files");
|
|
249
|
+
const created = await createFileIn({
|
|
250
|
+
content,
|
|
251
|
+
dir: cut === -1 ? "." : path.slice(0, cut),
|
|
252
|
+
source: "Languages",
|
|
253
|
+
suggestedName: path.slice(cut + 1),
|
|
254
|
+
title: `New ${localeLabel(locale)} translation`,
|
|
255
|
+
});
|
|
256
|
+
if (created !== null) {
|
|
257
|
+
await openFileInTab(created);
|
|
258
|
+
}
|
|
259
|
+
},
|
|
260
|
+
title: "Create Translation",
|
|
261
|
+
},
|
|
262
|
+
{
|
|
263
|
+
category: "View",
|
|
264
|
+
id: "i18n.showParity",
|
|
265
|
+
level: "project",
|
|
266
|
+
menus: ["commandbar/overflow", "palette"],
|
|
267
|
+
group: "2_view",
|
|
268
|
+
requires: "a project that declares more than one language",
|
|
269
|
+
when: (ctx) => ctx.project.isMultilingual,
|
|
270
|
+
aiTool: {
|
|
271
|
+
description:
|
|
272
|
+
"Show the Languages panel — every page in the project against every declared language, " +
|
|
273
|
+
"and which translations are missing or older than their source.",
|
|
274
|
+
name: "show_translation_parity",
|
|
275
|
+
},
|
|
276
|
+
/* The panel is off the rail — it spends no rail slot and shifts no ⌘1-8 chord — so this
|
|
277
|
+
command and the generated `panel.focus.i18n` are its only two doors, and both open the
|
|
278
|
+
same one. The TITLES must differ even though the behaviour does not: the palette is a flat
|
|
279
|
+
searchable list where "View: Show Languages" twice is two rows a reader cannot choose
|
|
280
|
+
between. This one is named for what the panel SAYS (which pages are translated and which
|
|
281
|
+
are stale); `panel.focus.i18n` is named for the panel. */
|
|
282
|
+
run: () => {
|
|
283
|
+
setActivityTab("i18n");
|
|
284
|
+
},
|
|
285
|
+
title: "Show Translation Parity",
|
|
286
|
+
},
|
|
287
|
+
{
|
|
288
|
+
args: argsSchema({
|
|
289
|
+
locale: stringProperty(
|
|
290
|
+
"A BCP 47 language tag to declare — `fr`, `pt-BR`, `zh-Hant`. Canonicalized on the way " +
|
|
291
|
+
"in; a malformed tag is refused rather than written.",
|
|
292
|
+
),
|
|
293
|
+
}),
|
|
294
|
+
category: "Project",
|
|
295
|
+
id: "i18n.addLocale",
|
|
296
|
+
level: "project",
|
|
297
|
+
menus: ["palette"],
|
|
298
|
+
group: "7_settings",
|
|
299
|
+
/* THE ONE RECORD HERE THAT IS NOT GATED ON `isMultilingual`, and the reason the gate is
|
|
300
|
+
spelled out at each record rather than applied to the family: a project declaring zero or
|
|
301
|
+
one language is exactly the project that needs this verb. */
|
|
302
|
+
requires: "an open project",
|
|
303
|
+
when: (ctx) => ctx.project.open,
|
|
304
|
+
undo: "project",
|
|
305
|
+
aiTool: {
|
|
306
|
+
description:
|
|
307
|
+
"Declare a language for this project, adding it to project.json's i18n.locales. Every " +
|
|
308
|
+
"other language surface reads that list.",
|
|
309
|
+
name: "add_project_locale",
|
|
310
|
+
},
|
|
311
|
+
run: async (_ctx, args) => {
|
|
312
|
+
await addProjectLocale(stringArg("i18n.addLocale", args, "locale"));
|
|
313
|
+
},
|
|
314
|
+
title: "Add Language",
|
|
315
|
+
},
|
|
316
|
+
];
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
/** Register the `i18n:` family. */
|
|
320
|
+
export function registerI18nCommands(registry: CommandRegistry): void {
|
|
321
|
+
registry.registerAll(i18nCommands());
|
|
322
|
+
}
|
|
@@ -177,7 +177,9 @@ function repoRowTpl(repo: RepoInfo) {
|
|
|
177
177
|
class="add-repo-row"
|
|
178
178
|
?disabled=${Boolean(_importing)}
|
|
179
179
|
title=${repo.fullName}
|
|
180
|
-
@click=${() =>
|
|
180
|
+
@click=${() => {
|
|
181
|
+
void chooseRepo(repo);
|
|
182
|
+
}}
|
|
181
183
|
>
|
|
182
184
|
<span class="add-repo-name">${repo.fullName}</span>
|
|
183
185
|
<span class="add-repo-meta">
|
|
@@ -290,14 +292,7 @@ function accessTpl() {
|
|
|
290
292
|
function renderModal() {
|
|
291
293
|
const tpl = html`
|
|
292
294
|
<sp-underlay open @close=${closeAddRepoModal}></sp-underlay>
|
|
293
|
-
<div
|
|
294
|
-
class="new-project-modal add-repo-modal"
|
|
295
|
-
@keydown=${(e: KeyboardEvent) => {
|
|
296
|
-
if (e.key === "Escape") {
|
|
297
|
-
closeAddRepoModal();
|
|
298
|
-
}
|
|
299
|
-
}}
|
|
300
|
-
>
|
|
295
|
+
<div class="new-project-modal add-repo-modal">
|
|
301
296
|
<div class="new-project-modal-header">
|
|
302
297
|
<h2 class="new-project-modal-title">
|
|
303
298
|
${_mode === "open" ? "Open Project" : "Add existing repository"}
|
|
@@ -324,6 +319,9 @@ function renderModal() {
|
|
|
324
319
|
if (_handle) {
|
|
325
320
|
_handle.update(tpl);
|
|
326
321
|
} else {
|
|
327
|
-
_handle = openModal(tpl
|
|
322
|
+
_handle = openModal(tpl, {
|
|
323
|
+
label: _mode === "open" ? "Open Project" : "Add existing repository",
|
|
324
|
+
onDismiss: closeAddRepoModal,
|
|
325
|
+
});
|
|
328
326
|
}
|
|
329
327
|
}
|
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* The New Project modal's Import source step: an AI-guided clone of an existing site. Gated behind
|
|
3
|
-
* the AI credentials form
|
|
4
|
-
*
|
|
5
|
-
*
|
|
3
|
+
* the AI credentials gate (key form + the keyless Cloudflare option) until AI is usable — a local
|
|
4
|
+
* key, or a backend holding its own; otherwise a URL + crawl-options form. The name/directory
|
|
5
|
+
* parameters live on the modal's shared Parameters step; the running pipeline streams its progress
|
|
6
|
+
* into a log here and resolves the modal with the imported project.
|
|
6
7
|
*/
|
|
7
8
|
|
|
8
9
|
import { html } from "lit-html";
|
|
9
10
|
import { getPlatform } from "../platform";
|
|
10
|
-
import { getBaseUrl, getModel, getOpenAiKey
|
|
11
|
+
import { getBaseUrl, getModel, getOpenAiKey } from "../services/ai-settings";
|
|
12
|
+
import { IMPORT_WARNING_PHASE } from "../services/import-client";
|
|
13
|
+
import { notify } from "../services/notify";
|
|
11
14
|
import { errorMessage } from "@jxsuite/schema/parse";
|
|
12
15
|
import { destinationPath } from "./location-fields";
|
|
13
16
|
import type { TemplateResult } from "lit-html";
|
|
@@ -20,6 +23,12 @@ export interface CredsFormLike {
|
|
|
20
23
|
startEdit: () => void;
|
|
21
24
|
}
|
|
22
25
|
|
|
26
|
+
/** Structural view of src/ui/ai-managed-connect's controller (the keyless option beside the form). */
|
|
27
|
+
export interface ManagedConnectLike {
|
|
28
|
+
canOffer: () => boolean;
|
|
29
|
+
render: () => unknown;
|
|
30
|
+
}
|
|
31
|
+
|
|
23
32
|
export interface ImportTabCtx {
|
|
24
33
|
/** The modal's shared name/directory state (the import destination slug). */
|
|
25
34
|
form: { name: string; directory: string };
|
|
@@ -32,8 +41,15 @@ export interface ImportTabCtx {
|
|
|
32
41
|
rerender: () => void;
|
|
33
42
|
/** Called with the imported project; the modal resolves and closes. */
|
|
34
43
|
onDone: (result: { root: string; config: ProjectConfig }) => void;
|
|
35
|
-
/** The modal's shared credentials-form instance, rendered while
|
|
44
|
+
/** The modal's shared credentials-form instance, rendered while the gate is closed. */
|
|
36
45
|
credsForm: CredsFormLike;
|
|
46
|
+
/**
|
|
47
|
+
* Whether AI is usable — a local key OR a backend holding credentials of its own. Also fires the
|
|
48
|
+
* capability probe while closed, so a managed platform's Cloudflare option can appear.
|
|
49
|
+
*/
|
|
50
|
+
aiGateOpen: () => boolean;
|
|
51
|
+
/** The modal's shared keyless "Connect Cloudflare" controller, rendered beside the form. */
|
|
52
|
+
managedConnect: ManagedConnectLike;
|
|
37
53
|
}
|
|
38
54
|
|
|
39
55
|
let _url = "";
|
|
@@ -147,6 +163,11 @@ export async function startImport(ctx: ImportTabCtx) {
|
|
|
147
163
|
},
|
|
148
164
|
(evt) => {
|
|
149
165
|
_log = [..._log, evt];
|
|
166
|
+
// The log is destroyed the moment a successful import hands off, so the one line the client
|
|
167
|
+
// Emits about lines it could not read is re-posted where it will outlive that.
|
|
168
|
+
if (evt.phase === IMPORT_WARNING_PHASE) {
|
|
169
|
+
notify.warn(evt.message);
|
|
170
|
+
}
|
|
150
171
|
ctx.rerender();
|
|
151
172
|
requestAnimationFrame(() => {
|
|
152
173
|
const el = document.querySelector(".new-project-import-log");
|
|
@@ -253,13 +274,17 @@ export function renderImportStatus(): TemplateResult {
|
|
|
253
274
|
}
|
|
254
275
|
|
|
255
276
|
export function renderImportSource(ctx: ImportTabCtx): TemplateResult {
|
|
256
|
-
if (!
|
|
277
|
+
if (!ctx.aiGateOpen()) {
|
|
257
278
|
return html`
|
|
258
279
|
<div class="new-project-tab-intro">
|
|
259
|
-
Importing uses an AI-guided pipeline to clone an existing site.
|
|
260
|
-
|
|
280
|
+
Importing uses an AI-guided pipeline to clone an existing site.
|
|
281
|
+
${
|
|
282
|
+
ctx.managedConnect.canOffer()
|
|
283
|
+
? "Connect Cloudflare, or add an OpenAI-compatible API key, to continue."
|
|
284
|
+
: "Add an OpenAI-compatible API key to continue."
|
|
285
|
+
}
|
|
261
286
|
</div>
|
|
262
|
-
<div class="new-project-creds">${ctx.credsForm.render()}</div>
|
|
287
|
+
<div class="new-project-creds">${ctx.managedConnect.render()} ${ctx.credsForm.render()}</div>
|
|
263
288
|
`;
|
|
264
289
|
}
|
|
265
290
|
|
|
@@ -229,7 +229,15 @@ function pathFieldsTpl(ctx: {
|
|
|
229
229
|
${
|
|
230
230
|
platform.pickDirectory
|
|
231
231
|
? html`
|
|
232
|
-
<sp-button
|
|
232
|
+
<sp-button
|
|
233
|
+
variant="secondary"
|
|
234
|
+
?disabled=${_browsing}
|
|
235
|
+
@click=${() => {
|
|
236
|
+
// `void`, as a STATEMENT: `browse()` is async and nothing here awaits it, so
|
|
237
|
+
// Dropping the marker turns a deliberate discard into a floating promise.
|
|
238
|
+
void browse();
|
|
239
|
+
}}
|
|
240
|
+
>
|
|
233
241
|
${_browsing ? "Choosing…" : "Browse…"}
|
|
234
242
|
</sp-button>
|
|
235
243
|
`
|