@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,5 +1,6 @@
|
|
|
1
1
|
/** Google Fonts helpers — shared between head-panel (per-page) and head-editor (project-level). */
|
|
2
2
|
|
|
3
|
+
import { isString } from "@jxsuite/schema/guards";
|
|
3
4
|
import type { JxHeadEntry } from "@jxsuite/schema/types";
|
|
4
5
|
|
|
5
6
|
export const GFONTS_CSS_PREFIX = "https://fonts.googleapis.com/css2?";
|
|
@@ -11,29 +12,30 @@ export const GFONTS_PRECONNECT_ORIGINS = [
|
|
|
11
12
|
/**
|
|
12
13
|
* Check if a `$head` entry is a Google Fonts stylesheet link.
|
|
13
14
|
*
|
|
14
|
-
* @param {JxHeadEntry} entry
|
|
15
|
+
* @param {JxHeadEntry | null | undefined} entry A `$head` slot; a JSON array can hold `null`.
|
|
15
16
|
* @returns {boolean}
|
|
16
17
|
*/
|
|
17
|
-
export function isGoogleFontEntry(entry: JxHeadEntry) {
|
|
18
|
+
export function isGoogleFontEntry(entry: JxHeadEntry | null | undefined) {
|
|
18
19
|
return (
|
|
19
20
|
entry?.tagName === "link" &&
|
|
20
|
-
entry
|
|
21
|
-
|
|
22
|
-
|
|
21
|
+
entry.attributes?.rel === "stylesheet" &&
|
|
22
|
+
isString(entry.attributes.href) &&
|
|
23
|
+
entry.attributes.href.startsWith(GFONTS_CSS_PREFIX)
|
|
23
24
|
);
|
|
24
25
|
}
|
|
25
26
|
|
|
26
27
|
/**
|
|
27
28
|
* Check if a `$head` entry is a Google Fonts preconnect link.
|
|
28
29
|
*
|
|
29
|
-
* @param {JxHeadEntry} entry
|
|
30
|
+
* @param {JxHeadEntry | null | undefined} entry A `$head` slot; a JSON array can hold `null`.
|
|
30
31
|
* @returns {boolean}
|
|
31
32
|
*/
|
|
32
|
-
export function isGoogleFontPreconnect(entry: JxHeadEntry) {
|
|
33
|
+
export function isGoogleFontPreconnect(entry: JxHeadEntry | null | undefined) {
|
|
33
34
|
return (
|
|
34
35
|
entry?.tagName === "link" &&
|
|
35
|
-
entry
|
|
36
|
-
|
|
36
|
+
entry.attributes?.rel === "preconnect" &&
|
|
37
|
+
isString(entry.attributes.href) &&
|
|
38
|
+
GFONTS_PRECONNECT_ORIGINS.includes(entry.attributes.href)
|
|
37
39
|
);
|
|
38
40
|
}
|
|
39
41
|
|
|
@@ -68,14 +70,13 @@ export function buildGoogleFontUrl(family: string) {
|
|
|
68
70
|
*/
|
|
69
71
|
export function ensureGoogleFontPreconnects(head: JxHeadEntry[]) {
|
|
70
72
|
for (const origin of GFONTS_PRECONNECT_ORIGINS) {
|
|
73
|
+
// A `$head` array is JSON, so a slot can hold `null` whatever the element type says.
|
|
71
74
|
const exists = head.some(
|
|
72
|
-
(e: JxHeadEntry) =>
|
|
73
|
-
e?.tagName === "link" &&
|
|
74
|
-
e?.attributes?.rel === "preconnect" &&
|
|
75
|
-
e?.attributes?.href === origin,
|
|
75
|
+
(e: JxHeadEntry | null | undefined) =>
|
|
76
|
+
e?.tagName === "link" && e.attributes?.rel === "preconnect" && e.attributes.href === origin,
|
|
76
77
|
);
|
|
77
78
|
if (!exists) {
|
|
78
|
-
const attrs:
|
|
79
|
+
const attrs: NonNullable<JxHeadEntry["attributes"]> = {
|
|
79
80
|
href: origin,
|
|
80
81
|
rel: "preconnect",
|
|
81
82
|
};
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
* that drops it, for callers that only want the value.
|
|
14
14
|
*/
|
|
15
15
|
|
|
16
|
+
import { getNestedStyle, isNumber, isString } from "@jxsuite/schema/guards";
|
|
16
17
|
import type { JxStyle } from "@jxsuite/schema/types";
|
|
17
18
|
|
|
18
19
|
/** One inherited property: the value that shows through, and the breakpoint it was set on. */
|
|
@@ -42,30 +43,29 @@ export function computeInheritedSources(
|
|
|
42
43
|
return {};
|
|
43
44
|
}
|
|
44
45
|
|
|
45
|
-
|
|
46
|
+
// A Map re-set keeps the key's first position, exactly as reassigning an object property does.
|
|
47
|
+
const inherited = new Map<string, InheritedSource>();
|
|
46
48
|
|
|
47
49
|
/** Layer one block over the accumulator, recording `donor` for everything it contributes. */
|
|
48
|
-
const layer = (block: JxStyle, donor: string | null) => {
|
|
49
|
-
for (const [p, v] of Object.entries(block)) {
|
|
50
|
-
|
|
51
|
-
|
|
50
|
+
const layer = (block: JxStyle | undefined, donor: string | null) => {
|
|
51
|
+
for (const [p, v] of Object.entries(block ?? {})) {
|
|
52
|
+
// Declarations only: nested blocks, block lists and `$ref` objects are not inherited values.
|
|
53
|
+
if (v === undefined || isString(v) || isNumber(v)) {
|
|
54
|
+
inherited.set(p, { donor, value: v ?? "" });
|
|
52
55
|
}
|
|
53
56
|
}
|
|
54
57
|
};
|
|
55
58
|
|
|
56
59
|
if (activeSelector) {
|
|
57
60
|
// Selector inheritance: base selector → each media's selector block, in cascade order.
|
|
58
|
-
layer((style
|
|
61
|
+
layer(getNestedStyle(style, activeSelector), null);
|
|
59
62
|
for (const name of mediaNames) {
|
|
60
63
|
if (name === activeTab) {
|
|
61
64
|
break;
|
|
62
65
|
}
|
|
63
|
-
layer(
|
|
64
|
-
(((style[`@${name}`] || {}) as Record<string, unknown>)[activeSelector] || {}) as JxStyle,
|
|
65
|
-
name,
|
|
66
|
-
);
|
|
66
|
+
layer(getNestedStyle(getNestedStyle(style, `@${name}`), activeSelector), name);
|
|
67
67
|
}
|
|
68
|
-
return inherited;
|
|
68
|
+
return Object.fromEntries(inherited);
|
|
69
69
|
}
|
|
70
70
|
|
|
71
71
|
// Base flat props first, then each media block in order until the current tab.
|
|
@@ -74,9 +74,9 @@ export function computeInheritedSources(
|
|
|
74
74
|
if (name === activeTab) {
|
|
75
75
|
break;
|
|
76
76
|
}
|
|
77
|
-
layer((style
|
|
77
|
+
layer(getNestedStyle(style, `@${name}`), name);
|
|
78
78
|
}
|
|
79
|
-
return inherited;
|
|
79
|
+
return Object.fromEntries(inherited);
|
|
80
80
|
}
|
|
81
81
|
|
|
82
82
|
/**
|
|
@@ -95,11 +95,9 @@ export function computeInheritedStyle(
|
|
|
95
95
|
activeTab: string | null,
|
|
96
96
|
activeSelector: string | null = null,
|
|
97
97
|
): Record<string, string | number> {
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
}
|
|
104
|
-
return values;
|
|
98
|
+
return Object.fromEntries(
|
|
99
|
+
Object.entries(computeInheritedSources(style, mediaNames, activeTab, activeSelector)).map(
|
|
100
|
+
([prop, source]) => [prop, source.value],
|
|
101
|
+
),
|
|
102
|
+
);
|
|
105
103
|
}
|
package/src/utils/link-target.ts
CHANGED
|
@@ -71,7 +71,7 @@ export function classifyHref(href = ""): LinkTarget {
|
|
|
71
71
|
* @param value The bare value for that kind (address/number/fragment/path/href)
|
|
72
72
|
*/
|
|
73
73
|
export function composeHref(kind: LinkKind, value: string): string {
|
|
74
|
-
const bare =
|
|
74
|
+
const bare = value.trim();
|
|
75
75
|
if (!bare) {
|
|
76
76
|
return "";
|
|
77
77
|
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* An instant as the calendar day it is where Studio runs.
|
|
3
|
+
*
|
|
4
|
+
* A file's modification time, an upload's, "today": each is an instant, and the day a reader means
|
|
5
|
+
* by it is their own. `toISOString().slice(0, 10)` answers in UTC, so a file saved at 9 pm in
|
|
6
|
+
* Denver was listed as edited tomorrow. A date the author WROTE (`2026-06-03`) is not an instant
|
|
7
|
+
* and never goes through here: it is taken as written (`content/entry-summaries.ts` `entryDay`).
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/** `date` as `YYYY-MM-DD` in the local time zone, or "" for an invalid date. */
|
|
11
|
+
export function localDay(date: Date): string {
|
|
12
|
+
if (Number.isNaN(date.getTime())) {
|
|
13
|
+
return "";
|
|
14
|
+
}
|
|
15
|
+
const month = String(date.getMonth() + 1).padStart(2, "0");
|
|
16
|
+
const day = String(date.getDate()).padStart(2, "0");
|
|
17
|
+
return `${String(date.getFullYear()).padStart(4, "0")}-${month}-${day}`;
|
|
18
|
+
}
|
|
@@ -5,17 +5,39 @@
|
|
|
5
5
|
* strip-events pattern) so importing it never grows the iframe bundle.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
+
import type { JsonPrimitive } from "@jxsuite/schema/types";
|
|
9
|
+
|
|
8
10
|
const MAX_BADGE_LENGTH = 48;
|
|
9
11
|
|
|
12
|
+
/**
|
|
13
|
+
* A value an expression evaluated to, as a badge has to show it: JSON from state, a bigint or
|
|
14
|
+
* symbol a helper returned, a function, and arrays and records of those. A record can be cyclic,
|
|
15
|
+
* and a bigint cannot be stringified at all, which is why formatting falls back to `String()`.
|
|
16
|
+
*/
|
|
17
|
+
export type PreviewValue =
|
|
18
|
+
| JsonPrimitive
|
|
19
|
+
| undefined
|
|
20
|
+
| bigint
|
|
21
|
+
| symbol
|
|
22
|
+
| ((...args: never[]) => void)
|
|
23
|
+
| PreviewValue[]
|
|
24
|
+
| PreviewRecord;
|
|
25
|
+
|
|
26
|
+
/** An object an expression evaluated to, read key by key. */
|
|
27
|
+
export interface PreviewRecord {
|
|
28
|
+
[key: string]: PreviewValue;
|
|
29
|
+
}
|
|
30
|
+
|
|
10
31
|
/** Format a runtime value as a short badge string. */
|
|
11
|
-
export function formatPreviewValue(value?:
|
|
32
|
+
export function formatPreviewValue(value?: PreviewValue): string {
|
|
12
33
|
if (value === undefined) {
|
|
13
34
|
return "undefined";
|
|
14
35
|
}
|
|
15
36
|
let text: string;
|
|
16
37
|
try {
|
|
17
|
-
|
|
18
|
-
|
|
38
|
+
// SAFETY: lib.d.ts declares a string, but JSON.stringify answers undefined for a function or a symbol.
|
|
39
|
+
const json = JSON.stringify(value) as string | undefined;
|
|
40
|
+
text = json ?? "undefined";
|
|
19
41
|
} catch {
|
|
20
42
|
text = String(value);
|
|
21
43
|
}
|
|
@@ -8,44 +8,71 @@
|
|
|
8
8
|
* editor's reactive `store.ts`; `store.ts` re-exports it for the legacy in-realm patcher.
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
|
-
import {
|
|
12
|
-
|
|
11
|
+
import {
|
|
12
|
+
isEventBinding,
|
|
13
|
+
isJsonObject,
|
|
14
|
+
isNodeObject,
|
|
15
|
+
isNonNullObject,
|
|
16
|
+
} from "@jxsuite/schema/guards";
|
|
17
|
+
import type { JxDocumentValue, JxMutableNode } from "@jxsuite/schema/types";
|
|
13
18
|
|
|
14
|
-
/**
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
+
/**
|
|
20
|
+
* A node object as a document walker rebuilds it. Every key holds a document value, including the
|
|
21
|
+
* keys {@link JxMutableNode} names, because a walker copies whatever the source document holds;
|
|
22
|
+
* `undefined` is a key an editor cleared.
|
|
23
|
+
*/
|
|
24
|
+
export type RebuiltNode = Record<string, JxDocumentValue | undefined>;
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Whether a walker descends into `value`: any object, arrays included. A document is JSON, so every
|
|
28
|
+
* own value of such an object is itself a document value.
|
|
29
|
+
*
|
|
30
|
+
* @param value A value read out of a document.
|
|
31
|
+
*/
|
|
32
|
+
export function isDocumentContainer(
|
|
33
|
+
value: JxDocumentValue | undefined,
|
|
34
|
+
): value is JxDocumentValue[] | Readonly<RebuiltNode> {
|
|
35
|
+
return isNonNullObject(value);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Strip all `on*` event-handler properties (and server-timed state) from a document tree. Arrays
|
|
40
|
+
* are stripped member by member, and primitives and a cleared (`undefined`) key return unchanged,
|
|
41
|
+
* so the walk can recurse through any document value.
|
|
42
|
+
*/
|
|
43
|
+
export function stripEventHandlers(node: JxMutableNode): JxMutableNode;
|
|
44
|
+
export function stripEventHandlers(node: JxDocumentValue): JxDocumentValue;
|
|
45
|
+
export function stripEventHandlers(node: JxDocumentValue | undefined): JxDocumentValue | undefined;
|
|
46
|
+
export function stripEventHandlers(node: JxDocumentValue | undefined): JxDocumentValue | undefined {
|
|
19
47
|
if (Array.isArray(node)) {
|
|
20
48
|
// Arrays of nodes round-trip element-wise; the array itself is not a node.
|
|
21
|
-
return node.map((n
|
|
49
|
+
return node.map((n) => stripEventHandlers(n));
|
|
22
50
|
}
|
|
23
|
-
|
|
51
|
+
if (!isNodeObject(node)) {
|
|
52
|
+
return node;
|
|
53
|
+
}
|
|
54
|
+
const out: RebuiltNode = {};
|
|
24
55
|
for (const [k, v] of Object.entries(node)) {
|
|
25
56
|
if (k.startsWith("on") && isEventBinding(v)) {
|
|
26
57
|
continue;
|
|
27
58
|
}
|
|
28
59
|
if (k === "children") {
|
|
29
|
-
out.children = Array.isArray(v)
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
for (const [ck, cv] of Object.entries(v as Record<string, unknown>)) {
|
|
35
|
-
cases[ck] = stripEventHandlers(cv as JxMutableNode);
|
|
60
|
+
out.children = Array.isArray(v) ? v.map((c) => stripEventHandlers(c)) : stripEventHandlers(v);
|
|
61
|
+
} else if (k === "cases" && isDocumentContainer(v)) {
|
|
62
|
+
const cases: RebuiltNode = {};
|
|
63
|
+
for (const [ck, cv] of Object.entries(v)) {
|
|
64
|
+
cases[ck] = stripEventHandlers(cv);
|
|
36
65
|
}
|
|
37
66
|
out.cases = cases;
|
|
38
|
-
} else if (k === "state" &&
|
|
39
|
-
const state:
|
|
40
|
-
for (const [sk, sv] of Object.entries(v
|
|
41
|
-
if (sv &&
|
|
67
|
+
} else if (k === "state" && isDocumentContainer(v)) {
|
|
68
|
+
const state: RebuiltNode = {};
|
|
69
|
+
for (const [sk, sv] of Object.entries(v)) {
|
|
70
|
+
if (isJsonObject(sv) && sv.timing === "server") {
|
|
42
71
|
continue;
|
|
43
72
|
}
|
|
44
73
|
state[sk] = sv;
|
|
45
74
|
}
|
|
46
75
|
out.state = state;
|
|
47
|
-
} else if (k === "style" || k === "attributes" || k === "$media") {
|
|
48
|
-
out[k] = v;
|
|
49
76
|
} else {
|
|
50
77
|
out[k] = v;
|
|
51
78
|
}
|
|
@@ -6,7 +6,8 @@
|
|
|
6
6
|
|
|
7
7
|
import { collectionForFile } from "../content/collection-match";
|
|
8
8
|
import { defaultContentFormat } from "../format/format-host";
|
|
9
|
-
import type { ProjectConfig } from "@jxsuite/schema/types";
|
|
9
|
+
import type { JsonValue, ProjectConfig } from "@jxsuite/schema/types";
|
|
10
|
+
import type { CssFontPreset } from "../panels/style-utils";
|
|
10
11
|
|
|
11
12
|
/**
|
|
12
13
|
* Convert camelCase property name to "Title Case" label (e.g. "backgroundColor" → "Background
|
|
@@ -39,31 +40,42 @@ export function kebabToLabel(val: string) {
|
|
|
39
40
|
);
|
|
40
41
|
}
|
|
41
42
|
|
|
43
|
+
/**
|
|
44
|
+
* What a css-meta or html-meta entry says about the field that edits it: its label, and the keys
|
|
45
|
+
* {@link inferInputType} picks the control from. Every other key an entry carries is ignored here.
|
|
46
|
+
*/
|
|
47
|
+
export interface FieldControlMeta {
|
|
48
|
+
readonly $label?: string | undefined;
|
|
49
|
+
/** `true` on a shorthand row; css-meta puts the shorthand's own name on each longhand. */
|
|
50
|
+
readonly $shorthand?: string | boolean | undefined;
|
|
51
|
+
readonly $input?: string | undefined;
|
|
52
|
+
readonly $units?: readonly string[] | undefined;
|
|
53
|
+
readonly format?: string | undefined;
|
|
54
|
+
readonly type?: string | undefined;
|
|
55
|
+
readonly enum?: readonly JsonValue[] | undefined;
|
|
56
|
+
readonly examples?: readonly JsonValue[] | undefined;
|
|
57
|
+
readonly presets?: readonly (CssFontPreset | JsonValue)[] | undefined;
|
|
58
|
+
}
|
|
59
|
+
|
|
42
60
|
/**
|
|
43
61
|
* Get display label from metadata entry or prop name
|
|
44
62
|
*
|
|
45
|
-
* @param {
|
|
63
|
+
* @param {FieldControlMeta | null | undefined} entry
|
|
46
64
|
* @param {string} prop
|
|
47
65
|
* @returns {string}
|
|
48
66
|
*/
|
|
49
|
-
export function propLabel(
|
|
50
|
-
entry: { $label?: string; [key: string]: unknown } | null | undefined,
|
|
51
|
-
prop: string,
|
|
52
|
-
) {
|
|
67
|
+
export function propLabel(entry: FieldControlMeta | null | undefined, prop: string) {
|
|
53
68
|
return entry?.$label || camelToLabel(prop);
|
|
54
69
|
}
|
|
55
70
|
|
|
56
71
|
/**
|
|
57
72
|
* Label for HTML attributes — handles kebab-case (aria-label → "Aria Label")
|
|
58
73
|
*
|
|
59
|
-
* @param {
|
|
74
|
+
* @param {FieldControlMeta | null | undefined} entry
|
|
60
75
|
* @param {string} attr
|
|
61
76
|
* @returns {string}
|
|
62
77
|
*/
|
|
63
|
-
export function attrLabel(
|
|
64
|
-
entry: { $label?: string; [key: string]: unknown } | null | undefined,
|
|
65
|
-
attr: string,
|
|
66
|
-
) {
|
|
78
|
+
export function attrLabel(entry: FieldControlMeta | null | undefined, attr: string) {
|
|
67
79
|
if (entry?.$label) {
|
|
68
80
|
return entry.$label;
|
|
69
81
|
}
|
|
@@ -92,17 +104,17 @@ export function attrLabel(
|
|
|
92
104
|
* @param {unknown} format - A schema entry's `format`
|
|
93
105
|
* @returns {boolean}
|
|
94
106
|
*/
|
|
95
|
-
export function isMediaFormat(format: unknown):
|
|
107
|
+
export function isMediaFormat(format: unknown): format is "image" | "uri-reference" {
|
|
96
108
|
return format === "image" || format === "uri-reference";
|
|
97
109
|
}
|
|
98
110
|
|
|
99
111
|
/**
|
|
100
112
|
* Determine input widget type from a css-meta entry
|
|
101
113
|
*
|
|
102
|
-
* @param {
|
|
114
|
+
* @param {FieldControlMeta} entry
|
|
103
115
|
* @returns {string}
|
|
104
116
|
*/
|
|
105
|
-
export function inferInputType(entry:
|
|
117
|
+
export function inferInputType(entry: FieldControlMeta) {
|
|
106
118
|
if (entry.$shorthand === true) {
|
|
107
119
|
return "shorthand";
|
|
108
120
|
}
|
|
@@ -248,6 +260,9 @@ export function parseCemType(typeText: string | undefined | null) {
|
|
|
248
260
|
* both required for document snapshots and clipboard payloads.
|
|
249
261
|
*/
|
|
250
262
|
export function jsonClone<T>(value: T): T {
|
|
263
|
+
/* SAFETY: callers pass documents and clipboard payloads, which are JSON-shaped, and a JSON round
|
|
264
|
+
trip rebuilds such a value with the same structure. The only keys it loses hold undefined or a
|
|
265
|
+
function, which is the normalization this helper exists to perform. */
|
|
251
266
|
// oxlint-disable-next-line unicorn/prefer-structured-clone -- structuredClone throws on reactive proxies; JSON normalization is the point
|
|
252
267
|
return JSON.parse(JSON.stringify(value)) as T;
|
|
253
268
|
}
|
package/src/view.ts
CHANGED
|
@@ -66,8 +66,8 @@ export type MonacoSurface = editor.IStandaloneCodeEditor & {
|
|
|
66
66
|
* offsets, the source-view Monaco and the render generation were all fields of "the canvas" — a
|
|
67
67
|
* singular that stopped existing when the shell grew a pane grid. They are fields of a
|
|
68
68
|
* {@link import("./canvas/canvas-surface").CanvasSurface} now, one record per pane, and
|
|
69
|
-
* `scripts/check-pane-singletons.ts` fails the build if one grows back
|
|
70
|
-
*
|
|
69
|
+
* `scripts/check-pane-singletons.ts` fails the build if one grows back, and with no index signature
|
|
70
|
+
* on this record a read of `view.panX` is a type error as well.
|
|
71
71
|
*/
|
|
72
72
|
interface ViewState {
|
|
73
73
|
/**
|
|
@@ -103,7 +103,6 @@ interface ViewState {
|
|
|
103
103
|
layerDragSourceHeight: number;
|
|
104
104
|
_completionRegistered: boolean;
|
|
105
105
|
_layersCollapsed: Set<string> | null;
|
|
106
|
-
[key: string]: unknown;
|
|
107
106
|
}
|
|
108
107
|
|
|
109
108
|
export const view: ViewState = {
|
|
@@ -31,12 +31,13 @@
|
|
|
31
31
|
|
|
32
32
|
import { effect } from "../reactivity";
|
|
33
33
|
import { componentRegistry } from "../files/components";
|
|
34
|
-
import {
|
|
34
|
+
import { parentElementPath } from "../store";
|
|
35
35
|
|
|
36
36
|
import { canvasPerf } from "../canvas/canvas-perf";
|
|
37
37
|
import { canvasModeOfTab, tabOfPane } from "../canvas/canvas-surface";
|
|
38
38
|
import { parseMediaEntries } from "../utils/canvas-media";
|
|
39
39
|
import { getEffectiveLayoutPath, getEffectiveLocales, getEffectiveMedia } from "../site-context";
|
|
40
|
+
import { getNodeAtPath } from "@jxsuite/schema/doc-ops";
|
|
40
41
|
import { localeLabel, translationPathFor } from "@jxsuite/schema/locale";
|
|
41
42
|
import { shell } from "../shell";
|
|
42
43
|
import {
|
|
@@ -78,10 +79,10 @@ export type DerivePreset = (typeof DERIVE_PRESETS)[number];
|
|
|
78
79
|
* The canvas mode a preset needs the SOURCE document to DECLARE, for the presets that need one.
|
|
79
80
|
*
|
|
80
81
|
* `tab.capabilities.modes` is the format's own answer to "what can this document be shown as", and
|
|
81
|
-
* the preset menu consulted it nowhere: over a document that declares `["
|
|
82
|
-
*
|
|
83
|
-
*
|
|
84
|
-
*
|
|
82
|
+
* the preset menu consulted it nowhere: over a document that declares `["stylebook", "source"]` it
|
|
83
|
+
* still offered "Same page at Base" — a lens whose stage can only draw an empty artboard — and
|
|
84
|
+
* "Component definition", whose rule can never resolve because nothing in a configuration object is
|
|
85
|
+
* a component instance. Both produced a pane the author then had to close.
|
|
85
86
|
*
|
|
86
87
|
* Two presets are absent, for two different reasons. `diff` needs no mode: a comparison is two
|
|
87
88
|
* texts and every document has those, and it is already gated on the file having changes. `layout`
|
|
@@ -97,14 +98,14 @@ export type DerivePreset = (typeof DERIVE_PRESETS)[number];
|
|
|
97
98
|
* pinned by a test (`per-preset refusals` · "Layout's gate is the layout RESOLVING") instead of
|
|
98
99
|
* being asserted here in prose.
|
|
99
100
|
*/
|
|
100
|
-
const MODE_FOR_PRESET: Readonly<Partial<Record<DerivePreset,
|
|
101
|
+
const MODE_FOR_PRESET: Readonly<Partial<Record<DerivePreset, keyof typeof MODE_WORDS>>> = {
|
|
101
102
|
breakpoint: "design",
|
|
102
103
|
code: "source",
|
|
103
104
|
component: "design",
|
|
104
105
|
};
|
|
105
106
|
|
|
106
107
|
/** How a mode is spelled in a refusal — the words on the Editor axis, not the internal ids. */
|
|
107
|
-
const MODE_WORDS
|
|
108
|
+
const MODE_WORDS = { design: "Design", source: "Code" } as const;
|
|
108
109
|
|
|
109
110
|
/** Said by a diff lens whose comparison came back empty. One sentence, one home. */
|
|
110
111
|
const DIFF_UNREADABLE = "Could not read this file's comparison against HEAD.";
|
|
@@ -399,9 +400,7 @@ function companionTarget(
|
|
|
399
400
|
hit is transient — `iframe-host.ts` clears it the moment the author clicks page content —
|
|
400
401
|
so the page's own layout remains the answer for a derivation created from the preset menu. */
|
|
401
402
|
const hit = shell.layoutSelection;
|
|
402
|
-
const path =
|
|
403
|
-
hit?.layoutFile ??
|
|
404
|
-
getEffectiveLayoutPath(source.doc.document.$layout as string | false | undefined);
|
|
403
|
+
const path = hit?.layoutFile ?? getEffectiveLayoutPath(source.doc.document.$layout);
|
|
405
404
|
return path === null
|
|
406
405
|
? {
|
|
407
406
|
...base,
|
|
@@ -421,7 +420,7 @@ function companionTarget(
|
|
|
421
420
|
was a condition with no false branch, and an unreachable branch is a claim nobody can
|
|
422
421
|
check. What stops a node path from layout A landing inside layout B is
|
|
423
422
|
{@link selectInPane}, which compares against the document actually on screen. */
|
|
424
|
-
select: hit ?
|
|
423
|
+
select: hit ? hit.layoutPath : null,
|
|
425
424
|
status: "ready",
|
|
426
425
|
};
|
|
427
426
|
}
|
|
@@ -534,7 +533,7 @@ export function componentPathUnderSelection(tab: Tab | null): string | null {
|
|
|
534
533
|
if (entry?.path) {
|
|
535
534
|
return entry.path;
|
|
536
535
|
}
|
|
537
|
-
path = parentElementPath(path)
|
|
536
|
+
path = parentElementPath(path);
|
|
538
537
|
}
|
|
539
538
|
return null;
|
|
540
539
|
}
|
|
@@ -758,7 +757,7 @@ function loadDiffFor(paneId: string, target: DerivedTarget, deps: DerivationDeps
|
|
|
758
757
|
cannot re-enter, because neither of those answers carries a `diffPath`. */
|
|
759
758
|
applyDerivation(paneId, deps);
|
|
760
759
|
})
|
|
761
|
-
.catch((error
|
|
760
|
+
.catch((error) => {
|
|
762
761
|
console.error("loadDiff error:", error);
|
|
763
762
|
});
|
|
764
763
|
}
|
|
@@ -808,7 +807,7 @@ function probeTranslationFor(paneId: string, target: DerivedTarget, deps: Deriva
|
|
|
808
807
|
them carries a `probePath`, so this cannot re-enter. */
|
|
809
808
|
applyDerivation(paneId, deps);
|
|
810
809
|
})
|
|
811
|
-
.catch((error
|
|
810
|
+
.catch((error) => {
|
|
812
811
|
console.error("fileExists error:", error);
|
|
813
812
|
});
|
|
814
813
|
}
|
|
@@ -1016,8 +1015,7 @@ export function presetRefusal(
|
|
|
1016
1015
|
which `paneIsEmpty` will not collapse, whose strip drew nothing and whose stage drew nothing.
|
|
1017
1016
|
`component` is deliberately NOT refused the same way — "select an element inside a component"
|
|
1018
1017
|
is a rule that resolves on the next click, which is the whole point of leaving it open. */
|
|
1019
|
-
return getEffectiveLayoutPath(source.doc.document.$layout
|
|
1020
|
-
null
|
|
1018
|
+
return getEffectiveLayoutPath(source.doc.document.$layout) === null
|
|
1021
1019
|
? "a page with a layout — this one declares none"
|
|
1022
1020
|
: null;
|
|
1023
1021
|
}
|