@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,169 @@
|
|
|
1
|
+
/// <reference lib="dom" />
|
|
2
|
+
/**
|
|
3
|
+
* The Project Settings dialog, as a mounted document.
|
|
4
|
+
*
|
|
5
|
+
* A `jx-dialog` in the dialog layer whose body is an island: `settings-dialog.json` draws the slot,
|
|
6
|
+
* and the flow (`settings/settings-dialog.ts`) mounts the settings editor's columns into it through
|
|
7
|
+
* the `onNodeCreated` seam (`studio-ui-guidelines.md` §9.4). The dialog is only the frame and the
|
|
8
|
+
* one answer, Close.
|
|
9
|
+
*
|
|
10
|
+
* **Mounted once, shown many times.** Every open used to mount this document and the whole editor
|
|
11
|
+
* into it, and every close disposed both while the dialog was still on the top layer, which made
|
|
12
|
+
* each close re-style the subtree it was removing. Now a close is the platform's `close()` and the
|
|
13
|
+
* document stays in the dialog layer, closed (so `display: none`, and inert), until the flow
|
|
14
|
+
* disposes it; the next open is one `showModal()`.
|
|
15
|
+
*
|
|
16
|
+
* **Await the ELEMENT, not just the mount.** `mountSurface` resolving means the document rendered;
|
|
17
|
+
* a `jx-dialog`'s own template is one `connectedCallback` later, and `showModal` in between finds
|
|
18
|
+
* no `<dialog>` to open. `whenReady` is shared with `surfaces/dialog.ts`.
|
|
19
|
+
*
|
|
20
|
+
* @docs studio/projects/settings
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
import { isString } from "@jxsuite/schema/guards";
|
|
24
|
+
import { close, showModal } from "@jxsuite/ui/behaviors/dialog";
|
|
25
|
+
import { reactive } from "../reactivity";
|
|
26
|
+
import { overlayRegion, REGION_ATTR } from "../ui/regions";
|
|
27
|
+
import { mountSurface, registerSurface } from "../ui/surface";
|
|
28
|
+
import { whenReady } from "./dialog";
|
|
29
|
+
import settingsDialogDoc from "./settings-dialog.json";
|
|
30
|
+
import type { JxElement } from "@jxsuite/schema/types";
|
|
31
|
+
import type { SurfaceHandle } from "../ui/surface";
|
|
32
|
+
|
|
33
|
+
registerSurface("settings-dialog", settingsDialogDoc);
|
|
34
|
+
|
|
35
|
+
/** The dialog's region: `overlay.dialog:settings`. Section regions are named under it. */
|
|
36
|
+
export const SETTINGS_DIALOG_REGION = overlayRegion("dialog", "settings");
|
|
37
|
+
|
|
38
|
+
export interface SettingsDialogOptions {
|
|
39
|
+
/** The dialog layer host, handed in so this module never reaches back into `layers.ts`. */
|
|
40
|
+
layer: HTMLElement;
|
|
41
|
+
/** The body slot was created: where the flow mounts the settings editor. Called once. */
|
|
42
|
+
body: (host: HTMLElement) => void;
|
|
43
|
+
/** The dialog closed, for any reason: once per time it was shown. */
|
|
44
|
+
closed: () => void;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* The settings frame, mounted once and shown as often as it is asked for.
|
|
49
|
+
*
|
|
50
|
+
* Closing it closes the platform's `<dialog>` and leaves the document standing in the dialog layer,
|
|
51
|
+
* so the next open is one `showModal()` on a frame whose editor is already built, not a mount of
|
|
52
|
+
* the whole editor. Only {@link SettingsDialogHandle.dispose} takes it down.
|
|
53
|
+
*/
|
|
54
|
+
export interface SettingsDialogHandle {
|
|
55
|
+
/** The slot in the dialog layer that carries the region. */
|
|
56
|
+
host: HTMLElement;
|
|
57
|
+
/** Resolves with the `jx-dialog` element once it has rendered (and been opened, if still asked). */
|
|
58
|
+
ready: Promise<HTMLElement>;
|
|
59
|
+
/** Show it again after a close. Resolves once it is showing. */
|
|
60
|
+
show: () => Promise<HTMLElement>;
|
|
61
|
+
/** Close the dialog (the platform restores focus); the document stays mounted. Idempotent. */
|
|
62
|
+
close: () => void;
|
|
63
|
+
/** Close it and take the document and its slot down for good. Idempotent. */
|
|
64
|
+
dispose: () => void;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
interface SettingsDialogScope {
|
|
68
|
+
closed: () => void;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/** The `part` a node's definition carries, or `""` for a text node or an unmarked element. */
|
|
72
|
+
function partOf(def: JxElement | string): string {
|
|
73
|
+
const part = isString(def) ? undefined : def.attributes?.["part"];
|
|
74
|
+
return isString(part) ? part : "";
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Mount the dialog and open it. The handle's `ready` resolves once it is showing.
|
|
79
|
+
*
|
|
80
|
+
* @param {SettingsDialogOptions} options
|
|
81
|
+
* @returns {SettingsDialogHandle}
|
|
82
|
+
*/
|
|
83
|
+
export function openSettingsDialogSurface(options: SettingsDialogOptions): SettingsDialogHandle {
|
|
84
|
+
const slot = document.createElement("div");
|
|
85
|
+
/* The layer is `pointer-events: none` so a click passes through it when nothing is up, and every
|
|
86
|
+
slot in it turns them back on for its own content. `pointer-events` INHERITS, and the top layer
|
|
87
|
+
changes paint order rather than inheritance, so a modal `<dialog>` in a slot that skipped this
|
|
88
|
+
is painted above everything and hit-tests to nothing. */
|
|
89
|
+
slot.style.pointerEvents = "auto";
|
|
90
|
+
options.layer.append(slot);
|
|
91
|
+
|
|
92
|
+
/** Whether the dialog is asked to be showing: true from each open until its close. */
|
|
93
|
+
let wanted = true;
|
|
94
|
+
let disposed = false;
|
|
95
|
+
/** Say this showing is over, once: the platform's own `close` and `close()` can each be first. */
|
|
96
|
+
const finish = (): void => {
|
|
97
|
+
if (!wanted) {
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
wanted = false;
|
|
101
|
+
options.closed();
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
const scope = reactive<SettingsDialogScope>({ closed: finish });
|
|
105
|
+
|
|
106
|
+
let mounted: SurfaceHandle | null = null;
|
|
107
|
+
/** Open the platform's dialog, if it is still asked for. Read through a call after each await. */
|
|
108
|
+
const open = (element: HTMLElement): HTMLElement => {
|
|
109
|
+
if (!disposed && wanted) {
|
|
110
|
+
showModal(element);
|
|
111
|
+
}
|
|
112
|
+
return element;
|
|
113
|
+
};
|
|
114
|
+
const ready = mountSurface("settings-dialog", scope, slot, {
|
|
115
|
+
onNodeCreated: (element, _path, def) => {
|
|
116
|
+
if (!disposed && element instanceof HTMLElement && partOf(def) === "pane-slot") {
|
|
117
|
+
options.body(element);
|
|
118
|
+
}
|
|
119
|
+
},
|
|
120
|
+
}).then(async (surface) => {
|
|
121
|
+
/* SAFETY: `settings-dialog.json`'s root definition is a `jx-dialog` element, so the runtime
|
|
122
|
+
mounts an HTMLElement. */
|
|
123
|
+
const element = surface.root as HTMLElement;
|
|
124
|
+
if (disposed) {
|
|
125
|
+
surface.dispose();
|
|
126
|
+
return element;
|
|
127
|
+
}
|
|
128
|
+
mounted = surface;
|
|
129
|
+
await whenReady(element);
|
|
130
|
+
/* The region goes on the platform's own `<dialog>`, the one element here that HAS a box:
|
|
131
|
+
`jx-dialog` is `display: contents`, and the slot wraps a dialog the top layer takes out of
|
|
132
|
+
flow, so both measure 0×0, and a region whose box is empty is refused by the screenshot
|
|
133
|
+
pipeline. The kit's own behaviour sidecar finds that node by exactly this selector. */
|
|
134
|
+
const box = element.querySelector<HTMLElement>('dialog[part="dialog"]') ?? element;
|
|
135
|
+
box.setAttribute(REGION_ATTR, SETTINGS_DIALOG_REGION);
|
|
136
|
+
return open(element);
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
const hide = (): void => {
|
|
140
|
+
const element = mounted?.root;
|
|
141
|
+
if (element instanceof HTMLElement) {
|
|
142
|
+
// The platform's close, so focus goes back where it came from before anything else moves.
|
|
143
|
+
close(element);
|
|
144
|
+
}
|
|
145
|
+
finish();
|
|
146
|
+
};
|
|
147
|
+
|
|
148
|
+
return {
|
|
149
|
+
close: hide,
|
|
150
|
+
dispose() {
|
|
151
|
+
if (disposed) {
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
hide();
|
|
155
|
+
disposed = true;
|
|
156
|
+
mounted?.dispose();
|
|
157
|
+
mounted = null;
|
|
158
|
+
slot.remove();
|
|
159
|
+
},
|
|
160
|
+
host: slot,
|
|
161
|
+
ready,
|
|
162
|
+
show() {
|
|
163
|
+
if (!disposed) {
|
|
164
|
+
wanted = true;
|
|
165
|
+
}
|
|
166
|
+
return ready.then(open);
|
|
167
|
+
},
|
|
168
|
+
};
|
|
169
|
+
}
|
|
@@ -26,10 +26,9 @@
|
|
|
26
26
|
import { reactive } from "../reactivity";
|
|
27
27
|
import { mountSurface, registerSurface } from "../ui/surface";
|
|
28
28
|
import extensionsDoc from "./settings-extensions.json";
|
|
29
|
-
import type { JxDocument } from "@jxsuite/schema/types";
|
|
30
29
|
import type { SurfaceHandle } from "../ui/surface";
|
|
31
30
|
|
|
32
|
-
registerSurface("settings-extensions", extensionsDoc
|
|
31
|
+
registerSurface("settings-extensions", extensionsDoc);
|
|
33
32
|
|
|
34
33
|
/** One `project.json` key an extension owns, as the chip repeater reads it. */
|
|
35
34
|
export interface ExtensionSectionView {
|
|
@@ -117,7 +116,7 @@ export interface ExtensionsSurfaceHandle {
|
|
|
117
116
|
* value already in the view, and a view that had to keep them in step would be a second place to
|
|
118
117
|
* get it wrong.
|
|
119
118
|
*/
|
|
120
|
-
interface ExtensionsScope extends
|
|
119
|
+
interface ExtensionsScope extends ExtensionsView, ExtensionsActions {
|
|
121
120
|
/** Whether to draw the groups or the sentence that says what this region is for. */
|
|
122
121
|
listState: "empty" | "groups";
|
|
123
122
|
hasError: boolean;
|
|
@@ -147,14 +146,14 @@ export function mountExtensionsSurface(
|
|
|
147
146
|
view: ExtensionsView,
|
|
148
147
|
actions: ExtensionsActions,
|
|
149
148
|
): ExtensionsSurfaceHandle {
|
|
150
|
-
const scope = reactive<ExtensionsScope>({
|
|
149
|
+
const scope: ExtensionsScope = reactive<ExtensionsScope>({
|
|
151
150
|
error: "",
|
|
152
151
|
groups: [],
|
|
153
152
|
hasError: false,
|
|
154
153
|
listState: "empty",
|
|
155
154
|
remove: actions.remove,
|
|
156
155
|
toggle: actions.toggle,
|
|
157
|
-
})
|
|
156
|
+
});
|
|
158
157
|
project(scope, view);
|
|
159
158
|
|
|
160
159
|
container.replaceChildren();
|
|
@@ -182,7 +181,7 @@ export function mountExtensionsSurface(
|
|
|
182
181
|
!disposed &&
|
|
183
182
|
(mounted === null
|
|
184
183
|
? container.childNodes.length === 0
|
|
185
|
-
:
|
|
184
|
+
: mounted.root.parentNode === container),
|
|
186
185
|
dispose() {
|
|
187
186
|
disposed = true;
|
|
188
187
|
mounted?.dispose();
|
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
* @docs studio/projects/settings
|
|
19
19
|
*/
|
|
20
20
|
|
|
21
|
+
import { isString } from "@jxsuite/schema/guards";
|
|
21
22
|
import { reactive } from "../reactivity";
|
|
22
23
|
import { projectState } from "../store";
|
|
23
24
|
import { updateSiteConfig } from "../site-context";
|
|
@@ -29,24 +30,15 @@ import {
|
|
|
29
30
|
isGoogleFontEntry,
|
|
30
31
|
} from "../utils/google-fonts";
|
|
31
32
|
import { mountSurface, registerSurface } from "../ui/surface";
|
|
33
|
+
import { HEAD_EDIT_DEBOUNCE } from "../ui/timing";
|
|
32
34
|
import headDoc from "./settings-head.json";
|
|
33
|
-
import type {
|
|
34
|
-
import type { SurfaceHandle } from "../ui/surface";
|
|
35
|
+
import type { JsonValue, JxHeadEntry, ProjectConfig } from "@jxsuite/schema/types";
|
|
36
|
+
import type { SurfaceHandle, TaggedLabel } from "../ui/surface";
|
|
35
37
|
|
|
36
|
-
registerSurface("settings-head", headDoc
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* How long a keystroke waits before it is written.
|
|
40
|
-
*
|
|
41
|
-
* Every field commit is a `project.json` write, and the two body fields commit on `input` — one
|
|
42
|
-
* write per keystroke without this. The lit editor debounced per ENTRY, with one timer shared by
|
|
43
|
-
* that entry's fields, so editing `rel` and then `href` inside the window cancelled the first write
|
|
44
|
-
* outright; the timers are per field here, which is why each edit lands.
|
|
45
|
-
*/
|
|
46
|
-
const EDIT_DEBOUNCE_MS = 300;
|
|
38
|
+
registerSurface("settings-head", headDoc);
|
|
47
39
|
|
|
48
40
|
/** One `$head` entry as the document draws it: which fields, and what is in them. */
|
|
49
|
-
interface HeadRow
|
|
41
|
+
interface HeadRow {
|
|
50
42
|
id: string;
|
|
51
43
|
/** The tag name, drawn as `<link>` and named in the delete button. */
|
|
52
44
|
tag: string;
|
|
@@ -64,18 +56,12 @@ interface HeadRow extends Record<string, unknown> {
|
|
|
64
56
|
}
|
|
65
57
|
|
|
66
58
|
/** One Google Fonts stylesheet link, by the family it loads. */
|
|
67
|
-
interface FontRow
|
|
59
|
+
interface FontRow {
|
|
68
60
|
id: string;
|
|
69
61
|
family: string;
|
|
70
62
|
}
|
|
71
63
|
|
|
72
|
-
|
|
73
|
-
interface AddTag extends Record<string, unknown> {
|
|
74
|
-
tag: string;
|
|
75
|
-
label: string;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
interface HeadScope extends Record<string, unknown> {
|
|
64
|
+
interface HeadScope {
|
|
79
65
|
rows: HeadRow[];
|
|
80
66
|
fonts: FontRow[];
|
|
81
67
|
/**
|
|
@@ -85,7 +71,8 @@ interface HeadScope extends Record<string, unknown> {
|
|
|
85
71
|
fontsState: "empty" | "listed";
|
|
86
72
|
/** What is in the family field. The document reads it back, so clearing it is an assignment. */
|
|
87
73
|
fontDraft: string;
|
|
88
|
-
tags
|
|
74
|
+
/** The four tags the section can add, each with the words on the button that adds it. */
|
|
75
|
+
tags: TaggedLabel[];
|
|
89
76
|
add: (tag: string) => void;
|
|
90
77
|
remove: (id: string) => void;
|
|
91
78
|
edit: (id: string, key: string, value: string) => void;
|
|
@@ -94,7 +81,7 @@ interface HeadScope extends Record<string, unknown> {
|
|
|
94
81
|
removeFont: (id: string) => void;
|
|
95
82
|
}
|
|
96
83
|
|
|
97
|
-
const ADD_TAGS:
|
|
84
|
+
const ADD_TAGS: TaggedLabel[] = [
|
|
98
85
|
{ label: "+ Link", tag: "link" },
|
|
99
86
|
{ label: "+ Meta", tag: "meta" },
|
|
100
87
|
{ label: "+ Script", tag: "script" },
|
|
@@ -137,7 +124,7 @@ let _entries: JxHeadEntry[] = [];
|
|
|
137
124
|
* between would answer "no entries" and lose the tag that was just added.
|
|
138
125
|
*/
|
|
139
126
|
function entries(): JxHeadEntry[] {
|
|
140
|
-
const config =
|
|
127
|
+
const config = projectState?.projectConfig ?? null;
|
|
141
128
|
if (config !== _config) {
|
|
142
129
|
_config = config;
|
|
143
130
|
_entries = [];
|
|
@@ -150,7 +137,7 @@ function entries(): JxHeadEntry[] {
|
|
|
150
137
|
}
|
|
151
138
|
const declared = config?.$head;
|
|
152
139
|
if (Array.isArray(declared)) {
|
|
153
|
-
_entries = declared
|
|
140
|
+
_entries = declared;
|
|
154
141
|
}
|
|
155
142
|
return _entries;
|
|
156
143
|
}
|
|
@@ -161,8 +148,8 @@ function entryFor(id: string): JxHeadEntry | undefined {
|
|
|
161
148
|
}
|
|
162
149
|
|
|
163
150
|
/** A `$head` attribute as a field's text: anything that is not a string has none to show. */
|
|
164
|
-
function text(value:
|
|
165
|
-
return
|
|
151
|
+
function text(value: JsonValue | undefined): string {
|
|
152
|
+
return isString(value) ? value : "";
|
|
166
153
|
}
|
|
167
154
|
|
|
168
155
|
// ─── The projection ───────────────────────────────────────────────────────────
|
|
@@ -171,19 +158,21 @@ function text(value: unknown): string {
|
|
|
171
158
|
function row(entry: JxHeadEntry): HeadRow {
|
|
172
159
|
const attributes = entry.attributes ?? {};
|
|
173
160
|
const src = text(attributes["src"]);
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
161
|
+
/* `project.json` is read off disk unvalidated, so an entry can arrive without a `tagName`; like
|
|
162
|
+
an attribute, a tag that is not a string has none to show. */
|
|
163
|
+
const tag = text(entry.tagName);
|
|
164
|
+
const kinds = new Map<string, HeadRow["kind"]>([
|
|
165
|
+
["link", "link"],
|
|
166
|
+
["meta", "meta"],
|
|
167
|
+
["script", src === "" ? "script-inline" : "script"],
|
|
168
|
+
["style", "style"],
|
|
169
|
+
]);
|
|
181
170
|
return {
|
|
182
171
|
body: text(entry.textContent),
|
|
183
172
|
content: text(attributes["content"]),
|
|
184
173
|
href: text(attributes["href"]),
|
|
185
174
|
id: idOf(entry),
|
|
186
|
-
kind: kinds
|
|
175
|
+
kind: kinds.get(tag) ?? "none",
|
|
187
176
|
name: text(attributes["name"]),
|
|
188
177
|
rel: text(attributes["rel"]),
|
|
189
178
|
src,
|
|
@@ -212,7 +201,12 @@ function save(): void {
|
|
|
212
201
|
void updateSiteConfig({ $head: entries() });
|
|
213
202
|
}
|
|
214
203
|
|
|
215
|
-
/**
|
|
204
|
+
/**
|
|
205
|
+
* Field edits waiting out {@link HEAD_EDIT_DEBOUNCE}, one per field. The two body fields commit on
|
|
206
|
+
* `input`, so without the wait every keystroke would be a `project.json` write; the lit editor
|
|
207
|
+
* shared one timer per ENTRY, so editing `rel` and then `href` inside the window cancelled the
|
|
208
|
+
* first write outright.
|
|
209
|
+
*/
|
|
216
210
|
const _pending = new Map<string, { commit: () => void; timer: ReturnType<typeof setTimeout> }>();
|
|
217
211
|
|
|
218
212
|
/**
|
|
@@ -302,7 +296,7 @@ function state(): HeadScope {
|
|
|
302
296
|
_pending.delete(token);
|
|
303
297
|
write(id, key, value);
|
|
304
298
|
};
|
|
305
|
-
_pending.set(token, { commit, timer: setTimeout(commit,
|
|
299
|
+
_pending.set(token, { commit, timer: setTimeout(commit, HEAD_EDIT_DEBOUNCE) });
|
|
306
300
|
},
|
|
307
301
|
fonts: [],
|
|
308
302
|
fontDraft: "",
|
|
@@ -339,7 +333,7 @@ function state(): HeadScope {
|
|
|
339
333
|
},
|
|
340
334
|
rows: [],
|
|
341
335
|
tags: ADD_TAGS,
|
|
342
|
-
})
|
|
336
|
+
});
|
|
343
337
|
return _scope;
|
|
344
338
|
}
|
|
345
339
|
|
|
@@ -24,28 +24,16 @@
|
|
|
24
24
|
import { reactive } from "../reactivity";
|
|
25
25
|
import { mountSurface, registerSurface } from "../ui/surface";
|
|
26
26
|
import localesDoc from "./settings-locales.json";
|
|
27
|
-
import type { SurfaceHandle } from "../ui/surface";
|
|
28
|
-
import type { JxDocument } from "@jxsuite/schema/types";
|
|
27
|
+
import type { SurfaceHandle, SurfaceOption, TaggedLabel } from "../ui/surface";
|
|
29
28
|
|
|
30
|
-
registerSurface("settings-locales", localesDoc
|
|
31
|
-
|
|
32
|
-
/** One declared language: the tag as the author wrote it, and the name that language calls itself. */
|
|
33
|
-
export interface LocaleRow {
|
|
34
|
-
tag: string;
|
|
35
|
-
label: string;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/** One row of a picker. */
|
|
39
|
-
export interface LocaleChoice {
|
|
40
|
-
value: string;
|
|
41
|
-
label: string;
|
|
42
|
-
}
|
|
29
|
+
registerSurface("settings-locales", localesDoc);
|
|
43
30
|
|
|
44
31
|
/** What the section shows — the flow's projection of `project.json` and of the form beside it. */
|
|
45
32
|
export interface LocalesView {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
33
|
+
/** Each declared language: the tag as the author wrote it, and the name it calls itself. */
|
|
34
|
+
locales: TaggedLabel[];
|
|
35
|
+
localeOptions: SurfaceOption[];
|
|
36
|
+
routings: SurfaceOption[];
|
|
49
37
|
defaultLocale: string;
|
|
50
38
|
routing: string;
|
|
51
39
|
/** The tag being typed, kept so an outside redraw does not take it away. */
|
|
@@ -80,7 +68,7 @@ interface LocalesFlags {
|
|
|
80
68
|
hasError: boolean;
|
|
81
69
|
}
|
|
82
70
|
|
|
83
|
-
interface LocalesScope extends
|
|
71
|
+
interface LocalesScope extends LocalesView, LocalesActions, LocalesFlags {}
|
|
84
72
|
|
|
85
73
|
interface Mounted {
|
|
86
74
|
scope: LocalesScope;
|
|
@@ -124,7 +112,7 @@ export function renderLocalesSurface(
|
|
|
124
112
|
}
|
|
125
113
|
existing?.handle?.dispose();
|
|
126
114
|
host.textContent = "";
|
|
127
|
-
const scope = reactive({ ...derive(view), ...actions })
|
|
115
|
+
const scope: LocalesScope = reactive<LocalesScope>({ ...derive(view), ...actions });
|
|
128
116
|
const record: Mounted = { handle: null, scope };
|
|
129
117
|
mounts.set(host, record);
|
|
130
118
|
/* No race to arbitrate: a redraw arriving while this is in flight takes the branch above — a
|
|
@@ -278,7 +278,7 @@
|
|
|
278
278
|
"tagName": "img",
|
|
279
279
|
"attributes": {
|
|
280
280
|
"part": "favicon",
|
|
281
|
-
"src": "${state.
|
|
281
|
+
"src": "${state.faviconSrc}",
|
|
282
282
|
"alt": "Current favicon"
|
|
283
283
|
}
|
|
284
284
|
},
|
|
@@ -372,7 +372,7 @@
|
|
|
372
372
|
"$props": {
|
|
373
373
|
"span": true,
|
|
374
374
|
"label": "Global Styles",
|
|
375
|
-
"description": "
|
|
375
|
+
"description": "The CSS variables and the default element styles that apply across every page live in the Styles workspace, which edits this same file."
|
|
376
376
|
},
|
|
377
377
|
"attributes": {
|
|
378
378
|
"part": "row",
|
|
@@ -411,7 +411,7 @@
|
|
|
411
411
|
"children": [
|
|
412
412
|
{
|
|
413
413
|
"tagName": "span",
|
|
414
|
-
"textContent": "
|
|
414
|
+
"textContent": "Go to Styles"
|
|
415
415
|
}
|
|
416
416
|
]
|
|
417
417
|
}
|
|
@@ -24,10 +24,9 @@
|
|
|
24
24
|
import { reactive } from "../reactivity";
|
|
25
25
|
import { mountSurface, registerSurface } from "../ui/surface";
|
|
26
26
|
import overviewDoc from "./settings-overview.json";
|
|
27
|
-
import type { JxDocument } from "@jxsuite/schema/types";
|
|
28
27
|
import type { SurfaceHandle } from "../ui/surface";
|
|
29
28
|
|
|
30
|
-
registerSurface("settings-overview", overviewDoc
|
|
29
|
+
registerSurface("settings-overview", overviewDoc);
|
|
31
30
|
|
|
32
31
|
/** Which control a failure belongs under. `"section"` puts it at the top of the section. */
|
|
33
32
|
export type OverviewErrorField = "name" | "description" | "url" | "favicon" | "section";
|
|
@@ -43,9 +42,11 @@ export interface OverviewValues {
|
|
|
43
42
|
name: string;
|
|
44
43
|
description: string;
|
|
45
44
|
url: string;
|
|
46
|
-
/** The configured favicon path, or `""` for none. */
|
|
45
|
+
/** The configured favicon path, as `$head` names it, or `""` for none. */
|
|
47
46
|
favicon: string;
|
|
48
|
-
/** The
|
|
47
|
+
/** The src the parent realm loads to preview {@link favicon}: the authored value, resolved. */
|
|
48
|
+
faviconSrc: string;
|
|
49
|
+
/** The `workspace.focus.styles` record's own title (Go to Styles), the button's tooltip. */
|
|
49
50
|
stylesTitle: string;
|
|
50
51
|
stylesDisabled: boolean;
|
|
51
52
|
/** The last failure, or `null` when the last write succeeded. */
|
|
@@ -74,7 +75,7 @@ export interface OverviewSurfaceHandle {
|
|
|
74
75
|
* The scope the document reads: one field per binding, because `$switch` is the only conditional a
|
|
75
76
|
* document has and `error.field === "name"` is not a value it can switch on.
|
|
76
77
|
*/
|
|
77
|
-
interface OverviewScope
|
|
78
|
+
interface OverviewScope {
|
|
78
79
|
nameValue: string;
|
|
79
80
|
nameError: string;
|
|
80
81
|
nameInvalid: boolean;
|
|
@@ -85,6 +86,7 @@ interface OverviewScope extends Record<string, unknown> {
|
|
|
85
86
|
urlError: string;
|
|
86
87
|
urlInvalid: boolean;
|
|
87
88
|
favicon: string;
|
|
89
|
+
faviconSrc: string;
|
|
88
90
|
hasFavicon: boolean;
|
|
89
91
|
faviconError: string;
|
|
90
92
|
hasFaviconError: boolean;
|
|
@@ -125,6 +127,9 @@ function project(scope: OverviewScope, patch: Partial<OverviewValues>): void {
|
|
|
125
127
|
scope.favicon = patch.favicon;
|
|
126
128
|
scope.hasFavicon = patch.favicon !== "";
|
|
127
129
|
}
|
|
130
|
+
if (patch.faviconSrc !== undefined) {
|
|
131
|
+
scope.faviconSrc = patch.faviconSrc;
|
|
132
|
+
}
|
|
128
133
|
if (patch.stylesTitle !== undefined) {
|
|
129
134
|
scope.stylesTitle = patch.stylesTitle;
|
|
130
135
|
}
|
|
@@ -157,12 +162,13 @@ export function mountOverviewSurface(
|
|
|
157
162
|
values: OverviewValues,
|
|
158
163
|
actions: OverviewActions,
|
|
159
164
|
): OverviewSurfaceHandle {
|
|
160
|
-
const scope = reactive<OverviewScope>({
|
|
165
|
+
const scope: OverviewScope = reactive<OverviewScope>({
|
|
161
166
|
descriptionError: "",
|
|
162
167
|
descriptionInvalid: false,
|
|
163
168
|
descriptionValue: "",
|
|
164
169
|
favicon: "",
|
|
165
170
|
faviconError: "",
|
|
171
|
+
faviconSrc: "",
|
|
166
172
|
hasFavicon: false,
|
|
167
173
|
hasFaviconError: false,
|
|
168
174
|
hasSectionError: false,
|
|
@@ -180,7 +186,7 @@ export function mountOverviewSurface(
|
|
|
180
186
|
urlError: "",
|
|
181
187
|
urlInvalid: false,
|
|
182
188
|
urlValue: "",
|
|
183
|
-
})
|
|
189
|
+
});
|
|
184
190
|
project(scope, values);
|
|
185
191
|
|
|
186
192
|
container.replaceChildren();
|
|
@@ -208,7 +214,7 @@ export function mountOverviewSurface(
|
|
|
208
214
|
!disposed &&
|
|
209
215
|
(mounted === null
|
|
210
216
|
? container.childNodes.length === 0
|
|
211
|
-
:
|
|
217
|
+
: mounted.root.parentNode === container),
|
|
212
218
|
dispose() {
|
|
213
219
|
disposed = true;
|
|
214
220
|
mounted?.dispose();
|
|
@@ -32,9 +32,8 @@ import { reactive } from "../reactivity";
|
|
|
32
32
|
import { mountSurface, registerSurface } from "../ui/surface";
|
|
33
33
|
import packagesDoc from "./settings-packages.json";
|
|
34
34
|
import type { SurfaceHandle } from "../ui/surface";
|
|
35
|
-
import type { JxDocument } from "@jxsuite/schema/types";
|
|
36
35
|
|
|
37
|
-
registerSurface("settings-packages", packagesDoc
|
|
36
|
+
registerSurface("settings-packages", packagesDoc);
|
|
38
37
|
|
|
39
38
|
/** One dependency, as the table draws it. Every field is already a string the row can print. */
|
|
40
39
|
export interface PackageRow {
|
|
@@ -79,7 +78,7 @@ export interface PackagesActions {
|
|
|
79
78
|
}
|
|
80
79
|
|
|
81
80
|
/** One row plus the flag its buttons switch on. */
|
|
82
|
-
interface RowScope extends
|
|
81
|
+
interface RowScope extends PackageRow {
|
|
83
82
|
/** Whether to draw the update button — `upgrade` said as something a `$switch` can read. */
|
|
84
83
|
canUpdate: boolean;
|
|
85
84
|
}
|
|
@@ -96,11 +95,13 @@ interface PackagesFlags {
|
|
|
96
95
|
hasUpdates: boolean;
|
|
97
96
|
}
|
|
98
97
|
|
|
99
|
-
|
|
100
|
-
|
|
98
|
+
/** Everything {@link derive} computes from a view: the scope minus the reader's actions. */
|
|
99
|
+
interface PackagesDerived extends Omit<PackagesView, "rows">, PackagesFlags {
|
|
101
100
|
rows: RowScope[];
|
|
102
101
|
}
|
|
103
102
|
|
|
103
|
+
interface PackagesScope extends PackagesDerived, PackagesActions {}
|
|
104
|
+
|
|
104
105
|
interface Mounted {
|
|
105
106
|
scope: PackagesScope;
|
|
106
107
|
/** `null` while the mount is still in flight — which is a standing surface, not a missing one. */
|
|
@@ -110,7 +111,7 @@ interface Mounted {
|
|
|
110
111
|
const mounts = new WeakMap<HTMLElement, Mounted>();
|
|
111
112
|
|
|
112
113
|
/** The view plus the flags the document switches on. */
|
|
113
|
-
function derive(view: PackagesView):
|
|
114
|
+
function derive(view: PackagesView): PackagesDerived {
|
|
114
115
|
const rows = view.rows.map((row): RowScope => ({ ...row, canUpdate: row.upgrade !== "" }));
|
|
115
116
|
return {
|
|
116
117
|
addName: view.addName,
|
|
@@ -145,7 +146,7 @@ export function renderPackagesSurface(
|
|
|
145
146
|
}
|
|
146
147
|
existing?.handle?.dispose();
|
|
147
148
|
host.textContent = "";
|
|
148
|
-
const scope = reactive({ ...derive(view), ...actions })
|
|
149
|
+
const scope: PackagesScope = reactive<PackagesScope>({ ...derive(view), ...actions });
|
|
149
150
|
const record: Mounted = { handle: null, scope };
|
|
150
151
|
mounts.set(host, record);
|
|
151
152
|
/* No race to arbitrate: a redraw arriving while this is in flight takes the branch above — a
|