@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
|
@@ -1,16 +1,20 @@
|
|
|
1
1
|
/// <reference lib="dom" />
|
|
2
2
|
/**
|
|
3
3
|
* Canvas render — extracted from studio.js (Phase 4o). Multi-mode canvas rendering orchestrator:
|
|
4
|
-
* dispatches to
|
|
4
|
+
* dispatches to source/edit/design/preview rendering paths.
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
import { render
|
|
7
|
+
import { render, nothing } from "lit-html";
|
|
8
8
|
import type * as monaco from "monaco-editor";
|
|
9
9
|
import type { WireDiffMarks } from "./iframe-protocol";
|
|
10
10
|
import type * as Y from "yjs";
|
|
11
11
|
import { loadedMonaco, loadMonaco, mountStillWanted } from "../services/monaco-lazy";
|
|
12
12
|
|
|
13
|
-
import { getNodeAtPath
|
|
13
|
+
import { getNodeAtPath } from "@jxsuite/schema/doc-ops";
|
|
14
|
+
import { isString } from "@jxsuite/schema/guards";
|
|
15
|
+
import { errorMessage } from "@jxsuite/schema/parse";
|
|
16
|
+
import { stageOf } from "./surface-registry";
|
|
17
|
+
import { updateCanvas } from "../store";
|
|
14
18
|
import { activeTab, tabIsLive, workspace } from "../workspace/workspace";
|
|
15
19
|
import {
|
|
16
20
|
activeMediaOfPane,
|
|
@@ -40,21 +44,25 @@ import { canRenderComparison } from "../panels/git-diff-open";
|
|
|
40
44
|
import { releaseStageScrollbar, trackStageScrollbar } from "./stage-scrollbar";
|
|
41
45
|
import { renderDiffToolbar, setDiffRepaint, setDiffToolbarHost } from "./diff-toolbar";
|
|
42
46
|
import { attachCursorStyles } from "../collab/monaco-cursors";
|
|
43
|
-
import type { AwarenessLike } from "../collab/monaco-cursors";
|
|
44
|
-
import type { BindingAwareness } from "../collab/monaco-binding";
|
|
45
47
|
import { monacoTheme, shell } from "../shell";
|
|
46
48
|
import { parseSourceForPath } from "../files/file-ops";
|
|
47
49
|
import { serializeDocument } from "../files/serialize-document";
|
|
48
50
|
import { parseJsonDocument, serializeJson } from "@jxsuite/schema/json-layout";
|
|
49
51
|
import { detachGridPanel, gridPanelMounted, renderGridMode } from "../grid/grid-panel";
|
|
50
|
-
import { detachLibraryPane, libraryPaneMounted, renderLibraryMode } from "../browse/library-pane";
|
|
51
52
|
import { detachEntryPane, entryPaneMounted, renderEntryMode } from "../content/entry-editor";
|
|
52
53
|
import { detachMediaPane, mediaPaneMounted, renderMediaMode } from "../media/media-pane";
|
|
53
54
|
import {
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
} from "../
|
|
55
|
+
detachVariablesView,
|
|
56
|
+
renderVariablesMode,
|
|
57
|
+
variablesViewMounted,
|
|
58
|
+
} from "../style/variables-view";
|
|
59
|
+
import { PROJECT_VARIABLES_VIEW } from "../style/project-styles";
|
|
60
|
+
import {
|
|
61
|
+
detachWorkspaceHome,
|
|
62
|
+
isWorkspaceHomeMode,
|
|
63
|
+
renderWorkspaceHome,
|
|
64
|
+
workspaceHomeMounted,
|
|
65
|
+
} from "../workspace/workspace-home";
|
|
58
66
|
import { formatByName, formatForPath } from "../format/format-host";
|
|
59
67
|
import {
|
|
60
68
|
BUFFER_COMMIT,
|
|
@@ -64,10 +72,16 @@ import {
|
|
|
64
72
|
commitBufferWrites,
|
|
65
73
|
} from "../services/monaco-buffer";
|
|
66
74
|
import { noteTyping } from "../tabs/typing";
|
|
75
|
+
import { normalizeDocument } from "../tabs/bare-repeaters";
|
|
67
76
|
import { diffModelUrisFor, modelUriFor, monacoLangForPath } from "../services/model-uri";
|
|
68
77
|
import { renderWelcome } from "../surfaces/welcome";
|
|
69
78
|
import { emptyState } from "../surfaces/empty-state";
|
|
70
|
-
import {
|
|
79
|
+
import {
|
|
80
|
+
attachWritingBanner,
|
|
81
|
+
detachWritingBanner,
|
|
82
|
+
renderWritingBanner,
|
|
83
|
+
} from "../content/writing-banner";
|
|
84
|
+
import { writesEntryOnCanvas } from "../content/content-collections";
|
|
71
85
|
import { mountCanvasStage } from "../surfaces/canvas-stage";
|
|
72
86
|
import type {
|
|
73
87
|
CanvasStageActions,
|
|
@@ -236,7 +250,7 @@ function hardClearCanvasWrap(canvasWrap: HTMLElement) {
|
|
|
236
250
|
* the two width handles apart: `data-side`, the one part the stage document draws twice).
|
|
237
251
|
*
|
|
238
252
|
* Per STAGE rather than per module, for the reason every other field on `CanvasSurface` is: two
|
|
239
|
-
* panes each have a Monaco host and a
|
|
253
|
+
* panes each have a Monaco host and a banner slot, and one slot would hand the second pane's stage
|
|
240
254
|
* the first pane's editor.
|
|
241
255
|
*/
|
|
242
256
|
const _stageHosts = new WeakMap<CanvasSurface, Map<string, HTMLElement>>();
|
|
@@ -280,8 +294,8 @@ function stageActions(surface: CanvasSurface): CanvasStageActions {
|
|
|
280
294
|
stageHosts(surface).set(detail ? `${part}:${detail}` : part, element);
|
|
281
295
|
if (part === "panzoom") {
|
|
282
296
|
surface.panzoomWrap = element;
|
|
283
|
-
} else if (part === "
|
|
284
|
-
|
|
297
|
+
} else if (part === "writing-banner") {
|
|
298
|
+
attachWritingBanner(surface.paneId, element);
|
|
285
299
|
} else if (part === "diff-toolbar") {
|
|
286
300
|
setDiffToolbarHost(surface.paneId, element);
|
|
287
301
|
}
|
|
@@ -317,10 +331,10 @@ function drawStage(
|
|
|
317
331
|
entries: CanvasPanelEntry[],
|
|
318
332
|
): Promise<CanvasStageHandle | null> {
|
|
319
333
|
_stageEntries.set(surface, entries);
|
|
320
|
-
/* There is no
|
|
321
|
-
releases it for EVERY mode that draws no
|
|
334
|
+
/* There is no banner-host release here, and there must not be one: `renderCanvasImpl` already
|
|
335
|
+
releases it for EVERY mode that draws no banner, one branch above this one. A second answer to
|
|
322
336
|
the same question is how the two drift — and this one would answer only for the frames that
|
|
323
|
-
reach a stage, leaving grid,
|
|
337
|
+
reach a stage, leaving grid, the homes, entry and media to the first. */
|
|
324
338
|
const standing = surface.stage;
|
|
325
339
|
const stage = standing ?? mountCanvasStage(surface.wrap, view, stageActions(surface));
|
|
326
340
|
surface.stage = stage;
|
|
@@ -362,9 +376,8 @@ function editorStageView(frame: "source" | "code"): CanvasStageView {
|
|
|
362
376
|
* Release this pane's stage document.
|
|
363
377
|
*
|
|
364
378
|
* Called on a real mode transition and on a full reset — the two moments the structure standing on
|
|
365
|
-
* the stage stops being the stage's. The
|
|
366
|
-
*
|
|
367
|
-
* never says so.
|
|
379
|
+
* the stage stops being the stage's. The host handed to another module goes WITH it: a Compare bar
|
|
380
|
+
* pointing at a detached node is a surface that draws into nothing and never says so.
|
|
368
381
|
*
|
|
369
382
|
* @param {CanvasSurface} surface
|
|
370
383
|
*/
|
|
@@ -376,7 +389,6 @@ function detachCanvasStage(surface: CanvasSurface): void {
|
|
|
376
389
|
surface.stage = null;
|
|
377
390
|
_stageHosts.delete(surface);
|
|
378
391
|
_stageEntries.delete(surface);
|
|
379
|
-
attachDocumentHeaderHost(surface.paneId, null);
|
|
380
392
|
setDiffToolbarHost(surface.paneId, null);
|
|
381
393
|
}
|
|
382
394
|
|
|
@@ -412,13 +424,15 @@ async function createSourceCollabBinding(
|
|
|
412
424
|
): Promise<() => void> {
|
|
413
425
|
const { bindMonacoToYText } = await import("../collab/monaco-binding");
|
|
414
426
|
const unbind = bindMonacoToYText({
|
|
415
|
-
awareness: ctx.awareness
|
|
427
|
+
awareness: ctx.awareness,
|
|
416
428
|
editors: [editor],
|
|
417
429
|
model,
|
|
418
430
|
origin: ctx.localOrigin,
|
|
431
|
+
/* SAFETY: collabSourceContext's `text` is `collab.sourceText(handle.doc)`, the session's shared
|
|
432
|
+
source Y.Text, attached to the handle's Y.Doc as the binding requires. */
|
|
419
433
|
text: ctx.text as Y.Text,
|
|
420
434
|
});
|
|
421
|
-
const detachStyles = attachCursorStyles(ctx.awareness
|
|
435
|
+
const detachStyles = attachCursorStyles(ctx.awareness, document);
|
|
422
436
|
return () => {
|
|
423
437
|
detachStyles();
|
|
424
438
|
unbind();
|
|
@@ -558,7 +572,7 @@ function sideMarks(
|
|
|
558
572
|
*/
|
|
559
573
|
async function mountDiffEditor(
|
|
560
574
|
surface: CanvasSurface,
|
|
561
|
-
container:
|
|
575
|
+
container: HTMLElement,
|
|
562
576
|
state: GitDiffState,
|
|
563
577
|
): Promise<void> {
|
|
564
578
|
const { paneId } = surface;
|
|
@@ -589,17 +603,20 @@ async function mountDiffEditor(
|
|
|
589
603
|
lang,
|
|
590
604
|
monaco.Uri.parse(uris.work),
|
|
591
605
|
);
|
|
592
|
-
const editor = monaco.editor.createDiffEditor(
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
606
|
+
const editor: NonNullable<CanvasSurface["monacoDiffEditor"]> = monaco.editor.createDiffEditor(
|
|
607
|
+
container,
|
|
608
|
+
{
|
|
609
|
+
automaticLayout: true,
|
|
610
|
+
fontFamily: "'JetBrains Mono', 'SF Mono', 'Fira Code', 'Consolas', monospace",
|
|
611
|
+
fontSize: 12,
|
|
612
|
+
minimap: { enabled: false },
|
|
613
|
+
originalEditable: false,
|
|
614
|
+
readOnly: true,
|
|
615
|
+
renderSideBySide: true,
|
|
616
|
+
scrollBeyondLastLine: false,
|
|
617
|
+
theme: monacoTheme(),
|
|
618
|
+
},
|
|
619
|
+
);
|
|
603
620
|
editor.setModel({ modified, original });
|
|
604
621
|
editor._diffKey = key;
|
|
605
622
|
surface.monacoDiffEditor = editor;
|
|
@@ -609,10 +626,11 @@ function resetCanvasView(surface: CanvasSurface) {
|
|
|
609
626
|
const canvasWrap = surface.wrap;
|
|
610
627
|
const { paneId } = surface;
|
|
611
628
|
detachGridPanel(paneId);
|
|
612
|
-
detachLibraryPane(paneId);
|
|
613
629
|
detachEntryPane(paneId);
|
|
630
|
+
detachWritingBanner(paneId);
|
|
614
631
|
detachMediaPane(paneId);
|
|
615
|
-
|
|
632
|
+
detachVariablesView(paneId);
|
|
633
|
+
detachWorkspaceHome(paneId);
|
|
616
634
|
disposeSourceCollab(surface);
|
|
617
635
|
disposeSourceEditor(surface);
|
|
618
636
|
disposeDiffEditor(surface);
|
|
@@ -663,7 +681,7 @@ function resetCanvasView(surface: CanvasSurface) {
|
|
|
663
681
|
async function mountSourceEditor(
|
|
664
682
|
tab: Tab,
|
|
665
683
|
surface: CanvasSurface,
|
|
666
|
-
editorContainer:
|
|
684
|
+
editorContainer: HTMLElement,
|
|
667
685
|
filePath: string,
|
|
668
686
|
lang: string,
|
|
669
687
|
): Promise<void> {
|
|
@@ -757,7 +775,7 @@ async function mountSourceEditor(
|
|
|
757
775
|
// Typed as the surface `view` declares (the editor plus `_ignoreNextChange` / `_writes`), because
|
|
758
776
|
// The instance is HELD here now rather than re-read off `view.monacoEditor` in every callback.
|
|
759
777
|
const sourceEditor: NonNullable<typeof surface.monacoEditor> = monaco.editor.create(
|
|
760
|
-
editorContainer
|
|
778
|
+
editorContainer,
|
|
761
779
|
{
|
|
762
780
|
automaticLayout: true,
|
|
763
781
|
fontFamily: "'JetBrains Mono', 'SF Mono', 'Fira Code', 'Consolas', monospace",
|
|
@@ -832,8 +850,10 @@ async function mountSourceEditor(
|
|
|
832
850
|
if (!tabIsLive(tab)) {
|
|
833
851
|
return;
|
|
834
852
|
}
|
|
835
|
-
tab.doc.document = document
|
|
853
|
+
tab.doc.document = document;
|
|
836
854
|
tab.doc.content.frontmatter = frontmatter;
|
|
855
|
+
// The buffer is the author's own spelling now, so it is what the next save keeps.
|
|
856
|
+
tab.doc.source = sourceEditor.getValue();
|
|
837
857
|
tab.doc.dirty = true;
|
|
838
858
|
writes.markSettled();
|
|
839
859
|
} catch {
|
|
@@ -845,7 +865,12 @@ async function mountSourceEditor(
|
|
|
845
865
|
// The buffer's text is the author's own layout now — the objects they opened up or
|
|
846
866
|
// Closed, the blank lines they left — so it is what the next save preserves.
|
|
847
867
|
const parsed = parseJsonDocument(sourceEditor.getValue());
|
|
848
|
-
tab
|
|
868
|
+
/* SAFETY: a JSON source tab holds a Jx document, whose schema makes the top-level object
|
|
869
|
+
parseJsonDocument returns a node; text that does not parse throws into the catch. */
|
|
870
|
+
const document = parsed.document as JxMutableNode;
|
|
871
|
+
// The member form every edit assumes, and the record of the bare repeaters the text wrote.
|
|
872
|
+
tab.doc.bareRepeaters = normalizeDocument(document);
|
|
873
|
+
tab.doc.document = document;
|
|
849
874
|
tab.doc.layout = parsed.layout;
|
|
850
875
|
tab.doc.dirty = true;
|
|
851
876
|
writes.markSettled();
|
|
@@ -930,7 +955,7 @@ function renderDerivationNotice(
|
|
|
930
955
|
surface.wrap.style.display = "block";
|
|
931
956
|
const registry = activeRegistry();
|
|
932
957
|
const pin = registry?.get("pane.pin");
|
|
933
|
-
|
|
958
|
+
render(
|
|
934
959
|
emptyState(surface.wrap, {
|
|
935
960
|
message,
|
|
936
961
|
...(held && { detail: `${tabLabel(held)} is still open here.` }),
|
|
@@ -954,7 +979,7 @@ function renderCanvasImpl(surface: CanvasSurface) {
|
|
|
954
979
|
/* Every read below is scoped to ONE pane. The stage, the panels it mounted and the mode it draws
|
|
955
980
|
are the surface's; the document is whatever tab that pane is showing, which is `activeTab` only
|
|
956
981
|
when the pane is the focused one. */
|
|
957
|
-
const canvasWrap = surface
|
|
982
|
+
const canvasWrap = stageOf(surface);
|
|
958
983
|
/* A pane with no stage renders nothing — it is not an error and it is not a fallback to some
|
|
959
984
|
other pane's stage. Two schedulers can name a stage-less pane: a frame queued for a pane that
|
|
960
985
|
lost the shell's single stage between the schedule and the rAF, and `escalateToFullRender` on
|
|
@@ -970,7 +995,6 @@ function renderCanvasImpl(surface: CanvasSurface) {
|
|
|
970
995
|
// No active tab — reset every piece of canvas view state so reopening a file can never inherit
|
|
971
996
|
// A stale Lit part, a dead Monaco editor, or a mismatched prevCanvasMode (the toxic states that
|
|
972
997
|
// Previously left the canvas unrenderable until a full reload).
|
|
973
|
-
attachDocumentHeaderHost(surface.paneId, null);
|
|
974
998
|
resetCanvasView(surface);
|
|
975
999
|
/* A DERIVED pane with nothing to draw explains itself. It is not the welcome screen and it is
|
|
976
1000
|
not a blank stage: it is a standing rule that has not resolved — "Select an element inside a
|
|
@@ -1000,7 +1024,6 @@ function renderCanvasImpl(surface: CanvasSurface) {
|
|
|
1000
1024
|
follow has run and a stage that blanked on that would flicker on every retarget. */
|
|
1001
1025
|
const staleDerivation = derivationOfPane(surface.paneId);
|
|
1002
1026
|
if (staleDerivation?.status === "unavailable" && staleDerivation.reason) {
|
|
1003
|
-
attachDocumentHeaderHost(surface.paneId, null);
|
|
1004
1027
|
resetCanvasView(surface);
|
|
1005
1028
|
/* …and for a COMPANION, what it is still holding. `tab` here is the pane's OWN document for a
|
|
1006
1029
|
companion and the SOURCE pane's for a lens — the hop `tabOfPane` takes — so the kind decides
|
|
@@ -1012,6 +1035,8 @@ function renderCanvasImpl(surface: CanvasSurface) {
|
|
|
1012
1035
|
);
|
|
1013
1036
|
return;
|
|
1014
1037
|
}
|
|
1038
|
+
/* SAFETY: `initCanvasRender` runs at studio boot (studio.ts), before the shell schedules the first
|
|
1039
|
+
pane render, and nothing resets `_ctx` afterwards. */
|
|
1015
1040
|
const ctx = _ctx as CanvasRenderCtx;
|
|
1016
1041
|
const S = {
|
|
1017
1042
|
document: tab.doc.document,
|
|
@@ -1024,28 +1049,19 @@ function renderCanvasImpl(surface: CanvasSurface) {
|
|
|
1024
1049
|
// Re-rendering the previous mode's panels in place.
|
|
1025
1050
|
const canvasMode = canvasModeOfPane(surface.paneId);
|
|
1026
1051
|
|
|
1027
|
-
/*
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
`hasDocumentHeader` is the other predicate, and it is a fact about the DOCUMENT. It used to
|
|
1035
|
-
carry two more clauses, suppressing the card while a function body or a formula was open on
|
|
1036
|
-
the grounds that those sub-editors took the whole stage. They open in the dock's Logic tab now
|
|
1037
|
-
(§16.3) and the page is still on screen behind it, so those clauses only DETACHED the visible
|
|
1038
|
-
card: it stopped re-rendering and quietly showed frontmatter from before the edit. */
|
|
1039
|
-
/* …and NOT in a lens. The Document Header is an editing surface — Title, Route, SEO, the raw
|
|
1040
|
-
frontmatter — over a document this pane does not own, and two cards editing one document's
|
|
1041
|
-
frontmatter side by side is two writers for one field. A lens is a view; the card belongs to
|
|
1042
|
-
the pane that owns the tab. */
|
|
1043
|
-
const wantsDocHeader =
|
|
1052
|
+
/* Edit draws the page and nothing above it (§4.2): a document's settings — title, URL, layout,
|
|
1053
|
+
frontmatter, description, Search appearance — are the Inspector's Page tab's (§6), in every
|
|
1054
|
+
mode, so the stage carries no card of its own and the page starts at the top of the pane.
|
|
1055
|
+
A collection entry written in Edit carries the writing-mode banner (§22.5): the canvas wraps it
|
|
1056
|
+
in its template's layout, and the banner says the layout is locked. Not in a lens: the
|
|
1057
|
+
banner's door belongs to the pane that owns the tab, and a lens is a view. */
|
|
1058
|
+
const wantsWritingBanner =
|
|
1044
1059
|
canvasMode === "edit" &&
|
|
1045
1060
|
derivationOfPane(surface.paneId)?.kind !== "lens" &&
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1061
|
+
Boolean(projectState?.isSiteProject) &&
|
|
1062
|
+
writesEntryOnCanvas(tab.documentPath);
|
|
1063
|
+
if (!wantsWritingBanner) {
|
|
1064
|
+
detachWritingBanner(surface.paneId);
|
|
1049
1065
|
}
|
|
1050
1066
|
|
|
1051
1067
|
/* Advance THIS stage's render generation so stale async renders from its previous pass bail out.
|
|
@@ -1154,12 +1170,6 @@ function renderCanvasImpl(surface: CanvasSurface) {
|
|
|
1154
1170
|
return;
|
|
1155
1171
|
}
|
|
1156
1172
|
|
|
1157
|
-
// Library fast-path, same shape: the Library pane owns its own reactivity (view state, scan,
|
|
1158
|
-
// Window), so a same-tab re-render while it is mounted needs nothing from the canvas pipeline.
|
|
1159
|
-
if (canvasMode === "manage" && libraryPaneMounted(surface.paneId, tab) && !modeChanged) {
|
|
1160
|
-
return;
|
|
1161
|
-
}
|
|
1162
|
-
|
|
1163
1173
|
// Entry fast-path, same shape: the entry form owns its own effect over the tab's frontmatter, so
|
|
1164
1174
|
// A field commit repaints the form and nothing reaches the canvas pipeline.
|
|
1165
1175
|
if (canvasMode === "entry" && entryPaneMounted(surface.paneId, tab) && !modeChanged) {
|
|
@@ -1172,9 +1182,21 @@ function renderCanvasImpl(surface: CanvasSurface) {
|
|
|
1172
1182
|
return;
|
|
1173
1183
|
}
|
|
1174
1184
|
|
|
1175
|
-
//
|
|
1176
|
-
|
|
1177
|
-
|
|
1185
|
+
// Variables fast-path, same shape: the view follows the document through its own effect.
|
|
1186
|
+
if (
|
|
1187
|
+
canvasMode === PROJECT_VARIABLES_VIEW &&
|
|
1188
|
+
variablesViewMounted(surface.paneId, tab) &&
|
|
1189
|
+
!modeChanged
|
|
1190
|
+
) {
|
|
1191
|
+
return;
|
|
1192
|
+
}
|
|
1193
|
+
|
|
1194
|
+
// Workspace-home fast-path, same shape: a home is a standing document with nothing to re-render.
|
|
1195
|
+
if (
|
|
1196
|
+
isWorkspaceHomeMode(canvasMode) &&
|
|
1197
|
+
workspaceHomeMounted(surface.paneId, tab) &&
|
|
1198
|
+
!modeChanged
|
|
1199
|
+
) {
|
|
1178
1200
|
return;
|
|
1179
1201
|
}
|
|
1180
1202
|
|
|
@@ -1191,10 +1213,11 @@ function renderCanvasImpl(surface: CanvasSurface) {
|
|
|
1191
1213
|
const curCustomized = shell.stylebook.customizedOnly;
|
|
1192
1214
|
const filterChanged =
|
|
1193
1215
|
curFilter !== surface.prevStylebookFilter ||
|
|
1194
|
-
curCustomized !== surface.prevStylebookCustomizedOnly
|
|
1216
|
+
curCustomized !== surface.prevStylebookCustomizedOnly ||
|
|
1217
|
+
activeMediaOfPane(surface.paneId) !== surface.prevStylebookMedia;
|
|
1195
1218
|
if (!filterChanged) {
|
|
1196
|
-
const style = transposeStylebookStyle(getEffectiveStyle(tab.doc.document
|
|
1197
|
-
if (postStyleUpdateToStylebookHosts(style
|
|
1219
|
+
const style = transposeStylebookStyle(getEffectiveStyle(tab.doc.document.style));
|
|
1220
|
+
if (postStyleUpdateToStylebookHosts(style) > 0) {
|
|
1198
1221
|
return;
|
|
1199
1222
|
}
|
|
1200
1223
|
}
|
|
@@ -1238,18 +1261,18 @@ function renderCanvasImpl(surface: CanvasSurface) {
|
|
|
1238
1261
|
// Destroy the grid panel if switching away from grid mode
|
|
1239
1262
|
detachGridPanel(surface.paneId);
|
|
1240
1263
|
|
|
1241
|
-
// The
|
|
1242
|
-
// Mode without releasing them is exactly the unbounded retention its LRU cap exists to remove.
|
|
1243
|
-
detachLibraryPane(surface.paneId);
|
|
1244
|
-
|
|
1245
|
-
// Same for the entry form, whose effect scope subscribes to the document's frontmatter
|
|
1264
|
+
// The entry form's effect scope subscribes to the document's frontmatter
|
|
1246
1265
|
detachEntryPane(surface.paneId);
|
|
1247
1266
|
|
|
1248
1267
|
// And for the media viewer, whose effect scope subscribes to the tab's path
|
|
1249
1268
|
detachMediaPane(surface.paneId);
|
|
1250
1269
|
|
|
1251
|
-
//
|
|
1252
|
-
|
|
1270
|
+
// And for the Variables view, whose effect scope subscribes to the document's style
|
|
1271
|
+
detachVariablesView(surface.paneId);
|
|
1272
|
+
|
|
1273
|
+
// And for a workspace home, whose surface holds a mounted document (the Content home's
|
|
1274
|
+
// IntersectionObserver and preview LRU among them)
|
|
1275
|
+
detachWorkspaceHome(surface.paneId);
|
|
1253
1276
|
|
|
1254
1277
|
// Dispose Monaco editor if switching away from source mode
|
|
1255
1278
|
disposeSourceCollab(surface);
|
|
@@ -1261,7 +1284,7 @@ function renderCanvasImpl(surface: CanvasSurface) {
|
|
|
1261
1284
|
leaving, and lit's part, which the empty-state and welcome paths own. */
|
|
1262
1285
|
releaseCanvasHosts(canvasWrap);
|
|
1263
1286
|
detachCanvasStage(surface);
|
|
1264
|
-
|
|
1287
|
+
render(nothing, canvasWrap);
|
|
1265
1288
|
surface.panzoomWrap = null;
|
|
1266
1289
|
// Reset inline style overrides from other modes
|
|
1267
1290
|
canvasWrap.style.padding = "";
|
|
@@ -1282,6 +1305,7 @@ function renderCanvasImpl(surface: CanvasSurface) {
|
|
|
1282
1305
|
if (canvasMode === "stylebook") {
|
|
1283
1306
|
surface.prevStylebookFilter = shell.stylebook.filter;
|
|
1284
1307
|
surface.prevStylebookCustomizedOnly = shell.stylebook.customizedOnly;
|
|
1308
|
+
surface.prevStylebookMedia = activeMediaOfPane(surface.paneId);
|
|
1285
1309
|
void renderStylebookMode(surface, {
|
|
1286
1310
|
applyTransform,
|
|
1287
1311
|
canvasPanelEntry,
|
|
@@ -1360,29 +1384,8 @@ function renderCanvasImpl(surface: CanvasSurface) {
|
|
|
1360
1384
|
return;
|
|
1361
1385
|
}
|
|
1362
1386
|
|
|
1363
|
-
/* Settings mode: the Project Settings document (§17.1). Same non-iframe-editor pattern as
|
|
1364
|
-
grid and stylebook — the panel owns its own reactivity from here — and the reason the seven
|
|
1365
|
-
settings screenshots now crop `pane.primary` instead of `overlay.dialog:settings` without one
|
|
1366
|
-
manifest step changing. */
|
|
1367
|
-
if (canvasMode === "settings") {
|
|
1368
|
-
canvasWrap.style.padding = "0";
|
|
1369
|
-
canvasWrap.style.display = "block";
|
|
1370
|
-
renderSettingsPane(surface);
|
|
1371
|
-
return;
|
|
1372
|
-
}
|
|
1373
|
-
|
|
1374
|
-
/* Library mode: the project's own contents, over a GridSource, in one of five layouts
|
|
1375
|
-
(`browse/library-pane.ts`). `commands/context.ts` already mapped `manage` to the `library`
|
|
1376
|
-
editor kind — this is the surface that map was pointing at. */
|
|
1377
|
-
if (canvasMode === "manage") {
|
|
1378
|
-
canvasWrap.style.padding = "0";
|
|
1379
|
-
canvasWrap.style.display = "block";
|
|
1380
|
-
renderLibraryMode(surface, tab);
|
|
1381
|
-
return;
|
|
1382
|
-
}
|
|
1383
|
-
|
|
1384
1387
|
/* Entry mode: one content entry's fields, typed by its collection's schema
|
|
1385
|
-
(`content/entry-editor.ts`). Same non-iframe-editor pattern as the
|
|
1388
|
+
(`content/entry-editor.ts`). Same non-iframe-editor pattern as the grid and the homes — and
|
|
1386
1389
|
the reason `entry` is in `commands/context.ts`'s mode map, without which a form over a
|
|
1387
1390
|
frontmatter record would have resolved into the CANVAS key scope. */
|
|
1388
1391
|
if (canvasMode === "entry") {
|
|
@@ -1401,6 +1404,22 @@ function renderCanvasImpl(surface: CanvasSurface) {
|
|
|
1401
1404
|
return;
|
|
1402
1405
|
}
|
|
1403
1406
|
|
|
1407
|
+
/* The Styles workspace's Variables view: `project.json`'s CSS custom properties, edited in a
|
|
1408
|
+
form (`style/variables-view.ts`). Like a home, it writes nothing onto the stage: its own style
|
|
1409
|
+
block fills it (`surfaces/styles-variables.json`). */
|
|
1410
|
+
if (canvasMode === PROJECT_VARIABLES_VIEW) {
|
|
1411
|
+
renderVariablesMode(surface, tab);
|
|
1412
|
+
return;
|
|
1413
|
+
}
|
|
1414
|
+
|
|
1415
|
+
/* A workspace's home: the surface a workspace opens on when none of its own tabs is open
|
|
1416
|
+
(`workspace/workspace-home.ts`). Unlike the five above it writes nothing onto the stage: the
|
|
1417
|
+
home's own style block fills it (`surfaces/publish-workspace.json`, for one). */
|
|
1418
|
+
if (isWorkspaceHomeMode(canvasMode)) {
|
|
1419
|
+
renderWorkspaceHome(surface, tab);
|
|
1420
|
+
return;
|
|
1421
|
+
}
|
|
1422
|
+
|
|
1404
1423
|
// Grid mode: spreadsheet editor over the tab's grid source (mirrors the Monaco/stylebook
|
|
1405
1424
|
// Non-iframe-editor pattern; the panel owns its own reactivity from here).
|
|
1406
1425
|
if (canvasMode === "grid") {
|
|
@@ -1465,7 +1484,7 @@ function renderCanvasImpl(surface: CanvasSurface) {
|
|
|
1465
1484
|
decided rather than the opener: a comparison reaches this branch from three doors (the panel,
|
|
1466
1485
|
a Diff lens, the Editor axis) and only this one sees every arrival. Forcing it here also
|
|
1467
1486
|
leaves `diffView` alone, so a document opened after a `.css` still comes up Visual. */
|
|
1468
|
-
const renderable = canRenderComparison(gitDiffState.filePath
|
|
1487
|
+
const renderable = canRenderComparison(gitDiffState.filePath);
|
|
1469
1488
|
if (diffShowsCode(surface.paneId, renderable)) {
|
|
1470
1489
|
/* A null map is how the toolbar learns there is no visual half to offer: it draws Code as a
|
|
1471
1490
|
static label rather than as half of a choice, and reports the line marks instead of a node
|
|
@@ -1518,12 +1537,15 @@ function renderCanvasImpl(surface: CanvasSurface) {
|
|
|
1518
1537
|
|
|
1519
1538
|
/** @param {string} content */
|
|
1520
1539
|
const parseContent = (content: string): Promise<JxMutableNode> => {
|
|
1521
|
-
const fmtPath = gitDiffState.filePath
|
|
1540
|
+
const fmtPath = gitDiffState.filePath;
|
|
1522
1541
|
if (formatForPath(fmtPath)) {
|
|
1523
1542
|
return parseSourceForPath(fmtPath, content).then((r) => r.document);
|
|
1524
1543
|
}
|
|
1525
1544
|
return Promise.resolve().then(() => {
|
|
1526
1545
|
try {
|
|
1546
|
+
/* SAFETY: a side of a VISUAL comparison is a revision of a document the canvas renders
|
|
1547
|
+
(canRenderComparison chose this half), a JSON Jx document; unparseable text throws into
|
|
1548
|
+
the catch, which draws the failure instead. */
|
|
1527
1549
|
return JSON.parse(content) as JxMutableNode;
|
|
1528
1550
|
} catch {
|
|
1529
1551
|
return {
|
|
@@ -1636,31 +1658,26 @@ function renderCanvasImpl(surface: CanvasSurface) {
|
|
|
1636
1658
|
const entry = canvasPanelEntry(null, null, true);
|
|
1637
1659
|
// A component-definition doc (root tag is a custom element) is a fragment, not a page: it should
|
|
1638
1660
|
// Hug its content rather than have the column fill+stretch to the viewport (dead scroll space).
|
|
1639
|
-
const rootTag =
|
|
1640
|
-
const isComponentDoc =
|
|
1661
|
+
const rootTag = S.document.tagName;
|
|
1662
|
+
const isComponentDoc = isString(rootTag) && rootTag.includes("-");
|
|
1641
1663
|
const { featureToggles: editToggles } = S.ui;
|
|
1642
|
-
/* The stage stacks when it carries the
|
|
1643
|
-
Set on every render rather than on the transition, because whether a document
|
|
1644
|
-
changes with the tab and not with the mode. `editors.ts` and
|
|
1645
|
-
claim the column this way — `#canvas-wrap` is a row by
|
|
1646
|
-
own axis. Stretched, because the band is as wide as the
|
|
1647
|
-
|
|
1648
|
-
|
|
1649
|
-
|
|
1650
|
-
|
|
1651
|
-
|
|
1652
|
-
|
|
1653
|
-
|
|
1654
|
-
as the band's edge; the scroller's own 32px of top padding is the breathing room. */
|
|
1655
|
-
canvasWrap.style.flexDirection = wantsDocHeader ? "column" : "";
|
|
1656
|
-
canvasWrap.style.alignItems = wantsDocHeader ? "stretch" : "";
|
|
1657
|
-
canvasWrap.style.gap = wantsDocHeader ? "0px" : "";
|
|
1664
|
+
/* The stage stacks when it carries the writing banner: the band first, the page's scroller
|
|
1665
|
+
below it. Set on every render rather than on the transition, because whether a document is
|
|
1666
|
+
a collection entry changes with the tab and not with the mode. `editors.ts` and
|
|
1667
|
+
`formula-workspace.ts` already claim the column this way — `#canvas-wrap` is a row by
|
|
1668
|
+
default and each surface states its own axis. Stretched, because the band is as wide as the
|
|
1669
|
+
PANE rather than the breakpoint's column. And FLUSH: the cell's own 24px gap
|
|
1670
|
+
(`pane-grid.json`) between two side-by-side surfaces would be dead space between the band and
|
|
1671
|
+
the scroller below it, whose own 32px of top padding is the breathing room. */
|
|
1672
|
+
const stacks = wantsWritingBanner;
|
|
1673
|
+
canvasWrap.style.flexDirection = stacks ? "column" : "";
|
|
1674
|
+
canvasWrap.style.alignItems = stacks ? "stretch" : "";
|
|
1675
|
+
canvasWrap.style.gap = stacks ? "0px" : "";
|
|
1658
1676
|
void drawStage(
|
|
1659
1677
|
surface,
|
|
1660
1678
|
{
|
|
1661
|
-
/* The
|
|
1662
|
-
|
|
1663
|
-
scrolls under it and the breakpoint does not size it. The two handles are not in the
|
|
1679
|
+
/* The banner LEADS the frame: a sibling of the scroller rather than a block of the column,
|
|
1680
|
+
so the page scrolls under it and the breakpoint does not size it. The two handles are not in the
|
|
1664
1681
|
column either: they are `jx-split`s standing beside it in the canvas's row, because the
|
|
1665
1682
|
canvas is the track a splitter has to measure and the column is the thing being
|
|
1666
1683
|
resized. */
|
|
@@ -1670,7 +1687,7 @@ function renderCanvasImpl(surface: CanvasSurface) {
|
|
|
1670
1687
|
handles: "shown",
|
|
1671
1688
|
hug: isComponentDoc,
|
|
1672
1689
|
innerPart: "edit-column",
|
|
1673
|
-
lead:
|
|
1690
|
+
lead: wantsWritingBanner ? "banner" : "none",
|
|
1674
1691
|
panels: [entry.item],
|
|
1675
1692
|
},
|
|
1676
1693
|
[entry],
|
|
@@ -1678,8 +1695,13 @@ function renderCanvasImpl(surface: CanvasSurface) {
|
|
|
1678
1695
|
if (!stage) {
|
|
1679
1696
|
return;
|
|
1680
1697
|
}
|
|
1698
|
+
if (wantsWritingBanner) {
|
|
1699
|
+
renderWritingBanner(surface.paneId, tab);
|
|
1700
|
+
}
|
|
1681
1701
|
const editColumn = stageHost(surface, "edit-column");
|
|
1682
1702
|
const scroller = stageHost(surface, "edit-canvas");
|
|
1703
|
+
/* SAFETY: the edit stage view always draws its `edit-canvas` part, and this runs only once
|
|
1704
|
+
drawStage settled with that stage (the `!stage` return above). */
|
|
1683
1705
|
entry.panel.scrollContainer = scroller as HTMLElement;
|
|
1684
1706
|
/* The one mode whose stage SCROLLS under the zoom pod, so the one that tells the pane how
|
|
1685
1707
|
wide its scrollbar is. The pod floats in the pane's chrome layer, which spans the gutter
|
|
@@ -1717,9 +1739,9 @@ function renderCanvasImpl(surface: CanvasSurface) {
|
|
|
1717
1739
|
canvasWrap.style.padding = "0";
|
|
1718
1740
|
canvasWrap.style.overflow = "hidden";
|
|
1719
1741
|
}
|
|
1720
|
-
/*
|
|
1721
|
-
alone (see `
|
|
1722
|
-
inline writes Edit makes to stack it. */
|
|
1742
|
+
/* Nothing leads Design's frame, so the stage cell stays the row it is by default: the writing
|
|
1743
|
+
banner is Edit's alone (see `wantsWritingBanner`), and the transition into this mode has
|
|
1744
|
+
already cleared the inline writes Edit makes to stack it. */
|
|
1723
1745
|
|
|
1724
1746
|
const {
|
|
1725
1747
|
sizeBreakpoints,
|
|
@@ -1733,7 +1755,7 @@ function renderCanvasImpl(surface: CanvasSurface) {
|
|
|
1733
1755
|
if (!hasMedia) {
|
|
1734
1756
|
// Single panel — use baseWidth if a custom one is defined, otherwise full-width
|
|
1735
1757
|
const effectiveMedia = getEffectiveMedia(S.document.$media);
|
|
1736
|
-
const hasBaseWidth = effectiveMedia
|
|
1758
|
+
const hasBaseWidth = effectiveMedia["--"];
|
|
1737
1759
|
const label = hasBaseWidth ? `${mediaDisplayName("--")} (${baseWidth}px)` : null;
|
|
1738
1760
|
const entry = canvasPanelEntry(
|
|
1739
1761
|
hasBaseWidth ? "base" : null,
|
|
@@ -1900,8 +1922,11 @@ function renderCanvasIntoPanel(
|
|
|
1900
1922
|
) {
|
|
1901
1923
|
const gen = passGen ?? surface.renderGeneration;
|
|
1902
1924
|
const tab = tabOfPane(surface.paneId);
|
|
1925
|
+
/* SAFETY: every caller is a renderCanvasImpl pass, which returns before drawing any panel when its
|
|
1926
|
+
pane has no tab, so without an override `tab` was non-null when this pass began; the git-diff
|
|
1927
|
+
callers always pass their override. */
|
|
1903
1928
|
const docToRender = docOverride || (tab?.doc.document as JxMutableNode);
|
|
1904
|
-
const canvas = panel
|
|
1929
|
+
const { canvas } = panel;
|
|
1905
1930
|
|
|
1906
1931
|
canvasPerf.panelRenders += 1;
|
|
1907
1932
|
panel.ready = false;
|
|
@@ -1947,14 +1972,16 @@ function renderCanvasIntoPanel(
|
|
|
1947
1972
|
// The canvas you are looking at; it says so itself.
|
|
1948
1973
|
}
|
|
1949
1974
|
})
|
|
1950
|
-
.catch(
|
|
1951
|
-
|
|
1952
|
-
|
|
1953
|
-
|
|
1954
|
-
|
|
1955
|
-
|
|
1956
|
-
|
|
1957
|
-
|
|
1975
|
+
.catch(reportMountFailure);
|
|
1976
|
+
}
|
|
1977
|
+
|
|
1978
|
+
/** A canvas mount that rejected, reported as a Problem with the failure's own message. */
|
|
1979
|
+
function reportMountFailure(cause: unknown): void {
|
|
1980
|
+
notify.error("The canvas could not be mounted.", {
|
|
1981
|
+
detail: errorMessage(cause),
|
|
1982
|
+
key: "canvas.mount",
|
|
1983
|
+
source: "Canvas",
|
|
1984
|
+
});
|
|
1958
1985
|
}
|
|
1959
1986
|
|
|
1960
1987
|
/*
|
|
@@ -1974,11 +2001,11 @@ setSurfaceTeardown((surface) => {
|
|
|
1974
2001
|
clearDiffView(surface.paneId);
|
|
1975
2002
|
setDiffToolbarHost(surface.paneId, null);
|
|
1976
2003
|
detachGridPanel(surface.paneId);
|
|
1977
|
-
detachLibraryPane(surface.paneId);
|
|
1978
2004
|
detachEntryPane(surface.paneId);
|
|
1979
2005
|
detachMediaPane(surface.paneId);
|
|
1980
|
-
|
|
1981
|
-
|
|
2006
|
+
detachVariablesView(surface.paneId);
|
|
2007
|
+
detachWorkspaceHome(surface.paneId);
|
|
2008
|
+
detachWritingBanner(surface.paneId);
|
|
1982
2009
|
disposeSourceCollab(surface);
|
|
1983
2010
|
disposeSourceEditor(surface);
|
|
1984
2011
|
surface.centerObserver?.disconnect();
|
|
@@ -2012,7 +2039,7 @@ function refuseUnresolvableToken(token: string): void {
|
|
|
2012
2039
|
throw new RangeError(`command "insert.data" needs an open document; no tab is active`);
|
|
2013
2040
|
}
|
|
2014
2041
|
const root = tokenRoot(token);
|
|
2015
|
-
const state =
|
|
2042
|
+
const state = tab.doc.document.state ?? {};
|
|
2016
2043
|
if (root === "state") {
|
|
2017
2044
|
const name = token.split(".")[1] ?? "";
|
|
2018
2045
|
if (!(name in state)) {
|