@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
|
@@ -39,9 +39,13 @@ import type { TransactionRecord } from "../tabs/patch-ops";
|
|
|
39
39
|
import type { Tab } from "../tabs/tab";
|
|
40
40
|
import type { JxDocOp } from "@jxsuite/schema/doc-ops";
|
|
41
41
|
import type { CollabHandle } from "@jxsuite/collab/provider";
|
|
42
|
-
import type { JxMutableNode } from "@jxsuite/schema/types";
|
|
42
|
+
import type { JxDocumentValue, JxMutableNode, JxPath } from "@jxsuite/schema/types";
|
|
43
43
|
import type * as CollabNS from "@jxsuite/collab";
|
|
44
|
+
import type { CollabAwarenessState } from "@jxsuite/collab/awareness-types";
|
|
45
|
+
import type { DocumentRecord } from "@jxsuite/collab/schema";
|
|
46
|
+
import type * as Y from "yjs";
|
|
44
47
|
import { collabState, registerCollabPath, unregisterCollabPath } from "./collab-state";
|
|
48
|
+
import type { PeerPresence } from "./collab-state";
|
|
45
49
|
import { notify } from "../services/notify";
|
|
46
50
|
|
|
47
51
|
type CollabModule = typeof CollabNS;
|
|
@@ -89,7 +93,7 @@ export function configureCollabSerializer(fn: ((tab: Tab) => Promise<string>) |
|
|
|
89
93
|
export type CollabParser = (
|
|
90
94
|
tab: Tab,
|
|
91
95
|
text: string,
|
|
92
|
-
) => Promise<{ document: JxMutableNode; frontmatter?:
|
|
96
|
+
) => Promise<{ document: JxMutableNode; frontmatter?: DocumentRecord }>;
|
|
93
97
|
|
|
94
98
|
let _parse: CollabParser | null = null;
|
|
95
99
|
|
|
@@ -158,11 +162,43 @@ interface TabRuntime {
|
|
|
158
162
|
optedOut: { value: boolean };
|
|
159
163
|
}
|
|
160
164
|
|
|
165
|
+
/**
|
|
166
|
+
* What a session's undo manager hands its stack listeners. A stack item's `meta` is Yjs's scratch
|
|
167
|
+
* map for whoever owns the manager, and the two listeners in createSession are its only users: the
|
|
168
|
+
* one key they write is the selection snapshot.
|
|
169
|
+
*/
|
|
170
|
+
interface StackItemEvent {
|
|
171
|
+
stackItem: { meta: Map<"selection", JxPath[]> };
|
|
172
|
+
}
|
|
173
|
+
|
|
161
174
|
const runtimes = new WeakMap<Tab, TabRuntime>();
|
|
162
175
|
|
|
163
176
|
/** Callers hold either the raw tab or a reactive proxy of it; key runtimes by the raw object. */
|
|
164
177
|
function rawTab(tab: Tab): Tab {
|
|
165
|
-
return toRaw(tab
|
|
178
|
+
return toRaw(tab);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* The document's shared frontmatter map, at the value type its writers keep.
|
|
183
|
+
*
|
|
184
|
+
* `frontmatterMap` hands back an untyped `Y.Map`, but only three writers ever touch it: the first
|
|
185
|
+
* client's `seedStructure` (a {@link DocumentRecord}) and the two mirrors in this module, which copy
|
|
186
|
+
* entries of a {@link DocumentRecord}. A key a parser left cleared may hold `undefined`, as
|
|
187
|
+
* DocumentRecord itself allows.
|
|
188
|
+
*/
|
|
189
|
+
function sharedFrontmatterOf(collab: CollabModule, doc: Y.Doc): Y.Map<JxDocumentValue | undefined> {
|
|
190
|
+
// SAFETY: every write to this map is a DocumentRecord entry (see the doc comment above).
|
|
191
|
+
return collab.frontmatterMap(doc) as Y.Map<JxDocumentValue | undefined>;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* Whether the session is still synced, read fresh.
|
|
196
|
+
*
|
|
197
|
+
* A detach flips `synced` while an awaited parse or serialization is in flight; the narrowing
|
|
198
|
+
* TypeScript carries over from a check made before the `await` cannot see that.
|
|
199
|
+
*/
|
|
200
|
+
function stillSynced(session: ActiveSession): boolean {
|
|
201
|
+
return session.synced;
|
|
166
202
|
}
|
|
167
203
|
|
|
168
204
|
function runtimeOf(tab: Tab): TabRuntime | undefined {
|
|
@@ -238,7 +274,7 @@ function onTransact(tab: Tab, record: TransactionRecord, origin: TransactOrigin)
|
|
|
238
274
|
if (!session || !session.synced) {
|
|
239
275
|
return;
|
|
240
276
|
}
|
|
241
|
-
session.lastSeenRef = toRaw(tab.doc.document)
|
|
277
|
+
session.lastSeenRef = toRaw(tab.doc.document);
|
|
242
278
|
if (origin === "remote") {
|
|
243
279
|
// The reconciler keeps source text fresh regardless of WHO edited the structure. The tab's
|
|
244
280
|
// Dirty state is driven by the server's room-level `doc-dirty` broadcast (see onDirty in
|
|
@@ -307,7 +343,7 @@ function publishRecord(session: ActiveSession, record: TransactionRecord): void
|
|
|
307
343
|
function publishDiff(session: ActiveSession): void {
|
|
308
344
|
const { collab, handle, tab } = session;
|
|
309
345
|
const before = collab.yDocToJson(handle.doc);
|
|
310
|
-
const after = jsonClone(toRaw(tab.doc.document))
|
|
346
|
+
const after = jsonClone(toRaw(tab.doc.document));
|
|
311
347
|
const ops = collab.diffDocs(before, after);
|
|
312
348
|
if (ops === null) {
|
|
313
349
|
collab.replaceYStructure(handle.doc, after, collab.LOCAL_ORIGIN);
|
|
@@ -326,7 +362,7 @@ function reconcileTabFromY(session: ActiveSession): void {
|
|
|
326
362
|
transactDoc(
|
|
327
363
|
session.tab,
|
|
328
364
|
(t) => {
|
|
329
|
-
const target = t.doc.document
|
|
365
|
+
const target = t.doc.document;
|
|
330
366
|
for (const key of Object.keys(target)) {
|
|
331
367
|
if (!(key in next)) {
|
|
332
368
|
delete target[key];
|
|
@@ -348,7 +384,7 @@ function isReconciler(session: ActiveSession): boolean {
|
|
|
348
384
|
const { awareness } = session.handle;
|
|
349
385
|
let lowest = awareness.clientID;
|
|
350
386
|
for (const [clientId, state] of awareness.getStates()) {
|
|
351
|
-
if (
|
|
387
|
+
if (state["canWrite"] !== false && clientId < lowest) {
|
|
352
388
|
lowest = clientId;
|
|
353
389
|
}
|
|
354
390
|
}
|
|
@@ -416,7 +452,7 @@ async function sourceParseNow(session: ActiveSession): Promise<void> {
|
|
|
416
452
|
// Unparseable source: keep the last good structure (the preview goes stale, not wrong).
|
|
417
453
|
return;
|
|
418
454
|
}
|
|
419
|
-
if (!session
|
|
455
|
+
if (!stillSynced(session) || collab.canonicalRevOf(handle.doc) !== rev) {
|
|
420
456
|
// The lock flipped while parsing; this mirror was computed against a dead representation.
|
|
421
457
|
return;
|
|
422
458
|
}
|
|
@@ -430,7 +466,7 @@ async function sourceParseNow(session: ActiveSession): Promise<void> {
|
|
|
430
466
|
collab.replaceYStructure(handle.doc, parsed.document, collab.MIRROR_ORIGIN);
|
|
431
467
|
}
|
|
432
468
|
}
|
|
433
|
-
const frontmatter = collab
|
|
469
|
+
const frontmatter = sharedFrontmatterOf(collab, handle.doc);
|
|
434
470
|
const next = parsed.frontmatter ?? {};
|
|
435
471
|
handle.doc.transact(() => {
|
|
436
472
|
// Detached copy: keys are deleted while iterating.
|
|
@@ -541,12 +577,7 @@ export function collabSourceContext(tab: Tab): {
|
|
|
541
577
|
reason: a client that cannot write cannot be the one holding a write. */
|
|
542
578
|
const others = collab
|
|
543
579
|
.otherSourceEditors(handle.awareness, session.path, handle.awareness.clientID)
|
|
544
|
-
.filter((clientId) =>
|
|
545
|
-
const peer = handle.awareness.getStates().get(clientId) as
|
|
546
|
-
| { canWrite?: boolean }
|
|
547
|
-
| undefined;
|
|
548
|
-
return peer?.canWrite !== false;
|
|
549
|
-
});
|
|
580
|
+
.filter((clientId) => handle.awareness.getStates().get(clientId)?.["canWrite"] !== false);
|
|
550
581
|
if (others.length === 0) {
|
|
551
582
|
// Freshen the structure mirror once more, then hand the lock back.
|
|
552
583
|
void sourceParseNow(session).then(() => {
|
|
@@ -729,16 +760,15 @@ async function attachSession(tab: Tab): Promise<void> {
|
|
|
729
760
|
handle.destroy();
|
|
730
761
|
return;
|
|
731
762
|
}
|
|
732
|
-
|
|
763
|
+
// Assigned synchronously: a Promise executor runs before its constructor returns.
|
|
764
|
+
let timer: ReturnType<typeof setTimeout> | undefined;
|
|
733
765
|
const timeout = new Promise<never>((_, reject) => {
|
|
734
766
|
timer = setTimeout(() => reject(new Error("collab-sync-timeout")), SYNC_TIMEOUT_MS);
|
|
735
767
|
});
|
|
736
768
|
try {
|
|
737
769
|
await Promise.race([handle.whenSynced, timeout]);
|
|
738
770
|
} finally {
|
|
739
|
-
|
|
740
|
-
clearTimeout(timer);
|
|
741
|
-
}
|
|
771
|
+
clearTimeout(timer);
|
|
742
772
|
}
|
|
743
773
|
if (runtime.generation !== generation) {
|
|
744
774
|
handle.destroy();
|
|
@@ -804,7 +834,7 @@ function detachSession(tab: Tab): void {
|
|
|
804
834
|
// Re-base the op-log history on the current document for solo editing.
|
|
805
835
|
tab.history.snapshots = [
|
|
806
836
|
{
|
|
807
|
-
document: jsonClone(toRaw(tab.doc.document))
|
|
837
|
+
document: jsonClone(toRaw(tab.doc.document)),
|
|
808
838
|
selection: cloneSelection(tab.session.selection),
|
|
809
839
|
},
|
|
810
840
|
];
|
|
@@ -828,7 +858,7 @@ function createSession(
|
|
|
828
858
|
collab,
|
|
829
859
|
disposers: [],
|
|
830
860
|
handle,
|
|
831
|
-
lastSeenRef: toRaw(tab.doc.document)
|
|
861
|
+
lastSeenRef: toRaw(tab.doc.document),
|
|
832
862
|
mirrorTimer: null,
|
|
833
863
|
path,
|
|
834
864
|
sourceLockOwner: null,
|
|
@@ -843,7 +873,7 @@ function createSession(
|
|
|
843
873
|
const meta = collab.metaMap(handle.doc);
|
|
844
874
|
if (meta.get("structureSeeded") === true) {
|
|
845
875
|
const yJson = collab.yDocToJson(handle.doc);
|
|
846
|
-
const tabJson = jsonClone(toRaw(tab.doc.document))
|
|
876
|
+
const tabJson = jsonClone(toRaw(tab.doc.document));
|
|
847
877
|
if (!collab.deepEqual(yJson, tabJson)) {
|
|
848
878
|
const ops = collab.diffDocs(tabJson, yJson);
|
|
849
879
|
if (ops === null) {
|
|
@@ -855,19 +885,21 @@ function createSession(
|
|
|
855
885
|
}
|
|
856
886
|
}
|
|
857
887
|
session.applyingRemoteFrontmatter = true;
|
|
858
|
-
const sharedFrontmatter = collab
|
|
888
|
+
const sharedFrontmatter = sharedFrontmatterOf(collab, handle.doc);
|
|
859
889
|
for (const [key, value] of sharedFrontmatter.entries()) {
|
|
860
|
-
tab.doc.content.frontmatter[key] = value
|
|
890
|
+
tab.doc.content.frontmatter[key] = value;
|
|
861
891
|
}
|
|
862
892
|
session.applyingRemoteFrontmatter = false;
|
|
863
893
|
} else if (session.canWrite) {
|
|
864
|
-
collab.seedStructure(handle.doc, jsonClone(toRaw(tab.doc.document))
|
|
865
|
-
|
|
894
|
+
collab.seedStructure(handle.doc, jsonClone(toRaw(tab.doc.document)), {
|
|
895
|
+
/* SAFETY: frontmatter is parsed YAML/JSON held as plain values, and jsonClone round-trips it
|
|
896
|
+
* through JSON, so every value is JSON data, which JxDocumentValue includes. */
|
|
897
|
+
frontmatter: jsonClone(toRaw(tab.doc.content.frontmatter)) as DocumentRecord,
|
|
866
898
|
origin: collab.SEED_ORIGIN,
|
|
867
899
|
sourceFormat: tab.doc.sourceFormat,
|
|
868
900
|
});
|
|
869
901
|
}
|
|
870
|
-
session.lastSeenRef = toRaw(tab.doc.document)
|
|
902
|
+
session.lastSeenRef = toRaw(tab.doc.document);
|
|
871
903
|
|
|
872
904
|
// The server owns the room-level unsaved state: `onDirty` fires synchronously with the current
|
|
873
905
|
// Value on subscribe (delivered during the open handshake), so attaching to a clean room clears
|
|
@@ -902,11 +934,11 @@ function createSession(
|
|
|
902
934
|
{ trackedOrigins: new Set([collab.LOCAL_ORIGIN]) },
|
|
903
935
|
);
|
|
904
936
|
session.undoManager = undoManager;
|
|
905
|
-
const onStackAdd = ({ stackItem }:
|
|
937
|
+
const onStackAdd = ({ stackItem }: StackItemEvent) => {
|
|
906
938
|
stackItem.meta.set("selection", cloneSelection(tab.session.selection));
|
|
907
939
|
};
|
|
908
|
-
const onStackPop = ({ stackItem }:
|
|
909
|
-
const selection = stackItem.meta.get("selection")
|
|
940
|
+
const onStackPop = ({ stackItem }: StackItemEvent) => {
|
|
941
|
+
const selection = stackItem.meta.get("selection");
|
|
910
942
|
tab.session.selection = cloneSelection(selection ?? []);
|
|
911
943
|
};
|
|
912
944
|
undoManager.on("stack-item-added", onStackAdd);
|
|
@@ -928,11 +960,14 @@ function createSession(
|
|
|
928
960
|
|
|
929
961
|
// Inbound: remote structure transactions → JxDocOps → the surgical pipeline.
|
|
930
962
|
const structure = collab.structureMap(handle.doc);
|
|
931
|
-
const structureObserver = (
|
|
963
|
+
const structureObserver = (
|
|
964
|
+
events: Y.YEvent<Y.AbstractType<unknown>>[],
|
|
965
|
+
transaction: { origin: unknown },
|
|
966
|
+
) => {
|
|
932
967
|
if (transaction.origin === collab.LOCAL_ORIGIN || !session.synced) {
|
|
933
968
|
return;
|
|
934
969
|
}
|
|
935
|
-
const ops = collab.yEventsToDocOps(events
|
|
970
|
+
const ops = collab.yEventsToDocOps(events);
|
|
936
971
|
if (ops === null) {
|
|
937
972
|
reconcileTabFromY(session);
|
|
938
973
|
return;
|
|
@@ -963,7 +998,7 @@ function createSession(
|
|
|
963
998
|
// The source reconciler (lowest write clientID in source mode) parses Y.Text back into the
|
|
964
999
|
// Structure tree on a debounce, so every client's canvas previews source edits live.
|
|
965
1000
|
const source = collab.sourceText(handle.doc);
|
|
966
|
-
const sourceObserver = (_event:
|
|
1001
|
+
const sourceObserver = (_event: Y.YTextEvent, transaction: { origin: unknown }) => {
|
|
967
1002
|
if (transaction.origin === collab.MIRROR_ORIGIN || !session.synced) {
|
|
968
1003
|
return;
|
|
969
1004
|
}
|
|
@@ -981,13 +1016,13 @@ function createSession(
|
|
|
981
1016
|
void sourceParseNow(session);
|
|
982
1017
|
}, 600);
|
|
983
1018
|
};
|
|
984
|
-
source.observe(sourceObserver
|
|
985
|
-
session.disposers.push(() => source.unobserve(sourceObserver
|
|
1019
|
+
source.observe(sourceObserver);
|
|
1020
|
+
session.disposers.push(() => source.unobserve(sourceObserver));
|
|
986
1021
|
|
|
987
1022
|
// Inbound frontmatter (per-field).
|
|
988
|
-
const frontmatter = collab
|
|
1023
|
+
const frontmatter = sharedFrontmatterOf(collab, handle.doc);
|
|
989
1024
|
const frontmatterObserver = (
|
|
990
|
-
event:
|
|
1025
|
+
event: Y.YMapEvent<JxDocumentValue | undefined>,
|
|
991
1026
|
transaction: { origin: unknown },
|
|
992
1027
|
) => {
|
|
993
1028
|
if (transaction.origin === collab.LOCAL_ORIGIN || !session.synced) {
|
|
@@ -999,15 +1034,15 @@ function createSession(
|
|
|
999
1034
|
if (change.action === "delete") {
|
|
1000
1035
|
delete tab.doc.content.frontmatter[key];
|
|
1001
1036
|
} else {
|
|
1002
|
-
tab.doc.content.frontmatter[key] = frontmatter.get(key)
|
|
1037
|
+
tab.doc.content.frontmatter[key] = frontmatter.get(key);
|
|
1003
1038
|
}
|
|
1004
1039
|
}
|
|
1005
1040
|
} finally {
|
|
1006
1041
|
session.applyingRemoteFrontmatter = false;
|
|
1007
1042
|
}
|
|
1008
1043
|
};
|
|
1009
|
-
frontmatter.observe(frontmatterObserver
|
|
1010
|
-
session.disposers.push(() => frontmatter.unobserve(frontmatterObserver
|
|
1044
|
+
frontmatter.observe(frontmatterObserver);
|
|
1045
|
+
session.disposers.push(() => frontmatter.unobserve(frontmatterObserver));
|
|
1011
1046
|
|
|
1012
1047
|
// Outbound frontmatter: mutateUpdateFrontmatter bypasses transactDoc, so watch the map deeply.
|
|
1013
1048
|
tab.scope.run(() => {
|
|
@@ -1021,7 +1056,8 @@ function createSession(
|
|
|
1021
1056
|
if (session.applyingRemoteFrontmatter || !session.synced || !session.canWrite) {
|
|
1022
1057
|
return;
|
|
1023
1058
|
}
|
|
1024
|
-
|
|
1059
|
+
// SAFETY: `json` is JSON.stringify of the frontmatter record above, so it parses to one.
|
|
1060
|
+
const local = JSON.parse(json) as DocumentRecord;
|
|
1025
1061
|
handle.doc.transact(() => {
|
|
1026
1062
|
// Detached copy: keys are deleted while iterating.
|
|
1027
1063
|
const sharedKeys = [...frontmatter.keys()];
|
|
@@ -1060,13 +1096,13 @@ function createSession(
|
|
|
1060
1096
|
// Flush) reconciles by diff. Deferred one microtask so the transact observer marks its own
|
|
1061
1097
|
// Refs first (the assignment happens mid-transaction, before the observer runs).
|
|
1062
1098
|
effect(() => {
|
|
1063
|
-
const ref = toRaw(tab.doc.document)
|
|
1099
|
+
const ref = toRaw(tab.doc.document);
|
|
1064
1100
|
queueMicrotask(() => {
|
|
1065
1101
|
const current = runtimeOf(tab)?.session;
|
|
1066
1102
|
if (current !== session || !session.synced || !session.canWrite) {
|
|
1067
1103
|
return;
|
|
1068
1104
|
}
|
|
1069
|
-
const nowRef = toRaw(tab.doc.document)
|
|
1105
|
+
const nowRef = toRaw(tab.doc.document);
|
|
1070
1106
|
if (nowRef !== ref || nowRef === session.lastSeenRef) {
|
|
1071
1107
|
return;
|
|
1072
1108
|
}
|
|
@@ -1081,10 +1117,13 @@ function createSession(
|
|
|
1081
1117
|
// Presence roster + status.
|
|
1082
1118
|
const state = collabState(tab);
|
|
1083
1119
|
const awarenessObserver = () => {
|
|
1084
|
-
const peers:
|
|
1120
|
+
const peers: PeerPresence[] = [];
|
|
1085
1121
|
for (const [clientId, peerState] of handle.awareness.getStates()) {
|
|
1086
1122
|
if (clientId !== handle.awareness.clientID && peerState["user"]) {
|
|
1087
|
-
|
|
1123
|
+
/* SAFETY: every Studio client publishes its state through the setLocalState call in
|
|
1124
|
+
* createSession above, which writes a CollabAwarenessState; a state with no `user` (a
|
|
1125
|
+
* client mid-handshake) was skipped by the check above. */
|
|
1126
|
+
peers.push({ clientId, state: peerState as CollabAwarenessState });
|
|
1088
1127
|
}
|
|
1089
1128
|
}
|
|
1090
1129
|
state.peers = peers;
|
|
@@ -60,17 +60,18 @@ const attachedPaths = new Map<string, number>();
|
|
|
60
60
|
export function collabState(tab: Tab): TabCollabState {
|
|
61
61
|
// Key on the raw tab: writers (the collab session, via ensureCollab's raw tab) and readers
|
|
62
62
|
// (toolbar/tab-strip, via reactive `workspace.tabs.get` proxies) must resolve the same entry.
|
|
63
|
-
const key = toRaw(tab
|
|
63
|
+
const key = toRaw(tab);
|
|
64
64
|
let state = states.get(key);
|
|
65
65
|
if (!state) {
|
|
66
|
-
|
|
66
|
+
const initial: TabCollabState = {
|
|
67
67
|
active: false,
|
|
68
68
|
attachError: "",
|
|
69
69
|
peers: [],
|
|
70
70
|
readOnly: false,
|
|
71
71
|
sourceCanonical: false,
|
|
72
72
|
status: "unavailable",
|
|
73
|
-
}
|
|
73
|
+
};
|
|
74
|
+
state = reactive(initial);
|
|
74
75
|
states.set(key, state);
|
|
75
76
|
}
|
|
76
77
|
return state;
|
|
@@ -34,6 +34,7 @@ import {
|
|
|
34
34
|
createAbsolutePositionFromRelativePosition,
|
|
35
35
|
createRelativePositionFromTypeIndex,
|
|
36
36
|
} from "@jxsuite/collab";
|
|
37
|
+
import { isString } from "@jxsuite/schema/guards";
|
|
37
38
|
import type * as Y from "yjs";
|
|
38
39
|
import type { editor } from "monaco-editor";
|
|
39
40
|
import type { AwarenessLike } from "./monaco-cursors";
|
|
@@ -43,7 +44,8 @@ import type { AwarenessLike } from "./monaco-cursors";
|
|
|
43
44
|
* `./monaco-cursors.ts` already defines for the style manager) plus the one writer it needs.
|
|
44
45
|
*/
|
|
45
46
|
export interface BindingAwareness extends AwarenessLike {
|
|
46
|
-
|
|
47
|
+
/** Publishes this client's caret; `selection` is the one field the binding owns. */
|
|
48
|
+
setLocalStateField: (field: "selection", value: RelativeSelection | null) => void;
|
|
47
49
|
}
|
|
48
50
|
|
|
49
51
|
export interface MonacoYTextBindingOptions {
|
|
@@ -60,14 +62,17 @@ export interface MonacoYTextBindingOptions {
|
|
|
60
62
|
}
|
|
61
63
|
|
|
62
64
|
/** A caret snapshotted as two positions that survive a concurrent edit. */
|
|
63
|
-
interface RelativeSelection {
|
|
65
|
+
export interface RelativeSelection {
|
|
64
66
|
anchor: Y.RelativePosition;
|
|
65
67
|
head: Y.RelativePosition;
|
|
66
68
|
}
|
|
67
69
|
|
|
68
|
-
/**
|
|
70
|
+
/**
|
|
71
|
+
* A peer's published caret, as it arrives over the wire: the JSON of a {@link RelativeSelection},
|
|
72
|
+
* with every level optional because an older or partial state may omit it.
|
|
73
|
+
*/
|
|
69
74
|
interface PeerSelectionState {
|
|
70
|
-
selection?: { anchor?:
|
|
75
|
+
selection?: { anchor?: Y.RelativePosition; head?: Y.RelativePosition } | null;
|
|
71
76
|
}
|
|
72
77
|
|
|
73
78
|
/**
|
|
@@ -178,18 +183,16 @@ export function bindMonacoToYText(options: MonacoYTextBindingOptions): () => voi
|
|
|
178
183
|
if (clientId === awareness.clientID) {
|
|
179
184
|
continue;
|
|
180
185
|
}
|
|
186
|
+
/* SAFETY: `selection` is reserved for this binding (awareness-types.ts), so every writer
|
|
187
|
+
* publishes relativeSelectionOf's RelativeSelection or null. Its JSON round trip keeps the
|
|
188
|
+
* plain fields createAbsolutePositionFromRelativePosition reads, and every level is optional
|
|
189
|
+
* and checked below, so a peer that publishes none is skipped. */
|
|
181
190
|
const { selection } = (raw ?? {}) as PeerSelectionState;
|
|
182
191
|
if (!selection?.anchor || !selection.head) {
|
|
183
192
|
continue;
|
|
184
193
|
}
|
|
185
|
-
const anchor = createAbsolutePositionFromRelativePosition(
|
|
186
|
-
|
|
187
|
-
doc,
|
|
188
|
-
);
|
|
189
|
-
const head = createAbsolutePositionFromRelativePosition(
|
|
190
|
-
selection.head as Y.RelativePosition,
|
|
191
|
-
doc,
|
|
192
|
-
);
|
|
194
|
+
const anchor = createAbsolutePositionFromRelativePosition(selection.anchor, doc);
|
|
195
|
+
const head = createAbsolutePositionFromRelativePosition(selection.head, doc);
|
|
193
196
|
if (!anchor || !head || anchor.type !== text || head.type !== text) {
|
|
194
197
|
continue;
|
|
195
198
|
}
|
|
@@ -289,7 +292,7 @@ export function bindMonacoToYText(options: MonacoYTextBindingOptions): () => voi
|
|
|
289
292
|
embeds (`insert` is then an object or another type), and a Monaco buffer has nowhere to
|
|
290
293
|
put one — upstream cast the field to string and produced `"[object Object]"` in the
|
|
291
294
|
document. The same clause catches an op carrying none of the three fields. */
|
|
292
|
-
if (
|
|
295
|
+
if (!isString(op.insert)) {
|
|
293
296
|
throw new TypeError(
|
|
294
297
|
"bindMonacoToYText: unsupported Y.Text delta op — a text buffer can only apply " +
|
|
295
298
|
"string inserts",
|
|
@@ -14,7 +14,7 @@ export interface AwarenessLike {
|
|
|
14
14
|
off: (event: "change", cb: () => void) => void;
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
interface
|
|
17
|
+
interface PeerPresence {
|
|
18
18
|
user?: { color?: string; name?: string; login?: string };
|
|
19
19
|
}
|
|
20
20
|
|
|
@@ -40,7 +40,10 @@ export function cursorStylesheet(awareness: AwarenessLike): string {
|
|
|
40
40
|
if (clientId === awareness.clientID) {
|
|
41
41
|
continue;
|
|
42
42
|
}
|
|
43
|
-
|
|
43
|
+
/* SAFETY: y-protocols keeps only non-null state objects in getStates() (a peer clearing its
|
|
44
|
+
* state removes the entry), and every member of PeerPresence is optional and read through
|
|
45
|
+
* optional chaining below, so a peer that publishes no `user` is skipped, not misread. */
|
|
46
|
+
const { user } = raw as PeerPresence;
|
|
44
47
|
if (!user?.color) {
|
|
45
48
|
continue;
|
|
46
49
|
}
|
package/src/commands/budget.ts
CHANGED
|
@@ -112,9 +112,9 @@ export interface BudgetViolation {
|
|
|
112
112
|
|
|
113
113
|
/** Commands declaring the primary Command Bar cluster. */
|
|
114
114
|
export function primaryCommandIds(commands: readonly BudgetableRecord[]): string[] {
|
|
115
|
-
return commands
|
|
116
|
-
|
|
117
|
-
|
|
115
|
+
return commands.flatMap((command) =>
|
|
116
|
+
(command.menus ?? []).includes("commandbar/primary") ? [command.id] : [],
|
|
117
|
+
);
|
|
118
118
|
}
|
|
119
119
|
|
|
120
120
|
/**
|