@jxsuite/studio 4.1.0 → 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/data/elements-meta.json +5 -15
- package/data/html-meta.json +51 -6
- package/dist/chunks/{2020-n6tfwnda.js → 2020-g79n01v9.js} +14 -14
- package/dist/chunks/action-group-sp6tna8v.js +118 -0
- package/dist/chunks/adapter-nj7tnjfn.js +13 -0
- package/dist/chunks/cf-account-picker-fyf63pmy.js +495 -0
- package/dist/chunks/cf-settings-71bv5zn9.js +20 -0
- package/dist/chunks/color-area-v17df7b8.js +154 -0
- package/dist/chunks/color-field-anwybnkn.js +208 -0
- package/dist/chunks/color-slider-44ez96fc.js +79 -0
- package/dist/chunks/color-xgg3kfw7.js +35 -0
- package/dist/chunks/combobox-5e7jev23.js +236 -0
- package/dist/chunks/components-2w1f35qs.js +18 -0
- package/dist/chunks/content-source-3wqeas45.js +46 -0
- package/dist/chunks/convert-to-repeater-d0cgnb6d.js +639 -0
- package/dist/chunks/dialog-s890b918.js +85 -0
- package/dist/chunks/editor-3qhbg51x.js +35 -0
- package/dist/chunks/entry-commands-d6g50j7s.js +42 -0
- package/dist/chunks/extension-sections-fy7q4fe9.js +651 -0
- package/dist/chunks/file-ops-3btj6st0.js +47 -0
- package/dist/chunks/files-ef8fgs3w.js +72 -0
- package/dist/chunks/format-host-3c33nwr8.js +40 -0
- package/dist/chunks/fs-events-13tj6sex.js +18 -0
- package/dist/chunks/git-panel-4wp2rn9b.js +49 -0
- package/dist/chunks/icons-yy10wk9r.js +402 -0
- package/dist/chunks/iframe-entry-15g3n6xv.js +114 -0
- package/dist/chunks/iframe-entry-b27vq81n.js +203 -0
- package/dist/chunks/iframe-entry-nbyxee1y.js +154 -0
- package/dist/chunks/iframe-host-jgesd924.js +115 -0
- package/dist/chunks/{index-wcnt3r9g.js → index-mdmyx6s2.js} +11 -11
- package/dist/chunks/index-n4j7qxyr.js +109 -0
- package/dist/chunks/{javascript-q8kpmfah.js → javascript-xvrfrpkb.js} +8 -9
- package/dist/chunks/{jsonMode-dkr040ga.js → jsonMode-tyx2kj6p.js} +526 -527
- package/dist/chunks/jx-validate-j0wxk72w.js +15 -0
- package/dist/chunks/layers-1nq5evsh.js +29 -0
- package/dist/chunks/layers-panel-ar2gh90g.js +40 -0
- package/dist/chunks/listbox-6v2ac08j.js +44 -0
- package/dist/chunks/lit-html-m244w9nh.js +17 -0
- package/dist/chunks/media-picker-2qbetq73.js +33 -0
- package/dist/chunks/menu-q99sy9rf.js +285 -0
- package/dist/chunks/menu-rf7n72mf.js +14 -0
- package/dist/chunks/{monaco-binding-rj6xpx9y.js → monaco-binding-sw6en4dw.js} +12 -15
- package/dist/chunks/monaco-buffer-bhy3hb6m.js +24 -0
- package/dist/chunks/{monaco-setup-vx9bhp1d.js → monaco-setup-8r62fj6y.js} +27 -37
- package/dist/chunks/notify-628t0anh.js +21 -0
- package/dist/chunks/number-field-5cndyft8.js +72 -0
- package/dist/chunks/parse-0zx14y15.js +10 -0
- package/dist/chunks/platform-ts9cg1a4.js +15 -0
- package/dist/chunks/popover-47z3ytva.js +25 -0
- package/dist/chunks/publish-panel-98f7sr3g.js +27 -0
- package/dist/chunks/quick-search-srzz83k2.js +45 -0
- package/dist/chunks/references-n553f0e1.js +26 -0
- package/dist/chunks/right-panel-rrgx2dn3.js +45 -0
- package/dist/chunks/section-registry-5pq32t0q.js +25 -0
- package/dist/chunks/select-2r16ez41.js +49 -0
- package/dist/chunks/split-g7nm1rgb.js +191 -0
- package/dist/chunks/studio-0hqbpbd0.js +62 -0
- package/dist/chunks/studio-18avnhjp.js +2430 -0
- package/dist/chunks/{studio-kryvsw6j.js → studio-1k325pwf.js} +48 -48
- package/dist/chunks/{studio-msd847zn.js → studio-25hkdrkw.js} +357 -86
- package/dist/chunks/studio-26d7myd1.js +258 -0
- package/dist/chunks/{studio-4r1pv6zf.js → studio-38emantv.js} +22 -5
- package/dist/chunks/studio-3gxv60tn.js +422 -0
- package/dist/chunks/{studio-fbf92ckf.js → studio-3hxkd92t.js} +275 -163
- package/dist/chunks/studio-4m0haseg.js +185 -0
- package/dist/chunks/{studio-ynxwkrzd.js → studio-4wbb9ct0.js} +1953 -1785
- package/dist/chunks/{studio-1wagb550.js → studio-5523bpzt.js} +11 -11
- package/dist/chunks/{studio-x4qkdat5.js → studio-57mf66w2.js} +1749 -2481
- package/dist/chunks/studio-5jy81t3s.js +17463 -0
- package/dist/chunks/studio-5rt7sqa0.js +1168 -0
- package/dist/chunks/studio-5te5tqng.js +81 -0
- package/dist/chunks/{studio-p4ngc046.js → studio-6ewqv390.js} +9 -9
- package/dist/chunks/{studio-9ab8gqsm.js → studio-6nzaktvy.js} +7 -7
- package/dist/chunks/studio-6xa21ej9.js +28 -0
- package/dist/chunks/{studio-5ehhackm.js → studio-727xh0e3.js} +19 -19
- package/dist/chunks/{studio-ahn3pdgx.js → studio-79y5sz51.js} +52 -38
- package/dist/chunks/{studio-gcye7qka.js → studio-7e11jpa9.js} +21 -21
- package/dist/chunks/{studio-q7v10cg2.js → studio-7r42c6ca.js} +17 -7
- package/dist/chunks/studio-7xptrg0j.js +954 -0
- package/dist/chunks/{studio-cft9r4r7.js → studio-81390n6f.js} +22 -22
- package/dist/chunks/{studio-q43a5y9h.js → studio-8jn5yhyn.js} +16 -16
- package/dist/chunks/studio-8qtrpzr3.js +839 -0
- package/dist/chunks/{studio-dg7zyt5x.js → studio-98b3z07n.js} +1 -1
- package/dist/chunks/studio-9xxz1q69.js +1356 -0
- package/dist/chunks/studio-akbww0j5.js +13615 -0
- package/dist/chunks/{studio-x813zp48.js → studio-arfpe389.js} +30 -30
- package/dist/chunks/{studio-trxrabqf.js → studio-az3zd49t.js} +475 -283
- package/dist/chunks/studio-cpvb2ed1.js +1171 -0
- package/dist/chunks/{studio-f3wqjtk5.js → studio-d0300636.js} +5076 -18
- package/dist/chunks/{studio-bgxt93ga.js → studio-d055c37e.js} +13 -13
- package/dist/chunks/studio-d1ja2x9r.js +362 -0
- package/dist/chunks/{studio-b9b6t1dg.js → studio-e1f24eff.js} +5664 -5666
- package/dist/chunks/{studio-3bqpr0zh.js → studio-em9nw8eh.js} +299 -110
- package/dist/chunks/studio-erdatzvp.js +1190 -0
- package/dist/chunks/{studio-g1wdche0.js → studio-esrxgwh6.js} +80 -80
- package/dist/chunks/studio-fabxk6r9.js +2811 -0
- package/dist/chunks/{studio-3n4ndrzh.js → studio-h4nvnjvz.js} +303 -303
- package/dist/chunks/{studio-dm19q43r.js → studio-hhvs4sdg.js} +10 -10
- package/dist/chunks/{studio-q9jd1a60.js → studio-kcgff4r0.js} +15 -18
- package/dist/chunks/{studio-685s0ytq.js → studio-nqgawfks.js} +572 -572
- package/dist/chunks/{studio-xrapxwwc.js → studio-p1dw8wfw.js} +55 -29
- package/dist/chunks/studio-pm6hgy7r.js +4763 -0
- package/dist/chunks/studio-q0a3yk4n.js +33 -0
- package/dist/chunks/{studio-wcy8trfx.js → studio-q3x06vmj.js} +23 -22
- package/dist/chunks/studio-qahxvnan.js +111 -0
- package/dist/chunks/{studio-53n8bp04.js → studio-r6xmmtfh.js} +1 -1
- package/dist/chunks/{studio-2b946z26.js → studio-rkstz940.js} +3658 -6134
- package/dist/chunks/{studio-tvgyw9xw.js → studio-rnyf3f8e.js} +83 -250
- package/dist/chunks/studio-rpyah2ew.js +2805 -0
- package/dist/chunks/studio-rs76k67r.js +12 -0
- package/dist/chunks/{studio-jkftxyvz.js → studio-s6z853aq.js} +5858 -2152
- package/dist/chunks/{studio-6yw4y3my.js → studio-sgdc5pfc.js} +8 -8
- package/dist/chunks/studio-tb3ev01j.js +763 -0
- package/dist/chunks/{studio-t5wqwzdh.js → studio-tjjk7jvk.js} +1 -1
- package/dist/chunks/studio-vhv5tgxm.js +51 -0
- package/dist/chunks/{studio-qjy2z9bv.js → studio-vz68yn9e.js} +32 -137
- package/dist/chunks/studio-wqpngpsk.js +174 -0
- package/dist/chunks/{studio-b55y6ewx.js → studio-x3rty6tr.js} +58 -58
- package/dist/chunks/studio-xsykpvsh.js +8448 -0
- package/dist/chunks/{studio-92ab2jqe.js → studio-y9zedyjn.js} +14 -14
- package/dist/chunks/studio-yxa81f45.js +12 -0
- package/dist/chunks/swatch-group-t0n6h2rn.js +139 -0
- package/dist/chunks/tabs-wbp1cdws.js +156 -0
- package/dist/chunks/textfield-abk6qyee.js +73 -0
- package/dist/chunks/toast-780pvfbv.js +27 -0
- package/dist/chunks/toast-host-3sqv46sn.js +116 -0
- package/dist/chunks/toolbar-xbh5bhtr.js +194 -0
- package/dist/chunks/tooltip-eptb614w.js +369 -0
- package/dist/chunks/tree-a73p0pqm.js +367 -0
- package/dist/chunks/{tsMode-76kr53q0.js → tsMode-jy4m86rv.js} +83 -85
- package/dist/chunks/workspace-wrew8zk4.js +69 -0
- package/dist/chunks/{ws-client-6shc5rze.js → ws-client-ny4zc51r.js} +20 -22
- package/dist/iframe-entry.js +1780 -667
- package/dist/studio.js +52819 -36480
- package/dist/workers/editor.worker.js +1040 -1085
- package/dist/workers/json.worker.js +1946 -1991
- package/dist/workers/ts.worker.js +4960 -5005
- package/index.html +1 -0
- package/package.json +18 -52
- package/src/about/about-modal.ts +72 -123
- package/src/browse/library-commands.ts +20 -49
- package/src/browse/library-layouts.ts +87 -218
- package/src/browse/library-pane.ts +406 -438
- package/src/canvas/canvas-helpers.ts +0 -49
- package/src/canvas/canvas-live-render.ts +25 -2
- package/src/canvas/canvas-render.ts +666 -231
- package/src/canvas/canvas-surface.ts +0 -1
- package/src/canvas/canvas-utils.ts +310 -117
- package/src/canvas/dialog-path.ts +76 -0
- package/src/canvas/dialog-state.ts +67 -0
- package/src/canvas/diff-marks.ts +252 -0
- package/src/canvas/diff-toolbar.ts +349 -0
- package/src/canvas/diff-view.ts +123 -0
- package/src/canvas/edit-width-drag.ts +187 -0
- package/src/canvas/edit-width.ts +150 -0
- package/src/canvas/iframe-entry.ts +125 -8
- package/src/canvas/iframe-host.ts +271 -15
- package/src/canvas/iframe-interaction.ts +133 -13
- package/src/canvas/iframe-patch.ts +7 -1
- package/src/canvas/iframe-position.ts +5 -6
- package/src/canvas/iframe-protocol.ts +106 -5
- package/src/canvas/iframe-render.ts +373 -5
- package/src/canvas/iframe-slash.ts +2 -2
- package/src/canvas/iframe-subtree.ts +5 -8
- package/src/canvas/path-mapping.ts +25 -3
- package/src/canvas/popover-path.ts +106 -0
- package/src/canvas/popover-state.ts +155 -0
- package/src/canvas/surface-registry.ts +21 -10
- package/src/collab/presence-chips.ts +51 -73
- package/src/commands/app-commands.ts +10 -0
- package/src/commands/budget.ts +12 -0
- package/src/commands/command-args.ts +369 -6
- package/src/commands/defaults.ts +44 -14
- package/src/commands/live-context.ts +11 -5
- package/src/commands/reference.ts +12 -2
- package/src/commands/registry.ts +165 -8
- package/src/content/entry-commands.ts +16 -23
- package/src/content/entry-editor.ts +144 -101
- package/src/editor/canvas-slash-bridge.ts +2 -2
- package/src/editor/context-menu.ts +49 -200
- package/src/editor/convert-to-component.ts +42 -82
- package/src/editor/convert-to-repeater.ts +132 -173
- package/src/editor/inline-edit.ts +11 -0
- package/src/editor/shortcuts.ts +65 -26
- package/src/editor/slash-menu.ts +150 -157
- package/src/files/file-ops.ts +117 -11
- package/src/files/files.ts +943 -660
- package/src/files/json-layout.ts +474 -0
- package/src/files/serialize-document.ts +8 -1
- package/src/format/convert-file.ts +16 -10
- package/src/format/format-host.ts +50 -1
- package/src/github/github-auth.ts +71 -29
- package/src/github/github-publish.ts +57 -65
- package/src/grid/cell-editors.ts +46 -4
- package/src/grid/cell-popovers.ts +65 -62
- package/src/grid/grid-open.ts +86 -64
- package/src/grid/grid-panel.ts +390 -469
- package/src/grid/redirects-grid.ts +40 -44
- package/src/hosting/layout.ts +2 -0
- package/src/i18n/i18n-commands.ts +127 -62
- package/src/media/media-pane.ts +83 -133
- package/src/new-project/add-repo-modal.ts +125 -176
- package/src/new-project/import-tab.ts +181 -252
- package/src/new-project/location-fields.ts +93 -160
- package/src/new-project/new-project-modal.ts +376 -367
- package/src/packages/jxsuite-update.ts +76 -18
- package/src/panels/activity-panel.ts +137 -104
- package/src/panels/ai-chat/chat-markdown.ts +15 -13
- package/src/panels/ai-chat/chat-view.ts +307 -472
- package/src/panels/ai-chat/composer.ts +175 -163
- package/src/panels/ai-chat/sessions-view.ts +31 -62
- package/src/panels/ai-panel.ts +210 -185
- package/src/panels/block-action-bar.ts +437 -643
- package/src/panels/bottom-dock.ts +112 -47
- package/src/panels/chat-panel.ts +19 -14
- package/src/panels/data-explorer.ts +141 -102
- package/src/panels/data-grid.ts +183 -150
- package/src/panels/dnd.ts +75 -20
- package/src/panels/editors.ts +26 -19
- package/src/panels/elements-panel.ts +243 -186
- package/src/panels/empty-state.ts +26 -42
- package/src/panels/events-panel.ts +950 -729
- package/src/panels/formula-workspace.ts +434 -207
- package/src/panels/frontmatter-fields.ts +185 -153
- package/src/panels/frontmatter-panel.ts +411 -187
- package/src/panels/git-diff-open.ts +148 -0
- package/src/panels/git-panel.ts +679 -605
- package/src/panels/head-panel.ts +617 -435
- package/src/panels/i18n-panel.ts +153 -133
- package/src/panels/imports-panel.ts +388 -414
- package/src/panels/jump-bar.ts +174 -147
- package/src/panels/layers-panel.ts +785 -671
- package/src/panels/left-panel.ts +166 -94
- package/src/panels/navigator-panels.ts +1 -1
- package/src/panels/pane-context.ts +529 -677
- package/src/panels/pane-grid.ts +265 -241
- package/src/panels/panel-registry.ts +15 -4
- package/src/panels/problems-panel.ts +177 -99
- package/src/panels/properties-panel.ts +1525 -966
- package/src/panels/provenance.ts +31 -113
- package/src/panels/quick-search.ts +217 -172
- package/src/panels/right-panel.ts +135 -169
- package/src/panels/seo-modal.ts +346 -167
- package/src/panels/settings-menu.ts +109 -646
- package/src/panels/settings-pane.ts +102 -86
- package/src/panels/signals-panel.ts +1318 -1172
- package/src/panels/statement-editor.ts +556 -428
- package/src/panels/style-panel.ts +1367 -630
- package/src/panels/style-utils.ts +36 -32
- package/src/panels/stylebook-doc.ts +30 -73
- package/src/panels/stylebook-layers-panel.ts +202 -109
- package/src/panels/stylebook-panel.ts +124 -88
- package/src/panels/tab-strip.ts +385 -287
- package/src/platforms/cloud.ts +106 -16
- package/src/platforms/devserver.ts +13 -0
- package/src/publish/deploy-checklist.ts +124 -78
- package/src/publish/publish-commands.ts +4 -12
- package/src/publish/publish-panel.ts +134 -328
- package/src/services/a11y-report.ts +100 -43
- package/src/services/ai-command-tools.ts +468 -0
- package/src/services/ai-session-store.ts +6 -0
- package/src/services/ai-system-prompt.ts +110 -18
- package/src/services/ai-tools.ts +28 -143
- package/src/services/ai-write-report.ts +174 -0
- package/src/services/document-assistant.ts +50 -2
- package/src/services/idle.ts +16 -14
- package/src/services/live-surfaces.ts +237 -0
- package/src/services/model-uri.ts +75 -0
- package/src/services/notify.ts +63 -6
- package/src/services/popover-report.ts +325 -0
- package/src/services/surface-registry.ts +56 -0
- package/src/services/tool-executor.ts +6 -0
- package/src/settings/contexts-section.ts +301 -299
- package/src/settings/contributed-section.ts +361 -222
- package/src/settings/css-vars-editor.ts +320 -325
- package/src/settings/defs-editor.ts +572 -535
- package/src/settings/dependencies-editor.ts +79 -107
- package/src/settings/extension-commands.ts +379 -0
- package/src/settings/extension-rows.ts +113 -0
- package/src/settings/extensions-section.ts +287 -0
- package/src/settings/general-settings.ts +130 -181
- package/src/settings/head-editor.ts +10 -305
- package/src/settings/locales-section.ts +146 -196
- package/src/settings/preferences-accounts.ts +1 -1
- package/src/settings/preferences-dialog.ts +350 -330
- package/src/settings/project-sections.ts +108 -181
- package/src/settings/schema-field-ui.ts +11 -399
- package/src/settings/section-registry.ts +8 -1
- package/src/settings/settings-document.ts +31 -29
- package/src/shell/tree.ts +42 -87
- package/src/shell.ts +48 -36
- package/src/studio.ts +90 -67
- package/src/style/token-ref.ts +0 -39
- package/src/surfaces/about.json +263 -0
- package/src/surfaces/about.ts +163 -0
- package/src/surfaces/add-repo.json +486 -0
- package/src/surfaces/add-repo.ts +236 -0
- package/src/surfaces/ai-chat.json +2185 -0
- package/src/surfaces/ai-chat.ts +549 -0
- package/src/surfaces/ai-credentials-form.json +332 -0
- package/src/surfaces/ai-credentials-form.ts +151 -0
- package/src/surfaces/ai-managed-connect.json +108 -0
- package/src/surfaces/ai-managed-connect.ts +123 -0
- package/src/surfaces/ai-model-picker.json +114 -0
- package/src/surfaces/ai-model-picker.ts +139 -0
- package/src/surfaces/block-action-bar.json +640 -0
- package/src/surfaces/block-action-bar.ts +368 -0
- package/src/surfaces/bottom-dock.json +154 -0
- package/src/surfaces/bottom-dock.ts +125 -0
- package/src/surfaces/canvas-stage.json +444 -0
- package/src/surfaces/canvas-stage.ts +253 -0
- package/src/surfaces/cf-account-picker.json +300 -0
- package/src/surfaces/cf-account-picker.ts +214 -0
- package/src/surfaces/commandbar.json +984 -0
- package/src/{panels/toolbar.ts → surfaces/commandbar.ts} +414 -389
- package/src/surfaces/convert-repeater.json +309 -0
- package/src/surfaces/convert-repeater.ts +276 -0
- package/src/surfaces/data-actions.json +157 -0
- package/src/surfaces/data-actions.ts +115 -0
- package/src/surfaces/dialog.json +289 -0
- package/src/surfaces/dialog.ts +343 -0
- package/src/surfaces/diff-toolbar.json +266 -0
- package/src/surfaces/diff-toolbar.ts +139 -0
- package/src/surfaces/doc-header.json +739 -0
- package/src/surfaces/doc-header.ts +223 -0
- package/src/surfaces/empty-state.json +152 -0
- package/src/surfaces/empty-state.ts +173 -0
- package/src/surfaces/entry-editor.json +281 -0
- package/src/surfaces/entry-editor.ts +191 -0
- package/src/surfaces/expression-editor.json +977 -0
- package/src/surfaces/expression-editor.ts +266 -0
- package/src/surfaces/files-panel.json +592 -0
- package/src/surfaces/files-panel.ts +301 -0
- package/src/surfaces/formula-palette.json +364 -0
- package/src/surfaces/formula-palette.ts +340 -0
- package/src/surfaces/git-panel.json +1822 -0
- package/src/surfaces/git-panel.ts +272 -0
- package/src/surfaces/github-auth.json +112 -0
- package/src/surfaces/github-auth.ts +139 -0
- package/src/surfaces/github-publish.json +206 -0
- package/src/surfaces/github-publish.ts +169 -0
- package/src/surfaces/grid-cell.json +218 -0
- package/src/surfaces/grid-cell.ts +120 -0
- package/src/surfaces/grid-open.json +147 -0
- package/src/surfaces/grid-open.ts +87 -0
- package/src/surfaces/grid-panel.json +706 -0
- package/src/surfaces/grid-panel.ts +206 -0
- package/src/surfaces/grid-replace.json +179 -0
- package/src/surfaces/grid-replace.ts +89 -0
- package/src/surfaces/grid-views.json +446 -0
- package/src/surfaces/grid-views.ts +172 -0
- package/src/surfaces/inspector-dock.json +187 -0
- package/src/surfaces/inspector-dock.ts +161 -0
- package/src/surfaces/jump-bar.json +243 -0
- package/src/surfaces/jump-bar.ts +129 -0
- package/src/surfaces/jxsuite-update.json +146 -0
- package/src/surfaces/jxsuite-update.ts +149 -0
- package/src/surfaces/library-pane.json +1509 -0
- package/src/surfaces/library-pane.ts +363 -0
- package/src/surfaces/logic-panel.json +1949 -0
- package/src/surfaces/logic-panel.ts +369 -0
- package/src/surfaces/logic-workspace.json +685 -0
- package/src/surfaces/logic-workspace.ts +238 -0
- package/src/surfaces/media-browser.json +303 -0
- package/src/surfaces/media-browser.ts +145 -0
- package/src/surfaces/media-field.json +163 -0
- package/src/surfaces/media-field.ts +116 -0
- package/src/surfaces/media-pane.json +513 -0
- package/src/surfaces/media-pane.ts +197 -0
- package/src/surfaces/menu.json +232 -0
- package/src/surfaces/menu.ts +375 -0
- package/src/surfaces/navigator-dock.json +113 -0
- package/src/surfaces/navigator-dock.ts +130 -0
- package/src/surfaces/new-project.json +1654 -0
- package/src/surfaces/new-project.ts +411 -0
- package/src/surfaces/palette.json +535 -0
- package/src/surfaces/pane-context.json +1497 -0
- package/src/surfaces/pane-context.ts +513 -0
- package/src/surfaces/pane-grid.json +188 -0
- package/src/surfaces/pane-grid.ts +250 -0
- package/src/surfaces/panel-activity.json +563 -0
- package/src/surfaces/panel-activity.ts +187 -0
- package/src/surfaces/panel-data.json +141 -0
- package/src/surfaces/panel-data.ts +156 -0
- package/src/surfaces/panel-deploy-checklist.json +283 -0
- package/src/surfaces/panel-deploy-checklist.ts +175 -0
- package/src/surfaces/panel-elements.json +367 -0
- package/src/surfaces/panel-elements.ts +175 -0
- package/src/surfaces/panel-i18n.json +569 -0
- package/src/surfaces/panel-i18n.ts +212 -0
- package/src/surfaces/panel-imports.json +780 -0
- package/src/surfaces/panel-imports.ts +209 -0
- package/src/surfaces/panel-outline.json +734 -0
- package/src/surfaces/panel-outline.ts +326 -0
- package/src/surfaces/panel-page.json +1017 -0
- package/src/surfaces/panel-page.ts +240 -0
- package/src/surfaces/panel-problems.json +497 -0
- package/src/surfaces/panel-problems.ts +157 -0
- package/src/surfaces/panel-signals.json +1973 -0
- package/src/surfaces/panel-signals.ts +436 -0
- package/src/surfaces/panel-stylebook-layers.json +317 -0
- package/src/surfaces/panel-stylebook-layers.ts +155 -0
- package/src/surfaces/preferences.json +850 -0
- package/src/surfaces/preferences.ts +332 -0
- package/src/surfaces/progress-modal.json +110 -0
- package/src/surfaces/progress-modal.ts +150 -0
- package/src/surfaces/properties-panel.json +1578 -0
- package/src/surfaces/properties-panel.ts +337 -0
- package/src/surfaces/publish.json +945 -0
- package/src/surfaces/publish.ts +392 -0
- package/src/surfaces/push-plan.json +110 -0
- package/src/surfaces/push-plan.ts +87 -0
- package/src/surfaces/rail.json +255 -0
- package/src/surfaces/rail.ts +206 -0
- package/src/surfaces/reference-field.json +191 -0
- package/src/surfaces/reference-field.ts +168 -0
- package/src/surfaces/schema-builder.json +1011 -0
- package/src/surfaces/schema-builder.ts +181 -0
- package/src/surfaces/schema-form.json +1013 -0
- package/src/surfaces/schema-form.ts +287 -0
- package/src/surfaces/secret-field.json +60 -0
- package/src/surfaces/secret-field.ts +146 -0
- package/src/surfaces/seo.json +932 -0
- package/src/surfaces/seo.ts +334 -0
- package/src/surfaces/settings-contexts.json +538 -0
- package/src/surfaces/settings-contexts.ts +196 -0
- package/src/surfaces/settings-contributed.json +489 -0
- package/src/surfaces/settings-contributed.ts +199 -0
- package/src/surfaces/settings-css-vars.json +820 -0
- package/src/surfaces/settings-css-vars.ts +199 -0
- package/src/surfaces/settings-defs.json +1363 -0
- package/src/surfaces/settings-defs.ts +232 -0
- package/src/surfaces/settings-deploy.json +108 -0
- package/src/surfaces/settings-deploy.ts +135 -0
- package/src/surfaces/settings-extensions.json +486 -0
- package/src/surfaces/settings-extensions.ts +201 -0
- package/src/surfaces/settings-head.json +779 -0
- package/src/surfaces/settings-head.ts +397 -0
- package/src/surfaces/settings-locales.json +420 -0
- package/src/surfaces/settings-locales.ts +137 -0
- package/src/surfaces/settings-overview.json +423 -0
- package/src/surfaces/settings-overview.ts +218 -0
- package/src/surfaces/settings-packages.json +549 -0
- package/src/surfaces/settings-packages.ts +158 -0
- package/src/surfaces/settings-pane.json +147 -0
- package/src/surfaces/settings-pane.ts +150 -0
- package/src/surfaces/settings-rawjson.json +104 -0
- package/src/surfaces/settings-rawjson.ts +107 -0
- package/src/surfaces/shell.json +99 -0
- package/src/surfaces/shell.ts +30 -0
- package/src/surfaces/slash-menu.json +180 -0
- package/src/surfaces/slash-menu.ts +272 -0
- package/src/surfaces/statements.json +607 -0
- package/src/surfaces/statements.ts +238 -0
- package/src/surfaces/statusbar.json +94 -0
- package/src/{panels → surfaces}/statusbar.ts +163 -90
- package/src/surfaces/style-panel.json +1643 -0
- package/src/surfaces/style-panel.ts +338 -0
- package/src/surfaces/stylebook-chrome.json +122 -0
- package/src/surfaces/stylebook-chrome.ts +122 -0
- package/src/surfaces/tab-strip.json +448 -0
- package/src/surfaces/tab-strip.ts +200 -0
- package/src/surfaces/target-line.json +419 -0
- package/src/surfaces/target-line.ts +349 -0
- package/src/surfaces/toasts.json +189 -0
- package/src/surfaces/welcome.json +571 -0
- package/src/surfaces/welcome.ts +338 -0
- package/src/tabs/project-config.ts +71 -15
- package/src/tabs/tab.ts +52 -1
- package/src/types.ts +22 -0
- package/src/ui/ai-credentials-form.ts +104 -100
- package/src/ui/ai-managed-connect.ts +54 -36
- package/src/ui/ai-model-picker.ts +75 -47
- package/src/ui/cf-account-picker.ts +76 -141
- package/src/ui/color-selector.ts +80 -301
- package/src/ui/dynamic-slot.ts +43 -283
- package/src/ui/expression-editor.ts +797 -576
- package/src/ui/field-input.ts +8 -181
- package/src/ui/form-controls.ts +838 -366
- package/src/ui/formula-chips.ts +80 -85
- package/src/ui/kit.ts +33 -0
- package/src/ui/layers.ts +293 -593
- package/src/ui/media-picker.ts +203 -284
- package/src/ui/panel-resize.ts +251 -64
- package/src/ui/popover-surface.ts +153 -0
- package/src/ui/progress-modal.ts +22 -60
- package/src/ui/regions.ts +13 -7
- package/src/ui/schema-form.ts +906 -440
- package/src/ui/surface.ts +122 -0
- package/src/ui/unit-selector.ts +15 -131
- package/src/ui/value-source.ts +14 -0
- package/src/ui/virtual-window.ts +88 -9
- package/src/utils/canvas-media.ts +72 -0
- package/src/utils/edit-display.ts +7 -2
- package/src/utils/element-selectors.ts +69 -0
- package/src/utils/link-target.ts +2 -2
- package/src/utils/studio-utils.ts +0 -10
- package/src/view.ts +15 -0
- package/src/workspace/pane-derive.ts +36 -14
- package/src/workspace/workspace.ts +15 -6
- package/styles/canvas.css +72 -467
- package/styles/forced-colors.css +48 -82
- package/styles/forced-colors.json +41 -0
- package/styles/inspector.css +2 -1301
- package/styles/overlays.css +96 -2823
- package/styles/panels.css +6 -1423
- package/styles/shell-frame.css +272 -0
- package/styles/shell-frame.json +227 -0
- package/styles/shell.css +0 -1568
- package/styles/tokens.css +65 -136
- package/styles/tokens.json +84 -0
- package/dist/chunks/Overlay.dev-etqjwyf9.js +0 -23
- package/dist/chunks/adapter-jkcyhgtr.js +0 -14
- package/dist/chunks/cf-account-picker-en86v7x7.js +0 -163
- package/dist/chunks/cf-settings-45fgyx8y.js +0 -21
- package/dist/chunks/components-zmx10t62.js +0 -21
- package/dist/chunks/content-source-48xg86wj.js +0 -49
- package/dist/chunks/convert-to-repeater-43tfn7cs.js +0 -268
- package/dist/chunks/editor-cptq5jp1.js +0 -37
- package/dist/chunks/entry-commands-e63f1xc0.js +0 -46
- package/dist/chunks/extension-sections-txv08xxg.js +0 -311
- package/dist/chunks/file-ops-wbh4hhsx.js +0 -48
- package/dist/chunks/files-3kfkwhk4.js +0 -93
- package/dist/chunks/flow-qbfgrpeh.js +0 -634
- package/dist/chunks/focus-trap.esm-9t2drp0g.js +0 -1025
- package/dist/chunks/focus-visible-6eg70z18.js +0 -167
- package/dist/chunks/format-host-w16q81tf.js +0 -43
- package/dist/chunks/fs-events-hrrg328g.js +0 -21
- package/dist/chunks/git-panel-532whr1y.js +0 -59
- package/dist/chunks/index-zqxmqxmh.js +0 -109
- package/dist/chunks/jx-validate-8er6gbxy.js +0 -19
- package/dist/chunks/layers-panel-07hm7g5j.js +0 -67
- package/dist/chunks/layers-q75tj2mf.js +0 -45
- package/dist/chunks/lit-html-j055mkh8.js +0 -22
- package/dist/chunks/monaco-buffer-dqw0xxpx.js +0 -25
- package/dist/chunks/notify-yjm79n4s.js +0 -30
- package/dist/chunks/parse-24d0gay3.js +0 -19
- package/dist/chunks/platform-ba1j1gbh.js +0 -16
- package/dist/chunks/publish-panel-v9st96ja.js +0 -29
- package/dist/chunks/quick-search-zccjp6gv.js +0 -66
- package/dist/chunks/references-3qx8fkyp.js +0 -29
- package/dist/chunks/right-panel-vm3b6kwy.js +0 -46
- package/dist/chunks/section-registry-sx1ykvkw.js +0 -30
- package/dist/chunks/sp-overlay.dev-qgvhnxf4.js +0 -18
- package/dist/chunks/sp-popover.dev-n2etmqdp.js +0 -9
- package/dist/chunks/sp-progress-circle.dev-hryhj0es.js +0 -15
- package/dist/chunks/sp-tooltip.dev-4sastdnw.js +0 -15
- package/dist/chunks/sp-tray.dev-tkbscm06.js +0 -199
- package/dist/chunks/studio-0a5qrh01.js +0 -3
- package/dist/chunks/studio-0bq6eh7v.js +0 -12
- package/dist/chunks/studio-18j3bmcz.js +0 -14
- package/dist/chunks/studio-1ngbejft.js +0 -181
- package/dist/chunks/studio-4b5z1x43.js +0 -424
- package/dist/chunks/studio-4n2b5gzb.js +0 -357
- package/dist/chunks/studio-4rzyrtjz.js +0 -426
- package/dist/chunks/studio-5fx3g9jg.js +0 -4325
- package/dist/chunks/studio-5myknm0a.js +0 -1903
- package/dist/chunks/studio-7afd21nw.js +0 -67
- package/dist/chunks/studio-7nte2hj4.js +0 -613
- package/dist/chunks/studio-8jpzqk5s.js +0 -128
- package/dist/chunks/studio-8q517dfr.js +0 -24
- package/dist/chunks/studio-950k0dx6.js +0 -6939
- package/dist/chunks/studio-9n4mrmnb.js +0 -184
- package/dist/chunks/studio-a0tswy0w.js +0 -58
- package/dist/chunks/studio-ahnzd9rg.js +0 -23
- package/dist/chunks/studio-cmb03bg5.js +0 -13890
- package/dist/chunks/studio-d1ks410h.js +0 -175
- package/dist/chunks/studio-ef49pnzx.js +0 -387
- package/dist/chunks/studio-eqq1w638.js +0 -113
- package/dist/chunks/studio-ew0djmhg.js +0 -341
- package/dist/chunks/studio-gfgb8pe6.js +0 -1652
- package/dist/chunks/studio-h4rxscfc.js +0 -10
- package/dist/chunks/studio-jc994dnr.js +0 -1066
- package/dist/chunks/studio-kyh9avvv.js +0 -28
- package/dist/chunks/studio-m3hwn7y1.js +0 -120
- package/dist/chunks/studio-mtfnaqs9.js +0 -659
- package/dist/chunks/studio-n6j9t10q.js +0 -318
- package/dist/chunks/studio-n8b9wqwy.js +0 -291
- package/dist/chunks/studio-qcy05dp8.js +0 -1743
- package/dist/chunks/studio-qq6jym04.js +0 -53
- package/dist/chunks/studio-rdx8jcxy.js +0 -83
- package/dist/chunks/studio-rn9ta2mz.js +0 -111
- package/dist/chunks/studio-t7qb9db8.js +0 -665
- package/dist/chunks/studio-tmc5emrw.js +0 -8
- package/dist/chunks/studio-z6nw2ek2.js +0 -18
- package/dist/chunks/studio-zczps70q.js +0 -378
- package/dist/chunks/studio-zqazsct2.js +0 -1823
- package/dist/chunks/workspace-fjx52ryv.js +0 -89
- package/src/panels/activity-bar.ts +0 -251
- package/src/panels/panel-scheduler.ts +0 -219
- package/src/panels/style-inputs.ts +0 -237
- package/src/panels/target-line.ts +0 -274
- package/src/panels/welcome-screen.ts +0 -346
- package/src/ui/button-group.ts +0 -102
- package/src/ui/choice-field.ts +0 -72
- package/src/ui/field-row.ts +0 -249
- package/src/ui/formula-palette.ts +0 -213
- package/src/ui/icons.ts +0 -52
- package/src/ui/jx-theme.ts +0 -130
- package/src/ui/spectrum.ts +0 -340
- package/src/ui/value-selector.ts +0 -174
- package/src/ui/widgets.ts +0 -172
- /package/dist/chunks/{javascript-s56a8dpk.css → javascript-4abzjcy9.css} +0 -0
- /package/dist/chunks/{jsonMode-zr9sw0c7.css → jsonMode-vvmpmk34.css} +0 -0
- /package/dist/chunks/{monaco-setup-pav68602.css → monaco-setup-8vbyqnhr.css} +0 -0
- /package/dist/chunks/{tsMode-ef187txx.css → tsMode-hnxxb73h.css} +0 -0
|
@@ -24,11 +24,10 @@
|
|
|
24
24
|
* @docs studio/projects/settings
|
|
25
25
|
*/
|
|
26
26
|
|
|
27
|
-
import { html } from "lit-html";
|
|
28
27
|
import { getPlatform } from "../platform";
|
|
29
28
|
import { projectState } from "../store";
|
|
30
|
-
import { clearProblems, notify } from "../services/notify";
|
|
31
|
-
import {
|
|
29
|
+
import { clearProblems, notify, problemFindings } from "../services/notify";
|
|
30
|
+
import { showPromptDialog } from "../ui/layers";
|
|
32
31
|
import { activateTab, openTab, workspace } from "../workspace/workspace";
|
|
33
32
|
import { PROJECT_CONFIG_PATH, commitProjectConfig } from "../tabs/project-config";
|
|
34
33
|
import { pageRoute } from "../panels/tab-strip";
|
|
@@ -400,37 +399,26 @@ export async function openRedirectsGrid(): Promise<GridController> {
|
|
|
400
399
|
|
|
401
400
|
// ─── Import ───────────────────────────────────────────────────────────────────
|
|
402
401
|
|
|
403
|
-
/**
|
|
402
|
+
/**
|
|
403
|
+
* The paste box.
|
|
404
|
+
*
|
|
405
|
+
* It is `showPromptDialog` with a multiline field, not a dialog of its own. An import is one value
|
|
406
|
+
* the author pastes and one answer they give, which is what that flow already is (§12.5); what it
|
|
407
|
+
* needed was a field tall enough to read the value back in, and a monospaced one, because both
|
|
408
|
+
* formats are column-aligned in the file they were copied out of.
|
|
409
|
+
*/
|
|
404
410
|
export function promptRedirectImport(): Promise<string | null> {
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
@cancel=${() => done(null)}
|
|
417
|
-
@close=${() => done(null)}
|
|
418
|
-
>
|
|
419
|
-
<p>
|
|
420
|
-
Paste a Netlify/Cloudflare <code>_redirects</code> file, or CSV with
|
|
421
|
-
<code>source,destination,status</code> columns. Rows are staged for review — nothing is
|
|
422
|
-
written until you save.
|
|
423
|
-
</p>
|
|
424
|
-
<textarea
|
|
425
|
-
class="jx-grid-input jx-redirect-import"
|
|
426
|
-
rows="10"
|
|
427
|
-
placeholder="/old-page /new-page 301"
|
|
428
|
-
@input=${(e: Event) => (text = (e.target as HTMLTextAreaElement).value)}
|
|
429
|
-
></textarea>
|
|
430
|
-
</sp-dialog-wrapper>
|
|
431
|
-
`,
|
|
432
|
-
{ region: "redirects/import" },
|
|
433
|
-
);
|
|
411
|
+
return showPromptDialog("Import Redirects", {
|
|
412
|
+
confirmLabel: "Import",
|
|
413
|
+
message:
|
|
414
|
+
"Paste a Netlify/Cloudflare _redirects file, or CSV with source,destination,status columns. " +
|
|
415
|
+
"Rows are staged for review — nothing is written until you save.",
|
|
416
|
+
mono: true,
|
|
417
|
+
multiline: true,
|
|
418
|
+
placeholder: "/old-page /new-page 301",
|
|
419
|
+
rows: "10",
|
|
420
|
+
size: "md",
|
|
421
|
+
});
|
|
434
422
|
}
|
|
435
423
|
|
|
436
424
|
/**
|
|
@@ -515,11 +503,8 @@ export function redirectsCommands(): AnyCommand[] {
|
|
|
515
503
|
group: "5_data",
|
|
516
504
|
requires: "an open project",
|
|
517
505
|
when: (ctx) => ctx.project.open,
|
|
518
|
-
aiTool:
|
|
519
|
-
|
|
520
|
-
"Open the site's redirect rules as an editable table, validated for chains, loops and rules shadowed by a real page.",
|
|
521
|
-
name: "open_redirects",
|
|
522
|
-
},
|
|
506
|
+
/* No `aiTool`, by §12.4's first deletion rule: this opens a surface for a person, and the
|
|
507
|
+
check it runs on the way is `validate_redirects`, which is projected. */
|
|
523
508
|
run: async () => {
|
|
524
509
|
await openRedirectsGrid();
|
|
525
510
|
reportRedirectProblems(rulesFromConfig(currentConfig()), await projectRoutes());
|
|
@@ -536,8 +521,22 @@ export function redirectsCommands(): AnyCommand[] {
|
|
|
536
521
|
when: (ctx) => ctx.project.open,
|
|
537
522
|
aiTool: {
|
|
538
523
|
description:
|
|
539
|
-
"Check the site's redirect rules for chains, loops and rules shadowed by a real page.
|
|
524
|
+
"Check the site's redirect rules for chains, loops and rules shadowed by a real page. " +
|
|
525
|
+
"Reports each finding as a Problem, and returns the findings as data.",
|
|
540
526
|
name: "validate_redirects",
|
|
527
|
+
/* The only way to check redirects without reading the routes yourself: the Problems store
|
|
528
|
+
filtered by this source, which is what the panel renders. */
|
|
529
|
+
report: () => {
|
|
530
|
+
const findings = problemFindings(REDIRECTS_PROBLEM_SOURCE);
|
|
531
|
+
const n = findings.length;
|
|
532
|
+
return {
|
|
533
|
+
data: findings,
|
|
534
|
+
summary:
|
|
535
|
+
n === 0
|
|
536
|
+
? "No redirect problems: no chains, loops or shadowed rules."
|
|
537
|
+
: `Filed ${n} redirect problem${n === 1 ? "" : "s"} in Problems.`,
|
|
538
|
+
};
|
|
539
|
+
},
|
|
541
540
|
},
|
|
542
541
|
run: async () => {
|
|
543
542
|
const rules = rulesFromConfig(currentConfig());
|
|
@@ -569,11 +568,8 @@ export function redirectsCommands(): AnyCommand[] {
|
|
|
569
568
|
group: "5_data",
|
|
570
569
|
requires: "an open project",
|
|
571
570
|
when: (ctx) => ctx.project.open,
|
|
572
|
-
aiTool:
|
|
573
|
-
|
|
574
|
-
"Import redirect rules from _redirects or CSV text. Rows are staged in the redirect table for review, not written.",
|
|
575
|
-
name: "import_redirects",
|
|
576
|
-
},
|
|
571
|
+
/* No `aiTool`, by §12.4's second deletion rule: without `text`, `run` awaits a paste dialog
|
|
572
|
+
the person answers, and the staged rows are a surface for that person to review. */
|
|
577
573
|
run: async (_ctx, args) => {
|
|
578
574
|
const given = optionalStringArg("redirects.import", args, "text");
|
|
579
575
|
const text = given ?? (await promptRedirectImport());
|
package/src/hosting/layout.ts
CHANGED
|
@@ -173,6 +173,8 @@ export const STUDIO_WORKERS: readonly string[] = [
|
|
|
173
173
|
*/
|
|
174
174
|
export const STUDIO_STYLESHEETS: readonly string[] = [
|
|
175
175
|
"styles/tokens.css",
|
|
176
|
+
/* The frame before the surfaces that fill it: generated from styles/shell-frame.json. */
|
|
177
|
+
"styles/shell-frame.css",
|
|
176
178
|
"styles/shell.css",
|
|
177
179
|
"styles/canvas.css",
|
|
178
180
|
"styles/panels.css",
|
|
@@ -21,21 +21,30 @@
|
|
|
21
21
|
* first language of a project unreachable by every door except a text editor, which is the state
|
|
22
22
|
* this family exists to end.
|
|
23
23
|
*
|
|
24
|
-
* The locale enums are GETTERS
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
24
|
+
* The locale enums are GETTERS — `command-args.ts`'s `derivedEnumProperty`, the one definition of
|
|
25
|
+
* that shape. A command record is built at module scope — `commands/app-commands.ts` builds the
|
|
26
|
+
* whole set before a project is open — so `enumProperty(locales(), …)` would freeze the list at
|
|
27
|
+
* `[]` for the lifetime of the window, a defect this repo has already shipped once
|
|
28
|
+
* (`content/entry-commands.ts` carries the post-mortem). This file used to carry a private copy of
|
|
29
|
+
* the getter; `coerceArgs` reads the getter to resolve a derived list at run time, so a second
|
|
30
|
+
* spelling of it is exactly the kind of drift the coercion exists to end.
|
|
28
31
|
*/
|
|
29
32
|
|
|
30
33
|
import { getPlatform } from "../platform";
|
|
31
34
|
import { getEffectiveLocales } from "../site-context";
|
|
32
|
-
import { localeLabel, translationPathFor } from "@jxsuite/schema/locale";
|
|
35
|
+
import { canonicalizeLocale, localeLabel, translationPathFor } from "@jxsuite/schema/locale";
|
|
33
36
|
import { notify } from "../services/notify";
|
|
34
37
|
import { setActivityTab } from "../shell";
|
|
35
38
|
import { tabOfPane } from "../canvas/canvas-surface";
|
|
36
39
|
import { activeTab } from "../workspace/workspace";
|
|
37
40
|
import { addProjectLocale } from "../settings/locales-section";
|
|
38
|
-
import {
|
|
41
|
+
import {
|
|
42
|
+
argsSchema,
|
|
43
|
+
derivedEnumProperty,
|
|
44
|
+
optionalStringArg,
|
|
45
|
+
stringArg,
|
|
46
|
+
stringProperty,
|
|
47
|
+
} from "../commands/command-args";
|
|
39
48
|
import type { CommandArgValues } from "../commands/command-args";
|
|
40
49
|
import type { AnyCommand, CommandRegistry } from "../commands/registry";
|
|
41
50
|
import type { Tab } from "../tabs/tab";
|
|
@@ -46,35 +55,49 @@ function declaredLocales(): string[] {
|
|
|
46
55
|
}
|
|
47
56
|
|
|
48
57
|
/**
|
|
49
|
-
*
|
|
58
|
+
* Whether the last `i18n.addLocale` wrote `project.json`, for the report.
|
|
50
59
|
*
|
|
51
|
-
*
|
|
52
|
-
*
|
|
60
|
+
* A latch beside `run` rather than a fact on the context, because the context carries
|
|
61
|
+
* `isMultilingual` and not the list: going from one language to two flips it, going from two to
|
|
62
|
+
* three does not. The value is `addProjectLocale`'s own answer, not a second reading of "is it
|
|
63
|
+
* declared" made here: that reading compared against the RESOLVED locales, which carry a
|
|
64
|
+
* `defaultLocale` the raw array may not, so with `{ defaultLocale: "en", locales: ["fr"] }` the
|
|
65
|
+
* write declared `en` and the report said it was already there. One predicate, in the function that
|
|
66
|
+
* writes.
|
|
53
67
|
*/
|
|
54
|
-
|
|
55
|
-
return {
|
|
56
|
-
description,
|
|
57
|
-
get enum() {
|
|
58
|
-
return [...declared()];
|
|
59
|
-
},
|
|
60
|
-
type: "string",
|
|
61
|
-
};
|
|
62
|
-
}
|
|
68
|
+
let _lastAddLocaleWrote = false;
|
|
63
69
|
|
|
64
70
|
/**
|
|
65
|
-
* The document a translation verb acts on: the
|
|
71
|
+
* The document a translation verb acts on, as a project-relative path: the file `path` names, the
|
|
72
|
+
* named pane's, or the focused one's.
|
|
73
|
+
*
|
|
74
|
+
* `path` is how the Languages panel addresses a row — a grid of files against locales has no pane
|
|
75
|
+
* for each square, and the row's own file is the one its cells are about (`panels/i18n-panel.ts`
|
|
76
|
+
* says so at `projectRow`). It is also what a toast's action carries, so "Create Translation" from
|
|
77
|
+
* the warning `openTranslation` raises still writes beside the document that raised it after the
|
|
78
|
+
* author has switched tabs.
|
|
66
79
|
*
|
|
67
80
|
* `pane` is optional because the palette addresses the focus and the pane's own context bar
|
|
68
81
|
* addresses itself. Refusing by name rather than falling back to the active tab is deliberate: a
|
|
69
82
|
* caller that named a pane meant that pane, and quietly translating a different document is worse
|
|
70
|
-
* than doing nothing.
|
|
83
|
+
* than doing nothing. The same rule refuses `path` AND `pane` together: two addresses that could
|
|
84
|
+
* disagree are not a document, and the caller that sent both has already said two things.
|
|
71
85
|
*
|
|
72
86
|
* A tab with no `documentPath` is refused here too. Every one of these verbs is a statement about
|
|
73
87
|
* where a file LIVES, and a document that has never been written has no locale directory to be
|
|
74
88
|
* beside.
|
|
75
89
|
*/
|
|
76
|
-
function
|
|
90
|
+
function addressedDocument(commandId: string, args: CommandArgValues): string {
|
|
91
|
+
const path = optionalStringArg(commandId, args, "path");
|
|
77
92
|
const paneId = optionalStringArg(commandId, args, "pane");
|
|
93
|
+
if (path !== undefined) {
|
|
94
|
+
if (paneId !== undefined) {
|
|
95
|
+
throw new RangeError(
|
|
96
|
+
`command "${commandId}" argument "path": names a file while "pane" names a pane — give one`,
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
return path;
|
|
100
|
+
}
|
|
78
101
|
const tab = paneId === undefined ? (activeTab.value as Tab | null) : tabOfPane(paneId);
|
|
79
102
|
if (!tab) {
|
|
80
103
|
throw new RangeError(
|
|
@@ -86,7 +109,7 @@ function addressedTab(commandId: string, args: CommandArgValues): Tab & { docume
|
|
|
86
109
|
if (tab.documentPath === null) {
|
|
87
110
|
throw new RangeError(`command "${commandId}" needs a document that has been saved to a file`);
|
|
88
111
|
}
|
|
89
|
-
return tab
|
|
112
|
+
return tab.documentPath;
|
|
90
113
|
}
|
|
91
114
|
|
|
92
115
|
/**
|
|
@@ -96,9 +119,9 @@ function addressedTab(commandId: string, args: CommandArgValues): Tab & { docume
|
|
|
96
119
|
* which: an undeclared tag, a project with no locales at all, and a path that cannot carry a locale
|
|
97
120
|
* segment (a component, a layout, a file at the project root).
|
|
98
121
|
*/
|
|
99
|
-
function siblingPath(
|
|
122
|
+
function siblingPath(documentPath: string, locale: string): string | null {
|
|
100
123
|
const i18n = getEffectiveLocales();
|
|
101
|
-
const path = translationPathFor(
|
|
124
|
+
const path = translationPathFor(documentPath, locale, i18n);
|
|
102
125
|
if (path !== null) {
|
|
103
126
|
return path;
|
|
104
127
|
}
|
|
@@ -110,12 +133,12 @@ function siblingPath(tab: Tab & { documentPath: string }, locale: string): strin
|
|
|
110
133
|
});
|
|
111
134
|
return null;
|
|
112
135
|
}
|
|
113
|
-
notify.error(`${
|
|
136
|
+
notify.error(`${documentPath} cannot have a translation.`, {
|
|
114
137
|
detail:
|
|
115
138
|
"A translation is the same file under a locale directory, so only files that live under a " +
|
|
116
139
|
"routed directory — pages and content entries — have one. A layout, a component or a file " +
|
|
117
140
|
"at the project root is shared by every language.",
|
|
118
|
-
path:
|
|
141
|
+
path: documentPath,
|
|
119
142
|
source: "Languages",
|
|
120
143
|
});
|
|
121
144
|
return null;
|
|
@@ -133,6 +156,21 @@ async function fileExists(path: string): Promise<boolean> {
|
|
|
133
156
|
}
|
|
134
157
|
}
|
|
135
158
|
|
|
159
|
+
/**
|
|
160
|
+
* The two ways a translation verb is addressed, as {@link addressedDocument} reads them.
|
|
161
|
+
*
|
|
162
|
+
* Declared on both records because `registry.run` coerces every received key against the schema
|
|
163
|
+
* before `run`: the Languages panel's `{ locale, path }` was an undeclared key — a synchronous
|
|
164
|
+
* refusal out of a click — until `path` was written down here.
|
|
165
|
+
*/
|
|
166
|
+
const ADDRESS_PROPERTIES = {
|
|
167
|
+
pane: stringProperty("Pane whose document to translate. Defaults to the focused one."),
|
|
168
|
+
path: stringProperty(
|
|
169
|
+
"Project-relative path of the document to translate. Defaults to the addressed pane's " +
|
|
170
|
+
"document; not combined with `pane`.",
|
|
171
|
+
),
|
|
172
|
+
};
|
|
173
|
+
|
|
136
174
|
/** The four records. */
|
|
137
175
|
export function i18nCommands(): AnyCommand[] {
|
|
138
176
|
return [
|
|
@@ -143,7 +181,7 @@ export function i18nCommands(): AnyCommand[] {
|
|
|
143
181
|
declaredLocales,
|
|
144
182
|
"The language to open this document's translation in.",
|
|
145
183
|
),
|
|
146
|
-
|
|
184
|
+
...ADDRESS_PROPERTIES,
|
|
147
185
|
},
|
|
148
186
|
["locale"],
|
|
149
187
|
),
|
|
@@ -158,28 +196,29 @@ export function i18nCommands(): AnyCommand[] {
|
|
|
158
196
|
group: "2_navigate",
|
|
159
197
|
requires: "a document open in a project that declares more than one language",
|
|
160
198
|
when: (ctx) => ctx.project.isMultilingual && ctx.document.open,
|
|
161
|
-
aiTool:
|
|
162
|
-
|
|
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
|
-
},
|
|
199
|
+
/* No `aiTool`, by §12.4's first deletion rule: this opens a surface for a person, and the
|
|
200
|
+
model has `open_document` for the file it names. */
|
|
167
201
|
run: async (_ctx, args) => {
|
|
168
|
-
const
|
|
202
|
+
const source = addressedDocument("i18n.openTranslation", args);
|
|
169
203
|
const locale = stringArg("i18n.openTranslation", args, "locale");
|
|
170
|
-
const path = siblingPath(
|
|
204
|
+
const path = siblingPath(source, locale);
|
|
171
205
|
if (path === null) {
|
|
172
206
|
return;
|
|
173
207
|
}
|
|
174
|
-
if (path ===
|
|
175
|
-
notify.info(`${
|
|
208
|
+
if (path === source) {
|
|
209
|
+
notify.info(`${source} is already the ${localeLabel(locale)} copy.`, {
|
|
176
210
|
source: "Languages",
|
|
177
211
|
});
|
|
178
212
|
return;
|
|
179
213
|
}
|
|
180
214
|
if (!(await fileExists(path))) {
|
|
215
|
+
/* `actionArgs` carries the whole address, not just the locale: the toast's button runs
|
|
216
|
+
`registry.run(action, actionArgs)` whenever the author clicks it, and by then the
|
|
217
|
+
focused document may be another file. `locale` is required, so without it the action
|
|
218
|
+
was a refusal before `run`. */
|
|
181
219
|
notify.warn(`There is no ${localeLabel(locale)} translation of this document yet.`, {
|
|
182
220
|
action: "i18n.createTranslation",
|
|
221
|
+
actionArgs: { locale, path: source },
|
|
183
222
|
detail: `Create Translation writes ${path}, seeded from the document you are on.`,
|
|
184
223
|
path,
|
|
185
224
|
source: "Languages",
|
|
@@ -192,12 +231,16 @@ export function i18nCommands(): AnyCommand[] {
|
|
|
192
231
|
title: "Open Translation",
|
|
193
232
|
},
|
|
194
233
|
{
|
|
195
|
-
args: argsSchema(
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
234
|
+
args: argsSchema(
|
|
235
|
+
{
|
|
236
|
+
locale: derivedEnumProperty(
|
|
237
|
+
declaredLocales,
|
|
238
|
+
"The language to create this document's translation in.",
|
|
239
|
+
),
|
|
240
|
+
...ADDRESS_PROPERTIES,
|
|
241
|
+
},
|
|
242
|
+
["locale"],
|
|
243
|
+
),
|
|
201
244
|
category: "File",
|
|
202
245
|
id: "i18n.createTranslation",
|
|
203
246
|
level: "document",
|
|
@@ -208,22 +251,21 @@ export function i18nCommands(): AnyCommand[] {
|
|
|
208
251
|
/* The document history cannot hold this: the change is a file that did not exist, and
|
|
209
252
|
`undo: "project"` would claim `project.json` moved, which it did not. */
|
|
210
253
|
undo: "none",
|
|
211
|
-
aiTool:
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
name: "create_translation",
|
|
216
|
-
},
|
|
254
|
+
/* No `aiTool`, by §12.4's second deletion rule: `createFileIn` awaits the New File prompt
|
|
255
|
+
for the name, which the loop does not count as interactive, and a cancel resolves `null`
|
|
256
|
+
with nothing thrown — a report would describe a file that was never made. An optional
|
|
257
|
+
`name` argument that skips the prompt is the way back in, and is a UX call (issue 273). */
|
|
217
258
|
run: async (_ctx, args) => {
|
|
218
|
-
const
|
|
259
|
+
const source = addressedDocument("i18n.createTranslation", args);
|
|
219
260
|
const locale = stringArg("i18n.createTranslation", args, "locale");
|
|
220
|
-
const path = siblingPath(
|
|
261
|
+
const path = siblingPath(source, locale);
|
|
221
262
|
if (path === null) {
|
|
222
263
|
return;
|
|
223
264
|
}
|
|
224
265
|
if (await fileExists(path)) {
|
|
225
266
|
notify.info(`The ${localeLabel(locale)} translation already exists.`, {
|
|
226
267
|
action: "i18n.openTranslation",
|
|
268
|
+
actionArgs: { locale, path: source },
|
|
227
269
|
path,
|
|
228
270
|
source: "Languages",
|
|
229
271
|
});
|
|
@@ -235,11 +277,11 @@ export function i18nCommands(): AnyCommand[] {
|
|
|
235
277
|
they saved. */
|
|
236
278
|
let content: string;
|
|
237
279
|
try {
|
|
238
|
-
content = await getPlatform().readFile(
|
|
280
|
+
content = await getPlatform().readFile(source);
|
|
239
281
|
} catch {
|
|
240
282
|
// An unreadable source is not a translation that can be seeded, and the path says which.
|
|
241
|
-
notify.error(`Could not read ${
|
|
242
|
-
path:
|
|
283
|
+
notify.error(`Could not read ${source} to copy it.`, {
|
|
284
|
+
path: source,
|
|
243
285
|
source: "Languages",
|
|
244
286
|
});
|
|
245
287
|
return;
|
|
@@ -267,12 +309,7 @@ export function i18nCommands(): AnyCommand[] {
|
|
|
267
309
|
group: "2_view",
|
|
268
310
|
requires: "a project that declares more than one language",
|
|
269
311
|
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
|
-
},
|
|
312
|
+
/* No `aiTool`, by §12.4's first deletion rule: the panel is a surface for a person. */
|
|
276
313
|
/* The panel is off the rail — it spends no rail slot and shifts no ⌘1-8 chord — so this
|
|
277
314
|
command and the generated `panel.focus.i18n` are its only two doors, and both open the
|
|
278
315
|
same one. The TITLES must differ even though the behaviour does not: the palette is a flat
|
|
@@ -305,11 +342,39 @@ export function i18nCommands(): AnyCommand[] {
|
|
|
305
342
|
aiTool: {
|
|
306
343
|
description:
|
|
307
344
|
"Declare a language for this project, adding it to project.json's i18n.locales. Every " +
|
|
308
|
-
"other language surface reads that list."
|
|
345
|
+
"other language surface reads that list. Canonicalizes the tag; a malformed one is " +
|
|
346
|
+
"refused.",
|
|
309
347
|
name: "add_project_locale",
|
|
348
|
+
/* The read is the same one the translation verbs' enum makes — the effective locales —
|
|
349
|
+
so "what did that unlock" is answered from the list the next round's schemas are built
|
|
350
|
+
from. The already-declared case is a statement, not a change: `addProjectLocale` toasts
|
|
351
|
+
and returns `false`, the sentence here says so rather than reporting a declaration, and
|
|
352
|
+
`wrote: []` keeps the ledger from filing a `project.json` the run never touched. */
|
|
353
|
+
report: ({ args }) => {
|
|
354
|
+
const canonical = canonicalizeLocale(stringArg("i18n.addLocale", args, "locale")) ?? "";
|
|
355
|
+
const declared = declaredLocales().join(", ") || canonical;
|
|
356
|
+
return _lastAddLocaleWrote
|
|
357
|
+
? `Declared ${canonical}; project locales are now ${declared}.`
|
|
358
|
+
: {
|
|
359
|
+
summary: `${localeLabel(canonical)} was already one of this project's languages; the locales are ${declared}.`,
|
|
360
|
+
wrote: [],
|
|
361
|
+
};
|
|
362
|
+
},
|
|
310
363
|
},
|
|
311
364
|
run: async (_ctx, args) => {
|
|
312
|
-
|
|
365
|
+
const tag = stringArg("i18n.addLocale", args, "locale");
|
|
366
|
+
/* Refuse by THROWING, not by toasting. `addProjectLocale` notifies a malformed tag and
|
|
367
|
+
returns, because its other caller is the Locales form, which has already refused it under
|
|
368
|
+
the field — but a projected `run` is read by the model, and a toast is a refusal only the
|
|
369
|
+
person can read. The canonical check is the section's own (`canonicalizeLocale`), read
|
|
370
|
+
here rather than respelled. */
|
|
371
|
+
if (canonicalizeLocale(tag) === null) {
|
|
372
|
+
throw new RangeError(
|
|
373
|
+
`command "i18n.addLocale" argument "locale": "${tag}" is not a well-formed BCP 47 ` +
|
|
374
|
+
`tag — a language, optionally a script and a region: fr, pt-BR, zh-Hant`,
|
|
375
|
+
);
|
|
376
|
+
}
|
|
377
|
+
_lastAddLocaleWrote = await addProjectLocale(tag);
|
|
313
378
|
},
|
|
314
379
|
title: "Add Language",
|
|
315
380
|
},
|