@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,325 @@
|
|
|
1
|
+
/// <reference lib="dom" />
|
|
2
|
+
/**
|
|
3
|
+
* Add new as a mounted document.
|
|
4
|
+
*
|
|
5
|
+
* `create/add-new-flow.ts` is the flow — it holds the kind, the name and the options, reads the
|
|
6
|
+
* project into a `CreationContext`, lists the directories the result would write into, asks
|
|
7
|
+
* `deriveCreation` what that is and `creationProblem` whether it may, and performs the write — and
|
|
8
|
+
* this is the surface it draws into: the reactive scope the document reads, the few flags it
|
|
9
|
+
* branches on, and the mount that lives in the dialog layer until the flow takes it down.
|
|
10
|
+
*
|
|
11
|
+
* **The flow states facts; the surface derives the flags.** Whether the name field is drawn,
|
|
12
|
+
* whether the field is refused and whether the primary button can answer are each one comparison
|
|
13
|
+
* over the view, so they are made here rather than handed in beside the facts they restate.
|
|
14
|
+
*
|
|
15
|
+
* **Await the ELEMENT, not just the mount.** `mountSurface` resolving means the DOCUMENT rendered;
|
|
16
|
+
* a `jx-dialog`'s own template is one `connectedCallback` later, and `showModal` in between finds
|
|
17
|
+
* no `<dialog>` to open. `whenReady` is shared with `surfaces/dialog.ts` rather than
|
|
18
|
+
* reimplemented.
|
|
19
|
+
*
|
|
20
|
+
* @docs studio/projects/pages-layouts-components
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
import { reactive } from "../reactivity";
|
|
24
|
+
import { mountSurface, registerSurface } from "../ui/surface";
|
|
25
|
+
import { overlayRegion, REGION_ATTR } from "../ui/regions";
|
|
26
|
+
import { close, showModal } from "@jxsuite/ui/behaviors/dialog";
|
|
27
|
+
import { selectValue } from "@jxsuite/ui/behaviors/textfield";
|
|
28
|
+
import { whenReady } from "./dialog";
|
|
29
|
+
import addNewDoc from "./add-new.json";
|
|
30
|
+
import type { CreationKind } from "../create/add-new";
|
|
31
|
+
import type { SurfaceHandle, SurfaceOption } from "../ui/surface";
|
|
32
|
+
|
|
33
|
+
registerSurface("add-new", addNewDoc);
|
|
34
|
+
|
|
35
|
+
/** One kind in the left-hand list. */
|
|
36
|
+
export interface AddNewKindRow {
|
|
37
|
+
id: CreationKind;
|
|
38
|
+
label: string;
|
|
39
|
+
hint: string;
|
|
40
|
+
icon: string;
|
|
41
|
+
/** `"true"` for the chosen kind: the row is one radio of a radiogroup. */
|
|
42
|
+
checked: "true" | "false";
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/** One card in a Start from / Wrap it in radiogroup. */
|
|
46
|
+
export interface AddNewChoiceRow {
|
|
47
|
+
value: string;
|
|
48
|
+
label: string;
|
|
49
|
+
/** The muted second line: "header + footer", "mostly writing", "2 elements". */
|
|
50
|
+
note: string;
|
|
51
|
+
checked: "true" | "false";
|
|
52
|
+
/** A choice that cannot be made now stays in the group, disabled, with `reason` as its tip. */
|
|
53
|
+
disabled: boolean;
|
|
54
|
+
reason: string;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/** One field preset chip. */
|
|
58
|
+
export interface AddNewPresetRow {
|
|
59
|
+
id: string;
|
|
60
|
+
label: string;
|
|
61
|
+
selected: boolean;
|
|
62
|
+
icon: string;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/** What the flow knows. Every one of these may change while the dialog is up. */
|
|
66
|
+
export interface AddNewView {
|
|
67
|
+
kind: CreationKind;
|
|
68
|
+
kinds: AddNewKindRow[];
|
|
69
|
+
/** The chosen kind's label, which names the detail region. */
|
|
70
|
+
kindLabel: string;
|
|
71
|
+
/** The sentence that introduces the chosen kind. */
|
|
72
|
+
kindHint: string;
|
|
73
|
+
/** Where the dialog can be opened from, said once at the foot of the list. */
|
|
74
|
+
chordNote: string;
|
|
75
|
+
nameLabel: string;
|
|
76
|
+
name: string;
|
|
77
|
+
placeholder: string;
|
|
78
|
+
/** The refusal under the name field; `""` until the reader has typed, and when there is none. */
|
|
79
|
+
error: string;
|
|
80
|
+
/** The derived result: "Saved as pages/pricing.json · opens at /pricing". */
|
|
81
|
+
saved: string;
|
|
82
|
+
/** The primary button's words. */
|
|
83
|
+
cta: string;
|
|
84
|
+
/** Whether the primary button can answer now. */
|
|
85
|
+
canConfirm: boolean;
|
|
86
|
+
|
|
87
|
+
// ── language (page, entry, collection) ────────────────────────────────────
|
|
88
|
+
/** Whether the Language picker is drawn: a page, or an entry of a localized collection. */
|
|
89
|
+
localeShown: boolean;
|
|
90
|
+
localeOptions: SurfaceOption[];
|
|
91
|
+
/** The chosen language, a declared tag. */
|
|
92
|
+
locale: string;
|
|
93
|
+
/** Whether the project declares languages, which is when a collection can be localized. */
|
|
94
|
+
localizable: boolean;
|
|
95
|
+
/** Collection: one folder per language. */
|
|
96
|
+
localized: boolean;
|
|
97
|
+
/** The declared tags, said on the collection's checkbox: "en, fr-CA, ar". */
|
|
98
|
+
localeSummary: string;
|
|
99
|
+
|
|
100
|
+
// ── page ──────────────────────────────────────────────────────────────────
|
|
101
|
+
route: string;
|
|
102
|
+
editingUrl: boolean;
|
|
103
|
+
url: string;
|
|
104
|
+
startChoices: AddNewChoiceRow[];
|
|
105
|
+
|
|
106
|
+
// ── collection ────────────────────────────────────────────────────────────
|
|
107
|
+
itemNoun: string;
|
|
108
|
+
presets: AddNewPresetRow[];
|
|
109
|
+
ownPage: boolean;
|
|
110
|
+
pattern: string;
|
|
111
|
+
templateOptions: SurfaceOption[];
|
|
112
|
+
pageTemplate: string;
|
|
113
|
+
|
|
114
|
+
// ── template ──────────────────────────────────────────────────────────────
|
|
115
|
+
wrapChoices: AddNewChoiceRow[];
|
|
116
|
+
|
|
117
|
+
// ── component ─────────────────────────────────────────────────────────────
|
|
118
|
+
componentChoices: AddNewChoiceRow[];
|
|
119
|
+
copying: boolean;
|
|
120
|
+
copyOptions: SurfaceOption[];
|
|
121
|
+
copyOf: string;
|
|
122
|
+
|
|
123
|
+
// ── entry ─────────────────────────────────────────────────────────────────
|
|
124
|
+
collectionOptions: SurfaceOption[];
|
|
125
|
+
collection: string;
|
|
126
|
+
|
|
127
|
+
// ── media ─────────────────────────────────────────────────────────────────
|
|
128
|
+
dropActive: "true" | "false";
|
|
129
|
+
uploadAccept: string;
|
|
130
|
+
fileSummary: string;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/** What the document can tell the flow. */
|
|
134
|
+
export interface AddNewActions {
|
|
135
|
+
pickKind: (kind: CreationKind) => void;
|
|
136
|
+
setName: (value: string) => void;
|
|
137
|
+
/** The primary button, or Enter in a field. The flow decides whether that creates anything. */
|
|
138
|
+
confirm: () => void;
|
|
139
|
+
toggleUrl: () => void;
|
|
140
|
+
setUrl: (value: string) => void;
|
|
141
|
+
pickStart: (value: string) => void;
|
|
142
|
+
togglePreset: (id: string) => void;
|
|
143
|
+
setOwnPage: (checked: boolean) => void;
|
|
144
|
+
pickPageTemplate: (value: string) => void;
|
|
145
|
+
pickWrap: (value: string) => void;
|
|
146
|
+
pickComponentStart: (value: string) => void;
|
|
147
|
+
pickCopy: (value: string) => void;
|
|
148
|
+
pickCollection: (value: string) => void;
|
|
149
|
+
pickLocale: (value: string) => void;
|
|
150
|
+
setLocalized: (checked: boolean) => void;
|
|
151
|
+
/**
|
|
152
|
+
* The file picker settled. The ELEMENT rather than its list, because a file input that is not
|
|
153
|
+
* cleared refuses the same file twice, and the input is this document's own control.
|
|
154
|
+
*/
|
|
155
|
+
choose: (input: HTMLInputElement) => void;
|
|
156
|
+
drop: (files: FileList | null) => void;
|
|
157
|
+
dragOver: () => void;
|
|
158
|
+
dragOut: () => void;
|
|
159
|
+
/** The dialog closed, for any reason the platform owns as well as the flow's own `close`. */
|
|
160
|
+
closed: () => void;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
export interface AddNewSurfaceOptions {
|
|
164
|
+
/** Where the dialog is mounted — the dialog layer, handed in so this module never reaches back. */
|
|
165
|
+
layer: HTMLElement;
|
|
166
|
+
view: AddNewView;
|
|
167
|
+
actions: AddNewActions;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
export interface AddNewSurfaceHandle {
|
|
171
|
+
host: HTMLElement;
|
|
172
|
+
/** Resolves with the `jx-dialog` element once it has rendered and been opened. */
|
|
173
|
+
ready: Promise<HTMLElement>;
|
|
174
|
+
/** Redraw from the flow's current view. */
|
|
175
|
+
update: (view: AddNewView) => void;
|
|
176
|
+
/** Close the dialog (the platform restores focus) and dispose the document. Idempotent. */
|
|
177
|
+
close: () => void;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/** What the document branches on. Derived, never handed in. */
|
|
181
|
+
interface AddNewFlags {
|
|
182
|
+
/** Every kind but Media has a name. */
|
|
183
|
+
named: boolean;
|
|
184
|
+
invalid: boolean;
|
|
185
|
+
blocked: boolean;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
type AddNewScope = AddNewView &
|
|
189
|
+
AddNewFlags &
|
|
190
|
+
Omit<AddNewActions, "setName" | "closed"> & {
|
|
191
|
+
setName: (value: string) => void;
|
|
192
|
+
closed: () => void;
|
|
193
|
+
};
|
|
194
|
+
|
|
195
|
+
/** The view plus the flags the document renders from. */
|
|
196
|
+
function derive(view: AddNewView): AddNewView & AddNewFlags {
|
|
197
|
+
return {
|
|
198
|
+
...view,
|
|
199
|
+
blocked: !view.canConfirm,
|
|
200
|
+
invalid: view.error !== "",
|
|
201
|
+
named: view.kind !== "media",
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/** Open the dialog. The handle's `ready` resolves once it is showing. */
|
|
206
|
+
export function openAddNewSurface(options: AddNewSurfaceOptions): AddNewSurfaceHandle {
|
|
207
|
+
const slot = document.createElement("div");
|
|
208
|
+
/* The layer is `pointer-events: none` so a click passes through it when nothing is up, and every
|
|
209
|
+
slot in it turns them back on for its own content. `pointer-events` INHERITS, and the top layer
|
|
210
|
+
changes paint order rather than inheritance, so a modal `<dialog>` in a slot that skipped this
|
|
211
|
+
is painted above everything and hit-tests to nothing. */
|
|
212
|
+
slot.style.pointerEvents = "auto";
|
|
213
|
+
slot.setAttribute(REGION_ATTR, overlayRegion("dialog", "add-new"));
|
|
214
|
+
options.layer.append(slot);
|
|
215
|
+
|
|
216
|
+
let closed = false;
|
|
217
|
+
/** Say it is over, once: the platform's own `close` and `close()` may each be first. */
|
|
218
|
+
const finish = (): void => {
|
|
219
|
+
if (closed) {
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
closed = true;
|
|
223
|
+
options.actions.closed();
|
|
224
|
+
};
|
|
225
|
+
const isClosed = (): boolean => closed;
|
|
226
|
+
|
|
227
|
+
const { actions } = options;
|
|
228
|
+
const scope: AddNewScope = reactive<AddNewScope>({
|
|
229
|
+
...derive(options.view),
|
|
230
|
+
choose: actions.choose,
|
|
231
|
+
closed: finish,
|
|
232
|
+
confirm: actions.confirm,
|
|
233
|
+
dragOut: actions.dragOut,
|
|
234
|
+
dragOver: actions.dragOver,
|
|
235
|
+
drop: actions.drop,
|
|
236
|
+
pickCollection: actions.pickCollection,
|
|
237
|
+
pickComponentStart: actions.pickComponentStart,
|
|
238
|
+
pickCopy: actions.pickCopy,
|
|
239
|
+
pickKind: actions.pickKind,
|
|
240
|
+
pickLocale: actions.pickLocale,
|
|
241
|
+
pickPageTemplate: actions.pickPageTemplate,
|
|
242
|
+
pickStart: actions.pickStart,
|
|
243
|
+
pickWrap: actions.pickWrap,
|
|
244
|
+
setName: (value: string) => {
|
|
245
|
+
/* What the control holds, first and unconditionally. A binding only writes when the scope
|
|
246
|
+
CHANGES, so a surface that did not echo the raw value would leave the field showing text
|
|
247
|
+
the scope does not have (`studio-ui-guidelines.md` §9.3). */
|
|
248
|
+
scope.name = value;
|
|
249
|
+
actions.setName(value);
|
|
250
|
+
},
|
|
251
|
+
setLocalized: actions.setLocalized,
|
|
252
|
+
setOwnPage: actions.setOwnPage,
|
|
253
|
+
setUrl: (value: string) => {
|
|
254
|
+
scope.url = value;
|
|
255
|
+
actions.setUrl(value);
|
|
256
|
+
},
|
|
257
|
+
toggleUrl: actions.toggleUrl,
|
|
258
|
+
togglePreset: actions.togglePreset,
|
|
259
|
+
});
|
|
260
|
+
|
|
261
|
+
let mounted: SurfaceHandle | null = null;
|
|
262
|
+
|
|
263
|
+
/**
|
|
264
|
+
* Put the caret in the name field, selected.
|
|
265
|
+
*
|
|
266
|
+
* On open only: the name is the only thing the dialog requires, so it is where the reader is
|
|
267
|
+
* about to type. A focus move is the one thing a surface may reach into its document for (`ui.md`
|
|
268
|
+
* §2 rule 5).
|
|
269
|
+
*/
|
|
270
|
+
const focusName = (): void => {
|
|
271
|
+
setTimeout(() => {
|
|
272
|
+
const root = mounted?.root;
|
|
273
|
+
if (closed || !(root instanceof HTMLElement)) {
|
|
274
|
+
return;
|
|
275
|
+
}
|
|
276
|
+
const control = root.querySelector<HTMLElement>('jx-textfield[part="name"]');
|
|
277
|
+
if (control) {
|
|
278
|
+
selectValue(control, "all");
|
|
279
|
+
}
|
|
280
|
+
}, 0);
|
|
281
|
+
};
|
|
282
|
+
|
|
283
|
+
const ready = mountSurface("add-new", scope, slot).then(async (surface) => {
|
|
284
|
+
mounted = surface;
|
|
285
|
+
/* SAFETY: `add-new.json`'s root definition is a `jx-dialog` element, so the runtime mounts an
|
|
286
|
+
HTMLElement; a `Text` root only comes from a document whose root is a bare string. */
|
|
287
|
+
const element = surface.root as HTMLElement;
|
|
288
|
+
if (isClosed()) {
|
|
289
|
+
surface.dispose();
|
|
290
|
+
return element;
|
|
291
|
+
}
|
|
292
|
+
await whenReady(element);
|
|
293
|
+
if (isClosed()) {
|
|
294
|
+
return element;
|
|
295
|
+
}
|
|
296
|
+
showModal(element);
|
|
297
|
+
if (scope.named) {
|
|
298
|
+
focusName();
|
|
299
|
+
}
|
|
300
|
+
return element;
|
|
301
|
+
});
|
|
302
|
+
|
|
303
|
+
return {
|
|
304
|
+
close() {
|
|
305
|
+
/* Idempotent line by line rather than guarded on `closed`: the platform's own `close` runs
|
|
306
|
+
`finish()` first, and a guard would leave this slot behind in the layer. */
|
|
307
|
+
const element = mounted?.root;
|
|
308
|
+
if (element instanceof HTMLElement) {
|
|
309
|
+
close(element);
|
|
310
|
+
}
|
|
311
|
+
mounted?.dispose();
|
|
312
|
+
mounted = null;
|
|
313
|
+
slot.remove();
|
|
314
|
+
finish();
|
|
315
|
+
},
|
|
316
|
+
host: slot,
|
|
317
|
+
ready,
|
|
318
|
+
update(view) {
|
|
319
|
+
/* Never a focus move here. A kind switch from the keyboard is an arrow key inside the kinds
|
|
320
|
+
radiogroup, and pulling the caret into the name field would end the walk after one step;
|
|
321
|
+
the name keeps its value across kinds and Tab reaches it next. */
|
|
322
|
+
Object.assign(scope, derive(view));
|
|
323
|
+
},
|
|
324
|
+
};
|
|
325
|
+
}
|
package/src/surfaces/ai-chat.ts
CHANGED
|
@@ -514,8 +514,8 @@ export function mountAiChatSurface(
|
|
|
514
514
|
}
|
|
515
515
|
}
|
|
516
516
|
|
|
517
|
-
/* There is no `connected()` here, where `
|
|
518
|
-
|
|
517
|
+
/* There is no `connected()` here, where `panel-stylebook-layers.ts` has one. That one mounts
|
|
518
|
+
into a node LIT repaints, so "is my root still where I put it" is a
|
|
519
519
|
live question. The assistant's container is built once for the life of the window
|
|
520
520
|
(`right-panel.ts`'s `_ensureContainers`) and nothing else ever writes into it, so the answer
|
|
521
521
|
would be a constant — and a constant nobody reads is a second thing to keep in step. */
|
|
@@ -21,12 +21,13 @@
|
|
|
21
21
|
"fontFamily": "var(--jx-font-sans)",
|
|
22
22
|
"color": "var(--jx-fg)",
|
|
23
23
|
"& > [part=\"drag-strip\"]": {
|
|
24
|
-
"$description": "The window's handle.
|
|
24
|
+
"$description": "The window's handle. The `app-region-drag` class (shell-frame) makes the strip drag the frameless window, so the rule here sizes it, as tall as the hidden title bar would have been, and repeats the drag region so the strip works even before the shell stylesheet loads.",
|
|
25
25
|
"position": "absolute",
|
|
26
26
|
"top": "0",
|
|
27
27
|
"left": "0",
|
|
28
28
|
"right": "0",
|
|
29
|
-
"height": "calc(var(--jx-control-h) + var(--jx-space-3))"
|
|
29
|
+
"height": "calc(var(--jx-control-h) + var(--jx-space-3))",
|
|
30
|
+
"-webkit-app-region": "drag"
|
|
30
31
|
},
|
|
31
32
|
"& > [part=\"content\"]": {
|
|
32
33
|
"position": "relative",
|
|
@@ -88,7 +89,7 @@
|
|
|
88
89
|
"tagName": "div",
|
|
89
90
|
"attributes": {
|
|
90
91
|
"part": "drag-strip",
|
|
91
|
-
"class": "
|
|
92
|
+
"class": "app-region-drag",
|
|
92
93
|
"aria-hidden": "true"
|
|
93
94
|
}
|
|
94
95
|
},
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://jxsuite.com/schema/v1",
|
|
3
3
|
"$id": "StudioBottomDock",
|
|
4
|
-
"$description": "The Bottom dock's chrome (studio.md §16.3) as a Jx document over the kit: a real `tablist` of the dock's tabs, the button that shuts it, and ONE `tabpanel` for whichever tab is showing. Every tab names that one panel — the dock draws the selected tab's body and no other, so there is exactly one panel element and its `aria-labelledby` follows the selection, which is the same shape `surfaces/
|
|
4
|
+
"$description": "The Bottom dock's chrome (studio.md §16.3) as a Jx document over the kit: a real `tablist` of the dock's tabs, the button that shuts it, and ONE `tabpanel` for whichever tab is showing. Every tab names that one panel — the dock draws the selected tab's body and no other, so there is exactly one panel element and its `aria-labelledby` follows the selection, which is the same shape `surfaces/publish-workspace.json` uses for its four sub-tabs. It draws no tab BODY: `panels/bottom-dock.ts` keeps the panel registry, the `when` filter, the badge in each tab's label, the Logic reveal and every tab's `afterRender`, and renders the active record into the one empty `[part=\"dock-body\"]` island this document leaves for it (studio-ui-guidelines.md §9.4).",
|
|
5
5
|
"tagName": "div",
|
|
6
6
|
"attributes": {
|
|
7
7
|
"part": "bottom-dock"
|
|
@@ -1,22 +1,26 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://jxsuite.com/schema/v1",
|
|
3
3
|
"$id": "StudioCanvasStage",
|
|
4
|
-
"$description": "The canvas's own chrome: the artboards, the boxes around them, and the empty hosts the islands attach to. `canvas/canvas-render.ts` keeps every decision — which mode this pane is in, which breakpoints the document declares, how wide Edit's column is, whether a comparison has a visual half — and `canvas/canvas-utils.ts` keeps the geometry; this document owns the markup and the style, and it draws NOTHING it decides for itself.\n\n**Every island stays an island** (studio-ui-guidelines.md §9.4). Monaco gets `[part=\"source-editor\"]` or `[part=\"diff-code-editor\"]`, the artboard's iframe gets `[part=\"panel-canvas\"]`, the
|
|
4
|
+
"$description": "The canvas's own chrome: the artboards, the boxes around them, and the empty hosts the islands attach to. `canvas/canvas-render.ts` keeps every decision — which mode this pane is in, which breakpoints the document declares, how wide Edit's column is, whether a comparison has a visual half — and `canvas/canvas-utils.ts` keeps the geometry; this document owns the markup and the style, and it draws NOTHING it decides for itself.\n\n**Every island stays an island** (studio-ui-guidelines.md §9.4). Monaco gets `[part=\"source-editor\"]` or `[part=\"diff-code-editor\"]`, the artboard's iframe gets `[part=\"panel-canvas\"]`, the writing-mode banner gets `[part=\"writing-banner\"]`, the Compare bar gets `[part=\"diff-toolbar\"]` and the Project Styles bar gets `[part=\"chrome-host\"]` — each drawn empty and announced through `onNodeCreated`, one reconcile step before it is in the page.\n\n**Three of the five frames share one artboard vocabulary**, which is why `framePart` and `innerPart` are bound rather than written: Preview, the pan/zoom surface and Edit's column are all \"a box holding N artboards\", differing only in what the box is and what else stands in it. Writing the artboard three times would be three places for a breakpoint's viewport to drift.\n\n**The stage draws no box of its own.** Its root is `display: contents`, so the frame and whatever leads it are the flex items of the pane's own stage cell — the axis `canvas-render.ts` sets on that cell still reaches them, and no depth was added between the stage and the artboards for the pan maths to have to account for.",
|
|
5
5
|
"tagName": "div",
|
|
6
6
|
"attributes": {
|
|
7
7
|
"part": "stage"
|
|
8
8
|
},
|
|
9
9
|
"style": {
|
|
10
|
-
"$description": "`styles/canvas.css`'s `.panzoom-wrap`, `.canvas-panel*`, `.source-*`, `.content-edit-*`, `.edit-width-handle`, `.preview-stage` and `.diff-code-*` rules, keyed on `part`, plus the
|
|
10
|
+
"$description": "`styles/canvas.css`'s `.panzoom-wrap`, `.canvas-panel*`, `.source-*`, `.content-edit-*`, `.edit-width-handle`, `.preview-stage` and `.diff-code-*` rules, keyed on `part`, plus the writing-mode banner's host. One selector reaches FOREIGN DOM and says so where it stands: `.is-resizing` is written by `canvas/edit-width-drag.ts` onto the column this document draws — the same shape `grid-panel.json` uses for Tabulator's theme. The width handles are `jx-split` elements, which paint their own hover, drag and focus states; this sheet says only where they stand and how wide they are.",
|
|
11
11
|
"display": "contents",
|
|
12
12
|
"& [part=\"panzoom\"]": {
|
|
13
|
-
"$description": "The transformed surface. `applyTransform` writes `transform` on it imperatively, so only the origin is declared here. `--boards-inset` is the Project Styles bar's clearance: that bar floats over the stage, so the boards start below it.",
|
|
13
|
+
"$description": "The transformed surface. `applyTransform` writes `transform` on it imperatively, so only the origin is declared here. `--boards-inset` is the Project Styles bar's clearance: that bar floats over the stage, so the boards start below it. It is a MARGIN, not padding: padding sits inside the box the transform scales, so at a 25% fit a 40px clearance drew as 10px and the bar covered the first specimen. A margin is outside the transform and stays 40 screen pixels at every zoom, and `applyGeometricFit` subtracts the same length from the height it fits into.",
|
|
14
14
|
"display": "inline-flex",
|
|
15
15
|
"gap": "24px",
|
|
16
16
|
"alignItems": "flex-start",
|
|
17
17
|
"transformOrigin": "0 0",
|
|
18
18
|
"marginBlock": "auto",
|
|
19
|
-
"
|
|
19
|
+
"marginTop": "var(--boards-inset, auto)"
|
|
20
|
+
},
|
|
21
|
+
"& [part=\"chrome-host\"]": {
|
|
22
|
+
"$description": "The Project Styles bar's host generates no box. The bar inside it is absolutely positioned over the stage, but an empty host in flow is a flex item of the stage cell, whose `gap` then pushed the artboards 24px right of where the fit arithmetic put them, so the last board ran off the pane's edge.",
|
|
23
|
+
"display": "contents"
|
|
20
24
|
},
|
|
21
25
|
"& [part=\"panel\"]": {
|
|
22
26
|
"flexShrink": "0"
|
|
@@ -97,13 +101,6 @@
|
|
|
97
101
|
"left": "50%",
|
|
98
102
|
"transform": "translateX(-50%)"
|
|
99
103
|
},
|
|
100
|
-
"& [part=\"doc-header\"]": {
|
|
101
|
-
"$description": "Edit only: the card is docked above the page's scroller as a band across the pane at 1:1, so its width is the pane's rather than the breakpoint's, and the page scrolls under it rather than taking it along. It used to be a block of Edit's column, which made it exactly as wide as the column's breakpoint or dragged width and scrolled it off with the first screen of the page. `canvas-render.ts` stacks the stage cell when it draws one — and closes its gap, so the band's own bottom border is where the scroller clips; `flex-shrink: 0` keeps the band whole while the scroller below takes the squeeze. THE CAP IS TWO CAPS, because the band has two ways to eat the page: `40vh` is the tall-pane answer, and `50%` is the short-pane one — a percentage `max-height` resolves against this flex container, the stage cell, whose height is definite (row 2 of the pane's `auto minmax(0, 1fr)` grid), so the page always keeps half the pane however little of it the dock and the bars have left. `40vh` alone is a share of the WINDOW: with the bottom dock open in a 650px window it is most of a 280px stage, and the page was a sliver. No `z-index`: the one it had was for Design, where the band's sibling was a pan/zoom surface whose boards could paint over it. Edit's sibling is the scroller, which clips its own content, and Design draws no card at all. The shadow is the same one-edge idiom as `panel-outline.json`'s verb cluster — it reaches over the scroller's top padding, so the page reads as passing under a docked band rather than ending at a rule. No `display`, so `hidden` on the host still hides it.",
|
|
102
|
-
"flexShrink": "0",
|
|
103
|
-
"maxHeight": "min(40vh, 50%)",
|
|
104
|
-
"overflowY": "auto",
|
|
105
|
-
"boxShadow": "0 8px 8px -8px rgb(0 0 0 / 0.35)"
|
|
106
|
-
},
|
|
107
104
|
"& [part=\"edit-canvas\"]": {
|
|
108
105
|
"$description": "The side gutter is LOAD-BEARING, not breathing room: the resize handles hang outside the column's own box — flex siblings with a negative margin, so they take no width from it — and this container clips horizontally, so without it the handles would be unreachable at exactly the width where dragging inward matters most. It must stay at least as wide as `EDIT_CANVAS_GUTTER` in `canvas/edit-width.ts`, which is what the drag's own ceiling subtracts. This box is also the TRACK the two `jx-split`s measure: the first ancestor of a handle that generates a box, which is why the handles are drawn here beside the column rather than inside it — inside, the column would have been the track, and the track cannot be the thing being resized.",
|
|
109
106
|
"width": "100%",
|
|
@@ -185,11 +182,15 @@
|
|
|
185
182
|
},
|
|
186
183
|
"& [part=\"preview-stage\"] [part=\"panel-canvas\"]": {
|
|
187
184
|
"height": "100%"
|
|
185
|
+
},
|
|
186
|
+
"& [part=\"writing-banner\"]": {
|
|
187
|
+
"$description": "A band across the pane at 1:1, so its width is the pane's rather than the breakpoint's and the page scrolls under it. It never shrinks: it is one line.",
|
|
188
|
+
"flexShrink": "0"
|
|
188
189
|
}
|
|
189
190
|
},
|
|
190
191
|
"children": [
|
|
191
192
|
{
|
|
192
|
-
"$description": "What stands over the frame
|
|
193
|
+
"$description": "What stands over the frame: the writing-mode banner above Edit's scrolling column for a collection entry (whose fields are the Inspector's), the Compare bar over a comparison, or the Project Styles bar over the catalogue. Each is an empty host — the surface that fills it is mounted by the module that owns it.",
|
|
193
194
|
"tagName": "div",
|
|
194
195
|
"attributes": {
|
|
195
196
|
"part": "lead-slot"
|
|
@@ -201,11 +202,11 @@
|
|
|
201
202
|
"$ref": "#/state/lead"
|
|
202
203
|
},
|
|
203
204
|
"cases": {
|
|
204
|
-
"
|
|
205
|
-
"$description": "The
|
|
205
|
+
"banner": {
|
|
206
|
+
"$description": "The writing-mode banner over a collection entry written on the canvas (studio.md §22.5): an empty host the banner surface is mounted into by `content/writing-banner.ts`. An entry's fields are edited in the Inspector's Entry tab; the banner only says the layout is locked and where to edit it.",
|
|
206
207
|
"tagName": "div",
|
|
207
208
|
"attributes": {
|
|
208
|
-
"part": "
|
|
209
|
+
"part": "writing-banner"
|
|
209
210
|
}
|
|
210
211
|
},
|
|
211
212
|
"toolbar": {
|
|
@@ -288,8 +289,12 @@
|
|
|
288
289
|
"children": [
|
|
289
290
|
{
|
|
290
291
|
"$prototype": "Array",
|
|
291
|
-
"items": {
|
|
292
|
-
|
|
292
|
+
"items": {
|
|
293
|
+
"$ref": "#/state/panels"
|
|
294
|
+
},
|
|
295
|
+
"key": {
|
|
296
|
+
"$ref": "$map/item/key"
|
|
297
|
+
},
|
|
293
298
|
"map": {
|
|
294
299
|
"$description": "One artboard: its breakpoint's name, the white page under it, and the empty box the iframe mounts into. Keyed on the breakpoint, because each board owns a live iframe and the declared set changes with the document's `$media` — position-based reuse would hand one breakpoint's frame to another's width, which is a live document rendered at the wrong viewport rather than a cosmetic diff.",
|
|
295
300
|
"tagName": "div",
|
|
@@ -323,8 +328,14 @@
|
|
|
323
328
|
"body": [
|
|
324
329
|
{
|
|
325
330
|
"operator": "call",
|
|
326
|
-
"target": {
|
|
327
|
-
|
|
331
|
+
"target": {
|
|
332
|
+
"$ref": "#/state/pickPanel"
|
|
333
|
+
},
|
|
334
|
+
"value": [
|
|
335
|
+
{
|
|
336
|
+
"$ref": "$map/item/key"
|
|
337
|
+
}
|
|
338
|
+
]
|
|
328
339
|
}
|
|
329
340
|
]
|
|
330
341
|
},
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
*
|
|
24
24
|
* **Every island stays an island** (specs/studio-ui-guidelines.md §9.4). The document draws each
|
|
25
25
|
* host empty and this module announces it the moment it is CREATED, one reconcile step before it is
|
|
26
|
-
* in the page; Monaco, the artboard iframes, the
|
|
26
|
+
* in the page; Monaco, the artboard iframes, the writing-mode banner, the Compare bar and the
|
|
27
27
|
* Project Styles bar are all attached by the modules that own them.
|
|
28
28
|
*
|
|
29
29
|
* @docs studio/interface/canvas
|
|
@@ -66,11 +66,11 @@ export interface CanvasStageView {
|
|
|
66
66
|
/** Whether Edit's column hugs its content — a component definition rather than a page. */
|
|
67
67
|
hug: boolean;
|
|
68
68
|
/**
|
|
69
|
-
* What stands over the frame
|
|
70
|
-
*
|
|
71
|
-
*
|
|
69
|
+
* What stands over the frame: the writing-mode banner above Edit's scrolling column for a
|
|
70
|
+
* collection entry (`banner`), the Compare bar over a comparison, or the Project Styles bar over
|
|
71
|
+
* the catalogue. Edit draws nothing over an ordinary page (studio.md §4.2).
|
|
72
72
|
*/
|
|
73
|
-
lead: "none" | "
|
|
73
|
+
lead: "none" | "banner" | "toolbar" | "chrome";
|
|
74
74
|
/** Whether the column has its two width handles. */
|
|
75
75
|
handles: "hidden" | "shown";
|
|
76
76
|
panels: CanvasStagePanelItem[];
|