@jxsuite/studio 6.1.1 → 6.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/{2020-va2wwra4.js → 2020-f2gkpy8d.js} +3 -3
- package/dist/chunks/{action-group-2mqby73c.js → action-group-4aan7g6g.js} +3 -3
- package/dist/chunks/adapter-4912g339.js +4 -0
- package/dist/chunks/cf-account-picker-wccaenh6.js +4 -0
- package/dist/chunks/cf-settings-br6105tr.js +4 -0
- package/dist/chunks/color-28ksk2qm.js +4 -0
- package/dist/chunks/color-area-0fj8a4ga.js +4 -0
- package/dist/chunks/color-field-xch8kx2g.js +4 -0
- package/dist/chunks/color-slider-jxd8v350.js +4 -0
- package/dist/chunks/combobox-p0efwjke.js +4 -0
- package/dist/chunks/components-db68vsn7.js +4 -0
- package/dist/chunks/content-source-1449qesq.js +4 -0
- package/dist/chunks/convert-to-repeater-5h457egj.js +4 -0
- package/dist/chunks/dialog-c4x05vyx.js +4 -0
- package/dist/chunks/editor-x9jn86a7.js +4 -0
- package/dist/chunks/entry-commands-may24cpt.js +4 -0
- package/dist/chunks/extension-sections-pvr14vxr.js +4 -0
- package/dist/chunks/file-ops-x9v54pcj.js +4 -0
- package/dist/chunks/files-j3knqf0s.js +4 -0
- package/dist/chunks/format-host-tyre2trb.js +4 -0
- package/dist/chunks/fs-events-64ma9htc.js +4 -0
- package/dist/chunks/git-panel-84ps5dex.js +4 -0
- package/dist/chunks/grid-view-d2wq9ezg.js +51 -0
- package/dist/chunks/icons-pnfz478q.js +4 -0
- package/dist/chunks/iframe-entry-fvbk89gm.js +5 -0
- package/dist/chunks/iframe-entry-jdcktez8.js +5 -0
- package/dist/chunks/iframe-entry-x0ygf2yr.js +5 -0
- package/dist/chunks/iframe-entry-zap785cw.js +5 -0
- package/dist/chunks/iframe-host-ck6vejt5.js +4 -0
- package/dist/chunks/index-b8xw3vy9.js +4 -0
- package/dist/chunks/{index-2veqmnhr.js → index-zpjmzqfk.js} +3 -3
- package/dist/chunks/{javascript-8nbvs12s.js → javascript-m54mnwp6.js} +3 -3
- package/dist/chunks/{jsonMode-s8kt9dsj.js → jsonMode-w15cmrcm.js} +8 -8
- package/dist/chunks/jx-validate-at3zn8wa.js +4 -0
- package/dist/chunks/layers-h4xp1pss.js +4 -0
- package/dist/chunks/layers-panel-m5hw1d7g.js +4 -0
- package/dist/chunks/listbox-e74qjyq6.js +4 -0
- package/dist/chunks/lit-html-8t8t3dnr.js +4 -0
- package/dist/chunks/media-picker-2cweexc5.js +4 -0
- package/dist/chunks/menu-n6yzswmy.js +4 -0
- package/dist/chunks/menu-ynw13y0s.js +4 -0
- package/dist/chunks/monaco-binding-7gx83x3r.js +4 -0
- package/dist/chunks/monaco-buffer-qzxn567r.js +4 -0
- package/dist/chunks/monaco-setup-gxf6656g.js +4 -0
- package/dist/chunks/notify-cj5zbrs2.js +4 -0
- package/dist/chunks/number-field-y62xq0ty.js +4 -0
- package/dist/chunks/parse-b7ddhr8m.js +4 -0
- package/dist/chunks/platform-3dfws9js.js +4 -0
- package/dist/chunks/popover-jt2gxmzs.js +4 -0
- package/dist/chunks/publish-panel-1gvxbj21.js +4 -0
- package/dist/chunks/quick-search-0dajrwqg.js +4 -0
- package/dist/chunks/references-49qgt404.js +4 -0
- package/dist/chunks/right-panel-jm1bwe53.js +4 -0
- package/dist/chunks/section-registry-6kwc4fky.js +4 -0
- package/dist/chunks/select-rzds841e.js +4 -0
- package/dist/chunks/split-n2gfpm5m.js +4 -0
- package/dist/chunks/{studio-1q1sh2ax.js → studio-0q988f9w.js} +3 -3
- package/dist/chunks/studio-0rt52vpq.js +5 -0
- package/dist/chunks/studio-18vgbhs5.js +5 -0
- package/dist/chunks/{studio-h46vtzk8.js → studio-1fxkaaea.js} +4 -4
- package/dist/chunks/studio-24mccdrj.js +5 -0
- package/dist/chunks/studio-2eh507zk.js +9 -0
- package/dist/chunks/studio-2hcbccfv.js +5 -0
- package/dist/chunks/studio-2j1cb95x.js +5 -0
- package/dist/chunks/studio-2jbs3rxv.js +5 -0
- package/dist/chunks/{studio-rv11kfwa.js → studio-485046te.js} +7 -7
- package/dist/chunks/studio-4h8k4dw9.js +5 -0
- package/dist/chunks/studio-5f6n18kx.js +5 -0
- package/dist/chunks/studio-5gthpky6.js +5 -0
- package/dist/chunks/studio-5ve6bbep.js +5 -0
- package/dist/chunks/studio-6ep3js6b.js +9 -0
- package/dist/chunks/studio-6wkmf3wz.js +9 -0
- package/dist/chunks/studio-841rf3cg.js +5 -0
- package/dist/chunks/studio-8gmwgheg.js +5 -0
- package/dist/chunks/studio-8qm0ep50.js +5 -0
- package/dist/chunks/{studio-8grwxtqk.js → studio-90pq9km1.js} +4 -4
- package/dist/chunks/studio-924p1tm1.js +6 -0
- package/dist/chunks/{studio-pre0skq6.js → studio-a3g98wjr.js} +4 -4
- package/dist/chunks/studio-a3shpz9y.js +5 -0
- package/dist/chunks/studio-amsbaaar.js +6 -0
- package/dist/chunks/studio-at5spjbc.js +7 -0
- package/dist/chunks/studio-b2xv945e.js +5 -0
- package/dist/chunks/studio-bn5nkafw.js +5 -0
- package/dist/chunks/studio-bw6q5xjf.js +9 -0
- package/dist/chunks/studio-c7q0t9x1.js +5 -0
- package/dist/chunks/studio-camnhc96.js +6 -0
- package/dist/chunks/studio-cffqvnzd.js +5 -0
- package/dist/chunks/studio-d81xfh1g.js +5 -0
- package/dist/chunks/studio-dgz8d0c1.js +5 -0
- package/dist/chunks/studio-efvfrsf8.js +5 -0
- package/dist/chunks/studio-er30bpcx.js +5 -0
- package/dist/chunks/studio-ezscgr64.js +5 -0
- package/dist/chunks/studio-ffrrncvz.js +5 -0
- package/dist/chunks/studio-fpphgn8y.js +10 -0
- package/dist/chunks/studio-j1kvhdjk.js +4 -0
- package/dist/chunks/{studio-vrmcjf9g.js → studio-j430n16g.js} +5 -5
- package/dist/chunks/studio-jjkg84nj.js +5 -0
- package/dist/chunks/studio-m0q32ars.js +4 -0
- package/dist/chunks/studio-m6bdst11.js +5 -0
- package/dist/chunks/studio-nv2cptd4.js +64 -0
- package/dist/chunks/studio-nwfrc98n.js +5 -0
- package/dist/chunks/studio-p1wgvp7r.js +5 -0
- package/dist/chunks/studio-pag2wncm.js +5 -0
- package/dist/chunks/studio-qvanvzfd.js +5 -0
- package/dist/chunks/studio-qwa64kt7.js +5 -0
- package/dist/chunks/studio-rk1zc4x3.js +928 -0
- package/dist/chunks/studio-se2r3ptc.js +5 -0
- package/dist/chunks/studio-sg2a0dh0.js +5 -0
- package/dist/chunks/studio-tjzjhe68.js +5 -0
- package/dist/chunks/{studio-wszjyh0j.js → studio-tq0rtfwj.js} +4 -4
- package/dist/chunks/{studio-kggey1jt.js → studio-v0jzqdjm.js} +4 -4
- package/dist/chunks/studio-v2w7q8r1.js +7 -0
- package/dist/chunks/studio-v5vjq1h0.js +4 -0
- package/dist/chunks/studio-v8aga3vp.js +14 -0
- package/dist/chunks/studio-vfcdrfmv.js +5 -0
- package/dist/chunks/studio-vmfkgdjf.js +5 -0
- package/dist/chunks/studio-wt1816jj.js +5 -0
- package/dist/chunks/studio-wz73q5kq.js +4 -0
- package/dist/chunks/studio-y04qtxvp.js +7 -0
- package/dist/chunks/studio-y21g8zzg.js +5 -0
- package/dist/chunks/{studio-zey7zsdw.js → studio-y64hrt8p.js} +7 -7
- package/dist/chunks/studio-ynn90f58.js +16 -0
- package/dist/chunks/studio-yxz682sx.js +5 -0
- package/dist/chunks/studio-zp7snvkq.js +5 -0
- package/dist/chunks/studio-zq4z6tm6.js +5 -0
- package/dist/chunks/swatch-group-ewh24n1f.js +4 -0
- package/dist/chunks/tabs-f5cw3tgp.js +4 -0
- package/dist/chunks/textfield-wewc8rq2.js +4 -0
- package/dist/chunks/toast-c9fn075p.js +4 -0
- package/dist/chunks/toast-host-ke5z4ng7.js +4 -0
- package/dist/chunks/{toolbar-2nnzqhrj.js → toolbar-44cm5cta.js} +3 -3
- package/dist/chunks/tooltip-5v8ngwj2.js +4 -0
- package/dist/chunks/tree-mdq3v5cw.js +4 -0
- package/dist/chunks/{tsMode-2frah6h1.js → tsMode-sf49ee9x.js} +7 -7
- package/dist/chunks/workspace-jtfahpee.js +4 -0
- package/dist/chunks/ws-client-nze0k6mv.js +4 -0
- package/dist/iframe-entry.js +16 -16
- package/dist/manifest.json +63 -63
- package/dist/studio.js +97 -97
- package/package.json +6 -6
- package/src/about/about-modal.ts +4 -3
- package/src/account/action-flow.ts +45 -38
- package/src/account-status.ts +7 -2
- package/src/browse/library-layouts.ts +8 -5
- package/src/browse/library-model.ts +18 -6
- package/src/browse/library-pane.ts +37 -21
- package/src/browse/library-preview.ts +14 -9
- package/src/browse/library-source.ts +1 -1
- package/src/canvas/asset-refs.ts +24 -9
- package/src/canvas/asset-resolve.ts +19 -23
- package/src/canvas/canvas-helpers.ts +7 -6
- package/src/canvas/canvas-live-render.ts +44 -53
- package/src/canvas/canvas-patcher.ts +30 -30
- package/src/canvas/canvas-perf.ts +11 -5
- package/src/canvas/canvas-render.ts +62 -41
- package/src/canvas/canvas-surface.ts +5 -3
- package/src/canvas/canvas-utils.ts +90 -49
- package/src/canvas/dialog-path.ts +9 -4
- package/src/canvas/dialog-state.ts +1 -2
- package/src/canvas/diff-marks.ts +9 -16
- package/src/canvas/diff-toolbar.ts +8 -7
- package/src/canvas/edit-width-drag.ts +4 -1
- package/src/canvas/edit-width.ts +1 -3
- package/src/canvas/iframe-channel.ts +27 -13
- package/src/canvas/iframe-drop.ts +13 -12
- package/src/canvas/iframe-editable-root.ts +29 -16
- package/src/canvas/iframe-entry.ts +80 -63
- package/src/canvas/iframe-eval.ts +73 -49
- package/src/canvas/iframe-host.ts +135 -96
- package/src/canvas/iframe-inline-edit.ts +49 -30
- package/src/canvas/iframe-insert.ts +5 -4
- package/src/canvas/iframe-interaction.ts +30 -25
- package/src/canvas/iframe-overlay.ts +1 -1
- package/src/canvas/iframe-patch.ts +18 -15
- package/src/canvas/iframe-position.ts +12 -6
- package/src/canvas/iframe-protocol.ts +12 -16
- package/src/canvas/iframe-render.ts +36 -34
- package/src/canvas/iframe-slash.ts +24 -11
- package/src/canvas/iframe-subtree.ts +6 -2
- package/src/canvas/path-mapping.ts +19 -12
- package/src/canvas/popover-path.ts +7 -3
- package/src/canvas/popover-state.ts +1 -2
- package/src/canvas/serialize-scope.ts +13 -5
- package/src/canvas/stage-scrollbar.ts +2 -1
- package/src/canvas/surface-registry.ts +21 -3
- package/src/collab/collab-commands.ts +7 -2
- package/src/collab/collab-session.ts +84 -45
- package/src/collab/collab-state.ts +4 -3
- package/src/collab/monaco-binding.ts +16 -13
- package/src/collab/monaco-cursors.ts +5 -2
- package/src/commands/budget.ts +3 -3
- package/src/commands/command-args.ts +103 -71
- package/src/commands/context.ts +22 -20
- package/src/commands/keymap.ts +47 -43
- package/src/commands/levels.ts +3 -3
- package/src/commands/live-context.ts +7 -7
- package/src/commands/reference.ts +2 -1
- package/src/commands/registry.ts +12 -10
- package/src/commands/run-reported.ts +15 -10
- package/src/component-props.ts +46 -30
- package/src/content/collection-match.ts +5 -4
- package/src/content/draft-state.ts +4 -3
- package/src/content/entry-commands.ts +3 -2
- package/src/content/entry-editor.ts +29 -17
- package/src/content/entry-fields.ts +12 -7
- package/src/content/entry-model.ts +21 -12
- package/src/editor/canvas-context-menu.ts +1 -2
- package/src/editor/canvas-slash-bridge.ts +3 -6
- package/src/editor/content-slice.ts +16 -14
- package/src/editor/context-menu.ts +35 -22
- package/src/editor/convert-targets.ts +30 -35
- package/src/editor/convert-to-component.ts +11 -5
- package/src/editor/convert-to-repeater.ts +34 -22
- package/src/editor/editable-tags.ts +17 -2
- package/src/editor/file-drop-action.ts +21 -22
- package/src/editor/inline-edit-apply.ts +35 -17
- package/src/editor/inline-edit.ts +66 -50
- package/src/editor/inline-format.ts +59 -56
- package/src/editor/inline-link.ts +40 -15
- package/src/editor/insert-zone-action.ts +1 -1
- package/src/editor/merge-tags.ts +58 -19
- package/src/editor/repeater-scope.ts +39 -28
- package/src/editor/shortcuts.ts +32 -20
- package/src/editor/slash-menu.ts +1 -6
- package/src/files/asset-versions.ts +4 -4
- package/src/files/components.ts +15 -10
- package/src/files/elements.ts +5 -6
- package/src/files/file-ops.ts +77 -36
- package/src/files/files.ts +90 -95
- package/src/files/media-meta.ts +2 -1
- package/src/files/media-paths.ts +3 -0
- package/src/files/serialize-document.ts +2 -2
- package/src/format/constraints.ts +1 -1
- package/src/format/convert-file.ts +27 -13
- package/src/format/format-choices.ts +2 -1
- package/src/format/format-host.ts +76 -50
- package/src/github/github-auth-status.ts +27 -3
- package/src/github/github-auth.ts +19 -9
- package/src/github/github-publish.ts +24 -20
- package/src/grid/cell-editors.ts +46 -31
- package/src/grid/cell-popovers.ts +5 -3
- package/src/grid/edit-buffer.ts +10 -9
- package/src/grid/grid-controller.ts +20 -22
- package/src/grid/grid-layout.ts +21 -5
- package/src/grid/grid-open.ts +3 -6
- package/src/grid/grid-panel.ts +11 -4
- package/src/grid/grid-source.ts +8 -8
- package/src/grid/grid-view.ts +14 -17
- package/src/grid/redirects-grid.ts +14 -5
- package/src/grid/redirects.ts +16 -14
- package/src/grid/schema-columns.ts +25 -19
- package/src/grid/sources/connector-source.ts +47 -20
- package/src/grid/sources/content-source.ts +25 -24
- package/src/grid/sources/csv-file-source.ts +2 -2
- package/src/grid/tabulator-tables.d.ts +55 -34
- package/src/hosting/stage.ts +7 -7
- package/src/i18n/i18n-commands.ts +1 -2
- package/src/media/media-pane.ts +4 -1
- package/src/new-project/add-repo-modal.ts +20 -19
- package/src/new-project/import-tab.ts +10 -14
- package/src/new-project/location-fields.ts +2 -1
- package/src/new-project/new-project-modal.ts +12 -9
- package/src/packages/jxsuite-update.ts +4 -3
- package/src/packages/pull-package-sync.ts +26 -25
- package/src/page-params.ts +97 -68
- package/src/panels/activity-panel.ts +17 -9
- package/src/panels/ai-chat/attached-context.ts +13 -7
- package/src/panels/ai-chat/chat-view.ts +80 -73
- package/src/panels/ai-chat/composer.ts +30 -33
- package/src/panels/ai-chat/sessions-view.ts +1 -2
- package/src/panels/ai-panel.ts +23 -20
- package/src/panels/block-action-bar.ts +46 -35
- package/src/panels/bottom-dock.ts +5 -3
- package/src/panels/canvas-dnd-bridge.ts +31 -24
- package/src/panels/data-explorer.ts +62 -25
- package/src/panels/data-grid.ts +14 -11
- package/src/panels/dnd.ts +108 -118
- package/src/panels/editors.ts +52 -21
- package/src/panels/elements-panel.ts +10 -3
- package/src/panels/events-panel.ts +84 -69
- package/src/panels/formula-workspace.ts +76 -51
- package/src/panels/frontmatter-fields.ts +24 -19
- package/src/panels/frontmatter-panel.ts +44 -34
- package/src/panels/git-diff-open.ts +4 -4
- package/src/panels/git-panel.ts +49 -61
- package/src/panels/head-panel.ts +131 -111
- package/src/panels/i18n-panel.ts +10 -3
- package/src/panels/imports-panel.ts +23 -47
- package/src/panels/jump-bar.ts +48 -29
- package/src/panels/layers-panel.ts +97 -74
- package/src/panels/left-panel.ts +3 -3
- package/src/panels/pane-context.ts +31 -22
- package/src/panels/pane-grid.ts +49 -20
- package/src/panels/panel-registry.ts +22 -37
- package/src/panels/properties-panel.ts +175 -121
- package/src/panels/quick-search.ts +53 -31
- package/src/panels/right-panel.ts +3 -3
- package/src/panels/seo-modal.ts +13 -17
- package/src/panels/settings-menu.ts +15 -15
- package/src/panels/signals-panel.ts +153 -131
- package/src/panels/statement-editor.ts +230 -140
- package/src/panels/style-panel.ts +218 -205
- package/src/panels/style-utils.ts +114 -51
- package/src/panels/stylebook-doc.ts +57 -54
- package/src/panels/stylebook-layers-panel.ts +9 -9
- package/src/panels/stylebook-panel.ts +13 -17
- package/src/panels/tab-drop.ts +27 -11
- package/src/panels/tab-strip.ts +36 -26
- package/src/platform-errors.ts +57 -43
- package/src/platform.ts +58 -30
- package/src/platforms/cloud.ts +345 -175
- package/src/platforms/default-platform.ts +10 -4
- package/src/platforms/devserver.ts +129 -117
- package/src/platforms/read-batcher.ts +16 -8
- package/src/project-list.ts +2 -1
- package/src/publish/deploy-checklist.ts +8 -2
- package/src/publish/pages-service.ts +28 -13
- package/src/publish/publish-commands.ts +5 -4
- package/src/publish/publish-panel.ts +10 -6
- package/src/recent-projects.ts +15 -8
- package/src/resize-edges.ts +26 -36
- package/src/services/a11y-report.ts +26 -19
- package/src/services/agent-seed.ts +23 -11
- package/src/services/ai-ask.ts +9 -12
- package/src/services/ai-command-tools.ts +68 -62
- package/src/services/ai-import-tools.ts +80 -67
- package/src/services/ai-models.ts +17 -13
- package/src/services/ai-project-tools.ts +68 -32
- package/src/services/ai-session-store.ts +19 -10
- package/src/services/ai-system-prompt.ts +46 -20
- package/src/services/ai-tools.ts +71 -27
- package/src/services/ai-write-report.ts +20 -12
- package/src/services/ai-writes.ts +4 -4
- package/src/services/automation.ts +58 -31
- package/src/services/cem-export.ts +149 -58
- package/src/services/clock.ts +6 -1
- package/src/services/code-services.ts +37 -31
- package/src/services/context-manager.ts +14 -10
- package/src/services/context-resolver.ts +20 -8
- package/src/services/data-service.ts +19 -15
- package/src/services/directory-picker.ts +18 -12
- package/src/services/document-assistant.ts +39 -19
- package/src/services/gated-registry.ts +10 -6
- package/src/services/harness/chat-reducer.ts +23 -1
- package/src/services/import-client.ts +91 -38
- package/src/services/import-seed.ts +8 -2
- package/src/services/jx-validate.ts +28 -31
- package/src/services/live-preview.ts +0 -0
- package/src/services/live-surfaces.ts +6 -3
- package/src/services/model-uri.ts +10 -2
- package/src/services/module-preloads.ts +12 -8
- package/src/services/monaco-buffer.ts +43 -24
- package/src/services/monaco-lazy.ts +7 -8
- package/src/services/monaco-setup.ts +23 -16
- package/src/services/notify.ts +44 -17
- package/src/services/popover-report.ts +25 -10
- package/src/services/preview-eval.ts +20 -8
- package/src/services/profile.ts +13 -6
- package/src/services/project-path.ts +13 -10
- package/src/services/references.ts +0 -0
- package/src/services/render-critic.ts +8 -7
- package/src/services/settings/kernel.ts +13 -4
- package/src/services/settings/write-queue.ts +9 -9
- package/src/services/token-lint.ts +12 -10
- package/src/services/tool-executor.ts +17 -5
- package/src/services/tool-outcomes.ts +44 -24
- package/src/services/trusted-types.ts +24 -7
- package/src/settings/contexts-section.ts +11 -8
- package/src/settings/contributed-section.ts +79 -60
- package/src/settings/css-vars-editor.ts +37 -16
- package/src/settings/defs-editor.ts +38 -35
- package/src/settings/extension-rows.ts +16 -8
- package/src/settings/extension-sections.ts +23 -13
- package/src/settings/extensions-section.ts +4 -1
- package/src/settings/general-settings.ts +11 -8
- package/src/settings/locales-section.ts +20 -12
- package/src/settings/preferences-dialog.ts +9 -6
- package/src/settings/preferences-keymap.ts +7 -5
- package/src/settings/preferences-sections.ts +11 -5
- package/src/settings/project-sections.ts +1 -1
- package/src/settings/schema-field-ui.ts +9 -0
- package/src/settings/settings-document.ts +5 -5
- package/src/shell/tree.ts +6 -5
- package/src/shell.ts +104 -81
- package/src/site-context.ts +37 -22
- package/src/state.ts +41 -49
- package/src/store.ts +54 -34
- package/src/studio.ts +25 -75
- package/src/style/live-preview.ts +1 -1
- package/src/style/project-styles.ts +6 -7
- package/src/style/token-ref.ts +5 -4
- package/src/surfaces/about.ts +18 -19
- package/src/surfaces/add-repo.ts +17 -19
- package/src/surfaces/ai-chat.ts +31 -36
- package/src/surfaces/ai-credentials-form.ts +6 -16
- package/src/surfaces/ai-managed-connect.ts +3 -4
- package/src/surfaces/ai-model-picker.ts +3 -5
- package/src/surfaces/block-action-bar.ts +22 -11
- package/src/surfaces/boot-failure.ts +4 -5
- package/src/surfaces/bottom-dock.ts +9 -18
- package/src/surfaces/canvas-stage.ts +12 -11
- package/src/surfaces/cf-account-picker.ts +17 -18
- package/src/surfaces/commandbar.ts +14 -9
- package/src/surfaces/convert-repeater.ts +17 -19
- package/src/surfaces/data-actions.ts +9 -7
- package/src/surfaces/dialog.ts +26 -28
- package/src/surfaces/diff-toolbar.ts +9 -7
- package/src/surfaces/doc-header.ts +10 -19
- package/src/surfaces/empty-state.ts +7 -10
- package/src/surfaces/entry-editor.ts +14 -11
- package/src/surfaces/expression-editor.ts +11 -25
- package/src/surfaces/files-panel.ts +27 -14
- package/src/surfaces/formula-palette.ts +4 -5
- package/src/surfaces/git-panel.ts +7 -15
- package/src/surfaces/github-auth.ts +16 -20
- package/src/surfaces/github-publish.ts +17 -22
- package/src/surfaces/grid-cell.ts +30 -31
- package/src/surfaces/grid-open.ts +10 -14
- package/src/surfaces/grid-panel.ts +13 -9
- package/src/surfaces/grid-replace.ts +13 -13
- package/src/surfaces/grid-views.ts +15 -18
- package/src/surfaces/inspector-dock.ts +13 -12
- package/src/surfaces/jump-bar.ts +5 -6
- package/src/surfaces/jxsuite-update.ts +16 -22
- package/src/surfaces/library-pane.ts +19 -20
- package/src/surfaces/logic-panel.ts +17 -30
- package/src/surfaces/logic-workspace.ts +13 -15
- package/src/surfaces/media-browser.ts +11 -10
- package/src/surfaces/media-field.ts +4 -5
- package/src/surfaces/media-pane.ts +8 -7
- package/src/surfaces/menu.ts +29 -23
- package/src/surfaces/navigator-dock.ts +11 -12
- package/src/surfaces/new-project.ts +27 -26
- package/src/surfaces/pane-context.ts +20 -25
- package/src/surfaces/pane-grid.ts +15 -10
- package/src/surfaces/panel-activity.ts +5 -6
- package/src/surfaces/panel-data.ts +3 -4
- package/src/surfaces/panel-deploy-checklist.ts +5 -6
- package/src/surfaces/panel-elements.ts +5 -7
- package/src/surfaces/panel-i18n.ts +5 -7
- package/src/surfaces/panel-imports.ts +6 -13
- package/src/surfaces/panel-outline.ts +25 -19
- package/src/surfaces/panel-page.ts +11 -18
- package/src/surfaces/panel-problems.ts +5 -7
- package/src/surfaces/panel-signals.ts +20 -34
- package/src/surfaces/panel-stylebook-layers.ts +5 -8
- package/src/surfaces/preferences.ts +21 -11
- package/src/surfaces/progress-modal.ts +15 -9
- package/src/surfaces/properties-panel.json +1 -1
- package/src/surfaces/properties-panel.ts +20 -42
- package/src/surfaces/publish.ts +18 -18
- package/src/surfaces/push-plan.ts +7 -8
- package/src/surfaces/rail.ts +13 -13
- package/src/surfaces/reference-field.ts +11 -15
- package/src/surfaces/schema-builder.ts +16 -22
- package/src/surfaces/schema-form.ts +15 -25
- package/src/surfaces/secret-field.ts +9 -6
- package/src/surfaces/seo.ts +21 -15
- package/src/surfaces/settings-contexts.ts +9 -7
- package/src/surfaces/settings-contributed.ts +14 -10
- package/src/surfaces/settings-css-vars.ts +5 -12
- package/src/surfaces/settings-defs.json +2 -2
- package/src/surfaces/settings-defs.ts +17 -21
- package/src/surfaces/settings-deploy.ts +8 -15
- package/src/surfaces/settings-extensions.ts +5 -6
- package/src/surfaces/settings-head.ts +33 -39
- package/src/surfaces/settings-locales.ts +8 -20
- package/src/surfaces/settings-overview.ts +5 -6
- package/src/surfaces/settings-packages.ts +8 -7
- package/src/surfaces/settings-pane.ts +9 -18
- package/src/surfaces/settings-rawjson.ts +5 -6
- package/src/surfaces/shell.ts +1 -2
- package/src/surfaces/slash-menu.ts +19 -9
- package/src/surfaces/statements.ts +13 -18
- package/src/surfaces/statusbar.ts +17 -14
- package/src/surfaces/style-panel.ts +18 -31
- package/src/surfaces/stylebook-chrome.ts +3 -5
- package/src/surfaces/tab-strip.ts +14 -13
- package/src/surfaces/target-line.ts +6 -7
- package/src/surfaces/welcome.ts +5 -7
- package/src/tabs/patch-ops.ts +4 -3
- package/src/tabs/project-config.ts +32 -21
- package/src/tabs/selection.ts +36 -8
- package/src/tabs/tab.ts +52 -41
- package/src/tabs/transact.ts +98 -53
- package/src/types.ts +32 -17
- package/src/ui/ai-credentials-form.ts +10 -13
- package/src/ui/ai-model-picker.ts +3 -3
- package/src/ui/cf-account-picker.ts +7 -9
- package/src/ui/color-selector.ts +9 -5
- package/src/ui/dynamic-slot.ts +7 -8
- package/src/ui/expression-editor.ts +112 -105
- package/src/ui/form-controls.ts +57 -48
- package/src/ui/formula-catalog.ts +239 -230
- package/src/ui/formula-chips.ts +33 -18
- package/src/ui/layers.ts +44 -31
- package/src/ui/media-picker.ts +18 -9
- package/src/ui/popover-surface.ts +20 -12
- package/src/ui/progress-modal.ts +13 -8
- package/src/ui/regions.ts +7 -6
- package/src/ui/schema-form.ts +113 -70
- package/src/ui/surface.ts +71 -8
- package/src/ui/timing.ts +9 -0
- package/src/ui/value-source.ts +44 -31
- package/src/ui/virtual-window.ts +3 -2
- package/src/utils/base64.ts +3 -1
- package/src/utils/edit-display.ts +73 -73
- package/src/utils/element-selectors.ts +3 -2
- package/src/utils/google-fonts.ts +15 -14
- package/src/utils/inherited-style.ts +18 -20
- package/src/utils/link-target.ts +1 -1
- package/src/utils/preview-format.ts +25 -3
- package/src/utils/strip-events.ts +49 -22
- package/src/utils/studio-utils.ts +29 -14
- package/src/view.ts +2 -3
- package/src/workspace/pane-derive.ts +10 -12
- package/src/workspace/session.ts +53 -43
- package/src/workspace/workspace.ts +40 -36
- package/dist/chunks/adapter-f93pafd7.js +0 -4
- package/dist/chunks/cf-account-picker-af1h381v.js +0 -4
- package/dist/chunks/cf-settings-125tdm0w.js +0 -4
- package/dist/chunks/color-area-jqhna8zy.js +0 -4
- package/dist/chunks/color-field-embq5ctg.js +0 -4
- package/dist/chunks/color-fpezvnkt.js +0 -4
- package/dist/chunks/color-slider-1qmw7wqy.js +0 -4
- package/dist/chunks/combobox-773hdzyj.js +0 -4
- package/dist/chunks/components-ax2f1fnn.js +0 -4
- package/dist/chunks/content-source-108aqtk1.js +0 -4
- package/dist/chunks/convert-to-repeater-ry5rmppr.js +0 -4
- package/dist/chunks/dialog-mtm9fq5t.js +0 -4
- package/dist/chunks/editor-pfgdmkb0.js +0 -4
- package/dist/chunks/entry-commands-t0k1q0kx.js +0 -4
- package/dist/chunks/extension-sections-6mwh2hf8.js +0 -4
- package/dist/chunks/file-ops-meej5mqf.js +0 -4
- package/dist/chunks/files-44vp8a2s.js +0 -4
- package/dist/chunks/format-host-7q1petb9.js +0 -4
- package/dist/chunks/fs-events-h2mwnxaz.js +0 -4
- package/dist/chunks/git-panel-zngbymvd.js +0 -4
- package/dist/chunks/grid-view-sx9vynsp.js +0 -51
- package/dist/chunks/icons-p44xhjf0.js +0 -4
- package/dist/chunks/iframe-entry-f7mqjwpm.js +0 -5
- package/dist/chunks/iframe-entry-haw7jkvz.js +0 -5
- package/dist/chunks/iframe-entry-z6qrytv3.js +0 -5
- package/dist/chunks/iframe-host-qk3ycq87.js +0 -4
- package/dist/chunks/index-wkyfjeqz.js +0 -4
- package/dist/chunks/jx-validate-psgd7vsx.js +0 -4
- package/dist/chunks/layers-panel-1kq2jyfk.js +0 -4
- package/dist/chunks/layers-xd92fg8d.js +0 -4
- package/dist/chunks/listbox-s8fkmnq8.js +0 -4
- package/dist/chunks/lit-html-ac4cwwr4.js +0 -4
- package/dist/chunks/media-picker-0svzkdyb.js +0 -4
- package/dist/chunks/menu-37d07z9m.js +0 -4
- package/dist/chunks/menu-5c55ea3d.js +0 -4
- package/dist/chunks/monaco-binding-z6r70pdt.js +0 -4
- package/dist/chunks/monaco-buffer-fz6gq5y7.js +0 -4
- package/dist/chunks/monaco-setup-q4axkgj7.js +0 -4
- package/dist/chunks/notify-0xgtn8q1.js +0 -4
- package/dist/chunks/number-field-gw7sq8rn.js +0 -4
- package/dist/chunks/parse-897fvqah.js +0 -4
- package/dist/chunks/platform-v1qctbe6.js +0 -4
- package/dist/chunks/popover-8htra4er.js +0 -4
- package/dist/chunks/publish-panel-ym1fmgq5.js +0 -4
- package/dist/chunks/quick-search-a54e6t5n.js +0 -4
- package/dist/chunks/references-gmqp82fs.js +0 -4
- package/dist/chunks/right-panel-v7t9awbk.js +0 -4
- package/dist/chunks/section-registry-vhyf3zsr.js +0 -4
- package/dist/chunks/select-n3v7gwas.js +0 -4
- package/dist/chunks/split-pff8f3ze.js +0 -4
- package/dist/chunks/studio-0bhx5hz6.js +0 -5
- package/dist/chunks/studio-0k1ddnyy.js +0 -6
- package/dist/chunks/studio-1b04pd0j.js +0 -64
- package/dist/chunks/studio-4dwbj6gb.js +0 -5
- package/dist/chunks/studio-4tanh828.js +0 -5
- package/dist/chunks/studio-55h4mstj.js +0 -4
- package/dist/chunks/studio-5tnvjkz4.js +0 -5
- package/dist/chunks/studio-60dqgb0c.js +0 -5
- package/dist/chunks/studio-61dp09qg.js +0 -9
- package/dist/chunks/studio-63epcrj2.js +0 -5
- package/dist/chunks/studio-74k29dy9.js +0 -5
- package/dist/chunks/studio-7vg6jcd3.js +0 -5
- package/dist/chunks/studio-7zx31knw.js +0 -9
- package/dist/chunks/studio-8bxk97km.js +0 -5
- package/dist/chunks/studio-933e30n4.js +0 -5
- package/dist/chunks/studio-98wnwhbg.js +0 -5
- package/dist/chunks/studio-9mccjwjh.js +0 -14
- package/dist/chunks/studio-a2ke1e4t.js +0 -5
- package/dist/chunks/studio-e3a2a6v3.js +0 -4
- package/dist/chunks/studio-e81q1vb9.js +0 -5
- package/dist/chunks/studio-epgrmqqm.js +0 -5
- package/dist/chunks/studio-ery42sqr.js +0 -4
- package/dist/chunks/studio-g1shz58g.js +0 -5
- package/dist/chunks/studio-gf0fz03c.js +0 -5
- package/dist/chunks/studio-gjtpe62q.js +0 -6
- package/dist/chunks/studio-gkskhg7m.js +0 -5
- package/dist/chunks/studio-gx4dnjzd.js +0 -5
- package/dist/chunks/studio-j03zga3y.js +0 -9
- package/dist/chunks/studio-jhpxeckz.js +0 -5
- package/dist/chunks/studio-k01r7ykp.js +0 -5
- package/dist/chunks/studio-kk7h30ne.js +0 -7
- package/dist/chunks/studio-kt1zqney.js +0 -5
- package/dist/chunks/studio-m3cwhvye.js +0 -5
- package/dist/chunks/studio-mcayt6hz.js +0 -5
- package/dist/chunks/studio-myjcghv3.js +0 -5
- package/dist/chunks/studio-n8bxwc3y.js +0 -4
- package/dist/chunks/studio-ngm8gvpb.js +0 -5
- package/dist/chunks/studio-nj5a01jy.js +0 -928
- package/dist/chunks/studio-pcgz8heb.js +0 -5
- package/dist/chunks/studio-qcsq0t15.js +0 -5
- package/dist/chunks/studio-qkstvve9.js +0 -5
- package/dist/chunks/studio-qv1pwd3c.js +0 -5
- package/dist/chunks/studio-rc6dvxjb.js +0 -7
- package/dist/chunks/studio-s8dmmz66.js +0 -5
- package/dist/chunks/studio-sp5xzbj4.js +0 -6
- package/dist/chunks/studio-szsjbj0g.js +0 -5
- package/dist/chunks/studio-t1xzawhr.js +0 -16
- package/dist/chunks/studio-t6b6qe31.js +0 -5
- package/dist/chunks/studio-tdcprbqb.js +0 -5
- package/dist/chunks/studio-vyc0b4he.js +0 -10
- package/dist/chunks/studio-w0cgf6jg.js +0 -5
- package/dist/chunks/studio-w3hskzqk.js +0 -5
- package/dist/chunks/studio-xgrgcdyh.js +0 -9
- package/dist/chunks/studio-xz2yxfcb.js +0 -5
- package/dist/chunks/studio-y6n42tgs.js +0 -5
- package/dist/chunks/studio-yb560vxr.js +0 -5
- package/dist/chunks/studio-yn9f8vtx.js +0 -5
- package/dist/chunks/studio-yw05w8f0.js +0 -7
- package/dist/chunks/studio-z16sgavc.js +0 -5
- package/dist/chunks/studio-zyqn40w4.js +0 -5
- package/dist/chunks/swatch-group-8qh9a3bm.js +0 -4
- package/dist/chunks/tabs-jwthg40w.js +0 -4
- package/dist/chunks/textfield-spy3hc77.js +0 -4
- package/dist/chunks/toast-4d35zd64.js +0 -4
- package/dist/chunks/toast-host-8sjmfed3.js +0 -4
- package/dist/chunks/tooltip-fd6g9xy3.js +0 -4
- package/dist/chunks/tree-h19v1jfz.js +0 -4
- package/dist/chunks/workspace-zt81g1ms.js +0 -4
- package/dist/chunks/ws-client-n2bh4hkf.js +0 -4
package/src/panels/tab-drop.ts
CHANGED
|
@@ -18,7 +18,10 @@
|
|
|
18
18
|
|
|
19
19
|
import { extractClosestEdge } from "@atlaskit/pragmatic-drag-and-drop-hitbox/closest-edge";
|
|
20
20
|
import { getReorderDestinationIndex } from "@atlaskit/pragmatic-drag-and-drop-hitbox/util/get-reorder-destination-index";
|
|
21
|
-
import type { Edge } from "@atlaskit/pragmatic-drag-and-drop-hitbox/
|
|
21
|
+
import type { Edge } from "@atlaskit/pragmatic-drag-and-drop-hitbox/types";
|
|
22
|
+
import type { ElementDragPayload } from "@atlaskit/pragmatic-drag-and-drop/adapter/element-adapter";
|
|
23
|
+
import type { DropTargetRecord } from "@atlaskit/pragmatic-drag-and-drop/types";
|
|
24
|
+
import { isJsonObject } from "@jxsuite/schema/guards";
|
|
22
25
|
import {
|
|
23
26
|
activateTab,
|
|
24
27
|
closePane,
|
|
@@ -54,8 +57,13 @@ export interface FileDragData extends Record<string, unknown> {
|
|
|
54
57
|
|
|
55
58
|
export type TabDropSourceData = TabDragData | FileDragData;
|
|
56
59
|
|
|
57
|
-
/**
|
|
58
|
-
|
|
60
|
+
/**
|
|
61
|
+
* A slot in a strip — a chip's edge, or the strip's own empty tail when `tabId` is absent.
|
|
62
|
+
*
|
|
63
|
+
* Target records are keyed by symbols as well as strings (pragmatic-dnd's `DropTargetRecord`), and
|
|
64
|
+
* a chip's carries one: `attachClosestEdge` stores the edge under a symbol key.
|
|
65
|
+
*/
|
|
66
|
+
export interface TabSlotTarget extends Record<string | symbol, unknown> {
|
|
59
67
|
type: "tab-slot";
|
|
60
68
|
paneId: string;
|
|
61
69
|
tabId?: string;
|
|
@@ -63,17 +71,17 @@ export interface TabSlotTarget extends Record<string, unknown> {
|
|
|
63
71
|
index: number;
|
|
64
72
|
}
|
|
65
73
|
|
|
66
|
-
export interface TabSlotRefusedTarget extends Record<string, unknown> {
|
|
74
|
+
export interface TabSlotRefusedTarget extends Record<string | symbol, unknown> {
|
|
67
75
|
type: "tab-slot-refused";
|
|
68
76
|
}
|
|
69
77
|
|
|
70
78
|
/** The right band of the last pane's stage, armed only while the grid is under {@link MAX_PANES}. */
|
|
71
|
-
export interface PaneEdgeTarget extends Record<string, unknown> {
|
|
79
|
+
export interface PaneEdgeTarget extends Record<string | symbol, unknown> {
|
|
72
80
|
type: "pane-edge";
|
|
73
81
|
paneId: string;
|
|
74
82
|
}
|
|
75
83
|
|
|
76
|
-
export interface PaneEdgeRefusedTarget extends Record<string, unknown> {
|
|
84
|
+
export interface PaneEdgeRefusedTarget extends Record<string | symbol, unknown> {
|
|
77
85
|
type: "pane-edge-refused";
|
|
78
86
|
}
|
|
79
87
|
|
|
@@ -93,8 +101,11 @@ export type TabDropTarget =
|
|
|
93
101
|
* anything else this module has no branch for) is refused at the SOURCE and never reaches a target
|
|
94
102
|
* closure at all.
|
|
95
103
|
*/
|
|
96
|
-
export function isTabDropSource(data:
|
|
97
|
-
return
|
|
104
|
+
export function isTabDropSource(data: unknown): data is TabDropSourceData {
|
|
105
|
+
return (
|
|
106
|
+
isJsonObject(data) &&
|
|
107
|
+
(data.type === "tab" || (data.type === "file-tree" && data.entryType === "file"))
|
|
108
|
+
);
|
|
98
109
|
}
|
|
99
110
|
|
|
100
111
|
/**
|
|
@@ -142,7 +153,7 @@ function edgeIndex(target: TabSlotTarget, edge: Edge | null): number {
|
|
|
142
153
|
}
|
|
143
154
|
|
|
144
155
|
async function resolveTabSlotDrop(source: TabDropSourceData, target: TabSlotTarget): Promise<void> {
|
|
145
|
-
const edge = extractClosestEdge(target
|
|
156
|
+
const edge = extractClosestEdge(target);
|
|
146
157
|
if (source.type === "tab") {
|
|
147
158
|
if (source.paneId === target.paneId) {
|
|
148
159
|
const pane = paneById(target.paneId);
|
|
@@ -202,18 +213,23 @@ async function resolvePaneEdgeDrop(
|
|
|
202
213
|
* `undefined` for a drag cancelled off every target — both are legal and both mean nothing landed.
|
|
203
214
|
*/
|
|
204
215
|
export async function resolveTabDrop(
|
|
205
|
-
source:
|
|
206
|
-
target:
|
|
216
|
+
source: Pick<ElementDragPayload, "data">,
|
|
217
|
+
target: Pick<DropTargetRecord, "data"> | undefined,
|
|
207
218
|
): Promise<void> {
|
|
208
219
|
if (!target || !isTabDropSource(source.data)) {
|
|
209
220
|
return;
|
|
210
221
|
}
|
|
211
222
|
const sourceData = source.data;
|
|
212
223
|
if (target.data.type === "tab-slot") {
|
|
224
|
+
/* SAFETY: a `tab-slot` record is only ever produced by `tab-strip.ts`'s two `getData`
|
|
225
|
+
closures (a chip's and a strip tail's), and both write a string `paneId` and a numeric
|
|
226
|
+
`index` beside the type, with `tabId` only on a chip's. */
|
|
213
227
|
await resolveTabSlotDrop(sourceData, target.data as TabSlotTarget);
|
|
214
228
|
return;
|
|
215
229
|
}
|
|
216
230
|
if (target.data.type === "pane-edge") {
|
|
231
|
+
/* SAFETY: a `pane-edge` record is only ever produced by `pane-grid.ts`'s edge-zone `getData`,
|
|
232
|
+
whose `PaneEdgeData` pairs that type with a string `paneId`. */
|
|
217
233
|
await resolvePaneEdgeDrop(sourceData, target.data as PaneEdgeTarget);
|
|
218
234
|
}
|
|
219
235
|
// `tab-slot-refused` / `pane-edge-refused` / anything else: nothing.
|
package/src/panels/tab-strip.ts
CHANGED
|
@@ -62,6 +62,8 @@ import { activeRegistry } from "../commands/active-registry";
|
|
|
62
62
|
import { runActiveReported, runReported } from "../commands/run-reported";
|
|
63
63
|
import { PRESET_LABELS } from "../workspace/pane-derive";
|
|
64
64
|
import { localeLabel } from "@jxsuite/schema/locale";
|
|
65
|
+
import { isBoolean } from "@jxsuite/schema/guards";
|
|
66
|
+
import type { CommandArgValues } from "../commands/command-args";
|
|
65
67
|
import { tabOfPane } from "../canvas/canvas-surface";
|
|
66
68
|
import { mediaDisplayName } from "./shared";
|
|
67
69
|
import { mountTabStripSurface } from "../surfaces/tab-strip";
|
|
@@ -183,8 +185,8 @@ export function mount(host: HTMLElement) {
|
|
|
183
185
|
}
|
|
184
186
|
_drag =
|
|
185
187
|
source.data.type === "tab"
|
|
186
|
-
? { kind: "tab", tabId: source.data.tabId
|
|
187
|
-
: { kind: "file", path: source.data.path
|
|
188
|
+
? { kind: "tab", tabId: source.data.tabId }
|
|
189
|
+
: { kind: "file", path: source.data.path };
|
|
188
190
|
// The tail target does not exist until a pane with no tabs is asked to grow one (§14.4's
|
|
189
191
|
// "Between panes" row; `project` draws it).
|
|
190
192
|
render();
|
|
@@ -198,6 +200,9 @@ export function mount(host: HTMLElement) {
|
|
|
198
200
|
}
|
|
199
201
|
const [target] = location.current.dropTargets;
|
|
200
202
|
const data = target?.data;
|
|
203
|
+
/* SAFETY: a `tab-slot` record comes only from this module's own two `getData` closures (a
|
|
204
|
+
chip's in `adoptChip`, the tail's in `adoptStrip`), and both write a numeric `index` and a
|
|
205
|
+
string `paneId` beside that type. */
|
|
201
206
|
_over =
|
|
202
207
|
data?.type === "tab-slot"
|
|
203
208
|
? {
|
|
@@ -249,7 +254,7 @@ export function mount(host: HTMLElement) {
|
|
|
249
254
|
void tab.session.openedFrom;
|
|
250
255
|
// The draft pill is on the chip, so the chip has to repaint when the flag changes — reading
|
|
251
256
|
// The absent key tracks its ADDITION too, which is the transition that matters most.
|
|
252
|
-
void tab.doc.content
|
|
257
|
+
void tab.doc.content.frontmatter[DRAFT_FIELD];
|
|
253
258
|
}
|
|
254
259
|
// An edit is a commitment: a preview tab with unsaved changes is no longer disposable, and
|
|
255
260
|
// The dirty flags this effect already tracks are exactly the signal.
|
|
@@ -370,8 +375,8 @@ function paint(pane: Pane, host: HTMLElement): void {
|
|
|
370
375
|
microtask later — so a strip whose one tab has just come back has no tab marked current at
|
|
371
376
|
the instant this runs. The flow already knows which chip it wants; asking the tree instead
|
|
372
377
|
is asking a question we have the answer to, and getting it one tick early. */
|
|
373
|
-
|
|
374
|
-
.find((chip) => chip.dataset.tab === pane.activeTabId)
|
|
378
|
+
[...strip.children]
|
|
379
|
+
.find((chip) => chip instanceof HTMLElement && chip.dataset.tab === pane.activeTabId)
|
|
375
380
|
?.scrollIntoView({ block: "nearest", inline: "nearest" });
|
|
376
381
|
}
|
|
377
382
|
|
|
@@ -801,8 +806,8 @@ function onWheel(e: WheelEvent) {
|
|
|
801
806
|
if (e.ctrlKey) {
|
|
802
807
|
return;
|
|
803
808
|
}
|
|
804
|
-
const el = e.currentTarget
|
|
805
|
-
if (el.scrollWidth <= el.clientWidth) {
|
|
809
|
+
const el = e.currentTarget;
|
|
810
|
+
if (!(el instanceof HTMLElement) || el.scrollWidth <= el.clientWidth) {
|
|
806
811
|
return;
|
|
807
812
|
}
|
|
808
813
|
const delta = Math.abs(e.deltaX) > Math.abs(e.deltaY) ? e.deltaX : e.deltaY;
|
|
@@ -832,7 +837,9 @@ export function hiddenTabIds(paneId: string = workspace.activePaneId): string[]
|
|
|
832
837
|
const left = strip.scrollLeft;
|
|
833
838
|
const right = left + strip.clientWidth;
|
|
834
839
|
const hidden: string[] = [];
|
|
835
|
-
|
|
840
|
+
/* Typed, not filtered: a chip's position is what pairs it with `pane.tabOrder[index]`, so dropping
|
|
841
|
+
a node here would shift every later chip onto the wrong tab id. */
|
|
842
|
+
const chips = [...strip.querySelectorAll<HTMLElement>('[part="tab"]')];
|
|
836
843
|
for (const [index, chip] of chips.entries()) {
|
|
837
844
|
const id = pane.tabOrder[index];
|
|
838
845
|
if (id && (chip.offsetLeft < left || chip.offsetLeft + chip.offsetWidth > right)) {
|
|
@@ -889,8 +896,8 @@ function openOverflowMenu(pane: Pane, labels: Map<string, string>, anchorEl: HTM
|
|
|
889
896
|
place: (box) => ({ x: Math.max(4, anchor.right - box.width), y: anchor.bottom }),
|
|
890
897
|
placement: "block-end span-inline-start",
|
|
891
898
|
region: "tab-overflow",
|
|
892
|
-
rows: ids.map((id) => ({
|
|
893
|
-
checked:
|
|
899
|
+
rows: ids.map((id): MenuRowProjection => ({
|
|
900
|
+
checked: id === pane.activeTabId ? "true" : "false",
|
|
894
901
|
destructive: false,
|
|
895
902
|
disabled: false,
|
|
896
903
|
dividerAbove: false,
|
|
@@ -931,8 +938,8 @@ export function dismissTabContextMenu() {
|
|
|
931
938
|
* where it lands (`content/draft-state.ts` says why), so the row offers the flip of what is true
|
|
932
939
|
* now and {@link statedChecked} reads the current state back out of it for the checkmark.
|
|
933
940
|
*/
|
|
934
|
-
function tabRowFacts(tab: Tab):
|
|
935
|
-
const facts:
|
|
941
|
+
function tabRowFacts(tab: Tab): CommandArgValues {
|
|
942
|
+
const facts: CommandArgValues = {};
|
|
936
943
|
if (collectionOfPath(tab.documentPath)) {
|
|
937
944
|
facts.draft = !isDraftEntry(entryFields(tab));
|
|
938
945
|
}
|
|
@@ -961,14 +968,14 @@ function tabRowFacts(tab: Tab): Record<string, unknown> {
|
|
|
961
968
|
* already knows how to announce — and the five rows that carry no state stay plain `menuitem`s,
|
|
962
969
|
* which `selects` on the old menu would have made impossible.
|
|
963
970
|
*/
|
|
964
|
-
function statedChecked(args:
|
|
971
|
+
function statedChecked(args: CommandArgValues): "true" | "false" | undefined {
|
|
965
972
|
const entries = Object.entries(args);
|
|
966
|
-
const
|
|
967
|
-
if (!
|
|
973
|
+
const value = entries.length === 1 ? entries[0]?.[1] : undefined;
|
|
974
|
+
if (!isBoolean(value)) {
|
|
968
975
|
return undefined;
|
|
969
976
|
}
|
|
970
977
|
// The fact is the state the row would REACH, so the state it is in now is the negation.
|
|
971
|
-
return
|
|
978
|
+
return value ? "false" : "true";
|
|
972
979
|
}
|
|
973
980
|
|
|
974
981
|
/**
|
|
@@ -989,13 +996,11 @@ function placedTabItems(tab: Tab): MenuRowProjection[] {
|
|
|
989
996
|
const items: MenuRowProjection[] = [];
|
|
990
997
|
let group: string | undefined;
|
|
991
998
|
for (const command of registry.forPlacement("context/tab")) {
|
|
992
|
-
const schema = command.args
|
|
993
|
-
| { properties?: Record<string, unknown>; required?: readonly string[] }
|
|
994
|
-
| undefined;
|
|
999
|
+
const schema = command.args;
|
|
995
1000
|
if (!(schema?.required ?? []).every((key) => key in facts)) {
|
|
996
1001
|
continue;
|
|
997
1002
|
}
|
|
998
|
-
const args:
|
|
1003
|
+
const args: CommandArgValues = {};
|
|
999
1004
|
for (const key of Object.keys(schema?.properties ?? {})) {
|
|
1000
1005
|
if (key in facts) {
|
|
1001
1006
|
args[key] = facts[key];
|
|
@@ -1005,21 +1010,26 @@ function placedTabItems(tab: Tab): MenuRowProjection[] {
|
|
|
1005
1010
|
({ group } = command);
|
|
1006
1011
|
const reason = registry.disabledReason(command.id);
|
|
1007
1012
|
const checked = statedChecked(args);
|
|
1008
|
-
|
|
1013
|
+
const row: Omit<MenuRowProjection, "disabled"> = {
|
|
1009
1014
|
destructive: command.destructive === true,
|
|
1010
1015
|
dividerAbove,
|
|
1011
1016
|
id: command.id,
|
|
1012
1017
|
title: command.title,
|
|
1013
|
-
|
|
1014
|
-
|
|
1018
|
+
};
|
|
1019
|
+
if (checked !== undefined) {
|
|
1020
|
+
row.checked = checked;
|
|
1021
|
+
}
|
|
1022
|
+
items.push(
|
|
1023
|
+
reason === undefined
|
|
1015
1024
|
? {
|
|
1025
|
+
...row,
|
|
1016
1026
|
disabled: false,
|
|
1017
1027
|
run: () => {
|
|
1018
1028
|
void runReported(registry, command.id, args, "Tabs");
|
|
1019
1029
|
},
|
|
1020
1030
|
}
|
|
1021
|
-
: { disabled: true, requires: reason }
|
|
1022
|
-
|
|
1031
|
+
: { ...row, disabled: true, requires: reason },
|
|
1032
|
+
);
|
|
1023
1033
|
}
|
|
1024
1034
|
return items;
|
|
1025
1035
|
}
|
|
@@ -1270,7 +1280,7 @@ export function shouldWarnOnClose(tab: Tab): boolean {
|
|
|
1270
1280
|
if (residue) {
|
|
1271
1281
|
return true;
|
|
1272
1282
|
}
|
|
1273
|
-
const peersHere = state.peers.filter((p) => p.state
|
|
1283
|
+
const peersHere = state.peers.filter((p) => p.state.focusedPath === tab.documentPath);
|
|
1274
1284
|
return peersHere.length === 0;
|
|
1275
1285
|
}
|
|
1276
1286
|
|
package/src/platform-errors.ts
CHANGED
|
@@ -14,6 +14,8 @@
|
|
|
14
14
|
|
|
15
15
|
import { problemSlug } from "@jxsuite/protocol";
|
|
16
16
|
import type { OfferedAction, RetryHint } from "@jxsuite/protocol";
|
|
17
|
+
import { isJsonObject, isString } from "@jxsuite/schema/guards";
|
|
18
|
+
import type { JsonValue } from "@jxsuite/schema/types";
|
|
17
19
|
|
|
18
20
|
export interface PlatformErrorInfo {
|
|
19
21
|
code?: string;
|
|
@@ -32,36 +34,44 @@ const RETRY_HINTS = new Set<string>(["reload", "repeat", "none"]);
|
|
|
32
34
|
* The offered actions a wire value holds, each one checked: an action needs an `id` and a `label`
|
|
33
35
|
* to be drawn at all, and anything else it carries is kept only when it has the right type. A
|
|
34
36
|
* malformed entry is dropped rather than drawn as a button that does nothing.
|
|
37
|
+
*
|
|
38
|
+
* A typed `OfferedAction[]` is accepted too, and checked the same way: it is what a response body
|
|
39
|
+
* cast to its protocol type holds, and nothing has verified that cast.
|
|
35
40
|
*/
|
|
36
|
-
export function offeredActions(
|
|
41
|
+
export function offeredActions(
|
|
42
|
+
value: JsonValue | readonly OfferedAction[] | undefined,
|
|
43
|
+
): OfferedAction[] {
|
|
37
44
|
if (!Array.isArray(value)) {
|
|
38
45
|
return [];
|
|
39
46
|
}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
if (
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
!raw.label
|
|
48
|
-
) {
|
|
47
|
+
const entries: readonly (JsonValue | OfferedAction)[] = value;
|
|
48
|
+
return entries.flatMap((entry): OfferedAction[] => {
|
|
49
|
+
if (!isJsonObject(entry)) {
|
|
50
|
+
return [];
|
|
51
|
+
}
|
|
52
|
+
const { href, id, label, primary } = entry;
|
|
53
|
+
if (!isString(id) || !id || !isString(label) || !label) {
|
|
49
54
|
return [];
|
|
50
55
|
}
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
];
|
|
56
|
+
const action: OfferedAction = { id, label };
|
|
57
|
+
if (isString(href) && href) {
|
|
58
|
+
action.href = href;
|
|
59
|
+
}
|
|
60
|
+
if (primary === true) {
|
|
61
|
+
action.primary = true;
|
|
62
|
+
}
|
|
63
|
+
return [action];
|
|
59
64
|
});
|
|
60
65
|
}
|
|
61
66
|
|
|
67
|
+
/** Whether a value names one of the retry hints this client knows. */
|
|
68
|
+
function isRetryHint(value: JsonValue | undefined): value is RetryHint {
|
|
69
|
+
return isString(value) && RETRY_HINTS.has(value);
|
|
70
|
+
}
|
|
71
|
+
|
|
62
72
|
/** The retry hint a wire value names, or undefined when it names none we know. */
|
|
63
|
-
export function retryHint(value:
|
|
64
|
-
return
|
|
73
|
+
export function retryHint(value: JsonValue | undefined): RetryHint | undefined {
|
|
74
|
+
return isRetryHint(value) ? value : undefined;
|
|
65
75
|
}
|
|
66
76
|
|
|
67
77
|
/**
|
|
@@ -74,33 +84,37 @@ function normalizeCode(value: string): string {
|
|
|
74
84
|
}
|
|
75
85
|
|
|
76
86
|
/** Machine-readable fields carried by a thrown platform error (empty object when none). */
|
|
77
|
-
export function platformErrorInfo(
|
|
78
|
-
|
|
87
|
+
export function platformErrorInfo(cause: unknown): PlatformErrorInfo {
|
|
88
|
+
/* An Error carrying the members an adapter assigned onto it passes as a JSON object here: every
|
|
89
|
+
member below is read through a check that accepts any value, so nothing trusts that typing. */
|
|
90
|
+
if (!isJsonObject(cause)) {
|
|
79
91
|
return {};
|
|
80
92
|
}
|
|
81
|
-
const { actions, code, heading, installUrl, retry, type } =
|
|
82
|
-
|
|
83
|
-
code?: unknown;
|
|
84
|
-
heading?: unknown;
|
|
85
|
-
installUrl?: unknown;
|
|
86
|
-
retry?: unknown;
|
|
87
|
-
type?: unknown;
|
|
88
|
-
};
|
|
89
|
-
const hint = retryHint(retry);
|
|
93
|
+
const { actions, code, heading, installUrl, retry, type } = cause;
|
|
94
|
+
const info: PlatformErrorInfo = {};
|
|
90
95
|
// A problem type wins over a legacy code: it is the shape the backend is migrating toward.
|
|
91
|
-
const derived = problemSlug(type) ?? (
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
96
|
+
const derived = problemSlug(type) ?? (isString(code) ? normalizeCode(code) : null);
|
|
97
|
+
if (derived !== null) {
|
|
98
|
+
info.code = derived;
|
|
99
|
+
}
|
|
100
|
+
if (isString(installUrl)) {
|
|
101
|
+
info.installUrl = installUrl;
|
|
102
|
+
}
|
|
103
|
+
if (actions !== undefined) {
|
|
104
|
+
info.actions = offeredActions(actions);
|
|
105
|
+
}
|
|
106
|
+
if (isString(heading) && heading) {
|
|
107
|
+
info.heading = heading;
|
|
108
|
+
}
|
|
109
|
+
if (isRetryHint(retry)) {
|
|
110
|
+
info.retry = retry;
|
|
111
|
+
}
|
|
112
|
+
return info;
|
|
99
113
|
}
|
|
100
114
|
|
|
101
115
|
/** The GitHub-App install link when the error is the structured needs-installation 403. */
|
|
102
|
-
export function installUrlOf(
|
|
103
|
-
const info = platformErrorInfo(
|
|
116
|
+
export function installUrlOf(cause: unknown): string | null {
|
|
117
|
+
const info = platformErrorInfo(cause);
|
|
104
118
|
return info.code === "needs-installation-access" && info.installUrl ? info.installUrl : null;
|
|
105
119
|
}
|
|
106
120
|
|
|
@@ -108,6 +122,6 @@ export function installUrlOf(error: unknown): string | null {
|
|
|
108
122
|
* True when the error is an `action-required` refusal (HTTP 403, desktop.md §10.4) — whether the
|
|
109
123
|
* backend sent the problem type or the legacy `action_required` code.
|
|
110
124
|
*/
|
|
111
|
-
export function isActionRequired(
|
|
112
|
-
return platformErrorInfo(
|
|
125
|
+
export function isActionRequired(cause: unknown): boolean {
|
|
126
|
+
return platformErrorInfo(cause).code === "action-required";
|
|
113
127
|
}
|
package/src/platform.ts
CHANGED
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
* without ever calling the registrar, and this is the seam both paths share.
|
|
19
19
|
*/
|
|
20
20
|
|
|
21
|
+
import { isFunction, isNonNullObject, isString } from "@jxsuite/schema/guards";
|
|
21
22
|
import type { StudioPlatform } from "./types";
|
|
22
23
|
|
|
23
24
|
/** What a launcher's boot module recorded when its adapter could not be constructed. */
|
|
@@ -42,14 +43,16 @@ export interface LauncherSignal {
|
|
|
42
43
|
error?: LauncherBootError | undefined;
|
|
43
44
|
}
|
|
44
45
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
46
|
+
declare global {
|
|
47
|
+
/** The registered adapter, set by `registerPlatform` or pre-registered by a launcher bundle. */
|
|
48
|
+
var __jxPlatform: StudioPlatform | undefined;
|
|
49
|
+
/** The launcher's boot signal (spec/desktop.md §3.3), when a launcher announced itself. */
|
|
50
|
+
var __jxLauncher: LauncherSignal | undefined;
|
|
51
|
+
}
|
|
49
52
|
|
|
50
53
|
/** @param {StudioPlatform} platform */
|
|
51
54
|
export function registerPlatform(platform: StudioPlatform) {
|
|
52
|
-
|
|
55
|
+
globalThis.__jxPlatform = platform;
|
|
53
56
|
}
|
|
54
57
|
|
|
55
58
|
/**
|
|
@@ -58,13 +61,12 @@ export function registerPlatform(platform: StudioPlatform) {
|
|
|
58
61
|
* Idempotent, so an error recorded by the first announcer survives a second call.
|
|
59
62
|
*/
|
|
60
63
|
export function announceLauncher(): LauncherSignal {
|
|
61
|
-
|
|
62
|
-
return g.__jxLauncher;
|
|
64
|
+
return (globalThis.__jxLauncher ??= {});
|
|
63
65
|
}
|
|
64
66
|
|
|
65
67
|
/** The launcher signal, when a launcher's boot module announced itself in this window. */
|
|
66
68
|
export function launcherSignal(): LauncherSignal | undefined {
|
|
67
|
-
return
|
|
69
|
+
return globalThis.__jxLauncher;
|
|
68
70
|
}
|
|
69
71
|
|
|
70
72
|
// ─── In-flight accounting ─────────────────────────────────────────────────────
|
|
@@ -102,6 +104,39 @@ function leave(method: string): void {
|
|
|
102
104
|
}
|
|
103
105
|
}
|
|
104
106
|
|
|
107
|
+
/** A promise-like result, recognised the way `await` recognises one: by a callable `then`. */
|
|
108
|
+
function isThenable(value: unknown): value is PromiseLike<unknown> {
|
|
109
|
+
return (isNonNullObject(value) || isFunction(value)) && "then" in value && isFunction(value.then);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* One adapter method, wrapped so each call whose result is a promise counts as in flight under
|
|
114
|
+
* `method` until that promise settles. Any other result is returned untouched.
|
|
115
|
+
*
|
|
116
|
+
* The arguments are `never[]` because the wrapper is reached through the proxy, whose callers are
|
|
117
|
+
* typed by the member's own StudioPlatform signature; it relays whatever they pass, unread.
|
|
118
|
+
*/
|
|
119
|
+
function countCalls<R>(
|
|
120
|
+
method: string,
|
|
121
|
+
member: (...args: never[]) => R,
|
|
122
|
+
adapter: StudioPlatform,
|
|
123
|
+
): (...args: never[]) => R {
|
|
124
|
+
return (...args: never[]): R => {
|
|
125
|
+
const result = member.apply(adapter, args);
|
|
126
|
+
if (!isThenable(result)) {
|
|
127
|
+
return result;
|
|
128
|
+
}
|
|
129
|
+
enter(method);
|
|
130
|
+
const settle = () => {
|
|
131
|
+
leave(method);
|
|
132
|
+
};
|
|
133
|
+
// Both arms: a rejected platform call is a call that FINISHED. Leaving it counted would
|
|
134
|
+
// Wedge every later `idle()` behind an error the caller already handled.
|
|
135
|
+
result.then(settle, settle);
|
|
136
|
+
return result;
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
|
|
105
140
|
/**
|
|
106
141
|
* Wrap an adapter so every promise-returning member is counted while it is outstanding.
|
|
107
142
|
*
|
|
@@ -111,13 +146,20 @@ function leave(method: string): void {
|
|
|
111
146
|
* derive `capability.*`, and a fresh closure per read would allocate on every predicate).
|
|
112
147
|
*/
|
|
113
148
|
function countingPlatform(platform: StudioPlatform): StudioPlatform {
|
|
114
|
-
const wrappers = new Map<
|
|
149
|
+
const wrappers = new Map<
|
|
150
|
+
string,
|
|
151
|
+
{ raw: StudioPlatform[keyof StudioPlatform]; wrapper: unknown }
|
|
152
|
+
>();
|
|
115
153
|
return new Proxy(platform, {
|
|
116
154
|
get(target, property) {
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
155
|
+
/* `this` stays the raw adapter: a proxy receiver would re-enter this trap for every internal
|
|
156
|
+
property read the method makes, counting nothing and costing everything.
|
|
157
|
+
SAFETY: a get trap is asked for any key, not only the ones StudioPlatform declares (`then`
|
|
158
|
+
when the proxy is awaited, inherited `toString`, symbols). An undeclared key reads as
|
|
159
|
+
undefined or an Object.prototype member, which the checks below relay untouched or wrap
|
|
160
|
+
exactly as they would a declared method, so the keyof claim never reaches a caller. */
|
|
161
|
+
const value = target[property as keyof StudioPlatform];
|
|
162
|
+
if (!isFunction(value) || !isString(property)) {
|
|
121
163
|
return value;
|
|
122
164
|
}
|
|
123
165
|
// Keyed by the FUNCTION, not just the name: an adapter whose method is replaced later (a
|
|
@@ -127,21 +169,7 @@ function countingPlatform(platform: StudioPlatform): StudioPlatform {
|
|
|
127
169
|
if (cached && cached.raw === value) {
|
|
128
170
|
return cached.wrapper;
|
|
129
171
|
}
|
|
130
|
-
const
|
|
131
|
-
const wrapper = (...args: unknown[]): unknown => {
|
|
132
|
-
const result = (value as (...a: unknown[]) => unknown).apply(target, args);
|
|
133
|
-
if (typeof (result as PromiseLike<unknown> | null)?.then !== "function") {
|
|
134
|
-
return result;
|
|
135
|
-
}
|
|
136
|
-
enter(method);
|
|
137
|
-
const settle = () => {
|
|
138
|
-
leave(method);
|
|
139
|
-
};
|
|
140
|
-
// Both arms: a rejected platform call is a call that FINISHED. Leaving it counted would
|
|
141
|
-
// Wedge every later `idle()` behind an error the caller already handled.
|
|
142
|
-
(result as PromiseLike<unknown>).then(settle, settle);
|
|
143
|
-
return result;
|
|
144
|
-
};
|
|
172
|
+
const wrapper = countCalls<ReturnType<typeof value>>(property, value, target);
|
|
145
173
|
wrappers.set(property, { raw: value, wrapper });
|
|
146
174
|
return wrapper;
|
|
147
175
|
},
|
|
@@ -153,7 +181,7 @@ let counted: { raw: StudioPlatform; wrapped: StudioPlatform } | null = null;
|
|
|
153
181
|
|
|
154
182
|
/** @returns {StudioPlatform} */
|
|
155
183
|
export function getPlatform() {
|
|
156
|
-
const raw =
|
|
184
|
+
const raw = globalThis.__jxPlatform;
|
|
157
185
|
if (!raw) {
|
|
158
186
|
throw new Error("No platform registered. Call registerPlatform() before starting Studio.");
|
|
159
187
|
}
|
|
@@ -165,5 +193,5 @@ export function getPlatform() {
|
|
|
165
193
|
|
|
166
194
|
/** @returns {boolean} */
|
|
167
195
|
export function hasPlatform() {
|
|
168
|
-
return
|
|
196
|
+
return globalThis.__jxPlatform != null;
|
|
169
197
|
}
|