@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,282 @@
|
|
|
1
|
+
/// <reference lib="dom" />
|
|
2
|
+
/**
|
|
3
|
+
* The Media workspace's library, as a mounted document.
|
|
4
|
+
*
|
|
5
|
+
* This is the adapter. `media/media-library.ts` is the flow: which files a filter keeps, in what
|
|
6
|
+
* order, what each count may claim, which tile is selected, where an arrow lands and what Replace,
|
|
7
|
+
* Delete and an upload write. It hands this module one projection, and this module hands the
|
|
8
|
+
* document a scope and reports the nodes the flow needs to hold.
|
|
9
|
+
*
|
|
10
|
+
* **Four islands, all through `onNodeCreated`.** The flow needs four nodes the document creates:
|
|
11
|
+
* each tile (watched for viewport entry, so a thumbnail is requested only when it is looked at, and
|
|
12
|
+
* focused when the keyboard moves the selection onto it), the grid (measured, so ArrowDown lands on
|
|
13
|
+
* the tile drawn under the current one), and the two file inputs (opened by `media.upload` and
|
|
14
|
+
* `media.replace`). Each is announced as it is created, which is the one seam for a node a document
|
|
15
|
+
* made (`studio-ui-guidelines.md` §9.4); a node found by selector once would be detached DOM the
|
|
16
|
+
* moment a `$switch` moved.
|
|
17
|
+
*
|
|
18
|
+
* **The host is cleared in the pane and not in the dialog.** The pane's stage is handed to the mode
|
|
19
|
+
* that owns it whole, and emptying it is what stops two libraries stacking when a re-render lands
|
|
20
|
+
* before the first mount settled. The dialog's slot is this document's alone already.
|
|
21
|
+
*
|
|
22
|
+
* @docs studio/projects/media
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
import { isNonNullObject, isString } from "@jxsuite/schema/guards";
|
|
26
|
+
import { reactive } from "../reactivity";
|
|
27
|
+
import { mountSurface, registerSurface } from "../ui/surface";
|
|
28
|
+
import mediaLibraryDoc from "./media-library.json";
|
|
29
|
+
import type { JxElement } from "@jxsuite/schema/types";
|
|
30
|
+
import type { JxScope } from "@jxsuite/runtime/types";
|
|
31
|
+
import type { SurfaceHandle } from "../ui/surface";
|
|
32
|
+
import type { MediaUsageRow } from "./media-pane";
|
|
33
|
+
|
|
34
|
+
registerSurface("media-library", mediaLibraryDoc);
|
|
35
|
+
|
|
36
|
+
/** One filter in the left column. */
|
|
37
|
+
export interface MediaFilterRow {
|
|
38
|
+
key: string;
|
|
39
|
+
label: string;
|
|
40
|
+
/** The count, already a string; `""` while it is not known (Unused before its sweep). */
|
|
41
|
+
count: string;
|
|
42
|
+
pressed: "true" | "false";
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/** One tile in the grid. */
|
|
46
|
+
export interface MediaTileRow {
|
|
47
|
+
/** The row's identity across a filter or a sort: the file's path on disk. */
|
|
48
|
+
key: string;
|
|
49
|
+
file: string;
|
|
50
|
+
name: string;
|
|
51
|
+
/** "1200 × 800 · 84 KB", or the file's kind when nothing about it is measured yet. */
|
|
52
|
+
caption: string;
|
|
53
|
+
selected: "true" | "false";
|
|
54
|
+
/** The roving tab stop: `"0"` on exactly one tile, `"-1"` on every other. */
|
|
55
|
+
tabindex: "0" | "-1";
|
|
56
|
+
/** `pending` until the tile has scrolled into view, then `image`; a file with no picture: `glyph`. */
|
|
57
|
+
thumbState: "image" | "pending" | "glyph";
|
|
58
|
+
thumbSrc: string;
|
|
59
|
+
glyph: string;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/** Everything the document draws, as one value. */
|
|
63
|
+
export interface MediaLibraryView {
|
|
64
|
+
region: string;
|
|
65
|
+
mode: "manage" | "pick";
|
|
66
|
+
dropActive: "true" | "false";
|
|
67
|
+
filters: MediaFilterRow[];
|
|
68
|
+
title: string;
|
|
69
|
+
titleId: string;
|
|
70
|
+
query: string;
|
|
71
|
+
sort: string;
|
|
72
|
+
sortOptions: { label: string; value: string }[];
|
|
73
|
+
uploadAccept: string;
|
|
74
|
+
/** Where an upload lands, said before the files are chosen: "Upload into public/media/". */
|
|
75
|
+
uploadHint: string;
|
|
76
|
+
gridState: "loading" | "counting" | "empty" | "nomatch" | "listed";
|
|
77
|
+
countingLabel: string;
|
|
78
|
+
emptyTitle: string;
|
|
79
|
+
emptyDetail: string;
|
|
80
|
+
tiles: MediaTileRow[];
|
|
81
|
+
detailState: "none" | "shown";
|
|
82
|
+
detailHint: string;
|
|
83
|
+
selectedFile: string;
|
|
84
|
+
detailName: string;
|
|
85
|
+
detailFacts: string;
|
|
86
|
+
detailRef: string;
|
|
87
|
+
/**
|
|
88
|
+
* The viewer's stage for the file (`media/media-pane.ts`), minus the ones a side pane cannot
|
|
89
|
+
* hold.
|
|
90
|
+
*/
|
|
91
|
+
previewKind: "image" | "video" | "audio" | "font" | "glyph";
|
|
92
|
+
previewSrc: string;
|
|
93
|
+
previewGlyph: string;
|
|
94
|
+
/** A font's scoped `@font-face`, the declaration naming its family, and the pangram; else `""`. */
|
|
95
|
+
previewFontFace: string;
|
|
96
|
+
previewSpecimenFamily: string;
|
|
97
|
+
previewSpecimen: string;
|
|
98
|
+
/** The Replace input's `accept`: the selected file's own format only. */
|
|
99
|
+
replaceAccept: string;
|
|
100
|
+
usageState: "hidden" | "shown";
|
|
101
|
+
usageHeadline: string;
|
|
102
|
+
usageFiles: MediaUsageRow[];
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/** What a control asks the flow to do. */
|
|
106
|
+
export interface MediaLibraryActions {
|
|
107
|
+
setFilter: (key: string) => void;
|
|
108
|
+
setQuery: (value: string) => void;
|
|
109
|
+
setSort: (value: string) => void;
|
|
110
|
+
upload: (input: HTMLInputElement) => void;
|
|
111
|
+
dragOver: () => void;
|
|
112
|
+
dragOut: () => void;
|
|
113
|
+
drop: (files: FileList | null) => void;
|
|
114
|
+
select: (file: string) => void;
|
|
115
|
+
/** A tile received focus: selection follows it, so the first Enter acts on the tile in the ring. */
|
|
116
|
+
focusTile: (file: string) => void;
|
|
117
|
+
/** A double-click: open the file in its viewer, or in pick mode, use it. */
|
|
118
|
+
activate: (file: string) => void;
|
|
119
|
+
/** Enter on the grid: the same, for the selected file. */
|
|
120
|
+
activateSelected: () => void;
|
|
121
|
+
key: (key: string, ctrl: boolean) => void;
|
|
122
|
+
measure: (file: string, width: number, height: number) => void;
|
|
123
|
+
copyRef: () => void;
|
|
124
|
+
openDocument: (path: string) => void;
|
|
125
|
+
replace: (input: HTMLInputElement) => void;
|
|
126
|
+
remove: () => void;
|
|
127
|
+
openViewer: () => void;
|
|
128
|
+
reset: () => void;
|
|
129
|
+
/** A tile node was created for `file`. */
|
|
130
|
+
tileHost: (element: HTMLElement, file: string) => void;
|
|
131
|
+
/** The grid node was created. */
|
|
132
|
+
gridHost: (element: HTMLElement) => void;
|
|
133
|
+
/** A file input was created: the toolbar's Upload (`upload`) or the detail's Replace. */
|
|
134
|
+
inputHost: (element: HTMLInputElement, role: "upload" | "replace") => void;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
export interface MediaLibrarySurfaceHandle {
|
|
138
|
+
ready: Promise<HTMLElement>;
|
|
139
|
+
/** Whether what was mounted is still inside the host (a mount still in flight counts). */
|
|
140
|
+
attached: () => boolean;
|
|
141
|
+
update: (view: MediaLibraryView) => void;
|
|
142
|
+
dispose: () => void;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/** The scope the document reads. */
|
|
146
|
+
interface MediaLibraryScope
|
|
147
|
+
extends MediaLibraryView, Omit<MediaLibraryActions, "tileHost" | "gridHost" | "inputHost"> {
|
|
148
|
+
hasUsageFiles: boolean;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/** An empty view: what a scope holds before the first projection. */
|
|
152
|
+
export function emptyMediaLibraryView(): MediaLibraryView {
|
|
153
|
+
return {
|
|
154
|
+
countingLabel: "",
|
|
155
|
+
detailFacts: "",
|
|
156
|
+
detailHint: "",
|
|
157
|
+
detailName: "",
|
|
158
|
+
detailRef: "",
|
|
159
|
+
detailState: "none",
|
|
160
|
+
dropActive: "false",
|
|
161
|
+
emptyDetail: "",
|
|
162
|
+
emptyTitle: "",
|
|
163
|
+
filters: [],
|
|
164
|
+
gridState: "loading",
|
|
165
|
+
mode: "manage",
|
|
166
|
+
previewFontFace: "",
|
|
167
|
+
previewGlyph: "",
|
|
168
|
+
previewKind: "glyph",
|
|
169
|
+
previewSpecimen: "",
|
|
170
|
+
previewSpecimenFamily: "",
|
|
171
|
+
previewSrc: "",
|
|
172
|
+
query: "",
|
|
173
|
+
region: "",
|
|
174
|
+
replaceAccept: "",
|
|
175
|
+
selectedFile: "",
|
|
176
|
+
sort: "",
|
|
177
|
+
sortOptions: [],
|
|
178
|
+
tiles: [],
|
|
179
|
+
title: "",
|
|
180
|
+
titleId: "",
|
|
181
|
+
uploadAccept: "",
|
|
182
|
+
uploadHint: "",
|
|
183
|
+
usageFiles: [],
|
|
184
|
+
usageHeadline: "",
|
|
185
|
+
usageState: "hidden",
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
function project(scope: MediaLibraryScope, view: MediaLibraryView): void {
|
|
190
|
+
Object.assign(scope, view);
|
|
191
|
+
scope.hasUsageFiles = view.usageFiles.length > 0;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/** The `part` a definition declares, or `""`. */
|
|
195
|
+
function partOf(def: JxElement | string): string {
|
|
196
|
+
const part = isString(def) ? undefined : def.attributes?.["part"];
|
|
197
|
+
return isString(part) ? part : "";
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/** The file a mapped tile stands for, read off its `$map` item. */
|
|
201
|
+
function mappedFile(state: JxScope | undefined): string | null {
|
|
202
|
+
const map = state?.["$map"];
|
|
203
|
+
const item = isNonNullObject(map) && "item" in map ? map.item : undefined;
|
|
204
|
+
return isNonNullObject(item) && "file" in item && isString(item.file) ? item.file : null;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* Mount the library into `host`.
|
|
209
|
+
*
|
|
210
|
+
* @param {HTMLElement} host - The pane's stage, or the pick dialog's slot
|
|
211
|
+
* @param {MediaLibraryView} view - What to draw right now
|
|
212
|
+
* @param {MediaLibraryActions} actions - What each control does
|
|
213
|
+
* @param {{ clear: boolean }} options - Whether the host is a stage to be emptied first
|
|
214
|
+
* @returns {MediaLibrarySurfaceHandle}
|
|
215
|
+
*/
|
|
216
|
+
export function mountMediaLibrarySurface(
|
|
217
|
+
host: HTMLElement,
|
|
218
|
+
view: MediaLibraryView,
|
|
219
|
+
actions: MediaLibraryActions,
|
|
220
|
+
options: { clear: boolean },
|
|
221
|
+
): MediaLibrarySurfaceHandle {
|
|
222
|
+
if (options.clear) {
|
|
223
|
+
host.replaceChildren();
|
|
224
|
+
}
|
|
225
|
+
const { tileHost, gridHost, inputHost, ...controls } = actions;
|
|
226
|
+
const scope = reactive<MediaLibraryScope>({
|
|
227
|
+
...emptyMediaLibraryView(),
|
|
228
|
+
...controls,
|
|
229
|
+
hasUsageFiles: false,
|
|
230
|
+
});
|
|
231
|
+
project(scope, view);
|
|
232
|
+
|
|
233
|
+
let mounted: SurfaceHandle | null = null;
|
|
234
|
+
let disposed = false;
|
|
235
|
+
const ready = mountSurface("media-library", scope, host, {
|
|
236
|
+
onNodeCreated: (element, _path, def, state) => {
|
|
237
|
+
// `disposed` first: nodes are still created while a mount that was taken down runs out.
|
|
238
|
+
if (disposed || !(element instanceof HTMLElement)) {
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
const part = partOf(def);
|
|
242
|
+
if (part === "tile") {
|
|
243
|
+
const file = mappedFile(state);
|
|
244
|
+
if (file !== null) {
|
|
245
|
+
tileHost(element, file);
|
|
246
|
+
}
|
|
247
|
+
} else if (part === "grid") {
|
|
248
|
+
gridHost(element);
|
|
249
|
+
} else if (element instanceof HTMLInputElement && part === "upload-input") {
|
|
250
|
+
inputHost(element, "upload");
|
|
251
|
+
} else if (element instanceof HTMLInputElement && part === "replace-input") {
|
|
252
|
+
inputHost(element, "replace");
|
|
253
|
+
}
|
|
254
|
+
},
|
|
255
|
+
}).then((surface) => {
|
|
256
|
+
if (disposed) {
|
|
257
|
+
surface.dispose();
|
|
258
|
+
} else {
|
|
259
|
+
mounted = surface;
|
|
260
|
+
}
|
|
261
|
+
/* SAFETY: `media-library.json`'s root definition is a `div` element, so the runtime mounts an
|
|
262
|
+
HTMLElement; a `Text` root only comes from a document whose root is a bare string. */
|
|
263
|
+
return surface.root as HTMLElement;
|
|
264
|
+
});
|
|
265
|
+
|
|
266
|
+
return {
|
|
267
|
+
attached: () => {
|
|
268
|
+
if (disposed) {
|
|
269
|
+
return false;
|
|
270
|
+
}
|
|
271
|
+
const root = mounted?.root;
|
|
272
|
+
return root === undefined ? true : root instanceof HTMLElement && host.contains(root);
|
|
273
|
+
},
|
|
274
|
+
dispose() {
|
|
275
|
+
disposed = true;
|
|
276
|
+
mounted?.dispose();
|
|
277
|
+
mounted = null;
|
|
278
|
+
},
|
|
279
|
+
ready,
|
|
280
|
+
update: (next) => project(scope, next),
|
|
281
|
+
};
|
|
282
|
+
}
|
|
@@ -24,10 +24,9 @@
|
|
|
24
24
|
import { reactive } from "../reactivity";
|
|
25
25
|
import { mountSurface, registerSurface } from "../ui/surface";
|
|
26
26
|
import mediaDoc from "./media-pane.json";
|
|
27
|
-
import type { JxDocument } from "@jxsuite/schema/types";
|
|
28
27
|
import type { SurfaceHandle } from "../ui/surface";
|
|
29
28
|
|
|
30
|
-
registerSurface("media-pane", mediaDoc
|
|
29
|
+
registerSurface("media-pane", mediaDoc);
|
|
31
30
|
|
|
32
31
|
/**
|
|
33
32
|
* Which element the stage draws the file in.
|
|
@@ -105,7 +104,7 @@ export interface MediaSurfaceHandle {
|
|
|
105
104
|
* `$switch` discriminant derived here — "is there a list" is a restatement of the list, and a view
|
|
106
105
|
* that had to keep the two in step would be a second place to get it wrong.
|
|
107
106
|
*/
|
|
108
|
-
interface MediaScope extends
|
|
107
|
+
interface MediaScope extends MediaView, MediaActions {
|
|
109
108
|
hasUsageFiles: boolean;
|
|
110
109
|
}
|
|
111
110
|
|
|
@@ -141,7 +140,7 @@ export function mountMediaSurface(
|
|
|
141
140
|
actions: MediaActions,
|
|
142
141
|
): MediaSurfaceHandle {
|
|
143
142
|
host.replaceChildren();
|
|
144
|
-
const scope = reactive<MediaScope>({
|
|
143
|
+
const scope: MediaScope = reactive<MediaScope>({
|
|
145
144
|
copyRef: actions.copyRef,
|
|
146
145
|
extLabel: "",
|
|
147
146
|
facts: "",
|
|
@@ -159,7 +158,7 @@ export function mountMediaSurface(
|
|
|
159
158
|
usageFiles: [],
|
|
160
159
|
usageHeadline: "",
|
|
161
160
|
usageState: "hidden",
|
|
162
|
-
})
|
|
161
|
+
});
|
|
163
162
|
project(scope, view);
|
|
164
163
|
|
|
165
164
|
let mounted: SurfaceHandle | null = null;
|
|
@@ -171,9 +170,11 @@ export function mountMediaSurface(
|
|
|
171
170
|
const ready = mountSurface("media-pane", scope, host).then((surface) => {
|
|
172
171
|
if (disposed) {
|
|
173
172
|
surface.dispose();
|
|
174
|
-
|
|
173
|
+
} else {
|
|
174
|
+
mounted = surface;
|
|
175
175
|
}
|
|
176
|
-
|
|
176
|
+
/* SAFETY: `media-pane.json`'s root definition is a `div` element, so the runtime mounts an
|
|
177
|
+
HTMLElement; a `Text` root only comes from a document whose root is a bare string. */
|
|
177
178
|
return surface.root as HTMLElement;
|
|
178
179
|
});
|
|
179
180
|
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://jxsuite.com/schema/v1",
|
|
3
|
+
"$id": "StudioMediaPickDialog",
|
|
4
|
+
"$description": "The full-size media picker (`specs/studio.md` §9.3): a `jx-dialog` whose body is the Media workspace's own library surface in pick mode, so the picker and the workspace are one surface at two sizes. The dialog owns modality, Escape, the backdrop and focus restoration, and its footer is the answer: Cancel, or Use <file>, disabled until a file is chosen. The body is an ISLAND: this document draws the slot and nothing in it, and `surfaces/media-pick-dialog.ts` mounts `media-library.json` there through `onNodeCreated`.",
|
|
5
|
+
"tagName": "jx-dialog",
|
|
6
|
+
"$props": {
|
|
7
|
+
"headline": {
|
|
8
|
+
"$ref": "#/state/headline"
|
|
9
|
+
},
|
|
10
|
+
"confirmLabel": {
|
|
11
|
+
"$ref": "#/state/confirmLabel"
|
|
12
|
+
},
|
|
13
|
+
"confirmDisabled": {
|
|
14
|
+
"$ref": "#/state/blocked"
|
|
15
|
+
},
|
|
16
|
+
"cancelLabel": "Cancel",
|
|
17
|
+
"dismissible": true,
|
|
18
|
+
"size": "xl"
|
|
19
|
+
},
|
|
20
|
+
"attributes": {
|
|
21
|
+
"part": "media-pick"
|
|
22
|
+
},
|
|
23
|
+
"onconfirm": {
|
|
24
|
+
"$prototype": "Function",
|
|
25
|
+
"body": [
|
|
26
|
+
{
|
|
27
|
+
"operator": "call",
|
|
28
|
+
"target": {
|
|
29
|
+
"$ref": "#/state/confirm"
|
|
30
|
+
},
|
|
31
|
+
"value": []
|
|
32
|
+
}
|
|
33
|
+
]
|
|
34
|
+
},
|
|
35
|
+
"oncancel": {
|
|
36
|
+
"$prototype": "Function",
|
|
37
|
+
"body": [
|
|
38
|
+
{
|
|
39
|
+
"operator": "call",
|
|
40
|
+
"target": {
|
|
41
|
+
"$ref": "#/state/closed"
|
|
42
|
+
},
|
|
43
|
+
"value": []
|
|
44
|
+
}
|
|
45
|
+
]
|
|
46
|
+
},
|
|
47
|
+
"onclose": {
|
|
48
|
+
"$prototype": "Function",
|
|
49
|
+
"body": [
|
|
50
|
+
{
|
|
51
|
+
"operator": "call",
|
|
52
|
+
"target": {
|
|
53
|
+
"$ref": "#/state/closed"
|
|
54
|
+
},
|
|
55
|
+
"value": []
|
|
56
|
+
}
|
|
57
|
+
]
|
|
58
|
+
},
|
|
59
|
+
"children": [
|
|
60
|
+
{
|
|
61
|
+
"tagName": "div",
|
|
62
|
+
"attributes": {
|
|
63
|
+
"part": "library-slot"
|
|
64
|
+
},
|
|
65
|
+
"style": {
|
|
66
|
+
"$description": "The library's box in pick mode is its own (`media-library.json`, `data-mode=\"pick\"`); the slot only gives it the dialog body's width.",
|
|
67
|
+
"minWidth": "0"
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
]
|
|
71
|
+
}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/// <reference lib="dom" />
|
|
2
|
+
/**
|
|
3
|
+
* The full-size media picker's dialog, as a mounted document.
|
|
4
|
+
*
|
|
5
|
+
* A `jx-dialog` in the dialog layer whose body is an island: `media-pick-dialog.json` draws the
|
|
6
|
+
* slot, and the flow (`media/media-library.ts`) mounts the Media workspace's own library into it in
|
|
7
|
+
* pick mode, through the `onNodeCreated` seam (`studio-ui-guidelines.md` §9.4). So the picker and
|
|
8
|
+
* the workspace are one surface at two sizes, and the dialog is only the frame and the answer:
|
|
9
|
+
* Cancel, or Use <file>.
|
|
10
|
+
*
|
|
11
|
+
* **Await the ELEMENT, not just the mount.** `mountSurface` resolving means the document rendered;
|
|
12
|
+
* a `jx-dialog`'s own template is one `connectedCallback` later, and `showModal` in between finds
|
|
13
|
+
* no `<dialog>` to open. `whenReady` is shared with `surfaces/dialog.ts`.
|
|
14
|
+
*
|
|
15
|
+
* @docs studio/projects/media
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import { reactive } from "../reactivity";
|
|
19
|
+
import { mountSurface, registerSurface } from "../ui/surface";
|
|
20
|
+
import { overlayRegion, REGION_ATTR } from "../ui/regions";
|
|
21
|
+
import { close, showModal } from "@jxsuite/ui/behaviors/dialog";
|
|
22
|
+
import { whenReady } from "./dialog";
|
|
23
|
+
import pickDoc from "./media-pick-dialog.json";
|
|
24
|
+
import type { JxElement } from "@jxsuite/schema/types";
|
|
25
|
+
import type { DialogLayerHandle, SurfaceHandle } from "../ui/surface";
|
|
26
|
+
import { isString } from "@jxsuite/schema/guards";
|
|
27
|
+
|
|
28
|
+
registerSurface("media-pick-dialog", pickDoc);
|
|
29
|
+
|
|
30
|
+
/** The slot id, and so the dialog's region: `overlay.dialog:media-picker`. */
|
|
31
|
+
export const MEDIA_PICK_SLOT = "media-picker";
|
|
32
|
+
|
|
33
|
+
/** What the dialog's own chrome says. */
|
|
34
|
+
export interface MediaPickDialogView {
|
|
35
|
+
headline: string;
|
|
36
|
+
/** "Use hero.jpg", or "Use file" while nothing is chosen. */
|
|
37
|
+
confirmLabel: string;
|
|
38
|
+
/** No file is chosen, so there is nothing to use yet. */
|
|
39
|
+
blocked: boolean;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export interface MediaPickDialogOptions {
|
|
43
|
+
layer: HTMLElement;
|
|
44
|
+
view: MediaPickDialogView;
|
|
45
|
+
/** The body slot was created: where the flow mounts the library. */
|
|
46
|
+
body: (host: HTMLElement) => void;
|
|
47
|
+
confirm: () => void;
|
|
48
|
+
/** The dialog closed, for any reason, once. */
|
|
49
|
+
closed: () => void;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export interface MediaPickDialogHandle extends DialogLayerHandle {
|
|
53
|
+
update: (view: MediaPickDialogView) => void;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
interface MediaPickScope extends MediaPickDialogView {
|
|
57
|
+
confirm: () => void;
|
|
58
|
+
closed: () => void;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function partOf(def: JxElement | string): string {
|
|
62
|
+
const part = isString(def) ? undefined : def.attributes?.["part"];
|
|
63
|
+
return isString(part) ? part : "";
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/** Open the dialog. The handle's `ready` resolves once it is showing. */
|
|
67
|
+
export function openMediaPickDialogSurface(options: MediaPickDialogOptions): MediaPickDialogHandle {
|
|
68
|
+
const slot = document.createElement("div");
|
|
69
|
+
/* The layer is `pointer-events: none`; every slot turns them back on for its own content, or a
|
|
70
|
+
modal `<dialog>` in it is painted above everything and hit-tests to nothing (surfaces/add-new). */
|
|
71
|
+
slot.style.pointerEvents = "auto";
|
|
72
|
+
slot.setAttribute(REGION_ATTR, overlayRegion("dialog", MEDIA_PICK_SLOT));
|
|
73
|
+
options.layer.append(slot);
|
|
74
|
+
|
|
75
|
+
let closed = false;
|
|
76
|
+
const finish = (): void => {
|
|
77
|
+
if (closed) {
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
closed = true;
|
|
81
|
+
options.closed();
|
|
82
|
+
};
|
|
83
|
+
/** Read through a call, so a check after an `await` is not narrowed to the value before it. */
|
|
84
|
+
const isClosed = (): boolean => closed;
|
|
85
|
+
|
|
86
|
+
const scope = reactive<MediaPickScope>({
|
|
87
|
+
...options.view,
|
|
88
|
+
closed: finish,
|
|
89
|
+
confirm: options.confirm,
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
let mounted: SurfaceHandle | null = null;
|
|
93
|
+
const ready = mountSurface("media-pick-dialog", scope, slot, {
|
|
94
|
+
onNodeCreated: (element, _path, def) => {
|
|
95
|
+
if (!isClosed() && element instanceof HTMLElement && partOf(def) === "library-slot") {
|
|
96
|
+
options.body(element);
|
|
97
|
+
}
|
|
98
|
+
},
|
|
99
|
+
}).then(async (surface) => {
|
|
100
|
+
mounted = surface;
|
|
101
|
+
/* SAFETY: `media-pick-dialog.json`'s root definition is a `jx-dialog` element, so the runtime
|
|
102
|
+
mounts an HTMLElement. */
|
|
103
|
+
const element = surface.root as HTMLElement;
|
|
104
|
+
if (isClosed()) {
|
|
105
|
+
surface.dispose();
|
|
106
|
+
return element;
|
|
107
|
+
}
|
|
108
|
+
await whenReady(element);
|
|
109
|
+
if (!isClosed()) {
|
|
110
|
+
showModal(element);
|
|
111
|
+
}
|
|
112
|
+
return element;
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
return {
|
|
116
|
+
close() {
|
|
117
|
+
const element = mounted?.root;
|
|
118
|
+
if (element instanceof HTMLElement) {
|
|
119
|
+
close(element);
|
|
120
|
+
}
|
|
121
|
+
mounted?.dispose();
|
|
122
|
+
mounted = null;
|
|
123
|
+
slot.remove();
|
|
124
|
+
finish();
|
|
125
|
+
},
|
|
126
|
+
host: slot,
|
|
127
|
+
ready,
|
|
128
|
+
update(view) {
|
|
129
|
+
Object.assign(scope, view);
|
|
130
|
+
},
|
|
131
|
+
};
|
|
132
|
+
}
|