@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
|
@@ -3,14 +3,16 @@
|
|
|
3
3
|
* Layers panel — the Outline: the document tree, with collapse, selection, drag-and-drop
|
|
4
4
|
* reordering, and per-row actions that are RENDERINGS of the command registry.
|
|
5
5
|
*
|
|
6
|
-
* **One panel, two bodies, and both of them are documents
|
|
7
|
-
* `surfaces/panel-outline.json`; the
|
|
6
|
+
* **One panel, two bodies, and both of them are documents.** The tree is
|
|
7
|
+
* `surfaces/panel-outline.json`; the element catalogue a document's Elements view lists is
|
|
8
8
|
* `surfaces/panel-stylebook-layers.json` (`panels/stylebook-layers-panel.ts`). This module renders
|
|
9
|
-
* neither. It owns the record
|
|
9
|
+
* neither. It owns the record (only the record can know which body the pane is asking for) and
|
|
10
10
|
* everything that is a DECISION: which rows exist and in what order, what a row is called, what the
|
|
11
11
|
* window onto them is, which verbs the registry places on which row, and the whole of the keyboard
|
|
12
12
|
* model. The surface reads values. The two bodies are appended into the same `.panel-content`, so
|
|
13
|
-
* each mode takes the other's document down on the way in
|
|
13
|
+
* each mode takes the other's document down on the way in. The Variables view has no body here:
|
|
14
|
+
* `project.json`'s custom properties are listed by the Styles workspace's own Navigator panel
|
|
15
|
+
* (`panels/styles-panel.ts`, §7.1).
|
|
14
16
|
*
|
|
15
17
|
* Four things this file is deliberate about.
|
|
16
18
|
*
|
|
@@ -27,7 +29,7 @@
|
|
|
27
29
|
* **A row says something.** On a real page the tree was a wall of rows all reading "div": only
|
|
28
30
|
* text-bearing nodes got a preview and containers got the tag they already wear as a coloured
|
|
29
31
|
* badge. {@link outlineLabel} derives an identity instead — a title, an `$id`, a class, a landmark
|
|
30
|
-
* name, the
|
|
32
|
+
* name, the text it owns (never a descendant row's) — and returns "" rather than repeat the badge.
|
|
31
33
|
*
|
|
32
34
|
* **It is a tree, and it is reachable.** `role="tree"` / `role="treeitem"` with a roving tabindex
|
|
33
35
|
* and the arrow-key model ARIA specifies: ↑↓ walk the visible rows, → expands then descends, ←
|
|
@@ -47,7 +49,15 @@
|
|
|
47
49
|
*/
|
|
48
50
|
|
|
49
51
|
import { nothing } from "lit-html";
|
|
50
|
-
import {
|
|
52
|
+
import {
|
|
53
|
+
displayTagName,
|
|
54
|
+
isMappedArray,
|
|
55
|
+
isNonNullObject,
|
|
56
|
+
isNumber,
|
|
57
|
+
isString,
|
|
58
|
+
isTagExpression,
|
|
59
|
+
tagNameCandidates,
|
|
60
|
+
} from "@jxsuite/schema/guards";
|
|
51
61
|
import {
|
|
52
62
|
VOID_ELEMENTS,
|
|
53
63
|
childIndex,
|
|
@@ -60,7 +70,7 @@ import {
|
|
|
60
70
|
} from "../store";
|
|
61
71
|
import { activeTab } from "../workspace/workspace";
|
|
62
72
|
import {
|
|
63
|
-
isSelected
|
|
73
|
+
isSelected,
|
|
64
74
|
primarySelection,
|
|
65
75
|
rangeSelection,
|
|
66
76
|
selectionAnchor,
|
|
@@ -72,8 +82,14 @@ import { mutateUpdateProperty, transactDoc } from "../tabs/transact";
|
|
|
72
82
|
import { view } from "../view";
|
|
73
83
|
import { setActivityTab } from "../shell";
|
|
74
84
|
import { registerPanel } from "./panel-registry";
|
|
75
|
-
import {
|
|
85
|
+
import {
|
|
86
|
+
INDENT_BASE,
|
|
87
|
+
INDENT_STEP,
|
|
88
|
+
detachStylebookLayers,
|
|
89
|
+
mountStylebookLayersPanel,
|
|
90
|
+
} from "./stylebook-layers-panel";
|
|
76
91
|
import { selectStylebookTag, stylebookMeta } from "./stylebook-panel";
|
|
92
|
+
import { PROJECT_STYLES_VIEW } from "../style/project-styles";
|
|
77
93
|
import { isInlineElement } from "../editor/inline-edit";
|
|
78
94
|
import { showContextMenu } from "../editor/context-menu";
|
|
79
95
|
import { revealPathInCanvas } from "../canvas/popover-state";
|
|
@@ -115,17 +131,17 @@ const TEXT_PREVIEW_MAX = 40;
|
|
|
115
131
|
* Deliberately short. `section`, `ul` and `table` are omitted: "Section" next to a `section` badge
|
|
116
132
|
* is the repetition this function exists to remove.
|
|
117
133
|
*/
|
|
118
|
-
const LANDMARK_NAMES:
|
|
119
|
-
article
|
|
120
|
-
aside
|
|
121
|
-
dialog
|
|
122
|
-
figure
|
|
123
|
-
footer
|
|
124
|
-
form
|
|
125
|
-
header
|
|
126
|
-
main
|
|
127
|
-
nav
|
|
128
|
-
|
|
134
|
+
const LANDMARK_NAMES: ReadonlyMap<string, string> = new Map([
|
|
135
|
+
["article", "Article"],
|
|
136
|
+
["aside", "Sidebar"],
|
|
137
|
+
["dialog", "Dialog"],
|
|
138
|
+
["figure", "Figure"],
|
|
139
|
+
["footer", "Footer"],
|
|
140
|
+
["form", "Form"],
|
|
141
|
+
["header", "Header"],
|
|
142
|
+
["main", "Main"],
|
|
143
|
+
["nav", "Navigation"],
|
|
144
|
+
]);
|
|
129
145
|
|
|
130
146
|
/** Trim and ellipsize to {@link LABEL_MAX}. */
|
|
131
147
|
function truncate(text: string): string {
|
|
@@ -134,37 +150,38 @@ function truncate(text: string): string {
|
|
|
134
150
|
}
|
|
135
151
|
|
|
136
152
|
/**
|
|
137
|
-
* The
|
|
153
|
+
* The text `node` OWNS, or "": its string children, and the text of its inline children.
|
|
138
154
|
*
|
|
139
|
-
*
|
|
140
|
-
*
|
|
141
|
-
*
|
|
155
|
+
* Inline children (`strong`, `a`, …) never get a row of their own ({@link buildOutlineRows} skips
|
|
156
|
+
* them), so their words belong to the row that holds them. A block child's text does not: it is
|
|
157
|
+
* that child's row's to show. Borrowing it — what the bounded "first text under" walk did — made a
|
|
158
|
+
* `section > div > div > h2` read the heading four times over, one row above the other.
|
|
142
159
|
*/
|
|
143
|
-
function
|
|
144
|
-
if (
|
|
160
|
+
function ownText(node: JxMutableNode): string {
|
|
161
|
+
if (isString(node.textContent)) {
|
|
145
162
|
return node.textContent.trim();
|
|
146
163
|
}
|
|
147
|
-
if (
|
|
164
|
+
if (!Array.isArray(node.children)) {
|
|
148
165
|
return "";
|
|
149
166
|
}
|
|
167
|
+
let text = "";
|
|
150
168
|
for (const child of node.children) {
|
|
151
|
-
if (
|
|
152
|
-
|
|
169
|
+
if (isString(child)) {
|
|
170
|
+
text += child;
|
|
171
|
+
} else if (isNonNullObject(child) && isInlineElement(child, node)) {
|
|
172
|
+
text += ownText(child);
|
|
153
173
|
}
|
|
154
|
-
if (
|
|
155
|
-
|
|
156
|
-
if (found) {
|
|
157
|
-
return found;
|
|
158
|
-
}
|
|
174
|
+
if (text.length > LABEL_MAX * 2) {
|
|
175
|
+
break;
|
|
159
176
|
}
|
|
160
177
|
}
|
|
161
|
-
return
|
|
178
|
+
return text.trim();
|
|
162
179
|
}
|
|
163
180
|
|
|
164
181
|
/** The node's first class name, when it has a plain (unbound) `class` attribute. */
|
|
165
182
|
function firstClass(node: JxMutableNode): string {
|
|
166
183
|
const value = node.attributes?.class;
|
|
167
|
-
return
|
|
184
|
+
return isString(value) ? (value.trim().split(/\s+/u)[0] ?? "") : "";
|
|
168
185
|
}
|
|
169
186
|
|
|
170
187
|
/**
|
|
@@ -188,20 +205,20 @@ export function outlineLabel(node: JxMutableNode): string {
|
|
|
188
205
|
if (node.$id) {
|
|
189
206
|
return `#${truncate(node.$id)}`;
|
|
190
207
|
}
|
|
191
|
-
if (
|
|
208
|
+
if (isString(node.textContent) && node.textContent.trim()) {
|
|
192
209
|
return truncate(node.textContent);
|
|
193
210
|
}
|
|
194
211
|
const cls = firstClass(node);
|
|
195
212
|
if (cls) {
|
|
196
213
|
return `.${truncate(cls)}`;
|
|
197
214
|
}
|
|
198
|
-
const landmark = LANDMARK_NAMES
|
|
215
|
+
const landmark = LANDMARK_NAMES.get(displayTagName(node.tagName).toLowerCase());
|
|
199
216
|
if (landmark) {
|
|
200
217
|
return landmark;
|
|
201
218
|
}
|
|
202
|
-
const
|
|
203
|
-
if (
|
|
204
|
-
return `“${truncate(
|
|
219
|
+
const own = ownText(node);
|
|
220
|
+
if (own) {
|
|
221
|
+
return `“${truncate(own)}”`;
|
|
205
222
|
}
|
|
206
223
|
const count = Array.isArray(node.children) ? node.children.length : 0;
|
|
207
224
|
return count > 0 ? `${count} item${count === 1 ? "" : "s"}` : "";
|
|
@@ -256,12 +273,11 @@ export function rowCommandViews(
|
|
|
256
273
|
// ─── The tree, as a keyboard surface ─────────────────────────────────────────
|
|
257
274
|
|
|
258
275
|
/**
|
|
259
|
-
*
|
|
260
|
-
*
|
|
276
|
+
* The depth past which the column stops paying. The pixels per level and the row's own gutter are
|
|
277
|
+
* the Stylebook layers panel's {@link INDENT_STEP} and {@link INDENT_BASE}, so the two trees indent
|
|
278
|
+
* alike.
|
|
261
279
|
*/
|
|
262
|
-
const INDENT_STEP = 16;
|
|
263
280
|
const INDENT_MAX_DEPTH = 6;
|
|
264
|
-
const INDENT_BASE = 8;
|
|
265
281
|
|
|
266
282
|
/**
|
|
267
283
|
* The indent for `depth`, capped.
|
|
@@ -275,7 +291,7 @@ export function indentWidth(depth: number): number {
|
|
|
275
291
|
|
|
276
292
|
/** The inverse of {@link pathKey}: numeric segments come back as numbers, as the doc stores them. */
|
|
277
293
|
function pathFromKey(key: string): JxPath {
|
|
278
|
-
return key ?
|
|
294
|
+
return key ? key.split("/").map((s) => (/^\d+$/u.test(s) ? Number(s) : s)) : [];
|
|
279
295
|
}
|
|
280
296
|
|
|
281
297
|
// ─── The row model, and the window onto it ───────────────────────────────────
|
|
@@ -288,7 +304,7 @@ function pathFromKey(key: string): JxPath {
|
|
|
288
304
|
* window only. Splitting the two is the whole saving — the expensive half is the kit elements a
|
|
289
305
|
* row's cluster mounts, not the walk that finds it.
|
|
290
306
|
*/
|
|
291
|
-
interface
|
|
307
|
+
interface OutlineRowFacts {
|
|
292
308
|
/** `pathKey(path)` — the drag-and-drop and roving-focus key, and the `$map`'s reconcile key. */
|
|
293
309
|
key: string;
|
|
294
310
|
path: JxPath;
|
|
@@ -303,7 +319,6 @@ interface OutlineRow {
|
|
|
303
319
|
* than quietly start selecting text nodes.
|
|
304
320
|
*/
|
|
305
321
|
item: boolean;
|
|
306
|
-
node: JxMutableNode | string | number | boolean;
|
|
307
322
|
nodeType: string;
|
|
308
323
|
/** 1-based position among the row's `role="treeitem"` siblings — see {@link numberOutlineSets}. */
|
|
309
324
|
posInSet: number;
|
|
@@ -311,6 +326,20 @@ interface OutlineRow {
|
|
|
311
326
|
setSize: number;
|
|
312
327
|
}
|
|
313
328
|
|
|
329
|
+
/** A `role="treeitem"` row: an element, a repeater, a template or a case, always an object node. */
|
|
330
|
+
interface OutlineItemRow extends OutlineRowFacts {
|
|
331
|
+
item: true;
|
|
332
|
+
node: JxMutableNode;
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
/** A text-node row: drawn, but not a tree item. Its node is the bare child primitive. */
|
|
336
|
+
interface OutlineTextRow extends OutlineRowFacts {
|
|
337
|
+
item: false;
|
|
338
|
+
node: JxMutableNode | string | number | boolean;
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
type OutlineRow = OutlineItemRow | OutlineTextRow;
|
|
342
|
+
|
|
314
343
|
/**
|
|
315
344
|
* The declared height of one row — `surfaces/panel-outline.json`'s `[part="row"] { block-size }`.
|
|
316
345
|
*
|
|
@@ -456,6 +485,11 @@ function watchOutlineTree(): void {
|
|
|
456
485
|
* reorder, canvas to Outline sync, a collaborator's cursor, a jump from Problems — needs the
|
|
457
486
|
* unambiguous one.
|
|
458
487
|
*/
|
|
488
|
+
/** Whether a decoded `data-jx-path` is a path: an array of string and number segments. */
|
|
489
|
+
function isJxPath(value: unknown): value is JxPath {
|
|
490
|
+
return Array.isArray(value) && value.every((segment) => isString(segment) || isNumber(segment));
|
|
491
|
+
}
|
|
492
|
+
|
|
459
493
|
export function outlineRowPath(el: Element | null): JxPath | null {
|
|
460
494
|
const row = el?.closest<HTMLElement>("[data-jx-path]");
|
|
461
495
|
if (!row?.dataset.jxPath) {
|
|
@@ -463,7 +497,7 @@ export function outlineRowPath(el: Element | null): JxPath | null {
|
|
|
463
497
|
}
|
|
464
498
|
try {
|
|
465
499
|
const parsed: unknown = JSON.parse(row.dataset.jxPath);
|
|
466
|
-
return
|
|
500
|
+
return isJxPath(parsed) ? parsed : null;
|
|
467
501
|
} catch {
|
|
468
502
|
return null;
|
|
469
503
|
}
|
|
@@ -674,7 +708,7 @@ function outlineRowLabel(row: OutlineRow): string {
|
|
|
674
708
|
const text = String(row.node);
|
|
675
709
|
return text.length > TEXT_PREVIEW_MAX ? `${text.slice(0, TEXT_PREVIEW_MAX)}…` : text;
|
|
676
710
|
}
|
|
677
|
-
const node = row
|
|
711
|
+
const { node } = row;
|
|
678
712
|
return row.nodeType === "case-ref" ? node.$ref || "external" : outlineLabel(node);
|
|
679
713
|
}
|
|
680
714
|
|
|
@@ -733,7 +767,7 @@ export function startLayerTitleEdit(path: JxPath, rerender: () => void) {
|
|
|
733
767
|
/* The row's own node, not a second `getNodeAtPath` walk: the model already holds it, and reading
|
|
734
768
|
it back off the model is what makes "a text line has no `$title` to write" a real branch rather
|
|
735
769
|
than a defensive null check nothing can reach. */
|
|
736
|
-
if (!row?.item
|
|
770
|
+
if (!row?.item) {
|
|
737
771
|
return;
|
|
738
772
|
}
|
|
739
773
|
_editing = { key: row.key, rerender, text: row.node.$title || "" };
|
|
@@ -827,9 +861,11 @@ function buildOutlineRows(doc: JxMutableNode, mode: string, collapsed: Set<strin
|
|
|
827
861
|
}
|
|
828
862
|
|
|
829
863
|
const isText = nodeType === "text";
|
|
864
|
+
/** The row's node when it is a tree item; `null` for a text-node row. */
|
|
865
|
+
let element: JxMutableNode | null = null;
|
|
830
866
|
if (!isText) {
|
|
831
867
|
// After the text-node branch, a row's node is a JxMutableNode or it is not a row at all.
|
|
832
|
-
if (
|
|
868
|
+
if (!isNonNullObject(node)) {
|
|
833
869
|
continue;
|
|
834
870
|
}
|
|
835
871
|
if (path.length >= 2 && nodeType === "element") {
|
|
@@ -839,22 +875,28 @@ function buildOutlineRows(doc: JxMutableNode, mode: string, collapsed: Set<strin
|
|
|
839
875
|
continue;
|
|
840
876
|
}
|
|
841
877
|
}
|
|
878
|
+
element = node;
|
|
842
879
|
}
|
|
843
880
|
|
|
844
881
|
while (ancestors.length > 0 && rows[ancestors.at(-1)!]!.depth >= depth) {
|
|
845
882
|
ancestors.pop();
|
|
846
883
|
}
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
884
|
+
const parent = ancestors.at(-1) ?? -1;
|
|
885
|
+
rows.push(
|
|
886
|
+
element === null
|
|
887
|
+
? { depth, item: false, key, node, nodeType, parent, path, posInSet: 0, setSize: 0 }
|
|
888
|
+
: {
|
|
889
|
+
depth,
|
|
890
|
+
item: true,
|
|
891
|
+
key,
|
|
892
|
+
node: element,
|
|
893
|
+
nodeType,
|
|
894
|
+
parent,
|
|
895
|
+
path,
|
|
896
|
+
posInSet: 0,
|
|
897
|
+
setSize: 0,
|
|
898
|
+
},
|
|
899
|
+
);
|
|
858
900
|
ancestors.push(rows.length - 1);
|
|
859
901
|
}
|
|
860
902
|
return numberOutlineSets(rows);
|
|
@@ -890,30 +932,20 @@ function numberOutlineSets(rows: OutlineRow[]): OutlineRow[] {
|
|
|
890
932
|
|
|
891
933
|
/** Whether the row has anything under it — children, a map template, or `$switch` cases. */
|
|
892
934
|
function isExpandable(row: OutlineRow): boolean {
|
|
893
|
-
if (!row.item
|
|
935
|
+
if (!row.item) {
|
|
894
936
|
return false;
|
|
895
937
|
}
|
|
896
|
-
const node = row
|
|
938
|
+
const { node } = row;
|
|
897
939
|
const hasChildren = Array.isArray(node.children) && node.children.length > 0;
|
|
898
|
-
const hasMapChildren =
|
|
899
|
-
node.children !== undefined &&
|
|
900
|
-
typeof node.children === "object" &&
|
|
901
|
-
(node.children as unknown as Record<string, unknown>).$prototype === "Array";
|
|
940
|
+
const hasMapChildren = isMappedArray(node.children);
|
|
902
941
|
const hasCases =
|
|
903
|
-
Boolean(node.$switch) &&
|
|
904
|
-
typeof node.cases === "object" &&
|
|
905
|
-
node.cases !== null &&
|
|
906
|
-
Object.keys(node.cases).length > 0;
|
|
942
|
+
Boolean(node.$switch) && isNonNullObject(node.cases) && Object.keys(node.cases).length > 0;
|
|
907
943
|
return hasChildren || hasMapChildren || hasCases || (row.nodeType === "map" && Boolean(node.map));
|
|
908
944
|
}
|
|
909
945
|
|
|
910
946
|
/** The badge: what it says, which of the six drawings it gets, and what it says on hover. */
|
|
911
|
-
function rowBadge(row:
|
|
912
|
-
|
|
913
|
-
badgeKind: string;
|
|
914
|
-
badgeTitle: string | null;
|
|
915
|
-
} {
|
|
916
|
-
const node = row.node as JxMutableNode;
|
|
947
|
+
function rowBadge(row: OutlineItemRow): Pick<OutlineRowView, "badge" | "badgeKind" | "badgeTitle"> {
|
|
948
|
+
const { node } = row;
|
|
917
949
|
if (row.nodeType === "map") {
|
|
918
950
|
return { badge: "↻", badgeKind: "map", badgeTitle: "Repeating list — one copy per item" };
|
|
919
951
|
}
|
|
@@ -930,9 +962,7 @@ function rowBadge(row: OutlineRow): {
|
|
|
930
962
|
badge: "▣",
|
|
931
963
|
badgeKind: "slot",
|
|
932
964
|
badgeTitle:
|
|
933
|
-
|
|
934
|
-
? `Slot "${slotName.trim()}"`
|
|
935
|
-
: "Default slot",
|
|
965
|
+
isString(slotName) && slotName.trim() ? `Slot "${slotName.trim()}"` : "Default slot",
|
|
936
966
|
};
|
|
937
967
|
}
|
|
938
968
|
/* The ROW BADGE, which is the one place the tag is shown as itself rather than folded into a
|
|
@@ -994,10 +1024,9 @@ function outlineRowView(
|
|
|
994
1024
|
if (!row.item) {
|
|
995
1025
|
return textRowView(row);
|
|
996
1026
|
}
|
|
997
|
-
const { depth, key, nodeType, path } = row;
|
|
998
|
-
const node = row.node as JxMutableNode;
|
|
1027
|
+
const { depth, key, node, nodeType, path } = row;
|
|
999
1028
|
|
|
1000
|
-
const selected =
|
|
1029
|
+
const selected = isSelected(doc.selection, path);
|
|
1001
1030
|
const expandable = isExpandable(row);
|
|
1002
1031
|
// Array nodes can't accept dropped children (their content is the single map template), so they
|
|
1003
1032
|
// Block the make-child drop instruction like void elements do.
|
|
@@ -1006,8 +1035,7 @@ function outlineRowView(
|
|
|
1006
1035
|
// Array (repeater) nodes are first-class structural nodes — movable/draggable/deletable like
|
|
1007
1036
|
// Elements. Both sit at a numeric child index; templates (path tail "map") and case nodes do
|
|
1008
1037
|
// Not, so they stay selectable/editable but not structurally manipulable.
|
|
1009
|
-
const structural =
|
|
1010
|
-
(nodeType === "element" || nodeType === "map") && typeof childIndex(path) === "number";
|
|
1038
|
+
const structural = (nodeType === "element" || nodeType === "map") && isNumber(childIndex(path));
|
|
1011
1039
|
const isRoot = doc.mode === "content" ? path.length === 0 : path.length < 2;
|
|
1012
1040
|
const grabbable = structural && !isRoot;
|
|
1013
1041
|
const open = expandable && !collapsed.has(key);
|
|
@@ -1118,9 +1146,9 @@ export function outlineValues(): OutlineValues {
|
|
|
1118
1146
|
/**
|
|
1119
1147
|
* The surface standing in the Navigator, and the node it was mounted into.
|
|
1120
1148
|
*
|
|
1121
|
-
* One slot rather than a per-host map, for the reason `panels/
|
|
1122
|
-
*
|
|
1123
|
-
*
|
|
1149
|
+
* One slot rather than a per-host map, for the reason `panels/elements-panel.ts` gives: there is
|
|
1150
|
+
* one Navigator, so a mount into a DIFFERENT node is the old one being replaced, and holding both
|
|
1151
|
+
* would leave the first one's effects running against a scope nobody writes any more.
|
|
1124
1152
|
*/
|
|
1125
1153
|
let standing: { host: HTMLElement; handle: OutlineSurfaceHandle } | null = null;
|
|
1126
1154
|
/** Re-register drag-and-drop once the rows the projection asked for are actually in the DOM. */
|
|
@@ -1187,7 +1215,7 @@ function revealChangedSelection(): void {
|
|
|
1187
1215
|
function revealSelectedRow(): void {
|
|
1188
1216
|
const drawn = _outlineList?.querySelector(`${ROW_SELECTOR}[aria-selected="true"]`);
|
|
1189
1217
|
if (drawn) {
|
|
1190
|
-
drawn.scrollIntoView
|
|
1218
|
+
drawn.scrollIntoView({ behavior: "smooth", block: "nearest" });
|
|
1191
1219
|
return;
|
|
1192
1220
|
}
|
|
1193
1221
|
revealOutlineRow(outlineIndexOfPath(primarySelection(activeTab.value?.session.selection)));
|
|
@@ -1244,9 +1272,9 @@ export function mountOutlinePanel(
|
|
|
1244
1272
|
standing = {
|
|
1245
1273
|
handle: mountOutlineSurface(target, values, {
|
|
1246
1274
|
contextMenu: (_scope, event) => {
|
|
1247
|
-
const path = outlineRowPath(event.target
|
|
1248
|
-
if (path) {
|
|
1249
|
-
showContextMenu(event
|
|
1275
|
+
const path = outlineRowPath(event.target instanceof Element ? event.target : null);
|
|
1276
|
+
if (path && event instanceof MouseEvent) {
|
|
1277
|
+
showContextMenu(event, path, { rerender: () => _outlineRerender?.() });
|
|
1250
1278
|
redrawOutline();
|
|
1251
1279
|
}
|
|
1252
1280
|
},
|
|
@@ -1260,10 +1288,9 @@ export function mountOutlinePanel(
|
|
|
1260
1288
|
mount would, and the host decides when it is worth anything. An unconnected input
|
|
1261
1289
|
cannot take focus. */
|
|
1262
1290
|
queueMicrotask(() => {
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
input.select?.();
|
|
1291
|
+
if (element instanceof HTMLInputElement && element.isConnected) {
|
|
1292
|
+
element.focus();
|
|
1293
|
+
element.select();
|
|
1267
1294
|
}
|
|
1268
1295
|
});
|
|
1269
1296
|
},
|
|
@@ -1330,7 +1357,7 @@ export function mountOutlinePanel(
|
|
|
1330
1357
|
/**
|
|
1331
1358
|
* Take the tree down.
|
|
1332
1359
|
*
|
|
1333
|
-
* Called by the record when the pane starts showing
|
|
1360
|
+
* Called by the record when the pane starts showing an Elements view. Without it the document
|
|
1334
1361
|
* survives its own irrelevance: both bodies are appended into the same `.panel-content`, so the one
|
|
1335
1362
|
* nobody took down sits under the one that replaced it for the rest of the session.
|
|
1336
1363
|
*/
|
|
@@ -1365,18 +1392,20 @@ export function registerLayersPanel(): void {
|
|
|
1365
1392
|
requiresDocument: "Open a page to see the elements it is built from.",
|
|
1366
1393
|
/*
|
|
1367
1394
|
* One panel, two bodies, and neither of them is lit's. The body is a document either way, so
|
|
1368
|
-
* there is nothing for lit to draw here
|
|
1395
|
+
* there is nothing for lit to draw here: a document CLEARS nothing and is APPENDED, and lit's
|
|
1369
1396
|
* own comment markers inside `.panel-content` are what it finds its (empty) content by.
|
|
1370
1397
|
*/
|
|
1371
1398
|
render: (): PanelBody => nothing,
|
|
1372
1399
|
/*
|
|
1373
|
-
* `afterRender` runs on every repaint, and both mounts are idempotent
|
|
1400
|
+
* `afterRender` runs on every repaint, and both mounts are idempotent: the standing surface is
|
|
1374
1401
|
* updated where it is still there and re-mounted only where something has taken it out. The
|
|
1375
1402
|
* detach on each side is not symmetry for its own sake: the two documents are appended into the
|
|
1376
1403
|
* same node, so a body nobody took down would sit under the one that replaced it.
|
|
1377
1404
|
*/
|
|
1378
1405
|
afterRender: (ctx, host) => {
|
|
1379
|
-
|
|
1406
|
+
/* A document's Elements view lists the element catalogue; every other view draws the tree,
|
|
1407
|
+
Variables and Code included. */
|
|
1408
|
+
if (ctx.deps.getCanvasMode() === PROJECT_STYLES_VIEW) {
|
|
1380
1409
|
detachOutline();
|
|
1381
1410
|
mountStylebookLayersPanel({ selectStylebookTag, stylebookMeta }, host);
|
|
1382
1411
|
return;
|
package/src/panels/left-panel.ts
CHANGED
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
*/
|
|
28
28
|
|
|
29
29
|
import { render as litRender } from "lit-html";
|
|
30
|
-
import { leftPanel } from "../store";
|
|
30
|
+
import { leftPanel, requireShellRef } from "../store";
|
|
31
31
|
import { effect, effectScope } from "../reactivity";
|
|
32
32
|
import { activeTab } from "../workspace/workspace";
|
|
33
33
|
import { shell } from "../shell";
|
|
@@ -72,11 +72,28 @@ export function mount(deps: NavigatorPanelDeps) {
|
|
|
72
72
|
_deps = deps;
|
|
73
73
|
registerNavigatorPanels();
|
|
74
74
|
_dock = mountNavigatorDock(
|
|
75
|
-
leftPanel,
|
|
75
|
+
requireShellRef(leftPanel, "left-panel"),
|
|
76
76
|
{ panels: [panelView()] },
|
|
77
77
|
{
|
|
78
78
|
onContent: (panelId, host) => {
|
|
79
|
+
const switched = _content !== null && _content.panelId !== panelId;
|
|
79
80
|
_content = { host, panelId };
|
|
81
|
+
/* `#left-panel` is the ONE scroller every panel draws in (the dock's root is `display:
|
|
82
|
+
contents`), so its offset outlived the panel it belonged to: scrolled down to the Site
|
|
83
|
+
panel's Components, a click on Outline opened the Outline that far down. A different
|
|
84
|
+
panel is a different list, and it opens at its top. A repaint of the same panel keeps
|
|
85
|
+
its place, because the box is keyed on the panel and is not announced again.
|
|
86
|
+
In the next FRAME, not here: this runs while the dock is still building the new panel,
|
|
87
|
+
and a scroll write lays out the half-built document to clamp the offset (a forced
|
|
88
|
+
recalculation on every Navigator panel switch in the perf trace). The frame lays it out
|
|
89
|
+
anyway, and resets the offset before anything is painted. */
|
|
90
|
+
if (switched) {
|
|
91
|
+
requestAnimationFrame(() => {
|
|
92
|
+
if (_content?.host === host) {
|
|
93
|
+
requireShellRef(leftPanel, "left-panel").scrollTop = 0;
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
}
|
|
80
97
|
/* A MICROTASK, not this call. `onNodeCreated` fires the moment the element is CONSTRUCTED
|
|
81
98
|
and the runtime applies its attributes on the next line, so a panel's `afterRender` run
|
|
82
99
|
from here would be handed a content box with no `part` on it — and several panels find
|
|
@@ -93,20 +110,17 @@ export function mount(deps: NavigatorPanelDeps) {
|
|
|
93
110
|
_scope = effectScope();
|
|
94
111
|
_scope.run(() => {
|
|
95
112
|
effect(() => {
|
|
96
|
-
// Shell state is tracked with no tab open
|
|
97
|
-
//
|
|
113
|
+
// Shell state is tracked with no tab open: which panel is showing. A document-less rail tab
|
|
114
|
+
// Still repaints.
|
|
98
115
|
void shell.leftTab;
|
|
99
|
-
void shell.settingsTab;
|
|
100
|
-
void shell.git.status;
|
|
101
|
-
void shell.git.loading;
|
|
102
|
-
void shell.git.error;
|
|
103
|
-
void shell.git.subTab;
|
|
104
|
-
void shell.git.logEntries;
|
|
105
116
|
const tab = activeTab.value;
|
|
106
117
|
if (tab) {
|
|
107
118
|
// Track properties the Navigator's panels read
|
|
108
119
|
void tab.doc.document;
|
|
109
120
|
void tab.doc.mode;
|
|
121
|
+
// The editor too: the Outline draws the element catalogue beside a document's Elements
|
|
122
|
+
// View, and the tree beside every other.
|
|
123
|
+
void tab.session.ui.canvasMode;
|
|
110
124
|
// The whole SET, joined — a bare property read would not re-trigger when the selection
|
|
111
125
|
// Changes WITHIN the array, and §6.7's helpers always replace it but nothing enforces that.
|
|
112
126
|
void tab.session.selection.map((path) => path.join("/")).join("|");
|
|
@@ -180,7 +194,7 @@ function navigatorDocument(): NavigatorDocument | null {
|
|
|
180
194
|
return null;
|
|
181
195
|
}
|
|
182
196
|
return {
|
|
183
|
-
canvas: aTab.session.canvas
|
|
197
|
+
canvas: aTab.session.canvas,
|
|
184
198
|
content: aTab.doc.content,
|
|
185
199
|
document: aTab.doc.document,
|
|
186
200
|
documentPath: aTab.documentPath,
|
|
@@ -7,8 +7,10 @@
|
|
|
7
7
|
* Nothing here decides what a panel is called, what level it is, or what it draws — that would be
|
|
8
8
|
* the second definition site the registry exists to prevent.
|
|
9
9
|
*
|
|
10
|
-
* **Registration order is rail order** within a level group: PROJECT (
|
|
11
|
-
*
|
|
10
|
+
* **Registration order is rail order** within a level group: PROJECT (Site, then Files with the
|
|
11
|
+
* developer panels on) above the divider, DOCUMENT (Outline · Data, then Packages with the
|
|
12
|
+
* developer panels on) below it (§5.1). Search, Languages and Insert are registered rail-less:
|
|
13
|
+
* reachable by `view.setActivity` and the palette, with no button.
|
|
12
14
|
*
|
|
13
15
|
* **Every rail button opens the Navigator.** Problems used to hold the fourth PROJECT slot while
|
|
14
16
|
* its body was drawn in the Bottom dock, and paying for that took a per-dock branch in three
|
|
@@ -17,21 +19,22 @@
|
|
|
17
19
|
* The count reaches the user from the status bar the moment there is one.
|
|
18
20
|
*
|
|
19
21
|
* **Search is declared and hidden.** It is a surface a later phase builds (the palette's project
|
|
20
|
-
* index), and it
|
|
22
|
+
* index), and it is off the rail like every other panel the Design rail does not list (§5.1). A
|
|
21
23
|
* `when: () => false` record is the honest way to say "this exists in the design and not yet in the
|
|
22
|
-
* app": the id is reserved,
|
|
23
|
-
*
|
|
24
|
+
* app": the id is reserved, and the day it ships the only edit is deleting one predicate — as
|
|
25
|
+
* opposed to a stub button that lies to whoever clicks it.
|
|
24
26
|
*/
|
|
25
27
|
|
|
26
28
|
import { registerFilesPanel } from "../files/files";
|
|
27
29
|
import { registerDataPanel } from "./data-explorer";
|
|
28
30
|
import { registerInsertPanel } from "./elements-panel";
|
|
29
|
-
import { registerGitPanel } from "./git-panel";
|
|
30
31
|
import { registerI18nPanel } from "./i18n-panel";
|
|
31
|
-
import { registerPagePanel } from "./head-panel";
|
|
32
32
|
import { registerPackagesPanel } from "./imports-panel";
|
|
33
33
|
import { registerBottomPanels } from "./bottom-dock";
|
|
34
34
|
import { registerLayersPanel } from "./layers-panel";
|
|
35
|
+
import { registerSitePanel } from "./site-panel";
|
|
36
|
+
import { registerCollectionsPanel } from "./collections-panel";
|
|
37
|
+
import { registerStylesPanel } from "./styles-panel";
|
|
35
38
|
import { getPanel, listPanels, railPanelSet, registerPanel, resetPanels } from "./panel-registry";
|
|
36
39
|
import type { PanelRecord } from "./panel-registry";
|
|
37
40
|
|
|
@@ -45,14 +48,21 @@ const NOT_YET_BUILT = () => false;
|
|
|
45
48
|
* per window in the app, but a test suite mounts it per case.
|
|
46
49
|
*/
|
|
47
50
|
export function registerNavigatorPanels(): void {
|
|
48
|
-
// Keyed on
|
|
51
|
+
// Keyed on Site rather than on `listPanels("navigator")`, because the Bottom dock composes
|
|
49
52
|
// Itself independently (`bottomPanelSet()` calls `registerBottomPanels()` directly) and either
|
|
50
53
|
// Order has to leave this function still registering the Navigator's own eight.
|
|
51
|
-
if (getPanel("
|
|
54
|
+
if (getPanel("site")) {
|
|
52
55
|
return;
|
|
53
56
|
}
|
|
54
57
|
|
|
55
58
|
// ── PROJECT group ───────────────────────────────────────────────────────────
|
|
59
|
+
registerSitePanel();
|
|
60
|
+
/* The Content workspace's Navigator (§22.5): off the rail, because Content draws none, and opened
|
|
61
|
+
by that workspace's frame. */
|
|
62
|
+
registerCollectionsPanel();
|
|
63
|
+
/* The Styles workspace's Navigator (§7.1): variables, element defaults and color schemes, off the
|
|
64
|
+
rail for the same reason. */
|
|
65
|
+
registerStylesPanel();
|
|
56
66
|
registerFilesPanel();
|
|
57
67
|
registerPanel({
|
|
58
68
|
id: "search",
|
|
@@ -60,10 +70,13 @@ export function registerNavigatorPanels(): void {
|
|
|
60
70
|
level: "project",
|
|
61
71
|
dock: "navigator",
|
|
62
72
|
icon: "magnifying-glass",
|
|
73
|
+
rail: false,
|
|
63
74
|
when: NOT_YET_BUILT,
|
|
64
75
|
render: () => nothingYet(),
|
|
65
76
|
});
|
|
66
|
-
|
|
77
|
+
/* No Source Control panel: its change list, commit and branch picker are the Publish workspace's
|
|
78
|
+
Review changes and Branches (§5.5, §22.8), and a Navigator beside that workspace would be a
|
|
79
|
+
second list of the same things. */
|
|
67
80
|
/* Off the rail, and registered in the PROJECT group anyway: registration order is roster order,
|
|
68
81
|
so this is what puts Languages beside the panels it belongs with in the palette and in
|
|
69
82
|
`panel.focus.*`. Its `when` is `project.isMultilingual` — a project written in one language
|
|
@@ -72,7 +85,6 @@ export function registerNavigatorPanels(): void {
|
|
|
72
85
|
|
|
73
86
|
// ── DOCUMENT group ──────────────────────────────────────────────────────────
|
|
74
87
|
registerLayersPanel();
|
|
75
|
-
registerPagePanel();
|
|
76
88
|
registerDataPanel();
|
|
77
89
|
registerPackagesPanel();
|
|
78
90
|
|