@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,371 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://jxsuite.com/schema/v1",
|
|
3
|
+
"$id": "StudioEntryInspector",
|
|
4
|
+
"$description": "The Inspector's Entry tab (specs/studio.md §6, §22.5): one collection entry's own settings while it is written on the canvas, the Content-Entry board's sidebar. Its status (draft or published), its fields as the collection's schema types them, the URL its collection page publishes it at, and the file it is stored in. `content/entry-inspector.ts` keeps every decision; the field form is an island it fills, `ui/schema-form.ts`'s, the same form the form-only entry editor draws.",
|
|
5
|
+
"tagName": "div",
|
|
6
|
+
"attributes": {
|
|
7
|
+
"part": "entry",
|
|
8
|
+
"data-jx-region": "${state.region}"
|
|
9
|
+
},
|
|
10
|
+
"style": {
|
|
11
|
+
"$description": "A column of sections, each a small uppercase heading over its rows, like the Page tab beside it.",
|
|
12
|
+
"display": "flex",
|
|
13
|
+
"flexDirection": "column",
|
|
14
|
+
"gap": "var(--jx-space-4)",
|
|
15
|
+
"padding": "var(--jx-space-3)",
|
|
16
|
+
"fontFamily": "var(--jx-font-sans)",
|
|
17
|
+
"fontSize": "var(--jx-text-md)",
|
|
18
|
+
"color": "var(--fg)",
|
|
19
|
+
"& [part=\"section\"]": {
|
|
20
|
+
"display": "flex",
|
|
21
|
+
"flexDirection": "column",
|
|
22
|
+
"gap": "var(--jx-space-2)"
|
|
23
|
+
},
|
|
24
|
+
"& [part=\"section-title\"]": {
|
|
25
|
+
"margin": "0",
|
|
26
|
+
"fontSize": "var(--jx-text-sm)",
|
|
27
|
+
"fontWeight": "700",
|
|
28
|
+
"letterSpacing": "0.06em",
|
|
29
|
+
"textTransform": "uppercase",
|
|
30
|
+
"color": "var(--fg-dim)"
|
|
31
|
+
},
|
|
32
|
+
"& [part=\"head\"]": {
|
|
33
|
+
"display": "flex",
|
|
34
|
+
"alignItems": "baseline",
|
|
35
|
+
"justifyContent": "space-between",
|
|
36
|
+
"gap": "var(--jx-space-2)"
|
|
37
|
+
},
|
|
38
|
+
"& [part=\"kind\"]": {
|
|
39
|
+
"fontWeight": "600"
|
|
40
|
+
},
|
|
41
|
+
"& [part=\"status\"]": {
|
|
42
|
+
"fontSize": "var(--jx-text-sm)",
|
|
43
|
+
"color": "var(--fg-dim)"
|
|
44
|
+
},
|
|
45
|
+
"& [part=\"status\"][data-draft=\"true\"]": {
|
|
46
|
+
"color": "var(--warning)"
|
|
47
|
+
},
|
|
48
|
+
"& [part=\"note\"]": {
|
|
49
|
+
"margin": "0",
|
|
50
|
+
"fontSize": "var(--jx-text-sm)",
|
|
51
|
+
"lineHeight": "1.5",
|
|
52
|
+
"color": "var(--fg-dim)"
|
|
53
|
+
},
|
|
54
|
+
"& [part=\"url\"]": {
|
|
55
|
+
"fontFamily": "var(--font-mono)",
|
|
56
|
+
"fontSize": "var(--jx-text-sm)",
|
|
57
|
+
"wordBreak": "break-all"
|
|
58
|
+
},
|
|
59
|
+
"& [part=\"path\"]": {
|
|
60
|
+
"fontFamily": "var(--font-mono)",
|
|
61
|
+
"fontSize": "var(--jx-text-sm)",
|
|
62
|
+
"color": "var(--fg)",
|
|
63
|
+
"wordBreak": "break-all"
|
|
64
|
+
},
|
|
65
|
+
"& [part=\"fields-head\"]": {
|
|
66
|
+
"display": "flex",
|
|
67
|
+
"alignItems": "center",
|
|
68
|
+
"justifyContent": "space-between"
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
"children": [
|
|
72
|
+
{
|
|
73
|
+
"tagName": "section",
|
|
74
|
+
"attributes": {
|
|
75
|
+
"part": "section",
|
|
76
|
+
"aria-labelledby": "entry-inspector-entry"
|
|
77
|
+
},
|
|
78
|
+
"children": [
|
|
79
|
+
{
|
|
80
|
+
"tagName": "div",
|
|
81
|
+
"attributes": {
|
|
82
|
+
"part": "head"
|
|
83
|
+
},
|
|
84
|
+
"children": [
|
|
85
|
+
{
|
|
86
|
+
"tagName": "h3",
|
|
87
|
+
"attributes": {
|
|
88
|
+
"part": "section-title",
|
|
89
|
+
"id": "entry-inspector-entry"
|
|
90
|
+
},
|
|
91
|
+
"textContent": "Entry"
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
"tagName": "span",
|
|
95
|
+
"attributes": {
|
|
96
|
+
"part": "status",
|
|
97
|
+
"data-draft": "${state.draft ? 'true' : 'false'}"
|
|
98
|
+
},
|
|
99
|
+
"textContent": "${state.status}"
|
|
100
|
+
}
|
|
101
|
+
]
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
"tagName": "span",
|
|
105
|
+
"attributes": {
|
|
106
|
+
"part": "kind"
|
|
107
|
+
},
|
|
108
|
+
"textContent": "${state.kind}"
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
"tagName": "div",
|
|
112
|
+
"attributes": {
|
|
113
|
+
"part": "draft-slot",
|
|
114
|
+
"role": "none"
|
|
115
|
+
},
|
|
116
|
+
"style": {
|
|
117
|
+
"display": "contents"
|
|
118
|
+
},
|
|
119
|
+
"$switch": {
|
|
120
|
+
"$ref": "#/state/draftAxis"
|
|
121
|
+
},
|
|
122
|
+
"cases": {
|
|
123
|
+
"shown": {
|
|
124
|
+
"$description": "The entry's draft state, the one field every collection with a draft workflow shares (site-architecture.md §7.6). A setter: the switch names the state it reaches.",
|
|
125
|
+
"tagName": "jx-switch",
|
|
126
|
+
"attributes": {
|
|
127
|
+
"part": "draft"
|
|
128
|
+
},
|
|
129
|
+
"$props": {
|
|
130
|
+
"checked": {
|
|
131
|
+
"$ref": "#/state/draft"
|
|
132
|
+
},
|
|
133
|
+
"hint": "${state.draftHint}",
|
|
134
|
+
"size": "sm"
|
|
135
|
+
},
|
|
136
|
+
"onchange": {
|
|
137
|
+
"$prototype": "Function",
|
|
138
|
+
"body": [
|
|
139
|
+
{
|
|
140
|
+
"operator": "call",
|
|
141
|
+
"target": {
|
|
142
|
+
"$ref": "#/state/setDraft"
|
|
143
|
+
},
|
|
144
|
+
"value": [
|
|
145
|
+
{
|
|
146
|
+
"$ref": "event#/target/checked"
|
|
147
|
+
}
|
|
148
|
+
]
|
|
149
|
+
}
|
|
150
|
+
]
|
|
151
|
+
},
|
|
152
|
+
"children": [
|
|
153
|
+
{
|
|
154
|
+
"tagName": "span",
|
|
155
|
+
"textContent": "Draft"
|
|
156
|
+
}
|
|
157
|
+
]
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
]
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
"tagName": "section",
|
|
165
|
+
"attributes": {
|
|
166
|
+
"part": "section",
|
|
167
|
+
"aria-labelledby": "entry-inspector-fields"
|
|
168
|
+
},
|
|
169
|
+
"children": [
|
|
170
|
+
{
|
|
171
|
+
"tagName": "div",
|
|
172
|
+
"attributes": {
|
|
173
|
+
"part": "fields-head"
|
|
174
|
+
},
|
|
175
|
+
"children": [
|
|
176
|
+
{
|
|
177
|
+
"tagName": "h3",
|
|
178
|
+
"attributes": {
|
|
179
|
+
"part": "section-title",
|
|
180
|
+
"id": "entry-inspector-fields"
|
|
181
|
+
},
|
|
182
|
+
"textContent": "Fields"
|
|
183
|
+
},
|
|
184
|
+
{
|
|
185
|
+
"tagName": "jx-action-button",
|
|
186
|
+
"attributes": {
|
|
187
|
+
"part": "edit-fields"
|
|
188
|
+
},
|
|
189
|
+
"$props": {
|
|
190
|
+
"size": "sm",
|
|
191
|
+
"quiet": true,
|
|
192
|
+
"hint": "Edit this collection's fields in Project Settings",
|
|
193
|
+
"haspopup": "dialog"
|
|
194
|
+
},
|
|
195
|
+
"onclick": {
|
|
196
|
+
"$prototype": "Function",
|
|
197
|
+
"body": [
|
|
198
|
+
{
|
|
199
|
+
"operator": "call",
|
|
200
|
+
"target": {
|
|
201
|
+
"$ref": "#/state/openFields"
|
|
202
|
+
},
|
|
203
|
+
"value": []
|
|
204
|
+
}
|
|
205
|
+
]
|
|
206
|
+
},
|
|
207
|
+
"children": [
|
|
208
|
+
{
|
|
209
|
+
"tagName": "span",
|
|
210
|
+
"textContent": "Edit"
|
|
211
|
+
}
|
|
212
|
+
]
|
|
213
|
+
}
|
|
214
|
+
]
|
|
215
|
+
},
|
|
216
|
+
{
|
|
217
|
+
"tagName": "div",
|
|
218
|
+
"attributes": {
|
|
219
|
+
"part": "fields-slot",
|
|
220
|
+
"role": "none"
|
|
221
|
+
},
|
|
222
|
+
"style": {
|
|
223
|
+
"display": "contents"
|
|
224
|
+
},
|
|
225
|
+
"$switch": {
|
|
226
|
+
"$ref": "#/state/fieldsState"
|
|
227
|
+
},
|
|
228
|
+
"cases": {
|
|
229
|
+
"form": {
|
|
230
|
+
"tagName": "div",
|
|
231
|
+
"attributes": {
|
|
232
|
+
"part": "fields"
|
|
233
|
+
}
|
|
234
|
+
},
|
|
235
|
+
"none": {
|
|
236
|
+
"tagName": "p",
|
|
237
|
+
"attributes": {
|
|
238
|
+
"part": "note"
|
|
239
|
+
},
|
|
240
|
+
"textContent": "This collection declares no fields. Edit adds some in Project Settings."
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
]
|
|
245
|
+
},
|
|
246
|
+
{
|
|
247
|
+
"tagName": "section",
|
|
248
|
+
"attributes": {
|
|
249
|
+
"part": "section",
|
|
250
|
+
"aria-labelledby": "entry-inspector-page"
|
|
251
|
+
},
|
|
252
|
+
"children": [
|
|
253
|
+
{
|
|
254
|
+
"tagName": "div",
|
|
255
|
+
"attributes": {
|
|
256
|
+
"part": "fields-head"
|
|
257
|
+
},
|
|
258
|
+
"children": [
|
|
259
|
+
{
|
|
260
|
+
"tagName": "h3",
|
|
261
|
+
"attributes": {
|
|
262
|
+
"part": "section-title",
|
|
263
|
+
"id": "entry-inspector-page"
|
|
264
|
+
},
|
|
265
|
+
"textContent": "Page"
|
|
266
|
+
},
|
|
267
|
+
{
|
|
268
|
+
"$description": "The door to Search appearance, the same `document.openSeo` the Page tab's button runs: an entry's search title, description and social image are its frontmatter too (studio.md §4.2).",
|
|
269
|
+
"tagName": "jx-action-button",
|
|
270
|
+
"attributes": {
|
|
271
|
+
"part": "seo-button"
|
|
272
|
+
},
|
|
273
|
+
"$props": {
|
|
274
|
+
"size": "sm",
|
|
275
|
+
"quiet": true,
|
|
276
|
+
"label": "Search appearance",
|
|
277
|
+
"hint": "Preview how this entry appears in search and when shared",
|
|
278
|
+
"haspopup": "dialog"
|
|
279
|
+
},
|
|
280
|
+
"onclick": {
|
|
281
|
+
"$prototype": "Function",
|
|
282
|
+
"body": [
|
|
283
|
+
{
|
|
284
|
+
"operator": "call",
|
|
285
|
+
"target": {
|
|
286
|
+
"$ref": "#/state/openSeo"
|
|
287
|
+
},
|
|
288
|
+
"value": []
|
|
289
|
+
}
|
|
290
|
+
]
|
|
291
|
+
},
|
|
292
|
+
"children": [
|
|
293
|
+
{
|
|
294
|
+
"tagName": "span",
|
|
295
|
+
"textContent": "Search appearance…"
|
|
296
|
+
}
|
|
297
|
+
]
|
|
298
|
+
}
|
|
299
|
+
]
|
|
300
|
+
},
|
|
301
|
+
{
|
|
302
|
+
"tagName": "div",
|
|
303
|
+
"attributes": {
|
|
304
|
+
"part": "url-slot",
|
|
305
|
+
"role": "none"
|
|
306
|
+
},
|
|
307
|
+
"style": {
|
|
308
|
+
"display": "contents"
|
|
309
|
+
},
|
|
310
|
+
"$switch": {
|
|
311
|
+
"$ref": "#/state/urlState"
|
|
312
|
+
},
|
|
313
|
+
"cases": {
|
|
314
|
+
"shown": {
|
|
315
|
+
"tagName": "code",
|
|
316
|
+
"attributes": {
|
|
317
|
+
"part": "url"
|
|
318
|
+
},
|
|
319
|
+
"textContent": "${state.url}"
|
|
320
|
+
},
|
|
321
|
+
"none": {
|
|
322
|
+
"tagName": "p",
|
|
323
|
+
"attributes": {
|
|
324
|
+
"part": "note"
|
|
325
|
+
},
|
|
326
|
+
"textContent": "Entries of this collection have no page of their own."
|
|
327
|
+
},
|
|
328
|
+
"unlisted": {
|
|
329
|
+
"$description": "The collection has a page, but the page lists the ids it publishes (`$paths.values`) and this entry is not one of them: naming a URL the build never writes would be a link to nothing.",
|
|
330
|
+
"tagName": "p",
|
|
331
|
+
"attributes": {
|
|
332
|
+
"part": "note"
|
|
333
|
+
},
|
|
334
|
+
"textContent": "Not published: this collection's page lists the entries it publishes, and this is not one of them."
|
|
335
|
+
},
|
|
336
|
+
"loading": {
|
|
337
|
+
"tagName": "p",
|
|
338
|
+
"attributes": {
|
|
339
|
+
"part": "note"
|
|
340
|
+
},
|
|
341
|
+
"textContent": "Finding the page this entry is published at…"
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
},
|
|
345
|
+
{
|
|
346
|
+
"tagName": "p",
|
|
347
|
+
"attributes": {
|
|
348
|
+
"part": "note"
|
|
349
|
+
},
|
|
350
|
+
"children": [
|
|
351
|
+
{
|
|
352
|
+
"tagName": "span",
|
|
353
|
+
"textContent": "Stored as "
|
|
354
|
+
},
|
|
355
|
+
{
|
|
356
|
+
"tagName": "code",
|
|
357
|
+
"attributes": {
|
|
358
|
+
"part": "path"
|
|
359
|
+
},
|
|
360
|
+
"textContent": "${state.path}"
|
|
361
|
+
},
|
|
362
|
+
{
|
|
363
|
+
"tagName": "span",
|
|
364
|
+
"textContent": "${state.storage}"
|
|
365
|
+
}
|
|
366
|
+
]
|
|
367
|
+
}
|
|
368
|
+
]
|
|
369
|
+
}
|
|
370
|
+
]
|
|
371
|
+
}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/// <reference lib="dom" />
|
|
2
|
+
/**
|
|
3
|
+
* The Inspector's Entry tab surface: one collection entry's status, fields, page URL and file
|
|
4
|
+
* (`specs/studio.md` §6, §22.5).
|
|
5
|
+
*
|
|
6
|
+
* This is the adapter. `content/entry-inspector.ts` decides everything and hands this module one
|
|
7
|
+
* projection; the field form is an island the document renders empty (`part="fields"`) and the flow
|
|
8
|
+
* fills through `onNodeCreated`, because `ui/schema-form.ts` hands back a host element.
|
|
9
|
+
*
|
|
10
|
+
* @docs studio/projects/content-types
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { isString } from "@jxsuite/schema/guards";
|
|
14
|
+
import { reactive } from "../reactivity";
|
|
15
|
+
import { mountSurface, registerSurface } from "../ui/surface";
|
|
16
|
+
import entryInspectorDoc from "./entry-inspector.json";
|
|
17
|
+
import type { JxElement } from "@jxsuite/schema/types";
|
|
18
|
+
import type { SurfaceHandle } from "../ui/surface";
|
|
19
|
+
|
|
20
|
+
registerSurface("entry-inspector", entryInspectorDoc);
|
|
21
|
+
|
|
22
|
+
/** Everything the document draws. Every field is a value. */
|
|
23
|
+
export interface EntryInspectorView {
|
|
24
|
+
/** The region id stamped on the root. */
|
|
25
|
+
region: string;
|
|
26
|
+
/** What the entry is, said in the singular: "Post". */
|
|
27
|
+
kind: string;
|
|
28
|
+
/** "Draft", "Published", or "" for a collection with no draft workflow. */
|
|
29
|
+
status: string;
|
|
30
|
+
/** Whether the collection has a draft workflow at all. */
|
|
31
|
+
draftAxis: "hidden" | "shown";
|
|
32
|
+
draft: boolean;
|
|
33
|
+
draftHint: string;
|
|
34
|
+
/** `form` draws the field form's host; `none` says the collection declares no fields. */
|
|
35
|
+
fieldsState: "form" | "none";
|
|
36
|
+
/**
|
|
37
|
+
* `shown` draws the URL; `none` says the collection has no page; `unlisted` that its page lists
|
|
38
|
+
* the entries it publishes and this is not one; `loading` while the pages are read.
|
|
39
|
+
*/
|
|
40
|
+
urlState: "shown" | "none" | "unlisted" | "loading";
|
|
41
|
+
url: string;
|
|
42
|
+
/** The file the entry is stored in. */
|
|
43
|
+
path: string;
|
|
44
|
+
/** What the file holds: ". Fields are its frontmatter, and the body is its Markdown." */
|
|
45
|
+
storage: string;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** What the tab's controls do. */
|
|
49
|
+
export interface EntryInspectorActions {
|
|
50
|
+
/** The draft switch moved. A setter, never a toggle. */
|
|
51
|
+
setDraft: (draft: boolean) => void;
|
|
52
|
+
/** **Edit** opens Project Settings › Content types on this collection. */
|
|
53
|
+
openFields: () => void;
|
|
54
|
+
/** **Search appearance…** runs `document.openSeo` over this entry, as the Page tab's does. */
|
|
55
|
+
openSeo: () => void;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/** The node the document renders empty for the flow to fill. */
|
|
59
|
+
export interface EntryInspectorIslands {
|
|
60
|
+
/** The field form's host, whenever the document has just created one. */
|
|
61
|
+
fieldsSlot: (host: HTMLElement) => void;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export interface EntryInspectorHandle {
|
|
65
|
+
readonly ready: Promise<unknown>;
|
|
66
|
+
/** Whether what was mounted is still inside the host. */
|
|
67
|
+
attached: () => boolean;
|
|
68
|
+
update: (view: EntryInspectorView) => void;
|
|
69
|
+
dispose: () => void;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
interface EntryInspectorScope extends EntryInspectorView, EntryInspectorActions {}
|
|
73
|
+
|
|
74
|
+
/** Write a view into the scope, field by field. */
|
|
75
|
+
function project(scope: EntryInspectorScope, view: EntryInspectorView): void {
|
|
76
|
+
scope.region = view.region;
|
|
77
|
+
scope.kind = view.kind;
|
|
78
|
+
scope.status = view.status;
|
|
79
|
+
scope.draftAxis = view.draftAxis;
|
|
80
|
+
scope.draft = view.draft;
|
|
81
|
+
scope.draftHint = view.draftHint;
|
|
82
|
+
scope.fieldsState = view.fieldsState;
|
|
83
|
+
scope.urlState = view.urlState;
|
|
84
|
+
scope.url = view.url;
|
|
85
|
+
scope.path = view.path;
|
|
86
|
+
scope.storage = view.storage;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/** The `part` a node was authored with, or `""`. */
|
|
90
|
+
function partOf(def: JxElement | string): string {
|
|
91
|
+
const part = isString(def) ? undefined : def.attributes?.["part"];
|
|
92
|
+
return isString(part) ? part : "";
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Mount the Entry tab into `host`, the Inspector's Page body.
|
|
97
|
+
*
|
|
98
|
+
* @param host The body host.
|
|
99
|
+
* @param view What to draw.
|
|
100
|
+
* @param actions What the controls do.
|
|
101
|
+
* @param islands Where the field form goes.
|
|
102
|
+
*/
|
|
103
|
+
export function mountEntryInspectorSurface(
|
|
104
|
+
host: HTMLElement,
|
|
105
|
+
view: EntryInspectorView,
|
|
106
|
+
actions: EntryInspectorActions,
|
|
107
|
+
islands: EntryInspectorIslands,
|
|
108
|
+
): EntryInspectorHandle {
|
|
109
|
+
host.replaceChildren();
|
|
110
|
+
const scope: EntryInspectorScope = reactive<EntryInspectorScope>({ ...view, ...actions });
|
|
111
|
+
let mounted: SurfaceHandle | null = null;
|
|
112
|
+
let disposed = false;
|
|
113
|
+
const ready = mountSurface("entry-inspector", scope, host, {
|
|
114
|
+
onNodeCreated: (element, _path, def) => {
|
|
115
|
+
if (!disposed && element instanceof HTMLElement && partOf(def) === "fields") {
|
|
116
|
+
islands.fieldsSlot(element);
|
|
117
|
+
}
|
|
118
|
+
},
|
|
119
|
+
}).then((surface) => {
|
|
120
|
+
if (disposed) {
|
|
121
|
+
surface.dispose();
|
|
122
|
+
} else {
|
|
123
|
+
mounted = surface;
|
|
124
|
+
}
|
|
125
|
+
return surface;
|
|
126
|
+
});
|
|
127
|
+
return {
|
|
128
|
+
attached: () => {
|
|
129
|
+
if (disposed) {
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
const root = mounted?.root;
|
|
133
|
+
return root === undefined ? true : host.contains(root);
|
|
134
|
+
},
|
|
135
|
+
dispose() {
|
|
136
|
+
disposed = true;
|
|
137
|
+
mounted?.dispose();
|
|
138
|
+
mounted = null;
|
|
139
|
+
},
|
|
140
|
+
ready,
|
|
141
|
+
update: (next) => project(scope, next),
|
|
142
|
+
};
|
|
143
|
+
}
|
|
@@ -31,26 +31,12 @@
|
|
|
31
31
|
import { reactive } from "../reactivity";
|
|
32
32
|
import { mountSurface, registerSurface } from "../ui/surface";
|
|
33
33
|
import expressionEditorDoc from "./expression-editor.json";
|
|
34
|
-
import type {
|
|
35
|
-
import type { SurfaceHandle } from "../ui/surface";
|
|
34
|
+
import type { SurfaceHandle, SurfaceOption, SurfaceOptionGroup } from "../ui/surface";
|
|
36
35
|
|
|
37
|
-
registerSurface("expression-editor", expressionEditorDoc
|
|
38
|
-
|
|
39
|
-
/** A closed list of choices, in the shape the kit's select reads. */
|
|
40
|
-
export interface ExprOption {
|
|
41
|
-
value: string;
|
|
42
|
-
label: string;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
/** A delimited run of choices — the kit's own `optgroup`, which draws both halves of the rule. */
|
|
46
|
-
export interface ExprSelectGroup {
|
|
47
|
-
id: string;
|
|
48
|
-
label: string;
|
|
49
|
-
rows: ExprOption[];
|
|
50
|
-
}
|
|
36
|
+
registerSurface("expression-editor", expressionEditorDoc);
|
|
51
37
|
|
|
52
38
|
/** One chip of the pipeline, as the document draws it. */
|
|
53
|
-
export interface ExprChipView
|
|
39
|
+
export interface ExprChipView {
|
|
54
40
|
/** The joined node path: the repeater's key, and what a click reports back to the flow. */
|
|
55
41
|
key: string;
|
|
56
42
|
label: string;
|
|
@@ -83,7 +69,7 @@ export type ExprLead = "none" | "arg" | "case" | "default";
|
|
|
83
69
|
* Every field is a string, a flag or a list: the document asks no question about an expression, and
|
|
84
70
|
* there is no branch in it that the walk has not already taken.
|
|
85
71
|
*/
|
|
86
|
-
export interface ExprRowView
|
|
72
|
+
export interface ExprRowView {
|
|
87
73
|
/**
|
|
88
74
|
* Unique within one editor, and the repeater's key. It is the node's own path plus the slot it
|
|
89
75
|
* fills, so a row that survives an edit keeps its node — which is what stops a keystroke in one
|
|
@@ -111,19 +97,19 @@ export interface ExprRowView extends Record<string, unknown> {
|
|
|
111
97
|
/** The accessible name of the row's icon-only control. */
|
|
112
98
|
title: string;
|
|
113
99
|
/** An `operator` row's grouped operator list. */
|
|
114
|
-
groups:
|
|
100
|
+
groups: SurfaceOptionGroup[];
|
|
115
101
|
/** An `operator` row offers the catalog beside its picker; a nested one does not. */
|
|
116
102
|
catalog: boolean;
|
|
117
103
|
/** Which rung an `operand` row shows. */
|
|
118
104
|
source: ExprSource;
|
|
119
105
|
/** The rungs on offer. Empty means the slot admits one shape, so there is nothing to choose. */
|
|
120
|
-
sourceOptions:
|
|
106
|
+
sourceOptions: SurfaceOption[];
|
|
121
107
|
/** Whether the rung picker is drawn at all — `sourceOptions` non-empty, said as a flag. */
|
|
122
108
|
chooser: boolean;
|
|
123
109
|
/** `string`, `number`, `boolean` or `null` — what the literal type picker holds. */
|
|
124
110
|
literalType: string;
|
|
125
111
|
/** The literal types on offer. A separate list from {@link sourceOptions}: two questions. */
|
|
126
|
-
typeOptions:
|
|
112
|
+
typeOptions: SurfaceOption[];
|
|
127
113
|
/** Which literal control follows the type picker: `text`, `number`, `bool` or `null`. */
|
|
128
114
|
literal: string;
|
|
129
115
|
/** What a text literal, a number literal or a ref picker holds. */
|
|
@@ -131,9 +117,9 @@ export interface ExprRowView extends Record<string, unknown> {
|
|
|
131
117
|
/** What a boolean literal holds. */
|
|
132
118
|
checked: boolean;
|
|
133
119
|
/** The signals this slot may bind to. */
|
|
134
|
-
refOptions:
|
|
120
|
+
refOptions: SurfaceOption[];
|
|
135
121
|
/** The event refs, as their own named run. Empty where the position admits none. */
|
|
136
|
-
refGroups:
|
|
122
|
+
refGroups: SurfaceOptionGroup[];
|
|
137
123
|
/** Which leading cell the row carries. */
|
|
138
124
|
lead: ExprLead;
|
|
139
125
|
/** An arg's positional name, or the `default` case's word. */
|
|
@@ -181,7 +167,7 @@ export interface ExpressionActions {
|
|
|
181
167
|
pickChip: (key: string) => void;
|
|
182
168
|
}
|
|
183
169
|
|
|
184
|
-
interface ExpressionScope extends
|
|
170
|
+
interface ExpressionScope extends ExpressionActions {
|
|
185
171
|
rows: ExprRowView[];
|
|
186
172
|
}
|
|
187
173
|
|
|
@@ -225,7 +211,7 @@ export function renderExpressionEditorSurface(
|
|
|
225
211
|
}
|
|
226
212
|
takeDown(host, existing);
|
|
227
213
|
host.textContent = "";
|
|
228
|
-
const scope = reactive({ ...actions, rows })
|
|
214
|
+
const scope: ExpressionScope = reactive<ExpressionScope>({ ...actions, rows });
|
|
229
215
|
const record: Mounted = { disposed: false, handle: null, scope };
|
|
230
216
|
mounts.set(host, record);
|
|
231
217
|
/* No race to arbitrate: a repaint arriving while this is in flight takes the branch above — a
|
|
@@ -37,14 +37,15 @@
|
|
|
37
37
|
* @docs studio/interface
|
|
38
38
|
*/
|
|
39
39
|
|
|
40
|
+
import { isNonNullObject, isString } from "@jxsuite/schema/guards";
|
|
40
41
|
import { reactive } from "../reactivity";
|
|
41
42
|
import { mountSurface, registerSurface } from "../ui/surface";
|
|
42
43
|
import filesPanelDoc from "./files-panel.json";
|
|
43
|
-
import type {
|
|
44
|
+
import type { JxElement } from "@jxsuite/schema/types";
|
|
44
45
|
import type { JxScope } from "@jxsuite/runtime/types";
|
|
45
46
|
import type { SurfaceHandle } from "../ui/surface";
|
|
46
47
|
|
|
47
|
-
registerSurface("files-panel", filesPanelDoc
|
|
48
|
+
registerSurface("files-panel", filesPanelDoc);
|
|
48
49
|
|
|
49
50
|
/**
|
|
50
51
|
* One row the tree draws, with every field already a string.
|
|
@@ -170,7 +171,7 @@ export interface FilesPanelSurfaceHandle {
|
|
|
170
171
|
}
|
|
171
172
|
|
|
172
173
|
/** The scope the document reads: the projection, plus everything a control can ask for. */
|
|
173
|
-
interface FilesPanelScope extends
|
|
174
|
+
interface FilesPanelScope extends FilesPanelValues, FilesPanelActions {}
|
|
174
175
|
|
|
175
176
|
/** Write a projection into the scope. Assignment by assignment, so an unchanged field is inert. */
|
|
176
177
|
function project(scope: FilesPanelScope, values: FilesPanelValues): void {
|
|
@@ -214,15 +215,28 @@ export function emptyFilesPanelValues(): FilesPanelValues {
|
|
|
214
215
|
|
|
215
216
|
/** The `part` a node's definition carries, or `""` for a text node or an unmarked element. */
|
|
216
217
|
function partOf(def: JxElement | string): string {
|
|
217
|
-
const part =
|
|
218
|
-
return
|
|
218
|
+
const part = isString(def) ? undefined : def.attributes?.["part"];
|
|
219
|
+
return isString(part) ? part : "";
|
|
219
220
|
}
|
|
220
221
|
|
|
221
|
-
/**
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
222
|
+
/**
|
|
223
|
+
* The path and type of the mapped row a node was rendered inside, or null when it was not in one.
|
|
224
|
+
* The only mapped array in `files-panel.json` is `#/state/rows`, which `project()` fills from
|
|
225
|
+
* `FilesPanelValues.rows: FileRowView[]`, so a row's item carries both as strings.
|
|
226
|
+
*/
|
|
227
|
+
function mappedRow(state: JxScope | undefined): Pick<FileRowView, "path" | "type"> | null {
|
|
228
|
+
const map = state?.["$map"];
|
|
229
|
+
const item = isNonNullObject(map) && "item" in map ? map.item : undefined;
|
|
230
|
+
if (
|
|
231
|
+
!isNonNullObject(item) ||
|
|
232
|
+
!("path" in item) ||
|
|
233
|
+
!isString(item.path) ||
|
|
234
|
+
!("type" in item) ||
|
|
235
|
+
!isString(item.type)
|
|
236
|
+
) {
|
|
237
|
+
return null;
|
|
238
|
+
}
|
|
239
|
+
return { path: item.path, type: item.type };
|
|
226
240
|
}
|
|
227
241
|
|
|
228
242
|
/**
|
|
@@ -237,10 +251,10 @@ export function mountFilesPanelSurface(
|
|
|
237
251
|
values: FilesPanelValues,
|
|
238
252
|
actions: FilesPanelActions,
|
|
239
253
|
): FilesPanelSurfaceHandle {
|
|
240
|
-
const scope = reactive<FilesPanelScope>({
|
|
254
|
+
const scope: FilesPanelScope = reactive<FilesPanelScope>({
|
|
241
255
|
...emptyFilesPanelValues(),
|
|
242
256
|
...actions,
|
|
243
|
-
})
|
|
257
|
+
});
|
|
244
258
|
project(scope, values);
|
|
245
259
|
|
|
246
260
|
let mounted: SurfaceHandle | null = null;
|
|
@@ -286,8 +300,7 @@ export function mountFilesPanelSurface(
|
|
|
286
300
|
answer is simply whether this handle is still wanted — answering no would start a second
|
|
287
301
|
mount racing the first. Once mounted, the question is whether the root is still where it was
|
|
288
302
|
put: a Navigator that painted another panel cleared this document out from under it. */
|
|
289
|
-
connected: () =>
|
|
290
|
-
!disposed && (mounted === null || (mounted.root as Node).parentNode === container),
|
|
303
|
+
connected: () => !disposed && (mounted === null || mounted.root.parentNode === container),
|
|
291
304
|
dispose() {
|
|
292
305
|
disposed = true;
|
|
293
306
|
mounted?.dispose();
|