@jxsuite/studio 6.1.2 → 8.0.1
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/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-0fj8a4ga.js → color-area-6rbra5dy.js} +2 -2
- package/dist/chunks/{color-field-xch8kx2g.js → color-field-gy56c94g.js} +3 -3
- package/dist/chunks/color-m7r1vk54.js +4 -0
- package/dist/chunks/{color-slider-jxd8v350.js → color-slider-sqqdyf6c.js} +2 -2
- package/dist/chunks/{combobox-p0efwjke.js → combobox-72h32ejk.js} +3 -3
- 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/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-d2wq9ezg.js → grid-view-qg1b5eqx.js} +25 -25
- package/dist/chunks/{icons-pnfz478q.js → icons-63bjtbs7.js} +2 -2
- package/dist/chunks/{iframe-entry-jdcktez8.js → iframe-entry-2zggzajv.js} +4 -4
- package/dist/chunks/{iframe-entry-zap785cw.js → iframe-entry-76j8vwwx.js} +4 -4
- package/dist/chunks/iframe-entry-99nr5zfb.js +5 -0
- package/dist/chunks/{iframe-entry-x0ygf2yr.js → iframe-entry-pkgmcgp0.js} +4 -4
- package/dist/chunks/iframe-host-ssv7kyj0.js +4 -0
- package/dist/chunks/{index-zpjmzqfk.js → index-32eqzv1k.js} +3 -3
- package/dist/chunks/index-f0jn7nnp.js +4 -0
- package/dist/chunks/{javascript-m54mnwp6.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-e74qjyq6.js → listbox-c421cf8c.js} +2 -2
- 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-n6yzswmy.js → menu-bdpzbfvs.js} +2 -2
- package/dist/chunks/{monaco-binding-7gx83x3r.js → monaco-binding-vq1hgnn0.js} +3 -3
- 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/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/source-control-kwktr9y6.js +4 -0
- package/dist/chunks/{split-n2gfpm5m.js → split-c9zfdgxf.js} +2 -2
- 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-2j1cb95x.js → studio-6m380wp7.js} +4 -4
- package/dist/chunks/studio-80jyh1xh.js +4 -0
- package/dist/chunks/studio-83mk4bgg.js +9 -0
- package/dist/chunks/{studio-v0jzqdjm.js → studio-881z1xrx.js} +4 -4
- package/dist/chunks/studio-8m0y2qe7.js +5 -0
- package/dist/chunks/{studio-d81xfh1g.js → studio-8tr6cfrc.js} +4 -4
- 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-dgz8d0c1.js → studio-bbe4c90a.js} +4 -4
- 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-90pq9km1.js → studio-jcnsdaep.js} +4 -4
- package/dist/chunks/studio-jsgf2q5k.js +7 -0
- package/dist/chunks/{studio-0q988f9w.js → studio-k3xxbagr.js} +3 -3
- package/dist/chunks/{studio-5ve6bbep.js → studio-k7evxqh4.js} +4 -4
- 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-485046te.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-1fxkaaea.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-tq0rtfwj.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-a3g98wjr.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-r5qy30vx.js +5 -0
- 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/toast-1gv0h53h.js +4 -0
- package/dist/chunks/{toast-host-ke5z4ng7.js → toast-host-1yg5ar8d.js} +3 -3
- package/dist/chunks/{tooltip-5v8ngwj2.js → tooltip-yypz28gq.js} +3 -3
- package/dist/chunks/{tree-mdq3v5cw.js → tree-9xa4hm7n.js} +2 -2
- 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-nze0k6mv.js → ws-client-bv552sfx.js} +3 -3
- package/dist/iframe-entry.js +20 -16
- package/dist/manifest.json +77 -63
- package/dist/studio.js +103 -104
- package/dist/workers/ts.worker.js +3 -3
- package/package.json +12 -11
- package/src/browse/component-examples.ts +272 -0
- package/src/browse/library-commands.ts +64 -104
- package/src/browse/library-layouts.ts +263 -49
- package/src/browse/library-model.ts +181 -133
- package/src/browse/library-pane.ts +738 -446
- package/src/browse/library-preview.ts +149 -19
- 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 +16 -1
- package/src/canvas/canvas-live-render.ts +222 -30
- package/src/canvas/canvas-origin.ts +37 -12
- package/src/canvas/canvas-page-context.ts +112 -0
- package/src/canvas/canvas-render.ts +113 -107
- package/src/canvas/canvas-utils.ts +57 -12
- package/src/canvas/iframe-drop.ts +107 -0
- package/src/canvas/iframe-entry.ts +24 -12
- package/src/canvas/iframe-host.ts +134 -62
- package/src/canvas/iframe-keys.ts +11 -0
- package/src/canvas/iframe-patch.ts +8 -7
- package/src/canvas/iframe-protocol.ts +24 -5
- package/src/canvas/iframe-render.ts +48 -1
- package/src/canvas/iframe-subtree.ts +5 -2
- package/src/canvas/npm-modules.ts +22 -0
- package/src/canvas/preview-navigate.ts +16 -0
- package/src/canvas/repeater-sources.ts +200 -0
- package/src/canvas/stage-scrollbar.ts +5 -1
- package/src/canvas/surface-registry.ts +6 -0
- package/src/commands/app-commands.ts +16 -6
- package/src/commands/budget.ts +10 -8
- package/src/commands/context.ts +35 -10
- package/src/commands/defaults.ts +69 -45
- package/src/commands/keymap.ts +9 -0
- package/src/commands/levels.ts +11 -5
- package/src/commands/live-context.ts +2 -0
- package/src/commands/registry.ts +10 -1
- package/src/content/collection-match.ts +6 -5
- package/src/content/collection-pages.ts +412 -0
- package/src/content/content-collections.ts +270 -0
- package/src/content/entry-commands.ts +51 -60
- package/src/content/entry-editor.ts +111 -18
- package/src/content/entry-fields.ts +13 -1
- package/src/content/entry-inspector.ts +225 -0
- package/src/content/entry-model.ts +17 -3
- 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/convert-to-component.ts +67 -43
- package/src/editor/file-drop-action.ts +9 -1
- package/src/editor/inline-edit-apply.ts +44 -0
- package/src/editor/inline-edit.ts +10 -0
- package/src/editor/insert-component.ts +91 -0
- package/src/editor/insert-zone-action.ts +13 -4
- package/src/editor/shortcuts.ts +44 -22
- package/src/editor/slash-menu.ts +51 -8
- package/src/files/components.ts +74 -10
- package/src/files/file-ops.ts +15 -5
- package/src/files/files.ts +164 -150
- package/src/files/fs-events.ts +18 -7
- package/src/files/media-meta.ts +95 -1
- 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 +13 -3
- package/src/format/format-host.ts +15 -0
- package/src/github/github-auth.ts +2 -2
- package/src/github/github-publish.ts +4 -3
- package/src/grid/grid-controller.ts +5 -1
- package/src/grid/grid-open.ts +0 -27
- package/src/grid/grid-panel.ts +54 -2
- package/src/grid/grid-reveal.ts +34 -0
- package/src/grid/grid-source.ts +3 -25
- package/src/grid/grid-view.ts +31 -6
- package/src/grid/sources/content-source.ts +75 -7
- package/src/grid/tabulator-tables.d.ts +6 -0
- package/src/hosting/document.ts +2 -2
- package/src/i18n/i18n-commands.ts +2 -1
- 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 +47 -19
- package/src/packages/pull-package-sync.ts +1 -1
- package/src/panels/activity-panel.ts +21 -5
- package/src/panels/ai-chat/chat-markdown.ts +8 -8
- package/src/panels/block-action-bar.ts +11 -11
- package/src/panels/canvas-dnd-bridge.ts +5 -2
- 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 +1 -1
- package/src/panels/data-grid.ts +4 -0
- package/src/panels/dnd.ts +17 -30
- package/src/panels/elements-panel.ts +9 -2
- package/src/panels/empty-state.ts +2 -2
- package/src/panels/formula-workspace.ts +2 -3
- package/src/panels/frontmatter-fields.ts +9 -9
- package/src/panels/git-diff-open.ts +9 -5
- package/src/panels/head-panel.ts +369 -103
- package/src/panels/i18n-panel.ts +11 -10
- package/src/panels/imports-panel.ts +2 -0
- package/src/panels/jump-bar.ts +27 -2
- package/src/panels/layers-panel.ts +36 -30
- package/src/panels/left-panel.ts +22 -8
- package/src/panels/navigator-panels.ts +23 -11
- package/src/panels/pane-context.ts +111 -29
- package/src/panels/pane-grid.ts +6 -6
- package/src/panels/panel-registry.ts +14 -9
- package/src/panels/properties-panel.ts +7 -3
- package/src/panels/right-panel.ts +199 -43
- package/src/panels/seo-modal.ts +41 -108
- package/src/panels/settings-menu.ts +52 -50
- package/src/panels/settings-pane.ts +268 -162
- package/src/panels/signals-panel.ts +3 -4
- package/src/panels/site-model.ts +367 -0
- package/src/panels/site-panel.ts +638 -0
- package/src/panels/style-panel.ts +37 -3
- package/src/panels/stylebook-doc.ts +142 -10
- package/src/panels/stylebook-layers-panel.ts +39 -80
- package/src/panels/stylebook-panel.ts +47 -10
- package/src/panels/styles-panel.ts +327 -0
- package/src/panels/tab-strip.ts +109 -25
- package/src/platform.ts +1 -1
- package/src/platforms/cloud.ts +28 -1
- package/src/platforms/default-platform.ts +4 -4
- package/src/platforms/devserver.ts +51 -25
- package/src/publish/deploy-checklist.ts +12 -7
- package/src/publish/pages-service.ts +38 -14
- package/src/publish/publish-changes.ts +491 -0
- package/src/publish/publish-commands.ts +83 -18
- package/src/publish/publish-ids.ts +49 -0
- 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/services/automation.ts +16 -20
- package/src/services/cf-settings.ts +4 -4
- package/src/services/connection.ts +2 -2
- package/src/services/directory-picker.ts +2 -2
- package/src/services/references.ts +0 -0
- package/src/services/render-critic.ts +21 -2
- package/src/services/settings/definitions.ts +25 -14
- package/src/settings/contributed-section.ts +49 -10
- package/src/settings/css-vars-editor.ts +93 -27
- package/src/settings/developer-panels.ts +43 -0
- package/src/settings/extension-sections.ts +20 -2
- package/src/settings/general-settings.ts +91 -21
- package/src/settings/preferences-dialog.ts +8 -1
- package/src/settings/project-sections.ts +27 -10
- package/src/settings/schema-field-ui.ts +3 -1
- package/src/settings/section-registry.ts +116 -11
- package/src/settings/settings-dialog.ts +192 -0
- package/src/settings/settings-document.ts +182 -162
- package/src/shell.ts +467 -431
- package/src/site-context.ts +64 -10
- package/src/state.ts +28 -9
- package/src/studio.ts +194 -41
- package/src/style/project-styles.ts +34 -0
- 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/variables-focus.ts +61 -0
- package/src/style/variables-view.ts +235 -0
- package/src/surfaces/add-new.json +1482 -0
- package/src/surfaces/add-new.ts +325 -0
- package/src/surfaces/ai-chat.ts +2 -2
- package/src/surfaces/boot-failure.json +4 -3
- package/src/surfaces/bottom-dock.json +1 -1
- package/src/surfaces/canvas-stage.json +30 -19
- package/src/surfaces/canvas-stage.ts +5 -5
- 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 +134 -99
- package/src/surfaces/empty-state.json +1 -1
- package/src/surfaces/entry-editor.json +136 -0
- package/src/surfaces/entry-editor.ts +21 -0
- package/src/surfaces/entry-inspector.json +371 -0
- package/src/surfaces/entry-inspector.ts +143 -0
- package/src/surfaces/inspector-dock.json +162 -14
- package/src/surfaces/inspector-dock.ts +46 -19
- package/src/surfaces/library-pane.json +670 -437
- package/src/surfaces/library-pane.ts +94 -59
- package/src/surfaces/media-browser.json +62 -6
- package/src/surfaces/media-browser.ts +15 -1
- package/src/surfaces/media-field.json +1 -1
- package/src/surfaces/media-library.json +1586 -0
- package/src/surfaces/media-library.ts +282 -0
- package/src/surfaces/media-pick-dialog.json +71 -0
- package/src/surfaces/media-pick-dialog.ts +132 -0
- package/src/surfaces/menu.ts +18 -0
- package/src/surfaces/pane-context.json +144 -77
- package/src/surfaces/pane-context.ts +24 -0
- package/src/surfaces/panel-deploy-checklist.json +12 -6
- package/src/surfaces/panel-deploy-checklist.ts +3 -1
- package/src/surfaces/panel-page.json +72 -2
- package/src/surfaces/panel-page.ts +38 -7
- package/src/surfaces/panel-signals.json +1 -1
- package/src/surfaces/panel-signals.ts +5 -5
- package/src/surfaces/panel-stylebook-layers.json +71 -204
- package/src/surfaces/panel-stylebook-layers.ts +0 -21
- package/src/surfaces/preferences.json +120 -48
- package/src/surfaces/preferences.ts +8 -0
- 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/rail.json +1 -159
- package/src/surfaces/rail.ts +18 -75
- package/src/surfaces/schema-form.json +10 -2
- package/src/surfaces/schema-form.ts +2 -0
- package/src/surfaces/seo.json +1 -1
- package/src/surfaces/settings-contributed.json +5 -5
- package/src/surfaces/settings-contributed.ts +18 -2
- package/src/surfaces/settings-css-vars.json +44 -36
- package/src/surfaces/settings-css-vars.ts +77 -4
- package/src/surfaces/settings-deploy.json +2 -15
- package/src/surfaces/settings-deploy.ts +1 -1
- package/src/surfaces/settings-dialog.json +51 -0
- package/src/surfaces/settings-dialog.ts +169 -0
- package/src/surfaces/settings-overview.json +3 -3
- package/src/surfaces/settings-overview.ts +9 -2
- package/src/surfaces/settings-pane.json +269 -46
- package/src/surfaces/settings-pane.ts +85 -24
- package/src/surfaces/shell.json +2 -1
- 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 +23 -0
- package/src/surfaces/statusbar.ts +39 -15
- 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/welcome.ts +1 -1
- 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/tab.ts +47 -7
- package/src/types.ts +21 -26
- package/src/ui/form-controls.ts +47 -8
- package/src/ui/layers.ts +13 -0
- package/src/ui/media-picker.ts +284 -40
- package/src/ui/regions.ts +7 -6
- package/src/ui/schema-form.ts +259 -27
- package/src/ui/virtual-window.ts +26 -1
- package/src/utils/base64.ts +3 -3
- package/src/utils/edit-display.ts +322 -67
- package/src/utils/local-day.ts +18 -0
- package/src/workspace/pane-derive.ts +4 -4
- package/src/workspace/session.ts +28 -7
- 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 +125 -11
- package/styles/shell-frame.css +30 -7
- package/styles/shell-frame.json +15 -3
- package/dist/chunks/2020-f2gkpy8d.js +0 -4
- package/dist/chunks/adapter-4912g339.js +0 -4
- package/dist/chunks/cf-account-picker-wccaenh6.js +0 -4
- package/dist/chunks/cf-settings-br6105tr.js +0 -4
- package/dist/chunks/color-28ksk2qm.js +0 -4
- package/dist/chunks/components-db68vsn7.js +0 -4
- package/dist/chunks/content-source-1449qesq.js +0 -4
- package/dist/chunks/convert-to-repeater-5h457egj.js +0 -4
- package/dist/chunks/editor-x9jn86a7.js +0 -4
- package/dist/chunks/entry-commands-may24cpt.js +0 -4
- package/dist/chunks/extension-sections-pvr14vxr.js +0 -4
- package/dist/chunks/file-ops-x9v54pcj.js +0 -4
- package/dist/chunks/files-j3knqf0s.js +0 -4
- package/dist/chunks/format-host-tyre2trb.js +0 -4
- package/dist/chunks/fs-events-64ma9htc.js +0 -4
- package/dist/chunks/git-panel-84ps5dex.js +0 -4
- package/dist/chunks/iframe-entry-fvbk89gm.js +0 -5
- package/dist/chunks/iframe-host-ck6vejt5.js +0 -4
- package/dist/chunks/index-b8xw3vy9.js +0 -4
- package/dist/chunks/jsonMode-w15cmrcm.js +0 -13
- package/dist/chunks/jx-validate-at3zn8wa.js +0 -4
- package/dist/chunks/layers-h4xp1pss.js +0 -4
- package/dist/chunks/layers-panel-m5hw1d7g.js +0 -4
- package/dist/chunks/lit-html-8t8t3dnr.js +0 -4
- package/dist/chunks/media-picker-2cweexc5.js +0 -4
- package/dist/chunks/menu-ynw13y0s.js +0 -4
- package/dist/chunks/monaco-buffer-qzxn567r.js +0 -4
- package/dist/chunks/monaco-setup-gxf6656g.js +0 -4
- package/dist/chunks/notify-cj5zbrs2.js +0 -4
- package/dist/chunks/parse-b7ddhr8m.js +0 -4
- package/dist/chunks/platform-3dfws9js.js +0 -4
- package/dist/chunks/popover-jt2gxmzs.js +0 -4
- package/dist/chunks/publish-panel-1gvxbj21.js +0 -4
- package/dist/chunks/quick-search-0dajrwqg.js +0 -4
- package/dist/chunks/references-49qgt404.js +0 -4
- package/dist/chunks/right-panel-jm1bwe53.js +0 -4
- package/dist/chunks/section-registry-6kwc4fky.js +0 -4
- package/dist/chunks/studio-0rt52vpq.js +0 -5
- package/dist/chunks/studio-18vgbhs5.js +0 -5
- package/dist/chunks/studio-24mccdrj.js +0 -5
- package/dist/chunks/studio-2eh507zk.js +0 -9
- package/dist/chunks/studio-2hcbccfv.js +0 -5
- package/dist/chunks/studio-2jbs3rxv.js +0 -5
- package/dist/chunks/studio-4h8k4dw9.js +0 -5
- package/dist/chunks/studio-5f6n18kx.js +0 -5
- package/dist/chunks/studio-5gthpky6.js +0 -5
- package/dist/chunks/studio-6ep3js6b.js +0 -9
- package/dist/chunks/studio-6wkmf3wz.js +0 -9
- package/dist/chunks/studio-841rf3cg.js +0 -5
- package/dist/chunks/studio-8gmwgheg.js +0 -5
- package/dist/chunks/studio-8qm0ep50.js +0 -5
- package/dist/chunks/studio-924p1tm1.js +0 -6
- package/dist/chunks/studio-a3shpz9y.js +0 -5
- package/dist/chunks/studio-amsbaaar.js +0 -6
- package/dist/chunks/studio-at5spjbc.js +0 -7
- package/dist/chunks/studio-b2xv945e.js +0 -5
- package/dist/chunks/studio-bn5nkafw.js +0 -5
- package/dist/chunks/studio-bw6q5xjf.js +0 -9
- package/dist/chunks/studio-c7q0t9x1.js +0 -5
- package/dist/chunks/studio-camnhc96.js +0 -6
- package/dist/chunks/studio-cffqvnzd.js +0 -5
- package/dist/chunks/studio-efvfrsf8.js +0 -5
- package/dist/chunks/studio-er30bpcx.js +0 -5
- package/dist/chunks/studio-ezscgr64.js +0 -5
- package/dist/chunks/studio-ffrrncvz.js +0 -5
- package/dist/chunks/studio-fpphgn8y.js +0 -10
- package/dist/chunks/studio-j1kvhdjk.js +0 -4
- package/dist/chunks/studio-j430n16g.js +0 -7
- package/dist/chunks/studio-jjkg84nj.js +0 -5
- package/dist/chunks/studio-m0q32ars.js +0 -4
- package/dist/chunks/studio-m6bdst11.js +0 -5
- package/dist/chunks/studio-nv2cptd4.js +0 -64
- package/dist/chunks/studio-nwfrc98n.js +0 -5
- package/dist/chunks/studio-p1wgvp7r.js +0 -5
- package/dist/chunks/studio-pag2wncm.js +0 -5
- package/dist/chunks/studio-qvanvzfd.js +0 -5
- package/dist/chunks/studio-qwa64kt7.js +0 -5
- package/dist/chunks/studio-rk1zc4x3.js +0 -928
- package/dist/chunks/studio-se2r3ptc.js +0 -5
- package/dist/chunks/studio-sg2a0dh0.js +0 -5
- package/dist/chunks/studio-tjzjhe68.js +0 -5
- package/dist/chunks/studio-v2w7q8r1.js +0 -7
- package/dist/chunks/studio-v5vjq1h0.js +0 -4
- package/dist/chunks/studio-v8aga3vp.js +0 -14
- package/dist/chunks/studio-vfcdrfmv.js +0 -5
- package/dist/chunks/studio-vmfkgdjf.js +0 -5
- package/dist/chunks/studio-wt1816jj.js +0 -5
- package/dist/chunks/studio-wz73q5kq.js +0 -4
- package/dist/chunks/studio-y04qtxvp.js +0 -7
- package/dist/chunks/studio-y21g8zzg.js +0 -5
- package/dist/chunks/studio-y64hrt8p.js +0 -12
- package/dist/chunks/studio-ynn90f58.js +0 -16
- package/dist/chunks/studio-yxz682sx.js +0 -5
- package/dist/chunks/studio-zp7snvkq.js +0 -5
- package/dist/chunks/studio-zq4z6tm6.js +0 -5
- package/dist/chunks/toast-c9fn075p.js +0 -4
- package/dist/chunks/tsMode-sf49ee9x.js +0 -14
- package/dist/chunks/workspace-jtfahpee.js +0 -4
- package/src/panels/frontmatter-panel.ts +0 -711
- package/src/panels/git-panel.ts +0 -1108
- package/src/surfaces/doc-header.json +0 -776
- package/src/surfaces/doc-header.ts +0 -222
- package/src/surfaces/git-panel.json +0 -1880
- package/src/surfaces/git-panel.ts +0 -264
|
@@ -1,46 +1,109 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://jxsuite.com/schema/v1",
|
|
3
3
|
"$id": "StudioSettingsPane",
|
|
4
|
-
"$description": "The Project Settings
|
|
4
|
+
"$description": "The Project Settings dialog's two columns: the grouped section list and the section body (§17.1). It draws no section: `panels/settings-pane.ts` keeps the registry, decides which section is current, and renders whichever one that is into the one empty `[part=\"section-host\"]` island this document leaves for it (studio-ui-guidelines.md §9.4), because a section renderer may be a lit template or a mounted document and neither can share a container with this one. The list is three vertical `tablist`s, one per group (General, Integrations, Advanced), each named by its group heading: a tablist may own only tabs, so a heading between two runs of rows has to END one list rather than sit inside it. Each group is one tab stop and the arrow keys move within it. Under the groups, a Moved footnote names what left Project Settings for a workspace, each with a button that goes there.",
|
|
5
5
|
"tagName": "div",
|
|
6
6
|
"attributes": {
|
|
7
7
|
"part": "doc"
|
|
8
8
|
},
|
|
9
9
|
"style": {
|
|
10
|
-
"$description": "
|
|
10
|
+
"$description": "No part below is named `body`, `field`, `label`, `error`, `text` or `actions`: this document is mounted inside a `jx-dialog`, the kit is light DOM, and the dialog draws its own `[part=\"body\"]` around this one, so a rule keyed on that name here would also be a rule the dialog's own styles reach.",
|
|
11
11
|
"display": "flex",
|
|
12
|
-
"height": "
|
|
12
|
+
"height": "min(68vh, 640px)",
|
|
13
13
|
"minHeight": "0",
|
|
14
14
|
"background": "var(--bg)",
|
|
15
15
|
"color": "var(--fg)",
|
|
16
16
|
"fontFamily": "var(--jx-font-sans)",
|
|
17
17
|
"textAlign": "initial",
|
|
18
18
|
"& [part=\"nav\"]": {
|
|
19
|
-
"
|
|
20
|
-
"
|
|
19
|
+
"display": "flex",
|
|
20
|
+
"flexDirection": "column",
|
|
21
|
+
"gap": "var(--jx-space-4)",
|
|
22
|
+
"width": "200px",
|
|
23
|
+
"minWidth": "200px",
|
|
21
24
|
"flexShrink": "0",
|
|
22
|
-
"padding": "var(--jx-space-2) 0",
|
|
25
|
+
"padding": "var(--jx-space-2) var(--jx-space-3) var(--jx-space-2) 0",
|
|
26
|
+
"borderRight": "1px solid var(--border)",
|
|
23
27
|
"overflowY": "auto",
|
|
24
28
|
"fontSize": "13px"
|
|
25
29
|
},
|
|
30
|
+
"& [part=\"group\"]": {
|
|
31
|
+
"display": "flex",
|
|
32
|
+
"flexDirection": "column",
|
|
33
|
+
"gap": "var(--jx-space-1)"
|
|
34
|
+
},
|
|
35
|
+
"& [part=\"group-title\"]": {
|
|
36
|
+
"display": "flex",
|
|
37
|
+
"alignItems": "baseline",
|
|
38
|
+
"gap": "var(--jx-space-2)",
|
|
39
|
+
"margin": "0",
|
|
40
|
+
"padding": "0 var(--jx-space-3)",
|
|
41
|
+
"color": "var(--fg-dim)",
|
|
42
|
+
"fontSize": "var(--jx-text-sm)",
|
|
43
|
+
"fontWeight": "600",
|
|
44
|
+
"letterSpacing": "0.04em",
|
|
45
|
+
"textTransform": "uppercase"
|
|
46
|
+
},
|
|
47
|
+
"& [part=\"group-note\"]": {
|
|
48
|
+
"$description": "The Advanced group's \"For developers\": a qualifier on the heading, not a second heading, so it reads at the heading's size without its weight.",
|
|
49
|
+
"fontWeight": "400",
|
|
50
|
+
"letterSpacing": "0",
|
|
51
|
+
"textTransform": "none"
|
|
52
|
+
},
|
|
53
|
+
"& [part=\"group-note\"]:empty": {
|
|
54
|
+
"display": "none"
|
|
55
|
+
},
|
|
56
|
+
"& [part=\"group-tabs\"]": {
|
|
57
|
+
"$description": "The rule a vertical strip draws on its trailing edge is the column's own here: the nav draws one border for all three groups, so each strip drawing its own would stack three short rules beside it.",
|
|
58
|
+
"borderInlineEnd": "0"
|
|
59
|
+
},
|
|
26
60
|
"& [part=\"nav-item\"]": {
|
|
27
|
-
"$description": "Full-bleed rows, which a tab is not by default: `jx-tab` centres its label and caps itself at 220px because a horizontal strip is a row of chips. In
|
|
61
|
+
"$description": "Full-bleed rows, which a tab is not by default: `jx-tab` centres its label and caps itself at 220px because a horizontal strip is a row of chips. In the nav column the row IS the target, so the label goes to the leading edge and the cap comes off.",
|
|
28
62
|
"maxWidth": "none",
|
|
29
63
|
"justifyContent": "flex-start",
|
|
30
|
-
"padding": "var(--jx-space-2) var(--jx-space-
|
|
64
|
+
"padding": "var(--jx-space-2) var(--jx-space-3)"
|
|
65
|
+
},
|
|
66
|
+
"& [part=\"moved\"]": {
|
|
67
|
+
"display": "flex",
|
|
68
|
+
"flexDirection": "column",
|
|
69
|
+
"gap": "var(--jx-space-1)",
|
|
70
|
+
"marginTop": "auto",
|
|
71
|
+
"padding": "var(--jx-space-3)",
|
|
72
|
+
"borderTop": "1px solid var(--border)",
|
|
73
|
+
"color": "var(--fg-dim)",
|
|
74
|
+
"fontSize": "var(--jx-text-md)"
|
|
75
|
+
},
|
|
76
|
+
"& [part=\"moved-title\"]": {
|
|
77
|
+
"margin": "0",
|
|
78
|
+
"fontWeight": "600",
|
|
79
|
+
"color": "var(--fg)"
|
|
80
|
+
},
|
|
81
|
+
"& [part=\"moved-row\"]": {
|
|
82
|
+
"display": "flex",
|
|
83
|
+
"alignItems": "center",
|
|
84
|
+
"flexWrap": "wrap",
|
|
85
|
+
"gap": "var(--jx-space-1)"
|
|
31
86
|
},
|
|
32
87
|
"& [part=\"content\"]": {
|
|
33
88
|
"flex": "1",
|
|
34
89
|
"minWidth": "0",
|
|
35
90
|
"overflowY": "auto",
|
|
36
|
-
"padding": "
|
|
91
|
+
"padding": "var(--jx-space-2) var(--jx-space-5)"
|
|
37
92
|
},
|
|
38
|
-
"& [part=\"
|
|
93
|
+
"& [part=\"group-intro\"]": {
|
|
94
|
+
"margin": "0 0 var(--jx-space-3)",
|
|
95
|
+
"color": "var(--fg-dim)",
|
|
96
|
+
"fontSize": "13px"
|
|
97
|
+
},
|
|
98
|
+
"& [part=\"group-intro\"]:empty": {
|
|
99
|
+
"display": "none"
|
|
100
|
+
},
|
|
101
|
+
"& [part=\"section-host\"]": {
|
|
39
102
|
"display": "block",
|
|
40
103
|
"minWidth": "0"
|
|
41
104
|
},
|
|
42
105
|
"& [part=\"empty\"]": {
|
|
43
|
-
"$description": "What the body says when the active section is registered by nobody
|
|
106
|
+
"$description": "What the body says when the active section is registered by nobody: every section unregistering at once, which is a project closing while the dialog is open. A blank column beside a list reads as a broken dialog, so it says which it is.",
|
|
44
107
|
"display": "flex",
|
|
45
108
|
"alignItems": "center",
|
|
46
109
|
"justifyContent": "center",
|
|
@@ -48,57 +111,189 @@
|
|
|
48
111
|
"margin": "0",
|
|
49
112
|
"color": "var(--fg-dim)",
|
|
50
113
|
"fontSize": "13px"
|
|
114
|
+
},
|
|
115
|
+
"& [part=\"failure\"]": {
|
|
116
|
+
"$description": "A section whose renderer threw or rejected. It is said where the section would have been, in the reader's line of sight, because a section that silently draws nothing is indistinguishable from one with nothing to say.",
|
|
117
|
+
"margin": "0",
|
|
118
|
+
"padding": "var(--jx-space-3)",
|
|
119
|
+
"border": "1px solid var(--danger)",
|
|
120
|
+
"borderRadius": "var(--radius)",
|
|
121
|
+
"color": "var(--fg)",
|
|
122
|
+
"fontSize": "13px"
|
|
51
123
|
}
|
|
52
124
|
},
|
|
53
125
|
"children": [
|
|
54
126
|
{
|
|
55
|
-
"tagName": "
|
|
127
|
+
"tagName": "div",
|
|
56
128
|
"attributes": {
|
|
57
129
|
"part": "nav",
|
|
58
|
-
"
|
|
59
|
-
"orientation": "vertical"
|
|
60
|
-
},
|
|
61
|
-
"$props": {
|
|
62
|
-
"label": {
|
|
63
|
-
"$ref": "#/state/navLabel"
|
|
64
|
-
}
|
|
65
|
-
},
|
|
66
|
-
"onchange": {
|
|
67
|
-
"$prototype": "Function",
|
|
68
|
-
"body": [
|
|
69
|
-
{
|
|
70
|
-
"operator": "call",
|
|
71
|
-
"target": {
|
|
72
|
-
"$ref": "#/state/selectSection"
|
|
73
|
-
},
|
|
74
|
-
"value": [
|
|
75
|
-
{
|
|
76
|
-
"$ref": "event#/detail"
|
|
77
|
-
}
|
|
78
|
-
]
|
|
79
|
-
}
|
|
80
|
-
]
|
|
130
|
+
"role": "none"
|
|
81
131
|
},
|
|
82
132
|
"children": [
|
|
83
133
|
{
|
|
84
134
|
"$prototype": "Array",
|
|
85
135
|
"items": {
|
|
86
|
-
"$ref": "#/state/
|
|
136
|
+
"$ref": "#/state/groups"
|
|
87
137
|
},
|
|
88
138
|
"key": {
|
|
89
|
-
"$ref": "$map/item/
|
|
139
|
+
"$ref": "$map/item/id"
|
|
90
140
|
},
|
|
91
141
|
"map": {
|
|
92
|
-
"tagName": "
|
|
142
|
+
"tagName": "div",
|
|
93
143
|
"attributes": {
|
|
94
|
-
"part": "
|
|
95
|
-
"
|
|
96
|
-
"data-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
144
|
+
"part": "group",
|
|
145
|
+
"role": "none",
|
|
146
|
+
"data-group": "${$map.item.id}"
|
|
147
|
+
},
|
|
148
|
+
"children": [
|
|
149
|
+
{
|
|
150
|
+
"tagName": "h3",
|
|
151
|
+
"attributes": {
|
|
152
|
+
"part": "group-title",
|
|
153
|
+
"id": "${$map.item.titleId}"
|
|
154
|
+
},
|
|
155
|
+
"children": [
|
|
156
|
+
{
|
|
157
|
+
"tagName": "span",
|
|
158
|
+
"textContent": "${$map.item.label}"
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
"tagName": "span",
|
|
162
|
+
"attributes": {
|
|
163
|
+
"part": "group-note"
|
|
164
|
+
},
|
|
165
|
+
"textContent": "${$map.item.note}"
|
|
166
|
+
}
|
|
167
|
+
]
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
"tagName": "jx-tabs",
|
|
171
|
+
"attributes": {
|
|
172
|
+
"part": "group-tabs",
|
|
173
|
+
"selected": "${state.active}",
|
|
174
|
+
"orientation": "vertical"
|
|
175
|
+
},
|
|
176
|
+
"$props": {
|
|
177
|
+
"label": {
|
|
178
|
+
"$ref": "$map/item/tabsLabel"
|
|
179
|
+
}
|
|
180
|
+
},
|
|
181
|
+
"onchange": {
|
|
182
|
+
"$prototype": "Function",
|
|
183
|
+
"body": [
|
|
184
|
+
{
|
|
185
|
+
"operator": "call",
|
|
186
|
+
"target": {
|
|
187
|
+
"$ref": "#/state/selectSection"
|
|
188
|
+
},
|
|
189
|
+
"value": [
|
|
190
|
+
{
|
|
191
|
+
"$ref": "event#/detail"
|
|
192
|
+
}
|
|
193
|
+
]
|
|
194
|
+
}
|
|
195
|
+
]
|
|
196
|
+
},
|
|
197
|
+
"children": [
|
|
198
|
+
{
|
|
199
|
+
"$prototype": "Array",
|
|
200
|
+
"items": {
|
|
201
|
+
"$ref": "$map/item/sections"
|
|
202
|
+
},
|
|
203
|
+
"key": {
|
|
204
|
+
"$ref": "$map/item/key"
|
|
205
|
+
},
|
|
206
|
+
"map": {
|
|
207
|
+
"tagName": "jx-tab",
|
|
208
|
+
"attributes": {
|
|
209
|
+
"part": "nav-item",
|
|
210
|
+
"id": "${$map.item.tabId}",
|
|
211
|
+
"data-section": "${$map.item.key}",
|
|
212
|
+
"value": "${$map.item.key}",
|
|
213
|
+
"label": "${$map.item.label}",
|
|
214
|
+
"panel": "settings-pane-panel"
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
]
|
|
219
|
+
}
|
|
220
|
+
]
|
|
101
221
|
}
|
|
222
|
+
},
|
|
223
|
+
{
|
|
224
|
+
"tagName": "div",
|
|
225
|
+
"attributes": {
|
|
226
|
+
"part": "moved",
|
|
227
|
+
"role": "group",
|
|
228
|
+
"aria-labelledby": "settings-pane-moved"
|
|
229
|
+
},
|
|
230
|
+
"children": [
|
|
231
|
+
{
|
|
232
|
+
"tagName": "p",
|
|
233
|
+
"attributes": {
|
|
234
|
+
"part": "moved-title",
|
|
235
|
+
"id": "settings-pane-moved"
|
|
236
|
+
},
|
|
237
|
+
"textContent": "Moved"
|
|
238
|
+
},
|
|
239
|
+
{
|
|
240
|
+
"$prototype": "Array",
|
|
241
|
+
"items": {
|
|
242
|
+
"$ref": "#/state/moved"
|
|
243
|
+
},
|
|
244
|
+
"key": {
|
|
245
|
+
"$ref": "$map/item/workspace"
|
|
246
|
+
},
|
|
247
|
+
"map": {
|
|
248
|
+
"tagName": "div",
|
|
249
|
+
"attributes": {
|
|
250
|
+
"part": "moved-row",
|
|
251
|
+
"data-moved": "${$map.item.workspace}"
|
|
252
|
+
},
|
|
253
|
+
"children": [
|
|
254
|
+
{
|
|
255
|
+
"tagName": "span",
|
|
256
|
+
"textContent": "${$map.item.what} →"
|
|
257
|
+
},
|
|
258
|
+
{
|
|
259
|
+
"tagName": "jx-button",
|
|
260
|
+
"attributes": {
|
|
261
|
+
"part": "moved-link"
|
|
262
|
+
},
|
|
263
|
+
"$props": {
|
|
264
|
+
"size": "sm",
|
|
265
|
+
"quiet": true,
|
|
266
|
+
"label": {
|
|
267
|
+
"$ref": "$map/item/linkLabel"
|
|
268
|
+
}
|
|
269
|
+
},
|
|
270
|
+
"onclick": {
|
|
271
|
+
"$prototype": "Function",
|
|
272
|
+
"body": [
|
|
273
|
+
{
|
|
274
|
+
"operator": "call",
|
|
275
|
+
"target": {
|
|
276
|
+
"$ref": "#/state/openMoved"
|
|
277
|
+
},
|
|
278
|
+
"value": [
|
|
279
|
+
{
|
|
280
|
+
"$ref": "$map/item/workspace"
|
|
281
|
+
}
|
|
282
|
+
]
|
|
283
|
+
}
|
|
284
|
+
]
|
|
285
|
+
},
|
|
286
|
+
"children": [
|
|
287
|
+
{
|
|
288
|
+
"tagName": "span",
|
|
289
|
+
"textContent": "${$map.item.place}"
|
|
290
|
+
}
|
|
291
|
+
]
|
|
292
|
+
}
|
|
293
|
+
]
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
]
|
|
102
297
|
}
|
|
103
298
|
]
|
|
104
299
|
},
|
|
@@ -115,11 +310,19 @@
|
|
|
115
310
|
}
|
|
116
311
|
},
|
|
117
312
|
"children": [
|
|
313
|
+
{
|
|
314
|
+
"$description": "The current group's intro (\"Changes here affect every page. Most sites never need them.\"), above whichever of its sections is showing. General has none, and an empty sentence draws nothing.",
|
|
315
|
+
"tagName": "p",
|
|
316
|
+
"attributes": {
|
|
317
|
+
"part": "group-intro"
|
|
318
|
+
},
|
|
319
|
+
"textContent": "${state.intro}"
|
|
320
|
+
},
|
|
118
321
|
{
|
|
119
322
|
"$description": "The island, and it stays empty: a settings section renders itself, into a host this document never writes into and never reads back (studio-ui-guidelines.md §9.4).",
|
|
120
323
|
"tagName": "div",
|
|
121
324
|
"attributes": {
|
|
122
|
-
"part": "
|
|
325
|
+
"part": "section-host"
|
|
123
326
|
}
|
|
124
327
|
},
|
|
125
328
|
{
|
|
@@ -140,6 +343,26 @@
|
|
|
140
343
|
"textContent": "${state.empty}"
|
|
141
344
|
}
|
|
142
345
|
}
|
|
346
|
+
},
|
|
347
|
+
{
|
|
348
|
+
"tagName": "div",
|
|
349
|
+
"attributes": {
|
|
350
|
+
"part": "failure-slot",
|
|
351
|
+
"role": "none"
|
|
352
|
+
},
|
|
353
|
+
"$switch": {
|
|
354
|
+
"$ref": "#/state/failureState"
|
|
355
|
+
},
|
|
356
|
+
"cases": {
|
|
357
|
+
"failed": {
|
|
358
|
+
"tagName": "p",
|
|
359
|
+
"attributes": {
|
|
360
|
+
"part": "failure",
|
|
361
|
+
"role": "alert"
|
|
362
|
+
},
|
|
363
|
+
"textContent": "${state.failure}"
|
|
364
|
+
}
|
|
365
|
+
}
|
|
143
366
|
}
|
|
144
367
|
]
|
|
145
368
|
}
|
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
/// <reference lib="dom" />
|
|
2
2
|
/**
|
|
3
|
-
* The Project Settings
|
|
3
|
+
* The Project Settings dialog's two columns as a mounted document: the mount seam, and nothing
|
|
4
|
+
* else.
|
|
4
5
|
*
|
|
5
|
-
* `panels/settings-pane.ts` is the flow: which sections are registered, which
|
|
6
|
-
* what a nav click does, and which renderer draws the body. This is the
|
|
6
|
+
* `panels/settings-pane.ts` is the flow: which sections are registered, which group lists each,
|
|
7
|
+
* which one is current, what a nav click does, and which renderer draws the body. This is the
|
|
8
|
+
* surface it draws into, and `surfaces/settings-dialog.ts` is the dialog it sits in.
|
|
7
9
|
*
|
|
8
10
|
* **One island, and the sections are why.** A settings section is handed a container and renders
|
|
9
|
-
* into it
|
|
10
|
-
* cannot be part of this document's subtree. It draws an empty `[part="
|
|
11
|
-
* through `onNodeCreated` as it is created, and the flow renders into it: the island seam of
|
|
11
|
+
* into it (some of them still with lit, some by mounting a document of their own) so the body
|
|
12
|
+
* cannot be part of this document's subtree. It draws an empty `[part="section-host"]`, announces
|
|
13
|
+
* it through `onNodeCreated` as it is created, and the flow renders into it: the island seam of
|
|
12
14
|
* studio-ui-guidelines.md §9.4. Nothing here queries for it by a selector this package also
|
|
13
15
|
* renders.
|
|
14
16
|
*
|
|
@@ -24,37 +26,67 @@ import type { SurfaceHandle, SurfaceTab } from "../ui/surface";
|
|
|
24
26
|
|
|
25
27
|
registerSurface("settings-pane", settingsPaneDoc);
|
|
26
28
|
|
|
27
|
-
/**
|
|
29
|
+
/** One nav group, as the document draws it. */
|
|
30
|
+
export interface SettingsPaneGroup {
|
|
31
|
+
id: string;
|
|
32
|
+
label: string;
|
|
33
|
+
/** The qualifier beside the heading ("For developers"), or the empty string for none. */
|
|
34
|
+
note: string;
|
|
35
|
+
/** The heading's element id. */
|
|
36
|
+
titleId: string;
|
|
37
|
+
/** The group's tablist name: the heading, with its qualifier when it has one. */
|
|
38
|
+
tabsLabel: string;
|
|
39
|
+
sections: SurfaceTab[];
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/** One row of the Moved footnote: something that left Project Settings, and where it went. */
|
|
43
|
+
export interface SettingsPaneMovedRow {
|
|
44
|
+
/** What moved, as the reader knew it in Settings ("Colors and fonts"). */
|
|
45
|
+
what: string;
|
|
46
|
+
/** Where it is now: the workspace's title, which is the button's text. */
|
|
47
|
+
place: string;
|
|
48
|
+
/** The workspace id the button switches to. */
|
|
49
|
+
workspace: string;
|
|
50
|
+
/** The button's accessible name, which says the whole sentence the row draws in two parts. */
|
|
51
|
+
linkLabel: string;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/** What the dialog's columns say right now. */
|
|
28
55
|
export interface SettingsPaneValues {
|
|
29
|
-
/** The list's accessible name. A tablist takes no name from its tabs. */
|
|
30
|
-
navLabel: string;
|
|
31
56
|
/** The current section's key. */
|
|
32
57
|
active: string;
|
|
33
58
|
/** The current section's row id, so the body is named by the row that chose it. */
|
|
34
59
|
activeTabId: string;
|
|
35
|
-
|
|
60
|
+
groups: SettingsPaneGroup[];
|
|
61
|
+
moved: SettingsPaneMovedRow[];
|
|
36
62
|
/**
|
|
37
63
|
* Whether a renderer will draw into the island.
|
|
38
64
|
*
|
|
39
|
-
* The flow's own question
|
|
65
|
+
* The flow's own question (`settingsSection(active)`) rather than "are there any sections": the
|
|
40
66
|
* body is empty exactly when the ACTIVE key is registered by nobody, and a second spelling of
|
|
41
67
|
* that would be a second thing to get wrong.
|
|
42
68
|
*/
|
|
43
69
|
hasSection: boolean;
|
|
44
70
|
/** What the body says instead, when it will not be drawn into. */
|
|
45
71
|
empty: string;
|
|
72
|
+
/** The current section's group intro, drawn above the section, or the empty string for none. */
|
|
73
|
+
intro: string;
|
|
74
|
+
/** The sentence a failed section renderer left, or the empty string while nothing failed. */
|
|
75
|
+
failure: string;
|
|
46
76
|
}
|
|
47
77
|
|
|
48
78
|
export interface SettingsPaneActions {
|
|
49
79
|
/** A row was activated. */
|
|
50
80
|
selectSection: (key: string) => void;
|
|
81
|
+
/** A Moved footnote's button was activated, naming the workspace it goes to. */
|
|
82
|
+
openMoved: (workspace: string) => void;
|
|
51
83
|
}
|
|
52
84
|
|
|
53
85
|
export interface SettingsPaneHandle {
|
|
54
86
|
/** Bring the standing document up to date. An assignment; the mount is never rebuilt. */
|
|
55
87
|
update: (values: SettingsPaneValues) => void;
|
|
56
88
|
/**
|
|
57
|
-
* The empty `[part="
|
|
89
|
+
* The empty `[part="section-host"]` island, once it exists: the one element a section needs.
|
|
58
90
|
*
|
|
59
91
|
* It is HELD rather than re-found, exactly as `surfaces/tab-strip.ts` holds its `jx-tabs`: it
|
|
60
92
|
* arrives through `onNodeCreated` as the node is created, so nothing in this package queries for
|
|
@@ -63,11 +95,23 @@ export interface SettingsPaneHandle {
|
|
|
63
95
|
body: () => HTMLElement | null;
|
|
64
96
|
/** Settles once the document is mounted, or the surface was disposed first. */
|
|
65
97
|
ready: Promise<void>;
|
|
98
|
+
/**
|
|
99
|
+
* Put the keyboard on the current section's row.
|
|
100
|
+
*
|
|
101
|
+
* `showModal()` focuses the dialog's first focusable descendant, which is always the first
|
|
102
|
+
* group's tab stop, so a dialog opened on Advanced › Raw JSON would put the ring on Overview
|
|
103
|
+
* while the selection was three rows down a different list. Read off `aria-selected`, which the
|
|
104
|
+
* strip writes, because that attribute is the one record of which row is current.
|
|
105
|
+
*/
|
|
106
|
+
focusActive: () => void;
|
|
66
107
|
/** Take the document down. Idempotent. */
|
|
67
108
|
dispose: () => void;
|
|
68
109
|
}
|
|
69
110
|
|
|
70
|
-
interface SettingsPaneScope extends SettingsPaneValues, SettingsPaneActions {
|
|
111
|
+
interface SettingsPaneScope extends SettingsPaneValues, SettingsPaneActions {
|
|
112
|
+
/** `failed` while {@link SettingsPaneValues.failure} holds a sentence, `ok` otherwise. */
|
|
113
|
+
failureState: string;
|
|
114
|
+
}
|
|
71
115
|
|
|
72
116
|
/** The `part` a node was declared with, or the empty string. */
|
|
73
117
|
function partOf(def: JxElement | string): string {
|
|
@@ -75,16 +119,20 @@ function partOf(def: JxElement | string): string {
|
|
|
75
119
|
return isString(part) ? part : "";
|
|
76
120
|
}
|
|
77
121
|
|
|
122
|
+
/** The case name the failure switch discriminates on, derived so the flow states only the fact. */
|
|
123
|
+
function failureStateOf(failure: string): string {
|
|
124
|
+
return failure === "" ? "ok" : "failed";
|
|
125
|
+
}
|
|
126
|
+
|
|
78
127
|
/**
|
|
79
|
-
* Mount the
|
|
128
|
+
* Mount the columns into `container`, which is the settings dialog's island.
|
|
80
129
|
*
|
|
81
|
-
* The container is cleared first, lit's render marker included
|
|
82
|
-
* other
|
|
83
|
-
* render throw on a part whose nodes have gone.
|
|
130
|
+
* The container is cleared first, lit's render marker included, so a host handed back after some
|
|
131
|
+
* other renderer used it cannot make the next lit render throw on a part whose nodes have gone.
|
|
84
132
|
*
|
|
85
|
-
* @param {HTMLElement} container The
|
|
133
|
+
* @param {HTMLElement} container The dialog's pane slot
|
|
86
134
|
* @param {SettingsPaneValues} values What to say on the first paint
|
|
87
|
-
* @param {SettingsPaneActions} actions What a
|
|
135
|
+
* @param {SettingsPaneActions} actions What a row and a Moved button do. Read once.
|
|
88
136
|
* @returns {SettingsPaneHandle}
|
|
89
137
|
*/
|
|
90
138
|
export function mountSettingsPaneSurface(
|
|
@@ -92,7 +140,11 @@ export function mountSettingsPaneSurface(
|
|
|
92
140
|
values: SettingsPaneValues,
|
|
93
141
|
actions: SettingsPaneActions,
|
|
94
142
|
): SettingsPaneHandle {
|
|
95
|
-
const scope: SettingsPaneScope = reactive<SettingsPaneScope>({
|
|
143
|
+
const scope: SettingsPaneScope = reactive<SettingsPaneScope>({
|
|
144
|
+
...values,
|
|
145
|
+
...actions,
|
|
146
|
+
failureState: failureStateOf(values.failure),
|
|
147
|
+
});
|
|
96
148
|
|
|
97
149
|
container.textContent = "";
|
|
98
150
|
// @ts-expect-error -- _$litPart$ is lit's private render-part marker, not in the DOM types
|
|
@@ -106,7 +158,7 @@ export function mountSettingsPaneSurface(
|
|
|
106
158
|
/* `disposed` and not just the part: a mount that is still in flight goes on building its
|
|
107
159
|
nodes after the handle has let go, and holding one of them would answer `body()` with an
|
|
108
160
|
element belonging to a document nobody is standing behind any more. */
|
|
109
|
-
if (!disposed && element instanceof HTMLElement && partOf(def) === "
|
|
161
|
+
if (!disposed && element instanceof HTMLElement && partOf(def) === "section-host") {
|
|
110
162
|
body = element;
|
|
111
163
|
}
|
|
112
164
|
},
|
|
@@ -126,16 +178,25 @@ export function mountSettingsPaneSurface(
|
|
|
126
178
|
mounted = null;
|
|
127
179
|
body = null;
|
|
128
180
|
},
|
|
181
|
+
focusActive() {
|
|
182
|
+
const root = mounted?.root;
|
|
183
|
+
if (root instanceof HTMLElement) {
|
|
184
|
+
root.querySelector<HTMLElement>('[part="nav-item"][aria-selected="true"]')?.focus();
|
|
185
|
+
}
|
|
186
|
+
},
|
|
129
187
|
ready,
|
|
130
188
|
update(next) {
|
|
131
|
-
/* Field by field, so an unchanged one is inert
|
|
189
|
+
/* Field by field, so an unchanged one is inert, and `active` LAST, because it is what each
|
|
132
190
|
strip's selection is compared against: writing it before the rows it names have arrived
|
|
133
191
|
would make `jx-tabs` sync a selection onto a column that does not hold that tab yet. */
|
|
134
|
-
scope.
|
|
135
|
-
scope.
|
|
192
|
+
scope.groups = next.groups;
|
|
193
|
+
scope.moved = next.moved;
|
|
136
194
|
scope.activeTabId = next.activeTabId;
|
|
137
195
|
scope.empty = next.empty;
|
|
196
|
+
scope.intro = next.intro;
|
|
138
197
|
scope.hasSection = next.hasSection;
|
|
198
|
+
scope.failure = next.failure;
|
|
199
|
+
scope.failureState = failureStateOf(next.failure);
|
|
139
200
|
scope.active = next.active;
|
|
140
201
|
},
|
|
141
202
|
};
|