@next-buildr/editor 2.0.1 → 3.0.0-rc.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 +2 -0
- package/UPGRADING.md +322 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/app/builder-editor.test.js +223 -18
- package/dist/app/config.d.ts +27 -4
- package/dist/app/config.d.ts.map +1 -1
- package/dist/app/config.js +4 -3
- package/dist/app/contracts.d.ts +40 -0
- package/dist/app/contracts.d.ts.map +1 -0
- package/dist/app/contracts.js +4 -0
- package/dist/app/editor-app.d.ts.map +1 -1
- package/dist/app/editor-app.js +316 -24
- package/dist/app/editor-app.test.js +144 -6
- package/dist/app/layout.d.ts +11 -2
- package/dist/app/layout.d.ts.map +1 -1
- package/dist/app/layout.js +170 -9
- package/dist/app/manifest.d.ts +7 -2
- package/dist/app/manifest.d.ts.map +1 -1
- package/dist/app/manifest.js +16 -4
- package/dist/app/shell-panels.d.ts +15 -0
- package/dist/app/shell-panels.d.ts.map +1 -1
- package/dist/app/small-screen.test.js +2 -2
- package/dist/app/stage-slots.d.ts +9 -0
- package/dist/app/stage-slots.d.ts.map +1 -0
- package/dist/app/stage-slots.js +10 -0
- package/dist/app/status-info.d.ts +2 -3
- package/dist/app/status-info.d.ts.map +1 -1
- package/dist/app/status-info.js +49 -16
- package/dist/canvas-host/canvas-frame.d.ts +13 -1
- package/dist/canvas-host/canvas-frame.d.ts.map +1 -1
- package/dist/canvas-host/canvas-frame.js +96 -8
- package/dist/canvas-host/canvas-frame.test.js +156 -3
- package/dist/canvas-host/host.d.ts +6 -0
- package/dist/canvas-host/host.d.ts.map +1 -1
- package/dist/canvas-host/host.js +116 -4
- package/dist/canvas-host/host.test.js +195 -6
- package/dist/clipboard/clipboard.d.ts +1 -1
- package/dist/clipboard/clipboard.d.ts.map +1 -1
- package/dist/clipboard/clipboard.js +5 -0
- package/dist/clipboard/clipboard.test.js +21 -1
- package/dist/clipboard/format.d.ts +3 -1
- package/dist/clipboard/format.d.ts.map +1 -1
- package/dist/clipboard/react.d.ts +1 -1
- package/dist/clipboard/react.d.ts.map +1 -1
- package/dist/clipboard/react.js +49 -3
- package/dist/dialogs/external-source.d.ts +15 -0
- package/dist/dialogs/external-source.d.ts.map +1 -0
- package/dist/dialogs/external-source.js +18 -0
- package/dist/dialogs/index.d.ts +4 -0
- package/dist/dialogs/index.d.ts.map +1 -1
- package/dist/dialogs/index.js +2 -0
- package/dist/dialogs/media-picker/index.d.ts +2 -2
- package/dist/dialogs/media-picker/index.d.ts.map +1 -1
- package/dist/dialogs/media-picker/index.js +1 -1
- package/dist/dialogs/media-picker/media-picker.d.ts +5 -0
- package/dist/dialogs/media-picker/media-picker.d.ts.map +1 -1
- package/dist/dialogs/media-picker/media-picker.js +67 -5
- package/dist/dialogs/media-picker/media-picker.test.js +72 -1
- package/dist/dialogs/media-picker/media-ref.d.ts +15 -0
- package/dist/dialogs/media-picker/media-ref.d.ts.map +1 -1
- package/dist/dialogs/media-picker/media-ref.js +29 -0
- package/dist/dialogs/remove-confirm.d.ts +14 -0
- package/dist/dialogs/remove-confirm.d.ts.map +1 -0
- package/dist/dialogs/remove-confirm.js +42 -0
- package/dist/dialogs/remove-confirm.test.d.ts +2 -0
- package/dist/dialogs/remove-confirm.test.d.ts.map +1 -0
- package/dist/dialogs/remove-confirm.test.js +118 -0
- package/dist/dnd/dnd-react.test.js +11 -2
- package/dist/dnd/dnd.test.js +23 -0
- package/dist/dnd/engine.d.ts +4 -2
- package/dist/dnd/engine.d.ts.map +1 -1
- package/dist/dnd/engine.js +6 -0
- package/dist/dnd/move-to-dialog.d.ts +4 -3
- package/dist/dnd/move-to-dialog.d.ts.map +1 -1
- package/dist/dnd/move-to-dialog.js +67 -10
- package/dist/dnd/react.d.ts.map +1 -1
- package/dist/dnd/react.js +5 -0
- package/dist/i18n/diagnostics.d.ts +22 -0
- package/dist/i18n/diagnostics.d.ts.map +1 -0
- package/dist/i18n/diagnostics.js +153 -0
- package/dist/i18n/diagnostics.test.d.ts +2 -0
- package/dist/i18n/diagnostics.test.d.ts.map +1 -0
- package/dist/i18n/diagnostics.test.js +74 -0
- package/dist/i18n/label-catalog.d.ts +20 -0
- package/dist/i18n/label-catalog.d.ts.map +1 -0
- package/dist/i18n/label-catalog.js +1 -0
- package/dist/i18n/locale-name.d.ts +7 -0
- package/dist/i18n/locale-name.d.ts.map +1 -0
- package/dist/i18n/locale-name.js +31 -0
- package/dist/i18n/localize-manifest.d.ts +11 -0
- package/dist/i18n/localize-manifest.d.ts.map +1 -0
- package/dist/i18n/localize-manifest.js +78 -0
- package/dist/i18n/localize-manifest.test.d.ts +2 -0
- package/dist/i18n/localize-manifest.test.d.ts.map +1 -0
- package/dist/i18n/localize-manifest.test.js +71 -0
- package/dist/messages/catalogs.test.d.ts +2 -0
- package/dist/messages/catalogs.test.d.ts.map +1 -0
- package/dist/messages/catalogs.test.js +80 -0
- package/dist/messages/en/app.d.ts +8 -0
- package/dist/messages/en/app.d.ts.map +1 -0
- package/dist/messages/en/app.js +7 -0
- package/dist/messages/en/blocks.d.ts +54 -0
- package/dist/messages/en/blocks.d.ts.map +1 -0
- package/dist/messages/en/blocks.js +53 -0
- package/dist/messages/en/canvas.d.ts +31 -0
- package/dist/messages/en/canvas.d.ts.map +1 -0
- package/dist/messages/en/canvas.js +30 -0
- package/dist/messages/en/clipboard.d.ts +13 -0
- package/dist/messages/en/clipboard.d.ts.map +1 -0
- package/dist/messages/en/clipboard.js +12 -0
- package/dist/messages/en/colorPicker.d.ts +20 -0
- package/dist/messages/en/colorPicker.d.ts.map +1 -0
- package/dist/messages/en/colorPicker.js +19 -0
- package/dist/messages/en/diagnostics.d.ts +40 -0
- package/dist/messages/en/diagnostics.d.ts.map +1 -0
- package/dist/messages/en/diagnostics.js +39 -0
- package/dist/messages/en/dialogs/common.d.ts +6 -0
- package/dist/messages/en/dialogs/common.d.ts.map +1 -0
- package/dist/messages/en/dialogs/common.js +5 -0
- package/dist/messages/en/dialogs/conflict.d.ts +15 -0
- package/dist/messages/en/dialogs/conflict.d.ts.map +1 -0
- package/dist/messages/en/dialogs/conflict.js +14 -0
- package/dist/messages/en/dialogs/delete.d.ts +19 -0
- package/dist/messages/en/dialogs/delete.d.ts.map +1 -0
- package/dist/messages/en/dialogs/delete.js +18 -0
- package/dist/messages/en/dialogs/pageOptions.d.ts +9 -0
- package/dist/messages/en/dialogs/pageOptions.d.ts.map +1 -0
- package/dist/messages/en/dialogs/pageOptions.js +8 -0
- package/dist/messages/en/dialogs/publish.d.ts +15 -0
- package/dist/messages/en/dialogs/publish.d.ts.map +1 -0
- package/dist/messages/en/dialogs/publish.js +14 -0
- package/dist/messages/en/dnd.d.ts +19 -0
- package/dist/messages/en/dnd.d.ts.map +1 -0
- package/dist/messages/en/dnd.js +18 -0
- package/dist/messages/en/editor.d.ts +30 -0
- package/dist/messages/en/editor.d.ts.map +1 -0
- package/dist/messages/en/editor.js +29 -0
- package/dist/messages/en/external.d.ts +6 -0
- package/dist/messages/en/external.d.ts.map +1 -0
- package/dist/messages/en/external.js +5 -0
- package/dist/messages/en/insert.d.ts +25 -0
- package/dist/messages/en/insert.d.ts.map +1 -0
- package/dist/messages/en/insert.js +24 -0
- package/dist/messages/en/inspector.d.ts +176 -0
- package/dist/messages/en/inspector.d.ts.map +1 -0
- package/dist/messages/en/inspector.js +175 -0
- package/dist/messages/en/issues.d.ts +36 -0
- package/dist/messages/en/issues.d.ts.map +1 -0
- package/dist/messages/en/issues.js +35 -0
- package/dist/messages/en/layers.d.ts +29 -0
- package/dist/messages/en/layers.d.ts.map +1 -0
- package/dist/messages/en/layers.js +28 -0
- package/dist/messages/en/leftPanel.d.ts +15 -0
- package/dist/messages/en/leftPanel.d.ts.map +1 -0
- package/dist/messages/en/leftPanel.js +14 -0
- package/dist/messages/en/list.d.ts +9 -0
- package/dist/messages/en/list.d.ts.map +1 -0
- package/dist/messages/en/list.js +8 -0
- package/dist/messages/en/locale.d.ts +4 -0
- package/dist/messages/en/locale.d.ts.map +1 -0
- package/dist/messages/en/locale.js +3 -0
- package/dist/messages/en/media.d.ts +51 -0
- package/dist/messages/en/media.d.ts.map +1 -0
- package/dist/messages/en/media.js +50 -0
- package/dist/messages/en/menu.d.ts +12 -0
- package/dist/messages/en/menu.d.ts.map +1 -0
- package/dist/messages/en/menu.js +11 -0
- package/dist/messages/en/patterns.d.ts +24 -0
- package/dist/messages/en/patterns.d.ts.map +1 -0
- package/dist/messages/en/patterns.js +23 -0
- package/dist/messages/en/preview.d.ts +8 -0
- package/dist/messages/en/preview.d.ts.map +1 -0
- package/dist/messages/en/preview.js +7 -0
- package/dist/messages/en/publish.d.ts +19 -0
- package/dist/messages/en/publish.d.ts.map +1 -0
- package/dist/messages/en/publish.js +18 -0
- package/dist/messages/en/richText.d.ts +21 -0
- package/dist/messages/en/richText.d.ts.map +1 -0
- package/dist/messages/en/richText.js +20 -0
- package/dist/messages/en/sample.d.ts +5 -0
- package/dist/messages/en/sample.d.ts.map +1 -0
- package/dist/messages/en/sample.js +4 -0
- package/dist/messages/en/save.d.ts +15 -0
- package/dist/messages/en/save.d.ts.map +1 -0
- package/dist/messages/en/save.js +14 -0
- package/dist/messages/en/shortcut.d.ts +36 -0
- package/dist/messages/en/shortcut.d.ts.map +1 -0
- package/dist/messages/en/shortcut.js +35 -0
- package/dist/messages/en/statusBar.d.ts +14 -0
- package/dist/messages/en/statusBar.d.ts.map +1 -0
- package/dist/messages/en/statusBar.js +13 -0
- package/dist/messages/en/structure.d.ts +28 -0
- package/dist/messages/en/structure.d.ts.map +1 -0
- package/dist/messages/en/structure.js +27 -0
- package/dist/messages/en/style.d.ts +168 -0
- package/dist/messages/en/style.d.ts.map +1 -0
- package/dist/messages/en/style.js +167 -0
- package/dist/messages/en/styleField.d.ts +301 -0
- package/dist/messages/en/styleField.d.ts.map +1 -0
- package/dist/messages/en/styleField.js +300 -0
- package/dist/messages/en/styleOption.d.ts +128 -0
- package/dist/messages/en/styleOption.d.ts.map +1 -0
- package/dist/messages/en/styleOption.js +127 -0
- package/dist/messages/en/styleSection.d.ts +16 -0
- package/dist/messages/en/styleSection.d.ts.map +1 -0
- package/dist/messages/en/styleSection.js +15 -0
- package/dist/messages/en/toast.d.ts +22 -0
- package/dist/messages/en/toast.d.ts.map +1 -0
- package/dist/messages/en/toast.js +21 -0
- package/dist/messages/en/toolbar.d.ts +47 -0
- package/dist/messages/en/toolbar.d.ts.map +1 -0
- package/dist/messages/en/toolbar.js +46 -0
- package/dist/messages/en/translation.d.ts +7 -0
- package/dist/messages/en/translation.d.ts.map +1 -0
- package/dist/messages/en/translation.js +6 -0
- package/dist/messages/en/ui.d.ts +4 -0
- package/dist/messages/en/ui.d.ts.map +1 -0
- package/dist/messages/en/ui.js +3 -0
- package/dist/messages/en/values.d.ts +45 -0
- package/dist/messages/en/values.d.ts.map +1 -0
- package/dist/messages/en/values.js +44 -0
- package/dist/messages/en.d.ts +1298 -202
- package/dist/messages/en.d.ts.map +1 -1
- package/dist/messages/en.js +82 -330
- package/dist/messages/index.d.ts +12 -0
- package/dist/messages/index.d.ts.map +1 -1
- package/dist/messages/index.js +28 -1
- package/dist/messages/pl/app.d.ts +8 -0
- package/dist/messages/pl/app.d.ts.map +1 -0
- package/dist/messages/pl/app.js +7 -0
- package/dist/messages/pl/blocks.d.ts +54 -0
- package/dist/messages/pl/blocks.d.ts.map +1 -0
- package/dist/messages/pl/blocks.js +53 -0
- package/dist/messages/pl/canvas.d.ts +31 -0
- package/dist/messages/pl/canvas.d.ts.map +1 -0
- package/dist/messages/pl/canvas.js +30 -0
- package/dist/messages/pl/clipboard.d.ts +13 -0
- package/dist/messages/pl/clipboard.d.ts.map +1 -0
- package/dist/messages/pl/clipboard.js +12 -0
- package/dist/messages/pl/colorPicker.d.ts +20 -0
- package/dist/messages/pl/colorPicker.d.ts.map +1 -0
- package/dist/messages/pl/colorPicker.js +19 -0
- package/dist/messages/pl/componentLabels.d.ts +9 -0
- package/dist/messages/pl/componentLabels.d.ts.map +1 -0
- package/dist/messages/pl/componentLabels.js +308 -0
- package/dist/messages/pl/diagnostics.d.ts +39 -0
- package/dist/messages/pl/diagnostics.d.ts.map +1 -0
- package/dist/messages/pl/diagnostics.js +38 -0
- package/dist/messages/pl/dialogs/common.d.ts +6 -0
- package/dist/messages/pl/dialogs/common.d.ts.map +1 -0
- package/dist/messages/pl/dialogs/common.js +5 -0
- package/dist/messages/pl/dialogs/conflict.d.ts +15 -0
- package/dist/messages/pl/dialogs/conflict.d.ts.map +1 -0
- package/dist/messages/pl/dialogs/conflict.js +14 -0
- package/dist/messages/pl/dialogs/delete.d.ts +19 -0
- package/dist/messages/pl/dialogs/delete.d.ts.map +1 -0
- package/dist/messages/pl/dialogs/delete.js +18 -0
- package/dist/messages/pl/dialogs/pageOptions.d.ts +9 -0
- package/dist/messages/pl/dialogs/pageOptions.d.ts.map +1 -0
- package/dist/messages/pl/dialogs/pageOptions.js +8 -0
- package/dist/messages/pl/dialogs/publish.d.ts +15 -0
- package/dist/messages/pl/dialogs/publish.d.ts.map +1 -0
- package/dist/messages/pl/dialogs/publish.js +14 -0
- package/dist/messages/pl/dnd.d.ts +19 -0
- package/dist/messages/pl/dnd.d.ts.map +1 -0
- package/dist/messages/pl/dnd.js +18 -0
- package/dist/messages/pl/editor.d.ts +30 -0
- package/dist/messages/pl/editor.d.ts.map +1 -0
- package/dist/messages/pl/editor.js +29 -0
- package/dist/messages/pl/external.d.ts +6 -0
- package/dist/messages/pl/external.d.ts.map +1 -0
- package/dist/messages/pl/external.js +5 -0
- package/dist/messages/pl/insert.d.ts +25 -0
- package/dist/messages/pl/insert.d.ts.map +1 -0
- package/dist/messages/pl/insert.js +24 -0
- package/dist/messages/pl/inspector.d.ts +176 -0
- package/dist/messages/pl/inspector.d.ts.map +1 -0
- package/dist/messages/pl/inspector.js +175 -0
- package/dist/messages/pl/issues.d.ts +36 -0
- package/dist/messages/pl/issues.d.ts.map +1 -0
- package/dist/messages/pl/issues.js +35 -0
- package/dist/messages/pl/layers.d.ts +29 -0
- package/dist/messages/pl/layers.d.ts.map +1 -0
- package/dist/messages/pl/layers.js +28 -0
- package/dist/messages/pl/leftPanel.d.ts +15 -0
- package/dist/messages/pl/leftPanel.d.ts.map +1 -0
- package/dist/messages/pl/leftPanel.js +14 -0
- package/dist/messages/pl/list.d.ts +9 -0
- package/dist/messages/pl/list.d.ts.map +1 -0
- package/dist/messages/pl/list.js +8 -0
- package/dist/messages/pl/locale.d.ts +4 -0
- package/dist/messages/pl/locale.d.ts.map +1 -0
- package/dist/messages/pl/locale.js +3 -0
- package/dist/messages/pl/media.d.ts +51 -0
- package/dist/messages/pl/media.d.ts.map +1 -0
- package/dist/messages/pl/media.js +50 -0
- package/dist/messages/pl/menu.d.ts +12 -0
- package/dist/messages/pl/menu.d.ts.map +1 -0
- package/dist/messages/pl/menu.js +11 -0
- package/dist/messages/pl/patterns.d.ts +24 -0
- package/dist/messages/pl/patterns.d.ts.map +1 -0
- package/dist/messages/pl/patterns.js +23 -0
- package/dist/messages/pl/preview.d.ts +8 -0
- package/dist/messages/pl/preview.d.ts.map +1 -0
- package/dist/messages/pl/preview.js +7 -0
- package/dist/messages/pl/publish.d.ts +19 -0
- package/dist/messages/pl/publish.d.ts.map +1 -0
- package/dist/messages/pl/publish.js +18 -0
- package/dist/messages/pl/richText.d.ts +21 -0
- package/dist/messages/pl/richText.d.ts.map +1 -0
- package/dist/messages/pl/richText.js +20 -0
- package/dist/messages/pl/sample.d.ts +5 -0
- package/dist/messages/pl/sample.d.ts.map +1 -0
- package/dist/messages/pl/sample.js +4 -0
- package/dist/messages/pl/save.d.ts +15 -0
- package/dist/messages/pl/save.d.ts.map +1 -0
- package/dist/messages/pl/save.js +14 -0
- package/dist/messages/pl/shortcut.d.ts +36 -0
- package/dist/messages/pl/shortcut.d.ts.map +1 -0
- package/dist/messages/pl/shortcut.js +35 -0
- package/dist/messages/pl/statusBar.d.ts +14 -0
- package/dist/messages/pl/statusBar.d.ts.map +1 -0
- package/dist/messages/pl/statusBar.js +13 -0
- package/dist/messages/pl/structure.d.ts +28 -0
- package/dist/messages/pl/structure.d.ts.map +1 -0
- package/dist/messages/pl/structure.js +27 -0
- package/dist/messages/pl/style.d.ts +168 -0
- package/dist/messages/pl/style.d.ts.map +1 -0
- package/dist/messages/pl/style.js +167 -0
- package/dist/messages/pl/styleField.d.ts +301 -0
- package/dist/messages/pl/styleField.d.ts.map +1 -0
- package/dist/messages/pl/styleField.js +300 -0
- package/dist/messages/pl/styleOption.d.ts +128 -0
- package/dist/messages/pl/styleOption.d.ts.map +1 -0
- package/dist/messages/pl/styleOption.js +127 -0
- package/dist/messages/pl/styleSection.d.ts +16 -0
- package/dist/messages/pl/styleSection.d.ts.map +1 -0
- package/dist/messages/pl/styleSection.js +15 -0
- package/dist/messages/pl/toast.d.ts +22 -0
- package/dist/messages/pl/toast.d.ts.map +1 -0
- package/dist/messages/pl/toast.js +21 -0
- package/dist/messages/pl/toolbar.d.ts +47 -0
- package/dist/messages/pl/toolbar.d.ts.map +1 -0
- package/dist/messages/pl/toolbar.js +46 -0
- package/dist/messages/pl/translation.d.ts +7 -0
- package/dist/messages/pl/translation.d.ts.map +1 -0
- package/dist/messages/pl/translation.js +6 -0
- package/dist/messages/pl/ui.d.ts +4 -0
- package/dist/messages/pl/ui.d.ts.map +1 -0
- package/dist/messages/pl/ui.js +3 -0
- package/dist/messages/pl/values.d.ts +45 -0
- package/dist/messages/pl/values.d.ts.map +1 -0
- package/dist/messages/pl/values.js +44 -0
- package/dist/messages/pl.d.ts.map +1 -1
- package/dist/messages/pl.js +82 -325
- package/dist/messages/plural.test.d.ts +2 -0
- package/dist/messages/plural.test.d.ts.map +1 -0
- package/dist/messages/plural.test.js +50 -0
- package/dist/panels/breadcrumbs/breadcrumbs.d.ts +1 -1
- package/dist/panels/breadcrumbs/breadcrumbs.d.ts.map +1 -1
- package/dist/panels/breadcrumbs/breadcrumbs.js +10 -3
- package/dist/panels/breadcrumbs/breadcrumbs.test.js +9 -2
- package/dist/panels/index.d.ts +3 -0
- package/dist/panels/index.d.ts.map +1 -1
- package/dist/panels/index.js +1 -0
- package/dist/panels/insert/catalog.d.ts +21 -1
- package/dist/panels/insert/catalog.d.ts.map +1 -1
- package/dist/panels/insert/catalog.js +85 -3
- package/dist/panels/insert/catalog.order.test.js +106 -1
- package/dist/panels/insert/index.d.ts +1 -0
- package/dist/panels/insert/index.d.ts.map +1 -1
- package/dist/panels/insert/insert-panel.d.ts +14 -4
- package/dist/panels/insert/insert-panel.d.ts.map +1 -1
- package/dist/panels/insert/insert-panel.js +128 -69
- package/dist/panels/insert/insert-panel.test.js +278 -37
- package/dist/panels/insert/target.d.ts +5 -1
- package/dist/panels/insert/target.d.ts.map +1 -1
- package/dist/panels/insert/target.js +11 -1
- package/dist/panels/inspector/author-fields.d.ts +21 -0
- package/dist/panels/inspector/author-fields.d.ts.map +1 -0
- package/dist/panels/inspector/author-fields.js +191 -0
- package/dist/panels/inspector/author-fields.test.d.ts +2 -0
- package/dist/panels/inspector/author-fields.test.d.ts.map +1 -0
- package/dist/panels/inspector/author-fields.test.js +237 -0
- package/dist/panels/inspector/controls/external-link.d.ts +24 -0
- package/dist/panels/inspector/controls/external-link.d.ts.map +1 -0
- package/dist/panels/inspector/controls/external-link.js +43 -0
- package/dist/panels/inspector/controls/external-link.test.d.ts +2 -0
- package/dist/panels/inspector/controls/external-link.test.d.ts.map +1 -0
- package/dist/panels/inspector/controls/external-link.test.js +105 -0
- package/dist/panels/inspector/controls/index.d.ts +1 -0
- package/dist/panels/inspector/controls/index.d.ts.map +1 -1
- package/dist/panels/inspector/controls/index.js +1 -0
- package/dist/panels/inspector/controls/media.d.ts +3 -1
- package/dist/panels/inspector/controls/media.d.ts.map +1 -1
- package/dist/panels/inspector/controls/media.js +8 -3
- package/dist/panels/inspector/controls/rich-text.d.ts.map +1 -1
- package/dist/panels/inspector/controls/rich-text.js +36 -6
- package/dist/panels/inspector/controls/textarea.d.ts +7 -2
- package/dist/panels/inspector/controls/textarea.d.ts.map +1 -1
- package/dist/panels/inspector/controls/textarea.js +37 -2
- package/dist/panels/inspector/default-hint.d.ts +13 -0
- package/dist/panels/inspector/default-hint.d.ts.map +1 -0
- package/dist/panels/inspector/default-hint.js +30 -0
- package/dist/panels/inspector/default-hint.test.d.ts +2 -0
- package/dist/panels/inspector/default-hint.test.d.ts.map +1 -0
- package/dist/panels/inspector/default-hint.test.js +46 -0
- package/dist/panels/inspector/index.d.ts +3 -3
- package/dist/panels/inspector/index.d.ts.map +1 -1
- package/dist/panels/inspector/index.js +2 -2
- package/dist/panels/inspector/inspector.d.ts +20 -2
- package/dist/panels/inspector/inspector.d.ts.map +1 -1
- package/dist/panels/inspector/inspector.js +246 -26
- package/dist/panels/inspector/inspector.test.js +276 -11
- package/dist/panels/inspector/props-panel.d.ts +36 -0
- package/dist/panels/inspector/props-panel.d.ts.map +1 -1
- package/dist/panels/inspector/props-panel.js +99 -17
- package/dist/panels/inspector/props-panel.test.d.ts +2 -0
- package/dist/panels/inspector/props-panel.test.d.ts.map +1 -0
- package/dist/panels/inspector/props-panel.test.js +17 -0
- package/dist/panels/inspector/scrub-label.d.ts +14 -0
- package/dist/panels/inspector/scrub-label.d.ts.map +1 -0
- package/dist/panels/inspector/scrub-label.js +75 -0
- package/dist/panels/inspector/scrub-label.test.d.ts +2 -0
- package/dist/panels/inspector/scrub-label.test.d.ts.map +1 -0
- package/dist/panels/inspector/scrub-label.test.js +132 -0
- package/dist/panels/inspector/styles/background-media.d.ts +28 -0
- package/dist/panels/inspector/styles/background-media.d.ts.map +1 -0
- package/dist/panels/inspector/styles/background-media.js +78 -0
- package/dist/panels/inspector/styles/box-model.d.ts +13 -16
- package/dist/panels/inspector/styles/box-model.d.ts.map +1 -1
- package/dist/panels/inspector/styles/box-model.js +10 -25
- package/dist/panels/inspector/styles/color-input.d.ts +3 -0
- package/dist/panels/inspector/styles/color-input.d.ts.map +1 -0
- package/dist/panels/inspector/styles/color-input.js +72 -0
- package/dist/panels/inspector/styles/gradient-fields.d.ts +9 -0
- package/dist/panels/inspector/styles/gradient-fields.d.ts.map +1 -0
- package/dist/panels/inspector/styles/gradient-fields.js +50 -0
- package/dist/panels/inspector/styles/index.d.ts +2 -0
- package/dist/panels/inspector/styles/index.d.ts.map +1 -1
- package/dist/panels/inspector/styles/index.js +2 -0
- package/dist/panels/inspector/styles/model.d.ts +27 -5
- package/dist/panels/inspector/styles/model.d.ts.map +1 -1
- package/dist/panels/inspector/styles/model.js +101 -3
- package/dist/panels/inspector/styles/motion-rows.d.ts +17 -0
- package/dist/panels/inspector/styles/motion-rows.d.ts.map +1 -0
- package/dist/panels/inspector/styles/motion-rows.js +117 -0
- package/dist/panels/inspector/styles/number-input.d.ts +4 -0
- package/dist/panels/inspector/styles/number-input.d.ts.map +1 -0
- package/dist/panels/inspector/styles/number-input.js +12 -0
- package/dist/panels/inspector/styles/option-label.d.ts +7 -0
- package/dist/panels/inspector/styles/option-label.d.ts.map +1 -0
- package/dist/panels/inspector/styles/option-label.js +9 -0
- package/dist/panels/inspector/styles/property-label.d.ts +9 -0
- package/dist/panels/inspector/styles/property-label.d.ts.map +1 -0
- package/dist/panels/inspector/styles/property-label.js +11 -0
- package/dist/panels/inspector/styles/section-state.d.ts +22 -0
- package/dist/panels/inspector/styles/section-state.d.ts.map +1 -0
- package/dist/panels/inspector/styles/section-state.js +96 -0
- package/dist/panels/inspector/styles/section.d.ts +25 -0
- package/dist/panels/inspector/styles/section.d.ts.map +1 -0
- package/dist/panels/inspector/styles/section.js +43 -0
- package/dist/panels/inspector/styles/sections-context.d.ts +13 -0
- package/dist/panels/inspector/styles/sections-context.d.ts.map +1 -0
- package/dist/panels/inspector/styles/sections-context.js +19 -0
- package/dist/panels/inspector/styles/sections-context.test.d.ts +2 -0
- package/dist/panels/inspector/styles/sections-context.test.d.ts.map +1 -0
- package/dist/panels/inspector/styles/sections-context.test.js +18 -0
- package/dist/panels/inspector/styles/sections-toggle.d.ts +6 -0
- package/dist/panels/inspector/styles/sections-toggle.d.ts.map +1 -0
- package/dist/panels/inspector/styles/sections-toggle.js +18 -0
- package/dist/panels/inspector/styles/segments.d.ts +3 -0
- package/dist/panels/inspector/styles/segments.d.ts.map +1 -1
- package/dist/panels/inspector/styles/segments.js +11 -4
- package/dist/panels/inspector/styles/sides-editor.d.ts +1 -1
- package/dist/panels/inspector/styles/sides-editor.d.ts.map +1 -1
- package/dist/panels/inspector/styles/sides-editor.js +33 -4
- package/dist/panels/inspector/styles/style-inspector.d.ts +3 -1
- package/dist/panels/inspector/styles/style-inspector.d.ts.map +1 -1
- package/dist/panels/inspector/styles/style-inspector.js +610 -42
- package/dist/panels/inspector/styles/style-inspector.test.js +694 -14
- package/dist/panels/inspector/styles/token-picker.d.ts +1 -1
- package/dist/panels/inspector/styles/token-picker.d.ts.map +1 -1
- package/dist/panels/inspector/styles/token-picker.js +10 -3
- package/dist/panels/inspector/styles/widgets.d.ts +116 -0
- package/dist/panels/inspector/styles/widgets.d.ts.map +1 -0
- package/dist/panels/inspector/styles/widgets.js +304 -0
- package/dist/panels/inspector/styles/widgets.test.d.ts +2 -0
- package/dist/panels/inspector/styles/widgets.test.d.ts.map +1 -0
- package/dist/panels/inspector/styles/widgets.test.js +247 -0
- package/dist/panels/inspector/values/value-editor.d.ts +1 -1
- package/dist/panels/inspector/values/value-editor.d.ts.map +1 -1
- package/dist/panels/inspector/values/value-editor.js +9 -8
- package/dist/panels/inspector/values/values.test.js +9 -3
- package/dist/panels/issues/collect.d.ts +2 -0
- package/dist/panels/issues/collect.d.ts.map +1 -1
- package/dist/panels/issues/collect.js +1 -0
- package/dist/panels/issues/index.d.ts +1 -0
- package/dist/panels/issues/index.d.ts.map +1 -1
- package/dist/panels/issues/index.js +1 -0
- package/dist/panels/issues/issues-panel.d.ts +4 -3
- package/dist/panels/issues/issues-panel.d.ts.map +1 -1
- package/dist/panels/issues/issues-panel.js +22 -35
- package/dist/panels/issues/path.d.ts +7 -0
- package/dist/panels/issues/path.d.ts.map +1 -0
- package/dist/panels/issues/path.js +21 -0
- package/dist/panels/layers/flatten.d.ts +16 -2
- package/dist/panels/layers/flatten.d.ts.map +1 -1
- package/dist/panels/layers/flatten.js +48 -4
- package/dist/panels/layers/layers-panel.d.ts +5 -2
- package/dist/panels/layers/layers-panel.d.ts.map +1 -1
- package/dist/panels/layers/layers-panel.js +177 -35
- package/dist/panels/layers/layers-panel.test.js +173 -15
- package/dist/panels/left-panel.d.ts +17 -0
- package/dist/panels/left-panel.d.ts.map +1 -0
- package/dist/panels/left-panel.js +47 -0
- package/dist/panels/left-panel.test.d.ts +2 -0
- package/dist/panels/left-panel.test.d.ts.map +1 -0
- package/dist/panels/left-panel.test.js +77 -0
- package/dist/persistence/persistence.test.js +9 -3
- package/dist/persistence/react.d.ts.map +1 -1
- package/dist/persistence/react.js +2 -2
- package/dist/preview/preview.d.ts +8 -0
- package/dist/preview/preview.d.ts.map +1 -1
- package/dist/preview/preview.js +21 -1
- package/dist/preview/preview.test.js +18 -1
- package/dist/shortcuts/actions.d.ts +13 -2
- package/dist/shortcuts/actions.d.ts.map +1 -1
- package/dist/shortcuts/actions.js +70 -15
- package/dist/shortcuts/help.d.ts +11 -0
- package/dist/shortcuts/help.d.ts.map +1 -0
- package/dist/shortcuts/help.js +77 -0
- package/dist/shortcuts/index.d.ts +5 -2
- package/dist/shortcuts/index.d.ts.map +1 -1
- package/dist/shortcuts/index.js +3 -1
- package/dist/shortcuts/map.d.ts +1 -1
- package/dist/shortcuts/map.d.ts.map +1 -1
- package/dist/shortcuts/map.js +14 -8
- package/dist/shortcuts/navigation.d.ts +13 -0
- package/dist/shortcuts/navigation.d.ts.map +1 -0
- package/dist/shortcuts/navigation.js +48 -0
- package/dist/shortcuts/shortcuts.d.ts +12 -1
- package/dist/shortcuts/shortcuts.d.ts.map +1 -1
- package/dist/shortcuts/shortcuts.js +61 -14
- package/dist/shortcuts/shortcuts.test.js +206 -5
- package/dist/store/create-store.d.ts.map +1 -1
- package/dist/store/create-store.js +19 -1
- package/dist/store/index.d.ts +4 -1
- package/dist/store/index.d.ts.map +1 -1
- package/dist/store/index.js +3 -1
- package/dist/store/react.d.ts +4 -0
- package/dist/store/react.d.ts.map +1 -1
- package/dist/store/react.js +7 -0
- package/dist/store/store.test.js +24 -0
- package/dist/store/structure-lock.d.ts +16 -0
- package/dist/store/structure-lock.d.ts.map +1 -0
- package/dist/store/structure-lock.js +43 -0
- package/dist/store/structure-lock.test.d.ts +2 -0
- package/dist/store/structure-lock.test.d.ts.map +1 -0
- package/dist/store/structure-lock.test.js +49 -0
- package/dist/store/types.d.ts +9 -0
- package/dist/store/types.d.ts.map +1 -1
- package/dist/store/view.d.ts +20 -0
- package/dist/store/view.d.ts.map +1 -0
- package/dist/store/view.js +17 -0
- package/dist/store/view.test.d.ts +2 -0
- package/dist/store/view.test.d.ts.map +1 -0
- package/dist/store/view.test.js +103 -0
- package/dist/styles/tokens.test.js +88 -9
- package/dist/styles.css +4112 -586
- package/dist/toolbar/brand.d.ts +2 -2
- package/dist/toolbar/brand.d.ts.map +1 -1
- package/dist/toolbar/brand.js +4 -4
- package/dist/toolbar/breakpoint-control.d.ts +4 -0
- package/dist/toolbar/breakpoint-control.d.ts.map +1 -1
- package/dist/toolbar/breakpoint-control.js +11 -4
- package/dist/toolbar/editable-title.d.ts +4 -1
- package/dist/toolbar/editable-title.d.ts.map +1 -1
- package/dist/toolbar/editable-title.js +2 -2
- package/dist/toolbar/editable-title.test.js +10 -0
- package/dist/toolbar/locale-chip.d.ts +10 -0
- package/dist/toolbar/locale-chip.d.ts.map +1 -0
- package/dist/toolbar/locale-chip.js +27 -0
- package/dist/toolbar/locale-switcher.d.ts.map +1 -1
- package/dist/toolbar/locale-switcher.js +4 -1
- package/dist/toolbar/more-menu.d.ts +26 -4
- package/dist/toolbar/more-menu.d.ts.map +1 -1
- package/dist/toolbar/more-menu.js +60 -13
- package/dist/toolbar/page-chip.d.ts +10 -0
- package/dist/toolbar/page-chip.d.ts.map +1 -0
- package/dist/toolbar/page-chip.js +12 -0
- package/dist/toolbar/page-options-dialog.d.ts +16 -0
- package/dist/toolbar/page-options-dialog.d.ts.map +1 -0
- package/dist/toolbar/page-options-dialog.js +13 -0
- package/dist/toolbar/panel-toggles.d.ts +3 -2
- package/dist/toolbar/panel-toggles.d.ts.map +1 -1
- package/dist/toolbar/panel-toggles.js +9 -4
- package/dist/toolbar/publish-dialog.d.ts +3 -0
- package/dist/toolbar/publish-dialog.d.ts.map +1 -1
- package/dist/toolbar/publish-dialog.js +34 -7
- package/dist/toolbar/publish.test.js +63 -19
- package/dist/toolbar/safe-history.d.ts +3 -0
- package/dist/toolbar/safe-history.d.ts.map +1 -0
- package/dist/toolbar/safe-history.js +5 -0
- package/dist/toolbar/sample-picker.d.ts +24 -4
- package/dist/toolbar/sample-picker.d.ts.map +1 -1
- package/dist/toolbar/sample-picker.js +42 -18
- package/dist/toolbar/toolbar-centre.d.ts +3 -11
- package/dist/toolbar/toolbar-centre.d.ts.map +1 -1
- package/dist/toolbar/toolbar-centre.js +4 -5
- package/dist/toolbar/toolbar-left.d.ts +4 -7
- package/dist/toolbar/toolbar-left.d.ts.map +1 -1
- package/dist/toolbar/toolbar-left.js +13 -11
- package/dist/toolbar/toolbar-right.d.ts +21 -6
- package/dist/toolbar/toolbar-right.d.ts.map +1 -1
- package/dist/toolbar/toolbar-right.js +28 -14
- package/dist/toolbar/toolbar.d.ts +23 -17
- package/dist/toolbar/toolbar.d.ts.map +1 -1
- package/dist/toolbar/toolbar.js +28 -11
- package/dist/toolbar/toolbar.test.js +238 -23
- package/dist/toolbar/use-overflow-level.d.ts +2 -1
- package/dist/toolbar/use-overflow-level.d.ts.map +1 -1
- package/dist/toolbar/use-overflow-level.js +9 -3
- package/dist/toolbar/zoom-menu.d.ts +5 -1
- package/dist/toolbar/zoom-menu.d.ts.map +1 -1
- package/dist/toolbar/zoom-menu.js +3 -2
- package/dist/ui/icon.d.ts +53 -0
- package/dist/ui/icon.d.ts.map +1 -1
- package/dist/ui/icon.js +58 -1
- package/dist/ui/icon.test.js +101 -3
- package/dist/ui/index.d.ts +4 -3
- package/dist/ui/index.d.ts.map +1 -1
- package/dist/ui/index.js +3 -2
- package/dist/ui/primitives.d.ts +97 -14
- package/dist/ui/primitives.d.ts.map +1 -1
- package/dist/ui/primitives.js +108 -22
- package/dist/ui/primitives.test.js +204 -3
- package/dist/ui/structure-locked.d.ts +9 -0
- package/dist/ui/structure-locked.d.ts.map +1 -0
- package/dist/ui/structure-locked.js +28 -0
- package/dist/ui/toast.d.ts +3 -1
- package/dist/ui/toast.d.ts.map +1 -1
- package/dist/ui/toast.js +21 -5
- package/dist/ui/toast.test.js +34 -0
- package/package.json +5 -4
|
@@ -1,14 +1,25 @@
|
|
|
1
1
|
import { createIndex } from '@next-buildr/core';
|
|
2
|
+
import { structureLockedIds } from '../store/index.js';
|
|
3
|
+
import { hasDescendants, overlayOpen, parentSelection } from './navigation.js';
|
|
2
4
|
/** The selected nodes that can be acted on: the root is never removed, duplicated or moved. */
|
|
3
5
|
function actionable(store) {
|
|
4
6
|
const { doc, selectedIds } = store.getState();
|
|
5
7
|
return selectedIds.filter((id) => id !== doc.root && Object.hasOwn(doc.nodes, id));
|
|
6
8
|
}
|
|
7
|
-
|
|
9
|
+
/** True (after saying why) when one of the ids is locked for structure: the key is then taken but nothing changes. */
|
|
10
|
+
function refuseLocked(store, ids, notify) {
|
|
11
|
+
if (structureLockedIds(store.getState().doc, ids).length === 0)
|
|
12
|
+
return false;
|
|
13
|
+
notify?.(ids);
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
function moveSelected(store, delta, notify) {
|
|
8
17
|
const ids = actionable(store);
|
|
9
18
|
const [id] = ids;
|
|
10
19
|
if (ids.length !== 1 || id === undefined)
|
|
11
20
|
return false;
|
|
21
|
+
if (refuseLocked(store, ids, notify))
|
|
22
|
+
return true;
|
|
12
23
|
const { doc } = store.getState();
|
|
13
24
|
const index = createIndex(doc);
|
|
14
25
|
const parentId = index.parentOf[id];
|
|
@@ -46,27 +57,71 @@ function selectAll(store) {
|
|
|
46
57
|
* cannot run (nothing selected, a locked node the command refuses) returns `false`, so the key is
|
|
47
58
|
* not swallowed.
|
|
48
59
|
*/
|
|
49
|
-
export function bindEditorActions(registry, store, external = {}) {
|
|
60
|
+
export function bindEditorActions(registry, store, external = {}, host = {}) {
|
|
61
|
+
/**
|
|
62
|
+
* Every shortcut but Escape is left alone while a menu, list or dialog is open: the key belongs to
|
|
63
|
+
* it (Delete must not remove the node behind a dialog, Ctrl+Z is a text field's own undo).
|
|
64
|
+
*/
|
|
65
|
+
const bind = (action, handler) => registry.bind(action, () => (overlayOpen() ? false : handler()));
|
|
66
|
+
/** A UI-only key: not taken (`false`) outside the editor or when the host gave no callback. */
|
|
67
|
+
const ui = (pick) => () => {
|
|
68
|
+
if (host.uiAllowed?.() === false)
|
|
69
|
+
return false;
|
|
70
|
+
const run = pick(host.callbacks?.() ?? {});
|
|
71
|
+
if (run === undefined)
|
|
72
|
+
return false;
|
|
73
|
+
run();
|
|
74
|
+
return true;
|
|
75
|
+
};
|
|
76
|
+
const locked = (ids) => host.onLocked?.()?.(ids);
|
|
77
|
+
const device = (key) => ui((callbacks) => callbacks.setDevice && (() => callbacks.setDevice?.(key)));
|
|
50
78
|
const stops = [
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
79
|
+
bind('edit.undo', () => store.undo().ok),
|
|
80
|
+
bind('edit.redo', () => store.redo().ok),
|
|
81
|
+
bind('edit.duplicate', () => {
|
|
54
82
|
const ids = actionable(store);
|
|
55
|
-
|
|
83
|
+
if (ids.length === 0)
|
|
84
|
+
return false;
|
|
85
|
+
if (refuseLocked(store, ids, locked))
|
|
86
|
+
return true;
|
|
87
|
+
return store.dispatch({ type: 'node.duplicate', payload: { ids } }).ok;
|
|
56
88
|
}),
|
|
57
|
-
|
|
89
|
+
bind('edit.delete', () => {
|
|
58
90
|
const ids = actionable(store);
|
|
59
|
-
|
|
91
|
+
if (ids.length === 0)
|
|
92
|
+
return false;
|
|
93
|
+
if (refuseLocked(store, ids, locked))
|
|
94
|
+
return true;
|
|
95
|
+
const onRemove = host.onRemove?.();
|
|
96
|
+
if (onRemove !== undefined) {
|
|
97
|
+
onRemove({ ids, hasDescendants: hasDescendants(store.getState().doc, ids) });
|
|
98
|
+
return true;
|
|
99
|
+
}
|
|
100
|
+
return store.dispatch({ type: 'node.remove', payload: { ids } }).ok;
|
|
60
101
|
}),
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
102
|
+
bind('node.moveUp', () => moveSelected(store, -1, locked)),
|
|
103
|
+
bind('node.moveDown', () => moveSelected(store, 1, locked)),
|
|
104
|
+
bind('selection.all', () => selectAll(store)),
|
|
105
|
+
// Escape goes up one level and clears at the top level; an open menu or dialog gets it first.
|
|
106
|
+
bind('selection.clear', () => {
|
|
107
|
+
if (overlayOpen())
|
|
108
|
+
return false;
|
|
109
|
+
const { doc, selectedIds } = store.getState();
|
|
110
|
+
if (selectedIds.length === 0)
|
|
66
111
|
return false;
|
|
67
|
-
|
|
112
|
+
const parent = parentSelection(doc, selectedIds);
|
|
113
|
+
if (parent === null)
|
|
114
|
+
store.clearSelection();
|
|
115
|
+
else
|
|
116
|
+
store.select(parent);
|
|
68
117
|
return true;
|
|
69
118
|
}),
|
|
119
|
+
bind('ui.device1', device('1')),
|
|
120
|
+
bind('ui.device2', device('2')),
|
|
121
|
+
bind('ui.device3', device('3')),
|
|
122
|
+
bind('ui.panels', ui((callbacks) => callbacks.togglePanels && (() => callbacks.togglePanels?.()))),
|
|
123
|
+
bind('ui.guides', ui((callbacks) => callbacks.toggleGuides ?? store.view.getState().toggleOutlines)),
|
|
124
|
+
bind('ui.findBlock', ui((callbacks) => callbacks.focusBlockSearch && (() => callbacks.focusBlockSearch?.()))),
|
|
70
125
|
];
|
|
71
126
|
const optional = {
|
|
72
127
|
'edit.copy': external.copy,
|
|
@@ -76,7 +131,7 @@ export function bindEditorActions(registry, store, external = {}) {
|
|
|
76
131
|
};
|
|
77
132
|
for (const [action, handler] of Object.entries(optional)) {
|
|
78
133
|
if (handler !== undefined)
|
|
79
|
-
stops.push(
|
|
134
|
+
stops.push(bind(action, handler));
|
|
80
135
|
}
|
|
81
136
|
return () => {
|
|
82
137
|
for (const stop of stops)
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type Platform } from './keys.ts';
|
|
2
|
+
import type { ShortcutRegistry } from './registry.ts';
|
|
3
|
+
export interface ShortcutsDialogProps {
|
|
4
|
+
readonly open: boolean;
|
|
5
|
+
readonly onOpenChange: (open: boolean) => void;
|
|
6
|
+
readonly registry: ShortcutRegistry;
|
|
7
|
+
readonly platform: Platform;
|
|
8
|
+
}
|
|
9
|
+
/** The shortcuts dialog (`?`): four groups of rows, one `Kbd` per key, and the note for Mac users. */
|
|
10
|
+
export declare function ShortcutsDialog({ open, onOpenChange, registry, platform }: ShortcutsDialogProps): import("react").JSX.Element;
|
|
11
|
+
//# sourceMappingURL=help.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../src/shortcuts/help.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAgB,KAAK,QAAQ,EAAE,MAAM,WAAW,CAAC;AACxD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAqFtD,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC/C,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC;IACpC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;CAC7B;AAED,sGAAsG;AACtG,wBAAgB,eAAe,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,oBAAoB,+BAgC/F"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useT } from '../messages/index.js';
|
|
3
|
+
import { Dialog, Kbd } from '../ui/index.js';
|
|
4
|
+
import { displayCombo } from './keys.js';
|
|
5
|
+
/** The tokens of an action's first combination; `shift` is dropped before `?`, which already implies it. */
|
|
6
|
+
function tokensOf(registry, action) {
|
|
7
|
+
const combo = registry.keysFor(action)[0];
|
|
8
|
+
if (combo === undefined)
|
|
9
|
+
return undefined;
|
|
10
|
+
const parts = combo.split('+');
|
|
11
|
+
return parts.at(-1) === '?' ? ['?'] : parts;
|
|
12
|
+
}
|
|
13
|
+
/** The rows of the help dialog, from the registry (so overrides show) plus the canvas-only keys. */
|
|
14
|
+
function helpGroups(registry) {
|
|
15
|
+
const row = (label, ...actions) => {
|
|
16
|
+
const groups = actions.map((action) => tokensOf(registry, action));
|
|
17
|
+
return groups.every((group) => group !== undefined)
|
|
18
|
+
? { label, groups: groups }
|
|
19
|
+
: undefined;
|
|
20
|
+
};
|
|
21
|
+
const copyPaste = row('shortcut.copyPaste', 'edit.copy', 'edit.paste');
|
|
22
|
+
const device1 = tokensOf(registry, 'ui.device1');
|
|
23
|
+
const device = device1 === undefined
|
|
24
|
+
? undefined
|
|
25
|
+
: { label: 'shortcut.device', groups: [[...device1, '2', '3']] };
|
|
26
|
+
const defined = (rows) => rows.filter((entry) => entry !== undefined);
|
|
27
|
+
return [
|
|
28
|
+
{
|
|
29
|
+
id: 'general',
|
|
30
|
+
title: 'shortcut.group.general',
|
|
31
|
+
rows: defined([
|
|
32
|
+
row('shortcut.save', 'file.save'),
|
|
33
|
+
row('shortcut.undo', 'edit.undo'),
|
|
34
|
+
row('shortcut.redo', 'edit.redo'),
|
|
35
|
+
row('shortcut.findBlock', 'ui.findBlock'),
|
|
36
|
+
row('shortcut.help', 'help.shortcuts'),
|
|
37
|
+
]),
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
id: 'selection',
|
|
41
|
+
title: 'shortcut.group.selection',
|
|
42
|
+
rows: [
|
|
43
|
+
{ label: 'shortcut.selectBlock', groups: [['enter']] },
|
|
44
|
+
...defined([row('shortcut.selectAll', 'selection.all')]),
|
|
45
|
+
...defined([row('shortcut.selectParent', 'selection.clear')]),
|
|
46
|
+
{ label: 'shortcut.nextBlock', groups: [['tab']] },
|
|
47
|
+
{ label: 'shortcut.prevBlock', groups: [['shift', 'tab']] },
|
|
48
|
+
],
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
id: 'edit',
|
|
52
|
+
title: 'shortcut.group.edit',
|
|
53
|
+
rows: defined([
|
|
54
|
+
row('shortcut.duplicate', 'edit.duplicate'),
|
|
55
|
+
row('shortcut.delete', 'edit.delete'),
|
|
56
|
+
copyPaste,
|
|
57
|
+
row('shortcut.cut', 'edit.cut'),
|
|
58
|
+
row('shortcut.moveUp', 'node.moveUp'),
|
|
59
|
+
row('shortcut.moveDown', 'node.moveDown'),
|
|
60
|
+
]),
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
id: 'view',
|
|
64
|
+
title: 'shortcut.group.view',
|
|
65
|
+
rows: defined([
|
|
66
|
+
device,
|
|
67
|
+
row('shortcut.togglePanels', 'ui.panels'),
|
|
68
|
+
row('shortcut.guides', 'ui.guides'),
|
|
69
|
+
]),
|
|
70
|
+
},
|
|
71
|
+
];
|
|
72
|
+
}
|
|
73
|
+
/** The shortcuts dialog (`?`): four groups of rows, one `Kbd` per key, and the note for Mac users. */
|
|
74
|
+
export function ShortcutsDialog({ open, onOpenChange, registry, platform }) {
|
|
75
|
+
const t = useT();
|
|
76
|
+
return (_jsx(Dialog, { open: open, onOpenChange: onOpenChange, title: t('shortcut.title'), wide: true, children: _jsxs("div", { className: "bd-shortcut-help", children: [helpGroups(registry).map((group) => (_jsxs("section", { children: [_jsx("h3", { children: t(group.title) }), _jsx("dl", { children: group.rows.map((entry) => (_jsxs("div", { className: "bd-shortcut-row", children: [_jsx("dt", { children: t(entry.label) }), _jsx("dd", { children: entry.groups.map((keys, at) => (_jsxs("span", { children: [at > 0 ? ' / ' : '', keys.map((token, index) => (_jsx(Kbd, { children: displayCombo(token, platform) }, `${token}-${index}`)))] }, keys.join('+')))) })] }, entry.label))) })] }, group.id))), _jsx("p", { children: t('shortcut.macNote') })] }) }));
|
|
77
|
+
}
|
|
@@ -1,11 +1,14 @@
|
|
|
1
|
-
export type { ExternalActions } from './actions.ts';
|
|
1
|
+
export type { ExternalActions, HostHooks } from './actions.ts';
|
|
2
2
|
export { bindEditorActions } from './actions.ts';
|
|
3
|
+
export type { ShortcutsDialogProps } from './help.tsx';
|
|
4
|
+
export { ShortcutsDialog } from './help.tsx';
|
|
3
5
|
export type { KeyInput, Platform } from './keys.ts';
|
|
4
6
|
export { comboOf, detectPlatform, displayCombo, isTypingTarget, normalizeCombo } from './keys.ts';
|
|
5
7
|
export type { ShortcutDef } from './map.ts';
|
|
6
8
|
export { applyOverrides, DEFAULT_SHORTCUTS } from './map.ts';
|
|
9
|
+
export { descendantCount, hasDescendants, overlayOpen, parentSelection } from './navigation.ts';
|
|
7
10
|
export type { ShortcutHandler, ShortcutRegistry, ShortcutRegistryOptions } from './registry.ts';
|
|
8
11
|
export { createShortcutRegistry } from './registry.ts';
|
|
9
12
|
export type { ShortcutProviderProps } from './shortcuts.tsx';
|
|
10
|
-
export { ShortcutProvider, useForwardedKeys, useOptionalShortcutRegistry, useShortcutHint, useShortcutRegistry, } from './shortcuts.tsx';
|
|
13
|
+
export { ShortcutProvider, useForwardedKeys, useOpenShortcuts, useOptionalShortcutRegistry, useShortcutHint, useShortcutRegistry, } from './shortcuts.tsx';
|
|
11
14
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/shortcuts/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/shortcuts/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,YAAY,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAClG,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAChG,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAChG,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACvD,YAAY,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,2BAA2B,EAC3B,eAAe,EACf,mBAAmB,GACpB,MAAM,iBAAiB,CAAC"}
|
package/dist/shortcuts/index.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
export { bindEditorActions } from './actions.js';
|
|
2
|
+
export { ShortcutsDialog } from './help.js';
|
|
2
3
|
export { comboOf, detectPlatform, displayCombo, isTypingTarget, normalizeCombo } from './keys.js';
|
|
3
4
|
export { applyOverrides, DEFAULT_SHORTCUTS } from './map.js';
|
|
5
|
+
export { descendantCount, hasDescendants, overlayOpen, parentSelection } from './navigation.js';
|
|
4
6
|
export { createShortcutRegistry } from './registry.js';
|
|
5
|
-
export { ShortcutProvider, useForwardedKeys, useOptionalShortcutRegistry, useShortcutHint, useShortcutRegistry, } from './shortcuts.js';
|
|
7
|
+
export { ShortcutProvider, useForwardedKeys, useOpenShortcuts, useOptionalShortcutRegistry, useShortcutHint, useShortcutRegistry, } from './shortcuts.js';
|
package/dist/shortcuts/map.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import type { MessageKey } from '../messages/index.tsx';
|
|
|
2
2
|
export interface ShortcutDef {
|
|
3
3
|
readonly action: string;
|
|
4
4
|
readonly label: MessageKey;
|
|
5
|
-
readonly group: '
|
|
5
|
+
readonly group: 'general' | 'selection' | 'edit' | 'view';
|
|
6
6
|
/** Canonical combinations (`mod+z`); the first is the one the help dialog shows first. */
|
|
7
7
|
readonly keys: readonly string[];
|
|
8
8
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"map.d.ts","sourceRoot":"","sources":["../../src/shortcuts/map.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAGxD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"map.d.ts","sourceRoot":"","sources":["../../src/shortcuts/map.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAGxD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,WAAW,GAAG,MAAM,GAAG,MAAM,CAAC;IAC1D,0FAA0F;IAC1F,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;CAClC;AASD,2EAA2E;AAC3E,eAAO,MAAM,iBAAiB,EAAE,SAAS,WAAW,EAoBnD,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,SAAS,WAAW,EAAE,EAChC,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAC1C,WAAW,EAAE,CAMf"}
|
package/dist/shortcuts/map.js
CHANGED
|
@@ -2,19 +2,25 @@ import { normalizeCombo } from './keys.js';
|
|
|
2
2
|
const def = (action, label, group, ...keys) => ({ action, label, group, keys: keys.map(normalizeCombo) });
|
|
3
3
|
/** The shortcuts of the MVP (docs/editor.md#keyboard-shortcuts-pb-084). */
|
|
4
4
|
export const DEFAULT_SHORTCUTS = [
|
|
5
|
-
def('
|
|
6
|
-
def('edit.
|
|
5
|
+
def('file.save', 'shortcut.save', 'general', 'mod+s'),
|
|
6
|
+
def('edit.undo', 'shortcut.undo', 'general', 'mod+z'),
|
|
7
|
+
def('edit.redo', 'shortcut.redo', 'general', 'mod+shift+z', 'mod+y'),
|
|
8
|
+
def('ui.findBlock', 'shortcut.findBlock', 'general', '/'),
|
|
9
|
+
def('help.shortcuts', 'shortcut.help', 'general', 'shift+?'),
|
|
10
|
+
def('selection.clear', 'shortcut.selectParent', 'selection', 'escape'),
|
|
11
|
+
def('selection.all', 'shortcut.selectAll', 'selection', 'mod+a'),
|
|
12
|
+
def('edit.duplicate', 'shortcut.duplicate', 'edit', 'mod+d'),
|
|
13
|
+
def('edit.delete', 'shortcut.delete', 'edit', 'delete', 'backspace'),
|
|
7
14
|
def('edit.copy', 'shortcut.copy', 'edit', 'mod+c'),
|
|
8
15
|
def('edit.cut', 'shortcut.cut', 'edit', 'mod+x'),
|
|
9
16
|
def('edit.paste', 'shortcut.paste', 'edit', 'mod+v'),
|
|
10
|
-
def('edit.duplicate', 'shortcut.duplicate', 'edit', 'mod+d'),
|
|
11
|
-
def('edit.delete', 'shortcut.delete', 'edit', 'delete', 'backspace'),
|
|
12
17
|
def('node.moveUp', 'shortcut.moveUp', 'edit', 'alt+arrowup'),
|
|
13
18
|
def('node.moveDown', 'shortcut.moveDown', 'edit', 'alt+arrowdown'),
|
|
14
|
-
def('
|
|
15
|
-
def('
|
|
16
|
-
def('
|
|
17
|
-
def('
|
|
19
|
+
def('ui.device1', 'shortcut.device', 'view', 'mod+1'),
|
|
20
|
+
def('ui.device2', 'shortcut.device', 'view', 'mod+2'),
|
|
21
|
+
def('ui.device3', 'shortcut.device', 'view', 'mod+3'),
|
|
22
|
+
def('ui.panels', 'shortcut.togglePanels', 'view', 'mod+.'),
|
|
23
|
+
def('ui.guides', 'shortcut.guides', 'view', 'mod+shift+o'),
|
|
18
24
|
];
|
|
19
25
|
/**
|
|
20
26
|
* The map with the host's overrides applied (`config.shortcuts`, by action id): an override
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { BuilderDocument, NodeId } from '@next-buildr/core';
|
|
2
|
+
/**
|
|
3
|
+
* What Escape selects: the parent of the first selected node, or `null` when the selection should
|
|
4
|
+
* be cleared instead (nothing selected, the node is at the top level, or it is not in the
|
|
5
|
+
* document). The page root is never selected this way.
|
|
6
|
+
*/
|
|
7
|
+
export declare function parentSelection(doc: BuilderDocument, selectedIds: readonly NodeId[]): NodeId | null;
|
|
8
|
+
/** How many nodes lie below `ids` (their own descendants, each counted once; `ids` excluded). */
|
|
9
|
+
export declare function descendantCount(doc: BuilderDocument, ids: readonly NodeId[]): number;
|
|
10
|
+
export declare const hasDescendants: (doc: BuilderDocument, ids: readonly NodeId[]) => boolean;
|
|
11
|
+
/** Whether a menu, list, popover or dialog is open: a key then belongs to it (Escape closes it). */
|
|
12
|
+
export declare function overlayOpen(scope?: ParentNode): boolean;
|
|
13
|
+
//# sourceMappingURL=navigation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"navigation.d.ts","sourceRoot":"","sources":["../../src/shortcuts/navigation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEjE;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,eAAe,EACpB,WAAW,EAAE,SAAS,MAAM,EAAE,GAC7B,MAAM,GAAG,IAAI,CAQf;AAED,iGAAiG;AACjG,wBAAgB,eAAe,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAgBpF;AAED,eAAO,MAAM,cAAc,QAAS,eAAe,OAAO,SAAS,MAAM,EAAE,KAAG,OAC/C,CAAC;AAShC,oGAAoG;AACpG,wBAAgB,WAAW,CAAC,KAAK,GAAE,UAAqB,GAAG,OAAO,CAEjE"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What Escape selects: the parent of the first selected node, or `null` when the selection should
|
|
3
|
+
* be cleared instead (nothing selected, the node is at the top level, or it is not in the
|
|
4
|
+
* document). The page root is never selected this way.
|
|
5
|
+
*/
|
|
6
|
+
export function parentSelection(doc, selectedIds) {
|
|
7
|
+
const [first] = selectedIds;
|
|
8
|
+
if (first === undefined || first === doc.root)
|
|
9
|
+
return null;
|
|
10
|
+
for (const [id, node] of Object.entries(doc.nodes)) {
|
|
11
|
+
if (id === doc.root)
|
|
12
|
+
continue;
|
|
13
|
+
if (Object.values(node.slots ?? {}).some((children) => children.includes(first)))
|
|
14
|
+
return id;
|
|
15
|
+
}
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
/** How many nodes lie below `ids` (their own descendants, each counted once; `ids` excluded). */
|
|
19
|
+
export function descendantCount(doc, ids) {
|
|
20
|
+
const own = new Set(ids);
|
|
21
|
+
const seen = new Set();
|
|
22
|
+
const stack = [...ids];
|
|
23
|
+
while (stack.length > 0) {
|
|
24
|
+
const id = stack.pop();
|
|
25
|
+
if (id === undefined)
|
|
26
|
+
continue;
|
|
27
|
+
for (const children of Object.values(doc.nodes[id]?.slots ?? {})) {
|
|
28
|
+
for (const child of children) {
|
|
29
|
+
if (seen.has(child) || own.has(child) || !Object.hasOwn(doc.nodes, child))
|
|
30
|
+
continue;
|
|
31
|
+
seen.add(child);
|
|
32
|
+
stack.push(child);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return seen.size;
|
|
37
|
+
}
|
|
38
|
+
export const hasDescendants = (doc, ids) => descendantCount(doc, ids) > 0;
|
|
39
|
+
const OVERLAY_SELECTOR = [
|
|
40
|
+
'[role="menu"][data-state="open"]',
|
|
41
|
+
'[role="listbox"][data-state="open"]',
|
|
42
|
+
'[role="dialog"][data-state="open"]',
|
|
43
|
+
'[role="alertdialog"][data-state="open"]',
|
|
44
|
+
].join(', ');
|
|
45
|
+
/** Whether a menu, list, popover or dialog is open: a key then belongs to it (Escape closes it). */
|
|
46
|
+
export function overlayOpen(scope = document) {
|
|
47
|
+
return scope.querySelector(OVERLAY_SELECTOR) !== null;
|
|
48
|
+
}
|
|
@@ -1,7 +1,14 @@
|
|
|
1
1
|
import { type ReactNode } from 'react';
|
|
2
|
+
import type { RemoveRequest, ShortcutCallbacks } from '../app/contracts.ts';
|
|
2
3
|
import { type ExternalActions } from './actions.ts';
|
|
3
4
|
import { type KeyInput, type Platform } from './keys.ts';
|
|
4
5
|
import { type ShortcutRegistry } from './registry.ts';
|
|
6
|
+
/**
|
|
7
|
+
* Opens the shortcuts dialog directly (the host's `openShortcuts` callback, else the built-in
|
|
8
|
+
* dialog), without going through a key combination another action may have taken. `undefined`
|
|
9
|
+
* outside a `<ShortcutProvider>`.
|
|
10
|
+
*/
|
|
11
|
+
export declare function useOpenShortcuts(): (() => void) | undefined;
|
|
5
12
|
/** The registry of the enclosing `<ShortcutProvider>`, or `undefined` outside one (a toolbar shown without shortcuts). */
|
|
6
13
|
export declare function useOptionalShortcutRegistry(): ShortcutRegistry | undefined;
|
|
7
14
|
/** The registry of the enclosing `<ShortcutProvider>`, for modules that bind actions of their own. */
|
|
@@ -18,6 +25,10 @@ export interface ShortcutProviderProps {
|
|
|
18
25
|
/** The actions other modules provide: clipboard (PB-085) and save (PB-087). */
|
|
19
26
|
readonly actions?: ExternalActions;
|
|
20
27
|
readonly platform?: Platform;
|
|
28
|
+
/** The shortcuts that change only the UI (device, panels, outlines, search, help); missing ones do nothing. */
|
|
29
|
+
readonly callbacks?: Partial<ShortcutCallbacks>;
|
|
30
|
+
/** Called instead of removing on Delete/Backspace, so the host can confirm or offer Undo. */
|
|
31
|
+
readonly onRemove?: (request: RemoveRequest) => void;
|
|
21
32
|
readonly children: ReactNode;
|
|
22
33
|
}
|
|
23
34
|
/**
|
|
@@ -26,7 +37,7 @@ export interface ShortcutProviderProps {
|
|
|
26
37
|
* A key press whose focus is in a text field is never handled, and a handled one gets
|
|
27
38
|
* `preventDefault`, so the browser does not also act on it.
|
|
28
39
|
*/
|
|
29
|
-
export declare function ShortcutProvider({ overrides, actions, platform, children, }: ShortcutProviderProps): import("react").JSX.Element;
|
|
40
|
+
export declare function ShortcutProvider({ overrides, actions, platform, callbacks, onRemove, children, }: ShortcutProviderProps): import("react").JSX.Element;
|
|
30
41
|
/** How the first key of `action` is written on this platform (`Ctrl+Z`), for tooltips; `undefined` when it has none. */
|
|
31
42
|
export declare function useShortcutHint(action: string): string | undefined;
|
|
32
43
|
//# sourceMappingURL=shortcuts.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shortcuts.d.ts","sourceRoot":"","sources":["../../src/shortcuts/shortcuts.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,SAAS,
|
|
1
|
+
{"version":3,"file":"shortcuts.d.ts","sourceRoot":"","sources":["../../src/shortcuts/shortcuts.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,SAAS,EAOf,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAG5E,OAAO,EAAqB,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAEvE,OAAO,EAIL,KAAK,QAAQ,EACb,KAAK,QAAQ,EACd,MAAM,WAAW,CAAC;AAEnB,OAAO,EAA0B,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAK9E;;;;GAIG;AACH,wBAAgB,gBAAgB,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAE3D;AAeD,0HAA0H;AAC1H,wBAAgB,2BAA2B,IAAI,gBAAgB,GAAG,SAAS,CAE1E;AAED,sGAAsG;AACtG,wBAAgB,mBAAmB,IAAI,gBAAgB,CAMtD;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,IAAI,CAAC,KAAK,EAAE,QAAQ,KAAK,OAAO,CAG/D;AAED,MAAM,WAAW,qBAAqB;IACpC,mDAAmD;IACnD,QAAQ,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACtD,+EAA+E;IAC/E,QAAQ,CAAC,OAAO,CAAC,EAAE,eAAe,CAAC;IACnC,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAC7B,+GAA+G;IAC/G,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAChD,6FAA6F;IAC7F,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,CAAC;IACrD,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC;CAC9B;AAOD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,SAAS,EACT,OAAO,EACP,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,QAAQ,GACT,EAAE,qBAAqB,+BAwFvB;AAED,wHAAwH;AACxH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAMlE"}
|
|
@@ -1,12 +1,33 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { createContext, useContext, useEffect, useMemo, useRef, useState, } from 'react';
|
|
3
|
-
import { useT } from '../messages/index.js';
|
|
2
|
+
import { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState, } from 'react';
|
|
4
3
|
import { useEditor } from '../store/index.js';
|
|
5
|
-
import {
|
|
4
|
+
import { useStructureLockedNotice } from '../ui/structure-locked.js';
|
|
6
5
|
import { bindEditorActions } from './actions.js';
|
|
6
|
+
import { ShortcutsDialog } from './help.js';
|
|
7
7
|
import { detectPlatform, displayCombo, isTypingTarget, } from './keys.js';
|
|
8
|
+
import { overlayOpen } from './navigation.js';
|
|
8
9
|
import { createShortcutRegistry } from './registry.js';
|
|
9
10
|
const RegistryContext = createContext(undefined);
|
|
11
|
+
const OpenShortcutsContext = createContext(undefined);
|
|
12
|
+
/**
|
|
13
|
+
* Opens the shortcuts dialog directly (the host's `openShortcuts` callback, else the built-in
|
|
14
|
+
* dialog), without going through a key combination another action may have taken. `undefined`
|
|
15
|
+
* outside a `<ShortcutProvider>`.
|
|
16
|
+
*/
|
|
17
|
+
export function useOpenShortcuts() {
|
|
18
|
+
return useContext(OpenShortcutsContext);
|
|
19
|
+
}
|
|
20
|
+
const EDITOR_ROOT = '.buildr-editor';
|
|
21
|
+
const OWN_KEYS = '[role="dialog"], [role="alertdialog"], [role="menu"], [role="listbox"]';
|
|
22
|
+
const inOverlay = (target) => target instanceof Element && target.closest(OWN_KEYS) !== null;
|
|
23
|
+
/** Whether a key press is aimed at a control of the host page outside the editor (body and the document are not). */
|
|
24
|
+
function outsideEditor(target) {
|
|
25
|
+
if (!(target instanceof Element))
|
|
26
|
+
return false;
|
|
27
|
+
if (target === document.body || target === document.documentElement)
|
|
28
|
+
return false;
|
|
29
|
+
return target.closest(EDITOR_ROOT) === null;
|
|
30
|
+
}
|
|
10
31
|
/** The registry of the enclosing `<ShortcutProvider>`, or `undefined` outside one (a toolbar shown without shortcuts). */
|
|
11
32
|
export function useOptionalShortcutRegistry() {
|
|
12
33
|
return useContext(RegistryContext);
|
|
@@ -38,24 +59,39 @@ const toInput = (event) => ({
|
|
|
38
59
|
* A key press whose focus is in a text field is never handled, and a handled one gets
|
|
39
60
|
* `preventDefault`, so the browser does not also act on it.
|
|
40
61
|
*/
|
|
41
|
-
export function ShortcutProvider({ overrides, actions, platform, children, }) {
|
|
62
|
+
export function ShortcutProvider({ overrides, actions, platform, callbacks, onRemove, children, }) {
|
|
42
63
|
const store = useEditor();
|
|
43
|
-
const
|
|
64
|
+
const notifyLocked = useStructureLockedNotice();
|
|
44
65
|
const [helpOpen, setHelpOpen] = useState(false);
|
|
45
66
|
const detected = useMemo(() => platform ?? detectPlatform(), [platform]);
|
|
46
67
|
const registry = useMemo(() => createShortcutRegistry({ platform: detected, overrides: overrides ?? {} }), [detected, overrides]);
|
|
47
68
|
// The handlers read the latest actions without rebinding on every render.
|
|
48
69
|
const external = useRef({});
|
|
49
70
|
external.current = actions ?? {};
|
|
71
|
+
const host = useRef({ callbacks, onRemove, notifyLocked });
|
|
72
|
+
host.current = { callbacks, onRemove, notifyLocked };
|
|
73
|
+
// Set while a key press aimed outside the editor is handled: the UI-only keys then stay out of it.
|
|
74
|
+
const outside = useRef(false);
|
|
50
75
|
useEffect(() => {
|
|
51
76
|
const unbind = bindEditorActions(registry, store, {
|
|
52
77
|
copy: () => external.current.copy?.() ?? false,
|
|
53
78
|
cut: () => external.current.cut?.() ?? false,
|
|
54
79
|
paste: () => external.current.paste?.() ?? false,
|
|
55
80
|
save: () => external.current.save?.() ?? false,
|
|
81
|
+
}, {
|
|
82
|
+
callbacks: () => host.current.callbacks,
|
|
83
|
+
onRemove: () => host.current.onRemove,
|
|
84
|
+
uiAllowed: () => !outside.current,
|
|
85
|
+
onLocked: () => host.current.notifyLocked,
|
|
56
86
|
});
|
|
57
87
|
const unbindHelp = registry.bind('help.shortcuts', () => {
|
|
58
|
-
|
|
88
|
+
if (overlayOpen())
|
|
89
|
+
return false;
|
|
90
|
+
const open = host.current.callbacks?.openShortcuts;
|
|
91
|
+
if (open === undefined)
|
|
92
|
+
setHelpOpen(true);
|
|
93
|
+
else
|
|
94
|
+
open();
|
|
59
95
|
return true;
|
|
60
96
|
});
|
|
61
97
|
return () => {
|
|
@@ -70,20 +106,31 @@ export function ShortcutProvider({ overrides, actions, platform, children, }) {
|
|
|
70
106
|
const onKeyDown = (event) => {
|
|
71
107
|
if (event.defaultPrevented || event.isComposing)
|
|
72
108
|
return;
|
|
73
|
-
|
|
109
|
+
// A dialog, menu or list keeps its own keys (Delete, Ctrl+Z); Escape is its own to handle.
|
|
110
|
+
if (inOverlay(event.target))
|
|
111
|
+
return;
|
|
112
|
+
outside.current = outsideEditor(event.target);
|
|
113
|
+
let handled;
|
|
114
|
+
try {
|
|
115
|
+
handled = registry.handle(toInput(event), { typing: isTypingTarget(event.target) });
|
|
116
|
+
}
|
|
117
|
+
finally {
|
|
118
|
+
outside.current = false;
|
|
119
|
+
}
|
|
74
120
|
if (handled)
|
|
75
121
|
event.preventDefault();
|
|
76
122
|
};
|
|
77
123
|
document.addEventListener('keydown', onKeyDown);
|
|
78
124
|
return () => document.removeEventListener('keydown', onKeyDown);
|
|
79
125
|
}, [registry]);
|
|
80
|
-
const
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
126
|
+
const openShortcuts = useCallback(() => {
|
|
127
|
+
const open = host.current.callbacks?.openShortcuts;
|
|
128
|
+
if (open === undefined)
|
|
129
|
+
setHelpOpen(true);
|
|
130
|
+
else
|
|
131
|
+
open();
|
|
132
|
+
}, []);
|
|
133
|
+
return (_jsx(RegistryContext.Provider, { value: registry, children: _jsxs(OpenShortcutsContext.Provider, { value: openShortcuts, children: [children, _jsx(ShortcutsDialog, { open: helpOpen, onOpenChange: setHelpOpen, registry: registry, platform: detected })] }) }));
|
|
87
134
|
}
|
|
88
135
|
/** How the first key of `action` is written on this platform (`Ctrl+Z`), for tooltips; `undefined` when it has none. */
|
|
89
136
|
export function useShortcutHint(action) {
|