@jxsuite/studio 6.1.1 → 8.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -5
- package/dist/chunks/2020-5wtzce5g.js +4 -0
- package/dist/chunks/{action-group-2mqby73c.js → action-group-4aan7g6g.js} +3 -3
- package/dist/chunks/adapter-5tphg7xe.js +4 -0
- package/dist/chunks/add-new-flow-psym14sn.js +4 -0
- package/dist/chunks/cf-account-picker-haqazq5r.js +4 -0
- package/dist/chunks/cf-settings-h2wrh6hq.js +4 -0
- package/dist/chunks/color-area-6rbra5dy.js +4 -0
- package/dist/chunks/color-field-gy56c94g.js +4 -0
- package/dist/chunks/color-m7r1vk54.js +4 -0
- package/dist/chunks/color-slider-sqqdyf6c.js +4 -0
- package/dist/chunks/combobox-72h32ejk.js +4 -0
- package/dist/chunks/components-r22xca09.js +4 -0
- package/dist/chunks/content-source-mmppmcyg.js +4 -0
- package/dist/chunks/convert-to-repeater-he70fc2b.js +4 -0
- package/dist/chunks/dialog-c4x05vyx.js +4 -0
- package/dist/chunks/editor-ccd9jwsa.js +4 -0
- package/dist/chunks/entry-commands-6qxz9e8p.js +4 -0
- package/dist/chunks/extension-sections-0egb88dm.js +4 -0
- package/dist/chunks/file-ops-qnab36ek.js +4 -0
- package/dist/chunks/files-rcn56qvm.js +4 -0
- package/dist/chunks/format-host-yxz0kjjs.js +4 -0
- package/dist/chunks/fs-events-d1qxq4z4.js +4 -0
- package/dist/chunks/grid-open-4z1g062t.js +4 -0
- package/dist/chunks/grid-view-qg1b5eqx.js +51 -0
- package/dist/chunks/icons-63bjtbs7.js +4 -0
- package/dist/chunks/iframe-entry-2zggzajv.js +5 -0
- package/dist/chunks/iframe-entry-76j8vwwx.js +5 -0
- package/dist/chunks/iframe-entry-99nr5zfb.js +5 -0
- package/dist/chunks/iframe-entry-pkgmcgp0.js +5 -0
- package/dist/chunks/iframe-host-ssv7kyj0.js +4 -0
- package/dist/chunks/{index-2veqmnhr.js → index-32eqzv1k.js} +3 -3
- package/dist/chunks/index-f0jn7nnp.js +4 -0
- package/dist/chunks/{javascript-8nbvs12s.js → javascript-pjp734q4.js} +3 -3
- package/dist/chunks/jsonMode-njkvsa02.js +13 -0
- package/dist/chunks/jx-validate-ttasrbh7.js +4 -0
- package/dist/chunks/layers-bgyr11tr.js +4 -0
- package/dist/chunks/layers-panel-7ez66zeq.js +4 -0
- package/dist/chunks/listbox-c421cf8c.js +4 -0
- package/dist/chunks/lit-html-v9gh687x.js +4 -0
- package/dist/chunks/media-library-sq468wts.js +4 -0
- package/dist/chunks/media-picker-shfe59pt.js +4 -0
- package/dist/chunks/menu-bdpzbfvs.js +4 -0
- package/dist/chunks/monaco-binding-vq1hgnn0.js +4 -0
- package/dist/chunks/monaco-buffer-3afgwvbp.js +4 -0
- package/dist/chunks/monaco-setup-xrd2cbkp.js +4 -0
- package/dist/chunks/notify-kzrjr3fv.js +4 -0
- package/dist/chunks/number-field-y62xq0ty.js +4 -0
- package/dist/chunks/parse-v77xtwv7.js +4 -0
- package/dist/chunks/platform-7v4rtd7m.js +4 -0
- package/dist/chunks/popover-b89sfej7.js +4 -0
- package/dist/chunks/publish-panel-2z9gw8ee.js +4 -0
- package/dist/chunks/publish-quick-qx2455cj.js +4 -0
- package/dist/chunks/publish-workspace-wrc1dgwx.js +4 -0
- package/dist/chunks/quick-search-n0t0eqxb.js +4 -0
- package/dist/chunks/references-9547rg5s.js +4 -0
- package/dist/chunks/right-panel-wsgnr9pn.js +4 -0
- package/dist/chunks/select-rzds841e.js +4 -0
- package/dist/chunks/source-control-kwktr9y6.js +4 -0
- package/dist/chunks/split-c9zfdgxf.js +4 -0
- package/dist/chunks/studio-03ct6yfv.js +9 -0
- package/dist/chunks/studio-07rcfje3.js +5 -0
- package/dist/chunks/studio-3e54qh39.js +7 -0
- package/dist/chunks/studio-3exxhz5g.js +5 -0
- package/dist/chunks/studio-3q40e3rj.js +5 -0
- package/dist/chunks/studio-3qeh9t0h.js +6 -0
- package/dist/chunks/studio-3qqjeep5.js +6 -0
- package/dist/chunks/studio-43sd2mam.js +4 -0
- package/dist/chunks/studio-4hp8pkyt.js +5 -0
- package/dist/chunks/studio-58xg6j2q.js +9 -0
- package/dist/chunks/studio-5g0rprdt.js +7 -0
- package/dist/chunks/studio-6m380wp7.js +5 -0
- package/dist/chunks/studio-80jyh1xh.js +4 -0
- package/dist/chunks/studio-83mk4bgg.js +9 -0
- package/dist/chunks/{studio-kggey1jt.js → studio-881z1xrx.js} +4 -4
- package/dist/chunks/studio-8m0y2qe7.js +5 -0
- package/dist/chunks/studio-8tr6cfrc.js +5 -0
- package/dist/chunks/studio-8vcvfs7r.js +6 -0
- package/dist/chunks/studio-9tmebf0s.js +5 -0
- package/dist/chunks/studio-a2bvaptz.js +5 -0
- package/dist/chunks/studio-b7y5mr30.js +5 -0
- package/dist/chunks/studio-bavb31r0.js +5 -0
- package/dist/chunks/studio-bbe4c90a.js +5 -0
- package/dist/chunks/studio-c05wdnt3.js +5 -0
- package/dist/chunks/studio-ccv2svc6.js +5 -0
- package/dist/chunks/studio-d5grtb9e.js +16 -0
- package/dist/chunks/studio-df0baea9.js +5 -0
- package/dist/chunks/studio-dgk4dqtx.js +7 -0
- package/dist/chunks/studio-e1g64q43.js +5 -0
- package/dist/chunks/studio-ed1hp6zf.js +6 -0
- package/dist/chunks/studio-ed3xx40h.js +7 -0
- package/dist/chunks/studio-f14e1zdj.js +5 -0
- package/dist/chunks/studio-fbhxxc5f.js +5 -0
- package/dist/chunks/studio-fyh0jc96.js +5 -0
- package/dist/chunks/studio-gcxk20n7.js +5 -0
- package/dist/chunks/studio-jaaz8ce9.js +5 -0
- package/dist/chunks/{studio-8grwxtqk.js → studio-jcnsdaep.js} +4 -4
- package/dist/chunks/studio-jsgf2q5k.js +7 -0
- package/dist/chunks/{studio-1q1sh2ax.js → studio-k3xxbagr.js} +3 -3
- package/dist/chunks/studio-k7evxqh4.js +5 -0
- package/dist/chunks/studio-kt3pjkwd.js +5 -0
- package/dist/chunks/studio-m8g16bgz.js +5 -0
- package/dist/chunks/studio-mn0476ag.js +5 -0
- package/dist/chunks/studio-mx1smyq0.js +5 -0
- package/dist/chunks/studio-n0c5h6mf.js +5 -0
- package/dist/chunks/{studio-rv11kfwa.js → studio-nh6d342n.js} +7 -7
- package/dist/chunks/studio-nqxqf8p2.js +4 -0
- package/dist/chunks/studio-p4nrkvqr.js +5 -0
- package/dist/chunks/{studio-h46vtzk8.js → studio-pbxa5fpc.js} +4 -4
- package/dist/chunks/studio-pgmvdv7z.js +7 -0
- package/dist/chunks/studio-ph84avkf.js +5 -0
- package/dist/chunks/{studio-wszjyh0j.js → studio-q0mvbaq6.js} +4 -4
- package/dist/chunks/studio-q0tccd43.js +5 -0
- package/dist/chunks/studio-q7rtx6zq.js +14 -0
- package/dist/chunks/{studio-pre0skq6.js → studio-qgh13jtz.js} +4 -4
- package/dist/chunks/studio-qmn1xc24.js +5 -0
- package/dist/chunks/studio-qwdqwkj0.js +5 -0
- package/dist/chunks/{studio-t6b6qe31.js → studio-r5qy30vx.js} +4 -4
- package/dist/chunks/studio-rj9eamf8.js +5 -0
- package/dist/chunks/studio-rptgsk96.js +5 -0
- package/dist/chunks/studio-rthyg42z.js +928 -0
- package/dist/chunks/studio-s19tp1xr.js +5 -0
- package/dist/chunks/studio-s32578pn.js +5 -0
- package/dist/chunks/studio-svb7yyve.js +5 -0
- package/dist/chunks/studio-syreb644.js +5 -0
- package/dist/chunks/studio-tf9jryb1.js +10 -0
- package/dist/chunks/studio-tfkznv39.js +5 -0
- package/dist/chunks/studio-tft6r105.js +5 -0
- package/dist/chunks/studio-txf2kysx.js +5 -0
- package/dist/chunks/studio-v8867ddv.js +12 -0
- package/dist/chunks/studio-vxq7fcvv.js +5 -0
- package/dist/chunks/studio-w4rz9hdk.js +5 -0
- package/dist/chunks/studio-wbcjbhy1.js +9 -0
- package/dist/chunks/studio-wc649wss.js +5 -0
- package/dist/chunks/studio-wys23mxz.js +5 -0
- package/dist/chunks/studio-x1x167jh.js +5 -0
- package/dist/chunks/studio-x9hsze61.js +5 -0
- package/dist/chunks/studio-y0n7yxea.js +9 -0
- package/dist/chunks/studio-y3ahhdpx.js +5 -0
- package/dist/chunks/studio-z97c48fk.js +5 -0
- package/dist/chunks/studio-zat62m0c.js +5 -0
- package/dist/chunks/studio-zcd2e7yz.js +5 -0
- package/dist/chunks/studio-zz9qe3rw.js +64 -0
- package/dist/chunks/swatch-group-ewh24n1f.js +4 -0
- package/dist/chunks/tabs-f5cw3tgp.js +4 -0
- package/dist/chunks/textfield-wewc8rq2.js +4 -0
- package/dist/chunks/toast-1gv0h53h.js +4 -0
- package/dist/chunks/toast-host-1yg5ar8d.js +4 -0
- package/dist/chunks/{toolbar-2nnzqhrj.js → toolbar-44cm5cta.js} +3 -3
- package/dist/chunks/tooltip-yypz28gq.js +4 -0
- package/dist/chunks/tree-9xa4hm7n.js +4 -0
- package/dist/chunks/tsMode-epyfz1hv.js +14 -0
- package/dist/chunks/workspace-dz7nxfhv.js +4 -0
- package/dist/chunks/workspace-home-xsd7hkjw.js +4 -0
- package/dist/chunks/ws-client-bv552sfx.js +4 -0
- package/dist/iframe-entry.js +20 -16
- package/dist/manifest.json +77 -63
- package/dist/studio.js +106 -107
- package/dist/workers/ts.worker.js +3 -3
- package/package.json +17 -16
- package/src/about/about-modal.ts +4 -3
- package/src/account/action-flow.ts +45 -38
- package/src/account-status.ts +7 -2
- package/src/browse/component-examples.ts +272 -0
- package/src/browse/library-commands.ts +64 -104
- package/src/browse/library-layouts.ts +270 -53
- package/src/browse/library-model.ts +194 -134
- package/src/browse/library-pane.ts +748 -440
- package/src/browse/library-preview.ts +161 -26
- package/src/browse/library-source.ts +308 -41
- package/src/browse/preview-root.ts +78 -0
- package/src/browse/preview-style.ts +155 -0
- package/src/canvas/asset-refs.ts +40 -10
- package/src/canvas/asset-resolve.ts +19 -23
- package/src/canvas/canvas-helpers.ts +7 -6
- package/src/canvas/canvas-live-render.ts +260 -77
- package/src/canvas/canvas-origin.ts +37 -12
- package/src/canvas/canvas-page-context.ts +112 -0
- package/src/canvas/canvas-patcher.ts +30 -30
- package/src/canvas/canvas-perf.ts +11 -5
- package/src/canvas/canvas-render.ts +175 -148
- package/src/canvas/canvas-surface.ts +5 -3
- package/src/canvas/canvas-utils.ts +147 -61
- package/src/canvas/dialog-path.ts +9 -4
- package/src/canvas/dialog-state.ts +1 -2
- package/src/canvas/diff-marks.ts +9 -16
- package/src/canvas/diff-toolbar.ts +8 -7
- package/src/canvas/edit-width-drag.ts +4 -1
- package/src/canvas/edit-width.ts +1 -3
- package/src/canvas/iframe-channel.ts +27 -13
- package/src/canvas/iframe-drop.ts +120 -12
- package/src/canvas/iframe-editable-root.ts +29 -16
- package/src/canvas/iframe-entry.ts +104 -75
- package/src/canvas/iframe-eval.ts +73 -49
- package/src/canvas/iframe-host.ts +269 -158
- package/src/canvas/iframe-inline-edit.ts +49 -30
- package/src/canvas/iframe-insert.ts +5 -4
- package/src/canvas/iframe-interaction.ts +30 -25
- package/src/canvas/iframe-keys.ts +11 -0
- package/src/canvas/iframe-overlay.ts +1 -1
- package/src/canvas/iframe-patch.ts +25 -21
- package/src/canvas/iframe-position.ts +12 -6
- package/src/canvas/iframe-protocol.ts +36 -21
- package/src/canvas/iframe-render.ts +84 -35
- package/src/canvas/iframe-slash.ts +24 -11
- package/src/canvas/iframe-subtree.ts +10 -3
- package/src/canvas/npm-modules.ts +22 -0
- package/src/canvas/path-mapping.ts +19 -12
- package/src/canvas/popover-path.ts +7 -3
- package/src/canvas/popover-state.ts +1 -2
- package/src/canvas/preview-navigate.ts +16 -0
- package/src/canvas/repeater-sources.ts +200 -0
- package/src/canvas/serialize-scope.ts +13 -5
- package/src/canvas/stage-scrollbar.ts +7 -2
- package/src/canvas/surface-registry.ts +27 -3
- package/src/collab/collab-commands.ts +7 -2
- package/src/collab/collab-session.ts +84 -45
- package/src/collab/collab-state.ts +4 -3
- package/src/collab/monaco-binding.ts +16 -13
- package/src/collab/monaco-cursors.ts +5 -2
- package/src/commands/app-commands.ts +16 -6
- package/src/commands/budget.ts +13 -11
- package/src/commands/command-args.ts +103 -71
- package/src/commands/context.ts +55 -28
- package/src/commands/defaults.ts +69 -45
- package/src/commands/keymap.ts +56 -43
- package/src/commands/levels.ts +14 -8
- package/src/commands/live-context.ts +9 -7
- package/src/commands/reference.ts +2 -1
- package/src/commands/registry.ts +22 -11
- package/src/commands/run-reported.ts +15 -10
- package/src/component-props.ts +46 -30
- package/src/content/collection-match.ts +11 -9
- package/src/content/collection-pages.ts +412 -0
- package/src/content/content-collections.ts +270 -0
- package/src/content/draft-state.ts +4 -3
- package/src/content/entry-commands.ts +54 -62
- package/src/content/entry-editor.ts +137 -32
- package/src/content/entry-fields.ts +25 -8
- package/src/content/entry-inspector.ts +225 -0
- package/src/content/entry-model.ts +38 -15
- package/src/content/entry-open.ts +80 -0
- package/src/content/entry-summaries.ts +440 -0
- package/src/content/file-record-ids.ts +80 -0
- package/src/content/file-records.ts +125 -0
- package/src/content/page-summaries.ts +129 -0
- package/src/content/record-entry.ts +201 -0
- package/src/content/writing-banner.ts +177 -0
- package/src/create/add-new-commands.ts +185 -0
- package/src/create/add-new-flow.ts +1116 -0
- package/src/create/add-new.ts +1014 -0
- package/src/create/element-name.ts +121 -0
- package/src/editor/canvas-context-menu.ts +1 -2
- package/src/editor/canvas-slash-bridge.ts +3 -6
- package/src/editor/content-slice.ts +16 -14
- package/src/editor/context-menu.ts +35 -22
- package/src/editor/convert-targets.ts +30 -35
- package/src/editor/convert-to-component.ts +78 -48
- package/src/editor/convert-to-repeater.ts +34 -22
- package/src/editor/editable-tags.ts +17 -2
- package/src/editor/file-drop-action.ts +29 -22
- package/src/editor/inline-edit-apply.ts +79 -17
- package/src/editor/inline-edit.ts +76 -50
- package/src/editor/inline-format.ts +59 -56
- package/src/editor/inline-link.ts +40 -15
- package/src/editor/insert-component.ts +91 -0
- package/src/editor/insert-zone-action.ts +14 -5
- package/src/editor/merge-tags.ts +58 -19
- package/src/editor/repeater-scope.ts +39 -28
- package/src/editor/shortcuts.ts +76 -42
- package/src/editor/slash-menu.ts +52 -14
- package/src/files/asset-versions.ts +4 -4
- package/src/files/components.ts +89 -20
- package/src/files/elements.ts +5 -6
- package/src/files/file-ops.ts +92 -41
- package/src/files/files.ts +248 -239
- package/src/files/fs-events.ts +18 -7
- package/src/files/media-meta.ts +97 -2
- package/src/files/media-paths.ts +3 -0
- package/src/files/media-types.ts +55 -0
- package/src/files/media-upload.ts +209 -52
- package/src/files/new-file-name.ts +156 -0
- package/src/files/serialize-document.ts +15 -5
- package/src/format/constraints.ts +1 -1
- package/src/format/convert-file.ts +27 -13
- package/src/format/format-choices.ts +2 -1
- package/src/format/format-host.ts +91 -50
- package/src/github/github-auth-status.ts +27 -3
- package/src/github/github-auth.ts +21 -11
- package/src/github/github-publish.ts +28 -23
- package/src/grid/cell-editors.ts +46 -31
- package/src/grid/cell-popovers.ts +5 -3
- package/src/grid/edit-buffer.ts +10 -9
- package/src/grid/grid-controller.ts +25 -23
- package/src/grid/grid-layout.ts +21 -5
- package/src/grid/grid-open.ts +3 -33
- package/src/grid/grid-panel.ts +65 -6
- package/src/grid/grid-reveal.ts +34 -0
- package/src/grid/grid-source.ts +9 -31
- package/src/grid/grid-view.ts +45 -23
- package/src/grid/redirects-grid.ts +14 -5
- package/src/grid/redirects.ts +16 -14
- package/src/grid/schema-columns.ts +25 -19
- package/src/grid/sources/connector-source.ts +47 -20
- package/src/grid/sources/content-source.ts +100 -31
- package/src/grid/sources/csv-file-source.ts +2 -2
- package/src/grid/tabulator-tables.d.ts +61 -34
- package/src/hosting/document.ts +2 -2
- package/src/hosting/stage.ts +7 -7
- package/src/i18n/i18n-commands.ts +3 -3
- package/src/media/media-commands.ts +181 -0
- package/src/media/media-library-model.ts +232 -0
- package/src/media/media-library.ts +1283 -0
- package/src/media/media-pane.ts +51 -20
- package/src/new-project/add-repo-modal.ts +20 -19
- package/src/new-project/import-tab.ts +10 -14
- package/src/new-project/location-fields.ts +2 -1
- package/src/new-project/new-project-modal.ts +12 -9
- package/src/packages/jxsuite-update.ts +4 -3
- package/src/packages/pull-package-sync.ts +26 -25
- package/src/page-params.ts +97 -68
- package/src/panels/activity-panel.ts +38 -14
- package/src/panels/ai-chat/attached-context.ts +13 -7
- package/src/panels/ai-chat/chat-markdown.ts +8 -8
- package/src/panels/ai-chat/chat-view.ts +80 -73
- package/src/panels/ai-chat/composer.ts +30 -33
- package/src/panels/ai-chat/sessions-view.ts +1 -2
- package/src/panels/ai-panel.ts +23 -20
- package/src/panels/block-action-bar.ts +57 -46
- package/src/panels/bottom-dock.ts +5 -3
- package/src/panels/canvas-dnd-bridge.ts +36 -26
- package/src/panels/chat-panel.ts +6 -6
- package/src/panels/collections-panel.ts +306 -0
- package/src/panels/component-preview.ts +35 -13
- package/src/panels/data-explorer.ts +63 -26
- package/src/panels/data-grid.ts +18 -11
- package/src/panels/dnd.ts +115 -138
- package/src/panels/editors.ts +52 -21
- package/src/panels/elements-panel.ts +19 -5
- package/src/panels/empty-state.ts +2 -2
- package/src/panels/events-panel.ts +84 -69
- package/src/panels/formula-workspace.ts +78 -54
- package/src/panels/frontmatter-fields.ts +33 -28
- package/src/panels/git-diff-open.ts +10 -6
- package/src/panels/head-panel.ts +488 -202
- package/src/panels/i18n-panel.ts +20 -12
- package/src/panels/imports-panel.ts +25 -47
- package/src/panels/jump-bar.ts +75 -31
- package/src/panels/layers-panel.ts +130 -101
- package/src/panels/left-panel.ts +25 -11
- package/src/panels/navigator-panels.ts +23 -11
- package/src/panels/pane-context.ts +140 -49
- package/src/panels/pane-grid.ts +55 -26
- package/src/panels/panel-registry.ts +36 -46
- package/src/panels/properties-panel.ts +182 -124
- package/src/panels/quick-search.ts +53 -31
- package/src/panels/right-panel.ts +201 -45
- package/src/panels/seo-modal.ts +54 -125
- package/src/panels/settings-menu.ts +63 -61
- package/src/panels/settings-pane.ts +268 -162
- package/src/panels/signals-panel.ts +156 -135
- package/src/panels/site-model.ts +367 -0
- package/src/panels/site-panel.ts +638 -0
- package/src/panels/statement-editor.ts +230 -140
- package/src/panels/style-panel.ts +253 -206
- package/src/panels/style-utils.ts +114 -51
- package/src/panels/stylebook-doc.ts +195 -60
- package/src/panels/stylebook-layers-panel.ts +48 -89
- package/src/panels/stylebook-panel.ts +60 -27
- package/src/panels/styles-panel.ts +327 -0
- package/src/panels/tab-drop.ts +27 -11
- package/src/panels/tab-strip.ts +143 -49
- package/src/platform-errors.ts +57 -43
- package/src/platform.ts +59 -31
- package/src/platforms/cloud.ts +373 -176
- package/src/platforms/default-platform.ts +14 -8
- package/src/platforms/devserver.ts +180 -142
- package/src/platforms/read-batcher.ts +16 -8
- package/src/project-list.ts +2 -1
- package/src/publish/deploy-checklist.ts +20 -9
- package/src/publish/pages-service.ts +66 -27
- package/src/publish/publish-changes.ts +491 -0
- package/src/publish/publish-commands.ts +88 -22
- package/src/publish/publish-ids.ts +49 -0
- package/src/publish/publish-panel.ts +10 -6
- package/src/publish/publish-quick.ts +148 -0
- package/src/publish/publish-workspace.ts +926 -0
- package/src/publish/source-control.ts +907 -0
- package/src/recent-projects.ts +15 -8
- package/src/resize-edges.ts +26 -36
- package/src/services/a11y-report.ts +26 -19
- package/src/services/agent-seed.ts +23 -11
- package/src/services/ai-ask.ts +9 -12
- package/src/services/ai-command-tools.ts +68 -62
- package/src/services/ai-import-tools.ts +80 -67
- package/src/services/ai-models.ts +17 -13
- package/src/services/ai-project-tools.ts +68 -32
- package/src/services/ai-session-store.ts +19 -10
- package/src/services/ai-system-prompt.ts +46 -20
- package/src/services/ai-tools.ts +71 -27
- package/src/services/ai-write-report.ts +20 -12
- package/src/services/ai-writes.ts +4 -4
- package/src/services/automation.ts +74 -51
- package/src/services/cem-export.ts +149 -58
- package/src/services/cf-settings.ts +4 -4
- package/src/services/clock.ts +6 -1
- package/src/services/code-services.ts +37 -31
- package/src/services/connection.ts +2 -2
- package/src/services/context-manager.ts +14 -10
- package/src/services/context-resolver.ts +20 -8
- package/src/services/data-service.ts +19 -15
- package/src/services/directory-picker.ts +20 -14
- package/src/services/document-assistant.ts +39 -19
- package/src/services/gated-registry.ts +10 -6
- package/src/services/harness/chat-reducer.ts +23 -1
- package/src/services/import-client.ts +91 -38
- package/src/services/import-seed.ts +8 -2
- package/src/services/jx-validate.ts +28 -31
- package/src/services/live-preview.ts +0 -0
- package/src/services/live-surfaces.ts +6 -3
- package/src/services/model-uri.ts +10 -2
- package/src/services/module-preloads.ts +12 -8
- package/src/services/monaco-buffer.ts +43 -24
- package/src/services/monaco-lazy.ts +7 -8
- package/src/services/monaco-setup.ts +23 -16
- package/src/services/notify.ts +44 -17
- package/src/services/popover-report.ts +25 -10
- package/src/services/preview-eval.ts +20 -8
- package/src/services/profile.ts +13 -6
- package/src/services/project-path.ts +13 -10
- package/src/services/references.ts +0 -0
- package/src/services/render-critic.ts +29 -9
- package/src/services/settings/definitions.ts +25 -14
- package/src/services/settings/kernel.ts +13 -4
- package/src/services/settings/write-queue.ts +9 -9
- package/src/services/token-lint.ts +12 -10
- package/src/services/tool-executor.ts +17 -5
- package/src/services/tool-outcomes.ts +44 -24
- package/src/services/trusted-types.ts +24 -7
- package/src/settings/contexts-section.ts +11 -8
- package/src/settings/contributed-section.ts +128 -70
- package/src/settings/css-vars-editor.ts +119 -32
- package/src/settings/defs-editor.ts +38 -35
- package/src/settings/developer-panels.ts +43 -0
- package/src/settings/extension-rows.ts +16 -8
- package/src/settings/extension-sections.ts +42 -14
- package/src/settings/extensions-section.ts +4 -1
- package/src/settings/general-settings.ts +101 -28
- package/src/settings/locales-section.ts +20 -12
- package/src/settings/preferences-dialog.ts +17 -7
- package/src/settings/preferences-keymap.ts +7 -5
- package/src/settings/preferences-sections.ts +11 -5
- package/src/settings/project-sections.ts +28 -11
- package/src/settings/schema-field-ui.ts +12 -1
- package/src/settings/section-registry.ts +116 -11
- package/src/settings/settings-dialog.ts +192 -0
- package/src/settings/settings-document.ts +186 -166
- package/src/shell/tree.ts +6 -5
- package/src/shell.ts +536 -477
- package/src/site-context.ts +101 -32
- package/src/state.ts +68 -57
- package/src/store.ts +54 -34
- package/src/studio.ts +219 -116
- package/src/style/live-preview.ts +1 -1
- package/src/style/project-styles.ts +40 -7
- package/src/style/stylebook-specimens.ts +89 -0
- package/src/style/stylebook-target.ts +26 -0
- package/src/style/tag-inheritance.ts +105 -0
- package/src/style/token-ref.ts +5 -4
- package/src/style/variables-focus.ts +61 -0
- package/src/style/variables-view.ts +235 -0
- package/src/surfaces/about.ts +18 -19
- package/src/surfaces/add-new.json +1482 -0
- package/src/surfaces/add-new.ts +325 -0
- package/src/surfaces/add-repo.ts +17 -19
- package/src/surfaces/ai-chat.ts +33 -38
- package/src/surfaces/ai-credentials-form.ts +6 -16
- package/src/surfaces/ai-managed-connect.ts +3 -4
- package/src/surfaces/ai-model-picker.ts +3 -5
- package/src/surfaces/block-action-bar.ts +22 -11
- package/src/surfaces/boot-failure.json +4 -3
- package/src/surfaces/boot-failure.ts +4 -5
- package/src/surfaces/bottom-dock.json +1 -1
- package/src/surfaces/bottom-dock.ts +9 -18
- package/src/surfaces/canvas-stage.json +30 -19
- package/src/surfaces/canvas-stage.ts +17 -16
- package/src/surfaces/cf-account-picker.ts +17 -18
- package/src/surfaces/collections-panel.json +615 -0
- package/src/surfaces/collections-panel.ts +168 -0
- package/src/surfaces/commandbar.json +241 -96
- package/src/surfaces/commandbar.ts +145 -105
- package/src/surfaces/convert-repeater.ts +17 -19
- package/src/surfaces/data-actions.ts +9 -7
- package/src/surfaces/dialog.ts +26 -28
- package/src/surfaces/diff-toolbar.ts +9 -7
- package/src/surfaces/empty-state.json +1 -1
- package/src/surfaces/empty-state.ts +7 -10
- package/src/surfaces/entry-editor.json +136 -0
- package/src/surfaces/entry-editor.ts +35 -11
- package/src/surfaces/entry-inspector.json +371 -0
- package/src/surfaces/entry-inspector.ts +143 -0
- package/src/surfaces/expression-editor.ts +11 -25
- package/src/surfaces/files-panel.ts +27 -14
- package/src/surfaces/formula-palette.ts +4 -5
- package/src/surfaces/github-auth.ts +16 -20
- package/src/surfaces/github-publish.ts +17 -22
- package/src/surfaces/grid-cell.ts +30 -31
- package/src/surfaces/grid-open.ts +10 -14
- package/src/surfaces/grid-panel.ts +13 -9
- package/src/surfaces/grid-replace.ts +13 -13
- package/src/surfaces/grid-views.ts +15 -18
- package/src/surfaces/inspector-dock.json +162 -14
- package/src/surfaces/inspector-dock.ts +59 -31
- package/src/surfaces/jump-bar.ts +5 -6
- package/src/surfaces/jxsuite-update.ts +16 -22
- package/src/surfaces/library-pane.json +670 -437
- package/src/surfaces/library-pane.ts +111 -77
- package/src/surfaces/logic-panel.ts +17 -30
- package/src/surfaces/logic-workspace.ts +13 -15
- package/src/surfaces/media-browser.json +62 -6
- package/src/surfaces/media-browser.ts +26 -11
- package/src/surfaces/media-field.json +1 -1
- package/src/surfaces/media-field.ts +4 -5
- package/src/surfaces/media-library.json +1586 -0
- package/src/surfaces/media-library.ts +282 -0
- package/src/surfaces/media-pane.ts +8 -7
- package/src/surfaces/media-pick-dialog.json +71 -0
- package/src/surfaces/media-pick-dialog.ts +132 -0
- package/src/surfaces/menu.ts +47 -23
- package/src/surfaces/navigator-dock.ts +11 -12
- package/src/surfaces/new-project.ts +27 -26
- package/src/surfaces/pane-context.json +144 -77
- package/src/surfaces/pane-context.ts +44 -25
- package/src/surfaces/pane-grid.ts +15 -10
- package/src/surfaces/panel-activity.ts +5 -6
- package/src/surfaces/panel-data.ts +3 -4
- package/src/surfaces/panel-deploy-checklist.json +12 -6
- package/src/surfaces/panel-deploy-checklist.ts +8 -7
- package/src/surfaces/panel-elements.ts +5 -7
- package/src/surfaces/panel-i18n.ts +5 -7
- package/src/surfaces/panel-imports.ts +6 -13
- package/src/surfaces/panel-outline.ts +25 -19
- package/src/surfaces/panel-page.json +72 -2
- package/src/surfaces/panel-page.ts +49 -25
- package/src/surfaces/panel-problems.ts +5 -7
- package/src/surfaces/panel-signals.json +1 -1
- package/src/surfaces/panel-signals.ts +25 -39
- package/src/surfaces/panel-stylebook-layers.json +71 -204
- package/src/surfaces/panel-stylebook-layers.ts +5 -29
- package/src/surfaces/preferences.json +120 -48
- package/src/surfaces/preferences.ts +29 -11
- package/src/surfaces/progress-modal.ts +15 -9
- package/src/surfaces/properties-panel.json +1 -1
- package/src/surfaces/properties-panel.ts +20 -42
- package/src/surfaces/publish-quick.json +428 -0
- package/src/surfaces/publish-quick.ts +165 -0
- package/src/surfaces/publish-workspace.json +2892 -0
- package/src/surfaces/publish-workspace.ts +391 -0
- package/src/surfaces/publish.ts +18 -18
- package/src/surfaces/push-plan.ts +7 -8
- package/src/surfaces/rail.json +1 -159
- package/src/surfaces/rail.ts +22 -79
- package/src/surfaces/reference-field.ts +11 -15
- package/src/surfaces/schema-builder.ts +16 -22
- package/src/surfaces/schema-form.json +10 -2
- package/src/surfaces/schema-form.ts +17 -25
- package/src/surfaces/secret-field.ts +9 -6
- package/src/surfaces/seo.json +1 -1
- package/src/surfaces/seo.ts +21 -15
- package/src/surfaces/settings-contexts.ts +9 -7
- package/src/surfaces/settings-contributed.json +5 -5
- package/src/surfaces/settings-contributed.ts +32 -12
- package/src/surfaces/settings-css-vars.json +44 -36
- package/src/surfaces/settings-css-vars.ts +82 -16
- package/src/surfaces/settings-defs.json +2 -2
- package/src/surfaces/settings-defs.ts +17 -21
- package/src/surfaces/settings-deploy.json +2 -15
- package/src/surfaces/settings-deploy.ts +9 -16
- package/src/surfaces/settings-dialog.json +51 -0
- package/src/surfaces/settings-dialog.ts +169 -0
- package/src/surfaces/settings-extensions.ts +5 -6
- package/src/surfaces/settings-head.ts +33 -39
- package/src/surfaces/settings-locales.ts +8 -20
- package/src/surfaces/settings-overview.json +3 -3
- package/src/surfaces/settings-overview.ts +14 -8
- package/src/surfaces/settings-packages.ts +8 -7
- package/src/surfaces/settings-pane.json +269 -46
- package/src/surfaces/settings-pane.ts +88 -36
- package/src/surfaces/settings-rawjson.ts +5 -6
- package/src/surfaces/shell.json +2 -1
- package/src/surfaces/shell.ts +1 -2
- package/src/surfaces/site-panel.json +1029 -0
- package/src/surfaces/site-panel.ts +233 -0
- package/src/surfaces/slash-menu.json +63 -21
- package/src/surfaces/slash-menu.ts +42 -9
- package/src/surfaces/statements.ts +13 -18
- package/src/surfaces/statusbar.ts +56 -29
- package/src/surfaces/style-panel.ts +18 -31
- package/src/surfaces/stylebook-chrome.ts +3 -5
- package/src/surfaces/styles-panel.json +735 -0
- package/src/surfaces/styles-panel.ts +195 -0
- package/src/surfaces/styles-variables.json +149 -0
- package/src/surfaces/styles-variables.ts +145 -0
- package/src/surfaces/tab-strip.json +4 -4
- package/src/surfaces/tab-strip.ts +14 -13
- package/src/surfaces/target-line.ts +6 -7
- package/src/surfaces/welcome.ts +6 -8
- package/src/surfaces/writing-banner.json +94 -0
- package/src/surfaces/writing-banner.ts +80 -0
- package/src/tabs/bare-repeaters.ts +101 -0
- package/src/tabs/patch-ops.ts +4 -3
- package/src/tabs/project-config.ts +32 -21
- package/src/tabs/selection.ts +36 -8
- package/src/tabs/tab.ts +99 -48
- package/src/tabs/transact.ts +98 -53
- package/src/types.ts +53 -43
- package/src/ui/ai-credentials-form.ts +10 -13
- package/src/ui/ai-model-picker.ts +3 -3
- package/src/ui/cf-account-picker.ts +7 -9
- package/src/ui/color-selector.ts +9 -5
- package/src/ui/dynamic-slot.ts +7 -8
- package/src/ui/expression-editor.ts +112 -105
- package/src/ui/form-controls.ts +104 -56
- package/src/ui/formula-catalog.ts +239 -230
- package/src/ui/formula-chips.ts +33 -18
- package/src/ui/layers.ts +57 -31
- package/src/ui/media-picker.ts +300 -47
- package/src/ui/popover-surface.ts +20 -12
- package/src/ui/progress-modal.ts +13 -8
- package/src/ui/regions.ts +14 -12
- package/src/ui/schema-form.ts +372 -97
- package/src/ui/surface.ts +71 -8
- package/src/ui/timing.ts +9 -0
- package/src/ui/value-source.ts +44 -31
- package/src/ui/virtual-window.ts +29 -3
- package/src/utils/base64.ts +6 -4
- package/src/utils/edit-display.ts +366 -111
- package/src/utils/element-selectors.ts +3 -2
- package/src/utils/google-fonts.ts +15 -14
- package/src/utils/inherited-style.ts +18 -20
- package/src/utils/link-target.ts +1 -1
- package/src/utils/local-day.ts +18 -0
- package/src/utils/preview-format.ts +25 -3
- package/src/utils/strip-events.ts +49 -22
- package/src/utils/studio-utils.ts +29 -14
- package/src/view.ts +2 -3
- package/src/workspace/pane-derive.ts +14 -16
- package/src/workspace/session.ts +81 -50
- package/src/workspace/tab-workspace.ts +137 -0
- package/src/workspace/workspace-back.ts +189 -0
- package/src/workspace/workspace-home.ts +133 -0
- package/src/workspace/workspace-ids.ts +129 -0
- package/src/workspace/workspace-switch.ts +372 -0
- package/src/workspace/workspace.ts +165 -47
- package/styles/shell-frame.css +30 -7
- package/styles/shell-frame.json +15 -3
- package/dist/chunks/2020-va2wwra4.js +0 -4
- package/dist/chunks/adapter-f93pafd7.js +0 -4
- package/dist/chunks/cf-account-picker-af1h381v.js +0 -4
- package/dist/chunks/cf-settings-125tdm0w.js +0 -4
- package/dist/chunks/color-area-jqhna8zy.js +0 -4
- package/dist/chunks/color-field-embq5ctg.js +0 -4
- package/dist/chunks/color-fpezvnkt.js +0 -4
- package/dist/chunks/color-slider-1qmw7wqy.js +0 -4
- package/dist/chunks/combobox-773hdzyj.js +0 -4
- package/dist/chunks/components-ax2f1fnn.js +0 -4
- package/dist/chunks/content-source-108aqtk1.js +0 -4
- package/dist/chunks/convert-to-repeater-ry5rmppr.js +0 -4
- package/dist/chunks/dialog-mtm9fq5t.js +0 -4
- package/dist/chunks/editor-pfgdmkb0.js +0 -4
- package/dist/chunks/entry-commands-t0k1q0kx.js +0 -4
- package/dist/chunks/extension-sections-6mwh2hf8.js +0 -4
- package/dist/chunks/file-ops-meej5mqf.js +0 -4
- package/dist/chunks/files-44vp8a2s.js +0 -4
- package/dist/chunks/format-host-7q1petb9.js +0 -4
- package/dist/chunks/fs-events-h2mwnxaz.js +0 -4
- package/dist/chunks/git-panel-zngbymvd.js +0 -4
- package/dist/chunks/grid-view-sx9vynsp.js +0 -51
- package/dist/chunks/icons-p44xhjf0.js +0 -4
- package/dist/chunks/iframe-entry-f7mqjwpm.js +0 -5
- package/dist/chunks/iframe-entry-haw7jkvz.js +0 -5
- package/dist/chunks/iframe-entry-z6qrytv3.js +0 -5
- package/dist/chunks/iframe-host-qk3ycq87.js +0 -4
- package/dist/chunks/index-wkyfjeqz.js +0 -4
- package/dist/chunks/jsonMode-s8kt9dsj.js +0 -13
- package/dist/chunks/jx-validate-psgd7vsx.js +0 -4
- package/dist/chunks/layers-panel-1kq2jyfk.js +0 -4
- package/dist/chunks/layers-xd92fg8d.js +0 -4
- package/dist/chunks/listbox-s8fkmnq8.js +0 -4
- package/dist/chunks/lit-html-ac4cwwr4.js +0 -4
- package/dist/chunks/media-picker-0svzkdyb.js +0 -4
- package/dist/chunks/menu-37d07z9m.js +0 -4
- package/dist/chunks/menu-5c55ea3d.js +0 -4
- package/dist/chunks/monaco-binding-z6r70pdt.js +0 -4
- package/dist/chunks/monaco-buffer-fz6gq5y7.js +0 -4
- package/dist/chunks/monaco-setup-q4axkgj7.js +0 -4
- package/dist/chunks/notify-0xgtn8q1.js +0 -4
- package/dist/chunks/number-field-gw7sq8rn.js +0 -4
- package/dist/chunks/parse-897fvqah.js +0 -4
- package/dist/chunks/platform-v1qctbe6.js +0 -4
- package/dist/chunks/popover-8htra4er.js +0 -4
- package/dist/chunks/publish-panel-ym1fmgq5.js +0 -4
- package/dist/chunks/quick-search-a54e6t5n.js +0 -4
- package/dist/chunks/references-gmqp82fs.js +0 -4
- package/dist/chunks/right-panel-v7t9awbk.js +0 -4
- package/dist/chunks/section-registry-vhyf3zsr.js +0 -4
- package/dist/chunks/select-n3v7gwas.js +0 -4
- package/dist/chunks/split-pff8f3ze.js +0 -4
- package/dist/chunks/studio-0bhx5hz6.js +0 -5
- package/dist/chunks/studio-0k1ddnyy.js +0 -6
- package/dist/chunks/studio-1b04pd0j.js +0 -64
- package/dist/chunks/studio-4dwbj6gb.js +0 -5
- package/dist/chunks/studio-4tanh828.js +0 -5
- package/dist/chunks/studio-55h4mstj.js +0 -4
- package/dist/chunks/studio-5tnvjkz4.js +0 -5
- package/dist/chunks/studio-60dqgb0c.js +0 -5
- package/dist/chunks/studio-61dp09qg.js +0 -9
- package/dist/chunks/studio-63epcrj2.js +0 -5
- package/dist/chunks/studio-74k29dy9.js +0 -5
- package/dist/chunks/studio-7vg6jcd3.js +0 -5
- package/dist/chunks/studio-7zx31knw.js +0 -9
- package/dist/chunks/studio-8bxk97km.js +0 -5
- package/dist/chunks/studio-933e30n4.js +0 -5
- package/dist/chunks/studio-98wnwhbg.js +0 -5
- package/dist/chunks/studio-9mccjwjh.js +0 -14
- package/dist/chunks/studio-a2ke1e4t.js +0 -5
- package/dist/chunks/studio-e3a2a6v3.js +0 -4
- package/dist/chunks/studio-e81q1vb9.js +0 -5
- package/dist/chunks/studio-epgrmqqm.js +0 -5
- package/dist/chunks/studio-ery42sqr.js +0 -4
- package/dist/chunks/studio-g1shz58g.js +0 -5
- package/dist/chunks/studio-gf0fz03c.js +0 -5
- package/dist/chunks/studio-gjtpe62q.js +0 -6
- package/dist/chunks/studio-gkskhg7m.js +0 -5
- package/dist/chunks/studio-gx4dnjzd.js +0 -5
- package/dist/chunks/studio-j03zga3y.js +0 -9
- package/dist/chunks/studio-jhpxeckz.js +0 -5
- package/dist/chunks/studio-k01r7ykp.js +0 -5
- package/dist/chunks/studio-kk7h30ne.js +0 -7
- package/dist/chunks/studio-kt1zqney.js +0 -5
- package/dist/chunks/studio-m3cwhvye.js +0 -5
- package/dist/chunks/studio-mcayt6hz.js +0 -5
- package/dist/chunks/studio-myjcghv3.js +0 -5
- package/dist/chunks/studio-n8bxwc3y.js +0 -4
- package/dist/chunks/studio-ngm8gvpb.js +0 -5
- package/dist/chunks/studio-nj5a01jy.js +0 -928
- package/dist/chunks/studio-pcgz8heb.js +0 -5
- package/dist/chunks/studio-qcsq0t15.js +0 -5
- package/dist/chunks/studio-qkstvve9.js +0 -5
- package/dist/chunks/studio-qv1pwd3c.js +0 -5
- package/dist/chunks/studio-rc6dvxjb.js +0 -7
- package/dist/chunks/studio-s8dmmz66.js +0 -5
- package/dist/chunks/studio-sp5xzbj4.js +0 -6
- package/dist/chunks/studio-szsjbj0g.js +0 -5
- package/dist/chunks/studio-t1xzawhr.js +0 -16
- package/dist/chunks/studio-tdcprbqb.js +0 -5
- package/dist/chunks/studio-vrmcjf9g.js +0 -7
- package/dist/chunks/studio-vyc0b4he.js +0 -10
- package/dist/chunks/studio-w0cgf6jg.js +0 -5
- package/dist/chunks/studio-w3hskzqk.js +0 -5
- package/dist/chunks/studio-xgrgcdyh.js +0 -9
- package/dist/chunks/studio-xz2yxfcb.js +0 -5
- package/dist/chunks/studio-y6n42tgs.js +0 -5
- package/dist/chunks/studio-yb560vxr.js +0 -5
- package/dist/chunks/studio-yn9f8vtx.js +0 -5
- package/dist/chunks/studio-yw05w8f0.js +0 -7
- package/dist/chunks/studio-z16sgavc.js +0 -5
- package/dist/chunks/studio-zey7zsdw.js +0 -12
- package/dist/chunks/studio-zyqn40w4.js +0 -5
- package/dist/chunks/swatch-group-8qh9a3bm.js +0 -4
- package/dist/chunks/tabs-jwthg40w.js +0 -4
- package/dist/chunks/textfield-spy3hc77.js +0 -4
- package/dist/chunks/toast-4d35zd64.js +0 -4
- package/dist/chunks/toast-host-8sjmfed3.js +0 -4
- package/dist/chunks/tooltip-fd6g9xy3.js +0 -4
- package/dist/chunks/tree-h19v1jfz.js +0 -4
- package/dist/chunks/tsMode-2frah6h1.js +0 -14
- package/dist/chunks/workspace-zt81g1ms.js +0 -4
- package/dist/chunks/ws-client-n2bh4hkf.js +0 -4
- package/src/panels/frontmatter-panel.ts +0 -701
- package/src/panels/git-panel.ts +0 -1120
- package/src/surfaces/doc-header.json +0 -776
- package/src/surfaces/doc-header.ts +0 -231
- package/src/surfaces/git-panel.json +0 -1880
- package/src/surfaces/git-panel.ts +0 -272
|
@@ -27,9 +27,8 @@ import { reactive } from "../reactivity";
|
|
|
27
27
|
import { mountSurface, registerSurface } from "../ui/surface";
|
|
28
28
|
import connectDoc from "./ai-managed-connect.json";
|
|
29
29
|
import type { SurfaceHandle } from "../ui/surface";
|
|
30
|
-
import type { JxDocument } from "@jxsuite/schema/types";
|
|
31
30
|
|
|
32
|
-
registerSurface("ai-managed-connect", connectDoc
|
|
31
|
+
registerSurface("ai-managed-connect", connectDoc);
|
|
33
32
|
|
|
34
33
|
/** What the offer says right now. Every field is the flow's wording, never a state it derives. */
|
|
35
34
|
export interface ManagedConnectView {
|
|
@@ -63,7 +62,7 @@ interface ManagedConnectFlags {
|
|
|
63
62
|
}
|
|
64
63
|
|
|
65
64
|
interface ManagedConnectScope
|
|
66
|
-
extends
|
|
65
|
+
extends ManagedConnectView, ManagedConnectActions, ManagedConnectFlags {}
|
|
67
66
|
|
|
68
67
|
/** The view plus the flag the document switches on. */
|
|
69
68
|
function derive(view: ManagedConnectView): ManagedConnectView & ManagedConnectFlags {
|
|
@@ -87,7 +86,7 @@ export function createManagedConnectSurface(
|
|
|
87
86
|
): ManagedConnectSurface {
|
|
88
87
|
const host = document.createElement("div");
|
|
89
88
|
host.style.display = "contents";
|
|
90
|
-
const scope = reactive({ ...derive(view), ...actions })
|
|
89
|
+
const scope: ManagedConnectScope = reactive<ManagedConnectScope>({ ...derive(view), ...actions });
|
|
91
90
|
|
|
92
91
|
/** `null` while a mount is in flight — which is a standing surface, not a missing one. */
|
|
93
92
|
let handle: SurfaceHandle | null = null;
|
|
@@ -25,9 +25,8 @@ import { reactive } from "../reactivity";
|
|
|
25
25
|
import { mountSurface, registerSurface } from "../ui/surface";
|
|
26
26
|
import pickerDoc from "./ai-model-picker.json";
|
|
27
27
|
import type { SurfaceHandle } from "../ui/surface";
|
|
28
|
-
import type { JxDocument } from "@jxsuite/schema/types";
|
|
29
28
|
|
|
30
|
-
registerSurface("ai-model-picker", pickerDoc
|
|
29
|
+
registerSurface("ai-model-picker", pickerDoc);
|
|
31
30
|
|
|
32
31
|
/** One row the control offers. Already a label — the flow decides what a row is called. */
|
|
33
32
|
export interface ModelPickerRow {
|
|
@@ -79,8 +78,7 @@ interface ModelPickerFlags {
|
|
|
79
78
|
hasFailure: boolean;
|
|
80
79
|
}
|
|
81
80
|
|
|
82
|
-
interface ModelPickerScope
|
|
83
|
-
extends Record<string, unknown>, ModelPickerView, ModelPickerActions, ModelPickerFlags {}
|
|
81
|
+
interface ModelPickerScope extends ModelPickerView, ModelPickerActions, ModelPickerFlags {}
|
|
84
82
|
|
|
85
83
|
/** The view plus the flag the document switches on. */
|
|
86
84
|
function derive(view: ModelPickerView): ModelPickerView & ModelPickerFlags {
|
|
@@ -103,7 +101,7 @@ export function createModelPickerSurface(
|
|
|
103
101
|
): ModelPickerSurface {
|
|
104
102
|
const host = document.createElement("div");
|
|
105
103
|
host.style.display = "contents";
|
|
106
|
-
const scope = reactive({ ...derive(view), ...actions })
|
|
104
|
+
const scope: ModelPickerScope = reactive<ModelPickerScope>({ ...derive(view), ...actions });
|
|
107
105
|
|
|
108
106
|
/** `null` while a mount is in flight — which is a standing surface, not a missing one. */
|
|
109
107
|
let handle: SurfaceHandle | null = null;
|
|
@@ -29,15 +29,16 @@
|
|
|
29
29
|
* @docs studio/editing/writing
|
|
30
30
|
*/
|
|
31
31
|
|
|
32
|
+
import { isJsonObject, isString } from "@jxsuite/schema/guards";
|
|
32
33
|
import { reactive } from "../reactivity";
|
|
33
34
|
import { mountSurface, registerSurface } from "../ui/surface";
|
|
34
35
|
import blockActionBarDoc from "./block-action-bar.json";
|
|
35
36
|
|
|
36
37
|
import type { JxScope } from "@jxsuite/runtime/types";
|
|
37
|
-
import type {
|
|
38
|
+
import type { JxElement } from "@jxsuite/schema/types";
|
|
38
39
|
import { rectOf } from "../utils/geometry";
|
|
39
40
|
|
|
40
|
-
registerSurface("block-action-bar", blockActionBarDoc
|
|
41
|
+
registerSurface("block-action-bar", blockActionBarDoc);
|
|
41
42
|
|
|
42
43
|
/** One button, already decided: what it is called, what it draws, and why it cannot act. */
|
|
43
44
|
export interface BlockBarTool {
|
|
@@ -116,7 +117,7 @@ export interface BlockBarActions {
|
|
|
116
117
|
}
|
|
117
118
|
|
|
118
119
|
/** The scope `block-action-bar.json` reads. */
|
|
119
|
-
interface BlockBarScope extends BlockBarView
|
|
120
|
+
interface BlockBarScope extends BlockBarView {
|
|
120
121
|
linkValue: string;
|
|
121
122
|
linkExisting: boolean;
|
|
122
123
|
linkApplyLabel: string;
|
|
@@ -167,8 +168,8 @@ export function emptyBlockBarView(): BlockBarView {
|
|
|
167
168
|
|
|
168
169
|
/** A node definition's `part`, as written in the document. */
|
|
169
170
|
function partOf(def: JxElement | string): string {
|
|
170
|
-
const part =
|
|
171
|
-
return
|
|
171
|
+
const part = isString(def) ? undefined : def.attributes?.["part"];
|
|
172
|
+
return isString(part) ? part : "";
|
|
172
173
|
}
|
|
173
174
|
|
|
174
175
|
/**
|
|
@@ -180,9 +181,10 @@ function partOf(def: JxElement | string): string {
|
|
|
180
181
|
* same shape `surfaces/schema-form.ts` and `surfaces/properties-panel.ts` use.
|
|
181
182
|
*/
|
|
182
183
|
function commandIdOf(state: JxScope | undefined): string {
|
|
183
|
-
const
|
|
184
|
-
const
|
|
185
|
-
|
|
184
|
+
const map = state?.["$map"];
|
|
185
|
+
const item = isJsonObject(map) ? map["item"] : undefined;
|
|
186
|
+
const id = isJsonObject(item) ? item["id"] : undefined;
|
|
187
|
+
return isString(id) ? id : "";
|
|
186
188
|
}
|
|
187
189
|
|
|
188
190
|
/** The bar's mounted surface, and every handle the flow is allowed to reach back through. */
|
|
@@ -250,22 +252,29 @@ export function mountBlockActionBar(host: HTMLElement, actions: BlockBarActions)
|
|
|
250
252
|
linkApplyLabel: "Apply",
|
|
251
253
|
linkExisting: false,
|
|
252
254
|
linkInput: (_scope: JxScope, event: Event) => {
|
|
253
|
-
const
|
|
254
|
-
|
|
255
|
+
const { target } = event;
|
|
256
|
+
const value = target !== null && "value" in target ? target.value : undefined;
|
|
257
|
+
scope.linkValue = isString(value) ? value : "";
|
|
255
258
|
},
|
|
256
259
|
linkValue: "",
|
|
257
260
|
linkX: 0,
|
|
258
261
|
linkY: 0,
|
|
259
262
|
openMergeTags: (_scope: JxScope, event: Event) => {
|
|
260
263
|
event.stopPropagation();
|
|
264
|
+
// SAFETY: Only the merge-tags `jx-action-button`'s `onclick` binds this handler, and during
|
|
265
|
+
// Dispatch `currentTarget` is the element the listener sits on.
|
|
261
266
|
actions.openMergeTags(event.currentTarget as HTMLElement);
|
|
262
267
|
},
|
|
263
268
|
openOverflow: (_scope: JxScope, event: Event) => {
|
|
264
269
|
event.stopPropagation();
|
|
270
|
+
// SAFETY: Only the overflow `jx-action-button`'s `onclick` binds this handler, and during
|
|
271
|
+
// Dispatch `currentTarget` is the element the listener sits on.
|
|
265
272
|
actions.openOverflow(event.currentTarget as HTMLElement);
|
|
266
273
|
},
|
|
267
274
|
openTagMenu: (_scope: JxScope, event: Event) => {
|
|
268
275
|
event.stopPropagation();
|
|
276
|
+
// SAFETY: Only the tag `jx-action-button`'s `onclick` binds this handler, and during
|
|
277
|
+
// Dispatch `currentTarget` is the element the listener sits on.
|
|
269
278
|
actions.openTagMenu(event.currentTarget as HTMLElement);
|
|
270
279
|
},
|
|
271
280
|
removeLink: () => {
|
|
@@ -274,7 +283,7 @@ export function mountBlockActionBar(host: HTMLElement, actions: BlockBarActions)
|
|
|
274
283
|
},
|
|
275
284
|
run: (id: string) => actions.run(id),
|
|
276
285
|
selectParent: () => actions.selectParent(),
|
|
277
|
-
})
|
|
286
|
+
});
|
|
278
287
|
|
|
279
288
|
/* One mount for the life of the window, and no teardown to write. The bar is chrome the app
|
|
280
289
|
never takes down: `dismissBlockActionBar` hides it through `visible`, and its layer slot is
|
|
@@ -295,6 +304,8 @@ export function mountBlockActionBar(host: HTMLElement, actions: BlockBarActions)
|
|
|
295
304
|
return;
|
|
296
305
|
}
|
|
297
306
|
if (part === "link") {
|
|
307
|
+
// SAFETY: `part: "link"` is the document's `jx-popover`, whose class carries `open` and the
|
|
308
|
+
// `showPopover({ source })` overload that PopoverElement names.
|
|
298
309
|
linkEl = element as PopoverElement;
|
|
299
310
|
return;
|
|
300
311
|
}
|
|
@@ -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
|
},
|
|
@@ -28,9 +28,8 @@ import { APP_NAME, GIT_COMMIT, VERSION } from "../version";
|
|
|
28
28
|
import bootFailureDoc from "./boot-failure.json";
|
|
29
29
|
import type { BootRefusal } from "../platforms/default-platform";
|
|
30
30
|
import type { SurfaceHandle } from "../ui/surface";
|
|
31
|
-
import type { JxDocument } from "@jxsuite/schema/types";
|
|
32
31
|
|
|
33
|
-
registerSurface("boot-failure", bootFailureDoc
|
|
32
|
+
registerSurface("boot-failure", bootFailureDoc);
|
|
34
33
|
|
|
35
34
|
/** The page the failure happened on — `location`, or a stand-in with the one field read. */
|
|
36
35
|
export interface BootFailurePage {
|
|
@@ -49,7 +48,7 @@ export interface BootFailureView {
|
|
|
49
48
|
}
|
|
50
49
|
|
|
51
50
|
/** The scope `boot-failure.json` reads. */
|
|
52
|
-
interface BootFailureScope extends
|
|
51
|
+
interface BootFailureScope extends BootFailureView {
|
|
53
52
|
/** The last Copy landed on the clipboard; the button says so. */
|
|
54
53
|
copied: boolean;
|
|
55
54
|
reload: () => void;
|
|
@@ -135,7 +134,7 @@ export function mountBootFailureSurface(
|
|
|
135
134
|
page: BootFailurePage = location,
|
|
136
135
|
): Promise<SurfaceHandle> {
|
|
137
136
|
const view = bootFailureView(refusal, page);
|
|
138
|
-
const scope = reactive<BootFailureScope>({
|
|
137
|
+
const scope: BootFailureScope = reactive<BootFailureScope>({
|
|
139
138
|
...view,
|
|
140
139
|
copied: false,
|
|
141
140
|
async copy() {
|
|
@@ -151,6 +150,6 @@ export function mountBootFailureSurface(
|
|
|
151
150
|
reload() {
|
|
152
151
|
location.reload();
|
|
153
152
|
},
|
|
154
|
-
})
|
|
153
|
+
});
|
|
155
154
|
return mountSurface("boot-failure", scope, host);
|
|
156
155
|
}
|
|
@@ -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"
|
|
@@ -15,23 +15,14 @@
|
|
|
15
15
|
* @docs studio/interface
|
|
16
16
|
*/
|
|
17
17
|
|
|
18
|
+
import { isString } from "@jxsuite/schema/guards";
|
|
18
19
|
import { reactive } from "../reactivity";
|
|
19
20
|
import { mountSurface, registerSurface } from "../ui/surface";
|
|
20
21
|
import bottomDockDoc from "./bottom-dock.json";
|
|
21
|
-
import type {
|
|
22
|
-
import type { SurfaceHandle } from "../ui/surface";
|
|
22
|
+
import type { JxElement } from "@jxsuite/schema/types";
|
|
23
|
+
import type { SurfaceHandle, SurfaceTab } from "../ui/surface";
|
|
23
24
|
|
|
24
|
-
registerSurface("bottom-dock", bottomDockDoc
|
|
25
|
-
|
|
26
|
-
/** One tab of the strip, as the document draws it. */
|
|
27
|
-
export interface BottomTabView {
|
|
28
|
-
/** The panel id — the row's identity, the strip's `selected` value, and `data-tab`. */
|
|
29
|
-
key: string;
|
|
30
|
-
/** The record's title with its badge already appended ("Problems 2"). */
|
|
31
|
-
label: string;
|
|
32
|
-
/** The tab element's own id, which the one panel names as its `aria-labelledby`. */
|
|
33
|
-
tabId: string;
|
|
34
|
-
}
|
|
25
|
+
registerSurface("bottom-dock", bottomDockDoc);
|
|
35
26
|
|
|
36
27
|
/** What the dock says right now. */
|
|
37
28
|
export interface BottomDockValues {
|
|
@@ -41,7 +32,7 @@ export interface BottomDockValues {
|
|
|
41
32
|
tabId: string;
|
|
42
33
|
/** `dock.bottom/panel:<id>`, or empty when no tab is showing and the body has no identity. */
|
|
43
34
|
bodyRegion: string;
|
|
44
|
-
tabs:
|
|
35
|
+
tabs: SurfaceTab[];
|
|
45
36
|
}
|
|
46
37
|
|
|
47
38
|
export interface BottomDockActions {
|
|
@@ -62,7 +53,7 @@ export interface BottomDockHandle {
|
|
|
62
53
|
dispose: () => void;
|
|
63
54
|
}
|
|
64
55
|
|
|
65
|
-
interface BottomDockScope extends
|
|
56
|
+
interface BottomDockScope extends BottomDockValues, BottomDockActions {}
|
|
66
57
|
|
|
67
58
|
function project(scope: BottomDockScope, values: BottomDockValues): void {
|
|
68
59
|
scope.tab = values.tab;
|
|
@@ -73,8 +64,8 @@ function project(scope: BottomDockScope, values: BottomDockValues): void {
|
|
|
73
64
|
|
|
74
65
|
/** The `part` a node was declared with, or the empty string. */
|
|
75
66
|
function partOf(def: JxElement | string): string {
|
|
76
|
-
const part =
|
|
77
|
-
return
|
|
67
|
+
const part = isString(def) ? undefined : def.attributes?.["part"];
|
|
68
|
+
return isString(part) ? part : "";
|
|
78
69
|
}
|
|
79
70
|
|
|
80
71
|
/**
|
|
@@ -90,7 +81,7 @@ export function mountBottomDockSurface(
|
|
|
90
81
|
actions: BottomDockActions,
|
|
91
82
|
options: BottomDockOptions,
|
|
92
83
|
): BottomDockHandle {
|
|
93
|
-
const scope = reactive<BottomDockScope>({ ...values, ...actions })
|
|
84
|
+
const scope: BottomDockScope = reactive<BottomDockScope>({ ...values, ...actions });
|
|
94
85
|
|
|
95
86
|
container.textContent = "";
|
|
96
87
|
// @ts-expect-error -- _$litPart$ is lit's private render-part marker, not in the DOM types
|
|
@@ -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,20 +23,21 @@
|
|
|
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
|
|
30
30
|
*/
|
|
31
31
|
|
|
32
|
+
import { isJsonObject, isString } from "@jxsuite/schema/guards";
|
|
32
33
|
import { reactive } from "../reactivity";
|
|
33
34
|
import { mountSurface, registerSurface } from "../ui/surface";
|
|
34
35
|
import canvasStageDoc from "./canvas-stage.json";
|
|
35
|
-
import type {
|
|
36
|
+
import type { JxElement } from "@jxsuite/schema/types";
|
|
36
37
|
import type { JxScope } from "@jxsuite/runtime/types";
|
|
37
38
|
import type { SurfaceHandle } from "../ui/surface";
|
|
38
39
|
|
|
39
|
-
registerSurface("canvas-stage", canvasStageDoc
|
|
40
|
+
registerSurface("canvas-stage", canvasStageDoc);
|
|
40
41
|
|
|
41
42
|
/** One artboard, as the document reads it. Every field is already a string or a boolean. */
|
|
42
43
|
export interface CanvasStagePanelItem {
|
|
@@ -65,11 +66,11 @@ export interface CanvasStageView {
|
|
|
65
66
|
/** Whether Edit's column hugs its content — a component definition rather than a page. */
|
|
66
67
|
hug: boolean;
|
|
67
68
|
/**
|
|
68
|
-
* What stands over the frame
|
|
69
|
-
*
|
|
70
|
-
*
|
|
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).
|
|
71
72
|
*/
|
|
72
|
-
lead: "none" | "
|
|
73
|
+
lead: "none" | "banner" | "toolbar" | "chrome";
|
|
73
74
|
/** Whether the column has its two width handles. */
|
|
74
75
|
handles: "hidden" | "shown";
|
|
75
76
|
panels: CanvasStagePanelItem[];
|
|
@@ -104,7 +105,7 @@ export interface CanvasStageHandle {
|
|
|
104
105
|
}
|
|
105
106
|
|
|
106
107
|
/** The scope the document reads: {@link CanvasStageView} plus the one control it draws. */
|
|
107
|
-
interface CanvasStageScope extends
|
|
108
|
+
interface CanvasStageScope extends CanvasStageView {
|
|
108
109
|
pickPanel: (key: string) => void;
|
|
109
110
|
}
|
|
110
111
|
|
|
@@ -117,16 +118,16 @@ interface CanvasStageScope extends Record<string, unknown>, CanvasStageView {
|
|
|
117
118
|
* `data-side` tells the two width handles apart — the one part the document draws twice.
|
|
118
119
|
*/
|
|
119
120
|
function attrOf(def: JxElement | string, name: string): string {
|
|
120
|
-
const value =
|
|
121
|
-
return
|
|
121
|
+
const value = isString(def) ? undefined : def.attributes?.[name];
|
|
122
|
+
return isString(value) ? value : "";
|
|
122
123
|
}
|
|
123
124
|
|
|
124
125
|
/** The `key` of the `$map` item a node was rendered inside, or "". */
|
|
125
126
|
function itemKey(state: JxScope | undefined): string {
|
|
126
|
-
const
|
|
127
|
-
const
|
|
128
|
-
|
|
129
|
-
return
|
|
127
|
+
const map = state?.["$map"];
|
|
128
|
+
const item = isJsonObject(map) ? map["item"] : undefined;
|
|
129
|
+
const key = isJsonObject(item) ? item["key"] : "";
|
|
130
|
+
return isString(key) ? key : "";
|
|
130
131
|
}
|
|
131
132
|
|
|
132
133
|
/** The three parts an artboard is made of; everything else is a singleton host. */
|
|
@@ -180,7 +181,7 @@ export function mountCanvasStage(
|
|
|
180
181
|
"the iframe survives" means — so the record a fresh render builds is filled from here rather
|
|
181
182
|
than from a callback that will not fire again. */
|
|
182
183
|
const boards = new Map<string, Map<string, HTMLElement>>();
|
|
183
|
-
const scope = reactive<CanvasStageScope>({
|
|
184
|
+
const scope: CanvasStageScope = reactive<CanvasStageScope>({
|
|
184
185
|
frame: "boards",
|
|
185
186
|
framePart: "panzoom",
|
|
186
187
|
frameVars: "",
|
|
@@ -190,7 +191,7 @@ export function mountCanvasStage(
|
|
|
190
191
|
lead: "none",
|
|
191
192
|
panels: [],
|
|
192
193
|
pickPanel: actions.pickPanel,
|
|
193
|
-
})
|
|
194
|
+
});
|
|
194
195
|
project(scope, view);
|
|
195
196
|
|
|
196
197
|
let mounted: SurfaceHandle | null = null;
|
|
@@ -25,25 +25,19 @@
|
|
|
25
25
|
import { reactive } from "../reactivity";
|
|
26
26
|
import { mountSurface, registerSurface } from "../ui/surface";
|
|
27
27
|
import { overlayRegion, REGION_ATTR } from "../ui/regions";
|
|
28
|
-
import { close
|
|
28
|
+
import { close, showModal } from "@jxsuite/ui/behaviors/dialog";
|
|
29
29
|
import { whenReady } from "./dialog";
|
|
30
30
|
import pickerDoc from "./cf-account-picker.json";
|
|
31
31
|
import type { SurfaceHandle } from "../ui/surface";
|
|
32
|
-
import type {
|
|
32
|
+
import type { CfAccount } from "../publish/pages-service";
|
|
33
33
|
|
|
34
|
-
registerSurface("cf-account-picker", pickerDoc
|
|
35
|
-
|
|
36
|
-
/** One account the grant reaches, as the list draws it. */
|
|
37
|
-
export interface CfAccountPickerRow {
|
|
38
|
-
id: string;
|
|
39
|
-
name: string;
|
|
40
|
-
}
|
|
34
|
+
registerSurface("cf-account-picker", pickerDoc);
|
|
41
35
|
|
|
42
36
|
/** What the flow knows. Every one of these may change while the dialog is up. */
|
|
43
37
|
export interface CfAccountPickerView {
|
|
44
38
|
/** The listing is in flight. Its own state, because "not yet asked" is not "reaches nothing". */
|
|
45
39
|
loading: boolean;
|
|
46
|
-
accounts:
|
|
40
|
+
accounts: CfAccount[];
|
|
47
41
|
/** The last refusal — a listing that failed, or an account the broker would not accept. */
|
|
48
42
|
failure: string;
|
|
49
43
|
/** The id being committed, so its own row can say so rather than the whole list going grey. */
|
|
@@ -88,15 +82,14 @@ interface CfAccountPickerFlags {
|
|
|
88
82
|
}
|
|
89
83
|
|
|
90
84
|
/** One row, as the document reads it: what it says, and whether it may be pressed. */
|
|
91
|
-
interface CfAccountPickerScopeRow extends
|
|
85
|
+
interface CfAccountPickerScopeRow extends CfAccount {
|
|
92
86
|
/** This row's own button text — "Selecting…" while it is the one being committed. */
|
|
93
87
|
label: string;
|
|
94
88
|
/** Every row is disabled while any commit is in flight: one answer at a time. */
|
|
95
89
|
busy: boolean;
|
|
96
90
|
}
|
|
97
91
|
|
|
98
|
-
interface CfAccountPickerScope
|
|
99
|
-
extends Record<string, unknown>, CfAccountPickerView, CfAccountPickerFlags {
|
|
92
|
+
interface CfAccountPickerScope extends CfAccountPickerView, CfAccountPickerFlags {
|
|
100
93
|
choose: (id: string) => void;
|
|
101
94
|
retry: () => void;
|
|
102
95
|
closed: () => void;
|
|
@@ -150,8 +143,12 @@ export function openCfAccountPickerSurface(options: CfAccountPickerOptions): CfA
|
|
|
150
143
|
closed = true;
|
|
151
144
|
options.onClosed();
|
|
152
145
|
};
|
|
146
|
+
/* Read through a call, not the bare binding: `close()` can run while the mount is awaiting the
|
|
147
|
+
element, and a direct `closed` test after that `await` would be narrowed to the value the test
|
|
148
|
+
before it saw. */
|
|
149
|
+
const isClosed = (): boolean => closed;
|
|
153
150
|
|
|
154
|
-
const scope = reactive({
|
|
151
|
+
const scope: CfAccountPickerScope = reactive<CfAccountPickerScope>({
|
|
155
152
|
...derive({ accounts: [], choosing: "", failure: "", loading: true }),
|
|
156
153
|
choose: (id: string) => {
|
|
157
154
|
options.onChoose(id);
|
|
@@ -160,18 +157,20 @@ export function openCfAccountPickerSurface(options: CfAccountPickerOptions): CfA
|
|
|
160
157
|
retry: () => {
|
|
161
158
|
options.onRetry();
|
|
162
159
|
},
|
|
163
|
-
})
|
|
160
|
+
});
|
|
164
161
|
|
|
165
162
|
let mounted: SurfaceHandle | null = null;
|
|
166
163
|
const ready = mountSurface("cf-account-picker", scope, slot).then(async (surface) => {
|
|
167
164
|
mounted = surface;
|
|
165
|
+
/* SAFETY: `cf-account-picker.json`'s root definition is a `jx-dialog` element, so the runtime
|
|
166
|
+
mounts an HTMLElement; a `Text` root only comes from a document whose root is a bare string. */
|
|
168
167
|
const element = surface.root as HTMLElement;
|
|
169
|
-
if (
|
|
168
|
+
if (isClosed()) {
|
|
170
169
|
surface.dispose();
|
|
171
170
|
return element;
|
|
172
171
|
}
|
|
173
172
|
await whenReady(element);
|
|
174
|
-
if (
|
|
173
|
+
if (isClosed()) {
|
|
175
174
|
return element;
|
|
176
175
|
}
|
|
177
176
|
showModal(element);
|
|
@@ -186,7 +185,7 @@ export function openCfAccountPickerSurface(options: CfAccountPickerOptions): CfA
|
|
|
186
185
|
const element = mounted?.root;
|
|
187
186
|
if (element instanceof HTMLElement) {
|
|
188
187
|
// The platform's close first, so focus goes back where it came from; then the document.
|
|
189
|
-
|
|
188
|
+
close(element);
|
|
190
189
|
}
|
|
191
190
|
mounted?.dispose();
|
|
192
191
|
mounted = null;
|