@jxsuite/studio 10.1.0 → 10.3.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/dist/chunks/{2020-mkb0qa6p.js → 2020-906vx2dq.js} +3 -3
- package/dist/chunks/adapter-hnvad61x.js +4 -0
- package/dist/chunks/add-new-flow-3tkn72ey.js +4 -0
- package/dist/chunks/cf-account-picker-xb8vvt2h.js +4 -0
- package/dist/chunks/cf-settings-mkbcz4z2.js +4 -0
- package/dist/chunks/components-w5zqwva1.js +4 -0
- package/dist/chunks/content-source-1vzxq1ba.js +4 -0
- package/dist/chunks/convert-to-repeater-gwzh9gar.js +4 -0
- package/dist/chunks/editor-wvf5e6j9.js +4 -0
- package/dist/chunks/entry-commands-mx2whrjx.js +4 -0
- package/dist/chunks/extension-sections-338ee35t.js +4 -0
- package/dist/chunks/file-ops-9bxvk59j.js +4 -0
- package/dist/chunks/files-t07yqqej.js +4 -0
- package/dist/chunks/format-host-5ja5gxyk.js +4 -0
- package/dist/chunks/fs-events-3424ezp3.js +4 -0
- package/dist/chunks/grid-open-1mpq9mzb.js +4 -0
- package/dist/chunks/{grid-view-r22jsqht.js → grid-view-w9nfy203.js} +15 -15
- package/dist/chunks/icons-gb967qc8.js +4 -0
- package/dist/chunks/iframe-host-wsg0bn73.js +4 -0
- package/dist/chunks/image-bake-4afr4y6a.js +4 -0
- package/dist/chunks/image-editor-x7t8jbjn.js +4 -0
- package/dist/chunks/index-f9qr7kzh.js +4 -0
- package/dist/chunks/{index-pxwwf00y.js → index-yjrfeks8.js} +3 -3
- package/dist/chunks/{javascript-pzqryby6.js → javascript-hy2mws8v.js} +3 -3
- package/dist/chunks/{jsonMode-tcnyxyap.js → jsonMode-vj30te2h.js} +6 -6
- package/dist/chunks/jx-validate-ttr5ewf0.js +4 -0
- package/dist/chunks/layers-m49nmwvx.js +4 -0
- package/dist/chunks/layers-panel-hvy2e549.js +4 -0
- package/dist/chunks/lit-html-k2mb9k0r.js +4 -0
- package/dist/chunks/media-library-ae67q4at.js +4 -0
- package/dist/chunks/media-open-yp9jm834.js +4 -0
- package/dist/chunks/media-picker-s41ngdfr.js +4 -0
- package/dist/chunks/{monaco-binding-bqpge64f.js → monaco-binding-a51py33c.js} +3 -3
- package/dist/chunks/monaco-buffer-pa0g6ax7.js +4 -0
- package/dist/chunks/{monaco-setup-1mkab762.js → monaco-setup-g9kterhx.js} +3 -3
- package/dist/chunks/notify-bwehrp7q.js +4 -0
- package/dist/chunks/parse-hee7ne9b.js +4 -0
- package/dist/chunks/platform-kv0k65cy.js +4 -0
- package/dist/chunks/publish-panel-gzfxcm0t.js +4 -0
- package/dist/chunks/publish-quick-w3nxd7q4.js +4 -0
- package/dist/chunks/publish-workspace-dppd82tc.js +4 -0
- package/dist/chunks/quick-search-tdxaam55.js +4 -0
- package/dist/chunks/references-vqyr5s9x.js +4 -0
- package/dist/chunks/right-panel-0yrw4cgz.js +4 -0
- package/dist/chunks/source-control-6fk72me2.js +4 -0
- package/dist/chunks/{studio-0g2sm01j.js → studio-0939t1q1.js} +4 -4
- package/dist/chunks/studio-0gvvqj3h.js +5 -0
- package/dist/chunks/studio-0khd8xtx.js +4 -0
- package/dist/chunks/{studio-rf8d6p9f.js → studio-0w3541dg.js} +6 -6
- package/dist/chunks/{studio-9b7177jq.js → studio-0x6f3nk9.js} +4 -4
- package/dist/chunks/studio-1410q5dw.js +5 -0
- package/dist/chunks/{studio-8qejv8yf.js → studio-15hwqgd8.js} +4 -4
- package/dist/chunks/studio-1ks5d9y4.js +5 -0
- package/dist/chunks/{studio-881z1xrx.js → studio-2ggfzrrd.js} +4 -4
- package/dist/chunks/{studio-jw0q5j6k.js → studio-321ym1tt.js} +4 -4
- package/dist/chunks/studio-3c10v2q1.js +5 -0
- package/dist/chunks/{studio-9rcbvksg.js → studio-3na1r48j.js} +8 -8
- package/dist/chunks/{studio-ggm7zf70.js → studio-3q7mhbgx.js} +5 -5
- package/dist/chunks/studio-3qr08sxq.js +4 -0
- package/dist/chunks/studio-3xk9zdgb.js +5 -0
- package/dist/chunks/studio-423tfdte.js +5 -0
- package/dist/chunks/{studio-brdp85q7.js → studio-45mj4jqe.js} +4 -4
- package/dist/chunks/studio-4f7thq0p.js +5 -0
- package/dist/chunks/{studio-w67vfgy5.js → studio-4fnb5648.js} +4 -4
- package/dist/chunks/studio-4zd6an2b.js +5 -0
- package/dist/chunks/studio-53wy9ek3.js +5 -0
- package/dist/chunks/studio-5n193zqd.js +5 -0
- package/dist/chunks/{studio-x2metr13.js → studio-5tet77de.js} +3 -3
- package/dist/chunks/studio-7rrdbvex.js +5 -0
- package/dist/chunks/studio-8kx6m0rg.js +5 -0
- package/dist/chunks/{studio-va0e63sk.js → studio-90zkgne5.js} +7 -7
- package/dist/chunks/studio-9c6cbq2c.js +4 -0
- package/dist/chunks/studio-9dq7rwc7.js +5 -0
- package/dist/chunks/studio-9qx1ywbv.js +9 -0
- package/dist/chunks/studio-a65kbs2e.js +9 -0
- package/dist/chunks/studio-aam8zt8z.js +5 -0
- package/dist/chunks/{studio-8jb31dcf.js → studio-abh9kfdh.js} +4 -4
- package/dist/chunks/studio-b4e0ftkt.js +5 -0
- package/dist/chunks/studio-b68k0z00.js +5 -0
- package/dist/chunks/{studio-dy2xtt7a.js → studio-bct64zmj.js} +4 -4
- package/dist/chunks/studio-bz0b5brj.js +6 -0
- package/dist/chunks/studio-cfnn70h1.js +5 -0
- package/dist/chunks/studio-daksw8kh.js +5 -0
- package/dist/chunks/{studio-mwnmzx7g.js → studio-e7vjyp04.js} +7 -7
- package/dist/chunks/studio-ea6r1zyr.js +5 -0
- package/dist/chunks/studio-egnjpyde.js +9 -0
- package/dist/chunks/studio-ejrypvmq.js +5 -0
- package/dist/chunks/studio-eqcddvc2.js +928 -0
- package/dist/chunks/studio-f8tyeyzt.js +5 -0
- package/dist/chunks/studio-fj6c905s.js +5 -0
- package/dist/chunks/{studio-hsr3k06v.js → studio-fkrr7kgg.js} +5 -5
- package/dist/chunks/studio-fspe7m9t.js +5 -0
- package/dist/chunks/{studio-4zqfw5ha.js → studio-g0hxtcga.js} +4 -4
- package/dist/chunks/studio-g9brbewz.js +5 -0
- package/dist/chunks/studio-ggx3j7nd.js +5 -0
- package/dist/chunks/{studio-jh6t5qz4.js → studio-hfxttkyr.js} +4 -4
- package/dist/chunks/studio-hh394phe.js +5 -0
- package/dist/chunks/{studio-07k0geap.js → studio-j0zf5x2x.js} +4 -4
- package/dist/chunks/studio-jeb7hth3.js +5 -0
- package/dist/chunks/studio-k0xzrse2.js +64 -0
- package/dist/chunks/studio-k1xqrgm5.js +5 -0
- package/dist/chunks/studio-k2evngrj.js +7 -0
- package/dist/chunks/studio-k3we3kqb.js +5 -0
- package/dist/chunks/{studio-nf0pqpbj.js → studio-n9qba0gx.js} +4 -4
- package/dist/chunks/studio-nf8esxxc.js +5 -0
- package/dist/chunks/studio-nn4f9m9c.js +5 -0
- package/dist/chunks/studio-nskxe9q1.js +6 -0
- package/dist/chunks/{studio-4nkm4404.js → studio-nvcn2ykc.js} +4 -4
- package/dist/chunks/studio-nwynxqtb.js +5 -0
- package/dist/chunks/{studio-f2j9et3h.js → studio-nzemfbkk.js} +8 -8
- package/dist/chunks/studio-p2a03pgm.js +5 -0
- package/dist/chunks/{studio-skynbac3.js → studio-pm17wdc4.js} +4 -4
- package/dist/chunks/{studio-9cp96v90.js → studio-q80fg1d6.js} +7 -7
- package/dist/chunks/studio-r050sez0.js +6 -0
- package/dist/chunks/{studio-sd07xva5.js → studio-s7t4vp1d.js} +5 -5
- package/dist/chunks/studio-s9fng7m8.js +7 -0
- package/dist/chunks/studio-sce30r7b.js +4 -0
- package/dist/chunks/{studio-zxm98z2m.js → studio-stahswgb.js} +6 -6
- package/dist/chunks/studio-swedpd82.js +5 -0
- package/dist/chunks/studio-thz5t120.js +5 -0
- package/dist/chunks/studio-tpxcryf2.js +5 -0
- package/dist/chunks/{studio-tpy3rdxn.js → studio-v5wktj6f.js} +4 -4
- package/dist/chunks/{studio-7vb997ff.js → studio-vpevkfxw.js} +4 -4
- package/dist/chunks/studio-waekn290.js +5 -0
- package/dist/chunks/studio-wfct4h6n.js +5 -0
- package/dist/chunks/studio-wgc54sxf.js +5 -0
- package/dist/chunks/studio-wqfaqw4m.js +5 -0
- package/dist/chunks/studio-wse1rs8t.js +7 -0
- package/dist/chunks/studio-x0gsfr1d.js +16 -0
- package/dist/chunks/studio-xpx91fby.js +6 -0
- package/dist/chunks/studio-y1b86ast.js +5 -0
- package/dist/chunks/studio-yrcrncev.js +5 -0
- package/dist/chunks/{studio-zacvfm31.js → studio-yzpskb0j.js} +4 -4
- package/dist/chunks/studio-zfdbmhp3.js +5 -0
- package/dist/chunks/{tsMode-6vwhy6ty.js → tsMode-jg1dtphj.js} +7 -7
- package/dist/chunks/workspace-9btkc8tk.js +4 -0
- package/dist/chunks/workspace-home-qcc4z5ag.js +4 -0
- package/dist/chunks/{ws-client-zcxkfgmf.js → ws-client-arz2qsy9.js} +3 -3
- package/dist/iframe-entry.js +13 -13
- package/dist/manifest.json +83 -77
- package/dist/studio.js +74 -75
- package/package.json +5 -5
- package/src/browse/library-model.ts +56 -23
- package/src/browse/library-pane.ts +44 -29
- package/src/browse/library-preview.ts +6 -2
- package/src/canvas/asset-refs.ts +13 -4
- package/src/canvas/asset-resolve.ts +54 -11
- package/src/canvas/canvas-render.ts +25 -0
- package/src/canvas/iframe-entry.ts +5 -1
- package/src/canvas/iframe-host.ts +16 -6
- package/src/canvas/iframe-protocol.ts +9 -1
- package/src/commands/context.ts +6 -0
- package/src/commands/live-context.ts +5 -2
- package/src/editor/shortcuts.ts +6 -0
- package/src/files/asset-versions.ts +108 -2
- package/src/files/file-ops.ts +11 -1
- package/src/files/files.ts +111 -48
- package/src/files/media-paths.ts +12 -4
- package/src/files/media-upload.ts +195 -21
- package/src/files/new-file-name.ts +39 -1
- package/src/media/image-bake.ts +164 -0
- package/src/media/image-editor.ts +846 -0
- package/src/media/image-format.ts +262 -0
- package/src/media/image-recipe.ts +651 -0
- package/src/media/media-commands.ts +65 -1
- package/src/media/media-library-model.ts +1 -1
- package/src/media/media-library.ts +175 -15
- package/src/media/media-open.ts +156 -3
- package/src/media/media-pane.ts +8 -4
- package/src/panels/data-grid.ts +0 -4
- package/src/panels/pane-context.ts +6 -1
- package/src/panels/settings-menu.ts +3 -3
- package/src/panels/settings-pane.ts +42 -56
- package/src/panels/tab-strip.ts +12 -3
- package/src/services/ai-import-tools.ts +6 -3
- package/src/services/ai-models.ts +65 -11
- package/src/services/ai-settings.ts +45 -5
- package/src/services/document-assistant.ts +5 -2
- package/src/services/settings/definitions.ts +19 -0
- package/src/settings/contributed-section.ts +16 -7
- package/src/settings/css-vars-editor.ts +4 -4
- package/src/settings/general-settings.ts +1 -4
- package/src/settings/preferences-accounts.ts +2 -2
- package/src/settings/preferences-dialog.ts +4 -2
- package/src/settings/project-sections.ts +1 -1
- package/src/settings/section-registry.ts +5 -4
- package/src/settings/settings-document.ts +33 -24
- package/src/settings/settings-workspace.ts +205 -0
- package/src/shell.ts +31 -6
- package/src/studio.ts +13 -2
- package/src/surfaces/ai-credentials-form.json +59 -5
- package/src/surfaces/ai-credentials-form.ts +15 -2
- package/src/surfaces/commandbar.ts +7 -3
- package/src/surfaces/image-editor.json +1390 -0
- package/src/surfaces/image-editor.ts +272 -0
- package/src/surfaces/media-library.json +129 -1
- package/src/surfaces/media-library.ts +17 -2
- package/src/surfaces/settings-contributed.json +4 -4
- package/src/surfaces/settings-contributed.ts +2 -2
- package/src/surfaces/settings-pane.json +262 -180
- package/src/surfaces/settings-pane.ts +63 -14
- package/src/types.ts +2 -1
- package/src/ui/ai-credentials-form.ts +128 -11
- package/src/ui/regions.ts +5 -5
- package/src/workspace/tab-workspace.ts +5 -3
- package/src/workspace/workspace-home.ts +18 -4
- package/src/workspace/workspace-ids.ts +40 -7
- package/src/workspace/workspace-switch.ts +3 -1
- package/src/workspace/workspace.ts +22 -1
- package/dist/chunks/adapter-xcpsmecx.js +0 -4
- package/dist/chunks/add-new-flow-ptmhmzr9.js +0 -4
- package/dist/chunks/cf-account-picker-z1sgwpwd.js +0 -4
- package/dist/chunks/cf-settings-xqvhxxe9.js +0 -4
- package/dist/chunks/components-whsc81a7.js +0 -4
- package/dist/chunks/content-source-jwtxg78w.js +0 -4
- package/dist/chunks/convert-to-repeater-f92ey3kp.js +0 -4
- package/dist/chunks/editor-zdqdpq1x.js +0 -4
- package/dist/chunks/entry-commands-w8p2fbpt.js +0 -4
- package/dist/chunks/extension-sections-y2p1te2r.js +0 -4
- package/dist/chunks/file-ops-13ab4swj.js +0 -4
- package/dist/chunks/files-zbc8p6v1.js +0 -4
- package/dist/chunks/format-host-zjsbktbx.js +0 -4
- package/dist/chunks/fs-events-t6x0hch6.js +0 -4
- package/dist/chunks/grid-open-fyzdwpkh.js +0 -4
- package/dist/chunks/icons-853n6qt3.js +0 -4
- package/dist/chunks/iframe-host-kbyqc7pt.js +0 -4
- package/dist/chunks/index-6nvj89vb.js +0 -4
- package/dist/chunks/jx-validate-5sp8a4rm.js +0 -4
- package/dist/chunks/layers-panel-qrxj9vr2.js +0 -4
- package/dist/chunks/layers-tpzayggx.js +0 -4
- package/dist/chunks/lit-html-x6nrxsx3.js +0 -4
- package/dist/chunks/media-library-ywppnjrz.js +0 -4
- package/dist/chunks/media-picker-etxgc8qq.js +0 -4
- package/dist/chunks/monaco-buffer-qrnqhk0b.js +0 -4
- package/dist/chunks/notify-kcv38wwe.js +0 -4
- package/dist/chunks/parse-df2kkmhc.js +0 -4
- package/dist/chunks/platform-dtsysmyd.js +0 -4
- package/dist/chunks/publish-panel-evb1rcxt.js +0 -4
- package/dist/chunks/publish-quick-m9vkhahq.js +0 -4
- package/dist/chunks/publish-workspace-ktk9h536.js +0 -4
- package/dist/chunks/quick-search-2f47fxcw.js +0 -4
- package/dist/chunks/references-5w6ajjv7.js +0 -4
- package/dist/chunks/right-panel-kz0a6byf.js +0 -4
- package/dist/chunks/source-control-1phx90zk.js +0 -4
- package/dist/chunks/studio-0hr000ba.js +0 -5
- package/dist/chunks/studio-1wyp7dt5.js +0 -5
- package/dist/chunks/studio-20ap8dds.js +0 -5
- package/dist/chunks/studio-291gqh98.js +0 -5
- package/dist/chunks/studio-37twdaf7.js +0 -64
- package/dist/chunks/studio-4smcnv33.js +0 -5
- package/dist/chunks/studio-56egy6vf.js +0 -5
- package/dist/chunks/studio-5dmgmyw4.js +0 -5
- package/dist/chunks/studio-5e7p1vgd.js +0 -5
- package/dist/chunks/studio-5m0w815d.js +0 -5
- package/dist/chunks/studio-695k95bw.js +0 -5
- package/dist/chunks/studio-6vwvshw8.js +0 -6
- package/dist/chunks/studio-732mw0g8.js +0 -5
- package/dist/chunks/studio-76t560kn.js +0 -6
- package/dist/chunks/studio-7823f0g8.js +0 -5
- package/dist/chunks/studio-8486jn4r.js +0 -5
- package/dist/chunks/studio-848rk4p1.js +0 -5
- package/dist/chunks/studio-8x8616xd.js +0 -5
- package/dist/chunks/studio-a3s6frde.js +0 -4
- package/dist/chunks/studio-ahf3cspq.js +0 -4
- package/dist/chunks/studio-bkmv1h3e.js +0 -9
- package/dist/chunks/studio-cgb97rwv.js +0 -5
- package/dist/chunks/studio-ch8gt8vt.js +0 -5
- package/dist/chunks/studio-cqf1k4qk.js +0 -5
- package/dist/chunks/studio-cvz0e00f.js +0 -5
- package/dist/chunks/studio-dbgv4fv9.js +0 -16
- package/dist/chunks/studio-eesyjg7h.js +0 -9
- package/dist/chunks/studio-et6t8g4m.js +0 -4
- package/dist/chunks/studio-fep7hr66.js +0 -7
- package/dist/chunks/studio-fyf7j57j.js +0 -5
- package/dist/chunks/studio-g5prntab.js +0 -5
- package/dist/chunks/studio-ga77mf07.js +0 -5
- package/dist/chunks/studio-h7gy12h2.js +0 -5
- package/dist/chunks/studio-j933k8nr.js +0 -5
- package/dist/chunks/studio-jgbvqcgh.js +0 -5
- package/dist/chunks/studio-k4xc5g6h.js +0 -5
- package/dist/chunks/studio-p0nf2e1f.js +0 -6
- package/dist/chunks/studio-pd9dsqpq.js +0 -5
- package/dist/chunks/studio-pmzg17fj.js +0 -5
- package/dist/chunks/studio-pzfa2vmb.js +0 -5
- package/dist/chunks/studio-qyb5bebs.js +0 -9
- package/dist/chunks/studio-rt498t2v.js +0 -5
- package/dist/chunks/studio-s0fg2wav.js +0 -5
- package/dist/chunks/studio-t3j8htp7.js +0 -7
- package/dist/chunks/studio-thj81e98.js +0 -7
- package/dist/chunks/studio-tyw7tk0x.js +0 -5
- package/dist/chunks/studio-vcz63n42.js +0 -5
- package/dist/chunks/studio-vffwe9k7.js +0 -5
- package/dist/chunks/studio-vjhej0w5.js +0 -928
- package/dist/chunks/studio-vxjap704.js +0 -5
- package/dist/chunks/studio-xebavr9s.js +0 -5
- package/dist/chunks/studio-yg5n49za.js +0 -5
- package/dist/chunks/studio-yhz5b313.js +0 -5
- package/dist/chunks/studio-zsjpsw08.js +0 -5
- package/dist/chunks/workspace-d65bz1qk.js +0 -4
- package/dist/chunks/workspace-home-vbg9b3jh.js +0 -4
- package/src/settings/settings-dialog.ts +0 -192
- package/src/surfaces/settings-dialog.json +0 -51
- package/src/surfaces/settings-dialog.ts +0 -169
package/src/studio.ts
CHANGED
|
@@ -212,6 +212,7 @@ import { setProjectAdopter } from "./services/project-adoption";
|
|
|
212
212
|
import { setImportHandoff } from "./services/import-seed";
|
|
213
213
|
import { watchConnection } from "./services/connection";
|
|
214
214
|
import { commitTabBuffers, tabBufferUnsaved } from "./services/monaco-buffer";
|
|
215
|
+
import { imageEditorDirty } from "./media/image-editor";
|
|
215
216
|
import { clearTyping } from "./tabs/typing";
|
|
216
217
|
import * as leftPanelMod from "./panels/left-panel";
|
|
217
218
|
import * as tabStrip from "./panels/tab-strip";
|
|
@@ -605,12 +606,19 @@ setInsertZoneClickHandler(runInsertZoneAction);
|
|
|
605
606
|
setFileDropHandler(applyFileDrop);
|
|
606
607
|
// Every upload surface routes through uploadAssets(); refresh the three caches that list project
|
|
607
608
|
// Files afterwards. Injected here because all three modules import from media-upload.
|
|
608
|
-
setMediaChangedHandler(async (dir) => {
|
|
609
|
+
setMediaChangedHandler(async (dir, overwritten) => {
|
|
609
610
|
invalidateMediaCache();
|
|
610
611
|
invalidateLibrary();
|
|
611
612
|
invalidateSiteIndex();
|
|
612
613
|
await loadDirectory(dir);
|
|
613
614
|
renderLeftPanel();
|
|
615
|
+
/* Bytes replaced IN PLACE change no listing, so nothing above redraws what was already drawn from
|
|
616
|
+
them. Every pane draws again, and its asset resolver now carries the path's repaint key. */
|
|
617
|
+
if (overwritten !== undefined) {
|
|
618
|
+
for (const pane of workspace.panes) {
|
|
619
|
+
renderCanvas(pane.id);
|
|
620
|
+
}
|
|
621
|
+
}
|
|
614
622
|
});
|
|
615
623
|
// The in-iframe "/" trigger drives the parent-realm slash menu across the bridge.
|
|
616
624
|
setCanvasSlashHandler(canvasSlashHandler);
|
|
@@ -677,7 +685,7 @@ document.addEventListener(
|
|
|
677
685
|
*/
|
|
678
686
|
export function hasUnsavedTabs(): boolean {
|
|
679
687
|
for (const tab of workspace.tabs.values()) {
|
|
680
|
-
if (tab.doc.dirty || tabBufferUnsaved(tab)) {
|
|
688
|
+
if (tab.doc.dirty || tabBufferUnsaved(tab) || imageEditorDirty(tab)) {
|
|
681
689
|
return true;
|
|
682
690
|
}
|
|
683
691
|
}
|
|
@@ -1119,6 +1127,9 @@ if (_projectParam) {
|
|
|
1119
1127
|
/* Through `loadDirectory` (inside `loadProjectDirectories`), not `platform.listDirectory`:
|
|
1120
1128
|
the loader is what reads the `.gitignore` chain governing each directory. */
|
|
1121
1129
|
await loadProjectDirectories();
|
|
1130
|
+
/* The other two ways into a project subscribe, and this one did not, so a project opened
|
|
1131
|
+
by its URL never heard about a file changing on disk. */
|
|
1132
|
+
ensureFsSync();
|
|
1122
1133
|
void maybePromptJxsuiteUpdate(siteCtx.sitePath);
|
|
1123
1134
|
}
|
|
1124
1135
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://jxsuite.com/schema/v1",
|
|
3
3
|
"$id": "StudioAiCredentialsForm",
|
|
4
|
-
"$description": "The AI provider credentials form every gate embeds below the keyless offer: a key, a model, an endpoint, and the two buttons that keep or abandon them. Everything here is a projection — `ui/ai-credentials-form.ts` keeps the drafts, decides what a fetch is sent with, what Save actually persists and whether there is anything to Save or Cancel at all. This document never reads a setting and never calls the proxy.",
|
|
4
|
+
"$description": "The AI provider credentials form every gate embeds below the keyless offer: a provider family (only where the backend reaches more than one), a key, a model, an endpoint, and the two buttons that keep or abandon them. Everything here is a projection — `ui/ai-credentials-form.ts` keeps the drafts, decides what a fetch is sent with, what Save actually persists and whether there is anything to Save or Cancel at all. This document never reads a setting and never calls the proxy.",
|
|
5
5
|
"tagName": "div",
|
|
6
6
|
"attributes": {
|
|
7
7
|
"part": "ai-creds-form",
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
"fontWeight": "500",
|
|
33
33
|
"fontSize": "var(--jx-text-sm)"
|
|
34
34
|
},
|
|
35
|
-
"& [part=\"key\"], & [part=\"model\"], & [part=\"endpoint\"]": {
|
|
35
|
+
"& [part=\"provider\"], & [part=\"key\"], & [part=\"model\"], & [part=\"endpoint\"]": {
|
|
36
36
|
"$description": "Every control takes the column's width; the kit's fields are inline-flex by default.",
|
|
37
37
|
"width": "100%"
|
|
38
38
|
},
|
|
@@ -73,6 +73,54 @@
|
|
|
73
73
|
},
|
|
74
74
|
"textContent": "${state.intro}"
|
|
75
75
|
},
|
|
76
|
+
{
|
|
77
|
+
"$description": "The family the key belongs to (specs/ai.md §2.6), drawn only where it is a choice: the backend's models route lists more than the OpenAI-compatible family, or the stored or drafted family is already another one, so a reader can always switch back. A backend that lists nothing reaches the OpenAI-compatible family alone and forwards every key there, so offering Claude to it would send a Claude key to OpenAI. Above the key because it decides what the key is.",
|
|
78
|
+
"tagName": "div",
|
|
79
|
+
"attributes": {
|
|
80
|
+
"part": "provider-slot",
|
|
81
|
+
"role": "none"
|
|
82
|
+
},
|
|
83
|
+
"style": {
|
|
84
|
+
"display": "contents"
|
|
85
|
+
},
|
|
86
|
+
"$switch": {
|
|
87
|
+
"$ref": "#/state/showProvider"
|
|
88
|
+
},
|
|
89
|
+
"cases": {
|
|
90
|
+
"true": {
|
|
91
|
+
"tagName": "jx-select",
|
|
92
|
+
"attributes": {
|
|
93
|
+
"part": "provider"
|
|
94
|
+
},
|
|
95
|
+
"$props": {
|
|
96
|
+
"label": "Provider",
|
|
97
|
+
"size": "sm",
|
|
98
|
+
"options": {
|
|
99
|
+
"$ref": "#/state/providerOptions"
|
|
100
|
+
},
|
|
101
|
+
"value": {
|
|
102
|
+
"$ref": "#/state/providerDraft"
|
|
103
|
+
}
|
|
104
|
+
},
|
|
105
|
+
"onchange": {
|
|
106
|
+
"$prototype": "Function",
|
|
107
|
+
"body": [
|
|
108
|
+
{
|
|
109
|
+
"operator": "call",
|
|
110
|
+
"target": {
|
|
111
|
+
"$ref": "#/state/setProvider"
|
|
112
|
+
},
|
|
113
|
+
"value": [
|
|
114
|
+
{
|
|
115
|
+
"$ref": "event#/target/value"
|
|
116
|
+
}
|
|
117
|
+
]
|
|
118
|
+
}
|
|
119
|
+
]
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
},
|
|
76
124
|
{
|
|
77
125
|
"tagName": "jx-textfield",
|
|
78
126
|
"attributes": {
|
|
@@ -82,7 +130,9 @@
|
|
|
82
130
|
"label": "AI provider key",
|
|
83
131
|
"type": "password",
|
|
84
132
|
"size": "sm",
|
|
85
|
-
"placeholder":
|
|
133
|
+
"placeholder": {
|
|
134
|
+
"$ref": "#/state/keyPlaceholder"
|
|
135
|
+
},
|
|
86
136
|
"value": {
|
|
87
137
|
"$ref": "#/state/keyDraft"
|
|
88
138
|
}
|
|
@@ -120,7 +170,9 @@
|
|
|
120
170
|
"$props": {
|
|
121
171
|
"label": "Model ID",
|
|
122
172
|
"size": "sm",
|
|
123
|
-
"placeholder":
|
|
173
|
+
"placeholder": {
|
|
174
|
+
"$ref": "#/state/modelPlaceholder"
|
|
175
|
+
},
|
|
124
176
|
"allowsCustomValue": true,
|
|
125
177
|
"value": {
|
|
126
178
|
"$ref": "#/state/modelDraft"
|
|
@@ -231,7 +283,9 @@
|
|
|
231
283
|
"$props": {
|
|
232
284
|
"label": "Endpoint",
|
|
233
285
|
"size": "sm",
|
|
234
|
-
"placeholder":
|
|
286
|
+
"placeholder": {
|
|
287
|
+
"$ref": "#/state/endpointPlaceholder"
|
|
288
|
+
},
|
|
235
289
|
"value": {
|
|
236
290
|
"$ref": "#/state/baseUrlDraft"
|
|
237
291
|
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* The AI provider credentials form as a mounted document.
|
|
4
4
|
*
|
|
5
|
-
* `ui/ai-credentials-form.ts` is the flow — it holds the
|
|
5
|
+
* `ui/ai-credentials-form.ts` is the flow — it holds the drafts, decides which credentials a
|
|
6
6
|
* listing is made with, what Save persists and re-reads, and whether there is anything to commit —
|
|
7
7
|
* and this is the surface it draws into.
|
|
8
8
|
*
|
|
@@ -37,10 +37,22 @@ registerSurface("ai-credentials-form", credentialsDoc);
|
|
|
37
37
|
export interface AiCredentialsView {
|
|
38
38
|
/** The line under the title: where the key goes, and where it does not. */
|
|
39
39
|
intro: string;
|
|
40
|
-
/** The
|
|
40
|
+
/** The drafts, exactly as the flow holds them. */
|
|
41
|
+
providerDraft: string;
|
|
41
42
|
keyDraft: string;
|
|
42
43
|
modelDraft: string;
|
|
43
44
|
baseUrlDraft: string;
|
|
45
|
+
/**
|
|
46
|
+
* Whether the provider picker is drawn: the backend reaches another family, or the drafted or
|
|
47
|
+
* stored family already is one (specs/ai.md §2.6).
|
|
48
|
+
*/
|
|
49
|
+
showProvider: boolean;
|
|
50
|
+
/** The families the picker offers. */
|
|
51
|
+
providerOptions: SurfaceOption[];
|
|
52
|
+
/** What each field says while it is empty; they follow the drafted family. */
|
|
53
|
+
keyPlaceholder: string;
|
|
54
|
+
modelPlaceholder: string;
|
|
55
|
+
endpointPlaceholder: string;
|
|
44
56
|
/** The catalogue the last successful listing returned; empty draws no chevron on the field. */
|
|
45
57
|
models: SurfaceOption[];
|
|
46
58
|
/** A listing is in flight: the button says so and refuses a second one. */
|
|
@@ -59,6 +71,7 @@ export interface AiCredentialsView {
|
|
|
59
71
|
|
|
60
72
|
/** Everything the reader can do here. */
|
|
61
73
|
export interface AiCredentialsActions {
|
|
74
|
+
setProvider: (value: string) => void;
|
|
62
75
|
setKey: (value: string) => void;
|
|
63
76
|
setModel: (value: string) => void;
|
|
64
77
|
setBaseUrl: (value: string) => void;
|
|
@@ -57,7 +57,7 @@ import {
|
|
|
57
57
|
openSettingsMenu,
|
|
58
58
|
SETTINGS_MENU_PLACEMENT,
|
|
59
59
|
} from "../panels/settings-menu";
|
|
60
|
-
import {
|
|
60
|
+
import { SWITCHER_WORKSPACES } from "../workspace/workspace-ids";
|
|
61
61
|
import type { WorkspaceId } from "../workspace/workspace-ids";
|
|
62
62
|
import commandbarDoc from "./commandbar.json";
|
|
63
63
|
import type { PresenceProjection } from "../collab/presence-chips";
|
|
@@ -584,7 +584,11 @@ function projectSegments(tab: Tab | null): SegmentProjection[] {
|
|
|
584
584
|
}
|
|
585
585
|
|
|
586
586
|
/**
|
|
587
|
-
* `Design · Content · Media · Styles · Publish`: the five workspaces, as a tablist.
|
|
587
|
+
* `Design · Content · Media · Styles · Publish`: the five switcher workspaces, as a tablist.
|
|
588
|
+
*
|
|
589
|
+
* Project Settings is a workspace too, and is not here: it is reached from its links (the gear
|
|
590
|
+
* menu's row, ⌘⇧, and every `settings.open` deep link), so while it is on screen no tab is selected
|
|
591
|
+
* and any of these five leaves it (studio.md §22.2).
|
|
588
592
|
*
|
|
589
593
|
* Each tab RUNS `view.setWorkspace`, so the click, ⌘1–5, the palette row and a script all take the
|
|
590
594
|
* same path, and the selected tab is `shell.workspace` rather than a second record of it. Publish
|
|
@@ -598,7 +602,7 @@ function projectWorkspaces(registry: CommandRegistry | null): WorkspaceTabProjec
|
|
|
598
602
|
return [];
|
|
599
603
|
}
|
|
600
604
|
const dirty = shell.git.status?.files.length ?? 0;
|
|
601
|
-
return
|
|
605
|
+
return SWITCHER_WORKSPACES.map((entry) => {
|
|
602
606
|
const badge = entry.id === "publish" && dirty > 0 ? String(dirty) : "";
|
|
603
607
|
const chord = registry.keymap.formatBinding(`workspace.focus.${entry.id}`);
|
|
604
608
|
const named = chord ? `${entry.title} (${chord})` : entry.title;
|