@jxsuite/studio 6.1.1 → 8.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -5
- package/dist/chunks/2020-5wtzce5g.js +4 -0
- package/dist/chunks/{action-group-2mqby73c.js → action-group-4aan7g6g.js} +3 -3
- package/dist/chunks/adapter-5tphg7xe.js +4 -0
- package/dist/chunks/add-new-flow-psym14sn.js +4 -0
- package/dist/chunks/cf-account-picker-haqazq5r.js +4 -0
- package/dist/chunks/cf-settings-h2wrh6hq.js +4 -0
- package/dist/chunks/color-area-6rbra5dy.js +4 -0
- package/dist/chunks/color-field-gy56c94g.js +4 -0
- package/dist/chunks/color-m7r1vk54.js +4 -0
- package/dist/chunks/color-slider-sqqdyf6c.js +4 -0
- package/dist/chunks/combobox-72h32ejk.js +4 -0
- package/dist/chunks/components-r22xca09.js +4 -0
- package/dist/chunks/content-source-mmppmcyg.js +4 -0
- package/dist/chunks/convert-to-repeater-he70fc2b.js +4 -0
- package/dist/chunks/dialog-c4x05vyx.js +4 -0
- package/dist/chunks/editor-ccd9jwsa.js +4 -0
- package/dist/chunks/entry-commands-6qxz9e8p.js +4 -0
- package/dist/chunks/extension-sections-0egb88dm.js +4 -0
- package/dist/chunks/file-ops-qnab36ek.js +4 -0
- package/dist/chunks/files-rcn56qvm.js +4 -0
- package/dist/chunks/format-host-yxz0kjjs.js +4 -0
- package/dist/chunks/fs-events-d1qxq4z4.js +4 -0
- package/dist/chunks/grid-open-4z1g062t.js +4 -0
- package/dist/chunks/grid-view-qg1b5eqx.js +51 -0
- package/dist/chunks/icons-63bjtbs7.js +4 -0
- package/dist/chunks/iframe-entry-2zggzajv.js +5 -0
- package/dist/chunks/iframe-entry-76j8vwwx.js +5 -0
- package/dist/chunks/iframe-entry-99nr5zfb.js +5 -0
- package/dist/chunks/iframe-entry-pkgmcgp0.js +5 -0
- package/dist/chunks/iframe-host-ssv7kyj0.js +4 -0
- package/dist/chunks/{index-2veqmnhr.js → index-32eqzv1k.js} +3 -3
- package/dist/chunks/index-f0jn7nnp.js +4 -0
- package/dist/chunks/{javascript-8nbvs12s.js → javascript-pjp734q4.js} +3 -3
- package/dist/chunks/jsonMode-njkvsa02.js +13 -0
- package/dist/chunks/jx-validate-ttasrbh7.js +4 -0
- package/dist/chunks/layers-bgyr11tr.js +4 -0
- package/dist/chunks/layers-panel-7ez66zeq.js +4 -0
- package/dist/chunks/listbox-c421cf8c.js +4 -0
- package/dist/chunks/lit-html-v9gh687x.js +4 -0
- package/dist/chunks/media-library-sq468wts.js +4 -0
- package/dist/chunks/media-picker-shfe59pt.js +4 -0
- package/dist/chunks/menu-bdpzbfvs.js +4 -0
- package/dist/chunks/monaco-binding-vq1hgnn0.js +4 -0
- package/dist/chunks/monaco-buffer-3afgwvbp.js +4 -0
- package/dist/chunks/monaco-setup-xrd2cbkp.js +4 -0
- package/dist/chunks/notify-kzrjr3fv.js +4 -0
- package/dist/chunks/number-field-y62xq0ty.js +4 -0
- package/dist/chunks/parse-v77xtwv7.js +4 -0
- package/dist/chunks/platform-7v4rtd7m.js +4 -0
- package/dist/chunks/popover-b89sfej7.js +4 -0
- package/dist/chunks/publish-panel-2z9gw8ee.js +4 -0
- package/dist/chunks/publish-quick-qx2455cj.js +4 -0
- package/dist/chunks/publish-workspace-wrc1dgwx.js +4 -0
- package/dist/chunks/quick-search-n0t0eqxb.js +4 -0
- package/dist/chunks/references-9547rg5s.js +4 -0
- package/dist/chunks/right-panel-wsgnr9pn.js +4 -0
- package/dist/chunks/select-rzds841e.js +4 -0
- package/dist/chunks/source-control-kwktr9y6.js +4 -0
- package/dist/chunks/split-c9zfdgxf.js +4 -0
- package/dist/chunks/studio-03ct6yfv.js +9 -0
- package/dist/chunks/studio-07rcfje3.js +5 -0
- package/dist/chunks/studio-3e54qh39.js +7 -0
- package/dist/chunks/studio-3exxhz5g.js +5 -0
- package/dist/chunks/studio-3q40e3rj.js +5 -0
- package/dist/chunks/studio-3qeh9t0h.js +6 -0
- package/dist/chunks/studio-3qqjeep5.js +6 -0
- package/dist/chunks/studio-43sd2mam.js +4 -0
- package/dist/chunks/studio-4hp8pkyt.js +5 -0
- package/dist/chunks/studio-58xg6j2q.js +9 -0
- package/dist/chunks/studio-5g0rprdt.js +7 -0
- package/dist/chunks/studio-6m380wp7.js +5 -0
- package/dist/chunks/studio-80jyh1xh.js +4 -0
- package/dist/chunks/studio-83mk4bgg.js +9 -0
- package/dist/chunks/{studio-kggey1jt.js → studio-881z1xrx.js} +4 -4
- package/dist/chunks/studio-8m0y2qe7.js +5 -0
- package/dist/chunks/studio-8tr6cfrc.js +5 -0
- package/dist/chunks/studio-8vcvfs7r.js +6 -0
- package/dist/chunks/studio-9tmebf0s.js +5 -0
- package/dist/chunks/studio-a2bvaptz.js +5 -0
- package/dist/chunks/studio-b7y5mr30.js +5 -0
- package/dist/chunks/studio-bavb31r0.js +5 -0
- package/dist/chunks/studio-bbe4c90a.js +5 -0
- package/dist/chunks/studio-c05wdnt3.js +5 -0
- package/dist/chunks/studio-ccv2svc6.js +5 -0
- package/dist/chunks/studio-d5grtb9e.js +16 -0
- package/dist/chunks/studio-df0baea9.js +5 -0
- package/dist/chunks/studio-dgk4dqtx.js +7 -0
- package/dist/chunks/studio-e1g64q43.js +5 -0
- package/dist/chunks/studio-ed1hp6zf.js +6 -0
- package/dist/chunks/studio-ed3xx40h.js +7 -0
- package/dist/chunks/studio-f14e1zdj.js +5 -0
- package/dist/chunks/studio-fbhxxc5f.js +5 -0
- package/dist/chunks/studio-fyh0jc96.js +5 -0
- package/dist/chunks/studio-gcxk20n7.js +5 -0
- package/dist/chunks/studio-jaaz8ce9.js +5 -0
- package/dist/chunks/{studio-8grwxtqk.js → studio-jcnsdaep.js} +4 -4
- package/dist/chunks/studio-jsgf2q5k.js +7 -0
- package/dist/chunks/{studio-1q1sh2ax.js → studio-k3xxbagr.js} +3 -3
- package/dist/chunks/studio-k7evxqh4.js +5 -0
- package/dist/chunks/studio-kt3pjkwd.js +5 -0
- package/dist/chunks/studio-m8g16bgz.js +5 -0
- package/dist/chunks/studio-mn0476ag.js +5 -0
- package/dist/chunks/studio-mx1smyq0.js +5 -0
- package/dist/chunks/studio-n0c5h6mf.js +5 -0
- package/dist/chunks/{studio-rv11kfwa.js → studio-nh6d342n.js} +7 -7
- package/dist/chunks/studio-nqxqf8p2.js +4 -0
- package/dist/chunks/studio-p4nrkvqr.js +5 -0
- package/dist/chunks/{studio-h46vtzk8.js → studio-pbxa5fpc.js} +4 -4
- package/dist/chunks/studio-pgmvdv7z.js +7 -0
- package/dist/chunks/studio-ph84avkf.js +5 -0
- package/dist/chunks/{studio-wszjyh0j.js → studio-q0mvbaq6.js} +4 -4
- package/dist/chunks/studio-q0tccd43.js +5 -0
- package/dist/chunks/studio-q7rtx6zq.js +14 -0
- package/dist/chunks/{studio-pre0skq6.js → studio-qgh13jtz.js} +4 -4
- package/dist/chunks/studio-qmn1xc24.js +5 -0
- package/dist/chunks/studio-qwdqwkj0.js +5 -0
- package/dist/chunks/{studio-t6b6qe31.js → studio-r5qy30vx.js} +4 -4
- package/dist/chunks/studio-rj9eamf8.js +5 -0
- package/dist/chunks/studio-rptgsk96.js +5 -0
- package/dist/chunks/studio-rthyg42z.js +928 -0
- package/dist/chunks/studio-s19tp1xr.js +5 -0
- package/dist/chunks/studio-s32578pn.js +5 -0
- package/dist/chunks/studio-svb7yyve.js +5 -0
- package/dist/chunks/studio-syreb644.js +5 -0
- package/dist/chunks/studio-tf9jryb1.js +10 -0
- package/dist/chunks/studio-tfkznv39.js +5 -0
- package/dist/chunks/studio-tft6r105.js +5 -0
- package/dist/chunks/studio-txf2kysx.js +5 -0
- package/dist/chunks/studio-v8867ddv.js +12 -0
- package/dist/chunks/studio-vxq7fcvv.js +5 -0
- package/dist/chunks/studio-w4rz9hdk.js +5 -0
- package/dist/chunks/studio-wbcjbhy1.js +9 -0
- package/dist/chunks/studio-wc649wss.js +5 -0
- package/dist/chunks/studio-wys23mxz.js +5 -0
- package/dist/chunks/studio-x1x167jh.js +5 -0
- package/dist/chunks/studio-x9hsze61.js +5 -0
- package/dist/chunks/studio-y0n7yxea.js +9 -0
- package/dist/chunks/studio-y3ahhdpx.js +5 -0
- package/dist/chunks/studio-z97c48fk.js +5 -0
- package/dist/chunks/studio-zat62m0c.js +5 -0
- package/dist/chunks/studio-zcd2e7yz.js +5 -0
- package/dist/chunks/studio-zz9qe3rw.js +64 -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-1gv0h53h.js +4 -0
- package/dist/chunks/toast-host-1yg5ar8d.js +4 -0
- package/dist/chunks/{toolbar-2nnzqhrj.js → toolbar-44cm5cta.js} +3 -3
- package/dist/chunks/tooltip-yypz28gq.js +4 -0
- package/dist/chunks/tree-9xa4hm7n.js +4 -0
- package/dist/chunks/tsMode-epyfz1hv.js +14 -0
- package/dist/chunks/workspace-dz7nxfhv.js +4 -0
- package/dist/chunks/workspace-home-xsd7hkjw.js +4 -0
- package/dist/chunks/ws-client-bv552sfx.js +4 -0
- package/dist/iframe-entry.js +20 -16
- package/dist/manifest.json +77 -63
- package/dist/studio.js +106 -107
- package/dist/workers/ts.worker.js +3 -3
- package/package.json +17 -16
- 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/component-examples.ts +272 -0
- package/src/browse/library-commands.ts +64 -104
- package/src/browse/library-layouts.ts +270 -53
- package/src/browse/library-model.ts +194 -134
- package/src/browse/library-pane.ts +748 -440
- package/src/browse/library-preview.ts +161 -26
- package/src/browse/library-source.ts +308 -41
- package/src/browse/preview-root.ts +78 -0
- package/src/browse/preview-style.ts +155 -0
- package/src/canvas/asset-refs.ts +40 -10
- package/src/canvas/asset-resolve.ts +19 -23
- package/src/canvas/canvas-helpers.ts +7 -6
- package/src/canvas/canvas-live-render.ts +260 -77
- package/src/canvas/canvas-origin.ts +37 -12
- package/src/canvas/canvas-page-context.ts +112 -0
- package/src/canvas/canvas-patcher.ts +30 -30
- package/src/canvas/canvas-perf.ts +11 -5
- package/src/canvas/canvas-render.ts +175 -148
- package/src/canvas/canvas-surface.ts +5 -3
- package/src/canvas/canvas-utils.ts +147 -61
- 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 +120 -12
- package/src/canvas/iframe-editable-root.ts +29 -16
- package/src/canvas/iframe-entry.ts +104 -75
- package/src/canvas/iframe-eval.ts +73 -49
- package/src/canvas/iframe-host.ts +269 -158
- 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-keys.ts +11 -0
- package/src/canvas/iframe-overlay.ts +1 -1
- package/src/canvas/iframe-patch.ts +25 -21
- package/src/canvas/iframe-position.ts +12 -6
- package/src/canvas/iframe-protocol.ts +36 -21
- package/src/canvas/iframe-render.ts +84 -35
- package/src/canvas/iframe-slash.ts +24 -11
- package/src/canvas/iframe-subtree.ts +10 -3
- package/src/canvas/npm-modules.ts +22 -0
- 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/preview-navigate.ts +16 -0
- package/src/canvas/repeater-sources.ts +200 -0
- package/src/canvas/serialize-scope.ts +13 -5
- package/src/canvas/stage-scrollbar.ts +7 -2
- package/src/canvas/surface-registry.ts +27 -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/app-commands.ts +16 -6
- package/src/commands/budget.ts +13 -11
- package/src/commands/command-args.ts +103 -71
- package/src/commands/context.ts +55 -28
- package/src/commands/defaults.ts +69 -45
- package/src/commands/keymap.ts +56 -43
- package/src/commands/levels.ts +14 -8
- package/src/commands/live-context.ts +9 -7
- package/src/commands/reference.ts +2 -1
- package/src/commands/registry.ts +22 -11
- package/src/commands/run-reported.ts +15 -10
- package/src/component-props.ts +46 -30
- package/src/content/collection-match.ts +11 -9
- package/src/content/collection-pages.ts +412 -0
- package/src/content/content-collections.ts +270 -0
- package/src/content/draft-state.ts +4 -3
- package/src/content/entry-commands.ts +54 -62
- package/src/content/entry-editor.ts +137 -32
- package/src/content/entry-fields.ts +25 -8
- package/src/content/entry-inspector.ts +225 -0
- package/src/content/entry-model.ts +38 -15
- package/src/content/entry-open.ts +80 -0
- package/src/content/entry-summaries.ts +440 -0
- package/src/content/file-record-ids.ts +80 -0
- package/src/content/file-records.ts +125 -0
- package/src/content/page-summaries.ts +129 -0
- package/src/content/record-entry.ts +201 -0
- package/src/content/writing-banner.ts +177 -0
- package/src/create/add-new-commands.ts +185 -0
- package/src/create/add-new-flow.ts +1116 -0
- package/src/create/add-new.ts +1014 -0
- package/src/create/element-name.ts +121 -0
- 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 +78 -48
- package/src/editor/convert-to-repeater.ts +34 -22
- package/src/editor/editable-tags.ts +17 -2
- package/src/editor/file-drop-action.ts +29 -22
- package/src/editor/inline-edit-apply.ts +79 -17
- package/src/editor/inline-edit.ts +76 -50
- package/src/editor/inline-format.ts +59 -56
- package/src/editor/inline-link.ts +40 -15
- package/src/editor/insert-component.ts +91 -0
- package/src/editor/insert-zone-action.ts +14 -5
- package/src/editor/merge-tags.ts +58 -19
- package/src/editor/repeater-scope.ts +39 -28
- package/src/editor/shortcuts.ts +76 -42
- package/src/editor/slash-menu.ts +52 -14
- package/src/files/asset-versions.ts +4 -4
- package/src/files/components.ts +89 -20
- package/src/files/elements.ts +5 -6
- package/src/files/file-ops.ts +92 -41
- package/src/files/files.ts +248 -239
- package/src/files/fs-events.ts +18 -7
- package/src/files/media-meta.ts +97 -2
- package/src/files/media-paths.ts +3 -0
- package/src/files/media-types.ts +55 -0
- package/src/files/media-upload.ts +209 -52
- package/src/files/new-file-name.ts +156 -0
- package/src/files/serialize-document.ts +15 -5
- 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 +91 -50
- package/src/github/github-auth-status.ts +27 -3
- package/src/github/github-auth.ts +21 -11
- package/src/github/github-publish.ts +28 -23
- 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 +25 -23
- package/src/grid/grid-layout.ts +21 -5
- package/src/grid/grid-open.ts +3 -33
- package/src/grid/grid-panel.ts +65 -6
- package/src/grid/grid-reveal.ts +34 -0
- package/src/grid/grid-source.ts +9 -31
- package/src/grid/grid-view.ts +45 -23
- 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 +100 -31
- package/src/grid/sources/csv-file-source.ts +2 -2
- package/src/grid/tabulator-tables.d.ts +61 -34
- package/src/hosting/document.ts +2 -2
- package/src/hosting/stage.ts +7 -7
- package/src/i18n/i18n-commands.ts +3 -3
- package/src/media/media-commands.ts +181 -0
- package/src/media/media-library-model.ts +232 -0
- package/src/media/media-library.ts +1283 -0
- package/src/media/media-pane.ts +51 -20
- 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 +38 -14
- package/src/panels/ai-chat/attached-context.ts +13 -7
- package/src/panels/ai-chat/chat-markdown.ts +8 -8
- 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 +57 -46
- package/src/panels/bottom-dock.ts +5 -3
- package/src/panels/canvas-dnd-bridge.ts +36 -26
- package/src/panels/chat-panel.ts +6 -6
- package/src/panels/collections-panel.ts +306 -0
- package/src/panels/component-preview.ts +35 -13
- package/src/panels/data-explorer.ts +63 -26
- package/src/panels/data-grid.ts +18 -11
- package/src/panels/dnd.ts +115 -138
- package/src/panels/editors.ts +52 -21
- package/src/panels/elements-panel.ts +19 -5
- package/src/panels/empty-state.ts +2 -2
- package/src/panels/events-panel.ts +84 -69
- package/src/panels/formula-workspace.ts +78 -54
- package/src/panels/frontmatter-fields.ts +33 -28
- package/src/panels/git-diff-open.ts +10 -6
- package/src/panels/head-panel.ts +488 -202
- package/src/panels/i18n-panel.ts +20 -12
- package/src/panels/imports-panel.ts +25 -47
- package/src/panels/jump-bar.ts +75 -31
- package/src/panels/layers-panel.ts +130 -101
- package/src/panels/left-panel.ts +25 -11
- package/src/panels/navigator-panels.ts +23 -11
- package/src/panels/pane-context.ts +140 -49
- package/src/panels/pane-grid.ts +55 -26
- package/src/panels/panel-registry.ts +36 -46
- package/src/panels/properties-panel.ts +182 -124
- package/src/panels/quick-search.ts +53 -31
- package/src/panels/right-panel.ts +201 -45
- package/src/panels/seo-modal.ts +54 -125
- package/src/panels/settings-menu.ts +63 -61
- package/src/panels/settings-pane.ts +268 -162
- package/src/panels/signals-panel.ts +156 -135
- package/src/panels/site-model.ts +367 -0
- package/src/panels/site-panel.ts +638 -0
- package/src/panels/statement-editor.ts +230 -140
- package/src/panels/style-panel.ts +253 -206
- package/src/panels/style-utils.ts +114 -51
- package/src/panels/stylebook-doc.ts +195 -60
- package/src/panels/stylebook-layers-panel.ts +48 -89
- package/src/panels/stylebook-panel.ts +60 -27
- package/src/panels/styles-panel.ts +327 -0
- package/src/panels/tab-drop.ts +27 -11
- package/src/panels/tab-strip.ts +143 -49
- package/src/platform-errors.ts +57 -43
- package/src/platform.ts +59 -31
- package/src/platforms/cloud.ts +373 -176
- package/src/platforms/default-platform.ts +14 -8
- package/src/platforms/devserver.ts +180 -142
- package/src/platforms/read-batcher.ts +16 -8
- package/src/project-list.ts +2 -1
- package/src/publish/deploy-checklist.ts +20 -9
- package/src/publish/pages-service.ts +66 -27
- package/src/publish/publish-changes.ts +491 -0
- package/src/publish/publish-commands.ts +88 -22
- package/src/publish/publish-ids.ts +49 -0
- package/src/publish/publish-panel.ts +10 -6
- package/src/publish/publish-quick.ts +148 -0
- package/src/publish/publish-workspace.ts +926 -0
- package/src/publish/source-control.ts +907 -0
- 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 +74 -51
- package/src/services/cem-export.ts +149 -58
- package/src/services/cf-settings.ts +4 -4
- package/src/services/clock.ts +6 -1
- package/src/services/code-services.ts +37 -31
- package/src/services/connection.ts +2 -2
- 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 +20 -14
- 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 +29 -9
- package/src/services/settings/definitions.ts +25 -14
- 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 +128 -70
- package/src/settings/css-vars-editor.ts +119 -32
- package/src/settings/defs-editor.ts +38 -35
- package/src/settings/developer-panels.ts +43 -0
- package/src/settings/extension-rows.ts +16 -8
- package/src/settings/extension-sections.ts +42 -14
- package/src/settings/extensions-section.ts +4 -1
- package/src/settings/general-settings.ts +101 -28
- package/src/settings/locales-section.ts +20 -12
- package/src/settings/preferences-dialog.ts +17 -7
- package/src/settings/preferences-keymap.ts +7 -5
- package/src/settings/preferences-sections.ts +11 -5
- package/src/settings/project-sections.ts +28 -11
- package/src/settings/schema-field-ui.ts +12 -1
- package/src/settings/section-registry.ts +116 -11
- package/src/settings/settings-dialog.ts +192 -0
- package/src/settings/settings-document.ts +186 -166
- package/src/shell/tree.ts +6 -5
- package/src/shell.ts +536 -477
- package/src/site-context.ts +101 -32
- package/src/state.ts +68 -57
- package/src/store.ts +54 -34
- package/src/studio.ts +219 -116
- package/src/style/live-preview.ts +1 -1
- package/src/style/project-styles.ts +40 -7
- package/src/style/stylebook-specimens.ts +89 -0
- package/src/style/stylebook-target.ts +26 -0
- package/src/style/tag-inheritance.ts +105 -0
- package/src/style/token-ref.ts +5 -4
- package/src/style/variables-focus.ts +61 -0
- package/src/style/variables-view.ts +235 -0
- package/src/surfaces/about.ts +18 -19
- package/src/surfaces/add-new.json +1482 -0
- package/src/surfaces/add-new.ts +325 -0
- package/src/surfaces/add-repo.ts +17 -19
- package/src/surfaces/ai-chat.ts +33 -38
- 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.json +4 -3
- package/src/surfaces/boot-failure.ts +4 -5
- package/src/surfaces/bottom-dock.json +1 -1
- package/src/surfaces/bottom-dock.ts +9 -18
- package/src/surfaces/canvas-stage.json +30 -19
- package/src/surfaces/canvas-stage.ts +17 -16
- package/src/surfaces/cf-account-picker.ts +17 -18
- package/src/surfaces/collections-panel.json +615 -0
- package/src/surfaces/collections-panel.ts +168 -0
- package/src/surfaces/commandbar.json +241 -96
- package/src/surfaces/commandbar.ts +145 -105
- 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/empty-state.json +1 -1
- package/src/surfaces/empty-state.ts +7 -10
- package/src/surfaces/entry-editor.json +136 -0
- package/src/surfaces/entry-editor.ts +35 -11
- package/src/surfaces/entry-inspector.json +371 -0
- package/src/surfaces/entry-inspector.ts +143 -0
- 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/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.json +162 -14
- package/src/surfaces/inspector-dock.ts +59 -31
- package/src/surfaces/jump-bar.ts +5 -6
- package/src/surfaces/jxsuite-update.ts +16 -22
- package/src/surfaces/library-pane.json +670 -437
- package/src/surfaces/library-pane.ts +111 -77
- package/src/surfaces/logic-panel.ts +17 -30
- package/src/surfaces/logic-workspace.ts +13 -15
- package/src/surfaces/media-browser.json +62 -6
- package/src/surfaces/media-browser.ts +26 -11
- package/src/surfaces/media-field.json +1 -1
- package/src/surfaces/media-field.ts +4 -5
- package/src/surfaces/media-library.json +1586 -0
- package/src/surfaces/media-library.ts +282 -0
- package/src/surfaces/media-pane.ts +8 -7
- package/src/surfaces/media-pick-dialog.json +71 -0
- package/src/surfaces/media-pick-dialog.ts +132 -0
- package/src/surfaces/menu.ts +47 -23
- package/src/surfaces/navigator-dock.ts +11 -12
- package/src/surfaces/new-project.ts +27 -26
- package/src/surfaces/pane-context.json +144 -77
- package/src/surfaces/pane-context.ts +44 -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.json +12 -6
- package/src/surfaces/panel-deploy-checklist.ts +8 -7
- 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.json +72 -2
- package/src/surfaces/panel-page.ts +49 -25
- package/src/surfaces/panel-problems.ts +5 -7
- package/src/surfaces/panel-signals.json +1 -1
- package/src/surfaces/panel-signals.ts +25 -39
- package/src/surfaces/panel-stylebook-layers.json +71 -204
- package/src/surfaces/panel-stylebook-layers.ts +5 -29
- package/src/surfaces/preferences.json +120 -48
- package/src/surfaces/preferences.ts +29 -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-quick.json +428 -0
- package/src/surfaces/publish-quick.ts +165 -0
- package/src/surfaces/publish-workspace.json +2892 -0
- package/src/surfaces/publish-workspace.ts +391 -0
- package/src/surfaces/publish.ts +18 -18
- package/src/surfaces/push-plan.ts +7 -8
- package/src/surfaces/rail.json +1 -159
- package/src/surfaces/rail.ts +22 -79
- package/src/surfaces/reference-field.ts +11 -15
- package/src/surfaces/schema-builder.ts +16 -22
- package/src/surfaces/schema-form.json +10 -2
- package/src/surfaces/schema-form.ts +17 -25
- package/src/surfaces/secret-field.ts +9 -6
- package/src/surfaces/seo.json +1 -1
- package/src/surfaces/seo.ts +21 -15
- package/src/surfaces/settings-contexts.ts +9 -7
- package/src/surfaces/settings-contributed.json +5 -5
- package/src/surfaces/settings-contributed.ts +32 -12
- package/src/surfaces/settings-css-vars.json +44 -36
- package/src/surfaces/settings-css-vars.ts +82 -16
- package/src/surfaces/settings-defs.json +2 -2
- package/src/surfaces/settings-defs.ts +17 -21
- package/src/surfaces/settings-deploy.json +2 -15
- package/src/surfaces/settings-deploy.ts +9 -16
- package/src/surfaces/settings-dialog.json +51 -0
- package/src/surfaces/settings-dialog.ts +169 -0
- 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.json +3 -3
- package/src/surfaces/settings-overview.ts +14 -8
- package/src/surfaces/settings-packages.ts +8 -7
- package/src/surfaces/settings-pane.json +269 -46
- package/src/surfaces/settings-pane.ts +88 -36
- package/src/surfaces/settings-rawjson.ts +5 -6
- package/src/surfaces/shell.json +2 -1
- package/src/surfaces/shell.ts +1 -2
- package/src/surfaces/site-panel.json +1029 -0
- package/src/surfaces/site-panel.ts +233 -0
- package/src/surfaces/slash-menu.json +63 -21
- package/src/surfaces/slash-menu.ts +42 -9
- package/src/surfaces/statements.ts +13 -18
- package/src/surfaces/statusbar.ts +56 -29
- package/src/surfaces/style-panel.ts +18 -31
- package/src/surfaces/stylebook-chrome.ts +3 -5
- package/src/surfaces/styles-panel.json +735 -0
- package/src/surfaces/styles-panel.ts +195 -0
- package/src/surfaces/styles-variables.json +149 -0
- package/src/surfaces/styles-variables.ts +145 -0
- package/src/surfaces/tab-strip.json +4 -4
- package/src/surfaces/tab-strip.ts +14 -13
- package/src/surfaces/target-line.ts +6 -7
- package/src/surfaces/welcome.ts +6 -8
- package/src/surfaces/writing-banner.json +94 -0
- package/src/surfaces/writing-banner.ts +80 -0
- package/src/tabs/bare-repeaters.ts +101 -0
- 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 +99 -48
- package/src/tabs/transact.ts +98 -53
- package/src/types.ts +53 -43
- 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 +104 -56
- package/src/ui/formula-catalog.ts +239 -230
- package/src/ui/formula-chips.ts +33 -18
- package/src/ui/layers.ts +57 -31
- package/src/ui/media-picker.ts +300 -47
- package/src/ui/popover-surface.ts +20 -12
- package/src/ui/progress-modal.ts +13 -8
- package/src/ui/regions.ts +14 -12
- package/src/ui/schema-form.ts +372 -97
- 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 +29 -3
- package/src/utils/base64.ts +6 -4
- package/src/utils/edit-display.ts +366 -111
- 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/local-day.ts +18 -0
- 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 +14 -16
- package/src/workspace/session.ts +81 -50
- package/src/workspace/tab-workspace.ts +137 -0
- package/src/workspace/workspace-back.ts +189 -0
- package/src/workspace/workspace-home.ts +133 -0
- package/src/workspace/workspace-ids.ts +129 -0
- package/src/workspace/workspace-switch.ts +372 -0
- package/src/workspace/workspace.ts +165 -47
- package/styles/shell-frame.css +30 -7
- package/styles/shell-frame.json +15 -3
- package/dist/chunks/2020-va2wwra4.js +0 -4
- 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/jsonMode-s8kt9dsj.js +0 -13
- 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-tdcprbqb.js +0 -5
- package/dist/chunks/studio-vrmcjf9g.js +0 -7
- 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-zey7zsdw.js +0 -12
- 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/tsMode-2frah6h1.js +0 -14
- package/dist/chunks/workspace-zt81g1ms.js +0 -4
- package/dist/chunks/ws-client-n2bh4hkf.js +0 -4
- package/src/panels/frontmatter-panel.ts +0 -701
- package/src/panels/git-panel.ts +0 -1120
- package/src/surfaces/doc-header.json +0 -776
- package/src/surfaces/doc-header.ts +0 -231
- package/src/surfaces/git-panel.json +0 -1880
- package/src/surfaces/git-panel.ts +0 -272
|
@@ -45,6 +45,7 @@
|
|
|
45
45
|
* the document it is warning you about.
|
|
46
46
|
*/
|
|
47
47
|
|
|
48
|
+
import { writesEntryOnCanvas } from "../content/content-collections";
|
|
48
49
|
import { projectState, updateUi } from "../store";
|
|
49
50
|
import { effect, effectScope } from "../reactivity";
|
|
50
51
|
import { PRIMARY_PANE, focusPane, workspace } from "../workspace/workspace";
|
|
@@ -68,10 +69,14 @@ import { openMenu } from "../surfaces/menu";
|
|
|
68
69
|
import { emptyPaneContextView, mountPaneContextSurface } from "../surfaces/pane-context";
|
|
69
70
|
import { PANE_SELECTOR } from "../surfaces/pane-grid";
|
|
70
71
|
import { diffShowsCode } from "../canvas/diff-view";
|
|
72
|
+
import { backTargetOf, goBack } from "../workspace/workspace-back";
|
|
73
|
+
import type { WorkspaceId } from "../workspace/workspace-ids";
|
|
71
74
|
import { canRenderComparison } from "./git-diff-open";
|
|
72
75
|
import { shell } from "../shell";
|
|
73
76
|
import { paneRegion } from "../ui/regions";
|
|
77
|
+
import { isNumber, isString } from "@jxsuite/schema/guards";
|
|
74
78
|
import {
|
|
79
|
+
CANVAS_VIEWS,
|
|
75
80
|
fitToScreen,
|
|
76
81
|
getFit,
|
|
77
82
|
resetZoom,
|
|
@@ -87,7 +92,12 @@ import {
|
|
|
87
92
|
import { editorKindOf, editorKindsOf, modeForEditorKind } from "../tabs/tab";
|
|
88
93
|
import { collabState } from "../collab/collab-state";
|
|
89
94
|
import { activeRegistry } from "../commands/active-registry";
|
|
90
|
-
import {
|
|
95
|
+
import {
|
|
96
|
+
getEffectiveLayoutPath,
|
|
97
|
+
getEffectiveLocales,
|
|
98
|
+
getEffectiveMedia,
|
|
99
|
+
getEffectiveRenderLocale,
|
|
100
|
+
} from "../site-context";
|
|
91
101
|
import { localeLabel, localeOfPath } from "@jxsuite/schema/locale";
|
|
92
102
|
import { isSchemeQuery } from "../utils/canvas-media";
|
|
93
103
|
import { dynamicRouteParams, loadParamValues, pagePathsDef } from "../page-params";
|
|
@@ -95,8 +105,8 @@ import { componentPropEntries, isComponentDoc } from "../component-props";
|
|
|
95
105
|
import { mediaDisplayName } from "./shared";
|
|
96
106
|
import type { CanvasView, FitMode } from "../canvas/canvas-utils";
|
|
97
107
|
import { EDITOR_KIND_LABELS } from "../commands/context";
|
|
98
|
-
import type { EditorKind } from "../commands/context";
|
|
99
108
|
import type { ParamValues } from "../page-params";
|
|
109
|
+
import type { CommandArgValues } from "../commands/command-args";
|
|
100
110
|
import type { Tab } from "../tabs/tab";
|
|
101
111
|
import type { ResolvedI18n } from "@jxsuite/schema/locale";
|
|
102
112
|
import type { JsonValue } from "../types";
|
|
@@ -141,6 +151,14 @@ export interface PaneContextCtx {
|
|
|
141
151
|
* Editor picker a control over the primary's document.
|
|
142
152
|
*/
|
|
143
153
|
setCanvasMode: (tab: Tab, mode: string) => void;
|
|
154
|
+
/**
|
|
155
|
+
* Close a tab through the strip's guarded close (`panels/tab-strip.ts` `requestClose`): what the
|
|
156
|
+
* Back control does to a media viewer or a comparison. Absent (a test's partial bootstrap), the
|
|
157
|
+
* control runs `pane.backToHome` instead, whose bootstrap deps carry the same close.
|
|
158
|
+
*/
|
|
159
|
+
closeTab?: (tabId: string) => void | Promise<void>;
|
|
160
|
+
/** Give the keyboard to the home a Back landed on (`WorkspaceBackDeps.focusHome`). */
|
|
161
|
+
focusHome?: (paneId: string, id: WorkspaceId) => void;
|
|
144
162
|
parseMediaEntries: (media: Record<string, string> | null | undefined) => {
|
|
145
163
|
sizeBreakpoints: {
|
|
146
164
|
name: string;
|
|
@@ -217,10 +235,51 @@ export function attachPaneChromeHost(paneId: string, host: HTMLElement | null):
|
|
|
217
235
|
|
|
218
236
|
/** Take one pane's document down and forget it. Idempotent. */
|
|
219
237
|
function disposePane(paneId: string): void {
|
|
238
|
+
_bandWatches.get(paneId)?.observer.disconnect();
|
|
239
|
+
_bandWatches.delete(paneId);
|
|
220
240
|
_surfaces.get(paneId)?.dispose();
|
|
221
241
|
_surfaces.delete(paneId);
|
|
222
242
|
}
|
|
223
243
|
|
|
244
|
+
/**
|
|
245
|
+
* Each pane's band, as the observer that keeps the stage offset in step with it watches it.
|
|
246
|
+
*
|
|
247
|
+
* The offset used to be MEASURED on every projection, synchronously, right after the update that
|
|
248
|
+
* may have changed the band. A projection runs inside whatever changed the pane (a tab activation,
|
|
249
|
+
* a workspace switch, a mode change) with the rest of that change still to be written, so the read
|
|
250
|
+
* paid a style recalculation of the whole half-written document every time: 12 to 18 ms per tab
|
|
251
|
+
* activation in the perf trace, the hottest forced recalculation once the tab strip stopped
|
|
252
|
+
* reading. A `ResizeObserver` reports the band's height after the frame's own layout, when it is
|
|
253
|
+
* free to read, and only when it actually changed.
|
|
254
|
+
*/
|
|
255
|
+
const _bandWatches = new Map<string, { band: HTMLElement; observer: ResizeObserver }>();
|
|
256
|
+
|
|
257
|
+
/**
|
|
258
|
+
* Keep `paneId`'s stage offset following its band: measure it once now, and again whenever it
|
|
259
|
+
* resizes. Re-binds when the document has drawn a new band element; a no-op for the one it holds.
|
|
260
|
+
* Without `ResizeObserver` (a DOM with no layout engine) every call measures, as before.
|
|
261
|
+
*/
|
|
262
|
+
function watchBand(paneId: string, host: HTMLElement, surface: PaneContextSurfaceHandle): void {
|
|
263
|
+
const band = surface.band();
|
|
264
|
+
const held = _bandWatches.get(paneId);
|
|
265
|
+
if (held && held.band === band) {
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
held?.observer.disconnect();
|
|
269
|
+
_bandWatches.delete(paneId);
|
|
270
|
+
applyPaneContextOffset(topBandHeight(surface), host);
|
|
271
|
+
if (!band || typeof ResizeObserver === "undefined") {
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
const observer = new ResizeObserver(() => {
|
|
275
|
+
if (_surfaces.get(paneId) === surface) {
|
|
276
|
+
applyPaneContextOffset(topBandHeight(surface), host);
|
|
277
|
+
}
|
|
278
|
+
});
|
|
279
|
+
observer.observe(band);
|
|
280
|
+
_bandWatches.set(paneId, { band, observer });
|
|
281
|
+
}
|
|
282
|
+
|
|
224
283
|
/**
|
|
225
284
|
* Mount the pane chrome. Idempotent.
|
|
226
285
|
*
|
|
@@ -257,7 +316,7 @@ export function mount(host: HTMLElement, ctx: PaneContextCtx) {
|
|
|
257
316
|
}
|
|
258
317
|
// Read reactive properties to establish tracking — mirrors the toolbar's subset.
|
|
259
318
|
void tab.doc.document;
|
|
260
|
-
void tab.doc.document
|
|
319
|
+
void tab.doc.document.$layout;
|
|
261
320
|
void tab.doc.mode;
|
|
262
321
|
void tab.documentPath;
|
|
263
322
|
void tab.capabilities.modes;
|
|
@@ -331,21 +390,6 @@ function topBandHeight(surface: PaneContextSurfaceHandle): number {
|
|
|
331
390
|
return Math.max(surface.band()?.offsetHeight ?? 0, PANE_CONTEXT_HEIGHT);
|
|
332
391
|
}
|
|
333
392
|
|
|
334
|
-
/**
|
|
335
|
-
* Whether this tab's editor has any of the bar's three axes to offer.
|
|
336
|
-
*
|
|
337
|
-
* Project Settings has none: it declares one editor kind, no canvas view, and no rendering context
|
|
338
|
-
* — and the one control the bar WOULD contribute, "Manage contexts…", routes to a section of the
|
|
339
|
-
* very document on screen. A bar of three inert controls above the definition site they point at is
|
|
340
|
-
* chrome that says nothing, so the stage takes the whole pane.
|
|
341
|
-
*
|
|
342
|
-
* @param {Tab} tab
|
|
343
|
-
* @returns {boolean}
|
|
344
|
-
*/
|
|
345
|
-
function wantsContextBar(tab: Tab): boolean {
|
|
346
|
-
return tab.session.ui.canvasMode !== "settings";
|
|
347
|
-
}
|
|
348
|
-
|
|
349
393
|
/** Project every attached pane's chrome. */
|
|
350
394
|
export function render() {
|
|
351
395
|
for (const [paneId, host] of _hosts) {
|
|
@@ -360,13 +404,12 @@ function renderPane(paneId: string, host: HTMLElement) {
|
|
|
360
404
|
}
|
|
361
405
|
try {
|
|
362
406
|
const tab = tabOfPane(paneId);
|
|
363
|
-
|
|
364
|
-
if (!show) {
|
|
407
|
+
if (tab === null) {
|
|
365
408
|
disposePane(paneId);
|
|
366
409
|
applyPaneContextOffset(0, host);
|
|
367
410
|
return;
|
|
368
411
|
}
|
|
369
|
-
const view = viewFor(tab
|
|
412
|
+
const view = viewFor(tab, paneId, _ctx);
|
|
370
413
|
let surface = _surfaces.get(paneId);
|
|
371
414
|
if (!surface || !surface.connected()) {
|
|
372
415
|
disposePane(paneId);
|
|
@@ -380,13 +423,15 @@ function renderPane(paneId: string, host: HTMLElement) {
|
|
|
380
423
|
void surface.ready.then(() => {
|
|
381
424
|
const live = _surfaces.get(paneId);
|
|
382
425
|
if (live) {
|
|
383
|
-
|
|
426
|
+
watchBand(paneId, host, live);
|
|
384
427
|
}
|
|
385
428
|
});
|
|
386
429
|
return;
|
|
387
430
|
}
|
|
388
431
|
surface.update(view);
|
|
389
|
-
|
|
432
|
+
/* No read here: the band's observer writes the offset once the frame has laid the band out
|
|
433
|
+
({@link watchBand}). Only a band element the update REPLACED is re-measured now. */
|
|
434
|
+
watchBand(paneId, host, surface);
|
|
390
435
|
} catch (error) {
|
|
391
436
|
console.error("pane-context render error:", error);
|
|
392
437
|
}
|
|
@@ -458,12 +503,11 @@ function openPresetMenu(paneId: string, anchor: HTMLElement): void {
|
|
|
458
503
|
* `check-lens-mutants.ts` said so, by surviving.
|
|
459
504
|
*/
|
|
460
505
|
function menuRow(row: PresetRow): MenuRowProjection {
|
|
461
|
-
|
|
506
|
+
const projection: MenuRowProjection = {
|
|
462
507
|
destructive: false,
|
|
463
508
|
disabled: row.disabled !== null,
|
|
464
509
|
dividerAbove: false,
|
|
465
510
|
id: rowId(row),
|
|
466
|
-
...(row.disabled === null ? {} : { requires: row.disabled }),
|
|
467
511
|
run: () => {
|
|
468
512
|
/* THE PANE THE MENU IS ABOUT, before the verb that resolves the focus runs.
|
|
469
513
|
See {@link PresetRow.pane}: all three of these commands take the focused pane as their
|
|
@@ -476,6 +520,10 @@ function menuRow(row: PresetRow): MenuRowProjection {
|
|
|
476
520
|
},
|
|
477
521
|
title: row.label,
|
|
478
522
|
};
|
|
523
|
+
if (row.disabled !== null) {
|
|
524
|
+
projection.requires = row.disabled;
|
|
525
|
+
}
|
|
526
|
+
return projection;
|
|
479
527
|
}
|
|
480
528
|
|
|
481
529
|
/**
|
|
@@ -487,7 +535,7 @@ function rowId(row: PresetRow): string {
|
|
|
487
535
|
const parts = [row.command];
|
|
488
536
|
for (const key of ["preset", "media", "locale"] as const) {
|
|
489
537
|
const value = row.args[key];
|
|
490
|
-
if (
|
|
538
|
+
if (isString(value)) {
|
|
491
539
|
parts.push(value);
|
|
492
540
|
}
|
|
493
541
|
}
|
|
@@ -498,7 +546,7 @@ function rowId(row: PresetRow): string {
|
|
|
498
546
|
export interface PresetRow {
|
|
499
547
|
label: string;
|
|
500
548
|
command: string;
|
|
501
|
-
args:
|
|
549
|
+
args: CommandArgValues;
|
|
502
550
|
/**
|
|
503
551
|
* The pane this row is ABOUT — the one whose ⟲ opened the menu.
|
|
504
552
|
*
|
|
@@ -658,10 +706,27 @@ function viewFor(tab: Tab, paneId: string, ctx: PaneContextCtx): PaneContextView
|
|
|
658
706
|
view.summary = lensSummary(paneId);
|
|
659
707
|
return view;
|
|
660
708
|
}
|
|
709
|
+
/* The way out of a view in a workspace with no tab strip: named for where it leads. Never in a
|
|
710
|
+
lens, whose tab is the source pane's, and whose own exit is the derivation's. */
|
|
711
|
+
const back = backTargetOf(tab);
|
|
712
|
+
if (back) {
|
|
713
|
+
view.backState = "shown";
|
|
714
|
+
view.backLabel = back.label;
|
|
715
|
+
view.backHint = back.hint;
|
|
716
|
+
}
|
|
661
717
|
Object.assign(view, editorAxis(tab));
|
|
662
718
|
if (editorKindOf(tab) === "canvas") {
|
|
663
719
|
Object.assign(view, viewAxis(tab));
|
|
664
720
|
}
|
|
721
|
+
/* A workspace home (the Content, Media or Publish home) draws its workspace's own surface over a
|
|
722
|
+
stub document, so there is no rendering context to choose: "Context: Base" over the Publish
|
|
723
|
+
workspace was a control that could change nothing on screen. The ⟲ menu goes for the same
|
|
724
|
+
reason: every projection it offers is of the document, and a home has none to project. */
|
|
725
|
+
if (editorKindOf(tab) === "home") {
|
|
726
|
+
view.contextState = "hidden";
|
|
727
|
+
view.presetState = "hidden";
|
|
728
|
+
return view;
|
|
729
|
+
}
|
|
665
730
|
Object.assign(view, contextAxis(tab, paneId, ctx));
|
|
666
731
|
/* THIS tab's effective mode. `ctx.getCanvasMode()` answered for the focused pane, so a document
|
|
667
732
|
opened as Code in either pane put an Export button in the OTHER pane's bar as well — over a
|
|
@@ -805,10 +870,8 @@ interface PaneLocale {
|
|
|
805
870
|
* A single declared locale is the same as none for this control — there is nothing to switch TO,
|
|
806
871
|
* and "groups a document declares nothing for are absent" is the rule the whole popover follows.
|
|
807
872
|
*
|
|
808
|
-
* The
|
|
809
|
-
*
|
|
810
|
-
* (`site-architecture.md` §13.3 puts a translation in its own directory), and the default locale is
|
|
811
|
-
* what an unprefixed page renders as.
|
|
873
|
+
* The language itself is `getEffectiveRenderLocale`'s answer (`site-context.ts`), the rule every
|
|
874
|
+
* artboard draws by: the choice, else the file's own language, else the default locale.
|
|
812
875
|
*/
|
|
813
876
|
function localeOf(tab: Tab | null): PaneLocale | null {
|
|
814
877
|
const i18n = getEffectiveLocales();
|
|
@@ -816,20 +879,22 @@ function localeOf(tab: Tab | null): PaneLocale | null {
|
|
|
816
879
|
return null;
|
|
817
880
|
}
|
|
818
881
|
const pathLocale = localeOfPath(tab.documentPath ?? "", i18n);
|
|
819
|
-
|
|
820
|
-
|
|
882
|
+
/* The artboard's own rule, so the segment and the canvas cannot name two languages; a stored
|
|
883
|
+
choice the project no longer declares is not reported, because it is not drawn. */
|
|
884
|
+
const own = getEffectiveRenderLocale(null, tab.documentPath) ?? i18n.defaultLocale;
|
|
885
|
+
const effective = getEffectiveRenderLocale(tab.session.ui.previewLocale, tab.documentPath) ?? own;
|
|
821
886
|
return { effective, i18n, overridden: effective !== own, pathLocale };
|
|
822
887
|
}
|
|
823
888
|
|
|
824
889
|
function contextAxis(tab: Tab, paneId: string, ctx: PaneContextCtx): Partial<PaneContextView> {
|
|
825
890
|
const { ui } = tab.session;
|
|
826
891
|
const { featureQueries, sizeBreakpoints } = ctx.parseMediaEntries(
|
|
827
|
-
getEffectiveMedia(tab.doc.document
|
|
892
|
+
getEffectiveMedia(tab.doc.document.$media),
|
|
828
893
|
);
|
|
829
894
|
const schemeQueries = featureQueries.filter(({ query }) => isSchemeQuery(query));
|
|
830
895
|
const plainQueries = featureQueries.filter(({ query }) => !isSchemeQuery(query));
|
|
831
|
-
const scheme =
|
|
832
|
-
const activeMedia =
|
|
896
|
+
const scheme = ui.previewColorScheme;
|
|
897
|
+
const { activeMedia } = ui;
|
|
833
898
|
const sizeLabel = activeMedia ? mediaDisplayName(activeMedia) : "Base";
|
|
834
899
|
const schemeLabel = SCHEMES.find(([value]) => value === scheme)?.[1] ?? "Auto";
|
|
835
900
|
const locale = localeOf(tab);
|
|
@@ -843,7 +908,12 @@ function contextAxis(tab: Tab, paneId: string, ctx: PaneContextCtx): Partial<Pan
|
|
|
843
908
|
]
|
|
844
909
|
.filter((part) => part !== null)
|
|
845
910
|
.join(" · ");
|
|
846
|
-
|
|
911
|
+
/* An entry written on the canvas is wrapped in its template's layout like a page (§22.5), so it
|
|
912
|
+
offers the same "show layout" choice. Whether a layout resolves for it is read asynchronously
|
|
913
|
+
by the canvas; the project default is the answer this bar can give synchronously. */
|
|
914
|
+
const hasLayout =
|
|
915
|
+
(isPageDoc(tab) && Boolean(getEffectiveLayoutPath(tab.doc.document.$layout))) ||
|
|
916
|
+
(Boolean(projectState?.isSiteProject) && writesEntryOnCanvas(tab.documentPath));
|
|
847
917
|
const page = isPageDoc(tab);
|
|
848
918
|
const params = page ? paramRows(tab) : [];
|
|
849
919
|
const props = page ? [] : propRows(tab, paneId);
|
|
@@ -851,7 +921,7 @@ function contextAxis(tab: Tab, paneId: string, ctx: PaneContextCtx): Partial<Pan
|
|
|
851
921
|
way the Context trigger says `Base · Auto` — a chevron with no reading is a control you have to
|
|
852
922
|
open in order to learn whether it was worth opening. */
|
|
853
923
|
const resolvingSet = page
|
|
854
|
-
? Object.values(ui.previewParams
|
|
924
|
+
? Object.values(ui.previewParams).filter((v) => v !== "").length
|
|
855
925
|
: Object.keys(ui.previewProps ?? {}).length;
|
|
856
926
|
const hasResolving = page ? params.length > 0 : props.length > 0;
|
|
857
927
|
|
|
@@ -922,8 +992,9 @@ function sizeRows(
|
|
|
922
992
|
* cannot and must not claim to translate the page. What it does change is real: the artboard's
|
|
923
993
|
* `lang` and its `dir`, and an RTL locale mirrors the layout on the stage. A control that let an
|
|
924
994
|
* author believe it had translated anything would be worse than no control — which is also why the
|
|
925
|
-
* sentence stops there: the
|
|
926
|
-
*
|
|
995
|
+
* sentence stops there: the page's `$page.locale` comes from its route on the canvas as in the
|
|
996
|
+
* build (studio.md §4.1), so this control does not change it, and a tooltip promising otherwise
|
|
997
|
+
* would describe something the pane does not do.
|
|
927
998
|
*
|
|
928
999
|
* Labelled with each locale's AUTONYM, for the reason `localeLabel` gives: a reader looking for
|
|
929
1000
|
* their own language scans for their own word for it.
|
|
@@ -965,7 +1036,7 @@ const FIT_CHOICES: readonly { value: string; fit: FitMode; label: string }[] = [
|
|
|
965
1036
|
|
|
966
1037
|
/** Which entry the pod shows as chosen — a numeric fit reads as "actual size" only at 1. */
|
|
967
1038
|
function fitChoiceValue(fit: FitMode): string {
|
|
968
|
-
if (
|
|
1039
|
+
if (isNumber(fit)) {
|
|
969
1040
|
return fit === 1 ? "actual" : "";
|
|
970
1041
|
}
|
|
971
1042
|
return fit;
|
|
@@ -1006,7 +1077,7 @@ function podFor(tab: Tab, paneId: string): Partial<PaneContextView> {
|
|
|
1006
1077
|
computed from the side pane's own zoom, and its "100%" button reset the primary. */
|
|
1007
1078
|
const surface = surfaceForPane(paneId);
|
|
1008
1079
|
if (mode === "edit") {
|
|
1009
|
-
const editZoom = tab.session.ui
|
|
1080
|
+
const { editZoom } = tab.session.ui;
|
|
1010
1081
|
return { podState: "shown", zoomLabel: `${Math.round(editZoom * 100)}%` };
|
|
1011
1082
|
}
|
|
1012
1083
|
if (!STAGE_ZOOM_MODES.has(mode)) {
|
|
@@ -1041,7 +1112,7 @@ function podFor(tab: Tab, paneId: string): Partial<PaneContextView> {
|
|
|
1041
1112
|
* `__jxAutomation` had no name for it. Going through the registry makes the control and the verb
|
|
1042
1113
|
* one thing (one definition site per action, §13) and gets the breakpoint refusal for free.
|
|
1043
1114
|
*/
|
|
1044
|
-
function runContextCommand(paneId: string, id: string, args:
|
|
1115
|
+
function runContextCommand(paneId: string, id: string, args: CommandArgValues): void {
|
|
1045
1116
|
// THIS pane, named. The bar is drawn once per pane and the side bar's controls write the side
|
|
1046
1117
|
// Pane's tab; a verb defaulting to the focused pane would have made the side bar edit the
|
|
1047
1118
|
// Foreground document the moment its control became a command.
|
|
@@ -1063,7 +1134,8 @@ function actionsFor(paneId: string, ctx: PaneContextCtx): PaneContextActions {
|
|
|
1063
1134
|
if (!tab) {
|
|
1064
1135
|
return;
|
|
1065
1136
|
}
|
|
1066
|
-
const
|
|
1137
|
+
const editorKind = editorKindsOf(tab).find((candidate) => candidate === kind);
|
|
1138
|
+
const mode = editorKind && modeForEditorKind(tab, editorKind);
|
|
1067
1139
|
if (!mode) {
|
|
1068
1140
|
return;
|
|
1069
1141
|
}
|
|
@@ -1086,11 +1158,28 @@ function actionsFor(paneId: string, ctx: PaneContextCtx): PaneContextActions {
|
|
|
1086
1158
|
},
|
|
1087
1159
|
chooseView: (value) => {
|
|
1088
1160
|
const tab = tabNow();
|
|
1089
|
-
|
|
1090
|
-
|
|
1161
|
+
const view = CANVAS_VIEWS.find((candidate) => candidate === value);
|
|
1162
|
+
if (tab && view) {
|
|
1163
|
+
setCanvasView(tab, view, ctx.setCanvasMode);
|
|
1091
1164
|
}
|
|
1092
1165
|
},
|
|
1093
1166
|
exportFile: ctx.exportFile,
|
|
1167
|
+
/* The flow directly rather than `pane.backToHome`: the command's `when` keeps Escape away from
|
|
1168
|
+
a text field and the code editor, and the CONTROL must work in both (Back from Code is the
|
|
1169
|
+
Styles case). The pane is focused first, because the view going back is this pane's. */
|
|
1170
|
+
goBack: () => {
|
|
1171
|
+
focusPane(paneId);
|
|
1172
|
+
const { closeTab } = ctx;
|
|
1173
|
+
if (!closeTab) {
|
|
1174
|
+
runContextCommand(paneId, "pane.backToHome", {});
|
|
1175
|
+
return;
|
|
1176
|
+
}
|
|
1177
|
+
void goBack(paneId, {
|
|
1178
|
+
closeTab,
|
|
1179
|
+
setCanvasMode: ctx.setCanvasMode,
|
|
1180
|
+
...(ctx.focusHome && { focusHome: ctx.focusHome }),
|
|
1181
|
+
});
|
|
1182
|
+
},
|
|
1094
1183
|
manageContexts: () => {
|
|
1095
1184
|
void activeRegistry()?.run("settings.open", { section: "contexts" });
|
|
1096
1185
|
},
|
|
@@ -1285,7 +1374,7 @@ function paramValuesFor(tab: Tab): ParamValues | null {
|
|
|
1285
1374
|
* @param {ParamValues} values
|
|
1286
1375
|
*/
|
|
1287
1376
|
function autoSelectParams(tab: Tab, values: ParamValues) {
|
|
1288
|
-
const current = tab.session.ui.previewParams
|
|
1377
|
+
const current = tab.session.ui.previewParams;
|
|
1289
1378
|
const additions: Record<string, string> = {};
|
|
1290
1379
|
for (const [name, list] of Object.entries(values)) {
|
|
1291
1380
|
if (!current[name] && list.length > 0) {
|
|
@@ -1314,7 +1403,7 @@ function paramRows(tab: Tab): PaneContextView["params"] {
|
|
|
1314
1403
|
label: `Preview value for [${name}]`,
|
|
1315
1404
|
name,
|
|
1316
1405
|
options: (values?.[name] ?? []).map((value: string) => ({ label: value, value })),
|
|
1317
|
-
value: previewParams
|
|
1406
|
+
value: previewParams[name] ?? "",
|
|
1318
1407
|
}));
|
|
1319
1408
|
}
|
|
1320
1409
|
|
|
@@ -1330,6 +1419,8 @@ function paramRows(tab: Tab): PaneContextView["params"] {
|
|
|
1330
1419
|
*/
|
|
1331
1420
|
function parsePropValue(raw: string): JsonValue {
|
|
1332
1421
|
try {
|
|
1422
|
+
// SAFETY: JSON.parse only ever yields null, a boolean, a number, a string, an array or a plain
|
|
1423
|
+
// Object of those, which is exactly the JsonValue union.
|
|
1333
1424
|
return JSON.parse(raw) as JsonValue;
|
|
1334
1425
|
} catch {
|
|
1335
1426
|
return raw;
|
|
@@ -1347,7 +1438,7 @@ function propRows(tab: Tab, paneId: string): PaneContextView["props"] {
|
|
|
1347
1438
|
}
|
|
1348
1439
|
const { previewProps } = tab.session.ui;
|
|
1349
1440
|
const display = (v: JsonValue | undefined) =>
|
|
1350
|
-
v === undefined ? "" :
|
|
1441
|
+
v === undefined ? "" : isString(v) ? v : JSON.stringify(v);
|
|
1351
1442
|
return componentPropEntries(doc).map(({ name }) => ({
|
|
1352
1443
|
key: name,
|
|
1353
1444
|
label: `Test value for ${name}`,
|
package/src/panels/pane-grid.ts
CHANGED
|
@@ -62,6 +62,7 @@ import {
|
|
|
62
62
|
dropTargetForElements,
|
|
63
63
|
monitorForElements,
|
|
64
64
|
} from "@atlaskit/pragmatic-drag-and-drop/element/adapter";
|
|
65
|
+
import { isString } from "@jxsuite/schema/guards";
|
|
65
66
|
import { isTabDropSource } from "./tab-drop";
|
|
66
67
|
import { rectOf } from "../utils/geometry";
|
|
67
68
|
import {
|
|
@@ -100,8 +101,22 @@ export interface PaneCell {
|
|
|
100
101
|
surface: CanvasSurface;
|
|
101
102
|
}
|
|
102
103
|
|
|
103
|
-
/**
|
|
104
|
-
|
|
104
|
+
/**
|
|
105
|
+
* A cell's record while the runtime fills it in, plus the disposers its stage gestures and its drop
|
|
106
|
+
* zone live behind.
|
|
107
|
+
*
|
|
108
|
+
* Every element field starts null and is written once, when the runtime creates that box (see
|
|
109
|
+
* {@link cellPart}). The runtime creates a row's nodes depth-first inside one synchronous render
|
|
110
|
+
* pass, so by the time anything outside that pass asks, {@link isDrawnCell} holds.
|
|
111
|
+
*/
|
|
112
|
+
interface CellState {
|
|
113
|
+
paneId: string;
|
|
114
|
+
root: HTMLElement | null;
|
|
115
|
+
strip: HTMLElement | null;
|
|
116
|
+
chrome: HTMLElement | null;
|
|
117
|
+
stage: HTMLElement | null;
|
|
118
|
+
dropZone: HTMLElement | null;
|
|
119
|
+
surface: CanvasSurface | null;
|
|
105
120
|
/** Stage-gesture disposer, live between the stage's creation and the cell's disposal. */
|
|
106
121
|
releaseGestures: (() => void) | null;
|
|
107
122
|
/** The drop zone's pragmatic registration, live between its creation and the cell's disposal. */
|
|
@@ -128,9 +143,22 @@ let _scope: EffectScope | null = null;
|
|
|
128
143
|
*/
|
|
129
144
|
let _dragMonitor: (() => void) | null = null;
|
|
130
145
|
|
|
146
|
+
/** Whether every box of a cell has been created, which is what makes it a {@link PaneCell}. */
|
|
147
|
+
function isDrawnCell(cell: CellState): cell is CellState & PaneCell {
|
|
148
|
+
return (
|
|
149
|
+
cell.root !== null &&
|
|
150
|
+
cell.strip !== null &&
|
|
151
|
+
cell.chrome !== null &&
|
|
152
|
+
cell.stage !== null &&
|
|
153
|
+
cell.dropZone !== null &&
|
|
154
|
+
cell.surface !== null
|
|
155
|
+
);
|
|
156
|
+
}
|
|
157
|
+
|
|
131
158
|
/** The cell a pane is drawn in, or null. Test-visible, and the bootstrap's handle on the primary. */
|
|
132
159
|
export function cellForPane(paneId: string): PaneCell | null {
|
|
133
|
-
|
|
160
|
+
const cell = _cells.get(paneId);
|
|
161
|
+
return cell !== undefined && isDrawnCell(cell) ? cell : null;
|
|
134
162
|
}
|
|
135
163
|
|
|
136
164
|
/**
|
|
@@ -149,9 +177,9 @@ export function paneGridReady(): Promise<void> {
|
|
|
149
177
|
* The record for a pane, created when its cell's outermost box is, and reused for the life of the
|
|
150
178
|
* cell.
|
|
151
179
|
*
|
|
152
|
-
* Every element field
|
|
153
|
-
*
|
|
154
|
-
*
|
|
180
|
+
* Every element field starts null: the runtime creates a row's nodes depth-first inside one
|
|
181
|
+
* synchronous render pass, so the record is complete before anything outside that pass can hold it
|
|
182
|
+
* through {@link cellForPane}.
|
|
155
183
|
*/
|
|
156
184
|
function cellState(paneId: string): CellState {
|
|
157
185
|
const existing = _cells.get(paneId);
|
|
@@ -159,15 +187,15 @@ function cellState(paneId: string): CellState {
|
|
|
159
187
|
return existing;
|
|
160
188
|
}
|
|
161
189
|
const cell: CellState = {
|
|
162
|
-
chrome: null
|
|
163
|
-
dropZone: null
|
|
190
|
+
chrome: null,
|
|
191
|
+
dropZone: null,
|
|
164
192
|
paneId,
|
|
165
193
|
releaseDropZone: null,
|
|
166
194
|
releaseGestures: null,
|
|
167
|
-
root: null
|
|
168
|
-
stage: null
|
|
169
|
-
strip: null
|
|
170
|
-
surface: null
|
|
195
|
+
root: null,
|
|
196
|
+
stage: null,
|
|
197
|
+
strip: null,
|
|
198
|
+
surface: null,
|
|
171
199
|
};
|
|
172
200
|
_cells.set(paneId, cell);
|
|
173
201
|
return cell;
|
|
@@ -229,12 +257,16 @@ function watchPaneFocus(paneId: string, root: HTMLElement): void {
|
|
|
229
257
|
*/
|
|
230
258
|
function attachStage(cell: CellState, stage: HTMLElement): void {
|
|
231
259
|
cell.stage = stage;
|
|
232
|
-
|
|
260
|
+
const surface = createPaneSurface(cell.paneId);
|
|
261
|
+
cell.surface = surface;
|
|
233
262
|
registerCanvasSurface(cell.paneId, stage);
|
|
234
|
-
cell.releaseGestures = installStageGestures(
|
|
263
|
+
cell.releaseGestures = installStageGestures(surface);
|
|
235
264
|
scheduleCanvasRender(cell.paneId);
|
|
236
265
|
}
|
|
237
266
|
|
|
267
|
+
/** What a cell's drop zone reports to a drag: refused, or the pane a drop would split beside. */
|
|
268
|
+
type PaneEdgeData = { type: "pane-edge-refused" } | { paneId: string; type: "pane-edge" };
|
|
269
|
+
|
|
238
270
|
/**
|
|
239
271
|
* The RIGHT BAND of `paneId`'s cell, and only while it is legal to drop there: the grid is still
|
|
240
272
|
* under {@link MAX_PANES}, and `paneId` names the LAST pane — the one a second pane would sit
|
|
@@ -245,11 +277,7 @@ function attachStage(cell: CellState, stage: HTMLElement): void {
|
|
|
245
277
|
* that the rest of the stage keeps ordinary canvas gestures — a drag never reaches this at all
|
|
246
278
|
* unless `canDrop` already accepted it, so the band only ever competes with itself.
|
|
247
279
|
*/
|
|
248
|
-
function edgeData(
|
|
249
|
-
paneId: string,
|
|
250
|
-
input: { clientX: number },
|
|
251
|
-
element: HTMLElement,
|
|
252
|
-
): Record<string, unknown> {
|
|
280
|
+
function edgeData(paneId: string, input: { clientX: number }, element: HTMLElement): PaneEdgeData {
|
|
253
281
|
if (workspace.panes.length >= MAX_PANES || workspace.panes.at(-1)?.id !== paneId) {
|
|
254
282
|
return { type: "pane-edge-refused" };
|
|
255
283
|
}
|
|
@@ -284,12 +312,12 @@ function attachDropZone(paneId: string, element: HTMLElement): () => void {
|
|
|
284
312
|
* One of a cell's five boxes has been created. Fill the record in, and wire what belongs to it.
|
|
285
313
|
*
|
|
286
314
|
* The context bar is HANDED its host rather than resolving a region, the same way
|
|
287
|
-
* `
|
|
288
|
-
* does: the strip's host carries `pane.<id>/tabs` and nothing inside it re-stamps that
|
|
289
|
-
* the context bar stamps `pane.<id>/context` on markup it renders INSIDE its box — so a
|
|
290
|
-
* the wrapper as well would put the same id on two nested elements, and `resolveRegion`
|
|
291
|
-
* LAST match. Sixty shots crop `pane.primary/context`; a second, larger element carrying
|
|
292
|
-
* silently widened crop.
|
|
315
|
+
* `content/writing-banner.ts` is handed its host on the stage. It cannot resolve one the way the
|
|
316
|
+
* tab strip does: the strip's host carries `pane.<id>/tabs` and nothing inside it re-stamps that
|
|
317
|
+
* id, while the context bar stamps `pane.<id>/context` on markup it renders INSIDE its box — so a
|
|
318
|
+
* region on the wrapper as well would put the same id on two nested elements, and `resolveRegion`
|
|
319
|
+
* takes the LAST match. Sixty shots crop `pane.primary/context`; a second, larger element carrying
|
|
320
|
+
* it is a silently widened crop.
|
|
293
321
|
*/
|
|
294
322
|
function cellPart(paneId: string, part: PaneCellPart, element: HTMLElement): void {
|
|
295
323
|
const cell = cellState(paneId);
|
|
@@ -467,7 +495,8 @@ export function mount(): void {
|
|
|
467
495
|
},
|
|
468
496
|
onDrag({ location }) {
|
|
469
497
|
const [target] = location.current.dropTargets;
|
|
470
|
-
const
|
|
498
|
+
const paneId = target?.data.paneId;
|
|
499
|
+
const edgePane = target?.data.type === "pane-edge" && isString(paneId) ? paneId : "";
|
|
471
500
|
_surface?.drag({ armed: true, edgePane });
|
|
472
501
|
},
|
|
473
502
|
onDragStart() {
|