@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/panels/dnd.ts
CHANGED
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
monitorForElements,
|
|
11
11
|
} from "@atlaskit/pragmatic-drag-and-drop/element/adapter";
|
|
12
12
|
import { combine } from "@atlaskit/pragmatic-drag-and-drop/combine";
|
|
13
|
-
import {
|
|
13
|
+
import { isNumber } from "@jxsuite/schema/guards";
|
|
14
14
|
import { disableNativeDragPreview } from "@atlaskit/pragmatic-drag-and-drop/element/disable-native-drag-preview";
|
|
15
15
|
import {
|
|
16
16
|
attachInstruction,
|
|
@@ -26,20 +26,21 @@ import {
|
|
|
26
26
|
parentElementPath,
|
|
27
27
|
renderOnly,
|
|
28
28
|
} from "../store";
|
|
29
|
-
import { mutateInsertNode, mutateMoveNode,
|
|
29
|
+
import { mutateInsertNode, mutateMoveNode, transactDoc } from "../tabs/transact";
|
|
30
30
|
import { primarySelection } from "../tabs/selection";
|
|
31
31
|
import { activeTab } from "../workspace/workspace";
|
|
32
32
|
import { view } from "../view";
|
|
33
33
|
import { buildComponentInstance, componentRegistry } from "../files/components";
|
|
34
|
-
import {
|
|
35
|
-
import type { ElementsEntry } from "../files/elements";
|
|
34
|
+
import { mutateImportComponent } from "../editor/insert-component";
|
|
36
35
|
import { renderComponentPreview } from "./component-preview";
|
|
37
36
|
import { defaultDef, unsafeTags } from "./shared";
|
|
38
37
|
import { elementAtPoint } from "../utils/geometry";
|
|
39
38
|
import type { JxPath } from "../state";
|
|
40
39
|
import type { Tab } from "../tabs/tab";
|
|
41
|
-
import type {
|
|
40
|
+
import type { JxMutableNode } from "@jxsuite/schema/types";
|
|
42
41
|
import type { ComponentEntry } from "../files/components.js";
|
|
42
|
+
import type { ElementDragPayload } from "@atlaskit/pragmatic-drag-and-drop/element/adapter";
|
|
43
|
+
import type { DropTargetRecord } from "@atlaskit/pragmatic-drag-and-drop/types";
|
|
43
44
|
|
|
44
45
|
interface DragCanDragArgs {
|
|
45
46
|
element: HTMLElement;
|
|
@@ -51,17 +52,10 @@ interface DragPreviewArgs {
|
|
|
51
52
|
nativeSetDragImage: ((image: Element, x: number, y: number) => void) | null;
|
|
52
53
|
}
|
|
53
54
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
interface DragSelfArgs {
|
|
59
|
-
self: { data: Record<string, unknown> };
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
interface DragMonitorDropArgs {
|
|
63
|
-
source: { data: Record<string, unknown>; element: HTMLElement };
|
|
64
|
-
location: { current: { dropTargets: { data: Record<string, unknown> }[] } };
|
|
55
|
+
/** Where a drop instruction inserts: the parent's path and the index among its children. */
|
|
56
|
+
interface DropSlot {
|
|
57
|
+
parent: JxPath;
|
|
58
|
+
index: number;
|
|
65
59
|
}
|
|
66
60
|
|
|
67
61
|
/**
|
|
@@ -122,23 +116,25 @@ export function registerLayersDnD() {
|
|
|
122
116
|
view.dndCleanups = [];
|
|
123
117
|
_layersFrame = requestAnimationFrame(() => {
|
|
124
118
|
_layersFrame = null;
|
|
125
|
-
const container = leftPanel?.querySelector(OUTLINE_ROOT)
|
|
119
|
+
const container = leftPanel?.querySelector<HTMLElement>(OUTLINE_ROOT);
|
|
126
120
|
if (!container) {
|
|
127
121
|
return;
|
|
128
122
|
}
|
|
129
123
|
|
|
130
|
-
for (const row of container.querySelectorAll("[data-dnd-row]")
|
|
131
|
-
|
|
124
|
+
for (const row of container.querySelectorAll<HTMLElement>("[data-dnd-row]")) {
|
|
125
|
+
/* SAFETY: every `[data-dnd-row]` row is a `jx-tree-item` from panel-outline.json, and the
|
|
126
|
+
element reflects its `value` (the row's path key) onto the host as `data-value`. */
|
|
127
|
+
const rowPath: JxPath = (row.dataset.value as string)
|
|
132
128
|
.split("/")
|
|
133
|
-
.map((s: string) => (/^\d+$/.test(s) ? Math.trunc(Number(s)) : s))
|
|
134
|
-
const rowDepth = Math.trunc(Number(row.dataset.dndDepth
|
|
129
|
+
.map((s: string) => (/^\d+$/.test(s) ? Math.trunc(Number(s)) : s));
|
|
130
|
+
const rowDepth = Math.trunc(Number(row.dataset.dndDepth)) || 0;
|
|
135
131
|
const isVoid = Object.hasOwn(row.dataset, "dndVoid");
|
|
136
132
|
const isExpanded = Object.hasOwn(row.dataset, "dndExpanded");
|
|
137
133
|
|
|
138
134
|
const cleanup = combine(
|
|
139
135
|
draggable({
|
|
140
136
|
canDrag({ element: _el, input }: DragCanDragArgs) {
|
|
141
|
-
const target = elementAtPoint(input.clientX, input.clientY)
|
|
137
|
+
const target = elementAtPoint(input.clientX, input.clientY);
|
|
142
138
|
if (target?.closest(OUTLINE_ACTIONS)) {
|
|
143
139
|
return false;
|
|
144
140
|
}
|
|
@@ -169,9 +165,10 @@ export function registerLayersDnD() {
|
|
|
169
165
|
}),
|
|
170
166
|
dropTargetForElements({
|
|
171
167
|
element: row,
|
|
172
|
-
canDrop({ source }
|
|
173
|
-
|
|
174
|
-
|
|
168
|
+
canDrop({ source }) {
|
|
169
|
+
// Only a tree-node drag carries a path array; a file-tree drag's `path` is a string.
|
|
170
|
+
const srcPath = source.data.path;
|
|
171
|
+
if (Array.isArray(srcPath) && isAncestor(srcPath, rowPath)) {
|
|
175
172
|
return false;
|
|
176
173
|
}
|
|
177
174
|
return true;
|
|
@@ -193,12 +190,12 @@ export function registerLayersDnD() {
|
|
|
193
190
|
input,
|
|
194
191
|
mode: isExpanded ? "expanded" : "standard",
|
|
195
192
|
},
|
|
196
|
-
)
|
|
193
|
+
);
|
|
197
194
|
},
|
|
198
|
-
onDragEnter({ self }
|
|
195
|
+
onDragEnter({ self }) {
|
|
199
196
|
showLayerDropGap(row, self.data, container);
|
|
200
197
|
},
|
|
201
|
-
onDrag({ self }
|
|
198
|
+
onDrag({ self }) {
|
|
202
199
|
showLayerDropGap(row, self.data, container);
|
|
203
200
|
},
|
|
204
201
|
// No onDragLeave clear — the gap persists while the pointer crosses dead space
|
|
@@ -213,7 +210,7 @@ export function registerLayersDnD() {
|
|
|
213
210
|
|
|
214
211
|
// Global monitor
|
|
215
212
|
const monitorCleanup = monitorForElements({
|
|
216
|
-
onDrop({ source, location }
|
|
213
|
+
onDrop({ source, location }) {
|
|
217
214
|
clearLayerDropGap(container);
|
|
218
215
|
const [target] = location.current.dropTargets;
|
|
219
216
|
if (!target) {
|
|
@@ -224,7 +221,13 @@ export function registerLayersDnD() {
|
|
|
224
221
|
return;
|
|
225
222
|
}
|
|
226
223
|
const srcData = source.data;
|
|
227
|
-
|
|
224
|
+
/* Only an Outline row's data carries a path. The Logic tab's statement rows attach tree-item
|
|
225
|
+
instructions too, and the drags they accept (statements) are ones applyDropInstruction
|
|
226
|
+
ignores, so a drop there has nothing to apply. */
|
|
227
|
+
const targetPath = target.data.path;
|
|
228
|
+
if (!Array.isArray(targetPath)) {
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
228
231
|
|
|
229
232
|
// If the source had children, persist collapse at the new location
|
|
230
233
|
const srcRow = srcData.type === "tree-node" && source.element;
|
|
@@ -243,7 +246,7 @@ export function registerLayersDnD() {
|
|
|
243
246
|
}
|
|
244
247
|
}
|
|
245
248
|
},
|
|
246
|
-
onDropTargetChange({ location }
|
|
249
|
+
onDropTargetChange({ location }) {
|
|
247
250
|
// Clear the layer gap when the drag moves onto a non-tree target (e.g. a canvas
|
|
248
251
|
// Element). When there is no target at all, keep the gap so it persists.
|
|
249
252
|
const [inner] = location.current.dropTargets;
|
|
@@ -259,14 +262,12 @@ export function registerLayersDnD() {
|
|
|
259
262
|
/** Register DnD on component rows — called from renderLeftPanel when tab=components */
|
|
260
263
|
export function registerComponentsDnD() {
|
|
261
264
|
requestAnimationFrame(() => {
|
|
262
|
-
const container = leftPanel?.querySelector(".components-section")
|
|
265
|
+
const container = leftPanel?.querySelector<HTMLElement>(".components-section");
|
|
263
266
|
if (!container) {
|
|
264
267
|
return;
|
|
265
268
|
}
|
|
266
269
|
|
|
267
|
-
for (const row of container.querySelectorAll(
|
|
268
|
-
"[data-component-tag]",
|
|
269
|
-
) as NodeListOf<HTMLElement>) {
|
|
270
|
+
for (const row of container.querySelectorAll<HTMLElement>("[data-component-tag]")) {
|
|
270
271
|
const tagName = row.dataset.componentTag;
|
|
271
272
|
if (!tagName) {
|
|
272
273
|
continue;
|
|
@@ -303,11 +304,12 @@ export function registerComponentsDnD() {
|
|
|
303
304
|
/** Register DnD on element (HTML block) rows */
|
|
304
305
|
export function registerElementsDnD() {
|
|
305
306
|
requestAnimationFrame(() => {
|
|
306
|
-
const container = leftPanel?.querySelector('[part="content"]')
|
|
307
|
+
const container = leftPanel?.querySelector<HTMLElement>('[part="content"]');
|
|
307
308
|
if (!container) {
|
|
308
309
|
return;
|
|
309
310
|
}
|
|
310
|
-
for (const row of container.querySelectorAll("[data-block-tag]")
|
|
311
|
+
for (const row of container.querySelectorAll<HTMLElement>("[data-block-tag]")) {
|
|
312
|
+
// SAFETY: the selector matched on `data-block-tag`, so the attribute is present and this is its text.
|
|
311
313
|
const tag = row.dataset.blockTag as string;
|
|
312
314
|
const preview = row.querySelector(".element-card-preview");
|
|
313
315
|
if (preview && !preview.firstChild) {
|
|
@@ -338,22 +340,22 @@ export function registerElementsDnD() {
|
|
|
338
340
|
*/
|
|
339
341
|
function hideDescendantRows(parentRow: HTMLElement, container: HTMLElement) {
|
|
340
342
|
const prefix = `${parentRow.dataset.value}/`;
|
|
341
|
-
const rows = container.querySelectorAll(OUTLINE_ROWS);
|
|
343
|
+
const rows = container.querySelectorAll<HTMLElement>(OUTLINE_ROWS);
|
|
342
344
|
for (const r of rows) {
|
|
343
|
-
if (
|
|
344
|
-
|
|
345
|
+
if (r.dataset.value?.startsWith(prefix)) {
|
|
346
|
+
r.style.display = "none";
|
|
345
347
|
}
|
|
346
348
|
}
|
|
347
349
|
}
|
|
348
350
|
|
|
349
351
|
/**
|
|
350
352
|
* @param {HTMLElement} rowEl
|
|
351
|
-
* @param {
|
|
353
|
+
* @param {DropTargetRecord["data"]} data The row's own drop-target data, carrying its instruction.
|
|
352
354
|
* @param {HTMLElement} container
|
|
353
355
|
*/
|
|
354
356
|
export function showLayerDropGap(
|
|
355
357
|
rowEl: HTMLElement,
|
|
356
|
-
data:
|
|
358
|
+
data: DropTargetRecord["data"],
|
|
357
359
|
container: HTMLElement,
|
|
358
360
|
) {
|
|
359
361
|
const instruction = extractInstruction(data);
|
|
@@ -379,18 +381,18 @@ export function showLayerDropGap(
|
|
|
379
381
|
view._currentDropTargetRow = rowEl;
|
|
380
382
|
|
|
381
383
|
// Shift rows to create gap
|
|
382
|
-
const rows = [...container.querySelectorAll(OUTLINE_ROWS)];
|
|
384
|
+
const rows = [...container.querySelectorAll<HTMLElement>(OUTLINE_ROWS)];
|
|
383
385
|
const targetIdx = rows.indexOf(rowEl);
|
|
384
386
|
const gap = view.layerDragSourceHeight;
|
|
385
387
|
|
|
386
|
-
for (
|
|
387
|
-
if (
|
|
388
|
+
for (const [i, row] of rows.entries()) {
|
|
389
|
+
if (row.dataset.dragging !== undefined) {
|
|
388
390
|
continue;
|
|
389
391
|
}
|
|
390
392
|
if (instruction.type === "reorder-above") {
|
|
391
|
-
|
|
393
|
+
row.style.transform = i >= targetIdx ? `translateY(${gap}px)` : "";
|
|
392
394
|
} else {
|
|
393
|
-
|
|
395
|
+
row.style.transform = i > targetIdx ? `translateY(${gap}px)` : "";
|
|
394
396
|
}
|
|
395
397
|
}
|
|
396
398
|
}
|
|
@@ -401,16 +403,51 @@ export function clearLayerDropGap(container: HTMLElement) {
|
|
|
401
403
|
delete view._currentDropTargetRow.dataset.drop;
|
|
402
404
|
view._currentDropTargetRow = null;
|
|
403
405
|
}
|
|
404
|
-
const rows = container.querySelectorAll(OUTLINE_ROWS);
|
|
406
|
+
const rows = container.querySelectorAll<HTMLElement>(OUTLINE_ROWS);
|
|
405
407
|
for (const r of rows) {
|
|
406
|
-
|
|
408
|
+
r.style.transform = "";
|
|
407
409
|
// Also clear `display:none` left by hideDescendantRows. The row has no `style`
|
|
408
410
|
// Lit binding, so an imperative style set during the drag survives the post-drop re-render on
|
|
409
411
|
// Whichever row keeps that key — and a move is exactly the edit that hands a key to a different
|
|
410
412
|
// Node. (The rows ARE keyed, by `pathKey`; the earlier form of this note said they were not,
|
|
411
413
|
// Which made the wrong thing sound load-bearing. What is load-bearing is the missing binding.)
|
|
412
|
-
|
|
414
|
+
r.style.display = "";
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
/**
|
|
419
|
+
* Where a drop instruction lands relative to `targetPath`.
|
|
420
|
+
*
|
|
421
|
+
* `make-child` appends to the target itself. A reorder lands beside it, which needs a parent and a
|
|
422
|
+
* numeric index, so a reorder (or any other instruction) around a root-level path answers
|
|
423
|
+
* `undefined`: the drop cannot land there at all. `null` is an instruction that lands but inserts
|
|
424
|
+
* nothing, which this module does not apply.
|
|
425
|
+
*
|
|
426
|
+
* @param {JxMutableNode} doc
|
|
427
|
+
* @param {string} type
|
|
428
|
+
* @param {JxPath} targetPath
|
|
429
|
+
* @returns {DropSlot | null | undefined}
|
|
430
|
+
*/
|
|
431
|
+
function dropSlot(
|
|
432
|
+
doc: JxMutableNode,
|
|
433
|
+
type: string,
|
|
434
|
+
targetPath: JxPath,
|
|
435
|
+
): DropSlot | null | undefined {
|
|
436
|
+
if (type === "make-child") {
|
|
437
|
+
return { index: childList(getNodeAtPath(doc, targetPath)).length, parent: targetPath };
|
|
438
|
+
}
|
|
439
|
+
const parent = parentElementPath(targetPath);
|
|
440
|
+
const index = childIndex(targetPath);
|
|
441
|
+
if (!parent || !isNumber(index)) {
|
|
442
|
+
return undefined;
|
|
443
|
+
}
|
|
444
|
+
if (type === "reorder-above") {
|
|
445
|
+
return { index, parent };
|
|
446
|
+
}
|
|
447
|
+
if (type === "reorder-below") {
|
|
448
|
+
return { index: index + 1, parent };
|
|
413
449
|
}
|
|
450
|
+
return null;
|
|
414
451
|
}
|
|
415
452
|
|
|
416
453
|
/**
|
|
@@ -420,110 +457,50 @@ export function clearLayerDropGap(container: HTMLElement) {
|
|
|
420
457
|
*
|
|
421
458
|
* @param {Tab | null} tab
|
|
422
459
|
* @param {{ type: string }} instruction
|
|
423
|
-
* @param {
|
|
460
|
+
* @param {ElementDragPayload["data"]} srcData The drag source's own data, as `getInitialData` made
|
|
461
|
+
* it.
|
|
424
462
|
* @param {JxPath} targetPath
|
|
425
463
|
*/
|
|
426
464
|
export function applyDropInstruction(
|
|
427
465
|
tab: Tab | null,
|
|
428
466
|
instruction: { type: string },
|
|
429
|
-
srcData:
|
|
467
|
+
srcData: ElementDragPayload["data"],
|
|
430
468
|
targetPath: JxPath,
|
|
431
469
|
) {
|
|
432
470
|
if (!tab) {
|
|
433
471
|
return;
|
|
434
472
|
}
|
|
435
|
-
const doc = tab.doc.document as JxMutableNode;
|
|
436
473
|
if (srcData.type === "tree-node") {
|
|
474
|
+
/* SAFETY: both minters of a "tree-node" payload — an Outline row's `getInitialData` and the
|
|
475
|
+
block action bar's drag handle — set `path` to the dragged node's JxPath. */
|
|
437
476
|
const fromPath = srcData.path as JxPath;
|
|
438
|
-
const
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
// Reordered around.
|
|
442
|
-
if (instruction.type !== "make-child" && (!targetParent || typeof targetIdx !== "number")) {
|
|
443
|
-
return;
|
|
444
|
-
}
|
|
445
|
-
|
|
446
|
-
switch (instruction.type) {
|
|
447
|
-
case "reorder-above": {
|
|
448
|
-
transactDoc(tab, (t) => mutateMoveNode(t, fromPath, targetParent, targetIdx));
|
|
449
|
-
break;
|
|
450
|
-
}
|
|
451
|
-
case "reorder-below": {
|
|
452
|
-
transactDoc(tab, (t) => mutateMoveNode(t, fromPath, targetParent, targetIdx + 1));
|
|
453
|
-
break;
|
|
454
|
-
}
|
|
455
|
-
case "make-child": {
|
|
456
|
-
const target = getNodeAtPath(doc, targetPath);
|
|
457
|
-
const len = childList(target).length;
|
|
458
|
-
transactDoc(tab, (t) => mutateMoveNode(t, fromPath, targetPath, len));
|
|
459
|
-
break;
|
|
460
|
-
}
|
|
461
|
-
default: {
|
|
462
|
-
break;
|
|
463
|
-
}
|
|
477
|
+
const slot = dropSlot(tab.doc.document, instruction.type, targetPath);
|
|
478
|
+
if (slot) {
|
|
479
|
+
transactDoc(tab, (t) => mutateMoveNode(t, fromPath, slot.parent, slot.index));
|
|
464
480
|
}
|
|
465
481
|
} else if (srcData.type === "block") {
|
|
466
|
-
const
|
|
467
|
-
|
|
468
|
-
if (instruction.type !== "make-child" && (!targetParent || typeof targetIdx !== "number")) {
|
|
482
|
+
const slot = dropSlot(tab.doc.document, instruction.type, targetPath);
|
|
483
|
+
if (slot === undefined) {
|
|
469
484
|
return;
|
|
470
485
|
}
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
targetIdx + 1,
|
|
490
|
-
structuredClone(srcData.fragment as JxMutableNode),
|
|
491
|
-
),
|
|
492
|
-
);
|
|
493
|
-
break;
|
|
494
|
-
}
|
|
495
|
-
case "make-child": {
|
|
496
|
-
const target = getNodeAtPath(doc, targetPath);
|
|
497
|
-
const len = childList(target).length;
|
|
498
|
-
transactDoc(tab, (t) =>
|
|
499
|
-
mutateInsertNode(t, targetPath, len, structuredClone(srcData.fragment as JxMutableNode)),
|
|
500
|
-
);
|
|
501
|
-
break;
|
|
502
|
-
}
|
|
503
|
-
default: {
|
|
504
|
-
break;
|
|
505
|
-
}
|
|
506
|
-
}
|
|
507
|
-
|
|
508
|
-
/* Auto-import to `$elements` if the dropped block is a custom component.
|
|
509
|
-
Through the ONE service (`files/elements.ts`), which is the whole point of it: this call site
|
|
510
|
-
had its own duplicate rule and matched a local component by `ref.endsWith(basename)`, so
|
|
511
|
-
dropping `./components/card.json` into a page that already imported `./vendor/card.json`
|
|
512
|
-
counted as already imported and produced an element the page could not resolve. */
|
|
513
|
-
const fragment = srcData.fragment as JxMutableNode | undefined;
|
|
514
|
-
const tag = fragment?.tagName;
|
|
515
|
-
if (displayTagName(tag).includes("-")) {
|
|
516
|
-
const comp = componentRegistry.find((c: ComponentEntry) => c.tagName === tag);
|
|
517
|
-
const before = (tab.doc.document?.$elements ?? []) as ElementsEntry[];
|
|
518
|
-
const after = comp ? enableElement(before, comp, tab.documentPath ?? null) : before;
|
|
519
|
-
// Only when the list actually GREW. A component the registry cannot name — an npm entry with
|
|
520
|
-
// No package, a local one with no path — returns the list unchanged, and writing that back
|
|
521
|
-
// Would put an empty `$elements: []` on a document that had none.
|
|
522
|
-
if (after.length !== before.length) {
|
|
523
|
-
transact(tab, (d: JxMutableNode) => {
|
|
524
|
-
d.$elements = after as (string | JxElement)[];
|
|
525
|
-
});
|
|
526
|
-
}
|
|
486
|
+
/* SAFETY: every minter of a "block" payload — the Insert palette's element and component cards
|
|
487
|
+
and the file drop (`file-drop-action.ts`) — sets `fragment` to the JxMutableNode it inserts. */
|
|
488
|
+
const fragment = srcData.fragment as JxMutableNode;
|
|
489
|
+
/* Auto-import to `$elements` if the dropped block is a custom component, through the rule
|
|
490
|
+
every insertion door shares (`editor/insert-component.ts`, over the one `$elements` service):
|
|
491
|
+
this call site once had its own duplicate rule and matched a local component by
|
|
492
|
+
`ref.endsWith(basename)`, so dropping `./components/card.json` into a page that already
|
|
493
|
+
imported `./vendor/card.json` counted as already imported. The import is part of the same
|
|
494
|
+
transaction as the insert, so one ⌘Z takes back both. */
|
|
495
|
+
if (slot) {
|
|
496
|
+
transactDoc(tab, (t) => {
|
|
497
|
+
mutateInsertNode(t, slot.parent, slot.index, structuredClone(fragment));
|
|
498
|
+
mutateImportComponent(t, fragment.tagName);
|
|
499
|
+
/* The inserted node is the selection, as every other insert leaves it (the slash menu, Enter,
|
|
500
|
+
paste): the Inspector is then on the thing just placed, which is where a dropped image's
|
|
501
|
+
missing alt text or a component's props are filled in. */
|
|
502
|
+
t.session.selection = [[...slot.parent, "children", slot.index]];
|
|
503
|
+
});
|
|
527
504
|
}
|
|
528
505
|
}
|
|
529
506
|
}
|
package/src/panels/editors.ts
CHANGED
|
@@ -33,9 +33,10 @@
|
|
|
33
33
|
import type * as monaco from "monaco-editor";
|
|
34
34
|
import { loadMonaco, mountStillWanted } from "../services/monaco-lazy";
|
|
35
35
|
import { monacoTheme } from "../shell";
|
|
36
|
-
import { isJsonObject } from "@jxsuite/schema/guards";
|
|
36
|
+
import { isJsonObject, isString } from "@jxsuite/schema/guards";
|
|
37
37
|
|
|
38
|
-
import { getNodeAtPath
|
|
38
|
+
import { getNodeAtPath } from "@jxsuite/schema/doc-ops";
|
|
39
|
+
import { renderOnly, updateUi } from "../store";
|
|
39
40
|
import { activeTab, tabIsLive } from "../workspace/workspace";
|
|
40
41
|
import { mutateUpdateDef, mutateUpdateProperty, transactDoc } from "../tabs/transact";
|
|
41
42
|
import { view } from "../view";
|
|
@@ -50,11 +51,12 @@ import {
|
|
|
50
51
|
} from "../services/monaco-buffer";
|
|
51
52
|
import { globalEntries, namedFormulaEntries } from "../ui/formula-catalog";
|
|
52
53
|
import { notify } from "../services/notify";
|
|
54
|
+
import type { NotifyOptions } from "../services/notify";
|
|
53
55
|
|
|
54
56
|
import type { BufferWrites } from "../services/monaco-buffer";
|
|
55
57
|
import { noteTyping } from "../tabs/typing";
|
|
56
58
|
import type { OxLintDiagnostic } from "../services/code-services";
|
|
57
|
-
import type {
|
|
59
|
+
import type { JsonValue, JxDocumentValue } from "@jxsuite/schema/types";
|
|
58
60
|
import type { JxPath } from "../state";
|
|
59
61
|
import type { Tab } from "../tabs/tab";
|
|
60
62
|
|
|
@@ -78,8 +80,8 @@ type FunctionEditor = NonNullable<typeof view.functionEditor>;
|
|
|
78
80
|
function getFunctionBody(tab: Tab | null | undefined, editing: EditingTarget | null | undefined) {
|
|
79
81
|
const document = tab?.doc.document;
|
|
80
82
|
// Read body off any object-shaped def (covers legacy entries without $prototype).
|
|
81
|
-
const bodyOf = (def:
|
|
82
|
-
isJsonObject(def) &&
|
|
83
|
+
const bodyOf = (def: JxDocumentValue | undefined) =>
|
|
84
|
+
isJsonObject(def) && isString(def.body) ? def.body : "";
|
|
83
85
|
if (editing?.type === "def") {
|
|
84
86
|
return bodyOf(document?.state?.[editing.defName]);
|
|
85
87
|
} else if (editing?.type === "event") {
|
|
@@ -89,6 +91,27 @@ function getFunctionBody(tab: Tab | null | undefined, editing: EditingTarget | n
|
|
|
89
91
|
return "";
|
|
90
92
|
}
|
|
91
93
|
|
|
94
|
+
/**
|
|
95
|
+
* Whether one entry of a "lint" answer is an oxlint diagnostic.
|
|
96
|
+
*
|
|
97
|
+
* The code service forwards oxlint's own `--format=json` output (`code-api.ts`), whose every
|
|
98
|
+
* diagnostic carries a string `message` and `severity` and, where it points somewhere, a `labels`
|
|
99
|
+
* array. Those are the members checked here; `setLintMarkers` reads the rest as optional.
|
|
100
|
+
*/
|
|
101
|
+
function isLintDiagnostic(value: unknown): value is OxLintDiagnostic {
|
|
102
|
+
return (
|
|
103
|
+
isJsonObject(value) &&
|
|
104
|
+
isString(value.message) &&
|
|
105
|
+
isString(value.severity) &&
|
|
106
|
+
(value.labels === undefined || Array.isArray(value.labels))
|
|
107
|
+
);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/** The entries of a "lint" answer that are oxlint diagnostics, in the order they came. */
|
|
111
|
+
function lintDiagnostics(entries: readonly JsonValue[]): OxLintDiagnostic[] {
|
|
112
|
+
return entries.flatMap((entry) => (isLintDiagnostic(entry) ? [entry] : []));
|
|
113
|
+
}
|
|
114
|
+
|
|
92
115
|
/**
|
|
93
116
|
* The element the Logic tab draws for Monaco to fill.
|
|
94
117
|
*
|
|
@@ -110,6 +133,10 @@ export const CODE_HOST_SELECTOR = '[part="code-host"]';
|
|
|
110
133
|
*/
|
|
111
134
|
export function syncFunctionEditor(host: HTMLElement): void {
|
|
112
135
|
const tab = activeTab.value;
|
|
136
|
+
/* SAFETY: `editingFunction` is written only by openLogicTarget, and every caller that opens the
|
|
137
|
+
function surface (formula.editDef, formula.editEvent, the Data panel, the Logic tab's Open)
|
|
138
|
+
passes `{ type: "def", defName }` or `{ type: "event", path, eventKey }`, exactly the two
|
|
139
|
+
EditingTarget members. */
|
|
113
140
|
const editing = tab?.session.ui.editingFunction as EditingTarget | null | undefined;
|
|
114
141
|
const container = editing && tab ? host.querySelector<HTMLElement>(CODE_HOST_SELECTOR) : null;
|
|
115
142
|
if (!container || !tab || !editing) {
|
|
@@ -120,7 +147,7 @@ export function syncFunctionEditor(host: HTMLElement): void {
|
|
|
120
147
|
}
|
|
121
148
|
|
|
122
149
|
const current = view.functionEditor;
|
|
123
|
-
const attached = Boolean(current && container.contains(current.getDomNode()
|
|
150
|
+
const attached = Boolean(current && container.contains(current.getDomNode()));
|
|
124
151
|
/* THE TAB IS HALF OF THE IDENTITY, and the half that used to be missing.
|
|
125
152
|
`_editingTarget` is a JSON string built from the target alone, and the ordinary target
|
|
126
153
|
`{"eventKey":"onclick","path":["children",0],"type":"event"}` is the SAME string for the first
|
|
@@ -261,7 +288,7 @@ function bodyWriter(tab: Tab, editing: EditingTarget, writes?: BufferWrites) {
|
|
|
261
288
|
let wrote = false;
|
|
262
289
|
if (editing.type === "def") {
|
|
263
290
|
wrote = transactDoc(tab, (t) => mutateUpdateDef(t, editing.defName, { body: newBody }));
|
|
264
|
-
} else
|
|
291
|
+
} else {
|
|
265
292
|
const node = getNodeAtPath(tab.doc.document, editing.path);
|
|
266
293
|
/* THE ELEMENT THE HANDLER HANGS OFF CAN GO WHILE THE EDITOR IS OPEN — a collaborator's
|
|
267
294
|
delete arriving over the wire, or the author's own ⌘Z. `editing.path` then resolves to
|
|
@@ -275,6 +302,9 @@ function bodyWriter(tab: Tab, editing: EditingTarget, writes?: BufferWrites) {
|
|
|
275
302
|
return false;
|
|
276
303
|
}
|
|
277
304
|
const current = node[editing.eventKey] || {};
|
|
305
|
+
/* SAFETY: an `on*` key holds an event binding, which the schema makes an object (a `$ref`, a
|
|
306
|
+
function def or an expression def), so the spread copies that binding's fields; `|| {}`
|
|
307
|
+
covers a key with no binding yet. */
|
|
278
308
|
wrote = transactDoc(tab, (t) =>
|
|
279
309
|
mutateUpdateProperty(t, editing.path, editing.eventKey, {
|
|
280
310
|
...(current as object),
|
|
@@ -334,6 +364,8 @@ function bodyWriter(tab: Tab, editing: EditingTarget, writes?: BufferWrites) {
|
|
|
334
364
|
*/
|
|
335
365
|
export async function closeFunctionEditor(): Promise<void> {
|
|
336
366
|
const tab = activeTab.value;
|
|
367
|
+
/* SAFETY: `editingFunction` is written only by openLogicTarget, whose callers pass one of the two
|
|
368
|
+
EditingTarget shapes (see syncFunctionEditor). */
|
|
337
369
|
const editing = tab?.session.ui.editingFunction as EditingTarget | null | undefined;
|
|
338
370
|
if (!tab || !editing) {
|
|
339
371
|
return;
|
|
@@ -350,13 +382,13 @@ export async function closeFunctionEditor(): Promise<void> {
|
|
|
350
382
|
cancelBufferWrites(editor);
|
|
351
383
|
const write = editor._commitBody ?? bodyWriter(tab, editing);
|
|
352
384
|
if (!write(minResult?.code ?? currentCode)) {
|
|
385
|
+
const options: NotifyOptions = { key: "logic.close-refused", source: "Logic" };
|
|
386
|
+
if (tab.documentPath) {
|
|
387
|
+
options.path = tab.documentPath;
|
|
388
|
+
}
|
|
353
389
|
notify.warn(
|
|
354
390
|
"The handler could not be saved — source editing holds this document. Your code is still in the editor.",
|
|
355
|
-
|
|
356
|
-
key: "logic.close-refused",
|
|
357
|
-
source: "Logic",
|
|
358
|
-
...(tab.documentPath ? { path: tab.documentPath } : {}),
|
|
359
|
-
},
|
|
391
|
+
options,
|
|
360
392
|
);
|
|
361
393
|
return;
|
|
362
394
|
}
|
|
@@ -487,7 +519,7 @@ async function mountFunctionEditor(
|
|
|
487
519
|
tabIsLive(tab) &&
|
|
488
520
|
bufferIsLive(editor)
|
|
489
521
|
) {
|
|
490
|
-
setLintMarkers(editor, result.diagnostics
|
|
522
|
+
setLintMarkers(editor, lintDiagnostics(result.diagnostics));
|
|
491
523
|
}
|
|
492
524
|
});
|
|
493
525
|
|
|
@@ -527,7 +559,7 @@ async function mountFunctionEditor(
|
|
|
527
559
|
return;
|
|
528
560
|
}
|
|
529
561
|
if (result?.diagnostics) {
|
|
530
|
-
setLintMarkers(editor, result.diagnostics
|
|
562
|
+
setLintMarkers(editor, lintDiagnostics(result.diagnostics));
|
|
531
563
|
}
|
|
532
564
|
});
|
|
533
565
|
});
|
|
@@ -546,7 +578,7 @@ export async function registerFunctionCompletions() {
|
|
|
546
578
|
if (!activeTab.value) {
|
|
547
579
|
return { suggestions: [] };
|
|
548
580
|
}
|
|
549
|
-
const defs = activeTab.value.doc.document
|
|
581
|
+
const defs = activeTab.value.doc.document.state || {};
|
|
550
582
|
const word = model.getWordUntilPosition(position);
|
|
551
583
|
const range = {
|
|
552
584
|
endColumn: word.endColumn,
|
|
@@ -561,13 +593,12 @@ export async function registerFunctionCompletions() {
|
|
|
561
593
|
const suggestions: monaco.languages.CompletionItem[] = Object.entries(defs).map(
|
|
562
594
|
([key, def]) => {
|
|
563
595
|
let kind = monacoNs.languages.CompletionItemKind.Variable;
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
) {
|
|
596
|
+
// A primitive or array entry carries neither field, which is what reading them off it gave.
|
|
597
|
+
const prototype = isJsonObject(def) ? def.$prototype : undefined;
|
|
598
|
+
const handler = isJsonObject(def) ? def.$handler : undefined;
|
|
599
|
+
if (prototype === "Function" || handler || formulaDocs.has(key)) {
|
|
569
600
|
kind = monacoNs.languages.CompletionItemKind.Function;
|
|
570
|
-
} else if (
|
|
601
|
+
} else if (prototype) {
|
|
571
602
|
kind = monacoNs.languages.CompletionItemKind.Property;
|
|
572
603
|
}
|
|
573
604
|
const item: monaco.languages.CompletionItem = {
|