@jxsuite/studio 6.1.0 → 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-f2gkpy8d.js +4 -0
- 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-gybvv7a6.js → index-zpjmzqfk.js} +3 -3
- package/dist/chunks/{javascript-rnvdp3k4.js → javascript-m54mnwp6.js} +3 -3
- package/dist/chunks/jsonMode-w15cmrcm.js +13 -0
- 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-5g0ag7c0.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-pxg4ap1e.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-qbj760tx.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-anyrgzvb.js → studio-90pq9km1.js} +4 -4
- package/dist/chunks/studio-924p1tm1.js +6 -0
- package/dist/chunks/{studio-v2bvmbjj.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-txjjzrsm.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-0x3jyb8r.js → studio-tq0rtfwj.js} +4 -4
- package/dist/chunks/{studio-cpxkgjrj.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-y64hrt8p.js +12 -0
- 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-sf49ee9x.js +14 -0
- 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 +98 -98
- package/dist/workers/ts.worker.js +3 -3
- package/package.json +11 -11
- 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 +66 -42
- package/src/canvas/canvas-surface.ts +5 -3
- package/src/canvas/canvas-utils.ts +163 -64
- 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 +203 -118
- package/src/canvas/iframe-inline-edit.ts +69 -32
- package/src/canvas/iframe-insert.ts +5 -4
- package/src/canvas/iframe-interaction.ts +37 -26
- 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 +15 -16
- package/src/canvas/iframe-render.ts +41 -36
- 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/defaults.ts +4 -1
- package/src/commands/keymap.ts +47 -43
- package/src/commands/levels.ts +3 -3
- package/src/commands/live-context.ts +10 -8
- 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 +87 -47
- 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 +6 -1
- 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 +55 -22
- 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 +254 -216
- 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 +174 -127
- 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 +39 -77
- 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 +25 -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.json +126 -73
- package/src/surfaces/rail.ts +38 -12
- 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/tabs/typing.ts +31 -0
- 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 +103 -74
- 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 +47 -36
- package/dist/chunks/2020-nkxms0ay.js +0 -4
- package/dist/chunks/adapter-m948ab5f.js +0 -4
- package/dist/chunks/cf-account-picker-n8hr38v7.js +0 -4
- package/dist/chunks/cf-settings-356xdtne.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-yk3t844e.js +0 -4
- package/dist/chunks/content-source-bawmyc09.js +0 -4
- package/dist/chunks/convert-to-repeater-7wns8kf1.js +0 -4
- package/dist/chunks/dialog-mtm9fq5t.js +0 -4
- package/dist/chunks/editor-6sc8nacq.js +0 -4
- package/dist/chunks/entry-commands-8ay9fh81.js +0 -4
- package/dist/chunks/extension-sections-na7rj3nr.js +0 -4
- package/dist/chunks/file-ops-gye0qw56.js +0 -4
- package/dist/chunks/files-dmc2xvcq.js +0 -4
- package/dist/chunks/format-host-t76b53f8.js +0 -4
- package/dist/chunks/fs-events-cg4tpz06.js +0 -4
- package/dist/chunks/git-panel-yef7bshy.js +0 -4
- package/dist/chunks/grid-view-7tt4bxw1.js +0 -51
- package/dist/chunks/icons-qbh8akb1.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-tmz30gfp.js +0 -4
- package/dist/chunks/index-nag78a9h.js +0 -4
- package/dist/chunks/jsonMode-zhwsprqk.js +0 -13
- package/dist/chunks/jx-validate-3gbp5nkn.js +0 -4
- package/dist/chunks/layers-fvz99859.js +0 -4
- package/dist/chunks/layers-panel-gchmbf9p.js +0 -4
- package/dist/chunks/listbox-s8fkmnq8.js +0 -4
- package/dist/chunks/lit-html-9agdspkt.js +0 -4
- package/dist/chunks/media-picker-rhjvyy00.js +0 -4
- package/dist/chunks/menu-2e4y9j7b.js +0 -4
- package/dist/chunks/menu-37d07z9m.js +0 -4
- package/dist/chunks/monaco-binding-2jnhjjvr.js +0 -4
- package/dist/chunks/monaco-buffer-rp21359g.js +0 -4
- package/dist/chunks/monaco-setup-vhh7gayr.js +0 -4
- package/dist/chunks/notify-h3www560.js +0 -4
- package/dist/chunks/number-field-gw7sq8rn.js +0 -4
- package/dist/chunks/parse-897fvqah.js +0 -4
- package/dist/chunks/platform-hz34wcd7.js +0 -4
- package/dist/chunks/popover-8htra4er.js +0 -4
- package/dist/chunks/publish-panel-exsmjzyj.js +0 -4
- package/dist/chunks/quick-search-pgaqeh0m.js +0 -4
- package/dist/chunks/references-2cgdxnb8.js +0 -4
- package/dist/chunks/right-panel-jf856w5w.js +0 -4
- package/dist/chunks/section-registry-jnf8r5gy.js +0 -4
- package/dist/chunks/select-n3v7gwas.js +0 -4
- package/dist/chunks/split-pff8f3ze.js +0 -4
- package/dist/chunks/studio-0f55h9ye.js +0 -5
- package/dist/chunks/studio-0sqdhnew.js +0 -12
- package/dist/chunks/studio-19x1c75w.js +0 -5
- package/dist/chunks/studio-2sqcndak.js +0 -5
- package/dist/chunks/studio-3aey7dd3.js +0 -5
- package/dist/chunks/studio-3bpdkq2s.js +0 -5
- package/dist/chunks/studio-47y6fbpf.js +0 -5
- package/dist/chunks/studio-4m3826v2.js +0 -5
- package/dist/chunks/studio-4nx2dj1g.js +0 -4
- package/dist/chunks/studio-4xv5s47r.js +0 -9
- package/dist/chunks/studio-5g4t8v6w.js +0 -5
- package/dist/chunks/studio-5py436sf.js +0 -5
- package/dist/chunks/studio-77kt594t.js +0 -5
- package/dist/chunks/studio-8f87n763.js +0 -10
- package/dist/chunks/studio-8mb00b84.js +0 -5
- package/dist/chunks/studio-8p51gq2h.js +0 -6
- package/dist/chunks/studio-954ds834.js +0 -5
- package/dist/chunks/studio-9ft45c83.js +0 -9
- package/dist/chunks/studio-a2138x5k.js +0 -7
- package/dist/chunks/studio-a9yzstqj.js +0 -5
- package/dist/chunks/studio-acdksxx6.js +0 -5
- package/dist/chunks/studio-ar8jcf2y.js +0 -5
- package/dist/chunks/studio-bmn4mn9j.js +0 -7
- package/dist/chunks/studio-e7xxa0sj.js +0 -5
- package/dist/chunks/studio-ecaz25vk.js +0 -5
- package/dist/chunks/studio-ery42sqr.js +0 -4
- package/dist/chunks/studio-fzdywr6p.js +0 -9
- package/dist/chunks/studio-g5fmf0c1.js +0 -5
- package/dist/chunks/studio-g7nse7zb.js +0 -5
- package/dist/chunks/studio-geq1ea6k.js +0 -14
- package/dist/chunks/studio-ghkb32r8.js +0 -5
- package/dist/chunks/studio-ghrhy2y7.js +0 -5
- package/dist/chunks/studio-grawhey1.js +0 -5
- package/dist/chunks/studio-h0xgswew.js +0 -5
- package/dist/chunks/studio-h9c4p2tx.js +0 -5
- package/dist/chunks/studio-jyzj5cxs.js +0 -5
- package/dist/chunks/studio-mgx8yhnz.js +0 -64
- package/dist/chunks/studio-mpb04y1d.js +0 -6
- package/dist/chunks/studio-n17mty64.js +0 -5
- package/dist/chunks/studio-nwh2eqsk.js +0 -6
- package/dist/chunks/studio-q1h883bt.js +0 -16
- package/dist/chunks/studio-q4tv82h7.js +0 -9
- package/dist/chunks/studio-qpqa7vk3.js +0 -5
- package/dist/chunks/studio-qqz8e5gk.js +0 -5
- package/dist/chunks/studio-qvasen3f.js +0 -5
- package/dist/chunks/studio-rggdb3hm.js +0 -5
- package/dist/chunks/studio-sghy936h.js +0 -4
- package/dist/chunks/studio-skprc6ef.js +0 -5
- package/dist/chunks/studio-tt2nactf.js +0 -5
- package/dist/chunks/studio-tyasmc39.js +0 -5
- package/dist/chunks/studio-vk9ezads.js +0 -5
- package/dist/chunks/studio-vzacdfsc.js +0 -4
- package/dist/chunks/studio-w4c0xmrw.js +0 -5
- package/dist/chunks/studio-wfjqhhbk.js +0 -5
- package/dist/chunks/studio-wgh5kxpj.js +0 -5
- package/dist/chunks/studio-xasj0796.js +0 -5
- package/dist/chunks/studio-y78s8r2n.js +0 -5
- package/dist/chunks/studio-z8w183sh.js +0 -5
- package/dist/chunks/studio-zscd9ty4.js +0 -928
- package/dist/chunks/studio-zxp13sss.js +0 -7
- package/dist/chunks/studio-zygnmm01.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/tsMode-gr0m4dzr.js +0 -14
- package/dist/chunks/workspace-m15qtcqp.js +0 -4
- package/dist/chunks/ws-client-nf61frr1.js +0 -4
package/src/panels/jump-bar.ts
CHANGED
|
@@ -63,8 +63,9 @@
|
|
|
63
63
|
* @docs studio/interface
|
|
64
64
|
*/
|
|
65
65
|
|
|
66
|
-
import { displayTagName } from "@jxsuite/schema/guards";
|
|
67
|
-
import {
|
|
66
|
+
import { displayTagName, isNonNullObject, isString } from "@jxsuite/schema/guards";
|
|
67
|
+
import { getNodeAtPath } from "@jxsuite/schema/doc-ops";
|
|
68
|
+
import { childList, nodeLabel, pathsEqual, projectState } from "../store";
|
|
68
69
|
import { effect, effectScope } from "../reactivity";
|
|
69
70
|
import { activePane, workspace } from "../workspace/workspace";
|
|
70
71
|
import { derivationOfPane, tabOfPane } from "../canvas/canvas-surface";
|
|
@@ -74,14 +75,21 @@ import { runReported } from "../commands/run-reported";
|
|
|
74
75
|
import { openMenu } from "../surfaces/menu";
|
|
75
76
|
import { rectOf } from "../utils/geometry";
|
|
76
77
|
import { mountJumpBarSurface } from "../surfaces/jump-bar";
|
|
77
|
-
import type {
|
|
78
|
+
import type { CommandRegistry } from "../commands/registry";
|
|
78
79
|
import type { FormulaEditDef, FunctionEditDef } from "../types";
|
|
79
80
|
import type { JxPath } from "../state";
|
|
80
|
-
import type {
|
|
81
|
+
import type {
|
|
82
|
+
MenuHandle,
|
|
83
|
+
MenuRowProjection,
|
|
84
|
+
OpenMenuOptions,
|
|
85
|
+
ViewportPoint,
|
|
86
|
+
} from "../surfaces/menu";
|
|
81
87
|
import type { JumpBarSurface, ProjectedStep } from "../surfaces/jump-bar";
|
|
82
88
|
import type { Tab } from "../tabs/tab";
|
|
83
89
|
import type { PaneDerivation } from "../workspace/workspace";
|
|
84
90
|
import type { EffectScope } from "@vue/reactivity";
|
|
91
|
+
import type { JxMutableNode } from "@jxsuite/schema/types";
|
|
92
|
+
import type { CommandArgValues } from "../commands/command-args";
|
|
85
93
|
|
|
86
94
|
/**
|
|
87
95
|
* The region the trail stamps on itself. It is the status bar's DOCUMENT field: the document, and
|
|
@@ -108,7 +116,7 @@ export type JumpSegmentKind = "file" | "editor" | "node";
|
|
|
108
116
|
export interface JumpChoice {
|
|
109
117
|
label: string;
|
|
110
118
|
command: string;
|
|
111
|
-
args?:
|
|
119
|
+
args?: CommandArgValues;
|
|
112
120
|
/** The choice you are already on. Marked, never hidden — a menu that omits it loses its place. */
|
|
113
121
|
current?: boolean;
|
|
114
122
|
}
|
|
@@ -121,7 +129,7 @@ export interface JumpSegment {
|
|
|
121
129
|
title?: string;
|
|
122
130
|
/** The command that MOVES you here, or `null` when you are already here. */
|
|
123
131
|
command: string | null;
|
|
124
|
-
args?:
|
|
132
|
+
args?: CommandArgValues;
|
|
125
133
|
/** Where else this step could go. Fewer than two is not a choice, and renders no control. */
|
|
126
134
|
choices: readonly JumpChoice[];
|
|
127
135
|
}
|
|
@@ -160,19 +168,19 @@ export interface SelectionCrumb {
|
|
|
160
168
|
* array pseudo-element ("Repeater") and its template both visible instead of collapsing the array
|
|
161
169
|
* into a bare `[index]`.
|
|
162
170
|
*/
|
|
163
|
-
export function selectionCrumbs(document:
|
|
171
|
+
export function selectionCrumbs(document: JxMutableNode, selection: JxPath): SelectionCrumb[] {
|
|
164
172
|
const crumbs: SelectionCrumb[] = [];
|
|
165
173
|
for (let i = 0; i < selection.length;) {
|
|
166
174
|
const seg = selection[i];
|
|
167
175
|
const step = seg === "map" ? 1 : 2;
|
|
168
|
-
const path = selection.slice(0, i + step)
|
|
169
|
-
const node = getNodeAtPath(document
|
|
176
|
+
const path = selection.slice(0, i + step);
|
|
177
|
+
const node = getNodeAtPath(document, path);
|
|
170
178
|
const fallbackTag = node?.tag;
|
|
171
179
|
const label =
|
|
172
180
|
node?.$prototype === "Array"
|
|
173
181
|
? "Repeater"
|
|
174
182
|
: displayTagName(node?.tagName) ||
|
|
175
|
-
(
|
|
183
|
+
(isString(fallbackTag) ? fallbackTag : "") ||
|
|
176
184
|
(seg === "cases" ? String(selection[i + 1]) : `[${selection[i + 1]}]`);
|
|
177
185
|
crumbs.push({ label, path });
|
|
178
186
|
i += step;
|
|
@@ -191,7 +199,7 @@ export function selectionCrumbs(document: unknown, selection: JxPath): Selection
|
|
|
191
199
|
* addressable, so both drop out and the segment renders no control at all.
|
|
192
200
|
*/
|
|
193
201
|
export function crumbSiblings(
|
|
194
|
-
document:
|
|
202
|
+
document: JxMutableNode,
|
|
195
203
|
crumbs: readonly SelectionCrumb[],
|
|
196
204
|
index: number,
|
|
197
205
|
): JumpChoice[] {
|
|
@@ -199,17 +207,17 @@ export function crumbSiblings(
|
|
|
199
207
|
if (!crumb) {
|
|
200
208
|
return [];
|
|
201
209
|
}
|
|
202
|
-
const parentPath =
|
|
203
|
-
const parent = getNodeAtPath(document
|
|
210
|
+
const parentPath: JxPath = index === 0 ? [] : crumbs[index - 1]!.path;
|
|
211
|
+
const parent = getNodeAtPath(document, parentPath);
|
|
204
212
|
const key = crumb.path.at(-2);
|
|
205
213
|
const own = crumb.path;
|
|
206
214
|
if (key === "cases") {
|
|
207
215
|
const cases = parent?.cases;
|
|
208
|
-
if (!cases
|
|
216
|
+
if (!isNonNullObject(cases)) {
|
|
209
217
|
return [];
|
|
210
218
|
}
|
|
211
219
|
return Object.keys(cases).map((name) => {
|
|
212
|
-
const path = [...parentPath, "cases", name]
|
|
220
|
+
const path: JxPath = [...parentPath, "cases", name];
|
|
213
221
|
return choiceFor(document, path, name, own);
|
|
214
222
|
});
|
|
215
223
|
}
|
|
@@ -218,17 +226,22 @@ export function crumbSiblings(
|
|
|
218
226
|
}
|
|
219
227
|
const choices: JumpChoice[] = [];
|
|
220
228
|
for (const [i, child] of childList(parent).entries()) {
|
|
221
|
-
if (
|
|
229
|
+
if (isString(child)) {
|
|
222
230
|
continue;
|
|
223
231
|
}
|
|
224
|
-
const path = [...parentPath, "children", i]
|
|
232
|
+
const path: JxPath = [...parentPath, "children", i];
|
|
225
233
|
choices.push(choiceFor(document, path, nodeLabel(child), own));
|
|
226
234
|
}
|
|
227
235
|
return choices;
|
|
228
236
|
}
|
|
229
237
|
|
|
230
|
-
function choiceFor(
|
|
231
|
-
|
|
238
|
+
function choiceFor(
|
|
239
|
+
document: JxMutableNode,
|
|
240
|
+
path: JxPath,
|
|
241
|
+
fallback: string,
|
|
242
|
+
own: JxPath,
|
|
243
|
+
): JumpChoice {
|
|
244
|
+
const node = getNodeAtPath(document, path);
|
|
232
245
|
const label = node ? nodeLabel(node) : fallback;
|
|
233
246
|
const choice: JumpChoice = { args: { path }, command: "selection.set", label };
|
|
234
247
|
// `pathsEqual`, not a joined key: a separator is a guess about what a segment cannot contain,
|
|
@@ -278,8 +291,7 @@ export function jumpSegments(
|
|
|
278
291
|
|
|
279
292
|
// A logic editor is the leaf of the address, and it has no selection under it: the Monaco buffer
|
|
280
293
|
// And the formula workspace are editing a definition, not a node of the document tree.
|
|
281
|
-
const editingFunction = tab.session.ui
|
|
282
|
-
const editingFormula = tab.session.ui.editingFormula as FormulaEditDef | null;
|
|
294
|
+
const { editingFormula, editingFunction } = tab.session.ui;
|
|
283
295
|
if (editingFunction) {
|
|
284
296
|
segments.push(editorSegment("ƒ", editingFunction));
|
|
285
297
|
return segments;
|
|
@@ -333,9 +345,7 @@ function editorSegment(sigil: string, def: FunctionEditDef | FormulaEditDef): Ju
|
|
|
333
345
|
*/
|
|
334
346
|
function stepKey(segment: JumpSegment): string {
|
|
335
347
|
const path = segment.args?.path;
|
|
336
|
-
return segment.kind === "node" && Array.isArray(path)
|
|
337
|
-
? `node:${(path as JxPath).join("/")}`
|
|
338
|
-
: segment.kind;
|
|
348
|
+
return segment.kind === "node" && Array.isArray(path) ? `node:${path.join("/")}` : segment.kind;
|
|
339
349
|
}
|
|
340
350
|
|
|
341
351
|
/** Whether the registry can actually run this id right now. */
|
|
@@ -446,7 +456,7 @@ function openChoices(segment: JumpSegment, anchor: HTMLElement | null): void {
|
|
|
446
456
|
},
|
|
447
457
|
title: choice.label,
|
|
448
458
|
}));
|
|
449
|
-
const
|
|
459
|
+
const options: OpenMenuOptions = {
|
|
450
460
|
label: `Go to a sibling of ${segment.label}`,
|
|
451
461
|
onClosed: (closed) => {
|
|
452
462
|
if (_menu === closed) {
|
|
@@ -455,10 +465,13 @@ function openChoices(segment: JumpSegment, anchor: HTMLElement | null): void {
|
|
|
455
465
|
},
|
|
456
466
|
opener: anchor,
|
|
457
467
|
placement: ABOVE_OPENER,
|
|
458
|
-
...(anchor ? { place: (box: DOMRect) => aboveOpener(anchor, box) } : {}),
|
|
459
468
|
region: "jump-bar",
|
|
460
469
|
rows,
|
|
461
|
-
}
|
|
470
|
+
};
|
|
471
|
+
if (anchor) {
|
|
472
|
+
options.place = (box: DOMRect) => aboveOpener(anchor, box);
|
|
473
|
+
}
|
|
474
|
+
const handle = openMenu(options);
|
|
462
475
|
_menu = handle;
|
|
463
476
|
}
|
|
464
477
|
|
|
@@ -466,13 +479,19 @@ function openChoices(segment: JumpSegment, anchor: HTMLElement | null): void {
|
|
|
466
479
|
* The menu's corner when it hangs above `anchor`: its bottom on the anchor's top, leading edges
|
|
467
480
|
* aligned.
|
|
468
481
|
*/
|
|
469
|
-
export function aboveOpener(anchor: HTMLElement, box: DOMRect):
|
|
482
|
+
export function aboveOpener(anchor: HTMLElement, box: DOMRect): ViewportPoint {
|
|
470
483
|
const rect = rectOf(anchor);
|
|
471
484
|
return { x: Math.round(rect.left), y: Math.max(0, Math.round(rect.top - box.height)) };
|
|
472
485
|
}
|
|
473
486
|
|
|
474
487
|
/** The address of the focused pane, and the segments behind it. */
|
|
475
|
-
|
|
488
|
+
interface FocusedAddress {
|
|
489
|
+
steps: ProjectedStep[];
|
|
490
|
+
segments: JumpSegment[];
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
/** Projects {@link FocusedAddress} for the focused pane. */
|
|
494
|
+
function projectFocused(): FocusedAddress {
|
|
476
495
|
const paneId = activePane().id;
|
|
477
496
|
const segments = jumpSegments(tabOfPane(paneId), derivationOfPane(paneId));
|
|
478
497
|
const registry = activeRegistry();
|
|
@@ -47,7 +47,15 @@
|
|
|
47
47
|
*/
|
|
48
48
|
|
|
49
49
|
import { nothing } from "lit-html";
|
|
50
|
-
import {
|
|
50
|
+
import {
|
|
51
|
+
displayTagName,
|
|
52
|
+
isMappedArray,
|
|
53
|
+
isNonNullObject,
|
|
54
|
+
isNumber,
|
|
55
|
+
isString,
|
|
56
|
+
isTagExpression,
|
|
57
|
+
tagNameCandidates,
|
|
58
|
+
} from "@jxsuite/schema/guards";
|
|
51
59
|
import {
|
|
52
60
|
VOID_ELEMENTS,
|
|
53
61
|
childIndex,
|
|
@@ -60,7 +68,7 @@ import {
|
|
|
60
68
|
} from "../store";
|
|
61
69
|
import { activeTab } from "../workspace/workspace";
|
|
62
70
|
import {
|
|
63
|
-
isSelected
|
|
71
|
+
isSelected,
|
|
64
72
|
primarySelection,
|
|
65
73
|
rangeSelection,
|
|
66
74
|
selectionAnchor,
|
|
@@ -72,7 +80,12 @@ import { mutateUpdateProperty, transactDoc } from "../tabs/transact";
|
|
|
72
80
|
import { view } from "../view";
|
|
73
81
|
import { setActivityTab } from "../shell";
|
|
74
82
|
import { registerPanel } from "./panel-registry";
|
|
75
|
-
import {
|
|
83
|
+
import {
|
|
84
|
+
INDENT_BASE,
|
|
85
|
+
INDENT_STEP,
|
|
86
|
+
detachStylebookLayers,
|
|
87
|
+
mountStylebookLayersPanel,
|
|
88
|
+
} from "./stylebook-layers-panel";
|
|
76
89
|
import { selectStylebookTag, stylebookMeta } from "./stylebook-panel";
|
|
77
90
|
import { isInlineElement } from "../editor/inline-edit";
|
|
78
91
|
import { showContextMenu } from "../editor/context-menu";
|
|
@@ -115,17 +128,17 @@ const TEXT_PREVIEW_MAX = 40;
|
|
|
115
128
|
* Deliberately short. `section`, `ul` and `table` are omitted: "Section" next to a `section` badge
|
|
116
129
|
* is the repetition this function exists to remove.
|
|
117
130
|
*/
|
|
118
|
-
const LANDMARK_NAMES:
|
|
119
|
-
article
|
|
120
|
-
aside
|
|
121
|
-
dialog
|
|
122
|
-
figure
|
|
123
|
-
footer
|
|
124
|
-
form
|
|
125
|
-
header
|
|
126
|
-
main
|
|
127
|
-
nav
|
|
128
|
-
|
|
131
|
+
const LANDMARK_NAMES: ReadonlyMap<string, string> = new Map([
|
|
132
|
+
["article", "Article"],
|
|
133
|
+
["aside", "Sidebar"],
|
|
134
|
+
["dialog", "Dialog"],
|
|
135
|
+
["figure", "Figure"],
|
|
136
|
+
["footer", "Footer"],
|
|
137
|
+
["form", "Form"],
|
|
138
|
+
["header", "Header"],
|
|
139
|
+
["main", "Main"],
|
|
140
|
+
["nav", "Navigation"],
|
|
141
|
+
]);
|
|
129
142
|
|
|
130
143
|
/** Trim and ellipsize to {@link LABEL_MAX}. */
|
|
131
144
|
function truncate(text: string): string {
|
|
@@ -141,17 +154,17 @@ function truncate(text: string): string {
|
|
|
141
154
|
* five-buttons-per-row build already cost it.
|
|
142
155
|
*/
|
|
143
156
|
function firstText(node: JxMutableNode, depth = 0): string {
|
|
144
|
-
if (
|
|
157
|
+
if (isString(node.textContent) && node.textContent.trim()) {
|
|
145
158
|
return node.textContent.trim();
|
|
146
159
|
}
|
|
147
160
|
if (depth >= 3 || !Array.isArray(node.children)) {
|
|
148
161
|
return "";
|
|
149
162
|
}
|
|
150
163
|
for (const child of node.children) {
|
|
151
|
-
if (
|
|
164
|
+
if (isString(child) && child.trim()) {
|
|
152
165
|
return child.trim();
|
|
153
166
|
}
|
|
154
|
-
if (child
|
|
167
|
+
if (isNonNullObject(child)) {
|
|
155
168
|
const found = firstText(child, depth + 1);
|
|
156
169
|
if (found) {
|
|
157
170
|
return found;
|
|
@@ -164,7 +177,7 @@ function firstText(node: JxMutableNode, depth = 0): string {
|
|
|
164
177
|
/** The node's first class name, when it has a plain (unbound) `class` attribute. */
|
|
165
178
|
function firstClass(node: JxMutableNode): string {
|
|
166
179
|
const value = node.attributes?.class;
|
|
167
|
-
return
|
|
180
|
+
return isString(value) ? (value.trim().split(/\s+/u)[0] ?? "") : "";
|
|
168
181
|
}
|
|
169
182
|
|
|
170
183
|
/**
|
|
@@ -188,14 +201,14 @@ export function outlineLabel(node: JxMutableNode): string {
|
|
|
188
201
|
if (node.$id) {
|
|
189
202
|
return `#${truncate(node.$id)}`;
|
|
190
203
|
}
|
|
191
|
-
if (
|
|
204
|
+
if (isString(node.textContent) && node.textContent.trim()) {
|
|
192
205
|
return truncate(node.textContent);
|
|
193
206
|
}
|
|
194
207
|
const cls = firstClass(node);
|
|
195
208
|
if (cls) {
|
|
196
209
|
return `.${truncate(cls)}`;
|
|
197
210
|
}
|
|
198
|
-
const landmark = LANDMARK_NAMES
|
|
211
|
+
const landmark = LANDMARK_NAMES.get(displayTagName(node.tagName).toLowerCase());
|
|
199
212
|
if (landmark) {
|
|
200
213
|
return landmark;
|
|
201
214
|
}
|
|
@@ -256,12 +269,11 @@ export function rowCommandViews(
|
|
|
256
269
|
// ─── The tree, as a keyboard surface ─────────────────────────────────────────
|
|
257
270
|
|
|
258
271
|
/**
|
|
259
|
-
*
|
|
260
|
-
*
|
|
272
|
+
* The depth past which the column stops paying. The pixels per level and the row's own gutter are
|
|
273
|
+
* the Stylebook layers panel's {@link INDENT_STEP} and {@link INDENT_BASE}, so the two trees indent
|
|
274
|
+
* alike.
|
|
261
275
|
*/
|
|
262
|
-
const INDENT_STEP = 16;
|
|
263
276
|
const INDENT_MAX_DEPTH = 6;
|
|
264
|
-
const INDENT_BASE = 8;
|
|
265
277
|
|
|
266
278
|
/**
|
|
267
279
|
* The indent for `depth`, capped.
|
|
@@ -275,7 +287,7 @@ export function indentWidth(depth: number): number {
|
|
|
275
287
|
|
|
276
288
|
/** The inverse of {@link pathKey}: numeric segments come back as numbers, as the doc stores them. */
|
|
277
289
|
function pathFromKey(key: string): JxPath {
|
|
278
|
-
return key ?
|
|
290
|
+
return key ? key.split("/").map((s) => (/^\d+$/u.test(s) ? Number(s) : s)) : [];
|
|
279
291
|
}
|
|
280
292
|
|
|
281
293
|
// ─── The row model, and the window onto it ───────────────────────────────────
|
|
@@ -288,7 +300,7 @@ function pathFromKey(key: string): JxPath {
|
|
|
288
300
|
* window only. Splitting the two is the whole saving — the expensive half is the kit elements a
|
|
289
301
|
* row's cluster mounts, not the walk that finds it.
|
|
290
302
|
*/
|
|
291
|
-
interface
|
|
303
|
+
interface OutlineRowFacts {
|
|
292
304
|
/** `pathKey(path)` — the drag-and-drop and roving-focus key, and the `$map`'s reconcile key. */
|
|
293
305
|
key: string;
|
|
294
306
|
path: JxPath;
|
|
@@ -303,7 +315,6 @@ interface OutlineRow {
|
|
|
303
315
|
* than quietly start selecting text nodes.
|
|
304
316
|
*/
|
|
305
317
|
item: boolean;
|
|
306
|
-
node: JxMutableNode | string | number | boolean;
|
|
307
318
|
nodeType: string;
|
|
308
319
|
/** 1-based position among the row's `role="treeitem"` siblings — see {@link numberOutlineSets}. */
|
|
309
320
|
posInSet: number;
|
|
@@ -311,6 +322,20 @@ interface OutlineRow {
|
|
|
311
322
|
setSize: number;
|
|
312
323
|
}
|
|
313
324
|
|
|
325
|
+
/** A `role="treeitem"` row: an element, a repeater, a template or a case, always an object node. */
|
|
326
|
+
interface OutlineItemRow extends OutlineRowFacts {
|
|
327
|
+
item: true;
|
|
328
|
+
node: JxMutableNode;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
/** A text-node row: drawn, but not a tree item. Its node is the bare child primitive. */
|
|
332
|
+
interface OutlineTextRow extends OutlineRowFacts {
|
|
333
|
+
item: false;
|
|
334
|
+
node: JxMutableNode | string | number | boolean;
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
type OutlineRow = OutlineItemRow | OutlineTextRow;
|
|
338
|
+
|
|
314
339
|
/**
|
|
315
340
|
* The declared height of one row — `surfaces/panel-outline.json`'s `[part="row"] { block-size }`.
|
|
316
341
|
*
|
|
@@ -456,6 +481,11 @@ function watchOutlineTree(): void {
|
|
|
456
481
|
* reorder, canvas to Outline sync, a collaborator's cursor, a jump from Problems — needs the
|
|
457
482
|
* unambiguous one.
|
|
458
483
|
*/
|
|
484
|
+
/** Whether a decoded `data-jx-path` is a path: an array of string and number segments. */
|
|
485
|
+
function isJxPath(value: unknown): value is JxPath {
|
|
486
|
+
return Array.isArray(value) && value.every((segment) => isString(segment) || isNumber(segment));
|
|
487
|
+
}
|
|
488
|
+
|
|
459
489
|
export function outlineRowPath(el: Element | null): JxPath | null {
|
|
460
490
|
const row = el?.closest<HTMLElement>("[data-jx-path]");
|
|
461
491
|
if (!row?.dataset.jxPath) {
|
|
@@ -463,7 +493,7 @@ export function outlineRowPath(el: Element | null): JxPath | null {
|
|
|
463
493
|
}
|
|
464
494
|
try {
|
|
465
495
|
const parsed: unknown = JSON.parse(row.dataset.jxPath);
|
|
466
|
-
return
|
|
496
|
+
return isJxPath(parsed) ? parsed : null;
|
|
467
497
|
} catch {
|
|
468
498
|
return null;
|
|
469
499
|
}
|
|
@@ -674,7 +704,7 @@ function outlineRowLabel(row: OutlineRow): string {
|
|
|
674
704
|
const text = String(row.node);
|
|
675
705
|
return text.length > TEXT_PREVIEW_MAX ? `${text.slice(0, TEXT_PREVIEW_MAX)}…` : text;
|
|
676
706
|
}
|
|
677
|
-
const node = row
|
|
707
|
+
const { node } = row;
|
|
678
708
|
return row.nodeType === "case-ref" ? node.$ref || "external" : outlineLabel(node);
|
|
679
709
|
}
|
|
680
710
|
|
|
@@ -733,7 +763,7 @@ export function startLayerTitleEdit(path: JxPath, rerender: () => void) {
|
|
|
733
763
|
/* The row's own node, not a second `getNodeAtPath` walk: the model already holds it, and reading
|
|
734
764
|
it back off the model is what makes "a text line has no `$title` to write" a real branch rather
|
|
735
765
|
than a defensive null check nothing can reach. */
|
|
736
|
-
if (!row?.item
|
|
766
|
+
if (!row?.item) {
|
|
737
767
|
return;
|
|
738
768
|
}
|
|
739
769
|
_editing = { key: row.key, rerender, text: row.node.$title || "" };
|
|
@@ -827,9 +857,11 @@ function buildOutlineRows(doc: JxMutableNode, mode: string, collapsed: Set<strin
|
|
|
827
857
|
}
|
|
828
858
|
|
|
829
859
|
const isText = nodeType === "text";
|
|
860
|
+
/** The row's node when it is a tree item; `null` for a text-node row. */
|
|
861
|
+
let element: JxMutableNode | null = null;
|
|
830
862
|
if (!isText) {
|
|
831
863
|
// After the text-node branch, a row's node is a JxMutableNode or it is not a row at all.
|
|
832
|
-
if (
|
|
864
|
+
if (!isNonNullObject(node)) {
|
|
833
865
|
continue;
|
|
834
866
|
}
|
|
835
867
|
if (path.length >= 2 && nodeType === "element") {
|
|
@@ -839,22 +871,28 @@ function buildOutlineRows(doc: JxMutableNode, mode: string, collapsed: Set<strin
|
|
|
839
871
|
continue;
|
|
840
872
|
}
|
|
841
873
|
}
|
|
874
|
+
element = node;
|
|
842
875
|
}
|
|
843
876
|
|
|
844
877
|
while (ancestors.length > 0 && rows[ancestors.at(-1)!]!.depth >= depth) {
|
|
845
878
|
ancestors.pop();
|
|
846
879
|
}
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
880
|
+
const parent = ancestors.at(-1) ?? -1;
|
|
881
|
+
rows.push(
|
|
882
|
+
element === null
|
|
883
|
+
? { depth, item: false, key, node, nodeType, parent, path, posInSet: 0, setSize: 0 }
|
|
884
|
+
: {
|
|
885
|
+
depth,
|
|
886
|
+
item: true,
|
|
887
|
+
key,
|
|
888
|
+
node: element,
|
|
889
|
+
nodeType,
|
|
890
|
+
parent,
|
|
891
|
+
path,
|
|
892
|
+
posInSet: 0,
|
|
893
|
+
setSize: 0,
|
|
894
|
+
},
|
|
895
|
+
);
|
|
858
896
|
ancestors.push(rows.length - 1);
|
|
859
897
|
}
|
|
860
898
|
return numberOutlineSets(rows);
|
|
@@ -890,30 +928,20 @@ function numberOutlineSets(rows: OutlineRow[]): OutlineRow[] {
|
|
|
890
928
|
|
|
891
929
|
/** Whether the row has anything under it — children, a map template, or `$switch` cases. */
|
|
892
930
|
function isExpandable(row: OutlineRow): boolean {
|
|
893
|
-
if (!row.item
|
|
931
|
+
if (!row.item) {
|
|
894
932
|
return false;
|
|
895
933
|
}
|
|
896
|
-
const node = row
|
|
934
|
+
const { node } = row;
|
|
897
935
|
const hasChildren = Array.isArray(node.children) && node.children.length > 0;
|
|
898
|
-
const hasMapChildren =
|
|
899
|
-
node.children !== undefined &&
|
|
900
|
-
typeof node.children === "object" &&
|
|
901
|
-
(node.children as unknown as Record<string, unknown>).$prototype === "Array";
|
|
936
|
+
const hasMapChildren = isMappedArray(node.children);
|
|
902
937
|
const hasCases =
|
|
903
|
-
Boolean(node.$switch) &&
|
|
904
|
-
typeof node.cases === "object" &&
|
|
905
|
-
node.cases !== null &&
|
|
906
|
-
Object.keys(node.cases).length > 0;
|
|
938
|
+
Boolean(node.$switch) && isNonNullObject(node.cases) && Object.keys(node.cases).length > 0;
|
|
907
939
|
return hasChildren || hasMapChildren || hasCases || (row.nodeType === "map" && Boolean(node.map));
|
|
908
940
|
}
|
|
909
941
|
|
|
910
942
|
/** The badge: what it says, which of the six drawings it gets, and what it says on hover. */
|
|
911
|
-
function rowBadge(row:
|
|
912
|
-
|
|
913
|
-
badgeKind: string;
|
|
914
|
-
badgeTitle: string | null;
|
|
915
|
-
} {
|
|
916
|
-
const node = row.node as JxMutableNode;
|
|
943
|
+
function rowBadge(row: OutlineItemRow): Pick<OutlineRowView, "badge" | "badgeKind" | "badgeTitle"> {
|
|
944
|
+
const { node } = row;
|
|
917
945
|
if (row.nodeType === "map") {
|
|
918
946
|
return { badge: "↻", badgeKind: "map", badgeTitle: "Repeating list — one copy per item" };
|
|
919
947
|
}
|
|
@@ -930,9 +958,7 @@ function rowBadge(row: OutlineRow): {
|
|
|
930
958
|
badge: "▣",
|
|
931
959
|
badgeKind: "slot",
|
|
932
960
|
badgeTitle:
|
|
933
|
-
|
|
934
|
-
? `Slot "${slotName.trim()}"`
|
|
935
|
-
: "Default slot",
|
|
961
|
+
isString(slotName) && slotName.trim() ? `Slot "${slotName.trim()}"` : "Default slot",
|
|
936
962
|
};
|
|
937
963
|
}
|
|
938
964
|
/* The ROW BADGE, which is the one place the tag is shown as itself rather than folded into a
|
|
@@ -994,10 +1020,9 @@ function outlineRowView(
|
|
|
994
1020
|
if (!row.item) {
|
|
995
1021
|
return textRowView(row);
|
|
996
1022
|
}
|
|
997
|
-
const { depth, key, nodeType, path } = row;
|
|
998
|
-
const node = row.node as JxMutableNode;
|
|
1023
|
+
const { depth, key, node, nodeType, path } = row;
|
|
999
1024
|
|
|
1000
|
-
const selected =
|
|
1025
|
+
const selected = isSelected(doc.selection, path);
|
|
1001
1026
|
const expandable = isExpandable(row);
|
|
1002
1027
|
// Array nodes can't accept dropped children (their content is the single map template), so they
|
|
1003
1028
|
// Block the make-child drop instruction like void elements do.
|
|
@@ -1006,8 +1031,7 @@ function outlineRowView(
|
|
|
1006
1031
|
// Array (repeater) nodes are first-class structural nodes — movable/draggable/deletable like
|
|
1007
1032
|
// Elements. Both sit at a numeric child index; templates (path tail "map") and case nodes do
|
|
1008
1033
|
// Not, so they stay selectable/editable but not structurally manipulable.
|
|
1009
|
-
const structural =
|
|
1010
|
-
(nodeType === "element" || nodeType === "map") && typeof childIndex(path) === "number";
|
|
1034
|
+
const structural = (nodeType === "element" || nodeType === "map") && isNumber(childIndex(path));
|
|
1011
1035
|
const isRoot = doc.mode === "content" ? path.length === 0 : path.length < 2;
|
|
1012
1036
|
const grabbable = structural && !isRoot;
|
|
1013
1037
|
const open = expandable && !collapsed.has(key);
|
|
@@ -1187,7 +1211,7 @@ function revealChangedSelection(): void {
|
|
|
1187
1211
|
function revealSelectedRow(): void {
|
|
1188
1212
|
const drawn = _outlineList?.querySelector(`${ROW_SELECTOR}[aria-selected="true"]`);
|
|
1189
1213
|
if (drawn) {
|
|
1190
|
-
drawn.scrollIntoView
|
|
1214
|
+
drawn.scrollIntoView({ behavior: "smooth", block: "nearest" });
|
|
1191
1215
|
return;
|
|
1192
1216
|
}
|
|
1193
1217
|
revealOutlineRow(outlineIndexOfPath(primarySelection(activeTab.value?.session.selection)));
|
|
@@ -1244,9 +1268,9 @@ export function mountOutlinePanel(
|
|
|
1244
1268
|
standing = {
|
|
1245
1269
|
handle: mountOutlineSurface(target, values, {
|
|
1246
1270
|
contextMenu: (_scope, event) => {
|
|
1247
|
-
const path = outlineRowPath(event.target
|
|
1248
|
-
if (path) {
|
|
1249
|
-
showContextMenu(event
|
|
1271
|
+
const path = outlineRowPath(event.target instanceof Element ? event.target : null);
|
|
1272
|
+
if (path && event instanceof MouseEvent) {
|
|
1273
|
+
showContextMenu(event, path, { rerender: () => _outlineRerender?.() });
|
|
1250
1274
|
redrawOutline();
|
|
1251
1275
|
}
|
|
1252
1276
|
},
|
|
@@ -1260,10 +1284,9 @@ export function mountOutlinePanel(
|
|
|
1260
1284
|
mount would, and the host decides when it is worth anything. An unconnected input
|
|
1261
1285
|
cannot take focus. */
|
|
1262
1286
|
queueMicrotask(() => {
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
input.select?.();
|
|
1287
|
+
if (element instanceof HTMLInputElement && element.isConnected) {
|
|
1288
|
+
element.focus();
|
|
1289
|
+
element.select();
|
|
1267
1290
|
}
|
|
1268
1291
|
});
|
|
1269
1292
|
},
|
package/src/panels/left-panel.ts
CHANGED
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
*/
|
|
28
28
|
|
|
29
29
|
import { render as litRender } from "lit-html";
|
|
30
|
-
import { leftPanel } from "../store";
|
|
30
|
+
import { leftPanel, requireShellRef } from "../store";
|
|
31
31
|
import { effect, effectScope } from "../reactivity";
|
|
32
32
|
import { activeTab } from "../workspace/workspace";
|
|
33
33
|
import { shell } from "../shell";
|
|
@@ -72,7 +72,7 @@ export function mount(deps: NavigatorPanelDeps) {
|
|
|
72
72
|
_deps = deps;
|
|
73
73
|
registerNavigatorPanels();
|
|
74
74
|
_dock = mountNavigatorDock(
|
|
75
|
-
leftPanel,
|
|
75
|
+
requireShellRef(leftPanel, "left-panel"),
|
|
76
76
|
{ panels: [panelView()] },
|
|
77
77
|
{
|
|
78
78
|
onContent: (panelId, host) => {
|
|
@@ -180,7 +180,7 @@ function navigatorDocument(): NavigatorDocument | null {
|
|
|
180
180
|
return null;
|
|
181
181
|
}
|
|
182
182
|
return {
|
|
183
|
-
canvas: aTab.session.canvas
|
|
183
|
+
canvas: aTab.session.canvas,
|
|
184
184
|
content: aTab.doc.content,
|
|
185
185
|
document: aTab.doc.document,
|
|
186
186
|
documentPath: aTab.documentPath,
|