@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
package/src/surfaces/menu.ts
CHANGED
|
@@ -20,7 +20,6 @@
|
|
|
20
20
|
* @docs studio/interface/canvas
|
|
21
21
|
* @docs studio/interface/preferences
|
|
22
22
|
*/
|
|
23
|
-
import type { JxDocument } from "@jxsuite/schema/types";
|
|
24
23
|
import type { JxScope } from "@jxsuite/runtime/types";
|
|
25
24
|
import { ensureCaret } from "@jxsuite/ui/behaviors/menu";
|
|
26
25
|
import { reactive } from "../reactivity";
|
|
@@ -29,7 +28,7 @@ import { mountSurface, registerSurface } from "../ui/surface";
|
|
|
29
28
|
import { rectOf } from "../utils/geometry";
|
|
30
29
|
import menuDoc from "./menu.json";
|
|
31
30
|
|
|
32
|
-
registerSurface("menu", menuDoc
|
|
31
|
+
registerSurface("menu", menuDoc);
|
|
33
32
|
|
|
34
33
|
/**
|
|
35
34
|
* What a row prints: a projection of one command record, decided by the adapter that opens the
|
|
@@ -65,12 +64,12 @@ export interface OpenMenuOptions {
|
|
|
65
64
|
/** The menu's accessible name. */
|
|
66
65
|
label: string;
|
|
67
66
|
/** Where the panel opens, in viewport pixels, when `place` is not given. */
|
|
68
|
-
origin?:
|
|
67
|
+
origin?: ViewportPoint;
|
|
69
68
|
/**
|
|
70
69
|
* Where the panel opens as a function of its measured box: run once the popover is shown and
|
|
71
70
|
* again a frame later, so a menu that hangs off a control can put its bottom flush with a floor.
|
|
72
71
|
*/
|
|
73
|
-
place?: (box: DOMRect) =>
|
|
72
|
+
place?: (box: DOMRect) => ViewportPoint;
|
|
74
73
|
/** The lowest edge the menu and its submenus may reach; the viewport by default. */
|
|
75
74
|
floor?: () => number;
|
|
76
75
|
/**
|
|
@@ -113,6 +112,12 @@ export interface MenuHandle {
|
|
|
113
112
|
readonly setRows: (rows: readonly MenuRowProjection[]) => void;
|
|
114
113
|
}
|
|
115
114
|
|
|
115
|
+
/** A point in viewport pixels: where a floating panel's corner sits. */
|
|
116
|
+
export interface ViewportPoint {
|
|
117
|
+
x: number;
|
|
118
|
+
y: number;
|
|
119
|
+
}
|
|
120
|
+
|
|
116
121
|
type MenuElement = HTMLElement & {
|
|
117
122
|
open?: boolean;
|
|
118
123
|
x?: number;
|
|
@@ -140,7 +145,7 @@ type ProjectedRow = Omit<
|
|
|
140
145
|
};
|
|
141
146
|
|
|
142
147
|
/** The scope shape `menu.json` reads. */
|
|
143
|
-
interface MenuScope
|
|
148
|
+
interface MenuScope {
|
|
144
149
|
rows: ProjectedRow[];
|
|
145
150
|
label: string;
|
|
146
151
|
x: number;
|
|
@@ -167,7 +172,7 @@ export function placementOf(
|
|
|
167
172
|
* Where a menu with no coordinates of its own opens on an engine that cannot anchor it: below its
|
|
168
173
|
* opener, leading edges aligned — the same corner the placement names.
|
|
169
174
|
*/
|
|
170
|
-
function belowOpener(opener: HTMLElement | null | undefined):
|
|
175
|
+
function belowOpener(opener: HTMLElement | null | undefined): ViewportPoint {
|
|
171
176
|
if (!opener) {
|
|
172
177
|
return { x: 0, y: 0 };
|
|
173
178
|
}
|
|
@@ -205,17 +210,6 @@ function rowById(rows: readonly ProjectedRow[], id: string): ProjectedRow | unde
|
|
|
205
210
|
return undefined;
|
|
206
211
|
}
|
|
207
212
|
|
|
208
|
-
const ZERO_BOX = {
|
|
209
|
-
bottom: 0,
|
|
210
|
-
height: 0,
|
|
211
|
-
left: 0,
|
|
212
|
-
right: 0,
|
|
213
|
-
top: 0,
|
|
214
|
-
width: 0,
|
|
215
|
-
x: 0,
|
|
216
|
-
y: 0,
|
|
217
|
-
} as DOMRect;
|
|
218
|
-
|
|
219
213
|
/**
|
|
220
214
|
* Open a menu.
|
|
221
215
|
*
|
|
@@ -242,15 +236,20 @@ export function openMenu(options: OpenMenuOptions): MenuHandle {
|
|
|
242
236
|
options.onClosed?.(handle);
|
|
243
237
|
};
|
|
244
238
|
|
|
239
|
+
/* `place` is first asked before anything is laid out, so it is handed an empty box: a real
|
|
240
|
+
`DOMRect` whose every edge and dimension is zero. */
|
|
245
241
|
const initial = options.place
|
|
246
|
-
? options.place(
|
|
242
|
+
? options.place(new DOMRect())
|
|
247
243
|
: (options.origin ?? belowOpener(options.opener));
|
|
248
|
-
const scope: MenuScope = reactive({
|
|
244
|
+
const scope: MenuScope = reactive<MenuScope>({
|
|
249
245
|
floor: options.floor?.() ?? 0,
|
|
250
246
|
label: options.label,
|
|
251
247
|
placement: placementOf(options),
|
|
252
248
|
rows: options.rows.map((row) => project(row)),
|
|
253
249
|
select: (_scope: JxScope, event: Event) => {
|
|
250
|
+
/* SAFETY: `menu.json` binds this handler to `onselect` alone, and a row's `select` is raised
|
|
251
|
+
by the runtime's `dispatchEvent` statement in `jx-menu-item.json`, which always constructs
|
|
252
|
+
a `CustomEvent` whose `detail` is the row's value. */
|
|
254
253
|
const id = String((event as CustomEvent).detail);
|
|
255
254
|
const row = rowById(scope.rows, id);
|
|
256
255
|
if (!row) {
|
|
@@ -258,6 +257,7 @@ export function openMenu(options: OpenMenuOptions): MenuHandle {
|
|
|
258
257
|
}
|
|
259
258
|
// Run BEFORE closing: a command reads its target synchronously on entry, and closing the
|
|
260
259
|
// Menu is what clears it.
|
|
260
|
+
handBackKeyboard(menu, options.opener ?? null);
|
|
261
261
|
if (row.run) {
|
|
262
262
|
row.run();
|
|
263
263
|
} else {
|
|
@@ -267,7 +267,7 @@ export function openMenu(options: OpenMenuOptions): MenuHandle {
|
|
|
267
267
|
},
|
|
268
268
|
x: initial.x,
|
|
269
269
|
y: initial.y,
|
|
270
|
-
})
|
|
270
|
+
});
|
|
271
271
|
|
|
272
272
|
/** Put the panel where `place` says, from its box as laid out now. */
|
|
273
273
|
const place = (): void => {
|
|
@@ -279,18 +279,25 @@ export function openMenu(options: OpenMenuOptions): MenuHandle {
|
|
|
279
279
|
scope.y = at.y;
|
|
280
280
|
};
|
|
281
281
|
|
|
282
|
+
/* Read through a call, not the property path: `close()` can abort the controller while the menu
|
|
283
|
+
is awaiting `jx-ready`, and a direct test after that `await` would be narrowed to the value the
|
|
284
|
+
test before it saw. */
|
|
285
|
+
const aborted = (): boolean => controller.signal.aborted;
|
|
286
|
+
|
|
282
287
|
const ready = (async () => {
|
|
283
288
|
const mounted = await mountSurface("menu", scope, slot, { signal: controller.signal });
|
|
284
|
-
if (
|
|
289
|
+
if (aborted()) {
|
|
285
290
|
// Closed before the document finished mounting; the runtime already disposed it.
|
|
286
291
|
return;
|
|
287
292
|
}
|
|
288
293
|
({ dispose } = mounted);
|
|
289
294
|
// The document's root IS the menu, and a custom element connects asynchronously: `jx-ready` is
|
|
290
295
|
// The menu saying its `popover` attribute is on and it may be shown.
|
|
296
|
+
// SAFETY: `menu.json`'s root definition carries `tagName: "jx-menu"`, so the mounted root is
|
|
297
|
+
// The kit's menu element, which reflects `open`, `x` and `y` and inherits `showPopover`.
|
|
291
298
|
menu = mounted.root as MenuElement;
|
|
292
299
|
menu.addEventListener("toggle", (event) => {
|
|
293
|
-
if (
|
|
300
|
+
if (event.newState === "closed") {
|
|
294
301
|
finish();
|
|
295
302
|
}
|
|
296
303
|
});
|
|
@@ -299,7 +306,7 @@ export function openMenu(options: OpenMenuOptions): MenuHandle {
|
|
|
299
306
|
menu!.addEventListener("jx-ready", () => resolve(), { once: true });
|
|
300
307
|
});
|
|
301
308
|
}
|
|
302
|
-
if (
|
|
309
|
+
if (aborted()) {
|
|
303
310
|
return;
|
|
304
311
|
}
|
|
305
312
|
const source =
|
|
@@ -361,6 +368,23 @@ export function openMenu(options: OpenMenuOptions): MenuHandle {
|
|
|
361
368
|
return handle;
|
|
362
369
|
}
|
|
363
370
|
|
|
371
|
+
/**
|
|
372
|
+
* Give the keyboard back to the opener BEFORE a chosen row runs, while the menu still holds it.
|
|
373
|
+
*
|
|
374
|
+
* A row that opens a modal dialog (Open Project Settings, a confirmation) calls `showModal()` from
|
|
375
|
+
* inside its run, and the platform records whatever is focused at that moment as the element to
|
|
376
|
+
* restore when the dialog closes. Left alone that is the menu ROW, which is gone by the time the
|
|
377
|
+
* dialog closes, so Escape dropped focus on `<body>` instead of the gear that opened the menu. The
|
|
378
|
+
* opener is where focus goes when the menu closes anyway ({@link restoreFocus}); doing it first
|
|
379
|
+
* only makes it the element the dialog remembers. Only when the menu holds focus, for the reason
|
|
380
|
+
* `restoreFocus` gives.
|
|
381
|
+
*/
|
|
382
|
+
function handBackKeyboard(menu: MenuElement | null, opener: HTMLElement | null): void {
|
|
383
|
+
if (menu?.contains(document.activeElement) && opener?.isConnected && opener !== document.body) {
|
|
384
|
+
opener.focus({ preventScroll: true });
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
|
|
364
388
|
/**
|
|
365
389
|
* Hand the keyboard back to the opener, only when the menu still held it: an outside CLICK has
|
|
366
390
|
* already moved focus somewhere the author chose, and yanking it back would fight them. In a
|
|
@@ -16,14 +16,15 @@
|
|
|
16
16
|
* @docs studio/interface
|
|
17
17
|
*/
|
|
18
18
|
|
|
19
|
+
import { isJsonObject, isString } from "@jxsuite/schema/guards";
|
|
19
20
|
import { reactive } from "../reactivity";
|
|
20
21
|
import { mountSurface, registerSurface } from "../ui/surface";
|
|
21
22
|
import navigatorDockDoc from "./navigator-dock.json";
|
|
22
|
-
import type {
|
|
23
|
+
import type { JsonObject, JxElement } from "@jxsuite/schema/types";
|
|
23
24
|
import type { JxScope } from "@jxsuite/runtime/types";
|
|
24
25
|
import type { SurfaceHandle } from "../ui/surface";
|
|
25
26
|
|
|
26
|
-
registerSurface("navigator-dock", navigatorDockDoc
|
|
27
|
+
registerSurface("navigator-dock", navigatorDockDoc);
|
|
27
28
|
|
|
28
29
|
/** The panel showing, as the document draws it. */
|
|
29
30
|
export interface NavigatorPanelView {
|
|
@@ -65,19 +66,17 @@ export interface NavigatorDockHandle {
|
|
|
65
66
|
dispose: () => void;
|
|
66
67
|
}
|
|
67
68
|
|
|
68
|
-
interface NavigatorDockScope extends Record<string, unknown>, NavigatorDockValues {}
|
|
69
|
-
|
|
70
69
|
/** The `part` a node was declared with, or the empty string. */
|
|
71
70
|
function partOf(def: JxElement | string): string {
|
|
72
|
-
const part =
|
|
73
|
-
return
|
|
71
|
+
const part = isString(def) ? undefined : def.attributes?.["part"];
|
|
72
|
+
return isString(part) ? part : "";
|
|
74
73
|
}
|
|
75
74
|
|
|
76
75
|
/** The `$map` item a node was rendered inside, if it was rendered inside one. */
|
|
77
|
-
function mapItem(state: JxScope | undefined):
|
|
78
|
-
const map = state?.["$map"]
|
|
79
|
-
const item = map
|
|
80
|
-
return item
|
|
76
|
+
function mapItem(state: JxScope | undefined): JsonObject | null {
|
|
77
|
+
const map = state?.["$map"];
|
|
78
|
+
const item = isJsonObject(map) ? map["item"] : undefined;
|
|
79
|
+
return isJsonObject(item) ? item : null;
|
|
81
80
|
}
|
|
82
81
|
|
|
83
82
|
/**
|
|
@@ -91,7 +90,7 @@ export function mountNavigatorDock(
|
|
|
91
90
|
values: NavigatorDockValues,
|
|
92
91
|
options: NavigatorDockOptions,
|
|
93
92
|
): NavigatorDockHandle {
|
|
94
|
-
const scope = reactive<
|
|
93
|
+
const scope: NavigatorDockValues = reactive<NavigatorDockValues>({ panels: values.panels });
|
|
95
94
|
|
|
96
95
|
container.textContent = "";
|
|
97
96
|
// @ts-expect-error -- _$litPart$ is lit's private render-part marker, not in the DOM types
|
|
@@ -105,7 +104,7 @@ export function mountNavigatorDock(
|
|
|
105
104
|
return;
|
|
106
105
|
}
|
|
107
106
|
const key = mapItem(state)?.["key"];
|
|
108
|
-
if (
|
|
107
|
+
if (isString(key)) {
|
|
109
108
|
options.onContent(key, element);
|
|
110
109
|
}
|
|
111
110
|
},
|
|
@@ -31,22 +31,17 @@
|
|
|
31
31
|
* @docs studio/projects/create
|
|
32
32
|
*/
|
|
33
33
|
|
|
34
|
+
import { isString } from "@jxsuite/schema/guards";
|
|
34
35
|
import { reactive } from "../reactivity";
|
|
35
36
|
import { mountSurface, registerSurface } from "../ui/surface";
|
|
36
37
|
import { overlayRegion, REGION_ATTR } from "../ui/regions";
|
|
37
|
-
import { close
|
|
38
|
+
import { close, showModal } from "@jxsuite/ui/behaviors/dialog";
|
|
38
39
|
import { whenReady } from "./dialog";
|
|
39
40
|
import newProjectDoc from "./new-project.json";
|
|
40
|
-
import type { SurfaceHandle } from "../ui/surface";
|
|
41
|
-
import type {
|
|
41
|
+
import type { SurfaceHandle, SurfaceOption } from "../ui/surface";
|
|
42
|
+
import type { JxElement } from "@jxsuite/schema/types";
|
|
42
43
|
|
|
43
|
-
registerSurface("new-project", newProjectDoc
|
|
44
|
-
|
|
45
|
-
/** One row of a kit `jx-select`, and of the tab strip: a value and what it reads. */
|
|
46
|
-
export interface NewProjectRow {
|
|
47
|
-
value: string;
|
|
48
|
-
label: string;
|
|
49
|
-
}
|
|
44
|
+
registerSurface("new-project", newProjectDoc);
|
|
50
45
|
|
|
51
46
|
/** One card in the starter gallery — including the one that is not a starter. */
|
|
52
47
|
export interface NewProjectCard {
|
|
@@ -80,7 +75,7 @@ export interface NewProjectView {
|
|
|
80
75
|
showTabs: boolean;
|
|
81
76
|
/** The chosen tab's value, and the strip's rows. */
|
|
82
77
|
tab: string;
|
|
83
|
-
tabs:
|
|
78
|
+
tabs: SurfaceOption[];
|
|
84
79
|
/** Which body to draw. */
|
|
85
80
|
body: NewProjectBody;
|
|
86
81
|
/** The sentence above a closed AI gate: the two tabs ask for the same thing differently. */
|
|
@@ -110,10 +105,10 @@ export interface NewProjectView {
|
|
|
110
105
|
browsing: boolean;
|
|
111
106
|
browseLabel: string;
|
|
112
107
|
owner: string;
|
|
113
|
-
owners:
|
|
108
|
+
owners: SurfaceOption[];
|
|
114
109
|
/** `"private"` or `"public"` — a value rather than a flag, because a select holds one. */
|
|
115
110
|
visibility: string;
|
|
116
|
-
visibilities:
|
|
111
|
+
visibilities: SurfaceOption[];
|
|
117
112
|
/** The owner already has a repository of this name. Empty says nothing. */
|
|
118
113
|
repoTaken: string;
|
|
119
114
|
/** `Creates` or `Repository`, and the destination itself. */
|
|
@@ -127,12 +122,12 @@ export interface NewProjectView {
|
|
|
127
122
|
maxDepth: string;
|
|
128
123
|
maxPages: string;
|
|
129
124
|
breakpointMode: string;
|
|
130
|
-
breakpointModes:
|
|
125
|
+
breakpointModes: SurfaceOption[];
|
|
131
126
|
breakpointCount: string;
|
|
132
127
|
maxBreakpoints: string;
|
|
133
128
|
breakpointWidths: string;
|
|
134
129
|
breakpointRounding: string;
|
|
135
|
-
roundings:
|
|
130
|
+
roundings: SurfaceOption[];
|
|
136
131
|
/** What the chosen mode says will happen. */
|
|
137
132
|
breakpointHint: string;
|
|
138
133
|
aiNaming: boolean;
|
|
@@ -233,8 +228,7 @@ interface NewProjectFlags {
|
|
|
233
228
|
hasInstallUrl: boolean;
|
|
234
229
|
}
|
|
235
230
|
|
|
236
|
-
interface NewProjectScope
|
|
237
|
-
extends Record<string, unknown>, NewProjectView, NewProjectFlags, NewProjectActions {}
|
|
231
|
+
interface NewProjectScope extends NewProjectView, NewProjectFlags, NewProjectActions {}
|
|
238
232
|
|
|
239
233
|
/** The view plus the flags the document renders from. */
|
|
240
234
|
function derive(view: NewProjectView): NewProjectView & NewProjectFlags {
|
|
@@ -260,8 +254,8 @@ function derive(view: NewProjectView): NewProjectView & NewProjectFlags {
|
|
|
260
254
|
|
|
261
255
|
/** A node's authored `part`, which is how an island announces which one it is. */
|
|
262
256
|
function partOf(def: JxElement | string): string {
|
|
263
|
-
const part =
|
|
264
|
-
return
|
|
257
|
+
const part = isString(def) ? undefined : def.attributes?.["part"];
|
|
258
|
+
return isString(part) ? part : "";
|
|
265
259
|
}
|
|
266
260
|
|
|
267
261
|
/**
|
|
@@ -294,6 +288,10 @@ export function openNewProjectSurface(options: NewProjectSurfaceOptions): NewPro
|
|
|
294
288
|
closed = true;
|
|
295
289
|
options.actions.closed();
|
|
296
290
|
};
|
|
291
|
+
/* Read through a call, not the bare binding: `close()` can run while the mount is awaiting the
|
|
292
|
+
element, and a direct `closed` test after that `await` would be narrowed to the value the test
|
|
293
|
+
before it saw. */
|
|
294
|
+
const isClosed = (): boolean => closed;
|
|
297
295
|
|
|
298
296
|
/** The island boxes the document has announced, by part. Replaced as the bodies come and go. */
|
|
299
297
|
const boxes = new Map<string, HTMLElement>();
|
|
@@ -325,14 +323,14 @@ export function openNewProjectSurface(options: NewProjectSurfaceOptions): NewPro
|
|
|
325
323
|
}
|
|
326
324
|
};
|
|
327
325
|
|
|
328
|
-
const scope = reactive({
|
|
326
|
+
const scope: NewProjectScope = reactive<NewProjectScope>({
|
|
329
327
|
...derive(options.view),
|
|
330
328
|
...options.actions,
|
|
331
329
|
browse: () => {
|
|
332
330
|
options.actions.browse();
|
|
333
331
|
},
|
|
334
332
|
closed: finish,
|
|
335
|
-
})
|
|
333
|
+
});
|
|
336
334
|
|
|
337
335
|
let mounted: SurfaceHandle | null = null;
|
|
338
336
|
const ready = mountSurface("new-project", scope, slot, {
|
|
@@ -345,13 +343,16 @@ export function openNewProjectSurface(options: NewProjectSurfaceOptions): NewPro
|
|
|
345
343
|
},
|
|
346
344
|
}).then(async (surface) => {
|
|
347
345
|
mounted = surface;
|
|
346
|
+
/* SAFETY: `new-project.json`'s root definition carries `tagName: "jx-dialog"`, so the runtime
|
|
347
|
+
mounts an HTMLElement; a `Text` root only comes from a document whose root is a bare
|
|
348
|
+
string. */
|
|
348
349
|
const element = surface.root as HTMLElement;
|
|
349
|
-
if (
|
|
350
|
+
if (isClosed()) {
|
|
350
351
|
surface.dispose();
|
|
351
352
|
return element;
|
|
352
353
|
}
|
|
353
354
|
await whenReady(element);
|
|
354
|
-
if (
|
|
355
|
+
if (isClosed()) {
|
|
355
356
|
return element;
|
|
356
357
|
}
|
|
357
358
|
/* The region goes on the platform's own `<dialog>`, which is the one element here that HAS a
|
|
@@ -375,7 +376,7 @@ export function openNewProjectSurface(options: NewProjectSurfaceOptions): NewPro
|
|
|
375
376
|
const element = mounted?.root;
|
|
376
377
|
if (element instanceof HTMLElement) {
|
|
377
378
|
// The platform's close first, so focus goes back where it came from; then the document.
|
|
378
|
-
|
|
379
|
+
close(element);
|
|
379
380
|
}
|
|
380
381
|
// A mount that has not landed yet is disposed by `ready` when it does — `finish` tells it so.
|
|
381
382
|
mounted?.dispose();
|
|
@@ -394,8 +395,8 @@ export function openNewProjectSurface(options: NewProjectSurfaceOptions): NewPro
|
|
|
394
395
|
move. Measurement and a focus move are the two imperative things a surface may still do
|
|
395
396
|
(ui.md §2 rule 5). */
|
|
396
397
|
requestAnimationFrame(() => {
|
|
397
|
-
element.querySelector('[part="dialog"]')?.scrollTo
|
|
398
|
-
element.querySelector<HTMLElement>('[part="name"] [part="input"]')?.focus
|
|
398
|
+
element.querySelector('[part="dialog"]')?.scrollTo(0, 0);
|
|
399
|
+
element.querySelector<HTMLElement>('[part="name"] [part="input"]')?.focus();
|
|
399
400
|
});
|
|
400
401
|
},
|
|
401
402
|
host: slot,
|