@wordpress/block-editor 16.0.1-next.v.202607070741.0 → 16.1.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/CHANGELOG.md +27 -1
- package/README.md +8 -0
- package/build/components/alignment-control/ui.cjs +2 -4
- package/build/components/alignment-control/ui.cjs.map +2 -2
- package/build/components/background-image-control/index.cjs +40 -10
- package/build/components/background-image-control/index.cjs.map +2 -2
- package/build/components/block-alignment-control/ui.cjs +5 -3
- package/build/components/block-alignment-control/ui.cjs.map +2 -2
- package/build/components/block-canvas/index.cjs +6 -1
- package/build/components/block-canvas/index.cjs.map +2 -2
- package/build/components/block-controls/groups.cjs +3 -1
- package/build/components/block-controls/groups.cjs.map +2 -2
- package/build/components/block-edit/edit.cjs +10 -18
- package/build/components/block-edit/edit.cjs.map +2 -2
- package/build/components/block-inspector/index.cjs +73 -46
- package/build/components/block-inspector/index.cjs.map +2 -2
- package/build/components/block-list/block-html.cjs +4 -1
- package/build/components/block-list/block-html.cjs.map +2 -2
- package/build/components/block-list/block.cjs +9 -3
- package/build/components/block-list/block.cjs.map +3 -3
- package/build/components/block-list/index.cjs +1 -3
- package/build/components/block-list/index.cjs.map +2 -2
- package/build/components/block-list/use-block-props/index.cjs +7 -2
- package/build/components/block-list/use-block-props/index.cjs.map +2 -2
- package/build/components/block-list/use-block-props/use-focus-first-element.cjs +9 -4
- package/build/components/block-list/use-block-props/use-focus-first-element.cjs.map +2 -2
- package/build/components/block-list/use-block-props/use-focus-handler.cjs +11 -4
- package/build/components/block-list/use-block-props/use-focus-handler.cjs.map +2 -2
- package/build/components/block-list/use-block-props/use-register-block-event-handlers.cjs +48 -0
- package/build/components/block-list/use-block-props/use-register-block-event-handlers.cjs.map +7 -0
- package/build/components/block-parent-selector/index.cjs +2 -2
- package/build/components/block-parent-selector/index.cjs.map +2 -2
- package/build/components/block-toolbar/index.cjs +43 -24
- package/build/components/block-toolbar/index.cjs.map +2 -2
- package/build/components/block-toolbar/switch-section-style.cjs +4 -2
- package/build/components/block-toolbar/switch-section-style.cjs.map +3 -3
- package/build/components/block-tools/empty-block-inserter.cjs +2 -7
- package/build/components/block-tools/empty-block-inserter.cjs.map +2 -2
- package/build/components/block-tools/index.cjs +7 -2
- package/build/components/block-tools/index.cjs.map +2 -2
- package/build/components/block-vertical-alignment-control/ui.cjs +3 -5
- package/build/components/block-vertical-alignment-control/ui.cjs.map +2 -2
- package/build/components/block-visibility/modal.cjs +20 -6
- package/build/components/block-visibility/modal.cjs.map +2 -2
- package/build/components/block-visibility/use-block-visibility.cjs +16 -6
- package/build/components/block-visibility/use-block-visibility.cjs.map +3 -3
- package/build/components/block-visibility/utils.cjs +15 -2
- package/build/components/block-visibility/utils.cjs.map +3 -3
- package/build/components/block-visibility/viewport-menu-item.cjs +7 -1
- package/build/components/block-visibility/viewport-menu-item.cjs.map +2 -2
- package/build/components/block-visibility/viewport-toolbar.cjs +5 -0
- package/build/components/block-visibility/viewport-toolbar.cjs.map +2 -2
- package/build/components/block-visibility/viewport-visibility-info.cjs +5 -1
- package/build/components/block-visibility/viewport-visibility-info.cjs.map +2 -2
- package/build/components/border-radius-control/utils.cjs +8 -58
- package/build/components/border-radius-control/utils.cjs.map +2 -2
- package/build/components/child-layout-control/index.cjs +0 -4
- package/build/components/child-layout-control/index.cjs.map +2 -2
- package/build/components/colors-gradients/control.cjs +5 -3
- package/build/components/colors-gradients/control.cjs.map +2 -2
- package/build/components/dimension-control/index.cjs +30 -20
- package/build/components/dimension-control/index.cjs.map +3 -3
- package/build/components/dimensions-tool/aspect-ratio-tool.cjs +9 -2
- package/build/components/dimensions-tool/aspect-ratio-tool.cjs.map +3 -3
- package/build/components/editor-styles/index.cjs +9 -1
- package/build/components/editor-styles/index.cjs.map +2 -2
- package/build/components/global-styles/background-panel.cjs +66 -25
- package/build/components/global-styles/background-panel.cjs.map +3 -3
- package/build/components/global-styles/border-panel.cjs +153 -55
- package/build/components/global-styles/border-panel.cjs.map +3 -3
- package/build/components/global-styles/color-gradient-dropdown-item.cjs +46 -14
- package/build/components/global-styles/color-gradient-dropdown-item.cjs.map +3 -3
- package/build/components/global-styles/color-panel.cjs +63 -17
- package/build/components/global-styles/color-panel.cjs.map +2 -2
- package/build/components/global-styles/dimensions-panel.cjs +242 -64
- package/build/components/global-styles/dimensions-panel.cjs.map +3 -3
- package/build/components/global-styles/filters-panel.cjs +59 -20
- package/build/components/global-styles/filters-panel.cjs.map +3 -3
- package/build/components/global-styles/hooks.cjs +4 -1
- package/build/components/global-styles/hooks.cjs.map +2 -2
- package/build/components/global-styles/inheritance/index.cjs +142 -0
- package/build/components/global-styles/inheritance/index.cjs.map +7 -0
- package/build/components/global-styles/inherited-value-context.cjs +173 -0
- package/build/components/global-styles/inherited-value-context.cjs.map +7 -0
- package/build/components/global-styles/shadow-panel-components.cjs +38 -20
- package/build/components/global-styles/shadow-panel-components.cjs.map +2 -2
- package/build/components/global-styles/state-control-badges.cjs +39 -3
- package/build/components/global-styles/state-control-badges.cjs.map +2 -2
- package/build/components/global-styles/state-control.cjs +1 -1
- package/build/components/global-styles/state-control.cjs.map +2 -2
- package/build/components/global-styles/typography-panel.cjs +271 -79
- package/build/components/global-styles/typography-panel.cjs.map +3 -3
- package/build/components/image-size-control/index.cjs +2 -4
- package/build/components/image-size-control/index.cjs.map +2 -2
- package/build/components/inserter/media-tab/hooks.cjs +33 -6
- package/build/components/inserter/media-tab/hooks.cjs.map +2 -2
- package/build/components/inserter/media-tab/media-panel.cjs +78 -16
- package/build/components/inserter/media-tab/media-panel.cjs.map +3 -3
- package/build/components/inspector-controls-tabs/styles-tab.cjs +10 -1
- package/build/components/inspector-controls-tabs/styles-tab.cjs.map +2 -2
- package/build/components/keyboard-shortcuts/index.cjs +19 -11
- package/build/components/keyboard-shortcuts/index.cjs.map +2 -2
- package/build/components/line-height-control/index.cjs +1 -2
- package/build/components/line-height-control/index.cjs.map +2 -2
- package/build/components/link-control/index.cjs +3 -1
- package/build/components/link-control/index.cjs.map +2 -2
- package/build/components/list-view/block.cjs +13 -4
- package/build/components/list-view/block.cjs.map +2 -2
- package/build/components/media-placeholder/index.cjs +0 -1
- package/build/components/media-placeholder/index.cjs.map +2 -2
- package/build/components/preset-input-control/index.cjs +2 -1
- package/build/components/preset-input-control/index.cjs.map +2 -2
- package/build/components/provider/block-refs-provider.cjs +8 -2
- package/build/components/provider/block-refs-provider.cjs.map +2 -2
- package/build/components/provider/index.cjs +1 -1
- package/build/components/provider/index.cjs.map +2 -2
- package/build/components/provider/use-block-sync.cjs +18 -6
- package/build/components/provider/use-block-sync.cjs.map +2 -2
- package/build/components/provider/use-media-upload-settings.cjs +3 -1
- package/build/components/provider/use-media-upload-settings.cjs.map +2 -2
- package/build/components/rich-text/event-listeners/before-input-rules.cjs +3 -4
- package/build/components/rich-text/event-listeners/before-input-rules.cjs.map +3 -3
- package/build/components/rich-text/event-listeners/delete.cjs +2 -3
- package/build/components/rich-text/event-listeners/delete.cjs.map +3 -3
- package/build/components/rich-text/event-listeners/enter.cjs +3 -2
- package/build/components/rich-text/event-listeners/enter.cjs.map +3 -3
- package/build/components/rich-text/event-listeners/input-events.cjs +3 -3
- package/build/components/rich-text/event-listeners/input-events.cjs.map +3 -3
- package/build/components/rich-text/event-listeners/input-rules.cjs +3 -4
- package/build/components/rich-text/event-listeners/input-rules.cjs.map +3 -3
- package/build/components/rich-text/event-listeners/insert-replacement-text.cjs +3 -3
- package/build/components/rich-text/event-listeners/insert-replacement-text.cjs.map +3 -3
- package/build/components/rich-text/event-listeners/paste-handler.cjs +2 -1
- package/build/components/rich-text/event-listeners/paste-handler.cjs.map +3 -3
- package/build/components/rich-text/event-listeners/remove-browser-shortcuts.cjs +3 -3
- package/build/components/rich-text/event-listeners/remove-browser-shortcuts.cjs.map +3 -3
- package/build/components/rich-text/event-listeners/shortcuts.cjs +3 -3
- package/build/components/rich-text/event-listeners/shortcuts.cjs.map +3 -3
- package/build/components/rich-text/event-listeners/undo-automatic-change.cjs +3 -3
- package/build/components/rich-text/event-listeners/undo-automatic-change.cjs.map +3 -3
- package/build/components/rich-text/index.cjs +76 -17
- package/build/components/rich-text/index.cjs.map +2 -2
- package/build/components/spacing-sizes-control/utils.cjs +6 -19
- package/build/components/spacing-sizes-control/utils.cjs.map +2 -2
- package/build/components/text-indent-control/index.cjs +8 -2
- package/build/components/text-indent-control/index.cjs.map +2 -2
- package/build/components/typewriter/index.cjs +129 -136
- package/build/components/typewriter/index.cjs.map +3 -3
- package/build/components/url-input/index.cjs +303 -344
- package/build/components/url-input/index.cjs.map +3 -3
- package/build/components/use-block-commands/index.cjs +21 -17
- package/build/components/use-block-commands/index.cjs.map +2 -2
- package/build/components/use-on-block-drop/index.cjs +1 -1
- package/build/components/use-on-block-drop/index.cjs.map +2 -2
- package/build/components/writing-flow/index.cjs +14 -1
- package/build/components/writing-flow/index.cjs.map +3 -3
- package/build/components/writing-flow/use-arrow-nav.cjs +42 -6
- package/build/components/writing-flow/use-arrow-nav.cjs.map +2 -2
- package/build/components/writing-flow/use-click-selection.cjs +29 -3
- package/build/components/writing-flow/use-click-selection.cjs.map +2 -2
- package/build/components/writing-flow/use-clipboard-handler.cjs +4 -1
- package/build/components/writing-flow/use-clipboard-handler.cjs.map +2 -2
- package/build/components/writing-flow/use-drag-selection.cjs +3 -8
- package/build/components/writing-flow/use-drag-selection.cjs.map +2 -2
- package/build/components/writing-flow/use-editable-root-event-handlers.cjs +179 -0
- package/build/components/writing-flow/use-editable-root-event-handlers.cjs.map +7 -0
- package/build/components/writing-flow/use-editable-root.cjs +75 -0
- package/build/components/writing-flow/use-editable-root.cjs.map +7 -0
- package/build/components/writing-flow/use-home-end.cjs +64 -0
- package/build/components/writing-flow/use-home-end.cjs.map +7 -0
- package/build/components/writing-flow/use-input.cjs +15 -5
- package/build/components/writing-flow/use-input.cjs.map +2 -2
- package/build/components/writing-flow/use-multi-selection.cjs +2 -2
- package/build/components/writing-flow/use-multi-selection.cjs.map +2 -2
- package/build/components/writing-flow/use-select-all.cjs +14 -2
- package/build/components/writing-flow/use-select-all.cjs.map +2 -2
- package/build/components/writing-flow/use-selection-observer.cjs +132 -22
- package/build/components/writing-flow/use-selection-observer.cjs.map +3 -3
- package/build/components/writing-flow/utils.cjs +28 -2
- package/build/components/writing-flow/utils.cjs.map +2 -2
- package/build/hooks/background.cjs +14 -10
- package/build/hooks/background.cjs.map +2 -2
- package/build/hooks/block-fields/rich-text/index.cjs +2 -3
- package/build/hooks/block-fields/rich-text/index.cjs.map +3 -3
- package/build/hooks/block-style-variation.cjs +4 -45
- package/build/hooks/block-style-variation.cjs.map +3 -3
- package/build/hooks/border.cjs +19 -4
- package/build/hooks/border.cjs.map +2 -2
- package/build/hooks/custom-css.cjs +6 -2
- package/build/hooks/custom-css.cjs.map +2 -2
- package/build/hooks/dimensions.cjs +15 -4
- package/build/hooks/dimensions.cjs.map +2 -2
- package/build/hooks/duotone.cjs +26 -14
- package/build/hooks/duotone.cjs.map +3 -3
- package/build/hooks/elements.cjs +15 -5
- package/build/hooks/elements.cjs.map +2 -2
- package/build/hooks/grid-visualizer.cjs +5 -3
- package/build/hooks/grid-visualizer.cjs.map +2 -2
- package/build/hooks/layout-child.cjs +22 -12
- package/build/hooks/layout-child.cjs.map +3 -3
- package/build/hooks/layout.cjs +28 -13
- package/build/hooks/layout.cjs.map +3 -3
- package/build/hooks/line-height.cjs +1 -2
- package/build/hooks/line-height.cjs.map +2 -2
- package/build/hooks/states.cjs +27 -7
- package/build/hooks/states.cjs.map +3 -3
- package/build/hooks/style.cjs +31 -9
- package/build/hooks/style.cjs.map +3 -3
- package/build/hooks/text-align.cjs +36 -6
- package/build/hooks/text-align.cjs.map +3 -3
- package/build/hooks/typography.cjs +14 -5
- package/build/hooks/typography.cjs.map +2 -2
- package/build/layouts/constrained.cjs +14 -6
- package/build/layouts/constrained.cjs.map +2 -2
- package/build/layouts/flex.cjs +27 -19
- package/build/layouts/flex.cjs.map +2 -2
- package/build/layouts/grid.cjs +0 -2
- package/build/layouts/grid.cjs.map +2 -2
- package/build/private-apis.cjs +9 -5
- package/build/private-apis.cjs.map +3 -3
- package/build/store/actions.cjs +11 -6
- package/build/store/actions.cjs.map +2 -2
- package/build/store/private-selectors.cjs +41 -3
- package/build/store/private-selectors.cjs.map +3 -3
- package/build/store/reducer.cjs +6 -6
- package/build/store/reducer.cjs.map +2 -2
- package/build/store/selectors.cjs +23 -0
- package/build/store/selectors.cjs.map +2 -2
- package/build/utils/block-bindings.cjs +29 -0
- package/build/utils/block-bindings.cjs.map +2 -2
- package/build/utils/dom.cjs +14 -0
- package/build/utils/dom.cjs.map +2 -2
- package/build/{components/rich-text/input-event.cjs → utils/native-undo.cjs} +29 -24
- package/build/utils/native-undo.cjs.map +7 -0
- package/build-module/components/alignment-control/ui.mjs +2 -4
- package/build-module/components/alignment-control/ui.mjs.map +2 -2
- package/build-module/components/background-image-control/index.mjs +43 -10
- package/build-module/components/background-image-control/index.mjs.map +2 -2
- package/build-module/components/block-alignment-control/ui.mjs +5 -3
- package/build-module/components/block-alignment-control/ui.mjs.map +2 -2
- package/build-module/components/block-canvas/index.mjs +7 -2
- package/build-module/components/block-canvas/index.mjs.map +2 -2
- package/build-module/components/block-controls/groups.mjs +3 -1
- package/build-module/components/block-controls/groups.mjs.map +2 -2
- package/build-module/components/block-edit/edit.mjs +11 -18
- package/build-module/components/block-edit/edit.mjs.map +2 -2
- package/build-module/components/block-inspector/index.mjs +74 -46
- package/build-module/components/block-inspector/index.mjs.map +2 -2
- package/build-module/components/block-list/block-html.mjs +4 -1
- package/build-module/components/block-list/block-html.mjs.map +2 -2
- package/build-module/components/block-list/block.mjs +9 -3
- package/build-module/components/block-list/block.mjs.map +3 -3
- package/build-module/components/block-list/index.mjs +1 -3
- package/build-module/components/block-list/index.mjs.map +2 -2
- package/build-module/components/block-list/use-block-props/index.mjs +7 -2
- package/build-module/components/block-list/use-block-props/index.mjs.map +2 -2
- package/build-module/components/block-list/use-block-props/use-focus-first-element.mjs +9 -4
- package/build-module/components/block-list/use-block-props/use-focus-first-element.mjs.map +2 -2
- package/build-module/components/block-list/use-block-props/use-focus-handler.mjs +11 -4
- package/build-module/components/block-list/use-block-props/use-focus-handler.mjs.map +2 -2
- package/build-module/components/block-list/use-block-props/use-register-block-event-handlers.mjs +28 -0
- package/build-module/components/block-list/use-block-props/use-register-block-event-handlers.mjs.map +7 -0
- package/build-module/components/block-parent-selector/index.mjs +2 -2
- package/build-module/components/block-parent-selector/index.mjs.map +2 -2
- package/build-module/components/block-toolbar/index.mjs +43 -24
- package/build-module/components/block-toolbar/index.mjs.map +2 -2
- package/build-module/components/block-toolbar/switch-section-style.mjs +4 -2
- package/build-module/components/block-toolbar/switch-section-style.mjs.map +2 -2
- package/build-module/components/block-tools/empty-block-inserter.mjs +2 -7
- package/build-module/components/block-tools/empty-block-inserter.mjs.map +2 -2
- package/build-module/components/block-tools/index.mjs +7 -2
- package/build-module/components/block-tools/index.mjs.map +2 -2
- package/build-module/components/block-vertical-alignment-control/ui.mjs +4 -6
- package/build-module/components/block-vertical-alignment-control/ui.mjs.map +2 -2
- package/build-module/components/block-visibility/modal.mjs +22 -10
- package/build-module/components/block-visibility/modal.mjs.map +2 -2
- package/build-module/components/block-visibility/use-block-visibility.mjs +17 -7
- package/build-module/components/block-visibility/use-block-visibility.mjs.map +2 -2
- package/build-module/components/block-visibility/utils.mjs +18 -3
- package/build-module/components/block-visibility/utils.mjs.map +2 -2
- package/build-module/components/block-visibility/viewport-menu-item.mjs +7 -1
- package/build-module/components/block-visibility/viewport-menu-item.mjs.map +2 -2
- package/build-module/components/block-visibility/viewport-toolbar.mjs +5 -0
- package/build-module/components/block-visibility/viewport-toolbar.mjs.map +2 -2
- package/build-module/components/block-visibility/viewport-visibility-info.mjs +5 -1
- package/build-module/components/block-visibility/viewport-visibility-info.mjs.map +2 -2
- package/build-module/components/border-radius-control/utils.mjs +11 -53
- package/build-module/components/border-radius-control/utils.mjs.map +2 -2
- package/build-module/components/child-layout-control/index.mjs +0 -4
- package/build-module/components/child-layout-control/index.mjs.map +2 -2
- package/build-module/components/colors-gradients/control.mjs +5 -3
- package/build-module/components/colors-gradients/control.mjs.map +2 -2
- package/build-module/components/dimension-control/index.mjs +30 -20
- package/build-module/components/dimension-control/index.mjs.map +2 -2
- package/build-module/components/dimensions-tool/aspect-ratio-tool.mjs +10 -6
- package/build-module/components/dimensions-tool/aspect-ratio-tool.mjs.map +2 -2
- package/build-module/components/editor-styles/index.mjs +9 -1
- package/build-module/components/editor-styles/index.mjs.map +2 -2
- package/build-module/components/global-styles/background-panel.mjs +71 -29
- package/build-module/components/global-styles/background-panel.mjs.map +2 -2
- package/build-module/components/global-styles/border-panel.mjs +157 -56
- package/build-module/components/global-styles/border-panel.mjs.map +2 -2
- package/build-module/components/global-styles/color-gradient-dropdown-item.mjs +51 -15
- package/build-module/components/global-styles/color-gradient-dropdown-item.mjs.map +2 -2
- package/build-module/components/global-styles/color-panel.mjs +63 -17
- package/build-module/components/global-styles/color-panel.mjs.map +2 -2
- package/build-module/components/global-styles/dimensions-panel.mjs +248 -66
- package/build-module/components/global-styles/dimensions-panel.mjs.map +2 -2
- package/build-module/components/global-styles/filters-panel.mjs +64 -21
- package/build-module/components/global-styles/filters-panel.mjs.map +2 -2
- package/build-module/components/global-styles/hooks.mjs +4 -1
- package/build-module/components/global-styles/hooks.mjs.map +2 -2
- package/build-module/components/global-styles/inheritance/index.mjs +108 -0
- package/build-module/components/global-styles/inheritance/index.mjs.map +7 -0
- package/build-module/components/global-styles/inherited-value-context.mjs +141 -0
- package/build-module/components/global-styles/inherited-value-context.mjs.map +7 -0
- package/build-module/components/global-styles/shadow-panel-components.mjs +38 -20
- package/build-module/components/global-styles/shadow-panel-components.mjs.map +2 -2
- package/build-module/components/global-styles/state-control-badges.mjs +41 -5
- package/build-module/components/global-styles/state-control-badges.mjs.map +2 -2
- package/build-module/components/global-styles/state-control.mjs +1 -1
- package/build-module/components/global-styles/state-control.mjs.map +2 -2
- package/build-module/components/global-styles/typography-panel.mjs +276 -80
- package/build-module/components/global-styles/typography-panel.mjs.map +2 -2
- package/build-module/components/image-size-control/index.mjs +2 -4
- package/build-module/components/image-size-control/index.mjs.map +2 -2
- package/build-module/components/inserter/media-tab/hooks.mjs +33 -6
- package/build-module/components/inserter/media-tab/hooks.mjs.map +2 -2
- package/build-module/components/inserter/media-tab/media-panel.mjs +86 -18
- package/build-module/components/inserter/media-tab/media-panel.mjs.map +2 -2
- package/build-module/components/inspector-controls-tabs/styles-tab.mjs +6 -1
- package/build-module/components/inspector-controls-tabs/styles-tab.mjs.map +2 -2
- package/build-module/components/keyboard-shortcuts/index.mjs +19 -11
- package/build-module/components/keyboard-shortcuts/index.mjs.map +2 -2
- package/build-module/components/line-height-control/index.mjs +1 -2
- package/build-module/components/line-height-control/index.mjs.map +2 -2
- package/build-module/components/link-control/index.mjs +4 -2
- package/build-module/components/link-control/index.mjs.map +2 -2
- package/build-module/components/list-view/block.mjs +13 -4
- package/build-module/components/list-view/block.mjs.map +2 -2
- package/build-module/components/media-placeholder/index.mjs +0 -1
- package/build-module/components/media-placeholder/index.mjs.map +2 -2
- package/build-module/components/preset-input-control/index.mjs +2 -1
- package/build-module/components/preset-input-control/index.mjs.map +2 -2
- package/build-module/components/provider/block-refs-provider.mjs +8 -2
- package/build-module/components/provider/block-refs-provider.mjs.map +2 -2
- package/build-module/components/provider/index.mjs +1 -1
- package/build-module/components/provider/index.mjs.map +2 -2
- package/build-module/components/provider/use-block-sync.mjs +18 -6
- package/build-module/components/provider/use-block-sync.mjs.map +2 -2
- package/build-module/components/provider/use-media-upload-settings.mjs +3 -1
- package/build-module/components/provider/use-media-upload-settings.mjs.map +2 -2
- package/build-module/components/rich-text/event-listeners/before-input-rules.mjs +8 -5
- package/build-module/components/rich-text/event-listeners/before-input-rules.mjs.map +2 -2
- package/build-module/components/rich-text/event-listeners/delete.mjs +7 -4
- package/build-module/components/rich-text/event-listeners/delete.mjs.map +2 -2
- package/build-module/components/rich-text/event-listeners/enter.mjs +8 -3
- package/build-module/components/rich-text/event-listeners/enter.mjs.map +2 -2
- package/build-module/components/rich-text/event-listeners/input-events.mjs +3 -3
- package/build-module/components/rich-text/event-listeners/input-events.mjs.map +2 -2
- package/build-module/components/rich-text/event-listeners/input-rules.mjs +8 -5
- package/build-module/components/rich-text/event-listeners/input-rules.mjs.map +2 -2
- package/build-module/components/rich-text/event-listeners/insert-replacement-text.mjs +3 -3
- package/build-module/components/rich-text/event-listeners/insert-replacement-text.mjs.map +2 -2
- package/build-module/components/rich-text/event-listeners/paste-handler.mjs +8 -2
- package/build-module/components/rich-text/event-listeners/paste-handler.mjs.map +2 -2
- package/build-module/components/rich-text/event-listeners/remove-browser-shortcuts.mjs +3 -3
- package/build-module/components/rich-text/event-listeners/remove-browser-shortcuts.mjs.map +2 -2
- package/build-module/components/rich-text/event-listeners/shortcuts.mjs +3 -3
- package/build-module/components/rich-text/event-listeners/shortcuts.mjs.map +2 -2
- package/build-module/components/rich-text/event-listeners/undo-automatic-change.mjs +3 -3
- package/build-module/components/rich-text/event-listeners/undo-automatic-change.mjs.map +2 -2
- package/build-module/components/rich-text/index.mjs +79 -14
- package/build-module/components/rich-text/index.mjs.map +2 -2
- package/build-module/components/spacing-sizes-control/utils.mjs +6 -18
- package/build-module/components/spacing-sizes-control/utils.mjs.map +2 -2
- package/build-module/components/text-indent-control/index.mjs +8 -2
- package/build-module/components/text-indent-control/index.mjs.map +2 -2
- package/build-module/components/typewriter/index.mjs +129 -136
- package/build-module/components/typewriter/index.mjs.map +2 -2
- package/build-module/components/url-input/index.mjs +306 -353
- package/build-module/components/url-input/index.mjs.map +2 -2
- package/build-module/components/use-block-commands/index.mjs +21 -17
- package/build-module/components/use-block-commands/index.mjs.map +2 -2
- package/build-module/components/use-on-block-drop/index.mjs +2 -2
- package/build-module/components/use-on-block-drop/index.mjs.map +2 -2
- package/build-module/components/writing-flow/index.mjs +14 -1
- package/build-module/components/writing-flow/index.mjs.map +2 -2
- package/build-module/components/writing-flow/use-arrow-nav.mjs +43 -7
- package/build-module/components/writing-flow/use-arrow-nav.mjs.map +2 -2
- package/build-module/components/writing-flow/use-click-selection.mjs +29 -3
- package/build-module/components/writing-flow/use-click-selection.mjs.map +2 -2
- package/build-module/components/writing-flow/use-clipboard-handler.mjs +5 -2
- package/build-module/components/writing-flow/use-clipboard-handler.mjs.map +2 -2
- package/build-module/components/writing-flow/use-drag-selection.mjs +1 -6
- package/build-module/components/writing-flow/use-drag-selection.mjs.map +2 -2
- package/build-module/components/writing-flow/use-editable-root-event-handlers.mjs +154 -0
- package/build-module/components/writing-flow/use-editable-root-event-handlers.mjs.map +7 -0
- package/build-module/components/writing-flow/use-editable-root.mjs +54 -0
- package/build-module/components/writing-flow/use-editable-root.mjs.map +7 -0
- package/build-module/components/writing-flow/use-home-end.mjs +43 -0
- package/build-module/components/writing-flow/use-home-end.mjs.map +7 -0
- package/build-module/components/writing-flow/use-input.mjs +15 -5
- package/build-module/components/writing-flow/use-input.mjs.map +2 -2
- package/build-module/components/writing-flow/use-multi-selection.mjs +2 -2
- package/build-module/components/writing-flow/use-multi-selection.mjs.map +2 -2
- package/build-module/components/writing-flow/use-select-all.mjs +19 -3
- package/build-module/components/writing-flow/use-select-all.mjs.map +2 -2
- package/build-module/components/writing-flow/use-selection-observer.mjs +134 -21
- package/build-module/components/writing-flow/use-selection-observer.mjs.map +2 -2
- package/build-module/components/writing-flow/utils.mjs +26 -1
- package/build-module/components/writing-flow/utils.mjs.map +2 -2
- package/build-module/hooks/background.mjs +14 -10
- package/build-module/hooks/background.mjs.map +2 -2
- package/build-module/hooks/block-fields/rich-text/index.mjs +2 -6
- package/build-module/hooks/block-fields/rich-text/index.mjs.map +2 -2
- package/build-module/hooks/block-style-variation.mjs +8 -44
- package/build-module/hooks/block-style-variation.mjs.map +2 -2
- package/build-module/hooks/border.mjs +19 -4
- package/build-module/hooks/border.mjs.map +2 -2
- package/build-module/hooks/custom-css.mjs +7 -3
- package/build-module/hooks/custom-css.mjs.map +2 -2
- package/build-module/hooks/dimensions.mjs +15 -4
- package/build-module/hooks/dimensions.mjs.map +2 -2
- package/build-module/hooks/duotone.mjs +20 -9
- package/build-module/hooks/duotone.mjs.map +2 -2
- package/build-module/hooks/elements.mjs +15 -5
- package/build-module/hooks/elements.mjs.map +2 -2
- package/build-module/hooks/grid-visualizer.mjs +5 -3
- package/build-module/hooks/grid-visualizer.mjs.map +2 -2
- package/build-module/hooks/layout-child.mjs +22 -12
- package/build-module/hooks/layout-child.mjs.map +2 -2
- package/build-module/hooks/layout.mjs +28 -13
- package/build-module/hooks/layout.mjs.map +2 -2
- package/build-module/hooks/line-height.mjs +1 -2
- package/build-module/hooks/line-height.mjs.map +2 -2
- package/build-module/hooks/states.mjs +27 -7
- package/build-module/hooks/states.mjs.map +2 -2
- package/build-module/hooks/style.mjs +40 -11
- package/build-module/hooks/style.mjs.map +2 -2
- package/build-module/hooks/text-align.mjs +39 -10
- package/build-module/hooks/text-align.mjs.map +2 -2
- package/build-module/hooks/typography.mjs +14 -5
- package/build-module/hooks/typography.mjs.map +2 -2
- package/build-module/layouts/constrained.mjs +14 -6
- package/build-module/layouts/constrained.mjs.map +2 -2
- package/build-module/layouts/flex.mjs +27 -19
- package/build-module/layouts/flex.mjs.map +2 -2
- package/build-module/layouts/grid.mjs +0 -2
- package/build-module/layouts/grid.mjs.map +2 -2
- package/build-module/private-apis.mjs +7 -3
- package/build-module/private-apis.mjs.map +2 -2
- package/build-module/store/actions.mjs +12 -7
- package/build-module/store/actions.mjs.map +2 -2
- package/build-module/store/private-selectors.mjs +42 -3
- package/build-module/store/private-selectors.mjs.map +2 -2
- package/build-module/store/reducer.mjs +6 -6
- package/build-module/store/reducer.mjs.map +2 -2
- package/build-module/store/selectors.mjs +23 -0
- package/build-module/store/selectors.mjs.map +2 -2
- package/build-module/utils/block-bindings.mjs +28 -0
- package/build-module/utils/block-bindings.mjs.map +2 -2
- package/build-module/utils/dom.mjs +13 -0
- package/build-module/utils/dom.mjs.map +2 -2
- package/build-module/utils/native-undo.mjs +29 -0
- package/build-module/utils/native-undo.mjs.map +7 -0
- package/build-style/content-rtl.css +14 -27
- package/build-style/content.css +14 -27
- package/build-style/default-editor-styles-rtl.css +1 -1
- package/build-style/default-editor-styles.css +1 -1
- package/build-style/style-rtl.css +191 -61
- package/build-style/style.css +191 -61
- package/build-types/components/block-context/index.d.ts +7 -0
- package/build-types/components/block-context/index.d.ts.map +1 -1
- package/build-types/utils/block-bindings.d.ts +19 -0
- package/build-types/utils/block-bindings.d.ts.map +1 -1
- package/build-types/utils/dom.d.ts +11 -0
- package/build-types/utils/dom.d.ts.map +1 -1
- package/build-types/utils/get-px-from-css-unit.d.ts +2 -2
- package/build-types/utils/get-px-from-css-unit.d.ts.map +1 -1
- package/build-types/utils/pasting.d.ts +1 -1
- package/build-types/utils/pasting.d.ts.map +1 -1
- package/package.json +43 -44
- package/src/components/alignment-control/test/__snapshots__/index.js.snap +1 -1
- package/src/components/alignment-control/ui.js +2 -4
- package/src/components/background-image-control/index.js +74 -37
- package/src/components/background-image-control/style.scss +13 -4
- package/src/components/block-alignment-control/test/__snapshots__/index.js.snap +3 -3
- package/src/components/block-alignment-control/test/index.js +1 -1
- package/src/components/block-alignment-control/ui.js +4 -2
- package/src/components/block-breadcrumb/test/__snapshots__/index.js.snap +1 -1
- package/src/components/block-canvas/index.js +9 -2
- package/src/components/block-card/style.scss +1 -1
- package/src/components/block-compare/test/__snapshots__/block-view.js.snap +1 -1
- package/src/components/block-controls/groups.js +2 -0
- package/src/components/block-edit/edit.js +13 -31
- package/src/components/block-icon/test/__snapshots__/index.js.snap +1 -1
- package/src/components/block-inspector/index.js +60 -31
- package/src/components/block-list/block-html.js +5 -0
- package/src/components/block-list/block.js +6 -0
- package/src/components/block-list/content.scss +1 -11
- package/src/components/block-list/index.js +0 -2
- package/src/components/block-list/use-block-props/index.js +7 -1
- package/src/components/block-list/use-block-props/use-focus-first-element.js +23 -4
- package/src/components/block-list/use-block-props/use-focus-handler.js +35 -9
- package/src/components/block-list/use-block-props/use-register-block-event-handlers.js +45 -0
- package/src/components/block-lock/style.scss +1 -1
- package/src/components/block-manager/style.scss +1 -1
- package/src/components/block-navigation/style.scss +1 -1
- package/src/components/block-parent-selector/index.js +5 -2
- package/src/components/block-quick-navigation/style.scss +1 -3
- package/src/components/block-styles/style.scss +2 -2
- package/src/components/block-toolbar/index.js +41 -18
- package/src/components/block-toolbar/switch-section-style.js +5 -2
- package/src/components/block-tools/empty-block-inserter.js +3 -7
- package/src/components/block-tools/index.js +7 -0
- package/src/components/block-types-list/style.scss +0 -1
- package/src/components/block-vertical-alignment-control/test/__snapshots__/index.js.snap +3 -3
- package/src/components/block-vertical-alignment-control/test/index.js +18 -2
- package/src/components/block-vertical-alignment-control/ui.js +3 -5
- package/src/components/block-visibility/modal.js +24 -10
- package/src/components/block-visibility/style.scss +1 -1
- package/src/components/block-visibility/test/use-block-visibility.js +128 -35
- package/src/components/block-visibility/test/utils.js +11 -0
- package/src/components/block-visibility/use-block-visibility.js +33 -11
- package/src/components/block-visibility/utils.js +31 -6
- package/src/components/block-visibility/viewport-menu-item.js +10 -1
- package/src/components/block-visibility/viewport-toolbar.js +6 -0
- package/src/components/block-visibility/viewport-visibility-info.js +5 -1
- package/src/components/border-radius-control/test/utils.js +0 -41
- package/src/components/border-radius-control/utils.js +16 -107
- package/src/components/button-block-appender/content.scss +7 -9
- package/src/components/child-layout-control/index.js +0 -4
- package/src/components/color-palette/test/__snapshots__/control.js.snap +3 -3
- package/src/components/colors-gradients/control.js +6 -3
- package/src/components/default-block-appender/test/__snapshots__/index.js.snap +1 -1
- package/src/components/dimension-control/index.js +13 -1
- package/src/components/dimensions-tool/aspect-ratio-tool.js +13 -6
- package/src/components/editor-styles/index.js +16 -1
- package/src/components/font-family/stories/index.story.jsx +1 -1
- package/src/components/global-styles/background-panel.js +107 -34
- package/src/components/global-styles/border-panel.js +219 -48
- package/src/components/global-styles/color-gradient-dropdown-item.js +93 -28
- package/src/components/global-styles/color-panel.js +92 -11
- package/src/components/global-styles/dimensions-panel.js +422 -71
- package/src/components/global-styles/filters-panel.js +88 -28
- package/src/components/global-styles/hooks.js +8 -1
- package/src/components/global-styles/inheritance/index.js +204 -0
- package/src/components/global-styles/inheritance/style.scss +184 -0
- package/src/components/global-styles/inheritance/test/index.js +281 -0
- package/src/components/global-styles/inherited-value-context.js +271 -0
- package/src/components/global-styles/shadow-panel-components.js +48 -26
- package/src/components/global-styles/state-control-badges.js +45 -6
- package/src/components/global-styles/state-control.js +2 -2
- package/src/components/global-styles/style.scss +5 -0
- package/src/components/global-styles/test/background-panel.js +338 -1
- package/src/components/global-styles/test/border-panel.js +441 -0
- package/src/components/global-styles/test/color-panel.js +182 -2
- package/src/components/global-styles/test/dimensions-panel.js +753 -0
- package/src/components/global-styles/test/filters-panel.js +194 -0
- package/src/components/global-styles/test/inherited-value-context-core.js +98 -0
- package/src/components/global-styles/test/inherited-value-context.js +454 -0
- package/src/components/global-styles/test/state-control-badges.js +65 -0
- package/src/components/global-styles/test/typography-panel-core.js +185 -0
- package/src/components/global-styles/test/typography-panel.js +849 -12
- package/src/components/global-styles/typography-panel.js +449 -101
- package/src/components/image-editor/style.scss +33 -0
- package/src/components/image-size-control/index.js +0 -2
- package/src/components/inner-blocks/test/__snapshots__/index.js.snap +1 -1
- package/src/components/inserter/media-tab/hooks.js +55 -7
- package/src/components/inserter/media-tab/media-panel.js +117 -21
- package/src/components/inserter/media-tab/test/hooks.js +63 -0
- package/src/components/inserter/media-tab/test/media-panel.js +127 -0
- package/src/components/inserter/style.scss +19 -16
- package/src/components/inserter-list-item/style.scss +0 -15
- package/src/components/inspector-controls-tabs/styles-tab.js +5 -1
- package/src/components/keyboard-shortcuts/index.js +28 -11
- package/src/components/line-height-control/index.js +1 -2
- package/src/components/link-control/index.js +7 -2
- package/src/components/link-control/style.scss +2 -2
- package/src/components/link-control/test/index.js +6 -6
- package/src/components/link-picker/style.scss +1 -2
- package/src/components/list-view/block.js +13 -4
- package/src/components/list-view/style.scss +4 -5
- package/src/components/media-placeholder/index.js +0 -1
- package/src/components/multi-selection-inspector/style.scss +1 -1
- package/src/components/preset-input-control/index.js +4 -1
- package/src/components/provider/block-refs-provider.js +12 -2
- package/src/components/provider/index.js +2 -2
- package/src/components/provider/use-block-sync.js +18 -6
- package/src/components/provider/use-media-upload-settings.js +2 -0
- package/src/components/responsive-block-control/style.scss +1 -1
- package/src/components/rich-text/event-listeners/before-input-rules.js +8 -5
- package/src/components/rich-text/event-listeners/delete.js +7 -4
- package/src/components/rich-text/event-listeners/enter.js +10 -4
- package/src/components/rich-text/event-listeners/input-events.js +4 -3
- package/src/components/rich-text/event-listeners/input-rules.js +8 -5
- package/src/components/rich-text/event-listeners/insert-replacement-text.js +4 -3
- package/src/components/rich-text/event-listeners/paste-handler.js +15 -3
- package/src/components/rich-text/event-listeners/remove-browser-shortcuts.js +4 -3
- package/src/components/rich-text/event-listeners/shortcuts.js +4 -3
- package/src/components/rich-text/event-listeners/undo-automatic-change.js +4 -3
- package/src/components/rich-text/index.js +116 -26
- package/src/components/skip-to-selected-block/style.scss +1 -1
- package/src/components/spacing-sizes-control/test/utils.js +16 -5
- package/src/components/spacing-sizes-control/utils.js +11 -28
- package/src/components/text-indent-control/index.js +8 -0
- package/src/components/typewriter/index.js +228 -224
- package/src/components/url-input/index.js +363 -431
- package/src/components/url-input/test/index.js +592 -0
- package/src/components/use-block-commands/index.js +27 -17
- package/src/components/use-on-block-drop/index.js +2 -2
- package/src/components/warning/test/__snapshots__/index.js.snap +1 -1
- package/src/components/writing-flow/index.js +17 -1
- package/src/components/writing-flow/use-arrow-nav.js +90 -13
- package/src/components/writing-flow/use-click-selection.js +55 -5
- package/src/components/writing-flow/use-clipboard-handler.js +5 -2
- package/src/components/writing-flow/use-drag-selection.js +1 -14
- package/src/components/writing-flow/use-editable-root-event-handlers.js +266 -0
- package/src/components/writing-flow/use-editable-root.js +112 -0
- package/src/components/writing-flow/use-home-end.js +71 -0
- package/src/components/writing-flow/use-input.js +25 -8
- package/src/components/writing-flow/use-multi-selection.js +2 -3
- package/src/components/writing-flow/use-select-all.js +33 -3
- package/src/components/writing-flow/use-selection-observer.js +218 -42
- package/src/components/writing-flow/utils.js +62 -0
- package/src/hooks/background.js +27 -24
- package/src/hooks/block-fields/link/styles.scss +1 -6
- package/src/hooks/block-fields/media/styles.scss +1 -6
- package/src/hooks/block-fields/rich-text/index.js +6 -9
- package/src/hooks/block-fields/rich-text/styles.scss +1 -1
- package/src/hooks/block-style-variation.js +8 -74
- package/src/hooks/border.js +19 -4
- package/src/hooks/custom-css.js +15 -6
- package/src/hooks/dimensions.js +17 -4
- package/src/hooks/duotone.js +26 -8
- package/src/hooks/elements.js +14 -4
- package/src/hooks/grid-visualizer.js +40 -36
- package/src/hooks/layout-child.js +19 -9
- package/src/hooks/layout.js +48 -31
- package/src/hooks/line-height.js +0 -1
- package/src/hooks/states.js +38 -9
- package/src/hooks/style.js +67 -17
- package/src/hooks/test/inherited-value-wiring.js +411 -0
- package/src/hooks/test/preset-round-trip.js +456 -0
- package/src/hooks/test/style.js +29 -0
- package/src/hooks/test/text-align.js +34 -1
- package/src/hooks/text-align.js +41 -10
- package/src/hooks/typography.js +35 -24
- package/src/layouts/constrained.js +5 -1
- package/src/layouts/flex.js +5 -1
- package/src/layouts/grid.js +0 -2
- package/src/private-apis.js +11 -2
- package/src/store/actions.js +53 -19
- package/src/store/private-selectors.js +82 -6
- package/src/store/reducer.js +9 -9
- package/src/store/selectors.js +56 -8
- package/src/store/test/actions.js +1 -1
- package/src/store/test/private-selectors.js +271 -1
- package/src/style.scss +2 -0
- package/src/utils/block-bindings.ts +50 -0
- package/src/utils/dom.ts +33 -0
- package/src/utils/native-undo.js +56 -0
- package/src/utils/test/block-bindings.js +181 -0
- package/build/components/duotone/utils.cjs +0 -87
- package/build/components/duotone/utils.cjs.map +0 -7
- package/build/components/rich-text/input-event.cjs.map +0 -7
- package/build/components/rich-text/shortcut.cjs +0 -51
- package/build/components/rich-text/shortcut.cjs.map +0 -7
- package/build-module/components/duotone/utils.mjs +0 -59
- package/build-module/components/duotone/utils.mjs.map +0 -7
- package/build-module/components/rich-text/input-event.mjs +0 -25
- package/build-module/components/rich-text/input-event.mjs.map +0 -7
- package/build-module/components/rich-text/shortcut.mjs +0 -26
- package/build-module/components/rich-text/shortcut.mjs.map +0 -7
- package/src/components/duotone/utils.js +0 -90
- package/src/components/rich-text/input-event.js +0 -31
- package/src/components/rich-text/shortcut.js +0 -32
- package/src/hooks/test/get-variation-styles-with-ref-values.js +0 -91
|
@@ -14,6 +14,8 @@ import { forwardRef } from '@wordpress/element';
|
|
|
14
14
|
/**
|
|
15
15
|
* Internal dependencies
|
|
16
16
|
*/
|
|
17
|
+
import useEditableRoot from './use-editable-root';
|
|
18
|
+
import useHomeEnd from './use-home-end';
|
|
17
19
|
import useMultiSelection from './use-multi-selection';
|
|
18
20
|
import useTabNav from './use-tab-nav';
|
|
19
21
|
import useArrowNav from './use-arrow-nav';
|
|
@@ -21,6 +23,7 @@ import { usePreviewModeNav } from './use-preview-mode-nav';
|
|
|
21
23
|
import useSelectAll from './use-select-all';
|
|
22
24
|
import useDragSelection from './use-drag-selection';
|
|
23
25
|
import useSelectionObserver from './use-selection-observer';
|
|
26
|
+
import useEditableRootEventHandlers from './use-editable-root-event-handlers';
|
|
24
27
|
import useClickSelection from './use-click-selection';
|
|
25
28
|
import useInput from './use-input';
|
|
26
29
|
import useClipboardHandler from './use-clipboard-handler';
|
|
@@ -37,8 +40,11 @@ export function useWritingFlow() {
|
|
|
37
40
|
before,
|
|
38
41
|
useMergeRefs( [
|
|
39
42
|
ref,
|
|
43
|
+
useEditableRootEventHandlers(),
|
|
40
44
|
useClipboardHandler(),
|
|
41
45
|
useInput(),
|
|
46
|
+
useEditableRoot(),
|
|
47
|
+
useHomeEnd(),
|
|
42
48
|
useDragSelection(),
|
|
43
49
|
useSelectionObserver(),
|
|
44
50
|
useClickSelection(),
|
|
@@ -64,7 +70,17 @@ export function useWritingFlow() {
|
|
|
64
70
|
|
|
65
71
|
return () => {
|
|
66
72
|
delete node.dataset.hasMultiSelection;
|
|
67
|
-
|
|
73
|
+
// The wrapper may remain the editing host (the
|
|
74
|
+
// collapsed block supports `editableRoot`): keep it
|
|
75
|
+
// named, as the textbox role requires.
|
|
76
|
+
if ( node.contentEditable === 'true' ) {
|
|
77
|
+
node.setAttribute(
|
|
78
|
+
'aria-label',
|
|
79
|
+
__( 'Editor canvas' )
|
|
80
|
+
);
|
|
81
|
+
} else {
|
|
82
|
+
node.removeAttribute( 'aria-label' );
|
|
83
|
+
}
|
|
68
84
|
};
|
|
69
85
|
},
|
|
70
86
|
[ hasMultiSelection ]
|
|
@@ -18,8 +18,9 @@ import { useRefEffect } from '@wordpress/compose';
|
|
|
18
18
|
/**
|
|
19
19
|
* Internal dependencies
|
|
20
20
|
*/
|
|
21
|
-
import { getBlockClientId } from '../../utils/dom';
|
|
21
|
+
import { getBlockClientId, getSelectionEditableElement } from '../../utils/dom';
|
|
22
22
|
import { store as blockEditorStore } from '../../store';
|
|
23
|
+
import { setContentEditableWrapper } from './utils';
|
|
23
24
|
|
|
24
25
|
/**
|
|
25
26
|
* Returns true if the element should consider edge navigation upon a keyboard
|
|
@@ -141,8 +142,16 @@ export function getClosestTabbable(
|
|
|
141
142
|
return false;
|
|
142
143
|
}
|
|
143
144
|
|
|
144
|
-
// Skip focusable elements such as links within content editable
|
|
145
|
-
|
|
145
|
+
// Skip focusable elements such as links within content editable
|
|
146
|
+
// nodes: nodes whose closest editable host is an editable element
|
|
147
|
+
// within a block. When an editable root (e.g. the canvas wrapper)
|
|
148
|
+
// is the editing host, everything within it is content editable,
|
|
149
|
+
// but focusables like block wrappers are not text content.
|
|
150
|
+
if (
|
|
151
|
+
node.isContentEditable &&
|
|
152
|
+
node.contentEditable !== 'true' &&
|
|
153
|
+
getBlockClientId( node.closest( '[contenteditable="true"]' ) )
|
|
154
|
+
) {
|
|
146
155
|
return false;
|
|
147
156
|
}
|
|
148
157
|
|
|
@@ -167,11 +176,15 @@ export default function useArrowNav() {
|
|
|
167
176
|
const {
|
|
168
177
|
getMultiSelectedBlocksStartClientId,
|
|
169
178
|
getMultiSelectedBlocksEndClientId,
|
|
179
|
+
getNextBlockClientId,
|
|
180
|
+
getPreviousBlockClientId,
|
|
181
|
+
getSelectedBlockClientId,
|
|
182
|
+
getSelectionStart,
|
|
170
183
|
getSettings,
|
|
171
184
|
hasMultiSelection,
|
|
172
185
|
__unstableIsFullySelected,
|
|
173
186
|
} = useSelect( blockEditorStore );
|
|
174
|
-
const { selectBlock } = useDispatch( blockEditorStore );
|
|
187
|
+
const { selectBlock, multiSelect } = useDispatch( blockEditorStore );
|
|
175
188
|
return useRefEffect( ( node ) => {
|
|
176
189
|
// Here a DOMRect is stored while moving the caret vertically so
|
|
177
190
|
// vertical position of the start position can be restored. This is to
|
|
@@ -198,8 +211,17 @@ export default function useArrowNav() {
|
|
|
198
211
|
return;
|
|
199
212
|
}
|
|
200
213
|
|
|
201
|
-
const { keyCode,
|
|
202
|
-
|
|
214
|
+
const { keyCode, shiftKey, ctrlKey, altKey, metaKey } = event;
|
|
215
|
+
// When the wrapper is contentEditable and holds focus (the
|
|
216
|
+
// selected block supports `editableRoot`), the event targets the
|
|
217
|
+
// wrapper; resolve the editable element containing the selection.
|
|
218
|
+
const target =
|
|
219
|
+
( event.target === node &&
|
|
220
|
+
getSelectionEditableElement(
|
|
221
|
+
node.ownerDocument.defaultView.getSelection(),
|
|
222
|
+
node
|
|
223
|
+
) ) ||
|
|
224
|
+
event.target;
|
|
203
225
|
const isUp = keyCode === UP;
|
|
204
226
|
const isDown = keyCode === DOWN;
|
|
205
227
|
const isLeft = keyCode === LEFT;
|
|
@@ -226,6 +248,32 @@ export default function useArrowNav() {
|
|
|
226
248
|
// selection to the start or end of the selection.
|
|
227
249
|
if ( hasMultiSelection() ) {
|
|
228
250
|
if ( shiftKey ) {
|
|
251
|
+
// A fully selected multi-selection has no native
|
|
252
|
+
// selection to extend (use-multi-selection cleared it),
|
|
253
|
+
// so grow or shrink it by one block at the focus end.
|
|
254
|
+
// Only without a usable native selection: a selection
|
|
255
|
+
// that is fully selected because it resolves to a
|
|
256
|
+
// nesting ancestor keeps its native selection, which
|
|
257
|
+
// the browser extends natively (and the observer
|
|
258
|
+
// promotes to the common level).
|
|
259
|
+
const selection = defaultView.getSelection();
|
|
260
|
+
if (
|
|
261
|
+
__unstableIsFullySelected() &&
|
|
262
|
+
( ! selection.rangeCount || selection.isCollapsed )
|
|
263
|
+
) {
|
|
264
|
+
const anchorClientId =
|
|
265
|
+
getMultiSelectedBlocksStartClientId();
|
|
266
|
+
const focusClientId =
|
|
267
|
+
getMultiSelectedBlocksEndClientId();
|
|
268
|
+
const nextClientId = isReverse
|
|
269
|
+
? getPreviousBlockClientId( focusClientId )
|
|
270
|
+
: getNextBlockClientId( focusClientId );
|
|
271
|
+
|
|
272
|
+
if ( nextClientId ) {
|
|
273
|
+
multiSelect( anchorClientId, nextClientId );
|
|
274
|
+
event.preventDefault();
|
|
275
|
+
}
|
|
276
|
+
}
|
|
229
277
|
return;
|
|
230
278
|
}
|
|
231
279
|
|
|
@@ -246,6 +294,26 @@ export default function useArrowNav() {
|
|
|
246
294
|
return;
|
|
247
295
|
}
|
|
248
296
|
|
|
297
|
+
// A block selected without a text selection within it (e.g. an
|
|
298
|
+
// image or spacer) has no native selection to extend: start a
|
|
299
|
+
// block multi-selection with the adjacent block.
|
|
300
|
+
if (
|
|
301
|
+
shiftKey &&
|
|
302
|
+
getSelectedBlockClientId() &&
|
|
303
|
+
! getSelectionStart().attributeKey
|
|
304
|
+
) {
|
|
305
|
+
const selectedClientId = getSelectedBlockClientId();
|
|
306
|
+
const nextClientId = isReverse
|
|
307
|
+
? getPreviousBlockClientId( selectedClientId )
|
|
308
|
+
: getNextBlockClientId( selectedClientId );
|
|
309
|
+
|
|
310
|
+
if ( nextClientId ) {
|
|
311
|
+
multiSelect( selectedClientId, nextClientId );
|
|
312
|
+
event.preventDefault();
|
|
313
|
+
}
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
316
|
+
|
|
249
317
|
// Abort if our current target is not a candidate for navigation
|
|
250
318
|
// (e.g. preserve native input behaviors).
|
|
251
319
|
if ( ! isNavigationCandidate( target, keyCode, hasModifier ) ) {
|
|
@@ -271,13 +339,22 @@ export default function useArrowNav() {
|
|
|
271
339
|
const { keepCaretInsideBlock } = getSettings();
|
|
272
340
|
|
|
273
341
|
if ( shiftKey ) {
|
|
274
|
-
if (
|
|
275
|
-
isClosestTabbableABlock( target, isReverse )
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
342
|
+
if ( isNavEdge( target, isReverse ) ) {
|
|
343
|
+
if ( isClosestTabbableABlock( target, isReverse ) ) {
|
|
344
|
+
setContentEditableWrapper( node, true );
|
|
345
|
+
} else if ( node.contentEditable === 'true' ) {
|
|
346
|
+
// There is no block to extend the selection into.
|
|
347
|
+
// Within an editable wrapper the selection could
|
|
348
|
+
// natively escape into surrounding editable elements
|
|
349
|
+
// (e.g. the post title), so keep it inside the block
|
|
350
|
+
// by extending it to the block's edge.
|
|
351
|
+
const selection = defaultView.getSelection();
|
|
352
|
+
selection.extend(
|
|
353
|
+
target,
|
|
354
|
+
isReverse ? 0 : target.childNodes.length
|
|
355
|
+
);
|
|
356
|
+
event.preventDefault();
|
|
357
|
+
}
|
|
281
358
|
}
|
|
282
359
|
} else if (
|
|
283
360
|
isVertical &&
|
|
@@ -8,12 +8,17 @@ import { useRefEffect } from '@wordpress/compose';
|
|
|
8
8
|
* Internal dependencies
|
|
9
9
|
*/
|
|
10
10
|
import { store as blockEditorStore } from '../../store';
|
|
11
|
+
import { setContentEditableWrapper } from './utils';
|
|
11
12
|
import { getBlockClientId } from '../../utils/dom';
|
|
12
13
|
|
|
13
14
|
export default function useClickSelection() {
|
|
14
15
|
const { selectBlock } = useDispatch( blockEditorStore );
|
|
15
|
-
const {
|
|
16
|
-
|
|
16
|
+
const {
|
|
17
|
+
isSelectionEnabled,
|
|
18
|
+
getBlockSelectionStart,
|
|
19
|
+
getSelectionStart,
|
|
20
|
+
hasMultiSelection,
|
|
21
|
+
} = useSelect( blockEditorStore );
|
|
17
22
|
return useRefEffect(
|
|
18
23
|
( node ) => {
|
|
19
24
|
function onMouseDown( event ) {
|
|
@@ -30,9 +35,53 @@ export default function useClickSelection() {
|
|
|
30
35
|
// When selecting a single block in a document by holding the shift key,
|
|
31
36
|
// don't mark this action as multiselection.
|
|
32
37
|
if ( startClientId && startClientId !== clickedClientId ) {
|
|
33
|
-
|
|
34
|
-
//
|
|
35
|
-
|
|
38
|
+
// When the selected block has no text selection
|
|
39
|
+
// within it (e.g. an image or spacer), there is no
|
|
40
|
+
// native selection for the wrapper to adopt when it
|
|
41
|
+
// is focused, so Safari inserts a caret at the start
|
|
42
|
+
// of the wrapper and asynchronously reveals it,
|
|
43
|
+
// scrolling a scrolled-down viewport back up, which
|
|
44
|
+
// `preventScroll` does not cover. Leave focus alone
|
|
45
|
+
// in that case: the click moves it.
|
|
46
|
+
const { clientId, attributeKey } = getSelectionStart();
|
|
47
|
+
setContentEditableWrapper( node, true, {
|
|
48
|
+
focus: !! attributeKey,
|
|
49
|
+
} );
|
|
50
|
+
|
|
51
|
+
// The browser extends the selection from the native
|
|
52
|
+
// anchor. When a block is selected without a text
|
|
53
|
+
// selection within it, there is no native anchor,
|
|
54
|
+
// and browsers synthesize one at the nearest text
|
|
55
|
+
// instead, excluding the block itself. Give the
|
|
56
|
+
// browser the right anchor before it acts on the
|
|
57
|
+
// click: the near edge of the selected block, so the
|
|
58
|
+
// whole block ends up within the extended selection.
|
|
59
|
+
const { ownerDocument } = node;
|
|
60
|
+
const selection =
|
|
61
|
+
ownerDocument.defaultView.getSelection();
|
|
62
|
+
const blockElement =
|
|
63
|
+
! attributeKey &&
|
|
64
|
+
ownerDocument.getElementById(
|
|
65
|
+
`block-${ clientId }`
|
|
66
|
+
);
|
|
67
|
+
|
|
68
|
+
if (
|
|
69
|
+
blockElement &&
|
|
70
|
+
! (
|
|
71
|
+
selection.anchorNode &&
|
|
72
|
+
blockElement.contains( selection.anchorNode )
|
|
73
|
+
)
|
|
74
|
+
) {
|
|
75
|
+
const isForward =
|
|
76
|
+
// eslint-disable-next-line no-bitwise
|
|
77
|
+
blockElement.compareDocumentPosition(
|
|
78
|
+
event.target
|
|
79
|
+
) & node.DOCUMENT_POSITION_FOLLOWING;
|
|
80
|
+
selection.setPosition(
|
|
81
|
+
blockElement,
|
|
82
|
+
isForward ? 0 : blockElement.childNodes.length
|
|
83
|
+
);
|
|
84
|
+
}
|
|
36
85
|
}
|
|
37
86
|
} else if ( hasMultiSelection() ) {
|
|
38
87
|
// Allow user to escape out of a multi-selection to a
|
|
@@ -55,6 +104,7 @@ export default function useClickSelection() {
|
|
|
55
104
|
selectBlock,
|
|
56
105
|
isSelectionEnabled,
|
|
57
106
|
getBlockSelectionStart,
|
|
107
|
+
getSelectionStart,
|
|
58
108
|
hasMultiSelection,
|
|
59
109
|
]
|
|
60
110
|
);
|
|
@@ -20,7 +20,7 @@ import { useRefEffect } from '@wordpress/compose';
|
|
|
20
20
|
*/
|
|
21
21
|
import { store as blockEditorStore } from '../../store';
|
|
22
22
|
import { useNotifyCopy } from '../../utils/use-notify-copy';
|
|
23
|
-
import { setClipboardBlocks } from './utils';
|
|
23
|
+
import { setClipboardBlocks, setContentEditableWrapper } from './utils';
|
|
24
24
|
import { getPasteEventData } from '../../utils/pasting';
|
|
25
25
|
|
|
26
26
|
export default function useClipboardHandler() {
|
|
@@ -130,7 +130,10 @@ export default function useClipboardHandler() {
|
|
|
130
130
|
if ( shouldHandleWholeBlocks && ! expandSelectionIsNeeded ) {
|
|
131
131
|
removeBlocks( selectedBlockClientIds );
|
|
132
132
|
} else {
|
|
133
|
-
|
|
133
|
+
setContentEditableWrapper(
|
|
134
|
+
event.target.ownerDocument.activeElement,
|
|
135
|
+
false
|
|
136
|
+
);
|
|
134
137
|
__unstableDeleteSelection();
|
|
135
138
|
}
|
|
136
139
|
} else if ( event.type === 'paste' ) {
|
|
@@ -8,20 +8,7 @@ import { useRefEffect } from '@wordpress/compose';
|
|
|
8
8
|
* Internal dependencies
|
|
9
9
|
*/
|
|
10
10
|
import { store as blockEditorStore } from '../../store';
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Sets the `contenteditable` wrapper element to `value`.
|
|
14
|
-
*
|
|
15
|
-
* @param {HTMLElement} node Block element.
|
|
16
|
-
* @param {boolean} value `contentEditable` value (true or false)
|
|
17
|
-
*/
|
|
18
|
-
function setContentEditableWrapper( node, value ) {
|
|
19
|
-
node.contentEditable = value;
|
|
20
|
-
// Firefox doesn't automatically move focus.
|
|
21
|
-
if ( value ) {
|
|
22
|
-
node.focus();
|
|
23
|
-
}
|
|
24
|
-
}
|
|
11
|
+
import { setContentEditableWrapper } from './utils';
|
|
25
12
|
|
|
26
13
|
/**
|
|
27
14
|
* Sets a multi-selection based on the native selection across blocks.
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WordPress dependencies
|
|
3
|
+
*/
|
|
4
|
+
import { useSelect } from '@wordpress/data';
|
|
5
|
+
import { useRefEffect } from '@wordpress/compose';
|
|
6
|
+
import { useContext } from '@wordpress/element';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Internal dependencies
|
|
10
|
+
*/
|
|
11
|
+
import { store as blockEditorStore } from '../../store';
|
|
12
|
+
import { getBlockClientId, getSelectionEditableElement } from '../../utils/dom';
|
|
13
|
+
import { BlockRefs } from '../provider/block-refs-provider';
|
|
14
|
+
|
|
15
|
+
// The React `on*` props the host bridges, mapped to their DOM event type. Only
|
|
16
|
+
// editing events are redirected under `editableRoot` (the wrapper becomes the
|
|
17
|
+
// editing host, so keyboard, input and composition events target it instead of
|
|
18
|
+
// the block); pointer and other events still reach the block and need no
|
|
19
|
+
// bridging. React prop names don't map to DOM types by lowercasing in general
|
|
20
|
+
// (onChange is `input`, onDoubleClick is `dblclick`), so the mapping is
|
|
21
|
+
// explicit, which also locks the bridged surface to events React actually fires.
|
|
22
|
+
const SUPPORTED_EVENTS = {
|
|
23
|
+
onKeyDown: 'keydown',
|
|
24
|
+
onKeyUp: 'keyup',
|
|
25
|
+
onBeforeInput: 'beforeinput',
|
|
26
|
+
onInput: 'input',
|
|
27
|
+
onCompositionStart: 'compositionstart',
|
|
28
|
+
onCompositionUpdate: 'compositionupdate',
|
|
29
|
+
onCompositionEnd: 'compositionend',
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
// The DOM event types the host listens for. Fixed, so the host attaches these
|
|
33
|
+
// listeners once rather than tracking which types are in use.
|
|
34
|
+
const EVENT_TYPES = Object.values( SUPPORTED_EVENTS );
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Collects the supported `on*` event handlers from a set of props, e.g. a
|
|
38
|
+
* block's merged `wrapperProps`, keyed by DOM event type. Used by the block to
|
|
39
|
+
* register them (see `useRegisterBlockEventHandlers`).
|
|
40
|
+
*
|
|
41
|
+
* @param {Object} props Props to read handlers from.
|
|
42
|
+
*
|
|
43
|
+
* @return {Object|undefined} The handlers by event type, or undefined when
|
|
44
|
+
* there are none.
|
|
45
|
+
*/
|
|
46
|
+
export function getEventHandlers( props ) {
|
|
47
|
+
let handlers;
|
|
48
|
+
|
|
49
|
+
for ( const name in SUPPORTED_EVENTS ) {
|
|
50
|
+
if ( typeof props[ name ] === 'function' ) {
|
|
51
|
+
handlers = handlers || {};
|
|
52
|
+
handlers[ SUPPORTED_EVENTS[ name ] ] = props[ name ];
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
return handlers;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// The native properties React copies onto its SyntheticEvent for each event
|
|
60
|
+
// type (the *EventInterface tables in react-dom), so the wrapper exposes exactly
|
|
61
|
+
// what a React handler would see and nothing more. Values are copied straight
|
|
62
|
+
// from the native event; React's normalizers only paper over browsers we don't
|
|
63
|
+
// support, and anything omitted stays reachable through `nativeEvent`, as in
|
|
64
|
+
// React (e.g. `getTargetRanges` on a `beforeinput`).
|
|
65
|
+
const EVENT_INTERFACE = [
|
|
66
|
+
'eventPhase',
|
|
67
|
+
'bubbles',
|
|
68
|
+
'cancelable',
|
|
69
|
+
'timeStamp',
|
|
70
|
+
'defaultPrevented',
|
|
71
|
+
'isTrusted',
|
|
72
|
+
];
|
|
73
|
+
const KEYBOARD_EVENT_INTERFACE = [
|
|
74
|
+
...EVENT_INTERFACE,
|
|
75
|
+
'view',
|
|
76
|
+
'detail',
|
|
77
|
+
'key',
|
|
78
|
+
'code',
|
|
79
|
+
'location',
|
|
80
|
+
'ctrlKey',
|
|
81
|
+
'shiftKey',
|
|
82
|
+
'altKey',
|
|
83
|
+
'metaKey',
|
|
84
|
+
'repeat',
|
|
85
|
+
'locale',
|
|
86
|
+
'getModifierState',
|
|
87
|
+
'charCode',
|
|
88
|
+
'keyCode',
|
|
89
|
+
'which',
|
|
90
|
+
];
|
|
91
|
+
const INPUT_EVENT_INTERFACE = [ ...EVENT_INTERFACE, 'data' ];
|
|
92
|
+
const EVENT_INTERFACES = {
|
|
93
|
+
keydown: KEYBOARD_EVENT_INTERFACE,
|
|
94
|
+
keyup: KEYBOARD_EVENT_INTERFACE,
|
|
95
|
+
beforeinput: INPUT_EVENT_INTERFACE,
|
|
96
|
+
input: INPUT_EVENT_INTERFACE,
|
|
97
|
+
compositionstart: INPUT_EVENT_INTERFACE,
|
|
98
|
+
compositionupdate: INPUT_EVENT_INTERFACE,
|
|
99
|
+
compositionend: INPUT_EVENT_INTERFACE,
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Builds a React `SyntheticEvent`-like object for an extension handler, which
|
|
104
|
+
* expects one. It mirrors what react-dom does: a plain object wrapping the real
|
|
105
|
+
* native event, eagerly copying the same interface properties React exposes for
|
|
106
|
+
* the event type, so a handler sees exactly React's surface and nothing more.
|
|
107
|
+
*
|
|
108
|
+
* `preventDefault` and `stopPropagation` forward to the native event, so they
|
|
109
|
+
* behave as through React; `stopPropagation` also flags the walk through block
|
|
110
|
+
* ancestors to stop. `target` is the editable inside the block rather than the
|
|
111
|
+
* real target (the editing host above it), and `currentTarget` is reassigned as
|
|
112
|
+
* the event bubbles from block to block.
|
|
113
|
+
*
|
|
114
|
+
* @param {Event} nativeEvent The event to wrap.
|
|
115
|
+
* @param {HTMLElement} target The element to report as the target.
|
|
116
|
+
*
|
|
117
|
+
* @return {Object} The synthetic event.
|
|
118
|
+
*/
|
|
119
|
+
function createBlockSyntheticEvent( nativeEvent, target ) {
|
|
120
|
+
let propagationStopped = false;
|
|
121
|
+
|
|
122
|
+
const syntheticEvent = {
|
|
123
|
+
nativeEvent,
|
|
124
|
+
type: nativeEvent.type,
|
|
125
|
+
target,
|
|
126
|
+
currentTarget: null,
|
|
127
|
+
preventDefault() {
|
|
128
|
+
nativeEvent.preventDefault();
|
|
129
|
+
syntheticEvent.defaultPrevented = true;
|
|
130
|
+
},
|
|
131
|
+
isDefaultPrevented() {
|
|
132
|
+
return syntheticEvent.defaultPrevented;
|
|
133
|
+
},
|
|
134
|
+
stopPropagation() {
|
|
135
|
+
nativeEvent.stopPropagation();
|
|
136
|
+
propagationStopped = true;
|
|
137
|
+
},
|
|
138
|
+
isPropagationStopped() {
|
|
139
|
+
return propagationStopped;
|
|
140
|
+
},
|
|
141
|
+
// The modern event system doesn't pool, so persistence is a no-op.
|
|
142
|
+
persist() {},
|
|
143
|
+
isPersistent() {
|
|
144
|
+
return true;
|
|
145
|
+
},
|
|
146
|
+
};
|
|
147
|
+
|
|
148
|
+
for ( const property of EVENT_INTERFACES[ nativeEvent.type ] ) {
|
|
149
|
+
const value = nativeEvent[ property ];
|
|
150
|
+
syntheticEvent[ property ] =
|
|
151
|
+
typeof value === 'function' ? value.bind( nativeEvent ) : value;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
return syntheticEvent;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Backwards compatibility for block event handlers under `editableRoot`.
|
|
159
|
+
*
|
|
160
|
+
* When a block supports `editableRoot`, the writing flow wrapper is the
|
|
161
|
+
* contentEditable editing host, so keyboard, input and composition events
|
|
162
|
+
* target the wrapper instead of the block. React `on*` handlers a third party
|
|
163
|
+
* added to a block through `wrapperProps` (e.g. via an `editor.BlockListBlock`
|
|
164
|
+
* filter) are on the block element, below the target, so they stop firing.
|
|
165
|
+
*
|
|
166
|
+
* The block registers those handlers (see `useBlockProps`), and this hook
|
|
167
|
+
* calls them from the host: it resolves the block that owns the selection and
|
|
168
|
+
* every block ancestor, and invokes each registered handler with a synthetic
|
|
169
|
+
* event, innermost first, like a bubbling event. The listeners are attached
|
|
170
|
+
* where React attaches its own (the portal container, the iframe's document
|
|
171
|
+
* element), so a block's handler runs and its `preventDefault` /
|
|
172
|
+
* `stopPropagation` behave as they would through React, without editableRoot.
|
|
173
|
+
*
|
|
174
|
+
* This does not cover handlers a filter puts on its own wrapping element rather
|
|
175
|
+
* than the block's `wrapperProps`; the block element is the supported event
|
|
176
|
+
* surface. It can be removed once input handling is lifted to the host.
|
|
177
|
+
*/
|
|
178
|
+
export default function useEditableRootEventHandlers() {
|
|
179
|
+
const { hasMultiSelection, getBlockParents } =
|
|
180
|
+
useSelect( blockEditorStore );
|
|
181
|
+
const { refsMap, eventHandlers } = useContext( BlockRefs );
|
|
182
|
+
return useRefEffect(
|
|
183
|
+
( node ) => {
|
|
184
|
+
function onEvent( event ) {
|
|
185
|
+
// Only act on real events targeting the host itself, while it
|
|
186
|
+
// is the editing host for a single block and some block has a
|
|
187
|
+
// handler to call.
|
|
188
|
+
if (
|
|
189
|
+
! eventHandlers.size ||
|
|
190
|
+
event.target !== node ||
|
|
191
|
+
! event.isTrusted ||
|
|
192
|
+
node.contentEditable !== 'true' ||
|
|
193
|
+
hasMultiSelection()
|
|
194
|
+
) {
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
const selection = node.ownerDocument.defaultView.getSelection();
|
|
199
|
+
|
|
200
|
+
if ( ! selection.rangeCount ) {
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
const editable = getSelectionEditableElement( selection, node );
|
|
205
|
+
const clientId = getBlockClientId( editable );
|
|
206
|
+
|
|
207
|
+
if ( ! clientId ) {
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// Call the handler on the block that owns the selection and each
|
|
212
|
+
// of its block ancestors, innermost first, like a bubbling
|
|
213
|
+
// event. The hierarchy comes from the store rather than the DOM,
|
|
214
|
+
// and one synthetic event, wrapping the real event, is reused
|
|
215
|
+
// for the whole chain, its currentTarget moved from block to
|
|
216
|
+
// block. The element is only resolved for blocks with a handler.
|
|
217
|
+
const clientIds = [
|
|
218
|
+
clientId,
|
|
219
|
+
...getBlockParents( clientId, true ),
|
|
220
|
+
];
|
|
221
|
+
|
|
222
|
+
let syntheticEvent;
|
|
223
|
+
for ( const ancestorClientId of clientIds ) {
|
|
224
|
+
const handler =
|
|
225
|
+
eventHandlers.get( ancestorClientId )?.current?.[
|
|
226
|
+
event.type
|
|
227
|
+
];
|
|
228
|
+
const element = handler && refsMap.get( ancestorClientId );
|
|
229
|
+
|
|
230
|
+
if ( ! element ) {
|
|
231
|
+
continue;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
if ( ! syntheticEvent ) {
|
|
235
|
+
syntheticEvent = createBlockSyntheticEvent(
|
|
236
|
+
event,
|
|
237
|
+
editable
|
|
238
|
+
);
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
syntheticEvent.currentTarget = element;
|
|
242
|
+
handler( syntheticEvent );
|
|
243
|
+
|
|
244
|
+
if ( syntheticEvent.isPropagationStopped() ) {
|
|
245
|
+
break;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
// Attach where React attaches its own event system: the portal
|
|
251
|
+
// container, which for the iframed canvas is the document element
|
|
252
|
+
// (see `preparePortalMount` in react-dom). Listening at the same
|
|
253
|
+
// node, non-capture, means a block's handler runs in the bubbling
|
|
254
|
+
// phase after core, and its stopPropagation stops at the same point
|
|
255
|
+
// React's would, as its `on*` handler would without editableRoot.
|
|
256
|
+
const root = node.ownerDocument.documentElement;
|
|
257
|
+
const unsubscribers = EVENT_TYPES.map( ( type ) => {
|
|
258
|
+
root.addEventListener( type, onEvent );
|
|
259
|
+
return () => root.removeEventListener( type, onEvent );
|
|
260
|
+
} );
|
|
261
|
+
return () =>
|
|
262
|
+
unsubscribers.forEach( ( unsubscribe ) => unsubscribe() );
|
|
263
|
+
},
|
|
264
|
+
[ hasMultiSelection, getBlockParents, refsMap, eventHandlers ]
|
|
265
|
+
);
|
|
266
|
+
}
|