@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
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
/// <reference lib="dom" />
|
|
2
|
+
/**
|
|
3
|
+
* The Collections panel — the Content workspace's Navigator panel (`specs/studio.md` §22.5).
|
|
4
|
+
*
|
|
5
|
+
* Two lists, chosen by what the focused pane shows:
|
|
6
|
+
*
|
|
7
|
+
* - **The collections.** The built-in Pages and every collection `project.json` declares, in
|
|
8
|
+
* declaration order, each with its entry count (from the Content home's scan,
|
|
9
|
+
* `browse/library-pane.ts`) and its saved grid views beneath it (`grid/grid-layout.ts`), and **+
|
|
10
|
+
* New collection** at the foot. Choosing one shows it in the Content home
|
|
11
|
+
* (`content.showCollection`); choosing a saved view opens the collection's grid on it.
|
|
12
|
+
* - **One collection's entries**, while an entry of it is the focused document: thumbnail, title and
|
|
13
|
+
* status (`content/entry-summaries.ts`), under **‹ <Collection>** to go back, with **+ New
|
|
14
|
+
* <item>** at the foot. Choosing one opens it where it is written (`content/entry-open.ts`).
|
|
15
|
+
*
|
|
16
|
+
* The markup is `surfaces/collections-panel.json`; this module is the flow. It is registered with
|
|
17
|
+
* no rail button: Content has no rail, and the workspace's frame opens the Navigator on it
|
|
18
|
+
* (`shell.ts`'s `WORKSPACE_PRESETS`).
|
|
19
|
+
*
|
|
20
|
+
* @docs studio/projects/browse
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
import { nothing } from "lit-html";
|
|
24
|
+
import { projectState, renderOnly } from "../store";
|
|
25
|
+
import { activeTab } from "../workspace/workspace";
|
|
26
|
+
import { runActiveReported } from "../commands/run-reported";
|
|
27
|
+
import {
|
|
28
|
+
PAGES_COLLECTION,
|
|
29
|
+
collectionKeyOfPath,
|
|
30
|
+
contentCollection,
|
|
31
|
+
contentCollections,
|
|
32
|
+
} from "../content/content-collections";
|
|
33
|
+
import {
|
|
34
|
+
collectionCounts,
|
|
35
|
+
collectionEntryPaths,
|
|
36
|
+
collectionView,
|
|
37
|
+
shownCollectionKey,
|
|
38
|
+
} from "../browse/library-pane";
|
|
39
|
+
import { localeLabel, localeOfPath, resolveI18n } from "@jxsuite/schema/locale";
|
|
40
|
+
import { entryLocale } from "../content/collection-pages";
|
|
41
|
+
import { onEntrySummariesRead, peekEntrySummaries } from "../content/entry-summaries";
|
|
42
|
+
import { openEntry } from "../content/entry-open";
|
|
43
|
+
import { workspaceHomeTabId } from "../workspace/workspace-ids";
|
|
44
|
+
import { makeGridTabId, parseGridTabId } from "../grid/grid-source";
|
|
45
|
+
import { applySavedView, listSavedViews } from "../grid/grid-layout";
|
|
46
|
+
import {
|
|
47
|
+
emptyCollectionsPanelValues,
|
|
48
|
+
mountCollectionsPanelSurface,
|
|
49
|
+
} from "../surfaces/collections-panel";
|
|
50
|
+
import { registerPanel } from "./panel-registry";
|
|
51
|
+
import type {
|
|
52
|
+
CollectionEntryRow,
|
|
53
|
+
CollectionRow,
|
|
54
|
+
CollectionsPanelActions,
|
|
55
|
+
CollectionsPanelSurfaceHandle,
|
|
56
|
+
CollectionsPanelValues,
|
|
57
|
+
} from "../surfaces/collections-panel";
|
|
58
|
+
import type { Tab } from "../tabs/tab";
|
|
59
|
+
|
|
60
|
+
/** The `source` every command run from here reports under. */
|
|
61
|
+
const SOURCE = "Collections";
|
|
62
|
+
|
|
63
|
+
/** The grid tab id a collection's saved views are stored under. */
|
|
64
|
+
export function collectionGridId(key: string): string {
|
|
65
|
+
return key === PAGES_COLLECTION
|
|
66
|
+
? makeGridTabId({ kind: "pages" })
|
|
67
|
+
: makeGridTabId({ kind: "collection", name: key });
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* The declared collection an entry tab is writing, or `null`: the focused document is a file a
|
|
72
|
+
* declared collection owns. Pages are Design's, so a page tab lists the collections. A file-backed
|
|
73
|
+
* collection's file is no entry either: its grid lists its records, so the panel lists the
|
|
74
|
+
* collections with that one selected.
|
|
75
|
+
*/
|
|
76
|
+
export function writingCollection(tab: Tab | null): string | null {
|
|
77
|
+
const key = collectionKeyOfPath(tab?.documentPath);
|
|
78
|
+
return key !== null && key !== PAGES_COLLECTION && !contentCollection(key)?.fileBacked
|
|
79
|
+
? key
|
|
80
|
+
: null;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/** The file-backed collection whose file a tab holds, or `null`. */
|
|
84
|
+
function fileCollectionOf(tab: Tab): string | null {
|
|
85
|
+
const key = collectionKeyOfPath(tab.documentPath);
|
|
86
|
+
return key !== null && contentCollection(key)?.fileBacked === true ? key : null;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/** The collection the focused pane is showing, for the list's selected row, or `null`. */
|
|
90
|
+
function shownKey(tab: Tab | null): string | null {
|
|
91
|
+
if (!tab) {
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
if (tab.id === workspaceHomeTabId("content")) {
|
|
95
|
+
return shownCollectionKey();
|
|
96
|
+
}
|
|
97
|
+
const grid = parseGridTabId(tab.id);
|
|
98
|
+
if (grid?.kind === "pages") {
|
|
99
|
+
return PAGES_COLLECTION;
|
|
100
|
+
}
|
|
101
|
+
return grid?.kind === "collection" ? grid.name : fileCollectionOf(tab);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/** The collection list. */
|
|
105
|
+
function collectionRows(tab: Tab | null): CollectionRow[] {
|
|
106
|
+
const counts = collectionCounts();
|
|
107
|
+
const selected = shownKey(tab);
|
|
108
|
+
return contentCollections().map((collection) => {
|
|
109
|
+
const count = counts?.get(collection.key);
|
|
110
|
+
return {
|
|
111
|
+
count: counts === null ? "" : String(count ?? 0),
|
|
112
|
+
key: collection.key,
|
|
113
|
+
selected: collection.key === selected ? "true" : "false",
|
|
114
|
+
title: collection.title,
|
|
115
|
+
views: listSavedViews(collectionGridId(collection.key)).map((view) => ({
|
|
116
|
+
key: `${collection.key}\n${view.name}`,
|
|
117
|
+
name: view.name,
|
|
118
|
+
})),
|
|
119
|
+
};
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/** Everything the panel draws right now. */
|
|
124
|
+
export function collectionsPanelValues(): CollectionsPanelValues {
|
|
125
|
+
const values = emptyCollectionsPanelValues();
|
|
126
|
+
if (!projectState) {
|
|
127
|
+
return values;
|
|
128
|
+
}
|
|
129
|
+
const tab = activeTab.value;
|
|
130
|
+
const writing = writingCollection(tab);
|
|
131
|
+
if (writing === null) {
|
|
132
|
+
return { ...values, body: "list", collections: collectionRows(tab) };
|
|
133
|
+
}
|
|
134
|
+
const collection = contentCollection(writing);
|
|
135
|
+
const counts = collectionCounts();
|
|
136
|
+
const paths = collectionEntryPaths(writing);
|
|
137
|
+
const summaries = counts === null ? null : peekEntrySummaries(writing, paths);
|
|
138
|
+
/* A multilingual collection's entries say which language each is in, and the list keeps to the
|
|
139
|
+
language the collection's view is filtered to: three translations of one exhibition are three
|
|
140
|
+
rows, and an unlabelled list of them reads as one entry listed thrice. */
|
|
141
|
+
const filter = collectionView(writing).locale;
|
|
142
|
+
const entries: CollectionEntryRow[] = (summaries ?? []).flatMap((entry) => {
|
|
143
|
+
const locale = entryLocale(entry.path) ?? "";
|
|
144
|
+
if (filter !== "" && locale !== filter) {
|
|
145
|
+
return [];
|
|
146
|
+
}
|
|
147
|
+
return [
|
|
148
|
+
{
|
|
149
|
+
art: entry.thumb === "" ? "glyph" : "image",
|
|
150
|
+
lang: locale,
|
|
151
|
+
locale: locale === "" ? "" : localeLabel(locale),
|
|
152
|
+
path: entry.path,
|
|
153
|
+
selected: entry.path === tab?.documentPath ? "true" : "false",
|
|
154
|
+
status: entry.status,
|
|
155
|
+
thumb: entry.thumb,
|
|
156
|
+
title: entry.title,
|
|
157
|
+
},
|
|
158
|
+
];
|
|
159
|
+
});
|
|
160
|
+
return {
|
|
161
|
+
...values,
|
|
162
|
+
backTitle: collection?.title ?? writing,
|
|
163
|
+
backCount: counts === null ? "" : String(paths.length),
|
|
164
|
+
body: "entries",
|
|
165
|
+
entries,
|
|
166
|
+
entriesState: summaries === null ? "loading" : entries.length === 0 ? "empty" : "listed",
|
|
167
|
+
newLabel: `New ${collection?.item ?? "entry"}`,
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// ─── Actions ─────────────────────────────────────────────────────────────────
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Open a collection's grid on a saved view.
|
|
175
|
+
*
|
|
176
|
+
* The view is written onto the grid's working layout first, so a grid opened now loads it. A grid
|
|
177
|
+
* already on screen has loaded its layout, so it is told through `grid.applyView`, the command the
|
|
178
|
+
* grid's own picker runs.
|
|
179
|
+
*/
|
|
180
|
+
async function applyCollectionView(key: string, name: string): Promise<void> {
|
|
181
|
+
const gridId = collectionGridId(key);
|
|
182
|
+
const showing = activeTab.value?.id === gridId;
|
|
183
|
+
applySavedView(gridId, name);
|
|
184
|
+
if (showing) {
|
|
185
|
+
await runActiveReported("grid.applyView", { name }, SOURCE);
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
const { openCollectionGrid, openPagesGrid } = await import("../grid/grid-open");
|
|
189
|
+
if (key === PAGES_COLLECTION) {
|
|
190
|
+
openPagesGrid();
|
|
191
|
+
} else {
|
|
192
|
+
openCollectionGrid(key);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
const ACTIONS: CollectionsPanelActions = {
|
|
197
|
+
applyView: (key, name) => {
|
|
198
|
+
const [collection = ""] = key.split("\n");
|
|
199
|
+
void applyCollectionView(collection, name);
|
|
200
|
+
},
|
|
201
|
+
back: () => {
|
|
202
|
+
const writing = writingCollection(activeTab.value);
|
|
203
|
+
if (writing !== null) {
|
|
204
|
+
void runActiveReported("content.showCollection", { collection: writing }, SOURCE);
|
|
205
|
+
}
|
|
206
|
+
},
|
|
207
|
+
newCollection: () => {
|
|
208
|
+
void runActiveReported("file.new", { kind: "collection" }, SOURCE);
|
|
209
|
+
},
|
|
210
|
+
newEntry: () => {
|
|
211
|
+
const writing = writingCollection(activeTab.value);
|
|
212
|
+
void runActiveReported(
|
|
213
|
+
"file.new",
|
|
214
|
+
writing === null
|
|
215
|
+
? { kind: "entry" }
|
|
216
|
+
: { collection: writing, kind: "entry", ...newEntryLocale(writing) },
|
|
217
|
+
SOURCE,
|
|
218
|
+
);
|
|
219
|
+
},
|
|
220
|
+
openEntry: (path) => {
|
|
221
|
+
void openEntry(path);
|
|
222
|
+
},
|
|
223
|
+
showCollection: (key) => {
|
|
224
|
+
void runActiveReported("content.showCollection", { collection: key }, SOURCE);
|
|
225
|
+
},
|
|
226
|
+
};
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* The language a new entry starts in from the entries list: the one the entry being written is in,
|
|
230
|
+
* else the one the collection's view is filtered to. Nothing when neither says, which leaves the
|
|
231
|
+
* dialog on the site's default.
|
|
232
|
+
*/
|
|
233
|
+
export function newEntryLocale(collection: string): { locale?: string } {
|
|
234
|
+
const { i18n } = resolveI18n(projectState?.projectConfig ?? {});
|
|
235
|
+
const path = activeTab.value?.documentPath ?? null;
|
|
236
|
+
const own = path === null ? null : localeOfPath(path, i18n);
|
|
237
|
+
const locale = own ?? collectionView(collection).locale;
|
|
238
|
+
return locale === "" ? {} : { locale };
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
// ─── Mounting ────────────────────────────────────────────────────────────────
|
|
242
|
+
|
|
243
|
+
interface StandingPanel {
|
|
244
|
+
host: HTMLElement;
|
|
245
|
+
handle: CollectionsPanelSurfaceHandle;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
let _standing: StandingPanel | null = null;
|
|
249
|
+
let _unlisten: (() => void) | null = null;
|
|
250
|
+
|
|
251
|
+
/** Repaint the Navigator, which repaints this panel when it is the one showing. */
|
|
252
|
+
function repaint(): void {
|
|
253
|
+
renderOnly("leftPanel");
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/** Mount the surface into `host`, or bring the one already there up to date. */
|
|
257
|
+
function mountInto(host: HTMLElement): void {
|
|
258
|
+
_unlisten ??= onEntrySummariesRead(repaint);
|
|
259
|
+
if (_standing && (_standing.host !== host || !_standing.handle.connected())) {
|
|
260
|
+
_standing.handle.dispose();
|
|
261
|
+
_standing = null;
|
|
262
|
+
}
|
|
263
|
+
if (_standing) {
|
|
264
|
+
_standing.handle.update(collectionsPanelValues());
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
_standing = {
|
|
268
|
+
handle: mountCollectionsPanelSurface(host, collectionsPanelValues(), ACTIONS),
|
|
269
|
+
host,
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
/**
|
|
274
|
+
* The Navigator's content area inside a panel body, where a mounted document goes (the reason is
|
|
275
|
+
* `panels/elements-panel.ts`'s: the body is lit's part, and its child is the box a panel owns).
|
|
276
|
+
*/
|
|
277
|
+
function contentArea(body: HTMLElement): HTMLElement {
|
|
278
|
+
return body.querySelector<HTMLElement>(".panel-content") ?? body;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
/**
|
|
282
|
+
* Contribute the Collections panel: project level (it lists the project's collections), no rail
|
|
283
|
+
* button (Content has no rail), the Content workspace's Navigator.
|
|
284
|
+
*/
|
|
285
|
+
export function registerCollectionsPanel(): void {
|
|
286
|
+
registerPanel({
|
|
287
|
+
id: "collections",
|
|
288
|
+
title: "Collections",
|
|
289
|
+
level: "project",
|
|
290
|
+
dock: "navigator",
|
|
291
|
+
icon: "stack",
|
|
292
|
+
rail: false,
|
|
293
|
+
render: () => nothing,
|
|
294
|
+
afterRender: (_ctx, host) => {
|
|
295
|
+
mountInto(contentArea(host));
|
|
296
|
+
},
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
/** Forget the mounted panel — tests, and a project switch. */
|
|
301
|
+
export function resetCollectionsPanel(): void {
|
|
302
|
+
_standing?.handle.dispose();
|
|
303
|
+
_standing = null;
|
|
304
|
+
_unlisten?.();
|
|
305
|
+
_unlisten = null;
|
|
306
|
+
}
|
|
@@ -9,28 +9,25 @@
|
|
|
9
9
|
import { defineElement, setSkipServerFunctions } from "@jxsuite/runtime";
|
|
10
10
|
import { projectState } from "../store";
|
|
11
11
|
import type { ComponentEntry } from "../files/components";
|
|
12
|
+
import type { JsonValue } from "@jxsuite/schema/types";
|
|
12
13
|
|
|
13
14
|
/**
|
|
14
15
|
* Render a live component preview by registering its custom element and instantiating it.
|
|
15
16
|
*
|
|
16
17
|
* @param {ComponentEntry} comp
|
|
18
|
+
* @param {ReadonlyMap<string, JsonValue>} [props] - Sample props (`browse/component-examples.ts`),
|
|
19
|
+
* set as properties before the instance connects, the way a parent's `$props` reach it (spec.md
|
|
20
|
+
* §16.2)
|
|
17
21
|
* @returns {Promise<HTMLElement>}
|
|
18
22
|
*/
|
|
19
|
-
export async function renderComponentPreview(
|
|
23
|
+
export async function renderComponentPreview(
|
|
24
|
+
comp: ComponentEntry,
|
|
25
|
+
props: ReadonlyMap<string, JsonValue> = new Map(),
|
|
26
|
+
) {
|
|
20
27
|
setSkipServerFunctions(true);
|
|
21
28
|
try {
|
|
22
|
-
if (comp
|
|
23
|
-
|
|
24
|
-
return _componentFallback(comp.tagName);
|
|
25
|
-
}
|
|
26
|
-
} else {
|
|
27
|
-
if (comp.path && !comp.path.endsWith(".json")) {
|
|
28
|
-
// Format-class component sources (e.g. markdown) can't be imported as modules
|
|
29
|
-
return _componentFallback(comp.tagName);
|
|
30
|
-
}
|
|
31
|
-
const root = projectState?.projectRoot;
|
|
32
|
-
const url = `${location.origin}/${root ? `${root}/` : ""}${comp.path}`;
|
|
33
|
-
await defineElement(url);
|
|
29
|
+
if (!(await defineComponent(comp))) {
|
|
30
|
+
return _componentFallback(comp.tagName);
|
|
34
31
|
}
|
|
35
32
|
const el = document.createElement(comp.tagName);
|
|
36
33
|
for (const p of comp.props || []) {
|
|
@@ -39,6 +36,13 @@ export async function renderComponentPreview(comp: ComponentEntry) {
|
|
|
39
36
|
el.setAttribute(p.name, val);
|
|
40
37
|
}
|
|
41
38
|
}
|
|
39
|
+
// Read at connection as the instance's own props, ahead of the attribute defaults above.
|
|
40
|
+
/* SAFETY: an element is an ordinary extensible object, so any string key can be written; the
|
|
41
|
+
instance reads each declared prop back off itself when it connects. */
|
|
42
|
+
const properties = el as HTMLElement & Record<string, JsonValue>;
|
|
43
|
+
for (const [name, value] of props) {
|
|
44
|
+
properties[name] = value;
|
|
45
|
+
}
|
|
42
46
|
return el;
|
|
43
47
|
} catch (error) {
|
|
44
48
|
console.warn("Component preview failed:", comp.tagName, error);
|
|
@@ -46,6 +50,24 @@ export async function renderComponentPreview(comp: ComponentEntry) {
|
|
|
46
50
|
}
|
|
47
51
|
}
|
|
48
52
|
|
|
53
|
+
/**
|
|
54
|
+
* Make sure a component's element is defined in this window, registering a project definition from
|
|
55
|
+
* its file. Answers whether the tag can now be instantiated: a package's element only when its
|
|
56
|
+
* package already defined it, and a format-class source (Markdown) never, since it cannot be
|
|
57
|
+
* imported as a module.
|
|
58
|
+
*/
|
|
59
|
+
export async function defineComponent(comp: ComponentEntry): Promise<boolean> {
|
|
60
|
+
if (comp.source === "npm") {
|
|
61
|
+
return Boolean(customElements.get(comp.tagName));
|
|
62
|
+
}
|
|
63
|
+
if (comp.path && !comp.path.endsWith(".json")) {
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
const root = projectState?.projectRoot;
|
|
67
|
+
await defineElement(`${location.origin}/${root ? `${root}/` : ""}${comp.path}`);
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
|
|
49
71
|
/** @param {string} tagName */
|
|
50
72
|
function _componentFallback(tagName: string) {
|
|
51
73
|
const fallback = document.createElement("div");
|
|
@@ -2,6 +2,15 @@
|
|
|
2
2
|
// ─── Data Explorer ──────────────────────────────────────────────────────────
|
|
3
3
|
|
|
4
4
|
import { nothing } from "lit-html";
|
|
5
|
+
import {
|
|
6
|
+
isBigInt,
|
|
7
|
+
isBoolean,
|
|
8
|
+
isFunction,
|
|
9
|
+
isNonNullObject,
|
|
10
|
+
isNumber,
|
|
11
|
+
isString,
|
|
12
|
+
isSymbol,
|
|
13
|
+
} from "@jxsuite/schema/guards";
|
|
5
14
|
import { activeTab } from "../workspace/workspace";
|
|
6
15
|
import { booleanArg, stringArg, stringProperty } from "../commands/command-args";
|
|
7
16
|
import { renderDataTreeSurface } from "../surfaces/panel-data";
|
|
@@ -9,6 +18,8 @@ import { registerPanel } from "./panel-registry";
|
|
|
9
18
|
import type { PanelBody } from "./panel-registry";
|
|
10
19
|
import type { DataTreeRow } from "../surfaces/panel-data";
|
|
11
20
|
import type { AnyCommand, CommandRegistry } from "../commands/registry";
|
|
21
|
+
import type { CommandArgValues } from "../commands/command-args";
|
|
22
|
+
import type { ScopeRecord, ScopeValue } from "../editor/merge-tags";
|
|
12
23
|
|
|
13
24
|
/**
|
|
14
25
|
* The focused tab's expansion record, created on first write.
|
|
@@ -22,7 +33,7 @@ function rowsUi(): Record<string, boolean> | null {
|
|
|
22
33
|
if (!ui) {
|
|
23
34
|
return null;
|
|
24
35
|
}
|
|
25
|
-
return
|
|
36
|
+
return ui.dataRows;
|
|
26
37
|
}
|
|
27
38
|
|
|
28
39
|
/*
|
|
@@ -44,7 +55,7 @@ function limitsUi(): Record<string, number> | null {
|
|
|
44
55
|
if (!ui) {
|
|
45
56
|
return null;
|
|
46
57
|
}
|
|
47
|
-
return
|
|
58
|
+
return ui.dataLimits;
|
|
48
59
|
}
|
|
49
60
|
|
|
50
61
|
/** The cap for one marker: the default, plus whatever the reader has asked for. */
|
|
@@ -89,34 +100,60 @@ function moreRow(
|
|
|
89
100
|
};
|
|
90
101
|
}
|
|
91
102
|
|
|
92
|
-
/**
|
|
93
|
-
|
|
94
|
-
|
|
103
|
+
/**
|
|
104
|
+
* A value as the tree prints it, capped at `max` characters. `undefined` prints as nothing, and so
|
|
105
|
+
* do a function and a symbol: those are the values `JSON.stringify` answers with no text at all.
|
|
106
|
+
*/
|
|
107
|
+
function valueText(value: ScopeValue, max: number): string {
|
|
108
|
+
if (isString(value) && value.length > max) {
|
|
95
109
|
return `"${value.slice(0, max)}…"`;
|
|
96
110
|
}
|
|
97
|
-
return
|
|
111
|
+
return value === undefined || isFunction(value) || isSymbol(value) ? "" : JSON.stringify(value);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/** Each primitive kind, in the spelling `typeof` gives it, with the guard that establishes it. */
|
|
115
|
+
const PRIMITIVE_KINDS: readonly (readonly [string, (value: ScopeValue) => boolean])[] = [
|
|
116
|
+
["string", isString],
|
|
117
|
+
["number", isNumber],
|
|
118
|
+
["boolean", isBoolean],
|
|
119
|
+
["bigint", isBigInt],
|
|
120
|
+
["symbol", isSymbol],
|
|
121
|
+
["function", isFunction],
|
|
122
|
+
];
|
|
123
|
+
|
|
124
|
+
/** The `typeof` name of a value that is neither `null` nor an object. */
|
|
125
|
+
function primitiveKind(value: ScopeValue): string {
|
|
126
|
+
return PRIMITIVE_KINDS.find(([, test]) => test(value))?.[0] ?? "undefined";
|
|
98
127
|
}
|
|
99
128
|
|
|
100
129
|
/** Which colour a value takes. `null` and a summary label are the two the tree actually paints. */
|
|
101
|
-
function toneOf(value:
|
|
102
|
-
return value === null ? "null" :
|
|
130
|
+
function toneOf(value: ScopeValue): string {
|
|
131
|
+
return value === null ? "null" : primitiveKind(value);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* A value the tree can open: an array or a record. `isNonNullObject` is a `typeof "object"` test,
|
|
136
|
+
* so it already refuses a function; this predicate is what tells the type checker so.
|
|
137
|
+
*/
|
|
138
|
+
function isOpenable(value: ScopeValue): value is ScopeValue[] | ScopeRecord {
|
|
139
|
+
return isNonNullObject(value);
|
|
103
140
|
}
|
|
104
141
|
|
|
105
142
|
/** `Array(3)` or `{2}` — what a value you can open says while it is closed. */
|
|
106
|
-
function summaryLabel(value:
|
|
143
|
+
function summaryLabel(value: ScopeValue[] | ScopeRecord): string {
|
|
107
144
|
return Array.isArray(value) ? `Array(${value.length})` : `{${Object.keys(value).length}}`;
|
|
108
145
|
}
|
|
109
146
|
|
|
110
147
|
/** Unwrap a Vue ref (has .value and .__v_isRef) to get the underlying value. */
|
|
111
|
-
export function unwrapSignal(value:
|
|
112
|
-
if (value &&
|
|
113
|
-
return
|
|
148
|
+
export function unwrapSignal(value: ScopeValue): ScopeValue {
|
|
149
|
+
if (isOpenable(value) && !Array.isArray(value) && value.__v_isRef) {
|
|
150
|
+
return value.value;
|
|
114
151
|
}
|
|
115
152
|
return value;
|
|
116
153
|
}
|
|
117
154
|
|
|
118
155
|
/** Type label for a signal value in the data explorer. */
|
|
119
|
-
export function dataTypeLabel(value:
|
|
156
|
+
export function dataTypeLabel(value: ScopeValue): string {
|
|
120
157
|
const v = unwrapSignal(value);
|
|
121
158
|
if (v === null) {
|
|
122
159
|
return "null";
|
|
@@ -127,10 +164,10 @@ export function dataTypeLabel(value: unknown) {
|
|
|
127
164
|
if (Array.isArray(v)) {
|
|
128
165
|
return `Array(${v.length})`;
|
|
129
166
|
}
|
|
130
|
-
if (
|
|
167
|
+
if (isOpenable(v)) {
|
|
131
168
|
return `{${Object.keys(v).length}}`;
|
|
132
169
|
}
|
|
133
|
-
return
|
|
170
|
+
return primitiveKind(v);
|
|
134
171
|
}
|
|
135
172
|
|
|
136
173
|
/* THE VALUE LIST IS GONE, AND ITS ROWS ARE THE DEFINITION ROWS — `panels/signals-panel.ts`.
|
|
@@ -148,14 +185,14 @@ export function dataTypeLabel(value: unknown) {
|
|
|
148
185
|
* each carry their own indent. Nothing else changed: the caps are the same caps, the text is
|
|
149
186
|
* truncated at the same lengths, and a capped list still ends in a marker.
|
|
150
187
|
*
|
|
151
|
-
* @param {
|
|
188
|
+
* @param {ScopeValue} value The resolved value to read.
|
|
152
189
|
* @param {number} depth How deep this call already is; the indent is derived from it.
|
|
153
190
|
* @param {number} [maxDepth] The default depth cap, before whatever the reader has raised.
|
|
154
191
|
* @param {string} path This subtree's path, which is what a raised limit is remembered against.
|
|
155
192
|
* @returns {DataTreeRow[]}
|
|
156
193
|
*/
|
|
157
194
|
export function dataTreeRows(
|
|
158
|
-
value:
|
|
195
|
+
value: ScopeValue,
|
|
159
196
|
depth: number,
|
|
160
197
|
maxDepth = 5,
|
|
161
198
|
path = "",
|
|
@@ -182,21 +219,21 @@ export function dataTreeRows(
|
|
|
182
219
|
if (value === null || value === undefined) {
|
|
183
220
|
return [row("", String(value), "null", path)];
|
|
184
221
|
}
|
|
185
|
-
if (
|
|
222
|
+
if (!isOpenable(value)) {
|
|
186
223
|
return [row("", valueText(value, 200), toneOf(value), path)];
|
|
187
224
|
}
|
|
188
225
|
|
|
189
226
|
const array = Array.isArray(value);
|
|
190
|
-
const entries: [string, string,
|
|
227
|
+
const entries: [string, string, ScopeValue][] = array
|
|
191
228
|
? value.map((item, i) => [`${i}`, `[${i}] `, item])
|
|
192
|
-
: Object.keys(value).map((key) => [key, `${key}: `,
|
|
229
|
+
: Object.keys(value).map((key) => [key, `${key}: `, value[key]]);
|
|
193
230
|
const limit = array ? "items" : "keys";
|
|
194
231
|
const cap = capFor(path, limit, array ? 20 : 30);
|
|
195
232
|
|
|
196
233
|
const rows: DataTreeRow[] = [];
|
|
197
234
|
for (const [segment, label, item] of entries.slice(0, cap)) {
|
|
198
235
|
const childPath = `${path}/${segment}`;
|
|
199
|
-
if (item
|
|
236
|
+
if (!isOpenable(item)) {
|
|
200
237
|
rows.push(row(label, valueText(item, 80), toneOf(item), childPath));
|
|
201
238
|
continue;
|
|
202
239
|
}
|
|
@@ -222,14 +259,14 @@ export function dataTreeRows(
|
|
|
222
259
|
* repaint instead of this sweeping per host.
|
|
223
260
|
*
|
|
224
261
|
* @param {HTMLElement} host The node the tree is drawn into.
|
|
225
|
-
* @param {
|
|
262
|
+
* @param {ScopeValue} value What the canvas resolved this entry to.
|
|
226
263
|
* @param {string} path The subtree's path, which is what a raised limit is remembered against.
|
|
227
264
|
* @param {() => void} rerender Repaint the panel, so that a raised limit is drawn.
|
|
228
265
|
* @param {number} [maxDepth] The default depth cap, before whatever the reader has raised.
|
|
229
266
|
*/
|
|
230
267
|
export function paintDataTree(
|
|
231
268
|
host: HTMLElement,
|
|
232
|
-
value:
|
|
269
|
+
value: ScopeValue,
|
|
233
270
|
path: string,
|
|
234
271
|
rerender: () => void,
|
|
235
272
|
maxDepth = 5,
|
|
@@ -327,7 +364,7 @@ export function dataExplorerCommands(deps: DataExplorerCommandDeps): AnyCommand[
|
|
|
327
364
|
group: "5_data",
|
|
328
365
|
requires: "an open document that defines data",
|
|
329
366
|
when: (ctx) => ctx.document.open,
|
|
330
|
-
run: (_commandCtx, args) => {
|
|
367
|
+
run: (_commandCtx, args: CommandArgValues) => {
|
|
331
368
|
const name = stringArg("data.expandRow", args, "name");
|
|
332
369
|
const defined = definedDataNames();
|
|
333
370
|
if (!defined.includes(name)) {
|
|
@@ -336,7 +373,7 @@ export function dataExplorerCommands(deps: DataExplorerCommandDeps): AnyCommand[
|
|
|
336
373
|
`document — it defines: ${defined.length > 0 ? defined.join(", ") : "nothing"}`,
|
|
337
374
|
);
|
|
338
375
|
}
|
|
339
|
-
const { expanded } = args
|
|
376
|
+
const { expanded } = args;
|
|
340
377
|
// `expanded` defaults to true but is never COERCED: `{ expanded: "no" }` would otherwise
|
|
341
378
|
// Read as a collapse, which is the class of silent wrong answer this whole record exists
|
|
342
379
|
// To stop.
|
|
@@ -382,7 +419,7 @@ export function registerDataExplorerCommands(
|
|
|
382
419
|
* **Both halves are documents now** — `surfaces/panel-signals.{json,ts}` for the entry list and its
|
|
383
420
|
* editors, `surfaces/panel-data.{json,ts}` for the value tree under an open row. So lit draws
|
|
384
421
|
* nothing at all here: `render` returns `nothing` and `afterRender` mounts against the painted DOM,
|
|
385
|
-
* which is the seam
|
|
422
|
+
* which is the seam every document-bodied Navigator panel uses. The mount comes through `deps`
|
|
386
423
|
* rather than an import — this module owns the expansion store that one reads, so importing it back
|
|
387
424
|
* would close a cycle — and it is idempotent, so running on every repaint is what keeps the
|
|
388
425
|
* projection current.
|
package/src/panels/data-grid.ts
CHANGED
|
@@ -23,10 +23,11 @@ import { mountDataActionsSurface } from "../surfaces/data-actions";
|
|
|
23
23
|
import { mountPushPlanSurface } from "../surfaces/push-plan";
|
|
24
24
|
import { dataSurfaceAvailable, pushSchema, testConnection } from "../services/data-service";
|
|
25
25
|
import { openGridSourcePicker } from "../grid/grid-open";
|
|
26
|
+
import { closeSettingsDialog } from "../settings/settings-dialog";
|
|
26
27
|
import type { DataActionsSurfaceHandle, DataActionsView } from "../surfaces/data-actions";
|
|
27
28
|
import type { DialogSurfaceHandle } from "../surfaces/dialog";
|
|
28
29
|
import type { PushPlanSurfaceHandle, PushPlanView } from "../surfaces/push-plan";
|
|
29
|
-
import type { DataConnectionTestResult, DataPushResult } from "../types";
|
|
30
|
+
import type { DataConnectionTestResult, DataPushRequest, DataPushResult } from "../types";
|
|
30
31
|
import type { SectionActionsContext } from "../settings/contributed-section";
|
|
31
32
|
|
|
32
33
|
// ─── Grid opening (delegates to the grid-tab source picker) ──────────────────
|
|
@@ -75,7 +76,7 @@ function noteRows(texts: readonly string[], prefix: string) {
|
|
|
75
76
|
}
|
|
76
77
|
|
|
77
78
|
/** What the body lists: the dry run until it has been applied, then what actually happened. */
|
|
78
|
-
function planView(state: PushDialogState): PushPlanView {
|
|
79
|
+
function planView(state: Pick<PushDialogState, "dryRun" | "phase" | "result">): PushPlanView {
|
|
79
80
|
const shown = state.phase === "done" ? state.result : state.dryRun;
|
|
80
81
|
return {
|
|
81
82
|
errors: noteRows(shown?.errors ?? [], "error"),
|
|
@@ -129,27 +130,28 @@ export async function startPush(connection: string | undefined, onDone: () => vo
|
|
|
129
130
|
if (pushDialog) {
|
|
130
131
|
return;
|
|
131
132
|
}
|
|
132
|
-
|
|
133
|
+
/* The dialog's callbacks need the state record and the record needs the dialog's handle, so the
|
|
134
|
+
record is built first and completed with the handle below; it stays one object throughout. */
|
|
135
|
+
const pending: Omit<PushDialogState, "handle"> = {
|
|
133
136
|
connection,
|
|
134
137
|
dryRun: null,
|
|
135
|
-
handle: null as unknown as DialogSurfaceHandle,
|
|
136
138
|
onDone,
|
|
137
139
|
phase: "loading",
|
|
138
140
|
plan: null,
|
|
139
141
|
result: null,
|
|
140
142
|
};
|
|
141
|
-
|
|
143
|
+
const handle = openDialogSurface({
|
|
142
144
|
cancelLabel: "Cancel",
|
|
143
145
|
confirmLabel: "",
|
|
144
146
|
headline: connection ? `Push Schema — ${connection}` : "Push Schema",
|
|
145
147
|
island: (host) => {
|
|
146
|
-
|
|
148
|
+
pending.plan = mountPushPlanSurface(host, planView(pending));
|
|
147
149
|
},
|
|
148
150
|
layer: layerHost("dialog"),
|
|
149
151
|
message: "Compiling plan…",
|
|
150
152
|
onCancel: closePushDialog,
|
|
151
153
|
onClosed: () => {
|
|
152
|
-
if (pushDialog ===
|
|
154
|
+
if (pushDialog === pending) {
|
|
153
155
|
closePushDialog();
|
|
154
156
|
}
|
|
155
157
|
},
|
|
@@ -158,12 +160,14 @@ export async function startPush(connection: string | undefined, onDone: () => vo
|
|
|
158
160
|
},
|
|
159
161
|
region: "data/push",
|
|
160
162
|
});
|
|
163
|
+
const state: PushDialogState = Object.assign(pending, { handle });
|
|
161
164
|
pushDialog = state;
|
|
162
165
|
|
|
163
|
-
const
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
}
|
|
166
|
+
const request: DataPushRequest = { dryRun: true };
|
|
167
|
+
if (connection !== undefined) {
|
|
168
|
+
request.connection = connection;
|
|
169
|
+
}
|
|
170
|
+
const plan = await pushSchema(request);
|
|
167
171
|
if (pushDialog !== state) {
|
|
168
172
|
return;
|
|
169
173
|
}
|
|
@@ -274,6 +278,9 @@ function paintSectionActions(
|
|
|
274
278
|
host,
|
|
275
279
|
mountDataActionsSurface(host, projectActions(sectionKey, selected), {
|
|
276
280
|
openGrid: () => {
|
|
281
|
+
/* The actions row is drawn in the settings dialog, and a grid opens as a TAB: left up, the
|
|
282
|
+
dialog would cover the very tab the reader asked for (§17.1). */
|
|
283
|
+
closeSettingsDialog();
|
|
277
284
|
void openGridSourcePicker();
|
|
278
285
|
},
|
|
279
286
|
push: () => {
|