@jxsuite/studio 4.1.0 → 5.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/data/elements-meta.json +5 -15
- package/data/html-meta.json +51 -6
- package/dist/chunks/{2020-n6tfwnda.js → 2020-g79n01v9.js} +14 -14
- package/dist/chunks/action-group-sp6tna8v.js +118 -0
- package/dist/chunks/adapter-nj7tnjfn.js +13 -0
- package/dist/chunks/cf-account-picker-qwkm9zrf.js +495 -0
- package/dist/chunks/cf-settings-71bv5zn9.js +20 -0
- package/dist/chunks/color-area-v17df7b8.js +154 -0
- package/dist/chunks/color-field-anwybnkn.js +208 -0
- package/dist/chunks/color-slider-44ez96fc.js +79 -0
- package/dist/chunks/color-xgg3kfw7.js +35 -0
- package/dist/chunks/combobox-5e7jev23.js +236 -0
- package/dist/chunks/components-vj72gqtq.js +20 -0
- package/dist/chunks/content-source-5mex4x1h.js +46 -0
- package/dist/chunks/convert-to-repeater-n64h8znc.js +639 -0
- package/dist/chunks/dialog-s890b918.js +85 -0
- package/dist/chunks/editor-3qhbg51x.js +35 -0
- package/dist/chunks/entry-commands-234hjnqw.js +42 -0
- package/dist/chunks/extension-sections-3hpcambp.js +651 -0
- package/dist/chunks/file-ops-8yhd83xr.js +47 -0
- package/dist/chunks/files-hnxqxtsg.js +72 -0
- package/dist/chunks/format-host-779sfp2n.js +40 -0
- package/dist/chunks/fs-events-b88z7g4h.js +18 -0
- package/dist/chunks/git-panel-xwj8fpab.js +49 -0
- package/dist/chunks/icons-yy10wk9r.js +402 -0
- package/dist/chunks/iframe-entry-15g3n6xv.js +114 -0
- package/dist/chunks/iframe-entry-b27vq81n.js +203 -0
- package/dist/chunks/iframe-entry-nbyxee1y.js +154 -0
- package/dist/chunks/iframe-host-syr0f9sb.js +115 -0
- package/dist/chunks/{index-wcnt3r9g.js → index-mdmyx6s2.js} +11 -11
- package/dist/chunks/index-n4j7qxyr.js +109 -0
- package/dist/chunks/{javascript-q8kpmfah.js → javascript-xvrfrpkb.js} +8 -9
- package/dist/chunks/{jsonMode-dkr040ga.js → jsonMode-tyx2kj6p.js} +526 -527
- package/dist/chunks/jx-validate-j0wxk72w.js +15 -0
- package/dist/chunks/layers-ff81wthn.js +30 -0
- package/dist/chunks/layers-panel-pnnghw12.js +40 -0
- package/dist/chunks/listbox-6v2ac08j.js +44 -0
- package/dist/chunks/lit-html-m244w9nh.js +17 -0
- package/dist/chunks/media-picker-cqhhxhhe.js +33 -0
- package/dist/chunks/menu-9p2w46gj.js +15 -0
- package/dist/chunks/menu-q99sy9rf.js +285 -0
- package/dist/chunks/{monaco-binding-rj6xpx9y.js → monaco-binding-sw6en4dw.js} +12 -15
- package/dist/chunks/monaco-buffer-bhy3hb6m.js +24 -0
- package/dist/chunks/{monaco-setup-vx9bhp1d.js → monaco-setup-8r62fj6y.js} +27 -37
- package/dist/chunks/notify-628t0anh.js +21 -0
- package/dist/chunks/number-field-5cndyft8.js +72 -0
- package/dist/chunks/parse-0zx14y15.js +10 -0
- package/dist/chunks/platform-ts9cg1a4.js +15 -0
- package/dist/chunks/popover-47z3ytva.js +25 -0
- package/dist/chunks/publish-panel-5zt840sy.js +27 -0
- package/dist/chunks/quick-search-3748564r.js +45 -0
- package/dist/chunks/references-qvvxej7h.js +26 -0
- package/dist/chunks/right-panel-eccz92qt.js +45 -0
- package/dist/chunks/section-registry-5pq32t0q.js +25 -0
- package/dist/chunks/select-2r16ez41.js +49 -0
- package/dist/chunks/split-g7nm1rgb.js +191 -0
- package/dist/chunks/studio-0hqbpbd0.js +62 -0
- package/dist/chunks/{studio-kryvsw6j.js → studio-1k325pwf.js} +48 -48
- package/dist/chunks/{studio-b55y6ewx.js → studio-1knfqgy7.js} +58 -58
- package/dist/chunks/{studio-2b946z26.js → studio-1z1kcjv4.js} +3628 -6095
- package/dist/chunks/studio-3773086z.js +111 -0
- package/dist/chunks/{studio-4r1pv6zf.js → studio-38emantv.js} +22 -5
- package/dist/chunks/{studio-x813zp48.js → studio-3rz5md06.js} +30 -30
- package/dist/chunks/{studio-ynxwkrzd.js → studio-4wbb9ct0.js} +1953 -1785
- package/dist/chunks/studio-5te5tqng.js +81 -0
- package/dist/chunks/studio-5wt9nvhd.js +4763 -0
- package/dist/chunks/{studio-p4ngc046.js → studio-6ewqv390.js} +9 -9
- package/dist/chunks/{studio-9ab8gqsm.js → studio-6nzaktvy.js} +7 -7
- package/dist/chunks/studio-6xa21ej9.js +28 -0
- package/dist/chunks/{studio-5ehhackm.js → studio-727xh0e3.js} +19 -19
- package/dist/chunks/{studio-gcye7qka.js → studio-7e11jpa9.js} +21 -21
- package/dist/chunks/{studio-q7v10cg2.js → studio-7r42c6ca.js} +17 -7
- package/dist/chunks/studio-7xnmgv66.js +13615 -0
- package/dist/chunks/studio-8scdew0e.js +258 -0
- package/dist/chunks/{studio-fbf92ckf.js → studio-93zafjcm.js} +275 -163
- package/dist/chunks/{studio-dg7zyt5x.js → studio-98b3z07n.js} +1 -1
- package/dist/chunks/studio-a79k90n9.js +1162 -0
- package/dist/chunks/studio-aj37eer3.js +422 -0
- package/dist/chunks/studio-b0k5tqgp.js +2432 -0
- package/dist/chunks/studio-b4s9eykd.js +2811 -0
- package/dist/chunks/{studio-f3wqjtk5.js → studio-d0300636.js} +5076 -18
- package/dist/chunks/{studio-b9b6t1dg.js → studio-e1f24eff.js} +5664 -5666
- package/dist/chunks/studio-e1pgga3k.js +839 -0
- package/dist/chunks/{studio-g1wdche0.js → studio-esrxgwh6.js} +80 -80
- package/dist/chunks/{studio-q43a5y9h.js → studio-g3jevyjt.js} +16 -16
- package/dist/chunks/studio-gb13095a.js +2806 -0
- package/dist/chunks/{studio-3n4ndrzh.js → studio-h4nvnjvz.js} +303 -303
- package/dist/chunks/{studio-dm19q43r.js → studio-hhvs4sdg.js} +10 -10
- package/dist/chunks/{studio-x4qkdat5.js → studio-js8nv53n.js} +1749 -2481
- package/dist/chunks/{studio-qjy2z9bv.js → studio-jxp12rnj.js} +32 -137
- package/dist/chunks/{studio-trxrabqf.js → studio-k75n7vhp.js} +527 -283
- package/dist/chunks/{studio-q9jd1a60.js → studio-kcgff4r0.js} +15 -18
- package/dist/chunks/studio-kkqkcp3d.js +17668 -0
- package/dist/chunks/studio-mhhyamxf.js +763 -0
- package/dist/chunks/{studio-cft9r4r7.js → studio-nq5yf5mp.js} +22 -22
- package/dist/chunks/{studio-685s0ytq.js → studio-nqgawfks.js} +572 -572
- package/dist/chunks/studio-nzzpvzx9.js +185 -0
- package/dist/chunks/{studio-xrapxwwc.js → studio-p1dw8wfw.js} +55 -29
- package/dist/chunks/{studio-3bqpr0zh.js → studio-pxbgypmg.js} +299 -110
- package/dist/chunks/studio-q0a3yk4n.js +33 -0
- package/dist/chunks/{studio-wcy8trfx.js → studio-q3x06vmj.js} +23 -22
- package/dist/chunks/{studio-6yw4y3my.js → studio-qhhm6hbt.js} +8 -8
- package/dist/chunks/studio-qk4bfsq2.js +362 -0
- package/dist/chunks/{studio-msd847zn.js → studio-qk90fgqm.js} +361 -90
- package/dist/chunks/{studio-jkftxyvz.js → studio-r6nvacqs.js} +5861 -2154
- package/dist/chunks/{studio-53n8bp04.js → studio-r6xmmtfh.js} +1 -1
- package/dist/chunks/{studio-tvgyw9xw.js → studio-rnyf3f8e.js} +83 -250
- package/dist/chunks/studio-rs76k67r.js +12 -0
- package/dist/chunks/studio-sbjyc8bt.js +954 -0
- package/dist/chunks/{studio-1wagb550.js → studio-syg2tadj.js} +11 -11
- package/dist/chunks/{studio-t5wqwzdh.js → studio-tjjk7jvk.js} +1 -1
- package/dist/chunks/studio-tqgryxwg.js +1171 -0
- package/dist/chunks/studio-try13h8c.js +8448 -0
- package/dist/chunks/studio-vfq8qpjt.js +1219 -0
- package/dist/chunks/studio-vhv5tgxm.js +51 -0
- package/dist/chunks/{studio-ahn3pdgx.js → studio-vw7mzp6z.js} +52 -38
- package/dist/chunks/studio-wqpngpsk.js +174 -0
- package/dist/chunks/studio-wqz6dggm.js +1356 -0
- package/dist/chunks/{studio-92ab2jqe.js → studio-y9zedyjn.js} +14 -14
- package/dist/chunks/studio-yxa81f45.js +12 -0
- package/dist/chunks/studio-zdn2g6dt.js +148 -0
- package/dist/chunks/swatch-group-t0n6h2rn.js +139 -0
- package/dist/chunks/tabs-wbp1cdws.js +156 -0
- package/dist/chunks/textfield-abk6qyee.js +73 -0
- package/dist/chunks/toast-780pvfbv.js +27 -0
- package/dist/chunks/toast-host-3sqv46sn.js +116 -0
- package/dist/chunks/toolbar-xbh5bhtr.js +194 -0
- package/dist/chunks/tooltip-eptb614w.js +369 -0
- package/dist/chunks/tree-a73p0pqm.js +367 -0
- package/dist/chunks/{tsMode-76kr53q0.js → tsMode-jy4m86rv.js} +83 -85
- package/dist/chunks/workspace-t55jdjbx.js +69 -0
- package/dist/chunks/{ws-client-6shc5rze.js → ws-client-ny4zc51r.js} +20 -22
- package/dist/iframe-entry.js +1873 -673
- package/dist/studio.js +52757 -36535
- package/dist/workers/editor.worker.js +1040 -1085
- package/dist/workers/json.worker.js +1946 -1991
- package/dist/workers/ts.worker.js +4960 -5005
- package/index.html +1 -0
- package/package.json +18 -52
- package/src/about/about-modal.ts +72 -123
- package/src/browse/library-commands.ts +20 -49
- package/src/browse/library-layouts.ts +87 -218
- package/src/browse/library-pane.ts +406 -438
- package/src/canvas/canvas-helpers.ts +0 -49
- package/src/canvas/canvas-live-render.ts +25 -2
- package/src/canvas/canvas-render.ts +666 -231
- package/src/canvas/canvas-surface.ts +0 -1
- package/src/canvas/canvas-utils.ts +333 -113
- package/src/canvas/dialog-path.ts +76 -0
- package/src/canvas/dialog-state.ts +67 -0
- package/src/canvas/diff-marks.ts +252 -0
- package/src/canvas/diff-toolbar.ts +349 -0
- package/src/canvas/diff-view.ts +123 -0
- package/src/canvas/edit-width-drag.ts +187 -0
- package/src/canvas/edit-width.ts +150 -0
- package/src/canvas/iframe-entry.ts +125 -8
- package/src/canvas/iframe-host.ts +271 -15
- package/src/canvas/iframe-interaction.ts +133 -13
- package/src/canvas/iframe-patch.ts +7 -1
- package/src/canvas/iframe-position.ts +5 -6
- package/src/canvas/iframe-protocol.ts +106 -5
- package/src/canvas/iframe-render.ts +373 -5
- package/src/canvas/iframe-slash.ts +2 -2
- package/src/canvas/iframe-subtree.ts +5 -8
- package/src/canvas/path-mapping.ts +25 -3
- package/src/canvas/popover-path.ts +106 -0
- package/src/canvas/popover-state.ts +155 -0
- package/src/canvas/surface-registry.ts +21 -10
- package/src/collab/presence-chips.ts +51 -73
- package/src/commands/app-commands.ts +10 -0
- package/src/commands/budget.ts +12 -0
- package/src/commands/command-args.ts +404 -6
- package/src/commands/defaults.ts +44 -14
- package/src/commands/live-context.ts +11 -5
- package/src/commands/reference.ts +12 -2
- package/src/commands/registry.ts +177 -10
- package/src/commands/run-reported.ts +120 -0
- package/src/content/entry-commands.ts +16 -23
- package/src/content/entry-editor.ts +144 -101
- package/src/editor/canvas-slash-bridge.ts +2 -2
- package/src/editor/context-menu.ts +49 -200
- package/src/editor/convert-to-component.ts +42 -82
- package/src/editor/convert-to-repeater.ts +132 -173
- package/src/editor/inline-edit.ts +11 -0
- package/src/editor/shortcuts.ts +76 -49
- package/src/editor/slash-menu.ts +150 -157
- package/src/files/components.ts +39 -0
- package/src/files/file-ops.ts +117 -11
- package/src/files/files.ts +944 -660
- package/src/files/json-layout.ts +474 -0
- package/src/files/serialize-document.ts +8 -1
- package/src/format/convert-file.ts +16 -10
- package/src/format/format-host.ts +50 -1
- package/src/github/github-auth.ts +71 -29
- package/src/github/github-publish.ts +57 -65
- package/src/grid/cell-editors.ts +46 -4
- package/src/grid/cell-popovers.ts +65 -62
- package/src/grid/grid-open.ts +86 -64
- package/src/grid/grid-panel.ts +390 -469
- package/src/grid/redirects-grid.ts +40 -44
- package/src/hosting/layout.ts +2 -0
- package/src/i18n/i18n-commands.ts +137 -62
- package/src/media/media-pane.ts +83 -133
- package/src/new-project/add-repo-modal.ts +125 -176
- package/src/new-project/import-tab.ts +181 -252
- package/src/new-project/location-fields.ts +93 -160
- package/src/new-project/new-project-modal.ts +376 -367
- package/src/packages/jxsuite-update.ts +76 -18
- package/src/packages/pull-package-sync.ts +5 -1
- package/src/panels/activity-panel.ts +137 -104
- package/src/panels/ai-chat/chat-markdown.ts +15 -13
- package/src/panels/ai-chat/chat-view.ts +307 -472
- package/src/panels/ai-chat/composer.ts +175 -163
- package/src/panels/ai-chat/sessions-view.ts +31 -62
- package/src/panels/ai-panel.ts +213 -185
- package/src/panels/block-action-bar.ts +444 -645
- package/src/panels/bottom-dock.ts +112 -47
- package/src/panels/chat-panel.ts +19 -14
- package/src/panels/data-explorer.ts +141 -102
- package/src/panels/data-grid.ts +183 -150
- package/src/panels/dnd.ts +75 -20
- package/src/panels/editors.ts +26 -19
- package/src/panels/elements-panel.ts +243 -186
- package/src/panels/empty-state.ts +26 -42
- package/src/panels/events-panel.ts +950 -729
- package/src/panels/formula-workspace.ts +434 -207
- package/src/panels/frontmatter-fields.ts +185 -153
- package/src/panels/frontmatter-panel.ts +411 -187
- package/src/panels/git-diff-open.ts +148 -0
- package/src/panels/git-panel.ts +679 -605
- package/src/panels/head-panel.ts +617 -435
- package/src/panels/i18n-panel.ts +148 -135
- package/src/panels/imports-panel.ts +388 -414
- package/src/panels/jump-bar.ts +175 -147
- package/src/panels/layers-panel.ts +785 -671
- package/src/panels/left-panel.ts +166 -94
- package/src/panels/navigator-panels.ts +1 -1
- package/src/panels/pane-context.ts +529 -677
- package/src/panels/pane-grid.ts +265 -241
- package/src/panels/panel-registry.ts +15 -4
- package/src/panels/problems-panel.ts +181 -99
- package/src/panels/properties-panel.ts +1525 -966
- package/src/panels/provenance.ts +31 -113
- package/src/panels/quick-search.ts +223 -184
- package/src/panels/right-panel.ts +135 -169
- package/src/panels/seo-modal.ts +346 -167
- package/src/panels/settings-menu.ts +114 -661
- package/src/panels/settings-pane.ts +102 -86
- package/src/panels/signals-panel.ts +1318 -1172
- package/src/panels/statement-editor.ts +556 -428
- package/src/panels/style-panel.ts +1367 -630
- package/src/panels/style-utils.ts +36 -32
- package/src/panels/stylebook-doc.ts +30 -73
- package/src/panels/stylebook-layers-panel.ts +202 -109
- package/src/panels/stylebook-panel.ts +124 -88
- package/src/panels/tab-strip.ts +386 -288
- package/src/platforms/cloud.ts +106 -16
- package/src/platforms/devserver.ts +13 -0
- package/src/publish/deploy-checklist.ts +124 -78
- package/src/publish/publish-commands.ts +4 -12
- package/src/publish/publish-panel.ts +134 -328
- package/src/services/a11y-report.ts +100 -43
- package/src/services/ai-command-tools.ts +538 -0
- package/src/services/ai-project-tools.ts +8 -2
- package/src/services/ai-session-store.ts +6 -0
- package/src/services/ai-system-prompt.ts +112 -24
- package/src/services/ai-tools.ts +36 -212
- package/src/services/ai-write-report.ts +174 -0
- package/src/services/document-assistant.ts +59 -8
- package/src/services/idle.ts +16 -14
- package/src/services/live-surfaces.ts +237 -0
- package/src/services/model-uri.ts +75 -0
- package/src/services/notify.ts +63 -6
- package/src/services/popover-report.ts +325 -0
- package/src/services/surface-registry.ts +56 -0
- package/src/services/tool-executor.ts +6 -0
- package/src/settings/contexts-section.ts +301 -299
- package/src/settings/contributed-section.ts +361 -222
- package/src/settings/css-vars-editor.ts +320 -325
- package/src/settings/defs-editor.ts +572 -535
- package/src/settings/dependencies-editor.ts +79 -107
- package/src/settings/extension-commands.ts +379 -0
- package/src/settings/extension-rows.ts +113 -0
- package/src/settings/extensions-section.ts +287 -0
- package/src/settings/general-settings.ts +130 -181
- package/src/settings/head-editor.ts +10 -305
- package/src/settings/locales-section.ts +146 -196
- package/src/settings/preferences-accounts.ts +1 -1
- package/src/settings/preferences-dialog.ts +350 -330
- package/src/settings/project-sections.ts +108 -181
- package/src/settings/schema-field-ui.ts +11 -399
- package/src/settings/section-registry.ts +8 -1
- package/src/settings/settings-document.ts +31 -29
- package/src/shell/tree.ts +42 -87
- package/src/shell.ts +48 -36
- package/src/studio.ts +104 -69
- package/src/style/token-ref.ts +0 -39
- package/src/surfaces/about.json +263 -0
- package/src/surfaces/about.ts +163 -0
- package/src/surfaces/add-repo.json +486 -0
- package/src/surfaces/add-repo.ts +236 -0
- package/src/surfaces/ai-chat.json +2185 -0
- package/src/surfaces/ai-chat.ts +549 -0
- package/src/surfaces/ai-credentials-form.json +332 -0
- package/src/surfaces/ai-credentials-form.ts +151 -0
- package/src/surfaces/ai-managed-connect.json +108 -0
- package/src/surfaces/ai-managed-connect.ts +123 -0
- package/src/surfaces/ai-model-picker.json +114 -0
- package/src/surfaces/ai-model-picker.ts +139 -0
- package/src/surfaces/block-action-bar.json +640 -0
- package/src/surfaces/block-action-bar.ts +368 -0
- package/src/surfaces/bottom-dock.json +154 -0
- package/src/surfaces/bottom-dock.ts +125 -0
- package/src/surfaces/canvas-stage.json +444 -0
- package/src/surfaces/canvas-stage.ts +253 -0
- package/src/surfaces/cf-account-picker.json +300 -0
- package/src/surfaces/cf-account-picker.ts +214 -0
- package/src/surfaces/commandbar.json +985 -0
- package/src/{panels/toolbar.ts → surfaces/commandbar.ts} +417 -391
- package/src/surfaces/convert-repeater.json +309 -0
- package/src/surfaces/convert-repeater.ts +276 -0
- package/src/surfaces/data-actions.json +157 -0
- package/src/surfaces/data-actions.ts +115 -0
- package/src/surfaces/dialog.json +289 -0
- package/src/surfaces/dialog.ts +343 -0
- package/src/surfaces/diff-toolbar.json +266 -0
- package/src/surfaces/diff-toolbar.ts +139 -0
- package/src/surfaces/doc-header.json +739 -0
- package/src/surfaces/doc-header.ts +223 -0
- package/src/surfaces/empty-state.json +152 -0
- package/src/surfaces/empty-state.ts +173 -0
- package/src/surfaces/entry-editor.json +281 -0
- package/src/surfaces/entry-editor.ts +191 -0
- package/src/surfaces/expression-editor.json +977 -0
- package/src/surfaces/expression-editor.ts +266 -0
- package/src/surfaces/files-panel.json +592 -0
- package/src/surfaces/files-panel.ts +301 -0
- package/src/surfaces/formula-palette.json +364 -0
- package/src/surfaces/formula-palette.ts +340 -0
- package/src/surfaces/git-panel.json +1822 -0
- package/src/surfaces/git-panel.ts +272 -0
- package/src/surfaces/github-auth.json +112 -0
- package/src/surfaces/github-auth.ts +139 -0
- package/src/surfaces/github-publish.json +206 -0
- package/src/surfaces/github-publish.ts +169 -0
- package/src/surfaces/grid-cell.json +218 -0
- package/src/surfaces/grid-cell.ts +120 -0
- package/src/surfaces/grid-open.json +147 -0
- package/src/surfaces/grid-open.ts +87 -0
- package/src/surfaces/grid-panel.json +706 -0
- package/src/surfaces/grid-panel.ts +206 -0
- package/src/surfaces/grid-replace.json +179 -0
- package/src/surfaces/grid-replace.ts +89 -0
- package/src/surfaces/grid-views.json +446 -0
- package/src/surfaces/grid-views.ts +172 -0
- package/src/surfaces/inspector-dock.json +187 -0
- package/src/surfaces/inspector-dock.ts +161 -0
- package/src/surfaces/jump-bar.json +243 -0
- package/src/surfaces/jump-bar.ts +129 -0
- package/src/surfaces/jxsuite-update.json +146 -0
- package/src/surfaces/jxsuite-update.ts +149 -0
- package/src/surfaces/library-pane.json +1509 -0
- package/src/surfaces/library-pane.ts +363 -0
- package/src/surfaces/logic-panel.json +1949 -0
- package/src/surfaces/logic-panel.ts +369 -0
- package/src/surfaces/logic-workspace.json +685 -0
- package/src/surfaces/logic-workspace.ts +238 -0
- package/src/surfaces/media-browser.json +303 -0
- package/src/surfaces/media-browser.ts +145 -0
- package/src/surfaces/media-field.json +163 -0
- package/src/surfaces/media-field.ts +116 -0
- package/src/surfaces/media-pane.json +513 -0
- package/src/surfaces/media-pane.ts +197 -0
- package/src/surfaces/menu.json +232 -0
- package/src/surfaces/menu.ts +375 -0
- package/src/surfaces/navigator-dock.json +113 -0
- package/src/surfaces/navigator-dock.ts +130 -0
- package/src/surfaces/new-project.json +1654 -0
- package/src/surfaces/new-project.ts +411 -0
- package/src/surfaces/palette.json +535 -0
- package/src/surfaces/pane-context.json +1497 -0
- package/src/surfaces/pane-context.ts +513 -0
- package/src/surfaces/pane-grid.json +188 -0
- package/src/surfaces/pane-grid.ts +250 -0
- package/src/surfaces/panel-activity.json +563 -0
- package/src/surfaces/panel-activity.ts +187 -0
- package/src/surfaces/panel-data.json +141 -0
- package/src/surfaces/panel-data.ts +156 -0
- package/src/surfaces/panel-deploy-checklist.json +283 -0
- package/src/surfaces/panel-deploy-checklist.ts +175 -0
- package/src/surfaces/panel-elements.json +367 -0
- package/src/surfaces/panel-elements.ts +175 -0
- package/src/surfaces/panel-i18n.json +569 -0
- package/src/surfaces/panel-i18n.ts +212 -0
- package/src/surfaces/panel-imports.json +780 -0
- package/src/surfaces/panel-imports.ts +209 -0
- package/src/surfaces/panel-outline.json +734 -0
- package/src/surfaces/panel-outline.ts +326 -0
- package/src/surfaces/panel-page.json +1017 -0
- package/src/surfaces/panel-page.ts +240 -0
- package/src/surfaces/panel-problems.json +497 -0
- package/src/surfaces/panel-problems.ts +157 -0
- package/src/surfaces/panel-signals.json +1973 -0
- package/src/surfaces/panel-signals.ts +436 -0
- package/src/surfaces/panel-stylebook-layers.json +317 -0
- package/src/surfaces/panel-stylebook-layers.ts +155 -0
- package/src/surfaces/preferences.json +850 -0
- package/src/surfaces/preferences.ts +332 -0
- package/src/surfaces/progress-modal.json +110 -0
- package/src/surfaces/progress-modal.ts +150 -0
- package/src/surfaces/properties-panel.json +1578 -0
- package/src/surfaces/properties-panel.ts +337 -0
- package/src/surfaces/publish.json +945 -0
- package/src/surfaces/publish.ts +392 -0
- package/src/surfaces/push-plan.json +110 -0
- package/src/surfaces/push-plan.ts +87 -0
- package/src/surfaces/rail.json +255 -0
- package/src/surfaces/rail.ts +206 -0
- package/src/surfaces/reference-field.json +191 -0
- package/src/surfaces/reference-field.ts +168 -0
- package/src/surfaces/schema-builder.json +1011 -0
- package/src/surfaces/schema-builder.ts +181 -0
- package/src/surfaces/schema-form.json +1013 -0
- package/src/surfaces/schema-form.ts +287 -0
- package/src/surfaces/secret-field.json +60 -0
- package/src/surfaces/secret-field.ts +146 -0
- package/src/surfaces/seo.json +932 -0
- package/src/surfaces/seo.ts +334 -0
- package/src/surfaces/settings-contexts.json +538 -0
- package/src/surfaces/settings-contexts.ts +196 -0
- package/src/surfaces/settings-contributed.json +489 -0
- package/src/surfaces/settings-contributed.ts +199 -0
- package/src/surfaces/settings-css-vars.json +820 -0
- package/src/surfaces/settings-css-vars.ts +199 -0
- package/src/surfaces/settings-defs.json +1363 -0
- package/src/surfaces/settings-defs.ts +232 -0
- package/src/surfaces/settings-deploy.json +108 -0
- package/src/surfaces/settings-deploy.ts +135 -0
- package/src/surfaces/settings-extensions.json +486 -0
- package/src/surfaces/settings-extensions.ts +201 -0
- package/src/surfaces/settings-head.json +779 -0
- package/src/surfaces/settings-head.ts +397 -0
- package/src/surfaces/settings-locales.json +420 -0
- package/src/surfaces/settings-locales.ts +137 -0
- package/src/surfaces/settings-overview.json +423 -0
- package/src/surfaces/settings-overview.ts +218 -0
- package/src/surfaces/settings-packages.json +549 -0
- package/src/surfaces/settings-packages.ts +158 -0
- package/src/surfaces/settings-pane.json +147 -0
- package/src/surfaces/settings-pane.ts +150 -0
- package/src/surfaces/settings-rawjson.json +104 -0
- package/src/surfaces/settings-rawjson.ts +107 -0
- package/src/surfaces/shell.json +99 -0
- package/src/surfaces/shell.ts +30 -0
- package/src/surfaces/slash-menu.json +180 -0
- package/src/surfaces/slash-menu.ts +272 -0
- package/src/surfaces/statements.json +607 -0
- package/src/surfaces/statements.ts +238 -0
- package/src/surfaces/statusbar.json +94 -0
- package/src/{panels → surfaces}/statusbar.ts +164 -90
- package/src/surfaces/style-panel.json +1643 -0
- package/src/surfaces/style-panel.ts +338 -0
- package/src/surfaces/stylebook-chrome.json +122 -0
- package/src/surfaces/stylebook-chrome.ts +122 -0
- package/src/surfaces/tab-strip.json +448 -0
- package/src/surfaces/tab-strip.ts +200 -0
- package/src/surfaces/target-line.json +419 -0
- package/src/surfaces/target-line.ts +349 -0
- package/src/surfaces/toasts.json +189 -0
- package/src/surfaces/welcome.json +571 -0
- package/src/surfaces/welcome.ts +338 -0
- package/src/tabs/project-config.ts +111 -21
- package/src/tabs/tab.ts +52 -1
- package/src/types.ts +22 -0
- package/src/ui/ai-credentials-form.ts +104 -100
- package/src/ui/ai-managed-connect.ts +54 -36
- package/src/ui/ai-model-picker.ts +75 -47
- package/src/ui/cf-account-picker.ts +76 -141
- package/src/ui/color-selector.ts +80 -301
- package/src/ui/dynamic-slot.ts +43 -283
- package/src/ui/expression-editor.ts +797 -576
- package/src/ui/field-input.ts +8 -181
- package/src/ui/form-controls.ts +838 -366
- package/src/ui/formula-chips.ts +80 -85
- package/src/ui/kit.ts +33 -0
- package/src/ui/layers.ts +296 -593
- package/src/ui/media-picker.ts +203 -284
- package/src/ui/panel-resize.ts +251 -64
- package/src/ui/popover-surface.ts +153 -0
- package/src/ui/progress-modal.ts +22 -60
- package/src/ui/regions.ts +13 -7
- package/src/ui/schema-form.ts +906 -440
- package/src/ui/surface.ts +122 -0
- package/src/ui/unit-selector.ts +15 -131
- package/src/ui/value-source.ts +14 -0
- package/src/ui/virtual-window.ts +88 -9
- package/src/utils/canvas-media.ts +72 -0
- package/src/utils/edit-display.ts +7 -2
- package/src/utils/element-selectors.ts +69 -0
- package/src/utils/link-target.ts +2 -2
- package/src/utils/studio-utils.ts +0 -10
- package/src/view.ts +15 -0
- package/src/workspace/pane-derive.ts +36 -14
- package/src/workspace/workspace.ts +75 -6
- package/styles/canvas.css +72 -467
- package/styles/forced-colors.css +48 -82
- package/styles/forced-colors.json +41 -0
- package/styles/inspector.css +2 -1301
- package/styles/overlays.css +96 -2823
- package/styles/panels.css +6 -1423
- package/styles/shell-frame.css +272 -0
- package/styles/shell-frame.json +227 -0
- package/styles/shell.css +0 -1568
- package/styles/tokens.css +65 -136
- package/styles/tokens.json +84 -0
- package/dist/chunks/Overlay.dev-etqjwyf9.js +0 -23
- package/dist/chunks/adapter-jkcyhgtr.js +0 -14
- package/dist/chunks/cf-account-picker-en86v7x7.js +0 -163
- package/dist/chunks/cf-settings-45fgyx8y.js +0 -21
- package/dist/chunks/components-zmx10t62.js +0 -21
- package/dist/chunks/content-source-48xg86wj.js +0 -49
- package/dist/chunks/convert-to-repeater-43tfn7cs.js +0 -268
- package/dist/chunks/editor-cptq5jp1.js +0 -37
- package/dist/chunks/entry-commands-e63f1xc0.js +0 -46
- package/dist/chunks/extension-sections-txv08xxg.js +0 -311
- package/dist/chunks/file-ops-wbh4hhsx.js +0 -48
- package/dist/chunks/files-3kfkwhk4.js +0 -93
- package/dist/chunks/flow-qbfgrpeh.js +0 -634
- package/dist/chunks/focus-trap.esm-9t2drp0g.js +0 -1025
- package/dist/chunks/focus-visible-6eg70z18.js +0 -167
- package/dist/chunks/format-host-w16q81tf.js +0 -43
- package/dist/chunks/fs-events-hrrg328g.js +0 -21
- package/dist/chunks/git-panel-532whr1y.js +0 -59
- package/dist/chunks/index-zqxmqxmh.js +0 -109
- package/dist/chunks/jx-validate-8er6gbxy.js +0 -19
- package/dist/chunks/layers-panel-07hm7g5j.js +0 -67
- package/dist/chunks/layers-q75tj2mf.js +0 -45
- package/dist/chunks/lit-html-j055mkh8.js +0 -22
- package/dist/chunks/monaco-buffer-dqw0xxpx.js +0 -25
- package/dist/chunks/notify-yjm79n4s.js +0 -30
- package/dist/chunks/parse-24d0gay3.js +0 -19
- package/dist/chunks/platform-ba1j1gbh.js +0 -16
- package/dist/chunks/publish-panel-v9st96ja.js +0 -29
- package/dist/chunks/quick-search-zccjp6gv.js +0 -66
- package/dist/chunks/references-3qx8fkyp.js +0 -29
- package/dist/chunks/right-panel-vm3b6kwy.js +0 -46
- package/dist/chunks/section-registry-sx1ykvkw.js +0 -30
- package/dist/chunks/sp-overlay.dev-qgvhnxf4.js +0 -18
- package/dist/chunks/sp-popover.dev-n2etmqdp.js +0 -9
- package/dist/chunks/sp-progress-circle.dev-hryhj0es.js +0 -15
- package/dist/chunks/sp-tooltip.dev-4sastdnw.js +0 -15
- package/dist/chunks/sp-tray.dev-tkbscm06.js +0 -199
- package/dist/chunks/studio-0a5qrh01.js +0 -3
- package/dist/chunks/studio-0bq6eh7v.js +0 -12
- package/dist/chunks/studio-18j3bmcz.js +0 -14
- package/dist/chunks/studio-1ngbejft.js +0 -181
- package/dist/chunks/studio-4b5z1x43.js +0 -424
- package/dist/chunks/studio-4n2b5gzb.js +0 -357
- package/dist/chunks/studio-4rzyrtjz.js +0 -426
- package/dist/chunks/studio-5fx3g9jg.js +0 -4325
- package/dist/chunks/studio-5myknm0a.js +0 -1903
- package/dist/chunks/studio-7afd21nw.js +0 -67
- package/dist/chunks/studio-7nte2hj4.js +0 -613
- package/dist/chunks/studio-8jpzqk5s.js +0 -128
- package/dist/chunks/studio-8q517dfr.js +0 -24
- package/dist/chunks/studio-950k0dx6.js +0 -6939
- package/dist/chunks/studio-9n4mrmnb.js +0 -184
- package/dist/chunks/studio-a0tswy0w.js +0 -58
- package/dist/chunks/studio-ahnzd9rg.js +0 -23
- package/dist/chunks/studio-bgxt93ga.js +0 -62
- package/dist/chunks/studio-cmb03bg5.js +0 -13890
- package/dist/chunks/studio-d1ks410h.js +0 -175
- package/dist/chunks/studio-ef49pnzx.js +0 -387
- package/dist/chunks/studio-eqq1w638.js +0 -113
- package/dist/chunks/studio-ew0djmhg.js +0 -341
- package/dist/chunks/studio-gfgb8pe6.js +0 -1652
- package/dist/chunks/studio-h4rxscfc.js +0 -10
- package/dist/chunks/studio-jc994dnr.js +0 -1066
- package/dist/chunks/studio-kyh9avvv.js +0 -28
- package/dist/chunks/studio-m3hwn7y1.js +0 -120
- package/dist/chunks/studio-mtfnaqs9.js +0 -659
- package/dist/chunks/studio-n6j9t10q.js +0 -318
- package/dist/chunks/studio-n8b9wqwy.js +0 -291
- package/dist/chunks/studio-qcy05dp8.js +0 -1743
- package/dist/chunks/studio-qq6jym04.js +0 -53
- package/dist/chunks/studio-rdx8jcxy.js +0 -83
- package/dist/chunks/studio-rn9ta2mz.js +0 -111
- package/dist/chunks/studio-t7qb9db8.js +0 -665
- package/dist/chunks/studio-tmc5emrw.js +0 -8
- package/dist/chunks/studio-z6nw2ek2.js +0 -18
- package/dist/chunks/studio-zczps70q.js +0 -378
- package/dist/chunks/studio-zqazsct2.js +0 -1823
- package/dist/chunks/workspace-fjx52ryv.js +0 -89
- package/src/panels/activity-bar.ts +0 -251
- package/src/panels/panel-scheduler.ts +0 -219
- package/src/panels/style-inputs.ts +0 -237
- package/src/panels/target-line.ts +0 -274
- package/src/panels/welcome-screen.ts +0 -346
- package/src/ui/button-group.ts +0 -102
- package/src/ui/choice-field.ts +0 -72
- package/src/ui/field-row.ts +0 -249
- package/src/ui/formula-palette.ts +0 -213
- package/src/ui/icons.ts +0 -52
- package/src/ui/jx-theme.ts +0 -130
- package/src/ui/spectrum.ts +0 -340
- package/src/ui/value-selector.ts +0 -174
- package/src/ui/widgets.ts +0 -172
- /package/dist/chunks/{javascript-s56a8dpk.css → javascript-4abzjcy9.css} +0 -0
- /package/dist/chunks/{jsonMode-zr9sw0c7.css → jsonMode-vvmpmk34.css} +0 -0
- /package/dist/chunks/{monaco-setup-pav68602.css → monaco-setup-8vbyqnhr.css} +0 -0
- /package/dist/chunks/{tsMode-ef187txx.css → tsMode-hnxxb73h.css} +0 -0
|
@@ -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
|
),
|
|
@@ -157,29 +195,38 @@ export function i18nCommands(): AnyCommand[] {
|
|
|
157
195
|
menus: ["context/tab", "palette"],
|
|
158
196
|
group: "2_navigate",
|
|
159
197
|
requires: "a document open in a project that declares more than one language",
|
|
198
|
+
/* `ctx.document.open` stays in the gate although `path` no longer needs a document open
|
|
199
|
+
(issue 333). `registry.run` evaluates `when` BEFORE `run` and refuses with
|
|
200
|
+
`CommandUnavailableError`, so relaxing it is the only way `{ locale, path }` could run with
|
|
201
|
+
no document open — and `when` reads the context, not the arguments, so the same relaxation
|
|
202
|
+
would light the palette row too, where the record runs with no `path` and would then throw
|
|
203
|
+
`addressedDocument`'s "needs a document open" out of a click instead of standing disabled
|
|
204
|
+
with its `requires` sentence. The palette's availability is the person's contract; an
|
|
205
|
+
argument-only gate needs a shape the registry does not have. Same on `createTranslation`. */
|
|
160
206
|
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
|
-
},
|
|
207
|
+
/* No `aiTool`, by §12.4's first deletion rule: this opens a surface for a person, and the
|
|
208
|
+
model has `open_document` for the file it names. */
|
|
167
209
|
run: async (_ctx, args) => {
|
|
168
|
-
const
|
|
210
|
+
const source = addressedDocument("i18n.openTranslation", args);
|
|
169
211
|
const locale = stringArg("i18n.openTranslation", args, "locale");
|
|
170
|
-
const path = siblingPath(
|
|
212
|
+
const path = siblingPath(source, locale);
|
|
171
213
|
if (path === null) {
|
|
172
214
|
return;
|
|
173
215
|
}
|
|
174
|
-
if (path ===
|
|
175
|
-
notify.info(`${
|
|
216
|
+
if (path === source) {
|
|
217
|
+
notify.info(`${source} is already the ${localeLabel(locale)} copy.`, {
|
|
176
218
|
source: "Languages",
|
|
177
219
|
});
|
|
178
220
|
return;
|
|
179
221
|
}
|
|
180
222
|
if (!(await fileExists(path))) {
|
|
223
|
+
/* `actionArgs` carries the whole address, not just the locale: the toast's button runs
|
|
224
|
+
`registry.run(action, actionArgs)` whenever the author clicks it, and by then the
|
|
225
|
+
focused document may be another file. `locale` is required, so without it the action
|
|
226
|
+
was a refusal before `run`. */
|
|
181
227
|
notify.warn(`There is no ${localeLabel(locale)} translation of this document yet.`, {
|
|
182
228
|
action: "i18n.createTranslation",
|
|
229
|
+
actionArgs: { locale, path: source },
|
|
183
230
|
detail: `Create Translation writes ${path}, seeded from the document you are on.`,
|
|
184
231
|
path,
|
|
185
232
|
source: "Languages",
|
|
@@ -192,38 +239,43 @@ export function i18nCommands(): AnyCommand[] {
|
|
|
192
239
|
title: "Open Translation",
|
|
193
240
|
},
|
|
194
241
|
{
|
|
195
|
-
args: argsSchema(
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
242
|
+
args: argsSchema(
|
|
243
|
+
{
|
|
244
|
+
locale: derivedEnumProperty(
|
|
245
|
+
declaredLocales,
|
|
246
|
+
"The language to create this document's translation in.",
|
|
247
|
+
),
|
|
248
|
+
...ADDRESS_PROPERTIES,
|
|
249
|
+
},
|
|
250
|
+
["locale"],
|
|
251
|
+
),
|
|
201
252
|
category: "File",
|
|
202
253
|
id: "i18n.createTranslation",
|
|
203
254
|
level: "document",
|
|
204
255
|
menus: ["palette"],
|
|
205
256
|
group: "2_navigate",
|
|
206
257
|
requires: "a document open in a project that declares more than one language",
|
|
258
|
+
// `document.open` stays for the reason `i18n.openTranslation` gives: the gate runs before
|
|
259
|
+
// `run`, and it cannot see `path`.
|
|
207
260
|
when: (ctx) => ctx.project.isMultilingual && ctx.document.open,
|
|
208
261
|
/* The document history cannot hold this: the change is a file that did not exist, and
|
|
209
262
|
`undo: "project"` would claim `project.json` moved, which it did not. */
|
|
210
263
|
undo: "none",
|
|
211
|
-
aiTool:
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
name: "create_translation",
|
|
216
|
-
},
|
|
264
|
+
/* No `aiTool`, by §12.4's second deletion rule: `createFileIn` awaits the New File prompt
|
|
265
|
+
for the name, which the loop does not count as interactive, and a cancel resolves `null`
|
|
266
|
+
with nothing thrown — a report would describe a file that was never made. An optional
|
|
267
|
+
`name` argument that skips the prompt is the way back in, and is a UX call (issue 273). */
|
|
217
268
|
run: async (_ctx, args) => {
|
|
218
|
-
const
|
|
269
|
+
const source = addressedDocument("i18n.createTranslation", args);
|
|
219
270
|
const locale = stringArg("i18n.createTranslation", args, "locale");
|
|
220
|
-
const path = siblingPath(
|
|
271
|
+
const path = siblingPath(source, locale);
|
|
221
272
|
if (path === null) {
|
|
222
273
|
return;
|
|
223
274
|
}
|
|
224
275
|
if (await fileExists(path)) {
|
|
225
276
|
notify.info(`The ${localeLabel(locale)} translation already exists.`, {
|
|
226
277
|
action: "i18n.openTranslation",
|
|
278
|
+
actionArgs: { locale, path: source },
|
|
227
279
|
path,
|
|
228
280
|
source: "Languages",
|
|
229
281
|
});
|
|
@@ -235,11 +287,11 @@ export function i18nCommands(): AnyCommand[] {
|
|
|
235
287
|
they saved. */
|
|
236
288
|
let content: string;
|
|
237
289
|
try {
|
|
238
|
-
content = await getPlatform().readFile(
|
|
290
|
+
content = await getPlatform().readFile(source);
|
|
239
291
|
} catch {
|
|
240
292
|
// An unreadable source is not a translation that can be seeded, and the path says which.
|
|
241
|
-
notify.error(`Could not read ${
|
|
242
|
-
path:
|
|
293
|
+
notify.error(`Could not read ${source} to copy it.`, {
|
|
294
|
+
path: source,
|
|
243
295
|
source: "Languages",
|
|
244
296
|
});
|
|
245
297
|
return;
|
|
@@ -267,12 +319,7 @@ export function i18nCommands(): AnyCommand[] {
|
|
|
267
319
|
group: "2_view",
|
|
268
320
|
requires: "a project that declares more than one language",
|
|
269
321
|
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
|
-
},
|
|
322
|
+
/* No `aiTool`, by §12.4's first deletion rule: the panel is a surface for a person. */
|
|
276
323
|
/* The panel is off the rail — it spends no rail slot and shifts no ⌘1-8 chord — so this
|
|
277
324
|
command and the generated `panel.focus.i18n` are its only two doors, and both open the
|
|
278
325
|
same one. The TITLES must differ even though the behaviour does not: the palette is a flat
|
|
@@ -305,11 +352,39 @@ export function i18nCommands(): AnyCommand[] {
|
|
|
305
352
|
aiTool: {
|
|
306
353
|
description:
|
|
307
354
|
"Declare a language for this project, adding it to project.json's i18n.locales. Every " +
|
|
308
|
-
"other language surface reads that list."
|
|
355
|
+
"other language surface reads that list. Canonicalizes the tag; a malformed one is " +
|
|
356
|
+
"refused.",
|
|
309
357
|
name: "add_project_locale",
|
|
358
|
+
/* The read is the same one the translation verbs' enum makes — the effective locales —
|
|
359
|
+
so "what did that unlock" is answered from the list the next round's schemas are built
|
|
360
|
+
from. The already-declared case is a statement, not a change: `addProjectLocale` toasts
|
|
361
|
+
and returns `false`, the sentence here says so rather than reporting a declaration, and
|
|
362
|
+
`wrote: []` keeps the ledger from filing a `project.json` the run never touched. */
|
|
363
|
+
report: ({ args }) => {
|
|
364
|
+
const canonical = canonicalizeLocale(stringArg("i18n.addLocale", args, "locale")) ?? "";
|
|
365
|
+
const declared = declaredLocales().join(", ") || canonical;
|
|
366
|
+
return _lastAddLocaleWrote
|
|
367
|
+
? `Declared ${canonical}; project locales are now ${declared}.`
|
|
368
|
+
: {
|
|
369
|
+
summary: `${localeLabel(canonical)} was already one of this project's languages; the locales are ${declared}.`,
|
|
370
|
+
wrote: [],
|
|
371
|
+
};
|
|
372
|
+
},
|
|
310
373
|
},
|
|
311
374
|
run: async (_ctx, args) => {
|
|
312
|
-
|
|
375
|
+
const tag = stringArg("i18n.addLocale", args, "locale");
|
|
376
|
+
/* Refuse by THROWING, not by toasting. `addProjectLocale` notifies a malformed tag and
|
|
377
|
+
returns, because its other caller is the Locales form, which has already refused it under
|
|
378
|
+
the field — but a projected `run` is read by the model, and a toast is a refusal only the
|
|
379
|
+
person can read. The canonical check is the section's own (`canonicalizeLocale`), read
|
|
380
|
+
here rather than respelled. */
|
|
381
|
+
if (canonicalizeLocale(tag) === null) {
|
|
382
|
+
throw new RangeError(
|
|
383
|
+
`command "i18n.addLocale" argument "locale": "${tag}" is not a well-formed BCP 47 ` +
|
|
384
|
+
`tag — a language, optionally a script and a region: fr, pt-BR, zh-Hant`,
|
|
385
|
+
);
|
|
386
|
+
}
|
|
387
|
+
_lastAddLocaleWrote = await addProjectLocale(tag);
|
|
313
388
|
},
|
|
314
389
|
title: "Add Language",
|
|
315
390
|
},
|