@jxsuite/studio 6.1.2 → 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/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
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
/// <reference lib="dom" />
|
|
2
|
+
/**
|
|
3
|
+
* The Site panel, as a mounted document (`specs/studio.md` §5.7).
|
|
4
|
+
*
|
|
5
|
+
* `panels/site-panel.ts` is the flow — which files are pages and in what order, how a collection
|
|
6
|
+
* nests its pages, what a click opens and what a drag inserts — and this is the surface it draws
|
|
7
|
+
* into: the reactive scope `site-panel.json` reads, and the mount that stays put while the
|
|
8
|
+
* Navigator repaints around it.
|
|
9
|
+
*
|
|
10
|
+
* **Three islands, all through `onNodeCreated`.** A component card's preview box is filled with the
|
|
11
|
+
* component rendered live, a component card is a drag source, and a media thumbnail is a drag
|
|
12
|
+
* source. Each is announced to the flow as its node is CREATED, with the mapped row it was drawn
|
|
13
|
+
* for, which is the compliant seam for registering behaviour on a node a document created
|
|
14
|
+
* (studio-ui-guidelines.md §9.4) — never a query over the mounted DOM. The `disposed` guard comes
|
|
15
|
+
* first for the reason `surfaces/files-panel.ts` gives: a panel taken down inside the same turn
|
|
16
|
+
* still walks this callback for every row, and a registration made then would outlive it.
|
|
17
|
+
*
|
|
18
|
+
* @docs studio/interface
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
import { isJsonObject, isString } from "@jxsuite/schema/guards";
|
|
22
|
+
import { reactive } from "../reactivity";
|
|
23
|
+
import { mountSurface, registerSurface } from "../ui/surface";
|
|
24
|
+
import sitePanelDoc from "./site-panel.json";
|
|
25
|
+
import type { JsonObject, JxElement } from "@jxsuite/schema/types";
|
|
26
|
+
import type { JxScope } from "@jxsuite/runtime/types";
|
|
27
|
+
import type { SurfaceHandle } from "../ui/surface";
|
|
28
|
+
import type {
|
|
29
|
+
SiteComponentRow,
|
|
30
|
+
SiteMediaRow,
|
|
31
|
+
SitePageRow,
|
|
32
|
+
SiteTemplateRow,
|
|
33
|
+
} from "../panels/site-model";
|
|
34
|
+
|
|
35
|
+
registerSurface("site-panel", sitePanelDoc);
|
|
36
|
+
|
|
37
|
+
/** What a section draws: a sentence while reading, one when empty or filtered out, or its rows. */
|
|
38
|
+
export type SiteSectionState = "loading" | "empty" | "nomatch" | "listed";
|
|
39
|
+
|
|
40
|
+
/** Everything the document reads. Every field is a value. */
|
|
41
|
+
export interface SitePanelValues {
|
|
42
|
+
/** `none` draws one sentence asking for a project; `project` draws the four sections. */
|
|
43
|
+
body: "none" | "project";
|
|
44
|
+
filter: string;
|
|
45
|
+
pages: SitePageRow[];
|
|
46
|
+
pagesState: SiteSectionState;
|
|
47
|
+
pagesCount: string;
|
|
48
|
+
templates: SiteTemplateRow[];
|
|
49
|
+
templatesState: SiteSectionState;
|
|
50
|
+
templatesCount: string;
|
|
51
|
+
components: SiteComponentRow[];
|
|
52
|
+
componentsState: SiteSectionState;
|
|
53
|
+
componentsCount: string;
|
|
54
|
+
media: SiteMediaRow[];
|
|
55
|
+
mediaState: SiteSectionState;
|
|
56
|
+
mediaCount: string;
|
|
57
|
+
/**
|
|
58
|
+
* The line under a strip that does not show every thumbnail the filter admits ("Show all 766 in
|
|
59
|
+
* Media"), or `""` when it shows them all.
|
|
60
|
+
*/
|
|
61
|
+
mediaMore: string;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/** What a control can ask the panel to do. Read once, when the scope is made. */
|
|
65
|
+
export interface SitePanelActions {
|
|
66
|
+
/** The filter field now holds `value`. */
|
|
67
|
+
setFilter: (value: string) => void;
|
|
68
|
+
/** Open a page, a template or a media file by its project path. */
|
|
69
|
+
open: (path: string) => void;
|
|
70
|
+
/** Open a component's definition by its tag. */
|
|
71
|
+
openComponent: (tagName: string) => void;
|
|
72
|
+
/** The `+` was pressed: open Add new. */
|
|
73
|
+
add: () => void;
|
|
74
|
+
/** Switch to the Media workspace. */
|
|
75
|
+
openMedia: () => void;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/** The islands the flow attaches behaviour to, each announced as it is created. */
|
|
79
|
+
export interface SitePanelIslands {
|
|
80
|
+
/** A component card's empty preview box, for the component with this tag. */
|
|
81
|
+
preview: (element: HTMLElement, tagName: string) => void;
|
|
82
|
+
/** A component card, which drags an instance of the component with this tag. */
|
|
83
|
+
componentSource: (element: HTMLElement, tagName: string) => void;
|
|
84
|
+
/** A media thumbnail, which drags an element referencing the file at this path. */
|
|
85
|
+
mediaSource: (element: HTMLElement, path: string) => void;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export interface SitePanelSurfaceHandle {
|
|
89
|
+
/** Settles once the document is mounted. */
|
|
90
|
+
readonly ready: Promise<unknown>;
|
|
91
|
+
/** Whether the mounted root is still where it was put. */
|
|
92
|
+
connected: () => boolean;
|
|
93
|
+
update: (values: SitePanelValues) => void;
|
|
94
|
+
dispose: () => void;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
interface SitePanelScope extends SitePanelValues, SitePanelActions {}
|
|
98
|
+
|
|
99
|
+
/** The scope's shape before the first projection lands on it. */
|
|
100
|
+
export function emptySitePanelValues(): SitePanelValues {
|
|
101
|
+
return {
|
|
102
|
+
body: "none",
|
|
103
|
+
components: [],
|
|
104
|
+
componentsCount: "",
|
|
105
|
+
componentsState: "loading",
|
|
106
|
+
filter: "",
|
|
107
|
+
media: [],
|
|
108
|
+
mediaCount: "",
|
|
109
|
+
mediaMore: "",
|
|
110
|
+
mediaState: "loading",
|
|
111
|
+
pages: [],
|
|
112
|
+
pagesCount: "",
|
|
113
|
+
pagesState: "loading",
|
|
114
|
+
templates: [],
|
|
115
|
+
templatesCount: "",
|
|
116
|
+
templatesState: "loading",
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/** Write a projection in, field by field, so an unchanged field is inert. */
|
|
121
|
+
function project(scope: SitePanelScope, values: SitePanelValues): void {
|
|
122
|
+
scope.body = values.body;
|
|
123
|
+
scope.filter = values.filter;
|
|
124
|
+
scope.pages = values.pages;
|
|
125
|
+
scope.pagesState = values.pagesState;
|
|
126
|
+
scope.pagesCount = values.pagesCount;
|
|
127
|
+
scope.templates = values.templates;
|
|
128
|
+
scope.templatesState = values.templatesState;
|
|
129
|
+
scope.templatesCount = values.templatesCount;
|
|
130
|
+
scope.components = values.components;
|
|
131
|
+
scope.componentsState = values.componentsState;
|
|
132
|
+
scope.componentsCount = values.componentsCount;
|
|
133
|
+
scope.media = values.media;
|
|
134
|
+
scope.mediaState = values.mediaState;
|
|
135
|
+
scope.mediaCount = values.mediaCount;
|
|
136
|
+
scope.mediaMore = values.mediaMore;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/** The `part` a node was declared with, or the empty string. */
|
|
140
|
+
function partOf(def: JxElement | string): string {
|
|
141
|
+
const part = isString(def) ? undefined : def.attributes?.["part"];
|
|
142
|
+
return isString(part) ? part : "";
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/** The `$map` item a node was rendered inside, if it was rendered inside one. */
|
|
146
|
+
function mapItem(state: JxScope | undefined): JsonObject | null {
|
|
147
|
+
const map = state?.["$map"];
|
|
148
|
+
const item = isJsonObject(map) ? map["item"] : undefined;
|
|
149
|
+
return isJsonObject(item) ? item : null;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/** One string field of the mapped row, or the empty string. */
|
|
153
|
+
function itemField(state: JxScope | undefined, field: string): string {
|
|
154
|
+
const value = mapItem(state)?.[field];
|
|
155
|
+
return isString(value) ? value : "";
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Mount the Site panel into `container`, the content box the Navigator painted.
|
|
160
|
+
*
|
|
161
|
+
* @param container Where the document goes.
|
|
162
|
+
* @param values What it shows to begin with.
|
|
163
|
+
* @param actions What its controls do.
|
|
164
|
+
* @param islands Where the flow attaches previews and drag sources.
|
|
165
|
+
*/
|
|
166
|
+
export function mountSitePanelSurface(
|
|
167
|
+
container: HTMLElement,
|
|
168
|
+
values: SitePanelValues,
|
|
169
|
+
actions: SitePanelActions,
|
|
170
|
+
islands: SitePanelIslands,
|
|
171
|
+
): SitePanelSurfaceHandle {
|
|
172
|
+
const scope: SitePanelScope = reactive<SitePanelScope>({
|
|
173
|
+
...emptySitePanelValues(),
|
|
174
|
+
...actions,
|
|
175
|
+
});
|
|
176
|
+
project(scope, values);
|
|
177
|
+
|
|
178
|
+
let mounted: SurfaceHandle | null = null;
|
|
179
|
+
let disposed = false;
|
|
180
|
+
const ready = mountSurface("site-panel", scope, container, {
|
|
181
|
+
onNodeCreated: (element, _path, def, state) => {
|
|
182
|
+
if (disposed || !(element instanceof HTMLElement)) {
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
switch (partOf(def)) {
|
|
186
|
+
case "card-preview": {
|
|
187
|
+
const tag = itemField(state, "tagName");
|
|
188
|
+
if (tag !== "") {
|
|
189
|
+
islands.preview(element, tag);
|
|
190
|
+
}
|
|
191
|
+
break;
|
|
192
|
+
}
|
|
193
|
+
case "component-card": {
|
|
194
|
+
const tag = itemField(state, "tagName");
|
|
195
|
+
if (tag !== "") {
|
|
196
|
+
islands.componentSource(element, tag);
|
|
197
|
+
}
|
|
198
|
+
break;
|
|
199
|
+
}
|
|
200
|
+
case "media-thumb": {
|
|
201
|
+
const path = itemField(state, "path");
|
|
202
|
+
if (path !== "") {
|
|
203
|
+
islands.mediaSource(element, path);
|
|
204
|
+
}
|
|
205
|
+
break;
|
|
206
|
+
}
|
|
207
|
+
default: {
|
|
208
|
+
break;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
},
|
|
212
|
+
}).then((surface) => {
|
|
213
|
+
if (disposed) {
|
|
214
|
+
surface.dispose();
|
|
215
|
+
return surface;
|
|
216
|
+
}
|
|
217
|
+
mounted = surface;
|
|
218
|
+
return surface;
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
return {
|
|
222
|
+
connected: () => !disposed && (mounted === null || mounted.root.parentNode === container),
|
|
223
|
+
dispose() {
|
|
224
|
+
disposed = true;
|
|
225
|
+
mounted?.dispose();
|
|
226
|
+
mounted = null;
|
|
227
|
+
},
|
|
228
|
+
ready,
|
|
229
|
+
update: (next) => {
|
|
230
|
+
project(scope, next);
|
|
231
|
+
},
|
|
232
|
+
};
|
|
233
|
+
}
|
|
@@ -140,36 +140,78 @@
|
|
|
140
140
|
{
|
|
141
141
|
"$prototype": "Array",
|
|
142
142
|
"items": {
|
|
143
|
-
"$ref": "#/state/
|
|
143
|
+
"$ref": "#/state/groups"
|
|
144
144
|
},
|
|
145
145
|
"key": {
|
|
146
146
|
"$ref": "$map/item/key"
|
|
147
147
|
},
|
|
148
148
|
"map": {
|
|
149
|
-
"tagName": "
|
|
149
|
+
"tagName": "div",
|
|
150
150
|
"attributes": {
|
|
151
|
-
"part": "
|
|
152
|
-
"
|
|
153
|
-
"
|
|
154
|
-
"label": "${$map.item.label}",
|
|
155
|
-
"description": "${$map.item.description}"
|
|
151
|
+
"part": "group",
|
|
152
|
+
"role": "group",
|
|
153
|
+
"aria-label": "${$map.item.name}"
|
|
156
154
|
},
|
|
157
|
-
"
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
{
|
|
161
|
-
"
|
|
162
|
-
"
|
|
163
|
-
|
|
155
|
+
"children": [
|
|
156
|
+
{
|
|
157
|
+
"tagName": "div",
|
|
158
|
+
"attributes": {
|
|
159
|
+
"part": "group-label-slot",
|
|
160
|
+
"role": "none"
|
|
161
|
+
},
|
|
162
|
+
"style": {
|
|
163
|
+
"display": "contents"
|
|
164
|
+
},
|
|
165
|
+
"$switch": {
|
|
166
|
+
"$ref": "$map/item/hasLabel"
|
|
167
|
+
},
|
|
168
|
+
"cases": {
|
|
169
|
+
"true": {
|
|
170
|
+
"tagName": "div",
|
|
171
|
+
"attributes": {
|
|
172
|
+
"part": "group-heading",
|
|
173
|
+
"aria-hidden": "true"
|
|
174
|
+
},
|
|
175
|
+
"textContent": "${$map.item.label}"
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
"$prototype": "Array",
|
|
181
|
+
"items": {
|
|
182
|
+
"$ref": "$map/item/rows"
|
|
183
|
+
},
|
|
184
|
+
"key": {
|
|
185
|
+
"$ref": "$map/item/key"
|
|
186
|
+
},
|
|
187
|
+
"map": {
|
|
188
|
+
"tagName": "jx-option",
|
|
189
|
+
"attributes": {
|
|
190
|
+
"part": "option",
|
|
191
|
+
"id": "slash-menu-option-${$map.item.index}",
|
|
192
|
+
"value": "${$map.item.key}",
|
|
193
|
+
"label": "${$map.item.label}",
|
|
194
|
+
"description": "${$map.item.description}"
|
|
164
195
|
},
|
|
165
|
-
"
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
196
|
+
"onmouseenter": {
|
|
197
|
+
"$prototype": "Function",
|
|
198
|
+
"body": [
|
|
199
|
+
{
|
|
200
|
+
"operator": "call",
|
|
201
|
+
"target": {
|
|
202
|
+
"$ref": "#/state/hover"
|
|
203
|
+
},
|
|
204
|
+
"value": [
|
|
205
|
+
{
|
|
206
|
+
"$ref": "$map/item/index"
|
|
207
|
+
}
|
|
208
|
+
]
|
|
209
|
+
}
|
|
210
|
+
]
|
|
211
|
+
}
|
|
170
212
|
}
|
|
171
|
-
|
|
172
|
-
|
|
213
|
+
}
|
|
214
|
+
]
|
|
173
215
|
}
|
|
174
216
|
}
|
|
175
217
|
]
|
|
@@ -59,6 +59,23 @@ export interface SlashMenuRow {
|
|
|
59
59
|
label: string;
|
|
60
60
|
/** A muted note at the end of the row. Empty draws no box: `jx-option` hides its own part. */
|
|
61
61
|
description: string;
|
|
62
|
+
/** The row's position in the FLAT list — its id, and what a hover reports. */
|
|
63
|
+
index: number;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* One headed run of rows: the HTML elements (no heading), then the project's components under
|
|
68
|
+
* "Components" (§5.7). A `role="group"` wrapper is what `jx-listbox` reads headings from, and its
|
|
69
|
+
* rows stay its own (`optionsOf` keeps every descendant option whose nearest listbox is this one).
|
|
70
|
+
*/
|
|
71
|
+
export interface SlashMenuGroup {
|
|
72
|
+
key: string;
|
|
73
|
+
/** The visible heading; empty for the unheaded first group. */
|
|
74
|
+
label: string;
|
|
75
|
+
/** The group's accessible name, which the unheaded group needs too. */
|
|
76
|
+
name: string;
|
|
77
|
+
hasLabel: boolean;
|
|
78
|
+
rows: SlashMenuRow[];
|
|
62
79
|
}
|
|
63
80
|
|
|
64
81
|
/** What the panel is showing right now. */
|
|
@@ -71,7 +88,10 @@ export interface SlashMenuView {
|
|
|
71
88
|
showFilter: boolean;
|
|
72
89
|
/** What that field contains. */
|
|
73
90
|
filter: string;
|
|
91
|
+
/** Every row, flat, in the order the keyboard walks them. */
|
|
74
92
|
rows: SlashMenuRow[];
|
|
93
|
+
/** The same rows as the panel draws them, headed. */
|
|
94
|
+
groups: SlashMenuGroup[];
|
|
75
95
|
/** The highlighted row, as an index into {@link SlashMenuView.rows}. */
|
|
76
96
|
activeIndex: number;
|
|
77
97
|
}
|
|
@@ -108,6 +128,7 @@ interface SlashMenuScope {
|
|
|
108
128
|
showFilter: boolean;
|
|
109
129
|
filter: string;
|
|
110
130
|
rows: SlashMenuRow[];
|
|
131
|
+
groups: SlashMenuGroup[];
|
|
111
132
|
/**
|
|
112
133
|
* The active row's id — the ONE string the highlight is written as. The listbox turns it into a
|
|
113
134
|
* row's `selected`, and the filter field, when there is one, puts the same string in its
|
|
@@ -193,6 +214,7 @@ export function openSlashMenuSurface(
|
|
|
193
214
|
}
|
|
194
215
|
},
|
|
195
216
|
rows: [...view.rows],
|
|
217
|
+
groups: [...view.groups],
|
|
196
218
|
showFilter: view.showFilter,
|
|
197
219
|
x: view.x,
|
|
198
220
|
y: view.y,
|
|
@@ -274,6 +296,7 @@ export function openSlashMenuSurface(
|
|
|
274
296
|
scope.showFilter = next.showFilter;
|
|
275
297
|
scope.filter = next.filter;
|
|
276
298
|
scope.rows = [...next.rows];
|
|
299
|
+
scope.groups = [...next.groups];
|
|
277
300
|
scope.activeId = activeIdOf(next);
|
|
278
301
|
scope.isEmpty = next.rows.length === 0;
|
|
279
302
|
scope.expanded = next.rows.length > 0;
|
|
@@ -47,6 +47,8 @@ import { attachJumpBarHost, mountJumpBar, unmountJumpBar } from "../panels/jump-
|
|
|
47
47
|
import { shell } from "../shell";
|
|
48
48
|
import { effect, effectScope, reactive } from "../reactivity";
|
|
49
49
|
import { activeTab } from "../workspace/workspace";
|
|
50
|
+
import { PROJECT_STYLES_VIEW } from "../style/project-styles";
|
|
51
|
+
import { stylebookTarget } from "../style/stylebook-target";
|
|
50
52
|
import { activeRegistry } from "../commands/active-registry";
|
|
51
53
|
import { runReported } from "../commands/run-reported";
|
|
52
54
|
import { deployStatusItem } from "../publish/deploy-checklist";
|
|
@@ -164,6 +166,14 @@ export function aheadBehindLabel(ahead: number, behind: number): string {
|
|
|
164
166
|
return `${ahead > 0 ? ` ↑${ahead}` : ""}${behind > 0 ? ` ↓${behind}` : ""}`;
|
|
165
167
|
}
|
|
166
168
|
|
|
169
|
+
/** "No changes", "1 changed file", "3 changed files": what the branch item's tooltip states. */
|
|
170
|
+
export function changedFilesLabel(count: number): string {
|
|
171
|
+
if (count === 0) {
|
|
172
|
+
return "No changes";
|
|
173
|
+
}
|
|
174
|
+
return count === 1 ? "1 changed file" : `${count} changed files`;
|
|
175
|
+
}
|
|
176
|
+
|
|
167
177
|
function projectField_(registry: CommandRegistry | null): ProjectedField | null {
|
|
168
178
|
const project = projectState;
|
|
169
179
|
const { status } = shell.git;
|
|
@@ -183,11 +193,16 @@ function projectField_(registry: CommandRegistry | null): ProjectedField | null
|
|
|
183
193
|
— and adjacent duplicate chrome is what the chrome budget (studio-ui-guidelines.md §12.2)
|
|
184
194
|
forbids. `tests/statusbar.test.ts` pins the pairing from both ends, so deleting the
|
|
185
195
|
checklist's repo step fails there rather than quietly taking the state off the bar. */
|
|
196
|
+
/* `publish.open { tab: "review" }` rather than the bare workspace setter: the setter's title
|
|
197
|
+
is "Switch Workspace", which says nothing about where a branch item goes, and the Publish
|
|
198
|
+
workspace remembers its last sub-tab, so a click from a count of changes could land on
|
|
199
|
+
Hosting. Review changes is the tab that count is a count of. */
|
|
186
200
|
status?.isRepo === true && status.branch
|
|
187
201
|
? {
|
|
188
|
-
|
|
202
|
+
args: { tab: "review" },
|
|
203
|
+
command: "publish.open",
|
|
189
204
|
label: `⑂ ${status.branch}${aheadBehindLabel(status.ahead, status.behind)}`,
|
|
190
|
-
title: `${status.files.length}
|
|
205
|
+
title: `${changedFilesLabel(status.files.length)} on ${status.branch}`,
|
|
191
206
|
}
|
|
192
207
|
: null,
|
|
193
208
|
// Where the project stands with shipping — ambient state, so it belongs beside the branch and
|
|
@@ -203,7 +218,7 @@ function projectField_(registry: CommandRegistry | null): ProjectedField | null
|
|
|
203
218
|
args: { tab: "problems" },
|
|
204
219
|
command: "view.setBottomTab",
|
|
205
220
|
label: `⚠ ${count}`,
|
|
206
|
-
title: `${count}
|
|
221
|
+
title: count === 1 ? "1 problem" : `${count} problems`,
|
|
207
222
|
}
|
|
208
223
|
: null,
|
|
209
224
|
/* `collab.showStatus` — "what is happening in this document?" — because that is the question a
|
|
@@ -233,28 +248,36 @@ function projectField_(registry: CommandRegistry | null): ProjectedField | null
|
|
|
233
248
|
* states it permanently, with its ancestors, one field to the left.
|
|
234
249
|
*/
|
|
235
250
|
function selectionField(registry: CommandRegistry | null): ProjectedField | null {
|
|
236
|
-
const
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
251
|
+
const tab = activeTab.value;
|
|
252
|
+
/* The Stylebook's selection is what the Style panel is editing, and it is a selection OF the
|
|
253
|
+
Stylebook canvas, so it is the field's content exactly while the focused tab draws that canvas,
|
|
254
|
+
and never elsewhere. It outlives a workspace switch (coming back to Styles finds `h1` still
|
|
255
|
+
picked), but a Content page or the Publish home is not editing `h1`, and the field used to say
|
|
256
|
+
it was there. The Style panel gates on the same mode (`panels/style-panel.ts`).
|
|
257
|
+
|
|
258
|
+
It also wins over the document selection here, because in that mode the document selection is
|
|
259
|
+
not the author's: picking a tag clears it (`selectStylebookTag`), so the "a single selection
|
|
260
|
+
prints nothing" rule below hid the rule being edited in the one place it applied. The command
|
|
261
|
+
bar and the Inspector header ask the same question through `stylebookTarget`. */
|
|
262
|
+
if (tab?.session.ui.canvasMode === PROJECT_STYLES_VIEW) {
|
|
263
|
+
const target = stylebookTarget(tab);
|
|
264
|
+
return target
|
|
241
265
|
? projectField(registry, "selection", [
|
|
242
266
|
{
|
|
243
267
|
command: null,
|
|
244
|
-
label:
|
|
245
|
-
title:
|
|
268
|
+
label: target.replaceAll(" ", " › "),
|
|
269
|
+
title: "The style rule being edited",
|
|
246
270
|
},
|
|
247
271
|
])
|
|
248
272
|
: null;
|
|
249
273
|
}
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
return shell.stylebook.selection
|
|
274
|
+
const paths = tab?.session.selection ?? [];
|
|
275
|
+
return paths.length > 1
|
|
253
276
|
? projectField(registry, "selection", [
|
|
254
277
|
{
|
|
255
278
|
command: null,
|
|
256
|
-
label:
|
|
257
|
-
title:
|
|
279
|
+
label: `${paths.length} selected`,
|
|
280
|
+
title: `${paths.length} elements are selected; the trail names the primary`,
|
|
258
281
|
},
|
|
259
282
|
])
|
|
260
283
|
: null;
|
|
@@ -352,6 +375,7 @@ export function mountStatusbar(): void {
|
|
|
352
375
|
// Reading it here is what repaints the bar from a skeleton into the real thing.
|
|
353
376
|
void activeRegistry();
|
|
354
377
|
void shell.stylebook.selection;
|
|
378
|
+
void activeTab.value?.session.ui.canvasMode;
|
|
355
379
|
void shell.git.status;
|
|
356
380
|
void problems.length;
|
|
357
381
|
const tab = activeTab.value;
|