@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
|
@@ -21,7 +21,17 @@ import type { IframeToParent, ParentToIframe } from "./iframe-protocol";
|
|
|
21
21
|
|
|
22
22
|
type SlashNavKey = Extract<IframeToParent, { kind: "slashNav" }>["key"];
|
|
23
23
|
|
|
24
|
-
const NAV_KEYS = new Set([
|
|
24
|
+
const NAV_KEYS = new Set<string>([
|
|
25
|
+
"ArrowUp",
|
|
26
|
+
"ArrowDown",
|
|
27
|
+
"Enter",
|
|
28
|
+
"Escape",
|
|
29
|
+
] satisfies SlashNavKey[]);
|
|
30
|
+
|
|
31
|
+
/** Whether `key` is one of the four keys the parent menu navigates by. */
|
|
32
|
+
function isNavKey(key: string): key is SlashNavKey {
|
|
33
|
+
return NAV_KEYS.has(key);
|
|
34
|
+
}
|
|
25
35
|
|
|
26
36
|
/**
|
|
27
37
|
* Register the bridge SlashController for this iframe realm and wire its keyboard/dismissal
|
|
@@ -55,28 +65,31 @@ export function startIframeSlashBridge(
|
|
|
55
65
|
open = true;
|
|
56
66
|
lastPostedFilter = filter;
|
|
57
67
|
const r = rectOf(anchorEl);
|
|
58
|
-
|
|
68
|
+
const message: Extract<IframeToParent, { kind: "slashShow" }> = {
|
|
59
69
|
filter,
|
|
60
70
|
kind: "slashShow",
|
|
61
71
|
rect: { height: r.height, width: r.width, x: r.left, y: r.top },
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
72
|
+
};
|
|
73
|
+
/* Carried, because the parent draws the menu and only the FRAME knows why it opened. A
|
|
74
|
+
menu opened by name has no "/…" run in the document to filter with, so it needs its own
|
|
75
|
+
field; the "/" gesture needs none, because the author types into the block. This option
|
|
76
|
+
was dropped at this boundary and the loss was invisible — the menu still appeared, just
|
|
77
|
+
with no way past fifteen items but scrolling. */
|
|
78
|
+
if (cbs.showFilter === true) {
|
|
79
|
+
message.showFilter = true;
|
|
80
|
+
}
|
|
81
|
+
channel.post(message);
|
|
69
82
|
},
|
|
70
83
|
};
|
|
71
84
|
setSlashController(controller);
|
|
72
85
|
|
|
73
86
|
const onKeyDown = (e: KeyboardEvent) => {
|
|
74
|
-
if (!open || !
|
|
87
|
+
if (!open || !isNavKey(e.key)) {
|
|
75
88
|
return;
|
|
76
89
|
}
|
|
77
90
|
e.preventDefault();
|
|
78
91
|
e.stopPropagation();
|
|
79
|
-
channel.post({ key: e.key
|
|
92
|
+
channel.post({ key: e.key, kind: "slashNav" });
|
|
80
93
|
};
|
|
81
94
|
const onMouseDown = () => {
|
|
82
95
|
// The parent menu's outside-click listener can't see iframe clicks — any in-iframe press while
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
14
|
import { releaseElementStyles, renderNode, runScoped } from "@jxsuite/runtime";
|
|
15
|
+
import { isNumber, isString } from "@jxsuite/schema/guards";
|
|
15
16
|
import { getNodeAtPath } from "../state";
|
|
16
17
|
import { makeStamper } from "./iframe-render";
|
|
17
18
|
import { prepareForEditMode } from "../utils/edit-display";
|
|
@@ -39,11 +40,14 @@ export function renderSubtreeIframe(
|
|
|
39
40
|
docPath: JxPath,
|
|
40
41
|
ctx: IframeRenderCtx,
|
|
41
42
|
): HTMLElement | Text {
|
|
43
|
+
/* SAFETY: a widening of getNodeAtPath's declared return. A patch path addresses an entry of a
|
|
44
|
+
* `children` array, which the schema types as `JxMutableNode | string`, and a missing step
|
|
45
|
+
* answers undefined, so those three cases are the whole range. */
|
|
42
46
|
const node = getNodeAtPath(shadowDoc, docPath) as JxMutableNode | string | undefined;
|
|
43
47
|
if (node === undefined) {
|
|
44
48
|
throw new Error(`iframe-patch-node-not-found:${docPath.join("/")}`);
|
|
45
49
|
}
|
|
46
|
-
const def =
|
|
50
|
+
const def = isString(node) ? node : prepareForEditMode(stripEventHandlers(node));
|
|
47
51
|
const { result: rendered, stop } = runScoped(() =>
|
|
48
52
|
renderNode(def, ctx.defs, {
|
|
49
53
|
_path: docPathToRenderPath(docPath, ctx),
|
|
@@ -98,7 +102,7 @@ function docPathToRenderPath(docPath: JxPath, ctx: IframeRenderCtx): (string | n
|
|
|
98
102
|
const { mapperCtx } = ctx;
|
|
99
103
|
if (mapperCtx.layoutWrapped && mapperCtx.pageContentPrefix && docPath[0] === "children") {
|
|
100
104
|
const [, idx] = docPath;
|
|
101
|
-
return
|
|
105
|
+
return isNumber(idx)
|
|
102
106
|
? [
|
|
103
107
|
...mapperCtx.pageContentPrefix,
|
|
104
108
|
idx + (mapperCtx.pageContentOffset ?? 0),
|
|
@@ -11,6 +11,8 @@
|
|
|
11
11
|
* result for the `data-jx-path` attribute.
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
|
+
import { isJsonObject, isNonNullObject, isNumber, isString } from "@jxsuite/schema/guards";
|
|
15
|
+
import type { JxElement } from "@jxsuite/schema/types";
|
|
14
16
|
import type { JxPath } from "../state";
|
|
15
17
|
|
|
16
18
|
/**
|
|
@@ -83,22 +85,27 @@ export function wrapsPageContent(path: JxPath, prefix: JxPath | null): boolean {
|
|
|
83
85
|
* Resolve a runtime render path to a document path (or flag it as layout-originated). Pure — the
|
|
84
86
|
* caller decides whether to record the result in a WeakMap or `data-jx-*` attributes.
|
|
85
87
|
*/
|
|
86
|
-
export function classifyRenderNode(
|
|
88
|
+
export function classifyRenderNode(
|
|
89
|
+
path: JxPath,
|
|
90
|
+
def: JxElement | string,
|
|
91
|
+
ctx: PathMapCtx,
|
|
92
|
+
): RenderNodeClass {
|
|
87
93
|
// Layout-originated nodes have no page-document path; the caller stamps their origin instead
|
|
88
94
|
// (data-jx-layout-path / data-jx-layout-file).
|
|
89
|
-
const marker =
|
|
90
|
-
ctx.layoutWrapped && typeof def === "object"
|
|
91
|
-
? (def as { $__layout?: unknown } | null)?.$__layout
|
|
92
|
-
: undefined;
|
|
95
|
+
const marker = ctx.layoutWrapped && isNonNullObject(def) ? def["$__layout"] : undefined;
|
|
93
96
|
if (marker) {
|
|
94
|
-
|
|
97
|
+
// A legacy bare `true` marker carries no origin, so it reads as an empty one.
|
|
98
|
+
const origin = isJsonObject(marker) ? marker : {};
|
|
99
|
+
const { file, path: originPath } = origin;
|
|
95
100
|
return {
|
|
96
101
|
// The root is never chrome even when the layout distributed nothing: it IS the render, and a
|
|
97
102
|
// Dimmed, frozen root would be a canvas nobody can touch.
|
|
98
103
|
chrome: path.length > 0 && !wrapsPageContent(path, ctx.pageContentPrefix),
|
|
99
104
|
kind: "layout",
|
|
100
|
-
layoutFile:
|
|
101
|
-
|
|
105
|
+
layoutFile: isString(file) ? file : "",
|
|
106
|
+
/* SAFETY: markLayoutNodes (canvas-live-render.ts) is the only writer of `$__layout`, and the
|
|
107
|
+
* `path` it stamps is a LayoutMarker's JxPath. */
|
|
108
|
+
layoutPath: Array.isArray(originPath) ? (originPath as JxPath) : [],
|
|
102
109
|
};
|
|
103
110
|
}
|
|
104
111
|
|
|
@@ -112,10 +119,9 @@ export function classifyRenderNode(path: JxPath, def: unknown, ctx: PathMapCtx):
|
|
|
112
119
|
if (path.length >= pfx.length && pfx.every((seg, i) => path[i] === seg)) {
|
|
113
120
|
const rest = path.slice(pfx.length);
|
|
114
121
|
const [containerIdx] = rest;
|
|
115
|
-
mappedPath =
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
: ["children", ...rest];
|
|
122
|
+
mappedPath = isNumber(containerIdx)
|
|
123
|
+
? ["children", containerIdx - (ctx.pageContentOffset ?? 0), ...rest.slice(1)]
|
|
124
|
+
: ["children", ...rest];
|
|
119
125
|
}
|
|
120
126
|
}
|
|
121
127
|
|
|
@@ -154,5 +160,6 @@ export function serializeJxPath(path: JxPath): string {
|
|
|
154
160
|
|
|
155
161
|
/** Decode a `data-jx-path` attribute back into a document path. */
|
|
156
162
|
export function parseJxPath(serialized: string): JxPath {
|
|
163
|
+
// SAFETY: only serializeJxPath writes `data-jx-path`, and it is JSON.stringify of a JxPath.
|
|
157
164
|
return JSON.parse(serialized) as JxPath;
|
|
158
165
|
}
|
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
import { activeTab } from "../workspace/workspace";
|
|
15
15
|
import { getNodeAtPath } from "../state";
|
|
16
16
|
import { documentHasPopover, isPopover } from "@jxsuite/schema/overlays";
|
|
17
|
+
import { isNonNullObject } from "@jxsuite/schema/guards";
|
|
17
18
|
import { INVOKER_TAGS, POPOVER_TAGS } from "@jxsuite/ui";
|
|
18
19
|
import { primarySelection } from "../tabs/selection";
|
|
19
20
|
import type { JxMutableNode } from "@jxsuite/schema/types";
|
|
@@ -49,7 +50,7 @@ export function ancestorPopoverPath(
|
|
|
49
50
|
for (let end = path.length; end >= 0; end -= 1) {
|
|
50
51
|
const prefix = path.slice(0, end);
|
|
51
52
|
const node = getNodeAtPath(doc, prefix);
|
|
52
|
-
if (node &&
|
|
53
|
+
if (isNonNullObject(node) && isPopover(node, KIT_SCOPE)) {
|
|
53
54
|
return prefix;
|
|
54
55
|
}
|
|
55
56
|
}
|
|
@@ -72,13 +73,16 @@ export function ancestorPopoverPath(
|
|
|
72
73
|
* @returns The popover's path, or null.
|
|
73
74
|
*/
|
|
74
75
|
export function popoverPathFor(tab: Tab, explicit?: JxPath): JxPath | null {
|
|
76
|
+
/* SAFETY: a widening, not a narrowing. A tab built by createTab always carries a document, but
|
|
77
|
+
* the command is a public entry point and the contract (pinned in popover-state.test.ts) is that
|
|
78
|
+
* a tab record without one answers null rather than throwing inside getNodeAtPath. */
|
|
75
79
|
const doc = tab.doc.document as JxMutableNode | undefined;
|
|
76
80
|
if (!doc) {
|
|
77
81
|
return null;
|
|
78
82
|
}
|
|
79
83
|
if (explicit) {
|
|
80
84
|
const node = getNodeAtPath(doc, explicit);
|
|
81
|
-
return node &&
|
|
85
|
+
return isNonNullObject(node) && isPopover(node, KIT_SCOPE) ? explicit : null;
|
|
82
86
|
}
|
|
83
87
|
return ancestorPopoverPath(doc, primarySelection(tab.session.selection));
|
|
84
88
|
}
|
|
@@ -101,6 +105,6 @@ export function popoverPathFor(tab: Tab, explicit?: JxPath): JxPath | null {
|
|
|
101
105
|
* @returns True when the focused document declares at least one popover.
|
|
102
106
|
*/
|
|
103
107
|
export function activeDocumentHasPopover(): boolean {
|
|
104
|
-
const doc = activeTab.value?.doc.document
|
|
108
|
+
const doc = activeTab.value?.doc.document;
|
|
105
109
|
return doc ? documentHasPopover(doc, KIT_SCOPE) : false;
|
|
106
110
|
}
|
|
@@ -31,7 +31,6 @@ import { effect, pauseTracking, resetTracking } from "../reactivity";
|
|
|
31
31
|
import { postPopoverOpen, revealCanvasPath } from "./iframe-host";
|
|
32
32
|
import { primarySelection } from "../tabs/selection";
|
|
33
33
|
import { updateSession } from "../store";
|
|
34
|
-
import type { JxMutableNode } from "@jxsuite/schema/types";
|
|
35
34
|
import type { JxPath } from "../state";
|
|
36
35
|
import type { Tab } from "../tabs/tab";
|
|
37
36
|
|
|
@@ -59,7 +58,7 @@ export function setOpenPopover(tab: Tab, path: JxPath | null): void {
|
|
|
59
58
|
|
|
60
59
|
/** Open the popover containing `path`, if any. Returns whether anything changed. */
|
|
61
60
|
function openPopoverFor(tab: Tab, path: JxPath | null): boolean {
|
|
62
|
-
const target = ancestorPopoverPath(tab.doc.document
|
|
61
|
+
const target = ancestorPopoverPath(tab.doc.document, path);
|
|
63
62
|
if (target === null || samePath(tab.session.ui.openPopover, target)) {
|
|
64
63
|
return false;
|
|
65
64
|
}
|
|
@@ -12,6 +12,10 @@
|
|
|
12
12
|
* Pure and DOM-free — no reactivity/runtime imports — so it stays trivially unit-testable.
|
|
13
13
|
*/
|
|
14
14
|
|
|
15
|
+
import { isFunction } from "@jxsuite/schema/guards";
|
|
16
|
+
import type { JsonObject, JsonValue } from "@jxsuite/schema/types";
|
|
17
|
+
import type { JxScope } from "@jxsuite/runtime/types";
|
|
18
|
+
|
|
15
19
|
/**
|
|
16
20
|
* Per-value size cap (in JSON-string chars). A single large content collection can be tens of KB;
|
|
17
21
|
* past this cap we store a small placeholder so one big data source can't bloat every render's
|
|
@@ -34,18 +38,21 @@ const LARGE_VALUE_PLACEHOLDER = "[large value omitted]";
|
|
|
34
38
|
* @param defs The resolved `$defs` scope (may be a Vue reactive proxy).
|
|
35
39
|
* @returns A plain object safe to `postMessage` (every value is JSON-round-trippable).
|
|
36
40
|
*/
|
|
37
|
-
export function serializeDataScope(defs:
|
|
38
|
-
const out:
|
|
41
|
+
export function serializeDataScope(defs: JxScope): JsonObject {
|
|
42
|
+
const out: JsonObject = {};
|
|
39
43
|
for (const key of Object.keys(defs)) {
|
|
40
44
|
try {
|
|
41
45
|
// Reading through the reactive proxy auto-unwraps a top-level ref/computed to its value, and
|
|
42
46
|
// Can THROW (a computed getter that throws) — done inside the try so that maps the key to null
|
|
43
47
|
// Rather than aborting the whole snapshot.
|
|
44
48
|
const value = defs[key];
|
|
45
|
-
if (
|
|
49
|
+
if (isFunction(value)) {
|
|
46
50
|
continue; // Data sources only — a resolved server/handler fn isn't a "value".
|
|
47
51
|
}
|
|
48
|
-
|
|
52
|
+
/* SAFETY: a widening of lib.d.ts's `string` to the real range. JSON.stringify answers
|
|
53
|
+
* undefined for a top-level undefined, a symbol, or a value whose toJSON() returns undefined
|
|
54
|
+
* (ECMA-262 SerializeJSONProperty), and the branch below depends on seeing that. */
|
|
55
|
+
const json = JSON.stringify(value) as string | undefined;
|
|
49
56
|
if (json === undefined) {
|
|
50
57
|
// JSON.stringify returns undefined for a bare function/symbol/undefined at the top level.
|
|
51
58
|
out[key] = null;
|
|
@@ -55,7 +62,8 @@ export function serializeDataScope(defs: Record<string, unknown>): Record<string
|
|
|
55
62
|
out[key] = LARGE_VALUE_PLACEHOLDER;
|
|
56
63
|
continue;
|
|
57
64
|
}
|
|
58
|
-
|
|
65
|
+
// SAFETY: `json` is JSON.stringify's own output above, so it parses back to JSON data.
|
|
66
|
+
out[key] = JSON.parse(json) as JsonValue;
|
|
59
67
|
} catch {
|
|
60
68
|
// A circular structure or a throwing getter → the key exists but carries no serializable value.
|
|
61
69
|
out[key] = null;
|
|
@@ -32,6 +32,7 @@
|
|
|
32
32
|
*/
|
|
33
33
|
|
|
34
34
|
import { PANE_SELECTOR } from "../surfaces/pane-grid";
|
|
35
|
+
import { stageOf } from "./surface-registry";
|
|
35
36
|
import type { CanvasSurface } from "./surface-registry";
|
|
36
37
|
|
|
37
38
|
/**
|
|
@@ -61,7 +62,7 @@ export function scrollbarWidthOf(scroller: HTMLElement): number {
|
|
|
61
62
|
|
|
62
63
|
/** The cell a stage belongs to, or the document root when it is outside every cell. */
|
|
63
64
|
function cellOf(surface: CanvasSurface): HTMLElement {
|
|
64
|
-
return surface
|
|
65
|
+
return stageOf(surface)?.closest<HTMLElement>(PANE_SELECTOR) ?? document.documentElement;
|
|
65
66
|
}
|
|
66
67
|
|
|
67
68
|
/**
|
|
@@ -154,7 +154,7 @@ export function surfaceForPane(paneId: string): CanvasSurface {
|
|
|
154
154
|
|
|
155
155
|
/** A surface record with nothing in it. One place the per-stage defaults are written down. */
|
|
156
156
|
function freshSurface(paneId: string): CanvasSurface {
|
|
157
|
-
|
|
157
|
+
const record: Omit<CanvasSurface, "wrap"> & { wrap: HTMLElement | null } = {
|
|
158
158
|
centerObserver: null,
|
|
159
159
|
monacoDiffEditor: null,
|
|
160
160
|
monacoEditor: null,
|
|
@@ -171,8 +171,26 @@ function freshSurface(paneId: string): CanvasSurface {
|
|
|
171
171
|
renderGeneration: 0,
|
|
172
172
|
sourceCollabCleanup: null,
|
|
173
173
|
stageScrollbar: null,
|
|
174
|
-
wrap: null
|
|
174
|
+
wrap: null,
|
|
175
175
|
};
|
|
176
|
+
/* SAFETY: `wrap` is the only member that differs from CanvasSurface, and it is null only until
|
|
177
|
+
* registerCanvasSurface attaches the pane's stage. The grid registers a cell's stage as it builds
|
|
178
|
+
* the cell, before any renderer runs (§18.1 rule 1), and the paths that can run earlier read the
|
|
179
|
+
* element through stageOf(), which keeps the nullable type. */
|
|
180
|
+
return record as CanvasSurface;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* The surface's stage element, or null before {@link registerCanvasSurface} attaches one.
|
|
185
|
+
*
|
|
186
|
+
* `wrap` is typed non-null for the renderers, which only run after registration. The gestures and
|
|
187
|
+
* teardowns that can reach a surface before its host exists read it through here instead.
|
|
188
|
+
*
|
|
189
|
+
* @param {CanvasSurface} surface
|
|
190
|
+
* @returns {HTMLElement | null}
|
|
191
|
+
*/
|
|
192
|
+
export function stageOf(surface: CanvasSurface): HTMLElement | null {
|
|
193
|
+
return surface.wrap;
|
|
176
194
|
}
|
|
177
195
|
|
|
178
196
|
/**
|
|
@@ -199,7 +217,7 @@ export function stageContaining(node: Node | null): CanvasSurface | null {
|
|
|
199
217
|
return null;
|
|
200
218
|
}
|
|
201
219
|
for (const surface of _surfaces.values()) {
|
|
202
|
-
if (surface
|
|
220
|
+
if (stageOf(surface)?.contains(node)) {
|
|
203
221
|
return surface;
|
|
204
222
|
}
|
|
205
223
|
}
|
|
@@ -19,7 +19,12 @@ import { collabState } from "./collab-state";
|
|
|
19
19
|
import { isCollabEnabled, setCollabEnabled } from "./collab-session";
|
|
20
20
|
import { notify } from "../services/notify";
|
|
21
21
|
import { activeTab } from "../workspace/workspace";
|
|
22
|
-
import {
|
|
22
|
+
import {
|
|
23
|
+
booleanArg,
|
|
24
|
+
booleanProperty,
|
|
25
|
+
optionalStringArg,
|
|
26
|
+
stringProperty,
|
|
27
|
+
} from "../commands/command-args";
|
|
23
28
|
|
|
24
29
|
import type { AnyCommand, CommandRegistry } from "../commands/registry";
|
|
25
30
|
import type { Tab } from "../tabs/tab";
|
|
@@ -173,7 +178,7 @@ export function collabCommands(): AnyCommand[] {
|
|
|
173
178
|
if (!active) {
|
|
174
179
|
return;
|
|
175
180
|
}
|
|
176
|
-
const login = (args
|
|
181
|
+
const login = optionalStringArg("collab.follow", args, "login");
|
|
177
182
|
const { peers } = collabState(active);
|
|
178
183
|
const peer = login ? peers.find((p) => p.state.user.login === login) : peers[0];
|
|
179
184
|
if (!peer) {
|