@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
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/components/url-input/index.js"],
|
|
4
|
-
"sourcesContent": ["/**\n * External dependencies\n */\nimport clsx from 'clsx';\n\n/**\n * WordPress dependencies\n */\nimport { __, sprintf, _n } from '@wordpress/i18n';\nimport { Component, createRef } from '@wordpress/element';\nimport { UP, DOWN, ENTER, TAB } from '@wordpress/keycodes';\nimport {\n\tBaseControl,\n\tButton,\n\t__experimentalInputControl as InputControl,\n\tSpinner,\n\twithSpokenMessages,\n\tPopover,\n\tprivateApis as componentsPrivateApis,\n} from '@wordpress/components';\nimport {\n\tcompose,\n\tdebounce,\n\twithInstanceId,\n\twithSafeTimeout,\n} from '@wordpress/compose';\nimport { withSelect } from '@wordpress/data';\nimport { isURL } from '@wordpress/url';\n\n/**\n * Internal dependencies\n */\nimport { store as blockEditorStore } from '../../store';\nimport { unlock } from '../../lock-unlock';\n\nconst { ValidatedInputControl } = unlock( componentsPrivateApis );\n\n/**\n * Whether the argument is a function.\n *\n * @param {*} maybeFunc The argument to check.\n * @return {boolean} True if the argument is a function, false otherwise.\n */\nfunction isFunction( maybeFunc ) {\n\treturn typeof maybeFunc === 'function';\n}\n\nclass URLInput extends Component {\n\tconstructor( props ) {\n\t\tsuper( props );\n\n\t\tthis.onChange = this.onChange.bind( this );\n\t\tthis.onFocus = this.onFocus.bind( this );\n\t\tthis.onKeyDown = this.onKeyDown.bind( this );\n\t\tthis.selectLink = this.selectLink.bind( this );\n\t\tthis.handleOnClick = this.handleOnClick.bind( this );\n\t\tthis.bindSuggestionNode = this.bindSuggestionNode.bind( this );\n\t\tthis.autocompleteRef = props.autocompleteRef || createRef();\n\t\tthis.inputRef = props.inputRef || createRef();\n\t\tthis.hasRenderedValidation = { current: false };\n\t\tthis.updateSuggestions = debounce(\n\t\t\tthis.updateSuggestions.bind( this ),\n\t\t\t200\n\t\t);\n\n\t\tthis.suggestionNodes = [];\n\n\t\tthis.suggestionsRequest = null;\n\n\t\tthis.state = {\n\t\t\tsuggestions: [],\n\t\t\tshowSuggestions: false,\n\t\t\tsuggestionsValue: null,\n\t\t\tselectedSuggestion: null,\n\t\t\tsuggestionsListboxId: '',\n\t\t\tsuggestionOptionIdPrefix: '',\n\t\t};\n\t}\n\n\tcomponentDidUpdate( prevProps ) {\n\t\tconst { showSuggestions, selectedSuggestion } = this.state;\n\t\tconst { value, __experimentalShowInitialSuggestions = false } =\n\t\t\tthis.props;\n\n\t\t// Only have to worry about scrolling selected suggestion into view\n\t\t// when already expanded.\n\t\tif (\n\t\t\tshowSuggestions &&\n\t\t\tselectedSuggestion !== null &&\n\t\t\tthis.suggestionNodes[ selectedSuggestion ]\n\t\t) {\n\t\t\tthis.suggestionNodes[ selectedSuggestion ].scrollIntoView( {\n\t\t\t\tbehavior: 'instant',\n\t\t\t\tblock: 'nearest',\n\t\t\t\tinline: 'nearest',\n\t\t\t} );\n\t\t}\n\n\t\t// Update suggestions when the value changes.\n\t\tif ( prevProps.value !== value && ! this.props.disableSuggestions ) {\n\t\t\tif ( value?.length ) {\n\t\t\t\t// If the new value is not empty we need to update with suggestions for it.\n\t\t\t\tthis.updateSuggestions( value );\n\t\t\t} else if ( __experimentalShowInitialSuggestions ) {\n\t\t\t\t// If the new value is empty and we can show initial suggestions, then show initial suggestions.\n\t\t\t\tthis.updateSuggestions();\n\t\t\t}\n\t\t}\n\t}\n\n\tcomponentDidMount() {\n\t\tif ( this.shouldShowInitialSuggestions() ) {\n\t\t\tthis.updateSuggestions();\n\t\t}\n\t}\n\n\tcomponentWillUnmount() {\n\t\tthis.suggestionsRequest?.cancel?.();\n\t\tthis.suggestionsRequest = null;\n\t}\n\n\tbindSuggestionNode( index ) {\n\t\treturn ( ref ) => {\n\t\t\tthis.suggestionNodes[ index ] = ref;\n\t\t};\n\t}\n\n\tshouldShowInitialSuggestions() {\n\t\tconst { __experimentalShowInitialSuggestions = false, value } =\n\t\t\tthis.props;\n\t\treturn (\n\t\t\t__experimentalShowInitialSuggestions && ! ( value && value.length )\n\t\t);\n\t}\n\n\tupdateSuggestions( value = '' ) {\n\t\tconst {\n\t\t\t__experimentalFetchLinkSuggestions: fetchLinkSuggestions,\n\t\t\t__experimentalHandleURLSuggestions: handleURLSuggestions,\n\t\t} = this.props;\n\n\t\tif ( ! fetchLinkSuggestions ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Initial suggestions may only show if there is no value\n\t\t// (note: this includes whitespace).\n\t\tconst isInitialSuggestions = ! value?.length;\n\n\t\t// Trim only now we've determined whether or not it originally had a \"length\"\n\t\t// (even if that value was all whitespace).\n\t\tvalue = value.trim();\n\n\t\t// Allow a suggestions request if:\n\t\t// - there are at least 2 characters in the search input (except manual searches where\n\t\t// search input length is not required to trigger a fetch)\n\t\t// - this is a direct entry (eg: a URL)\n\t\tif (\n\t\t\t! isInitialSuggestions &&\n\t\t\t( value.length < 2 || ( ! handleURLSuggestions && isURL( value ) ) )\n\t\t) {\n\t\t\tthis.suggestionsRequest?.cancel?.();\n\t\t\tthis.suggestionsRequest = null;\n\n\t\t\tthis.setState( {\n\t\t\t\tsuggestions: [],\n\t\t\t\tshowSuggestions: false,\n\t\t\t\tsuggestionsValue: value,\n\t\t\t\tselectedSuggestion: null,\n\t\t\t\tloading: false,\n\t\t\t} );\n\n\t\t\treturn;\n\t\t}\n\n\t\tthis.setState( {\n\t\t\tselectedSuggestion: null,\n\t\t\tloading: true,\n\t\t} );\n\n\t\tconst request = fetchLinkSuggestions( value, {\n\t\t\tisInitialSuggestions,\n\t\t} );\n\n\t\trequest\n\t\t\t.then( ( suggestions ) => {\n\t\t\t\t// A fetch Promise doesn't have an abort option. It's mimicked by\n\t\t\t\t// comparing the request reference in on the instance, which is\n\t\t\t\t// reset or deleted on subsequent requests or unmounting.\n\t\t\t\tif ( this.suggestionsRequest !== request ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tthis.setState( {\n\t\t\t\t\tsuggestions,\n\t\t\t\t\tsuggestionsValue: value,\n\t\t\t\t\tloading: false,\n\t\t\t\t\tshowSuggestions: !! suggestions.length,\n\t\t\t\t} );\n\n\t\t\t\tif ( !! suggestions.length ) {\n\t\t\t\t\tthis.props.debouncedSpeak(\n\t\t\t\t\t\tsprintf(\n\t\t\t\t\t\t\t/* translators: %d: number of results. */\n\t\t\t\t\t\t\t_n(\n\t\t\t\t\t\t\t\t'%d result found, use up and down arrow keys to navigate.',\n\t\t\t\t\t\t\t\t'%d results found, use up and down arrow keys to navigate.',\n\t\t\t\t\t\t\t\tsuggestions.length\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tsuggestions.length\n\t\t\t\t\t\t),\n\t\t\t\t\t\t'assertive'\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tthis.props.debouncedSpeak(\n\t\t\t\t\t\t__( 'No results.' ),\n\t\t\t\t\t\t'assertive'\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} )\n\t\t\t.catch( () => {\n\t\t\t\tif ( this.suggestionsRequest !== request ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tthis.setState( {\n\t\t\t\t\tloading: false,\n\t\t\t\t} );\n\t\t\t} )\n\t\t\t.finally( () => {\n\t\t\t\t// If this is the current promise then reset the reference\n\t\t\t\t// to allow for checking if a new request is made.\n\t\t\t\tif ( this.suggestionsRequest === request ) {\n\t\t\t\t\tthis.suggestionsRequest = null;\n\t\t\t\t}\n\t\t\t} );\n\n\t\t// Note that this assignment is handled *before* the async search request\n\t\t// as a Promise always resolves on the next tick of the event loop.\n\t\tthis.suggestionsRequest = request;\n\t}\n\n\tonChange( newValue ) {\n\t\tthis.props.onChange( newValue );\n\t}\n\n\tonFocus() {\n\t\tconst { suggestions } = this.state;\n\t\tconst { disableSuggestions, value } = this.props;\n\n\t\t// When opening the link editor, if there's a value present, we want to load the suggestions pane with the results for this input search value\n\t\t// Don't re-run the suggestions on focus if there are already suggestions present (prevents searching again when tabbing between the input and buttons)\n\t\t// or there is already a request in progress.\n\t\tif (\n\t\t\tvalue &&\n\t\t\t! disableSuggestions &&\n\t\t\t! ( suggestions && suggestions.length ) &&\n\t\t\tthis.suggestionsRequest === null\n\t\t) {\n\t\t\t// Ensure the suggestions are updated with the current input value.\n\t\t\tthis.updateSuggestions( value );\n\t\t}\n\t}\n\n\tonKeyDown( event ) {\n\t\tthis.props.onKeyDown?.( event );\n\t\tconst { showSuggestions, selectedSuggestion, suggestions, loading } =\n\t\t\tthis.state;\n\n\t\t// If the suggestions are not shown or loading, we shouldn't handle the arrow keys\n\t\t// We shouldn't preventDefault to allow block arrow keys navigation.\n\t\tif ( ! showSuggestions || ! suggestions.length || loading ) {\n\t\t\t// In the Windows version of Firefox the up and down arrows don't move the caret\n\t\t\t// within an input field like they do for Mac Firefox/Chrome/Safari. This causes\n\t\t\t// a form of focus trapping that is disruptive to the user experience. This disruption\n\t\t\t// only happens if the caret is not in the first or last position in the text input.\n\t\t\t// See: https://github.com/WordPress/gutenberg/issues/5693#issuecomment-436684747\n\t\t\tswitch ( event.keyCode ) {\n\t\t\t\t// When UP is pressed, if the caret is at the start of the text, move it to the 0\n\t\t\t\t// position.\n\t\t\t\tcase UP: {\n\t\t\t\t\tif ( 0 !== event.target.selectionStart ) {\n\t\t\t\t\t\tevent.preventDefault();\n\n\t\t\t\t\t\t// Set the input caret to position 0.\n\t\t\t\t\t\tevent.target.setSelectionRange( 0, 0 );\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t// When DOWN is pressed, if the caret is not at the end of the text, move it to the\n\t\t\t\t// last position.\n\t\t\t\tcase DOWN: {\n\t\t\t\t\tif (\n\t\t\t\t\t\tthis.props.value.length !== event.target.selectionStart\n\t\t\t\t\t) {\n\t\t\t\t\t\tevent.preventDefault();\n\n\t\t\t\t\t\t// Set the input caret to the last position.\n\t\t\t\t\t\tevent.target.setSelectionRange(\n\t\t\t\t\t\t\tthis.props.value.length,\n\t\t\t\t\t\t\tthis.props.value.length\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\t// Submitting while loading should trigger onSubmit.\n\t\t\t\tcase ENTER: {\n\t\t\t\t\tif ( this.props.onSubmit ) {\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\tthis.props.onSubmit( null, event );\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst suggestion =\n\t\t\tthis.state.suggestions[ this.state.selectedSuggestion ];\n\n\t\tswitch ( event.keyCode ) {\n\t\t\tcase UP: {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tconst previousIndex = ! selectedSuggestion\n\t\t\t\t\t? suggestions.length - 1\n\t\t\t\t\t: selectedSuggestion - 1;\n\t\t\t\tthis.setState( {\n\t\t\t\t\tselectedSuggestion: previousIndex,\n\t\t\t\t} );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase DOWN: {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tconst nextIndex =\n\t\t\t\t\tselectedSuggestion === null ||\n\t\t\t\t\tselectedSuggestion === suggestions.length - 1\n\t\t\t\t\t\t? 0\n\t\t\t\t\t\t: selectedSuggestion + 1;\n\t\t\t\tthis.setState( {\n\t\t\t\t\tselectedSuggestion: nextIndex,\n\t\t\t\t} );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase TAB: {\n\t\t\t\tif ( this.state.selectedSuggestion !== null ) {\n\t\t\t\t\tthis.selectLink( suggestion );\n\t\t\t\t\t// Announce a link has been selected when tabbing away from the input field.\n\t\t\t\t\tthis.props.speak( __( 'Link selected.' ) );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ENTER: {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tif ( this.state.selectedSuggestion !== null ) {\n\t\t\t\t\tthis.selectLink( suggestion );\n\n\t\t\t\t\tif ( this.props.onSubmit ) {\n\t\t\t\t\t\tthis.props.onSubmit( suggestion, event );\n\t\t\t\t\t}\n\t\t\t\t} else if ( this.props.onSubmit ) {\n\t\t\t\t\tthis.props.onSubmit( null, event );\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tselectLink( suggestion ) {\n\t\tthis.props.onChange( suggestion.url, suggestion );\n\t\tthis.setState( {\n\t\t\tselectedSuggestion: null,\n\t\t\tshowSuggestions: false,\n\t\t} );\n\t}\n\n\thandleOnClick( suggestion ) {\n\t\tthis.selectLink( suggestion );\n\t\t// Move focus to the input field when a link suggestion is clicked.\n\t\tthis.inputRef.current.focus();\n\t}\n\n\tstatic getDerivedStateFromProps(\n\t\t{\n\t\t\tvalue,\n\t\t\tinstanceId,\n\t\t\tdisableSuggestions,\n\t\t\t__experimentalShowInitialSuggestions = false,\n\t\t},\n\t\t{ showSuggestions }\n\t) {\n\t\tlet shouldShowSuggestions = showSuggestions;\n\n\t\tconst hasValue = value && value.length;\n\n\t\tif ( ! __experimentalShowInitialSuggestions && ! hasValue ) {\n\t\t\tshouldShowSuggestions = false;\n\t\t}\n\n\t\tif ( disableSuggestions === true ) {\n\t\t\tshouldShowSuggestions = false;\n\t\t}\n\n\t\treturn {\n\t\t\tshowSuggestions: shouldShowSuggestions,\n\t\t\tsuggestionsListboxId: `block-editor-url-input-suggestions-${ instanceId }`,\n\t\t\tsuggestionOptionIdPrefix: `block-editor-url-input-suggestion-${ instanceId }`,\n\t\t};\n\t}\n\n\trender() {\n\t\treturn (\n\t\t\t<>\n\t\t\t\t{ this.renderControl() }\n\t\t\t\t{ this.renderSuggestions() }\n\t\t\t</>\n\t\t);\n\t}\n\n\trenderControl() {\n\t\tconst {\n\t\t\tlabel = null,\n\t\t\tclassName,\n\t\t\tisFullWidth,\n\t\t\tinstanceId,\n\t\t\tplaceholder = __( 'Paste URL or type to search' ),\n\t\t\t__experimentalRenderControl: renderControl,\n\t\t\tvalue = '',\n\t\t\thideLabelFromVision = false,\n\t\t\thelp = null,\n\t\t\tdisabled = false,\n\t\t\tcustomValidity,\n\t\t\tmarkWhenOptional,\n\t\t} = this.props;\n\n\t\tconst {\n\t\t\tloading,\n\t\t\tshowSuggestions,\n\t\t\tselectedSuggestion,\n\t\t\tsuggestionsListboxId,\n\t\t\tsuggestionOptionIdPrefix,\n\t\t} = this.state;\n\n\t\tconst inputId = `url-input-control-${ instanceId }`;\n\n\t\tconst controlProps = {\n\t\t\tid: inputId, // Passes attribute to label for the for attribute\n\t\t\tlabel,\n\t\t\tclassName: clsx( 'block-editor-url-input', className, {\n\t\t\t\t'is-full-width': isFullWidth,\n\t\t\t} ),\n\t\t\thideLabelFromVision,\n\t\t};\n\n\t\tconst inputProps = {\n\t\t\tid: inputId,\n\t\t\tvalue,\n\t\t\trequired: this.props.required ?? true,\n\t\t\ttype: 'text',\n\t\t\tname: inputId,\n\t\t\tautoComplete: 'off',\n\t\t\tonChange: disabled ? () => {} : this.onChange, // Disable onChange when disabled\n\t\t\tonFocus: disabled ? () => {} : this.onFocus, // Disable onFocus when disabled\n\t\t\tplaceholder,\n\t\t\tonKeyDown: disabled ? () => {} : this.onKeyDown, // Disable onKeyDown when disabled\n\t\t\trole: 'combobox',\n\t\t\t'aria-label': label ? undefined : __( 'URL' ), // Ensure input always has an accessible label\n\t\t\t'aria-expanded': showSuggestions,\n\t\t\t'aria-autocomplete': 'list',\n\t\t\t'aria-owns': suggestionsListboxId,\n\t\t\t'aria-activedescendant':\n\t\t\t\tselectedSuggestion !== null\n\t\t\t\t\t? `${ suggestionOptionIdPrefix }-${ selectedSuggestion }`\n\t\t\t\t\t: undefined,\n\t\t\tref: this.inputRef,\n\t\t\tdisabled,\n\t\t\tsuffix: this.props.suffix,\n\t\t\thelp,\n\t\t};\n\n\t\tconst validationProps = {\n\t\t\tcustomValidity,\n\t\t\t// Suppress the \"(Required)\" indicator in the label.\n\t\t\t// The field is still required for validation, but the indicator\n\t\t\t// can be hidden when markWhenOptional is set to true.\n\t\t\t...( markWhenOptional !== undefined && {\n\t\t\t\tmarkWhenOptional,\n\t\t\t} ),\n\t\t};\n\n\t\tif ( renderControl ) {\n\t\t\treturn renderControl( controlProps, inputProps, loading );\n\t\t}\n\n\t\t// Use ValidatedInputControl if customValidity has ever had a non-undefined value.\n\t\tif ( customValidity !== undefined ) {\n\t\t\tthis.hasRenderedValidation.current = true;\n\t\t}\n\n\t\tconst MaybeValidatedInputControl = this.hasRenderedValidation.current\n\t\t\t? ValidatedInputControl\n\t\t\t: InputControl;\n\n\t\treturn (\n\t\t\t<BaseControl { ...controlProps }>\n\t\t\t\t<MaybeValidatedInputControl\n\t\t\t\t\t{ ...inputProps }\n\t\t\t\t\t{ ...( this.hasRenderedValidation.current\n\t\t\t\t\t\t? validationProps\n\t\t\t\t\t\t: {} ) }\n\t\t\t\t\t__next40pxDefaultSize\n\t\t\t\t/>\n\t\t\t\t{ loading && <Spinner /> }\n\t\t\t</BaseControl>\n\t\t);\n\t}\n\n\trenderSuggestions() {\n\t\tconst {\n\t\t\tclassName,\n\t\t\t__experimentalRenderSuggestions: renderSuggestions,\n\t\t} = this.props;\n\n\t\tconst {\n\t\t\tshowSuggestions,\n\t\t\tsuggestions,\n\t\t\tsuggestionsValue,\n\t\t\tselectedSuggestion,\n\t\t\tsuggestionsListboxId,\n\t\t\tsuggestionOptionIdPrefix,\n\t\t\tloading,\n\t\t} = this.state;\n\n\t\tif ( ! showSuggestions || suggestions.length === 0 ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst suggestionsListProps = {\n\t\t\tid: suggestionsListboxId,\n\t\t\tref: this.autocompleteRef,\n\t\t\trole: 'listbox',\n\t\t};\n\n\t\tconst buildSuggestionItemProps = ( suggestion, index ) => {\n\t\t\treturn {\n\t\t\t\trole: 'option',\n\t\t\t\ttabIndex: '-1',\n\t\t\t\tid: `${ suggestionOptionIdPrefix }-${ index }`,\n\t\t\t\tref: this.bindSuggestionNode( index ),\n\t\t\t\t'aria-selected':\n\t\t\t\t\tindex === selectedSuggestion ? true : undefined,\n\t\t\t};\n\t\t};\n\n\t\tif ( isFunction( renderSuggestions ) ) {\n\t\t\treturn renderSuggestions( {\n\t\t\t\tsuggestions,\n\t\t\t\tselectedSuggestion,\n\t\t\t\tsuggestionsListProps,\n\t\t\t\tbuildSuggestionItemProps,\n\t\t\t\tisLoading: loading,\n\t\t\t\thandleSuggestionClick: this.handleOnClick,\n\t\t\t\tisInitialSuggestions: ! suggestionsValue?.length,\n\t\t\t\tcurrentInputValue: suggestionsValue,\n\t\t\t} );\n\t\t}\n\n\t\treturn (\n\t\t\t<Popover placement=\"bottom\" focusOnMount={ false }>\n\t\t\t\t<div\n\t\t\t\t\t{ ...suggestionsListProps }\n\t\t\t\t\tclassName={ clsx( 'block-editor-url-input__suggestions', {\n\t\t\t\t\t\t[ `${ className }__suggestions` ]: className,\n\t\t\t\t\t} ) }\n\t\t\t\t>\n\t\t\t\t\t{ suggestions.map( ( suggestion, index ) => (\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t__next40pxDefaultSize\n\t\t\t\t\t\t\t{ ...buildSuggestionItemProps( suggestion, index ) }\n\t\t\t\t\t\t\tkey={ suggestion.id }\n\t\t\t\t\t\t\tclassName={ clsx(\n\t\t\t\t\t\t\t\t'block-editor-url-input__suggestion',\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t'is-selected': index === selectedSuggestion,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\tonClick={ () => this.handleOnClick( suggestion ) }\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{ suggestion.title }\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t) ) }\n\t\t\t\t</div>\n\t\t\t</Popover>\n\t\t);\n\t}\n}\n\n/**\n * @see https://github.com/WordPress/gutenberg/blob/HEAD/packages/block-editor/src/components/url-input/README.md\n */\nexport default compose(\n\twithSafeTimeout,\n\twithSpokenMessages,\n\twithInstanceId,\n\twithSelect( ( select, props ) => {\n\t\t// If a link suggestions handler is already provided then\n\t\t// bail.\n\t\tif ( isFunction( props.__experimentalFetchLinkSuggestions ) ) {\n\t\t\treturn;\n\t\t}\n\t\tconst { getSettings } = select( blockEditorStore );\n\t\treturn {\n\t\t\t__experimentalFetchLinkSuggestions:\n\t\t\t\tgetSettings().__experimentalFetchLinkSuggestions,\n\t\t};\n\t} )\n)( URLInput );\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,kBAAiB;AAKjB,kBAAgC;AAChC,
|
|
6
|
-
"names": ["componentsPrivateApis", "
|
|
4
|
+
"sourcesContent": ["/**\n * External dependencies\n */\nimport clsx from 'clsx';\n\n/**\n * WordPress dependencies\n */\nimport { speak } from '@wordpress/a11y';\nimport { __, sprintf, _n } from '@wordpress/i18n';\nimport { useEffect, useRef, useState } from '@wordpress/element';\nimport { UP, DOWN, ENTER, TAB } from '@wordpress/keycodes';\nimport {\n\tBaseControl,\n\tButton,\n\t__experimentalInputControl as InputControl,\n\tSpinner,\n\tPopover,\n\tprivateApis as componentsPrivateApis,\n} from '@wordpress/components';\nimport { useDebounce, useEvent, useInstanceId } from '@wordpress/compose';\nimport { useSelect } from '@wordpress/data';\nimport { isURL } from '@wordpress/url';\n\n/**\n * Internal dependencies\n */\nimport { store as blockEditorStore } from '../../store';\nimport { unlock } from '../../lock-unlock';\n\nconst { ValidatedInputControl } = unlock( componentsPrivateApis );\n\nconst noop = () => {};\n\n/**\n * Whether the argument is a function.\n *\n * @param {*} maybeFunc The argument to check.\n * @return {boolean} True if the argument is a function, false otherwise.\n */\nfunction isFunction( maybeFunc ) {\n\treturn typeof maybeFunc === 'function';\n}\n\n/**\n * Text field for entering a URL, with an autocomplete list of matching posts,\n * pages and other link suggestions.\n *\n * @see https://github.com/WordPress/gutenberg/blob/HEAD/packages/block-editor/src/components/url-input/README.md\n *\n * @param {Object} props Component props.\n */\nexport default function URLInput( props ) {\n\tconst {\n\t\t__experimentalFetchLinkSuggestions: fetchLinkSuggestionsProp,\n\t\t__experimentalHandleURLSuggestions: handleURLSuggestions,\n\t\t__experimentalRenderControl: renderControl,\n\t\t__experimentalRenderSuggestions: renderSuggestions,\n\t\t__experimentalShowInitialSuggestions: showInitialSuggestions = false,\n\t\tautocompleteRef,\n\t\tclassName,\n\t\tcustomValidity,\n\t\tdisableSuggestions,\n\t\tdisabled = false,\n\t\thelp = null,\n\t\thideLabelFromVision = false,\n\t\tinputRef,\n\t\tisFullWidth,\n\t\tlabel = null,\n\t\tmarkWhenOptional,\n\t\tonChange,\n\t\tonKeyDown,\n\t\tonSubmit,\n\t\tplaceholder = __( 'Paste URL or type to search' ),\n\t\trequired = true,\n\t\tsuffix,\n\t\tvalue = '',\n\t} = props;\n\n\tconst instanceId = useInstanceId( URLInput );\n\tconst { getSettings } = useSelect( blockEditorStore );\n\tconst debouncedSpeak = useDebounce( speak, 500 );\n\n\tconst [ suggestions, setSuggestions ] = useState( [] );\n\tconst [ suggestionsValue, setSuggestionsValue ] = useState( null );\n\tconst [ selectedSuggestion, setSelectedSuggestion ] = useState( null );\n\tconst [ isSuggestionsListOpen, setIsSuggestionsListOpen ] =\n\t\tuseState( false );\n\tconst [ isLoading, setIsLoading ] = useState( false );\n\n\tconst fallbackInputRef = useRef();\n\tconst suggestionNodesRef = useRef( [] );\n\t// A fetch Promise can't be aborted. It's mimicked by holding on to the\n\t// pending request so that responses of superseded requests can be ignored.\n\tconst suggestionsRequestRef = useRef( null );\n\n\tconst controlInputRef = inputRef ?? fallbackInputRef;\n\n\tconst inputId = `url-input-control-${ instanceId }`;\n\tconst suggestionsListboxId = `block-editor-url-input-suggestions-${ instanceId }`;\n\tconst suggestionOptionIdPrefix = `block-editor-url-input-suggestion-${ instanceId }`;\n\n\t// The suggestions are hidden rather than discarded, so that returning focus\n\t// to a field that already has results doesn't trigger a new search.\n\tconst showSuggestions =\n\t\tisSuggestionsListOpen &&\n\t\tdisableSuggestions !== true &&\n\t\t( showInitialSuggestions || !! value.length );\n\n\tconst updateSuggestions = useEvent( ( searchValue = '' ) => {\n\t\tconst fetchLinkSuggestions = isFunction( fetchLinkSuggestionsProp )\n\t\t\t? fetchLinkSuggestionsProp\n\t\t\t: getSettings().__experimentalFetchLinkSuggestions;\n\n\t\tif ( ! fetchLinkSuggestions ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Initial suggestions may only show if there is no value\n\t\t// (note: this includes whitespace).\n\t\tconst isInitialSuggestions = ! searchValue?.length;\n\n\t\t// Trim only now we've determined whether or not it originally had a \"length\"\n\t\t// (even if that value was all whitespace).\n\t\tconst search = searchValue.trim();\n\n\t\t// Allow a suggestions request if:\n\t\t// - there are at least 2 characters in the search input (except manual searches where\n\t\t// search input length is not required to trigger a fetch)\n\t\t// - this is a direct entry (eg: a URL)\n\t\tif (\n\t\t\t! isInitialSuggestions &&\n\t\t\t( search.length < 2 ||\n\t\t\t\t( ! handleURLSuggestions && isURL( search ) ) )\n\t\t) {\n\t\t\tsuggestionsRequestRef.current?.cancel?.();\n\t\t\tsuggestionsRequestRef.current = null;\n\n\t\t\tsetSuggestions( [] );\n\t\t\tsetIsSuggestionsListOpen( false );\n\t\t\tsetSuggestionsValue( search );\n\t\t\tsetSelectedSuggestion( null );\n\t\t\tsetIsLoading( false );\n\n\t\t\treturn;\n\t\t}\n\n\t\tsetSelectedSuggestion( null );\n\t\tsetIsLoading( true );\n\n\t\tconst request = fetchLinkSuggestions( search, {\n\t\t\tisInitialSuggestions,\n\t\t} );\n\t\tsuggestionsRequestRef.current = request;\n\n\t\trequest\n\t\t\t.then( ( nextSuggestions ) => {\n\t\t\t\tif ( suggestionsRequestRef.current !== request ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tsetSuggestions( nextSuggestions );\n\t\t\t\tsetSuggestionsValue( search );\n\t\t\t\tsetIsLoading( false );\n\t\t\t\tsetIsSuggestionsListOpen( !! nextSuggestions.length );\n\n\t\t\t\tif ( nextSuggestions.length ) {\n\t\t\t\t\tdebouncedSpeak(\n\t\t\t\t\t\tsprintf(\n\t\t\t\t\t\t\t/* translators: %d: number of results. */\n\t\t\t\t\t\t\t_n(\n\t\t\t\t\t\t\t\t'%d result found, use up and down arrow keys to navigate.',\n\t\t\t\t\t\t\t\t'%d results found, use up and down arrow keys to navigate.',\n\t\t\t\t\t\t\t\tnextSuggestions.length\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tnextSuggestions.length\n\t\t\t\t\t\t),\n\t\t\t\t\t\t'assertive'\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tdebouncedSpeak( __( 'No results.' ), 'assertive' );\n\t\t\t\t}\n\t\t\t} )\n\t\t\t.catch( () => {\n\t\t\t\tif ( suggestionsRequestRef.current !== request ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tsetIsLoading( false );\n\t\t\t} )\n\t\t\t.finally( () => {\n\t\t\t\tif ( suggestionsRequestRef.current === request ) {\n\t\t\t\t\tsuggestionsRequestRef.current = null;\n\t\t\t\t}\n\t\t\t} );\n\t} );\n\n\tconst debouncedUpdateSuggestions = useDebounce( updateSuggestions, 200 );\n\n\t// Keep the suggestions in sync with the value being searched for. An empty\n\t// value requests the initial suggestions, when those are enabled.\n\tuseEffect( () => {\n\t\tif (\n\t\t\t! disableSuggestions &&\n\t\t\t( value.length || showInitialSuggestions )\n\t\t) {\n\t\t\tdebouncedUpdateSuggestions( value );\n\t\t}\n\t}, [\n\t\tvalue,\n\t\tdisableSuggestions,\n\t\tshowInitialSuggestions,\n\t\tdebouncedUpdateSuggestions,\n\t] );\n\n\t// Persist the hidden state, so that the list can't reappear with stale\n\t// results once the value or the props allow suggestions again.\n\tuseEffect( () => {\n\t\tif ( ! showSuggestions ) {\n\t\t\tsetIsSuggestionsListOpen( false );\n\t\t}\n\t}, [ showSuggestions ] );\n\n\tuseEffect( () => {\n\t\tif ( showSuggestions && selectedSuggestion !== null ) {\n\t\t\tsuggestionNodesRef.current[ selectedSuggestion ]?.scrollIntoView( {\n\t\t\t\tbehavior: 'instant',\n\t\t\t\tblock: 'nearest',\n\t\t\t\tinline: 'nearest',\n\t\t\t} );\n\t\t}\n\t}, [ showSuggestions, selectedSuggestion ] );\n\n\tuseEffect( () => {\n\t\treturn () => {\n\t\t\tsuggestionsRequestRef.current?.cancel?.();\n\t\t\tsuggestionsRequestRef.current = null;\n\t\t};\n\t}, [] );\n\n\tfunction selectLink( suggestion ) {\n\t\tonChange( suggestion.url, suggestion );\n\t\tsetSelectedSuggestion( null );\n\t\tsetIsSuggestionsListOpen( false );\n\t}\n\n\tfunction handleSuggestionClick( suggestion ) {\n\t\tselectLink( suggestion );\n\t\t// Move focus to the input field when a link suggestion is clicked.\n\t\tcontrolInputRef.current.focus();\n\t}\n\n\tfunction handleChange( newValue ) {\n\t\t// `InputControl` passes an `{ event }` object as its second argument,\n\t\t// which callers would mistake for a selected suggestion.\n\t\tonChange( newValue );\n\t}\n\n\tfunction handleFocus() {\n\t\t// When opening the link editor, if there's a value present, we want to load the suggestions pane with the results for this input search value\n\t\t// Don't re-run the suggestions on focus if there are already suggestions present (prevents searching again when tabbing between the input and buttons)\n\t\t// or there is already a request in progress.\n\t\tif (\n\t\t\tvalue &&\n\t\t\t! disableSuggestions &&\n\t\t\t! suggestions.length &&\n\t\t\tsuggestionsRequestRef.current === null\n\t\t) {\n\t\t\tdebouncedUpdateSuggestions( value );\n\t\t}\n\t}\n\n\tfunction handleKeyDown( event ) {\n\t\tonKeyDown?.( event );\n\n\t\t// If the suggestions are not shown or loading, we shouldn't handle the arrow keys\n\t\t// We shouldn't preventDefault to allow block arrow keys navigation.\n\t\tif ( ! showSuggestions || ! suggestions.length || isLoading ) {\n\t\t\t// In the Windows version of Firefox the up and down arrows don't move the caret\n\t\t\t// within an input field like they do for Mac Firefox/Chrome/Safari. This causes\n\t\t\t// a form of focus trapping that is disruptive to the user experience. This disruption\n\t\t\t// only happens if the caret is not in the first or last position in the text input.\n\t\t\t// See: https://github.com/WordPress/gutenberg/issues/5693#issuecomment-436684747\n\t\t\tswitch ( event.keyCode ) {\n\t\t\t\t// When UP is pressed, if the caret is at the start of the text, move it to the 0\n\t\t\t\t// position.\n\t\t\t\tcase UP: {\n\t\t\t\t\tif ( 0 !== event.target.selectionStart ) {\n\t\t\t\t\t\tevent.preventDefault();\n\n\t\t\t\t\t\t// Set the input caret to position 0.\n\t\t\t\t\t\tevent.target.setSelectionRange( 0, 0 );\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t// When DOWN is pressed, if the caret is not at the end of the text, move it to the\n\t\t\t\t// last position.\n\t\t\t\tcase DOWN: {\n\t\t\t\t\tif ( value.length !== event.target.selectionStart ) {\n\t\t\t\t\t\tevent.preventDefault();\n\n\t\t\t\t\t\t// Set the input caret to the last position.\n\t\t\t\t\t\tevent.target.setSelectionRange(\n\t\t\t\t\t\t\tvalue.length,\n\t\t\t\t\t\t\tvalue.length\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\t// Submitting while loading should trigger onSubmit.\n\t\t\t\tcase ENTER: {\n\t\t\t\t\tif ( onSubmit ) {\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\tonSubmit( null, event );\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst suggestion = suggestions[ selectedSuggestion ];\n\n\t\tswitch ( event.keyCode ) {\n\t\t\tcase UP: {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tsetSelectedSuggestion(\n\t\t\t\t\t! selectedSuggestion\n\t\t\t\t\t\t? suggestions.length - 1\n\t\t\t\t\t\t: selectedSuggestion - 1\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase DOWN: {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tsetSelectedSuggestion(\n\t\t\t\t\tselectedSuggestion === null ||\n\t\t\t\t\t\tselectedSuggestion === suggestions.length - 1\n\t\t\t\t\t\t? 0\n\t\t\t\t\t\t: selectedSuggestion + 1\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase TAB: {\n\t\t\t\tif ( selectedSuggestion !== null ) {\n\t\t\t\t\tselectLink( suggestion );\n\t\t\t\t\t// Announce a link has been selected when tabbing away from the input field.\n\t\t\t\t\tspeak( __( 'Link selected.' ) );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ENTER: {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tif ( selectedSuggestion !== null ) {\n\t\t\t\t\tselectLink( suggestion );\n\n\t\t\t\t\tif ( onSubmit ) {\n\t\t\t\t\t\tonSubmit( suggestion, event );\n\t\t\t\t\t}\n\t\t\t\t} else if ( onSubmit ) {\n\t\t\t\t\tonSubmit( null, event );\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tconst controlProps = {\n\t\tid: inputId, // Passes attribute to label for the for attribute\n\t\tlabel,\n\t\tclassName: clsx( 'block-editor-url-input', className, {\n\t\t\t'is-full-width': isFullWidth,\n\t\t} ),\n\t\thideLabelFromVision,\n\t};\n\n\tconst inputProps = {\n\t\tid: inputId,\n\t\tvalue,\n\t\trequired,\n\t\ttype: 'text',\n\t\tname: inputId,\n\t\tautoComplete: 'off',\n\t\tonChange: disabled ? noop : handleChange,\n\t\tonFocus: disabled ? noop : handleFocus,\n\t\tonKeyDown: disabled ? noop : handleKeyDown,\n\t\tplaceholder,\n\t\trole: 'combobox',\n\t\t'aria-label': label ? undefined : __( 'URL' ), // Ensure input always has an accessible label\n\t\t'aria-expanded': showSuggestions,\n\t\t'aria-autocomplete': 'list',\n\t\t'aria-owns': suggestionsListboxId,\n\t\t'aria-activedescendant':\n\t\t\tselectedSuggestion !== null\n\t\t\t\t? `${ suggestionOptionIdPrefix }-${ selectedSuggestion }`\n\t\t\t\t: undefined,\n\t\tref: controlInputRef,\n\t\tdisabled,\n\t\tsuffix,\n\t\thelp,\n\t};\n\n\treturn (\n\t\t<>\n\t\t\t<Control\n\t\t\t\tcontrolProps={ controlProps }\n\t\t\t\tinputProps={ inputProps }\n\t\t\t\tisLoading={ isLoading }\n\t\t\t\tcustomValidity={ customValidity }\n\t\t\t\tmarkWhenOptional={ markWhenOptional }\n\t\t\t\trenderControl={ renderControl }\n\t\t\t/>\n\t\t\t{ showSuggestions && suggestions.length > 0 && (\n\t\t\t\t<Suggestions\n\t\t\t\t\tautocompleteRef={ autocompleteRef }\n\t\t\t\t\tclassName={ className }\n\t\t\t\t\thandleSuggestionClick={ handleSuggestionClick }\n\t\t\t\t\tisLoading={ isLoading }\n\t\t\t\t\trenderSuggestions={ renderSuggestions }\n\t\t\t\t\tselectedSuggestion={ selectedSuggestion }\n\t\t\t\t\tsuggestionNodesRef={ suggestionNodesRef }\n\t\t\t\t\tsuggestionOptionIdPrefix={ suggestionOptionIdPrefix }\n\t\t\t\t\tsuggestions={ suggestions }\n\t\t\t\t\tsuggestionsListboxId={ suggestionsListboxId }\n\t\t\t\t\tsuggestionsValue={ suggestionsValue }\n\t\t\t\t/>\n\t\t\t) }\n\t\t</>\n\t);\n}\n\nfunction Control( {\n\tcontrolProps,\n\tinputProps,\n\tisLoading,\n\tcustomValidity,\n\tmarkWhenOptional,\n\trenderControl,\n} ) {\n\t// Once a validity has been reported, keep using the validated control, so\n\t// that clearing the validity doesn't remount (and blur) the input.\n\tconst [ isValidated, setIsValidated ] = useState(\n\t\tcustomValidity !== undefined\n\t);\n\n\tif ( customValidity !== undefined && ! isValidated ) {\n\t\tsetIsValidated( true );\n\t}\n\n\tif ( renderControl ) {\n\t\treturn renderControl( controlProps, inputProps, isLoading );\n\t}\n\n\tconst MaybeValidatedInputControl = isValidated\n\t\t? ValidatedInputControl\n\t\t: InputControl;\n\n\treturn (\n\t\t<BaseControl { ...controlProps }>\n\t\t\t<MaybeValidatedInputControl\n\t\t\t\t{ ...inputProps }\n\t\t\t\t{ ...( isValidated && {\n\t\t\t\t\tcustomValidity,\n\t\t\t\t\t// Suppress the \"(Required)\" indicator in the label.\n\t\t\t\t\t// The field is still required for validation, but the indicator\n\t\t\t\t\t// can be hidden when markWhenOptional is set to true.\n\t\t\t\t\t...( markWhenOptional !== undefined && {\n\t\t\t\t\t\tmarkWhenOptional,\n\t\t\t\t\t} ),\n\t\t\t\t} ) }\n\t\t\t/>\n\t\t\t{ isLoading && <Spinner /> }\n\t\t</BaseControl>\n\t);\n}\n\nfunction Suggestions( {\n\tautocompleteRef,\n\tclassName,\n\thandleSuggestionClick,\n\tisLoading,\n\trenderSuggestions,\n\tselectedSuggestion,\n\tsuggestionNodesRef,\n\tsuggestionOptionIdPrefix,\n\tsuggestions,\n\tsuggestionsListboxId,\n\tsuggestionsValue,\n} ) {\n\tconst suggestionsListProps = {\n\t\tid: suggestionsListboxId,\n\t\tref: autocompleteRef,\n\t\trole: 'listbox',\n\t};\n\n\tconst buildSuggestionItemProps = ( suggestion, index ) => {\n\t\treturn {\n\t\t\trole: 'option',\n\t\t\ttabIndex: '-1',\n\t\t\tid: `${ suggestionOptionIdPrefix }-${ index }`,\n\t\t\tref: ( node ) => {\n\t\t\t\tsuggestionNodesRef.current[ index ] = node;\n\t\t\t},\n\t\t\t'aria-selected': index === selectedSuggestion ? true : undefined,\n\t\t};\n\t};\n\n\tif ( isFunction( renderSuggestions ) ) {\n\t\treturn renderSuggestions( {\n\t\t\tsuggestions,\n\t\t\tselectedSuggestion,\n\t\t\tsuggestionsListProps,\n\t\t\tbuildSuggestionItemProps,\n\t\t\tisLoading,\n\t\t\thandleSuggestionClick,\n\t\t\tisInitialSuggestions: ! suggestionsValue?.length,\n\t\t\tcurrentInputValue: suggestionsValue,\n\t\t} );\n\t}\n\n\treturn (\n\t\t<Popover placement=\"bottom\" focusOnMount={ false }>\n\t\t\t<div\n\t\t\t\t{ ...suggestionsListProps }\n\t\t\t\tclassName={ clsx( 'block-editor-url-input__suggestions', {\n\t\t\t\t\t[ `${ className }__suggestions` ]: className,\n\t\t\t\t} ) }\n\t\t\t>\n\t\t\t\t{ suggestions.map( ( suggestion, index ) => (\n\t\t\t\t\t<Button\n\t\t\t\t\t\t__next40pxDefaultSize\n\t\t\t\t\t\t{ ...buildSuggestionItemProps( suggestion, index ) }\n\t\t\t\t\t\tkey={ suggestion.id }\n\t\t\t\t\t\tclassName={ clsx(\n\t\t\t\t\t\t\t'block-editor-url-input__suggestion',\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t'is-selected': index === selectedSuggestion,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t) }\n\t\t\t\t\t\tonClick={ () => handleSuggestionClick( suggestion ) }\n\t\t\t\t\t>\n\t\t\t\t\t\t{ suggestion.title }\n\t\t\t\t\t</Button>\n\t\t\t\t) ) }\n\t\t\t</div>\n\t\t</Popover>\n\t);\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["componentsPrivateApis", "blockEditorStore", "clsx", "InputControl"]
|
|
7
7
|
}
|
|
@@ -115,22 +115,26 @@ var getTransformCommands = () => function useTransformCommands() {
|
|
|
115
115
|
return { isLoading: false, commands };
|
|
116
116
|
};
|
|
117
117
|
var getQuickActionsCommands = () => function useQuickActionsCommands() {
|
|
118
|
-
const {
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
118
|
+
const {
|
|
119
|
+
clientIds,
|
|
120
|
+
isUngroupable,
|
|
121
|
+
isGroupable,
|
|
122
|
+
blockVisibilitySetting
|
|
123
|
+
} = (0, import_data.useSelect)((select) => {
|
|
124
|
+
const {
|
|
125
|
+
getSelectedBlockClientIds,
|
|
126
|
+
getSettings,
|
|
127
|
+
isUngroupable: _isUngroupable,
|
|
128
|
+
isGroupable: _isGroupable
|
|
129
|
+
} = select(import_store.store);
|
|
130
|
+
const selectedBlockClientIds = getSelectedBlockClientIds();
|
|
131
|
+
return {
|
|
132
|
+
clientIds: selectedBlockClientIds,
|
|
133
|
+
isUngroupable: _isUngroupable(),
|
|
134
|
+
isGroupable: _isGroupable(),
|
|
135
|
+
blockVisibilitySetting: getSettings().__experimentalFeatures?.blockVisibility?.allowEditing
|
|
136
|
+
};
|
|
137
|
+
}, []);
|
|
134
138
|
const {
|
|
135
139
|
canInsertBlockType,
|
|
136
140
|
getBlockRootClientId,
|
|
@@ -244,7 +248,7 @@ var getQuickActionsCommands = () => function useQuickActionsCommands() {
|
|
|
244
248
|
const allBlocksDefaultMode = clientIds.every(
|
|
245
249
|
(id) => getBlockEditingMode(id) === "default"
|
|
246
250
|
);
|
|
247
|
-
if (supportsVisibility && allBlocksDefaultMode) {
|
|
251
|
+
if (supportsVisibility && allBlocksDefaultMode && blockVisibilitySetting !== false) {
|
|
248
252
|
const hasHiddenBlock = clientIds.some(
|
|
249
253
|
(id) => isBlockHiddenAnywhere(id)
|
|
250
254
|
);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/components/use-block-commands/index.js"],
|
|
4
|
-
"sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { __, sprintf } from '@wordpress/i18n';\nimport {\n\thasBlockSupport,\n\tstore as blocksStore,\n\tswitchToBlockType,\n\tisTemplatePart,\n} from '@wordpress/blocks';\nimport { useSelect, useDispatch } from '@wordpress/data';\nimport { useCommandLoader } from '@wordpress/commands';\nimport {\n\tcopy,\n\ttrash as remove,\n\tplus as add,\n\tgroup,\n\tungroup,\n\tseen,\n\tunseen,\n\tblockDefault as blockDefaultIcon,\n} from '@wordpress/icons';\n\n/**\n * Internal dependencies\n */\nimport { store as blockEditorStore } from '../../store';\nimport { unlock } from '../../lock-unlock';\n\nconst getTransformCommands = () =>\n\tfunction useTransformCommands() {\n\t\tconst { replaceBlocks, multiSelect } = useDispatch( blockEditorStore );\n\t\tconst {\n\t\t\tblocks,\n\t\t\tclientIds,\n\t\t\tcanRemove,\n\t\t\tpossibleBlockTransformations,\n\t\t\tinvalidSelection,\n\t\t} = useSelect( ( select ) => {\n\t\t\tconst {\n\t\t\t\tgetBlockRootClientId,\n\t\t\t\tgetBlockTransformItems,\n\t\t\t\tgetSelectedBlockClientIds,\n\t\t\t\tgetBlocksByClientId,\n\t\t\t\tcanRemoveBlocks,\n\t\t\t} = select( blockEditorStore );\n\n\t\t\tconst selectedBlockClientIds = getSelectedBlockClientIds();\n\t\t\tconst selectedBlocks = getBlocksByClientId(\n\t\t\t\tselectedBlockClientIds\n\t\t\t);\n\n\t\t\t// selectedBlocks can have `null`s when something tries to call `selectBlock` with an inexistent clientId.\n\t\t\t// These nulls will cause fatal errors down the line.\n\t\t\t// In order to prevent discrepancies between selectedBlockClientIds and selectedBlocks, we effectively treat the entire selection as invalid.\n\t\t\t// @see https://github.com/WordPress/gutenberg/pull/59410#issuecomment-2006304536\n\t\t\tif ( selectedBlocks.filter( ( block ) => ! block ).length > 0 ) {\n\t\t\t\treturn {\n\t\t\t\t\tinvalidSelection: true,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst rootClientId = getBlockRootClientId(\n\t\t\t\tselectedBlockClientIds[ 0 ]\n\t\t\t);\n\t\t\treturn {\n\t\t\t\tblocks: selectedBlocks,\n\t\t\t\tclientIds: selectedBlockClientIds,\n\t\t\t\tpossibleBlockTransformations: getBlockTransformItems(\n\t\t\t\t\tselectedBlocks,\n\t\t\t\t\trootClientId\n\t\t\t\t),\n\t\t\t\tcanRemove: canRemoveBlocks( selectedBlockClientIds ),\n\t\t\t\tinvalidSelection: false,\n\t\t\t};\n\t\t}, [] );\n\n\t\tif ( invalidSelection ) {\n\t\t\treturn {\n\t\t\t\tisLoading: false,\n\t\t\t\tcommands: [],\n\t\t\t};\n\t\t}\n\t\tconst isTemplate = blocks.length === 1 && isTemplatePart( blocks[ 0 ] );\n\n\t\tfunction selectForMultipleBlocks( insertedBlocks ) {\n\t\t\tif ( insertedBlocks.length > 1 ) {\n\t\t\t\tmultiSelect(\n\t\t\t\t\tinsertedBlocks[ 0 ].clientId,\n\t\t\t\t\tinsertedBlocks[ insertedBlocks.length - 1 ].clientId\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t// Simple block transformation based on the `Block Transforms` API.\n\t\tfunction onBlockTransform( name, variationName ) {\n\t\t\tconst newBlocks = switchToBlockType( blocks, name, variationName );\n\t\t\treplaceBlocks( clientIds, newBlocks );\n\t\t\tselectForMultipleBlocks( newBlocks );\n\t\t}\n\n\t\t/**\n\t\t * The `isTemplate` check is a stopgap solution here.\n\t\t * Ideally, the Transforms API should handle this\n\t\t * by allowing to exclude blocks from wildcard transformations.\n\t\t */\n\t\tconst hasPossibleBlockTransformations =\n\t\t\t!! possibleBlockTransformations.length && canRemove && ! isTemplate;\n\n\t\tif (\n\t\t\t! clientIds ||\n\t\t\tclientIds.length < 1 ||\n\t\t\t! hasPossibleBlockTransformations\n\t\t) {\n\t\t\treturn { isLoading: false, commands: [] };\n\t\t}\n\n\t\tconst commands = possibleBlockTransformations.map(\n\t\t\t( transformation ) => {\n\t\t\t\tconst { id, name, title, icon, variationName } = transformation;\n\t\t\t\t/*\n\t\t\t\t * Command menu uses Icon from @wordpress/icons, which expects a ReactElement\n\t\t\t\t * (cloneElement). Normalize to blockDefaultIcon to avoid crash. See #55668 / PR #55676.\n\t\t\t\t */\n\t\t\t\tconst blockIcon =\n\t\t\t\t\t! icon?.src || icon?.src === 'block-default'\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tsrc: blockDefaultIcon,\n\t\t\t\t\t\t }\n\t\t\t\t\t\t: icon;\n\n\t\t\t\treturn {\n\t\t\t\t\tname:\n\t\t\t\t\t\t'core/block-editor/transform-to-' +\n\t\t\t\t\t\t( id || name ).replace( /\\//g, '-' ),\n\t\t\t\t\t/* translators: %s: Block or block variation name. */\n\t\t\t\t\tlabel: sprintf( __( 'Transform to %s' ), title ),\n\t\t\t\t\ticon: blockIcon?.src,\n\t\t\t\t\tcategory: 'command',\n\t\t\t\t\tcallback: ( { close } ) => {\n\t\t\t\t\t\tonBlockTransform( name, variationName );\n\t\t\t\t\t\tclose();\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\t\t);\n\n\t\treturn { isLoading: false, commands };\n\t};\n\nconst getQuickActionsCommands = () =>\n\tfunction useQuickActionsCommands() {\n\t\tconst { clientIds, isUngroupable, isGroupable } = useSelect(\n\t\t\t( select ) => {\n\t\t\t\tconst {\n\t\t\t\t\tgetSelectedBlockClientIds,\n\t\t\t\t\tisUngroupable: _isUngroupable,\n\t\t\t\t\tisGroupable: _isGroupable,\n\t\t\t\t} = select( blockEditorStore );\n\t\t\t\tconst selectedBlockClientIds = getSelectedBlockClientIds();\n\n\t\t\t\treturn {\n\t\t\t\t\tclientIds: selectedBlockClientIds,\n\t\t\t\t\tisUngroupable: _isUngroupable(),\n\t\t\t\t\tisGroupable: _isGroupable(),\n\t\t\t\t};\n\t\t\t},\n\t\t\t[]\n\t\t);\n\t\tconst {\n\t\t\tcanInsertBlockType,\n\t\t\tgetBlockRootClientId,\n\t\t\tgetBlocksByClientId,\n\t\t\tcanRemoveBlocks,\n\t\t\tisBlockHiddenAnywhere,\n\t\t} = unlock( useSelect( blockEditorStore ) );\n\t\tconst { getBlockEditingMode } = useSelect( blockEditorStore );\n\t\tconst { getDefaultBlockName, getGroupingBlockName } =\n\t\t\tuseSelect( blocksStore );\n\n\t\tconst blocks = getBlocksByClientId( clientIds );\n\n\t\tconst blockEditorDispatch = useDispatch( blockEditorStore );\n\t\tconst {\n\t\t\tremoveBlocks,\n\t\t\treplaceBlocks,\n\t\t\tduplicateBlocks,\n\t\t\tinsertAfterBlock,\n\t\t\tinsertBeforeBlock,\n\t\t} = blockEditorDispatch;\n\n\t\tconst onGroup = () => {\n\t\t\tif ( ! blocks.length ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst groupingBlockName = getGroupingBlockName();\n\n\t\t\t// Activate the `transform` on `core/group` which does the conversion.\n\t\t\tconst newBlocks = switchToBlockType( blocks, groupingBlockName );\n\n\t\t\tif ( ! newBlocks ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treplaceBlocks( clientIds, newBlocks );\n\t\t};\n\t\tconst onUngroup = () => {\n\t\t\tif ( ! blocks.length ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst innerBlocks = blocks[ 0 ].innerBlocks;\n\n\t\t\tif ( ! innerBlocks.length ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\treplaceBlocks( clientIds, innerBlocks );\n\t\t};\n\n\t\tif ( ! clientIds || clientIds.length < 1 ) {\n\t\t\treturn { isLoading: false, commands: [] };\n\t\t}\n\n\t\tconst { showViewportModal } = unlock( blockEditorDispatch );\n\t\tconst rootClientId = getBlockRootClientId( clientIds[ 0 ] );\n\t\tconst canInsertDefaultBlock = canInsertBlockType(\n\t\t\tgetDefaultBlockName(),\n\t\t\trootClientId\n\t\t);\n\t\tconst canDuplicate = blocks.every( ( block ) => {\n\t\t\treturn (\n\t\t\t\t!! block &&\n\t\t\t\thasBlockSupport( block.name, 'multiple', true ) &&\n\t\t\t\tcanInsertBlockType( block.name, rootClientId )\n\t\t\t);\n\t\t} );\n\t\tconst canRemove = canRemoveBlocks( clientIds );\n\n\t\tconst commands = [];\n\n\t\tif ( canDuplicate ) {\n\t\t\tcommands.push( {\n\t\t\t\tname: 'duplicate',\n\t\t\t\tlabel: __( 'Duplicate' ),\n\t\t\t\tcallback: () => duplicateBlocks( clientIds, true ),\n\t\t\t\ticon: copy,\n\t\t\t} );\n\t\t}\n\n\t\tif ( canInsertDefaultBlock ) {\n\t\t\tcommands.push(\n\t\t\t\t{\n\t\t\t\t\tname: 'add-before',\n\t\t\t\t\tlabel: __( 'Add before' ),\n\t\t\t\t\tcallback: () => {\n\t\t\t\t\t\tconst clientId = Array.isArray( clientIds )\n\t\t\t\t\t\t\t? clientIds[ 0 ]\n\t\t\t\t\t\t\t: clientId;\n\t\t\t\t\t\tinsertBeforeBlock( clientId );\n\t\t\t\t\t},\n\t\t\t\t\ticon: add,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: 'add-after',\n\t\t\t\t\tlabel: __( 'Add after' ),\n\t\t\t\t\tcallback: () => {\n\t\t\t\t\t\tconst clientId = Array.isArray( clientIds )\n\t\t\t\t\t\t\t? clientIds[ clientIds.length - 1 ]\n\t\t\t\t\t\t\t: clientId;\n\t\t\t\t\t\tinsertAfterBlock( clientId );\n\t\t\t\t\t},\n\t\t\t\t\ticon: add,\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\tif ( isGroupable ) {\n\t\t\tcommands.push( {\n\t\t\t\tname: 'Group',\n\t\t\t\tlabel: __( 'Group' ),\n\t\t\t\tcallback: onGroup,\n\t\t\t\ticon: group,\n\t\t\t} );\n\t\t}\n\n\t\tif ( isUngroupable ) {\n\t\t\tcommands.push( {\n\t\t\t\tname: 'ungroup',\n\t\t\t\tlabel: __( 'Ungroup' ),\n\t\t\t\tcallback: onUngroup,\n\t\t\t\ticon: ungroup,\n\t\t\t} );\n\t\t}\n\n\t\tif ( canRemove ) {\n\t\t\tcommands.push( {\n\t\t\t\tname: 'remove',\n\t\t\t\tlabel: __( 'Delete' ),\n\t\t\t\tcallback: () => removeBlocks( clientIds, true ),\n\t\t\t\ticon: remove,\n\t\t\t} );\n\t\t}\n\n\t\tconst supportsVisibility = blocks.every(\n\t\t\t( block ) =>\n\t\t\t\t!! block && hasBlockSupport( block.name, 'visibility', true )\n\t\t);\n\t\tconst allBlocksDefaultMode = clientIds.every(\n\t\t\t( id ) => getBlockEditingMode( id ) === 'default'\n\t\t);\n\n\t\tif ( supportsVisibility && allBlocksDefaultMode ) {\n\t\t\tconst hasHiddenBlock = clientIds.some( ( id ) =>\n\t\t\t\tisBlockHiddenAnywhere( id )\n\t\t\t);\n\t\t\tcommands.push( {\n\t\t\t\tname: 'toggle-visibility',\n\t\t\t\tlabel: hasHiddenBlock ? __( 'Show' ) : __( 'Hide' ),\n\t\t\t\tcallback: () => showViewportModal( clientIds ),\n\t\t\t\ticon: hasHiddenBlock ? seen : unseen,\n\t\t\t} );\n\t\t}\n\n\t\treturn {\n\t\t\tisLoading: false,\n\t\t\tcommands: commands.map( ( command ) => ( {\n\t\t\t\t...command,\n\t\t\t\tname: 'core/block-editor/action-' + command.name,\n\t\t\t\tcategory: 'command',\n\t\t\t\tcallback: ( { close } ) => {\n\t\t\t\t\tcommand.callback();\n\t\t\t\t\tclose();\n\t\t\t\t},\n\t\t\t} ) ),\n\t\t};\n\t};\n\nexport const useBlockCommands = () => {\n\tuseCommandLoader( {\n\t\tname: 'core/block-editor/blockTransforms',\n\t\thook: getTransformCommands(),\n\t} );\n\tuseCommandLoader( {\n\t\tname: 'core/block-editor/blockQuickActions',\n\t\thook: getQuickActionsCommands(),\n\t\tcontext: 'block-selection-edit',\n\t} );\n};\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,kBAA4B;AAC5B,oBAKO;AACP,kBAAuC;AACvC,sBAAiC;AACjC,mBASO;AAKP,mBAA0C;AAC1C,yBAAuB;AAEvB,IAAM,uBAAuB,MAC5B,SAAS,uBAAuB;AAC/B,QAAM,EAAE,eAAe,YAAY,QAAI,yBAAa,aAAAA,KAAiB;AACrE,QAAM;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,QAAI,uBAAW,CAAE,WAAY;AAC5B,UAAM;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD,IAAI,OAAQ,aAAAA,KAAiB;AAE7B,UAAM,yBAAyB,0BAA0B;AACzD,UAAM,iBAAiB;AAAA,MACtB;AAAA,IACD;AAMA,QAAK,eAAe,OAAQ,CAAE,UAAW,CAAE,KAAM,EAAE,SAAS,GAAI;AAC/D,aAAO;AAAA,QACN,kBAAkB;AAAA,MACnB;AAAA,IACD;AAEA,UAAM,eAAe;AAAA,MACpB,uBAAwB,CAAE;AAAA,IAC3B;AACA,WAAO;AAAA,MACN,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,8BAA8B;AAAA,QAC7B;AAAA,QACA;AAAA,MACD;AAAA,MACA,WAAW,gBAAiB,sBAAuB;AAAA,MACnD,kBAAkB;AAAA,IACnB;AAAA,EACD,GAAG,CAAC,CAAE;AAEN,MAAK,kBAAmB;AACvB,WAAO;AAAA,MACN,WAAW;AAAA,MACX,UAAU,CAAC;AAAA,IACZ;AAAA,EACD;AACA,QAAM,aAAa,OAAO,WAAW,SAAK,8BAAgB,OAAQ,CAAE,CAAE;AAEtE,WAAS,wBAAyB,gBAAiB;AAClD,QAAK,eAAe,SAAS,GAAI;AAChC;AAAA,QACC,eAAgB,CAAE,EAAE;AAAA,QACpB,eAAgB,eAAe,SAAS,CAAE,EAAE;AAAA,MAC7C;AAAA,IACD;AAAA,EACD;AAGA,WAAS,iBAAkB,MAAM,eAAgB;AAChD,UAAM,gBAAY,iCAAmB,QAAQ,MAAM,aAAc;AACjE,kBAAe,WAAW,SAAU;AACpC,4BAAyB,SAAU;AAAA,EACpC;AAOA,QAAM,kCACL,CAAC,CAAE,6BAA6B,UAAU,aAAa,CAAE;AAE1D,MACC,CAAE,aACF,UAAU,SAAS,KACnB,CAAE,iCACD;AACD,WAAO,EAAE,WAAW,OAAO,UAAU,CAAC,EAAE;AAAA,EACzC;AAEA,QAAM,WAAW,6BAA6B;AAAA,IAC7C,CAAE,mBAAoB;AACrB,YAAM,EAAE,IAAI,MAAM,OAAO,MAAM,cAAc,IAAI;AAKjD,YAAM,YACL,CAAE,MAAM,OAAO,MAAM,QAAQ,kBAC1B;AAAA,QACA,KAAK,aAAAC;AAAA,MACL,IACA;AAEJ,aAAO;AAAA,QACN,MACC,qCACE,MAAM,MAAO,QAAS,OAAO,GAAI;AAAA;AAAA,QAEpC,WAAO,yBAAS,gBAAI,iBAAkB,GAAG,KAAM;AAAA,QAC/C,MAAM,WAAW;AAAA,QACjB,UAAU;AAAA,QACV,UAAU,CAAE,EAAE,MAAM,MAAO;AAC1B,2BAAkB,MAAM,aAAc;AACtC,gBAAM;AAAA,QACP;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAEA,SAAO,EAAE,WAAW,OAAO,SAAS;AACrC;AAED,IAAM,0BAA0B,MAC/B,SAAS,0BAA0B;AAClC,QAAM,
|
|
4
|
+
"sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { __, sprintf } from '@wordpress/i18n';\nimport {\n\thasBlockSupport,\n\tstore as blocksStore,\n\tswitchToBlockType,\n\tisTemplatePart,\n} from '@wordpress/blocks';\nimport { useSelect, useDispatch } from '@wordpress/data';\nimport { useCommandLoader } from '@wordpress/commands';\nimport {\n\tcopy,\n\ttrash as remove,\n\tplus as add,\n\tgroup,\n\tungroup,\n\tseen,\n\tunseen,\n\tblockDefault as blockDefaultIcon,\n} from '@wordpress/icons';\n\n/**\n * Internal dependencies\n */\nimport { store as blockEditorStore } from '../../store';\nimport { unlock } from '../../lock-unlock';\n\nconst getTransformCommands = () =>\n\tfunction useTransformCommands() {\n\t\tconst { replaceBlocks, multiSelect } = useDispatch( blockEditorStore );\n\t\tconst {\n\t\t\tblocks,\n\t\t\tclientIds,\n\t\t\tcanRemove,\n\t\t\tpossibleBlockTransformations,\n\t\t\tinvalidSelection,\n\t\t} = useSelect( ( select ) => {\n\t\t\tconst {\n\t\t\t\tgetBlockRootClientId,\n\t\t\t\tgetBlockTransformItems,\n\t\t\t\tgetSelectedBlockClientIds,\n\t\t\t\tgetBlocksByClientId,\n\t\t\t\tcanRemoveBlocks,\n\t\t\t} = select( blockEditorStore );\n\n\t\t\tconst selectedBlockClientIds = getSelectedBlockClientIds();\n\t\t\tconst selectedBlocks = getBlocksByClientId(\n\t\t\t\tselectedBlockClientIds\n\t\t\t);\n\n\t\t\t// selectedBlocks can have `null`s when something tries to call `selectBlock` with an inexistent clientId.\n\t\t\t// These nulls will cause fatal errors down the line.\n\t\t\t// In order to prevent discrepancies between selectedBlockClientIds and selectedBlocks, we effectively treat the entire selection as invalid.\n\t\t\t// @see https://github.com/WordPress/gutenberg/pull/59410#issuecomment-2006304536\n\t\t\tif ( selectedBlocks.filter( ( block ) => ! block ).length > 0 ) {\n\t\t\t\treturn {\n\t\t\t\t\tinvalidSelection: true,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst rootClientId = getBlockRootClientId(\n\t\t\t\tselectedBlockClientIds[ 0 ]\n\t\t\t);\n\t\t\treturn {\n\t\t\t\tblocks: selectedBlocks,\n\t\t\t\tclientIds: selectedBlockClientIds,\n\t\t\t\tpossibleBlockTransformations: getBlockTransformItems(\n\t\t\t\t\tselectedBlocks,\n\t\t\t\t\trootClientId\n\t\t\t\t),\n\t\t\t\tcanRemove: canRemoveBlocks( selectedBlockClientIds ),\n\t\t\t\tinvalidSelection: false,\n\t\t\t};\n\t\t}, [] );\n\n\t\tif ( invalidSelection ) {\n\t\t\treturn {\n\t\t\t\tisLoading: false,\n\t\t\t\tcommands: [],\n\t\t\t};\n\t\t}\n\t\tconst isTemplate = blocks.length === 1 && isTemplatePart( blocks[ 0 ] );\n\n\t\tfunction selectForMultipleBlocks( insertedBlocks ) {\n\t\t\tif ( insertedBlocks.length > 1 ) {\n\t\t\t\tmultiSelect(\n\t\t\t\t\tinsertedBlocks[ 0 ].clientId,\n\t\t\t\t\tinsertedBlocks[ insertedBlocks.length - 1 ].clientId\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t// Simple block transformation based on the `Block Transforms` API.\n\t\tfunction onBlockTransform( name, variationName ) {\n\t\t\tconst newBlocks = switchToBlockType( blocks, name, variationName );\n\t\t\treplaceBlocks( clientIds, newBlocks );\n\t\t\tselectForMultipleBlocks( newBlocks );\n\t\t}\n\n\t\t/**\n\t\t * The `isTemplate` check is a stopgap solution here.\n\t\t * Ideally, the Transforms API should handle this\n\t\t * by allowing to exclude blocks from wildcard transformations.\n\t\t */\n\t\tconst hasPossibleBlockTransformations =\n\t\t\t!! possibleBlockTransformations.length && canRemove && ! isTemplate;\n\n\t\tif (\n\t\t\t! clientIds ||\n\t\t\tclientIds.length < 1 ||\n\t\t\t! hasPossibleBlockTransformations\n\t\t) {\n\t\t\treturn { isLoading: false, commands: [] };\n\t\t}\n\n\t\tconst commands = possibleBlockTransformations.map(\n\t\t\t( transformation ) => {\n\t\t\t\tconst { id, name, title, icon, variationName } = transformation;\n\t\t\t\t/*\n\t\t\t\t * Command menu uses Icon from @wordpress/icons, which expects a ReactElement\n\t\t\t\t * (cloneElement). Normalize to blockDefaultIcon to avoid crash. See #55668 / PR #55676.\n\t\t\t\t */\n\t\t\t\tconst blockIcon =\n\t\t\t\t\t! icon?.src || icon?.src === 'block-default'\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tsrc: blockDefaultIcon,\n\t\t\t\t\t\t }\n\t\t\t\t\t\t: icon;\n\n\t\t\t\treturn {\n\t\t\t\t\tname:\n\t\t\t\t\t\t'core/block-editor/transform-to-' +\n\t\t\t\t\t\t( id || name ).replace( /\\//g, '-' ),\n\t\t\t\t\t/* translators: %s: Block or block variation name. */\n\t\t\t\t\tlabel: sprintf( __( 'Transform to %s' ), title ),\n\t\t\t\t\ticon: blockIcon?.src,\n\t\t\t\t\tcategory: 'command',\n\t\t\t\t\tcallback: ( { close } ) => {\n\t\t\t\t\t\tonBlockTransform( name, variationName );\n\t\t\t\t\t\tclose();\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\t\t);\n\n\t\treturn { isLoading: false, commands };\n\t};\n\nconst getQuickActionsCommands = () =>\n\tfunction useQuickActionsCommands() {\n\t\tconst {\n\t\t\tclientIds,\n\t\t\tisUngroupable,\n\t\t\tisGroupable,\n\t\t\tblockVisibilitySetting,\n\t\t} = useSelect( ( select ) => {\n\t\t\tconst {\n\t\t\t\tgetSelectedBlockClientIds,\n\t\t\t\tgetSettings,\n\t\t\t\tisUngroupable: _isUngroupable,\n\t\t\t\tisGroupable: _isGroupable,\n\t\t\t} = select( blockEditorStore );\n\t\t\tconst selectedBlockClientIds = getSelectedBlockClientIds();\n\n\t\t\treturn {\n\t\t\t\tclientIds: selectedBlockClientIds,\n\t\t\t\tisUngroupable: _isUngroupable(),\n\t\t\t\tisGroupable: _isGroupable(),\n\t\t\t\tblockVisibilitySetting:\n\t\t\t\t\tgetSettings().__experimentalFeatures?.blockVisibility\n\t\t\t\t\t\t?.allowEditing,\n\t\t\t};\n\t\t}, [] );\n\t\tconst {\n\t\t\tcanInsertBlockType,\n\t\t\tgetBlockRootClientId,\n\t\t\tgetBlocksByClientId,\n\t\t\tcanRemoveBlocks,\n\t\t\tisBlockHiddenAnywhere,\n\t\t} = unlock( useSelect( blockEditorStore ) );\n\t\tconst { getBlockEditingMode } = useSelect( blockEditorStore );\n\t\tconst { getDefaultBlockName, getGroupingBlockName } =\n\t\t\tuseSelect( blocksStore );\n\n\t\tconst blocks = getBlocksByClientId( clientIds );\n\n\t\tconst blockEditorDispatch = useDispatch( blockEditorStore );\n\t\tconst {\n\t\t\tremoveBlocks,\n\t\t\treplaceBlocks,\n\t\t\tduplicateBlocks,\n\t\t\tinsertAfterBlock,\n\t\t\tinsertBeforeBlock,\n\t\t} = blockEditorDispatch;\n\n\t\tconst onGroup = () => {\n\t\t\tif ( ! blocks.length ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst groupingBlockName = getGroupingBlockName();\n\n\t\t\t// Activate the `transform` on `core/group` which does the conversion.\n\t\t\tconst newBlocks = switchToBlockType( blocks, groupingBlockName );\n\n\t\t\tif ( ! newBlocks ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treplaceBlocks( clientIds, newBlocks );\n\t\t};\n\t\tconst onUngroup = () => {\n\t\t\tif ( ! blocks.length ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst innerBlocks = blocks[ 0 ].innerBlocks;\n\n\t\t\tif ( ! innerBlocks.length ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\treplaceBlocks( clientIds, innerBlocks );\n\t\t};\n\n\t\tif ( ! clientIds || clientIds.length < 1 ) {\n\t\t\treturn { isLoading: false, commands: [] };\n\t\t}\n\n\t\tconst { showViewportModal } = unlock( blockEditorDispatch );\n\t\tconst rootClientId = getBlockRootClientId( clientIds[ 0 ] );\n\t\tconst canInsertDefaultBlock = canInsertBlockType(\n\t\t\tgetDefaultBlockName(),\n\t\t\trootClientId\n\t\t);\n\t\tconst canDuplicate = blocks.every( ( block ) => {\n\t\t\treturn (\n\t\t\t\t!! block &&\n\t\t\t\thasBlockSupport( block.name, 'multiple', true ) &&\n\t\t\t\tcanInsertBlockType( block.name, rootClientId )\n\t\t\t);\n\t\t} );\n\t\tconst canRemove = canRemoveBlocks( clientIds );\n\n\t\tconst commands = [];\n\n\t\tif ( canDuplicate ) {\n\t\t\tcommands.push( {\n\t\t\t\tname: 'duplicate',\n\t\t\t\tlabel: __( 'Duplicate' ),\n\t\t\t\tcallback: () => duplicateBlocks( clientIds, true ),\n\t\t\t\ticon: copy,\n\t\t\t} );\n\t\t}\n\n\t\tif ( canInsertDefaultBlock ) {\n\t\t\tcommands.push(\n\t\t\t\t{\n\t\t\t\t\tname: 'add-before',\n\t\t\t\t\tlabel: __( 'Add before' ),\n\t\t\t\t\tcallback: () => {\n\t\t\t\t\t\tconst clientId = Array.isArray( clientIds )\n\t\t\t\t\t\t\t? clientIds[ 0 ]\n\t\t\t\t\t\t\t: clientId;\n\t\t\t\t\t\tinsertBeforeBlock( clientId );\n\t\t\t\t\t},\n\t\t\t\t\ticon: add,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: 'add-after',\n\t\t\t\t\tlabel: __( 'Add after' ),\n\t\t\t\t\tcallback: () => {\n\t\t\t\t\t\tconst clientId = Array.isArray( clientIds )\n\t\t\t\t\t\t\t? clientIds[ clientIds.length - 1 ]\n\t\t\t\t\t\t\t: clientId;\n\t\t\t\t\t\tinsertAfterBlock( clientId );\n\t\t\t\t\t},\n\t\t\t\t\ticon: add,\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\tif ( isGroupable ) {\n\t\t\tcommands.push( {\n\t\t\t\tname: 'Group',\n\t\t\t\tlabel: __( 'Group' ),\n\t\t\t\tcallback: onGroup,\n\t\t\t\ticon: group,\n\t\t\t} );\n\t\t}\n\n\t\tif ( isUngroupable ) {\n\t\t\tcommands.push( {\n\t\t\t\tname: 'ungroup',\n\t\t\t\tlabel: __( 'Ungroup' ),\n\t\t\t\tcallback: onUngroup,\n\t\t\t\ticon: ungroup,\n\t\t\t} );\n\t\t}\n\n\t\tif ( canRemove ) {\n\t\t\tcommands.push( {\n\t\t\t\tname: 'remove',\n\t\t\t\tlabel: __( 'Delete' ),\n\t\t\t\tcallback: () => removeBlocks( clientIds, true ),\n\t\t\t\ticon: remove,\n\t\t\t} );\n\t\t}\n\n\t\tconst supportsVisibility = blocks.every(\n\t\t\t( block ) =>\n\t\t\t\t!! block && hasBlockSupport( block.name, 'visibility', true )\n\t\t);\n\t\tconst allBlocksDefaultMode = clientIds.every(\n\t\t\t( id ) => getBlockEditingMode( id ) === 'default'\n\t\t);\n\n\t\tif (\n\t\t\tsupportsVisibility &&\n\t\t\tallBlocksDefaultMode &&\n\t\t\tblockVisibilitySetting !== false\n\t\t) {\n\t\t\tconst hasHiddenBlock = clientIds.some( ( id ) =>\n\t\t\t\tisBlockHiddenAnywhere( id )\n\t\t\t);\n\t\t\tcommands.push( {\n\t\t\t\tname: 'toggle-visibility',\n\t\t\t\tlabel: hasHiddenBlock ? __( 'Show' ) : __( 'Hide' ),\n\t\t\t\tcallback: () => showViewportModal( clientIds ),\n\t\t\t\ticon: hasHiddenBlock ? seen : unseen,\n\t\t\t} );\n\t\t}\n\n\t\treturn {\n\t\t\tisLoading: false,\n\t\t\tcommands: commands.map( ( command ) => ( {\n\t\t\t\t...command,\n\t\t\t\tname: 'core/block-editor/action-' + command.name,\n\t\t\t\tcategory: 'command',\n\t\t\t\tcallback: ( { close } ) => {\n\t\t\t\t\tcommand.callback();\n\t\t\t\t\tclose();\n\t\t\t\t},\n\t\t\t} ) ),\n\t\t};\n\t};\n\nexport const useBlockCommands = () => {\n\tuseCommandLoader( {\n\t\tname: 'core/block-editor/blockTransforms',\n\t\thook: getTransformCommands(),\n\t} );\n\tuseCommandLoader( {\n\t\tname: 'core/block-editor/blockQuickActions',\n\t\thook: getQuickActionsCommands(),\n\t\tcontext: 'block-selection-edit',\n\t} );\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["blockEditorStore", "blockDefaultIcon", "blocksStore", "add", "remove"]
|
|
7
7
|
}
|
|
@@ -161,7 +161,7 @@ function useOnBlockDrop(targetRootClientId, targetBlockIndex, options = {}) {
|
|
|
161
161
|
blocks.unshift(targetBlock);
|
|
162
162
|
}
|
|
163
163
|
const groupInnerBlocks = blocks.map(
|
|
164
|
-
(block) => (0, import_blocks.
|
|
164
|
+
(block) => (0, import_blocks.cloneSanitizedBlock)(block)
|
|
165
165
|
);
|
|
166
166
|
const areAllImages = blocks.every((block) => {
|
|
167
167
|
return block.name === "core/image";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/components/use-on-block-drop/index.js"],
|
|
4
|
-
"sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { useCallback } from '@wordpress/element';\nimport {\n\tcloneBlock,\n\tcreateBlock,\n\t__experimentalCloneSanitizedBlock,\n\tfindTransform,\n\tgetBlockTransforms,\n\tpasteHandler,\n\tstore as blocksStore,\n} from '@wordpress/blocks';\nimport { useDispatch, useSelect, useRegistry } from '@wordpress/data';\nimport { getFilesFromDataTransfer } from '@wordpress/dom';\n\n/**\n * Internal dependencies\n */\nimport { store as blockEditorStore } from '../../store';\n\n/** @typedef {React.SyntheticEvent} SyntheticEvent */\n/** @typedef {import('./types').WPDropOperation} WPDropOperation */\n\n/**\n * Retrieve the data for a block drop event.\n *\n * @param {SyntheticEvent} event The drop event.\n *\n * @return {Object} An object with block drag and drop data.\n */\nexport function parseDropEvent( event ) {\n\tlet result = {\n\t\tsrcRootClientId: null,\n\t\tsrcClientIds: null,\n\t\tsrcIndex: null,\n\t\ttype: null,\n\t\tblocks: null,\n\t};\n\n\tif ( ! event.dataTransfer ) {\n\t\treturn result;\n\t}\n\n\ttry {\n\t\tresult = Object.assign(\n\t\t\tresult,\n\t\t\tJSON.parse( event.dataTransfer.getData( 'wp-blocks' ) )\n\t\t);\n\t} catch {\n\t\treturn result;\n\t}\n\n\treturn result;\n}\n\n/**\n * A function that returns an event handler function for block drop events.\n *\n * @param {string} targetRootClientId The root client id where the block(s) will be inserted.\n * @param {number} targetBlockIndex The index where the block(s) will be inserted.\n * @param {Function} getBlockIndex A function that gets the index of a block.\n * @param {Function} getClientIdsOfDescendants A function that gets the client ids of descendant blocks.\n * @param {Function} moveBlocks A function that moves blocks.\n * @param {Function} insertOrReplaceBlocks A function that inserts or replaces blocks.\n * @param {Function} clearSelectedBlock A function that clears block selection.\n * @param {string} operation The type of operation to perform on drop. Could be `insert` or `replace` or `group`.\n * @param {Function} getBlock A function that returns a block given its client id.\n * @return {Function} The event handler for a block drop event.\n */\nexport function onBlockDrop(\n\ttargetRootClientId,\n\ttargetBlockIndex,\n\tgetBlockIndex,\n\tgetClientIdsOfDescendants,\n\tmoveBlocks,\n\tinsertOrReplaceBlocks,\n\tclearSelectedBlock,\n\toperation,\n\tgetBlock\n) {\n\treturn ( event ) => {\n\t\tconst {\n\t\t\tsrcRootClientId: sourceRootClientId,\n\t\t\tsrcClientIds: sourceClientIds,\n\t\t\ttype: dropType,\n\t\t\tblocks,\n\t\t} = parseDropEvent( event );\n\n\t\t// If the user is inserting a block.\n\t\tif ( dropType === 'inserter' ) {\n\t\t\tclearSelectedBlock();\n\t\t\tconst blocksToInsert = blocks.map( ( block ) =>\n\t\t\t\tcloneBlock( block )\n\t\t\t);\n\t\t\tinsertOrReplaceBlocks( blocksToInsert, true, null );\n\t\t}\n\n\t\t// If the user is moving a block.\n\t\tif ( dropType === 'block' ) {\n\t\t\tconst sourceBlockIndex = getBlockIndex( sourceClientIds[ 0 ] );\n\n\t\t\t// If the user is dropping to the same position, return early.\n\t\t\tif (\n\t\t\t\tsourceRootClientId === targetRootClientId &&\n\t\t\t\tsourceBlockIndex === targetBlockIndex\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If the user is attempting to drop a block within its own\n\t\t\t// nested blocks, return early as this would create infinite\n\t\t\t// recursion.\n\t\t\tif (\n\t\t\t\tsourceClientIds.includes( targetRootClientId ) ||\n\t\t\t\tgetClientIdsOfDescendants( sourceClientIds ).some(\n\t\t\t\t\t( id ) => id === targetRootClientId\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If the user is dropping a block over another block, replace both blocks\n\t\t\t// with a group block containing them\n\t\t\tif ( operation === 'group' ) {\n\t\t\t\tconst blocksToInsert = sourceClientIds.map( ( clientId ) =>\n\t\t\t\t\tgetBlock( clientId )\n\t\t\t\t);\n\t\t\t\tinsertOrReplaceBlocks(\n\t\t\t\t\tblocksToInsert,\n\t\t\t\t\ttrue,\n\t\t\t\t\tnull,\n\t\t\t\t\tsourceClientIds\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst isAtSameLevel = sourceRootClientId === targetRootClientId;\n\t\t\tconst draggedBlockCount = sourceClientIds.length;\n\n\t\t\t// If the block is kept at the same level and moved downwards,\n\t\t\t// subtract to take into account that the blocks being dragged\n\t\t\t// were removed from the block list above the insertion point.\n\t\t\tconst insertIndex =\n\t\t\t\tisAtSameLevel && sourceBlockIndex < targetBlockIndex\n\t\t\t\t\t? targetBlockIndex - draggedBlockCount\n\t\t\t\t\t: targetBlockIndex;\n\n\t\t\tmoveBlocks( sourceClientIds, sourceRootClientId, insertIndex );\n\t\t}\n\t};\n}\n\n/**\n * A function that returns an event handler function for block-related file drop events.\n *\n * @param {string} targetRootClientId The root client id where the block(s) will be inserted.\n * @param {Function} getSettings A function that gets the block editor settings.\n * @param {Function} updateBlockAttributes A function that updates a block's attributes.\n * @param {Function} canInsertBlockType A function that returns checks whether a block type can be inserted.\n * @param {Function} insertOrReplaceBlocks A function that inserts or replaces blocks.\n *\n * @return {Function} The event handler for a block-related file drop event.\n */\nexport function onFilesDrop(\n\ttargetRootClientId,\n\tgetSettings,\n\tupdateBlockAttributes,\n\tcanInsertBlockType,\n\tinsertOrReplaceBlocks\n) {\n\treturn ( files ) => {\n\t\tif ( ! getSettings().mediaUpload ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst transformation = findTransform(\n\t\t\tgetBlockTransforms( 'from' ),\n\t\t\t( transform ) =>\n\t\t\t\ttransform.type === 'files' &&\n\t\t\t\tcanInsertBlockType( transform.blockName, targetRootClientId ) &&\n\t\t\t\ttransform.isMatch( files )\n\t\t);\n\n\t\tif ( transformation ) {\n\t\t\tconst blocks = transformation.transform(\n\t\t\t\tfiles,\n\t\t\t\tupdateBlockAttributes\n\t\t\t);\n\t\t\tinsertOrReplaceBlocks( blocks );\n\t\t}\n\t};\n}\n\n/**\n * A function that returns an event handler function for block-related HTML drop events.\n *\n * @param {Function} insertOrReplaceBlocks A function that inserts or replaces blocks.\n *\n * @return {Function} The event handler for a block-related HTML drop event.\n */\nexport function onHTMLDrop( insertOrReplaceBlocks ) {\n\treturn ( HTML ) => {\n\t\tconst blocks = pasteHandler( { HTML, mode: 'BLOCKS' } );\n\n\t\tif ( blocks.length ) {\n\t\t\tinsertOrReplaceBlocks( blocks );\n\t\t}\n\t};\n}\n\n/**\n * A React hook for handling block drop events.\n *\n * @param {string} targetRootClientId The root client id where the block(s) will be inserted.\n * @param {number} targetBlockIndex The index where the block(s) will be inserted.\n * @param {Object} options The optional options.\n * @param {WPDropOperation} [options.operation] The type of operation to perform on drop. Could be `insert` or `replace` for now.\n *\n * @return {Function} A function to be passed to the onDrop handler.\n */\nexport default function useOnBlockDrop(\n\ttargetRootClientId,\n\ttargetBlockIndex,\n\toptions = {}\n) {\n\tconst { operation = 'insert', nearestSide = 'right' } = options;\n\tconst {\n\t\tcanInsertBlockType,\n\t\tgetBlockIndex,\n\t\tgetClientIdsOfDescendants,\n\t\tgetBlockOrder,\n\t\tgetBlocksByClientId,\n\t\tgetSettings,\n\t\tgetBlock,\n\t} = useSelect( blockEditorStore );\n\tconst { getGroupingBlockName } = useSelect( blocksStore );\n\tconst {\n\t\tinsertBlocks,\n\t\tmoveBlocksToPosition,\n\t\tupdateBlockAttributes,\n\t\tclearSelectedBlock,\n\t\treplaceBlocks,\n\t\tremoveBlocks,\n\t} = useDispatch( blockEditorStore );\n\tconst registry = useRegistry();\n\n\tconst insertOrReplaceBlocks = useCallback(\n\t\t(\n\t\t\tblocks,\n\t\t\tupdateSelection = true,\n\t\t\tinitialPosition = 0,\n\t\t\tclientIdsToReplace = []\n\t\t) => {\n\t\t\tif ( ! Array.isArray( blocks ) ) {\n\t\t\t\tblocks = [ blocks ];\n\t\t\t}\n\t\t\tconst clientIds = getBlockOrder( targetRootClientId );\n\t\t\tconst clientId = clientIds[ targetBlockIndex ];\n\t\t\tif ( operation === 'replace' ) {\n\t\t\t\treplaceBlocks( clientId, blocks, undefined, initialPosition );\n\t\t\t} else if ( operation === 'group' ) {\n\t\t\t\tconst targetBlock = getBlock( clientId );\n\t\t\t\tif ( nearestSide === 'left' ) {\n\t\t\t\t\tblocks.push( targetBlock );\n\t\t\t\t} else {\n\t\t\t\t\tblocks.unshift( targetBlock );\n\t\t\t\t}\n\n\t\t\t\tconst groupInnerBlocks = blocks.map( ( block ) =>\n\t\t\t\t\t__experimentalCloneSanitizedBlock( block )\n\t\t\t\t);\n\n\t\t\t\tconst areAllImages = blocks.every( ( block ) => {\n\t\t\t\t\treturn block.name === 'core/image';\n\t\t\t\t} );\n\n\t\t\t\tconst galleryBlock = canInsertBlockType(\n\t\t\t\t\t'core/gallery',\n\t\t\t\t\ttargetRootClientId\n\t\t\t\t);\n\n\t\t\t\tconst wrappedBlocks = createBlock(\n\t\t\t\t\tareAllImages && galleryBlock\n\t\t\t\t\t\t? 'core/gallery'\n\t\t\t\t\t\t: getGroupingBlockName(),\n\t\t\t\t\t{\n\t\t\t\t\t\tlayout: {\n\t\t\t\t\t\t\ttype: 'flex',\n\t\t\t\t\t\t\tflexWrap:\n\t\t\t\t\t\t\t\tareAllImages && galleryBlock ? null : 'nowrap',\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tgroupInnerBlocks\n\t\t\t\t);\n\t\t\t\t// Need to make sure both the target block and the block being dragged are replaced\n\t\t\t\t// otherwise the dragged block will be duplicated.\n\t\t\t\treplaceBlocks(\n\t\t\t\t\t[ clientId, ...clientIdsToReplace ],\n\t\t\t\t\twrappedBlocks,\n\t\t\t\t\tundefined,\n\t\t\t\t\tinitialPosition\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tinsertBlocks(\n\t\t\t\t\tblocks,\n\t\t\t\t\ttargetBlockIndex,\n\t\t\t\t\ttargetRootClientId,\n\t\t\t\t\tupdateSelection,\n\t\t\t\t\tinitialPosition\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\t\t[\n\t\t\tgetBlockOrder,\n\t\t\ttargetRootClientId,\n\t\t\ttargetBlockIndex,\n\t\t\toperation,\n\t\t\treplaceBlocks,\n\t\t\tgetBlock,\n\t\t\tnearestSide,\n\t\t\tcanInsertBlockType,\n\t\t\tgetGroupingBlockName,\n\t\t\tinsertBlocks,\n\t\t]\n\t);\n\n\tconst moveBlocks = useCallback(\n\t\t( sourceClientIds, sourceRootClientId, insertIndex ) => {\n\t\t\tif ( operation === 'replace' ) {\n\t\t\t\tconst sourceBlocks = getBlocksByClientId( sourceClientIds );\n\t\t\t\tconst targetBlockClientIds =\n\t\t\t\t\tgetBlockOrder( targetRootClientId );\n\t\t\t\tconst targetBlockClientId =\n\t\t\t\t\ttargetBlockClientIds[ targetBlockIndex ];\n\n\t\t\t\tregistry.batch( () => {\n\t\t\t\t\t// Remove the source blocks.\n\t\t\t\t\tremoveBlocks( sourceClientIds, false );\n\t\t\t\t\t// Replace the target block with the source blocks.\n\t\t\t\t\treplaceBlocks(\n\t\t\t\t\t\ttargetBlockClientId,\n\t\t\t\t\t\tsourceBlocks,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t0\n\t\t\t\t\t);\n\t\t\t\t} );\n\t\t\t} else {\n\t\t\t\tmoveBlocksToPosition(\n\t\t\t\t\tsourceClientIds,\n\t\t\t\t\tsourceRootClientId,\n\t\t\t\t\ttargetRootClientId,\n\t\t\t\t\tinsertIndex\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\t\t[\n\t\t\toperation,\n\t\t\tgetBlockOrder,\n\t\t\tgetBlocksByClientId,\n\t\t\tmoveBlocksToPosition,\n\t\t\tregistry,\n\t\t\tremoveBlocks,\n\t\t\treplaceBlocks,\n\t\t\ttargetBlockIndex,\n\t\t\ttargetRootClientId,\n\t\t]\n\t);\n\n\tconst _onDrop = onBlockDrop(\n\t\ttargetRootClientId,\n\t\ttargetBlockIndex,\n\t\tgetBlockIndex,\n\t\tgetClientIdsOfDescendants,\n\t\tmoveBlocks,\n\t\tinsertOrReplaceBlocks,\n\t\tclearSelectedBlock,\n\t\toperation,\n\t\tgetBlock\n\t);\n\tconst _onFilesDrop = onFilesDrop(\n\t\ttargetRootClientId,\n\t\tgetSettings,\n\t\tupdateBlockAttributes,\n\t\tcanInsertBlockType,\n\t\tinsertOrReplaceBlocks\n\t);\n\tconst _onHTMLDrop = onHTMLDrop( insertOrReplaceBlocks );\n\n\treturn ( event ) => {\n\t\tconst files = getFilesFromDataTransfer( event.dataTransfer );\n\t\tconst html = event.dataTransfer.getData( 'text/html' );\n\n\t\t/**\n\t\t * From Windows Chrome 96, the `event.dataTransfer` returns both file object and HTML.\n\t\t * The order of the checks is important to recognise the HTML drop.\n\t\t */\n\t\tif ( html ) {\n\t\t\t_onHTMLDrop( html );\n\t\t} else if ( files.length ) {\n\t\t\t_onFilesDrop( files );\n\t\t} else {\n\t\t\t_onDrop( event );\n\t\t}\n\t};\n}\n"],
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { useCallback } from '@wordpress/element';\nimport {\n\tcloneBlock,\n\tcreateBlock,\n\tcloneSanitizedBlock,\n\tfindTransform,\n\tgetBlockTransforms,\n\tpasteHandler,\n\tstore as blocksStore,\n} from '@wordpress/blocks';\nimport { useDispatch, useSelect, useRegistry } from '@wordpress/data';\nimport { getFilesFromDataTransfer } from '@wordpress/dom';\n\n/**\n * Internal dependencies\n */\nimport { store as blockEditorStore } from '../../store';\n\n/** @typedef {React.SyntheticEvent} SyntheticEvent */\n/** @typedef {import('./types').WPDropOperation} WPDropOperation */\n\n/**\n * Retrieve the data for a block drop event.\n *\n * @param {SyntheticEvent} event The drop event.\n *\n * @return {Object} An object with block drag and drop data.\n */\nexport function parseDropEvent( event ) {\n\tlet result = {\n\t\tsrcRootClientId: null,\n\t\tsrcClientIds: null,\n\t\tsrcIndex: null,\n\t\ttype: null,\n\t\tblocks: null,\n\t};\n\n\tif ( ! event.dataTransfer ) {\n\t\treturn result;\n\t}\n\n\ttry {\n\t\tresult = Object.assign(\n\t\t\tresult,\n\t\t\tJSON.parse( event.dataTransfer.getData( 'wp-blocks' ) )\n\t\t);\n\t} catch {\n\t\treturn result;\n\t}\n\n\treturn result;\n}\n\n/**\n * A function that returns an event handler function for block drop events.\n *\n * @param {string} targetRootClientId The root client id where the block(s) will be inserted.\n * @param {number} targetBlockIndex The index where the block(s) will be inserted.\n * @param {Function} getBlockIndex A function that gets the index of a block.\n * @param {Function} getClientIdsOfDescendants A function that gets the client ids of descendant blocks.\n * @param {Function} moveBlocks A function that moves blocks.\n * @param {Function} insertOrReplaceBlocks A function that inserts or replaces blocks.\n * @param {Function} clearSelectedBlock A function that clears block selection.\n * @param {string} operation The type of operation to perform on drop. Could be `insert` or `replace` or `group`.\n * @param {Function} getBlock A function that returns a block given its client id.\n * @return {Function} The event handler for a block drop event.\n */\nexport function onBlockDrop(\n\ttargetRootClientId,\n\ttargetBlockIndex,\n\tgetBlockIndex,\n\tgetClientIdsOfDescendants,\n\tmoveBlocks,\n\tinsertOrReplaceBlocks,\n\tclearSelectedBlock,\n\toperation,\n\tgetBlock\n) {\n\treturn ( event ) => {\n\t\tconst {\n\t\t\tsrcRootClientId: sourceRootClientId,\n\t\t\tsrcClientIds: sourceClientIds,\n\t\t\ttype: dropType,\n\t\t\tblocks,\n\t\t} = parseDropEvent( event );\n\n\t\t// If the user is inserting a block.\n\t\tif ( dropType === 'inserter' ) {\n\t\t\tclearSelectedBlock();\n\t\t\tconst blocksToInsert = blocks.map( ( block ) =>\n\t\t\t\tcloneBlock( block )\n\t\t\t);\n\t\t\tinsertOrReplaceBlocks( blocksToInsert, true, null );\n\t\t}\n\n\t\t// If the user is moving a block.\n\t\tif ( dropType === 'block' ) {\n\t\t\tconst sourceBlockIndex = getBlockIndex( sourceClientIds[ 0 ] );\n\n\t\t\t// If the user is dropping to the same position, return early.\n\t\t\tif (\n\t\t\t\tsourceRootClientId === targetRootClientId &&\n\t\t\t\tsourceBlockIndex === targetBlockIndex\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If the user is attempting to drop a block within its own\n\t\t\t// nested blocks, return early as this would create infinite\n\t\t\t// recursion.\n\t\t\tif (\n\t\t\t\tsourceClientIds.includes( targetRootClientId ) ||\n\t\t\t\tgetClientIdsOfDescendants( sourceClientIds ).some(\n\t\t\t\t\t( id ) => id === targetRootClientId\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If the user is dropping a block over another block, replace both blocks\n\t\t\t// with a group block containing them\n\t\t\tif ( operation === 'group' ) {\n\t\t\t\tconst blocksToInsert = sourceClientIds.map( ( clientId ) =>\n\t\t\t\t\tgetBlock( clientId )\n\t\t\t\t);\n\t\t\t\tinsertOrReplaceBlocks(\n\t\t\t\t\tblocksToInsert,\n\t\t\t\t\ttrue,\n\t\t\t\t\tnull,\n\t\t\t\t\tsourceClientIds\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst isAtSameLevel = sourceRootClientId === targetRootClientId;\n\t\t\tconst draggedBlockCount = sourceClientIds.length;\n\n\t\t\t// If the block is kept at the same level and moved downwards,\n\t\t\t// subtract to take into account that the blocks being dragged\n\t\t\t// were removed from the block list above the insertion point.\n\t\t\tconst insertIndex =\n\t\t\t\tisAtSameLevel && sourceBlockIndex < targetBlockIndex\n\t\t\t\t\t? targetBlockIndex - draggedBlockCount\n\t\t\t\t\t: targetBlockIndex;\n\n\t\t\tmoveBlocks( sourceClientIds, sourceRootClientId, insertIndex );\n\t\t}\n\t};\n}\n\n/**\n * A function that returns an event handler function for block-related file drop events.\n *\n * @param {string} targetRootClientId The root client id where the block(s) will be inserted.\n * @param {Function} getSettings A function that gets the block editor settings.\n * @param {Function} updateBlockAttributes A function that updates a block's attributes.\n * @param {Function} canInsertBlockType A function that returns checks whether a block type can be inserted.\n * @param {Function} insertOrReplaceBlocks A function that inserts or replaces blocks.\n *\n * @return {Function} The event handler for a block-related file drop event.\n */\nexport function onFilesDrop(\n\ttargetRootClientId,\n\tgetSettings,\n\tupdateBlockAttributes,\n\tcanInsertBlockType,\n\tinsertOrReplaceBlocks\n) {\n\treturn ( files ) => {\n\t\tif ( ! getSettings().mediaUpload ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst transformation = findTransform(\n\t\t\tgetBlockTransforms( 'from' ),\n\t\t\t( transform ) =>\n\t\t\t\ttransform.type === 'files' &&\n\t\t\t\tcanInsertBlockType( transform.blockName, targetRootClientId ) &&\n\t\t\t\ttransform.isMatch( files )\n\t\t);\n\n\t\tif ( transformation ) {\n\t\t\tconst blocks = transformation.transform(\n\t\t\t\tfiles,\n\t\t\t\tupdateBlockAttributes\n\t\t\t);\n\t\t\tinsertOrReplaceBlocks( blocks );\n\t\t}\n\t};\n}\n\n/**\n * A function that returns an event handler function for block-related HTML drop events.\n *\n * @param {Function} insertOrReplaceBlocks A function that inserts or replaces blocks.\n *\n * @return {Function} The event handler for a block-related HTML drop event.\n */\nexport function onHTMLDrop( insertOrReplaceBlocks ) {\n\treturn ( HTML ) => {\n\t\tconst blocks = pasteHandler( { HTML, mode: 'BLOCKS' } );\n\n\t\tif ( blocks.length ) {\n\t\t\tinsertOrReplaceBlocks( blocks );\n\t\t}\n\t};\n}\n\n/**\n * A React hook for handling block drop events.\n *\n * @param {string} targetRootClientId The root client id where the block(s) will be inserted.\n * @param {number} targetBlockIndex The index where the block(s) will be inserted.\n * @param {Object} options The optional options.\n * @param {WPDropOperation} [options.operation] The type of operation to perform on drop. Could be `insert` or `replace` for now.\n *\n * @return {Function} A function to be passed to the onDrop handler.\n */\nexport default function useOnBlockDrop(\n\ttargetRootClientId,\n\ttargetBlockIndex,\n\toptions = {}\n) {\n\tconst { operation = 'insert', nearestSide = 'right' } = options;\n\tconst {\n\t\tcanInsertBlockType,\n\t\tgetBlockIndex,\n\t\tgetClientIdsOfDescendants,\n\t\tgetBlockOrder,\n\t\tgetBlocksByClientId,\n\t\tgetSettings,\n\t\tgetBlock,\n\t} = useSelect( blockEditorStore );\n\tconst { getGroupingBlockName } = useSelect( blocksStore );\n\tconst {\n\t\tinsertBlocks,\n\t\tmoveBlocksToPosition,\n\t\tupdateBlockAttributes,\n\t\tclearSelectedBlock,\n\t\treplaceBlocks,\n\t\tremoveBlocks,\n\t} = useDispatch( blockEditorStore );\n\tconst registry = useRegistry();\n\n\tconst insertOrReplaceBlocks = useCallback(\n\t\t(\n\t\t\tblocks,\n\t\t\tupdateSelection = true,\n\t\t\tinitialPosition = 0,\n\t\t\tclientIdsToReplace = []\n\t\t) => {\n\t\t\tif ( ! Array.isArray( blocks ) ) {\n\t\t\t\tblocks = [ blocks ];\n\t\t\t}\n\t\t\tconst clientIds = getBlockOrder( targetRootClientId );\n\t\t\tconst clientId = clientIds[ targetBlockIndex ];\n\t\t\tif ( operation === 'replace' ) {\n\t\t\t\treplaceBlocks( clientId, blocks, undefined, initialPosition );\n\t\t\t} else if ( operation === 'group' ) {\n\t\t\t\tconst targetBlock = getBlock( clientId );\n\t\t\t\tif ( nearestSide === 'left' ) {\n\t\t\t\t\tblocks.push( targetBlock );\n\t\t\t\t} else {\n\t\t\t\t\tblocks.unshift( targetBlock );\n\t\t\t\t}\n\n\t\t\t\tconst groupInnerBlocks = blocks.map( ( block ) =>\n\t\t\t\t\tcloneSanitizedBlock( block )\n\t\t\t\t);\n\n\t\t\t\tconst areAllImages = blocks.every( ( block ) => {\n\t\t\t\t\treturn block.name === 'core/image';\n\t\t\t\t} );\n\n\t\t\t\tconst galleryBlock = canInsertBlockType(\n\t\t\t\t\t'core/gallery',\n\t\t\t\t\ttargetRootClientId\n\t\t\t\t);\n\n\t\t\t\tconst wrappedBlocks = createBlock(\n\t\t\t\t\tareAllImages && galleryBlock\n\t\t\t\t\t\t? 'core/gallery'\n\t\t\t\t\t\t: getGroupingBlockName(),\n\t\t\t\t\t{\n\t\t\t\t\t\tlayout: {\n\t\t\t\t\t\t\ttype: 'flex',\n\t\t\t\t\t\t\tflexWrap:\n\t\t\t\t\t\t\t\tareAllImages && galleryBlock ? null : 'nowrap',\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tgroupInnerBlocks\n\t\t\t\t);\n\t\t\t\t// Need to make sure both the target block and the block being dragged are replaced\n\t\t\t\t// otherwise the dragged block will be duplicated.\n\t\t\t\treplaceBlocks(\n\t\t\t\t\t[ clientId, ...clientIdsToReplace ],\n\t\t\t\t\twrappedBlocks,\n\t\t\t\t\tundefined,\n\t\t\t\t\tinitialPosition\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tinsertBlocks(\n\t\t\t\t\tblocks,\n\t\t\t\t\ttargetBlockIndex,\n\t\t\t\t\ttargetRootClientId,\n\t\t\t\t\tupdateSelection,\n\t\t\t\t\tinitialPosition\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\t\t[\n\t\t\tgetBlockOrder,\n\t\t\ttargetRootClientId,\n\t\t\ttargetBlockIndex,\n\t\t\toperation,\n\t\t\treplaceBlocks,\n\t\t\tgetBlock,\n\t\t\tnearestSide,\n\t\t\tcanInsertBlockType,\n\t\t\tgetGroupingBlockName,\n\t\t\tinsertBlocks,\n\t\t]\n\t);\n\n\tconst moveBlocks = useCallback(\n\t\t( sourceClientIds, sourceRootClientId, insertIndex ) => {\n\t\t\tif ( operation === 'replace' ) {\n\t\t\t\tconst sourceBlocks = getBlocksByClientId( sourceClientIds );\n\t\t\t\tconst targetBlockClientIds =\n\t\t\t\t\tgetBlockOrder( targetRootClientId );\n\t\t\t\tconst targetBlockClientId =\n\t\t\t\t\ttargetBlockClientIds[ targetBlockIndex ];\n\n\t\t\t\tregistry.batch( () => {\n\t\t\t\t\t// Remove the source blocks.\n\t\t\t\t\tremoveBlocks( sourceClientIds, false );\n\t\t\t\t\t// Replace the target block with the source blocks.\n\t\t\t\t\treplaceBlocks(\n\t\t\t\t\t\ttargetBlockClientId,\n\t\t\t\t\t\tsourceBlocks,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t0\n\t\t\t\t\t);\n\t\t\t\t} );\n\t\t\t} else {\n\t\t\t\tmoveBlocksToPosition(\n\t\t\t\t\tsourceClientIds,\n\t\t\t\t\tsourceRootClientId,\n\t\t\t\t\ttargetRootClientId,\n\t\t\t\t\tinsertIndex\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\t\t[\n\t\t\toperation,\n\t\t\tgetBlockOrder,\n\t\t\tgetBlocksByClientId,\n\t\t\tmoveBlocksToPosition,\n\t\t\tregistry,\n\t\t\tremoveBlocks,\n\t\t\treplaceBlocks,\n\t\t\ttargetBlockIndex,\n\t\t\ttargetRootClientId,\n\t\t]\n\t);\n\n\tconst _onDrop = onBlockDrop(\n\t\ttargetRootClientId,\n\t\ttargetBlockIndex,\n\t\tgetBlockIndex,\n\t\tgetClientIdsOfDescendants,\n\t\tmoveBlocks,\n\t\tinsertOrReplaceBlocks,\n\t\tclearSelectedBlock,\n\t\toperation,\n\t\tgetBlock\n\t);\n\tconst _onFilesDrop = onFilesDrop(\n\t\ttargetRootClientId,\n\t\tgetSettings,\n\t\tupdateBlockAttributes,\n\t\tcanInsertBlockType,\n\t\tinsertOrReplaceBlocks\n\t);\n\tconst _onHTMLDrop = onHTMLDrop( insertOrReplaceBlocks );\n\n\treturn ( event ) => {\n\t\tconst files = getFilesFromDataTransfer( event.dataTransfer );\n\t\tconst html = event.dataTransfer.getData( 'text/html' );\n\n\t\t/**\n\t\t * From Windows Chrome 96, the `event.dataTransfer` returns both file object and HTML.\n\t\t * The order of the checks is important to recognise the HTML drop.\n\t\t */\n\t\tif ( html ) {\n\t\t\t_onHTMLDrop( html );\n\t\t} else if ( files.length ) {\n\t\t\t_onFilesDrop( files );\n\t\t} else {\n\t\t\t_onDrop( event );\n\t\t}\n\t};\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,qBAA4B;AAC5B,oBAQO;AACP,kBAAoD;AACpD,iBAAyC;AAKzC,mBAA0C;AAYnC,SAAS,eAAgB,OAAQ;AACvC,MAAI,SAAS;AAAA,IACZ,iBAAiB;AAAA,IACjB,cAAc;AAAA,IACd,UAAU;AAAA,IACV,MAAM;AAAA,IACN,QAAQ;AAAA,EACT;AAEA,MAAK,CAAE,MAAM,cAAe;AAC3B,WAAO;AAAA,EACR;AAEA,MAAI;AACH,aAAS,OAAO;AAAA,MACf;AAAA,MACA,KAAK,MAAO,MAAM,aAAa,QAAS,WAAY,CAAE;AAAA,IACvD;AAAA,EACD,QAAQ;AACP,WAAO;AAAA,EACR;AAEA,SAAO;AACR;AAgBO,SAAS,YACf,oBACA,kBACA,eACA,2BACA,YACA,uBACA,oBACA,WACA,UACC;AACD,SAAO,CAAE,UAAW;AACnB,UAAM;AAAA,MACL,iBAAiB;AAAA,MACjB,cAAc;AAAA,MACd,MAAM;AAAA,MACN;AAAA,IACD,IAAI,eAAgB,KAAM;AAG1B,QAAK,aAAa,YAAa;AAC9B,yBAAmB;AACnB,YAAM,iBAAiB,OAAO;AAAA,QAAK,CAAE,cACpC,0BAAY,KAAM;AAAA,MACnB;AACA,4BAAuB,gBAAgB,MAAM,IAAK;AAAA,IACnD;AAGA,QAAK,aAAa,SAAU;AAC3B,YAAM,mBAAmB,cAAe,gBAAiB,CAAE,CAAE;AAG7D,UACC,uBAAuB,sBACvB,qBAAqB,kBACpB;AACD;AAAA,MACD;AAKA,UACC,gBAAgB,SAAU,kBAAmB,KAC7C,0BAA2B,eAAgB,EAAE;AAAA,QAC5C,CAAE,OAAQ,OAAO;AAAA,MAClB,GACC;AACD;AAAA,MACD;AAIA,UAAK,cAAc,SAAU;AAC5B,cAAM,iBAAiB,gBAAgB;AAAA,UAAK,CAAE,aAC7C,SAAU,QAAS;AAAA,QACpB;AACA;AAAA,UACC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACD;AACA;AAAA,MACD;AAEA,YAAM,gBAAgB,uBAAuB;AAC7C,YAAM,oBAAoB,gBAAgB;AAK1C,YAAM,cACL,iBAAiB,mBAAmB,mBACjC,mBAAmB,oBACnB;AAEJ,iBAAY,iBAAiB,oBAAoB,WAAY;AAAA,IAC9D;AAAA,EACD;AACD;AAaO,SAAS,YACf,oBACA,aACA,uBACA,oBACA,uBACC;AACD,SAAO,CAAE,UAAW;AACnB,QAAK,CAAE,YAAY,EAAE,aAAc;AAClC;AAAA,IACD;AAEA,UAAM,qBAAiB;AAAA,UACtB,kCAAoB,MAAO;AAAA,MAC3B,CAAE,cACD,UAAU,SAAS,WACnB,mBAAoB,UAAU,WAAW,kBAAmB,KAC5D,UAAU,QAAS,KAAM;AAAA,IAC3B;AAEA,QAAK,gBAAiB;AACrB,YAAM,SAAS,eAAe;AAAA,QAC7B;AAAA,QACA;AAAA,MACD;AACA,4BAAuB,MAAO;AAAA,IAC/B;AAAA,EACD;AACD;AASO,SAAS,WAAY,uBAAwB;AACnD,SAAO,CAAE,SAAU;AAClB,UAAM,aAAS,4BAAc,EAAE,MAAM,MAAM,SAAS,CAAE;AAEtD,QAAK,OAAO,QAAS;AACpB,4BAAuB,MAAO;AAAA,IAC/B;AAAA,EACD;AACD;AAYe,SAAR,eACN,oBACA,kBACA,UAAU,CAAC,GACV;AACD,QAAM,EAAE,YAAY,UAAU,cAAc,QAAQ,IAAI;AACxD,QAAM;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,QAAI,uBAAW,aAAAA,KAAiB;AAChC,QAAM,EAAE,qBAAqB,QAAI,uBAAW,cAAAC,KAAY;AACxD,QAAM;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,QAAI,yBAAa,aAAAD,KAAiB;AAClC,QAAM,eAAW,yBAAY;AAE7B,QAAM,4BAAwB;AAAA,IAC7B,CACC,QACA,kBAAkB,MAClB,kBAAkB,GAClB,qBAAqB,CAAC,MAClB;AACJ,UAAK,CAAE,MAAM,QAAS,MAAO,GAAI;AAChC,iBAAS,CAAE,MAAO;AAAA,MACnB;AACA,YAAM,YAAY,cAAe,kBAAmB;AACpD,YAAM,WAAW,UAAW,gBAAiB;AAC7C,UAAK,cAAc,WAAY;AAC9B,sBAAe,UAAU,QAAQ,QAAW,eAAgB;AAAA,MAC7D,WAAY,cAAc,SAAU;AACnC,cAAM,cAAc,SAAU,QAAS;AACvC,YAAK,gBAAgB,QAAS;AAC7B,iBAAO,KAAM,WAAY;AAAA,QAC1B,OAAO;AACN,iBAAO,QAAS,WAAY;AAAA,QAC7B;AAEA,cAAM,mBAAmB,OAAO;AAAA,UAAK,CAAE,cACtC,mCAAqB,KAAM;AAAA,QAC5B;AAEA,cAAM,eAAe,OAAO,MAAO,CAAE,UAAW;AAC/C,iBAAO,MAAM,SAAS;AAAA,QACvB,CAAE;AAEF,cAAM,eAAe;AAAA,UACpB;AAAA,UACA;AAAA,QACD;AAEA,cAAM,oBAAgB;AAAA,UACrB,gBAAgB,eACb,iBACA,qBAAqB;AAAA,UACxB;AAAA,YACC,QAAQ;AAAA,cACP,MAAM;AAAA,cACN,UACC,gBAAgB,eAAe,OAAO;AAAA,YACxC;AAAA,UACD;AAAA,UACA;AAAA,QACD;AAGA;AAAA,UACC,CAAE,UAAU,GAAG,kBAAmB;AAAA,UAClC;AAAA,UACA;AAAA,UACA;AAAA,QACD;AAAA,MACD,OAAO;AACN;AAAA,UACC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAAA,IACA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAAA,EACD;AAEA,QAAM,iBAAa;AAAA,IAClB,CAAE,iBAAiB,oBAAoB,gBAAiB;AACvD,UAAK,cAAc,WAAY;AAC9B,cAAM,eAAe,oBAAqB,eAAgB;AAC1D,cAAM,uBACL,cAAe,kBAAmB;AACnC,cAAM,sBACL,qBAAsB,gBAAiB;AAExC,iBAAS,MAAO,MAAM;AAErB,uBAAc,iBAAiB,KAAM;AAErC;AAAA,YACC;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACD;AAAA,QACD,CAAE;AAAA,MACH,OAAO;AACN;AAAA,UACC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAAA,IACA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAAA,EACD;AAEA,QAAM,UAAU;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD;AACA,QAAM,eAAe;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD;AACA,QAAM,cAAc,WAAY,qBAAsB;AAEtD,SAAO,CAAE,UAAW;AACnB,UAAM,YAAQ,qCAA0B,MAAM,YAAa;AAC3D,UAAM,OAAO,MAAM,aAAa,QAAS,WAAY;AAMrD,QAAK,MAAO;AACX,kBAAa,IAAK;AAAA,IACnB,WAAY,MAAM,QAAS;AAC1B,mBAAc,KAAM;AAAA,IACrB,OAAO;AACN,cAAS,KAAM;AAAA,IAChB;AAAA,EACD;AACD;",
|
|
6
6
|
"names": ["blockEditorStore", "blocksStore"]
|
|
7
7
|
}
|
|
@@ -39,6 +39,8 @@ var import_data = require("@wordpress/data");
|
|
|
39
39
|
var import_i18n = require("@wordpress/i18n");
|
|
40
40
|
var import_compose = require("@wordpress/compose");
|
|
41
41
|
var import_element = require("@wordpress/element");
|
|
42
|
+
var import_use_editable_root = __toESM(require("./use-editable-root.cjs"));
|
|
43
|
+
var import_use_home_end = __toESM(require("./use-home-end.cjs"));
|
|
42
44
|
var import_use_multi_selection = __toESM(require("./use-multi-selection.cjs"));
|
|
43
45
|
var import_use_tab_nav = __toESM(require("./use-tab-nav.cjs"));
|
|
44
46
|
var import_use_arrow_nav = __toESM(require("./use-arrow-nav.cjs"));
|
|
@@ -46,6 +48,7 @@ var import_use_preview_mode_nav = require("./use-preview-mode-nav.cjs");
|
|
|
46
48
|
var import_use_select_all = __toESM(require("./use-select-all.cjs"));
|
|
47
49
|
var import_use_drag_selection = __toESM(require("./use-drag-selection.cjs"));
|
|
48
50
|
var import_use_selection_observer = __toESM(require("./use-selection-observer.cjs"));
|
|
51
|
+
var import_use_editable_root_event_handlers = __toESM(require("./use-editable-root-event-handlers.cjs"));
|
|
49
52
|
var import_use_click_selection = __toESM(require("./use-click-selection.cjs"));
|
|
50
53
|
var import_use_input = __toESM(require("./use-input.cjs"));
|
|
51
54
|
var import_use_clipboard_handler = __toESM(require("./use-clipboard-handler.cjs"));
|
|
@@ -61,8 +64,11 @@ function useWritingFlow() {
|
|
|
61
64
|
before,
|
|
62
65
|
(0, import_compose.useMergeRefs)([
|
|
63
66
|
ref,
|
|
67
|
+
(0, import_use_editable_root_event_handlers.default)(),
|
|
64
68
|
(0, import_use_clipboard_handler.default)(),
|
|
65
69
|
(0, import_use_input.default)(),
|
|
70
|
+
(0, import_use_editable_root.default)(),
|
|
71
|
+
(0, import_use_home_end.default)(),
|
|
66
72
|
(0, import_use_drag_selection.default)(),
|
|
67
73
|
(0, import_use_selection_observer.default)(),
|
|
68
74
|
(0, import_use_click_selection.default)(),
|
|
@@ -85,7 +91,14 @@ function useWritingFlow() {
|
|
|
85
91
|
);
|
|
86
92
|
return () => {
|
|
87
93
|
delete node.dataset.hasMultiSelection;
|
|
88
|
-
node.
|
|
94
|
+
if (node.contentEditable === "true") {
|
|
95
|
+
node.setAttribute(
|
|
96
|
+
"aria-label",
|
|
97
|
+
(0, import_i18n.__)("Editor canvas")
|
|
98
|
+
);
|
|
99
|
+
} else {
|
|
100
|
+
node.removeAttribute("aria-label");
|
|
101
|
+
}
|
|
89
102
|
};
|
|
90
103
|
},
|
|
91
104
|
[hasMultiSelection]
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/components/writing-flow/index.js"],
|
|
4
|
-
"sourcesContent": ["/**\n * External dependencies\n */\nimport clsx from 'clsx';\n\n/**\n * WordPress dependencies\n */\nimport { useSelect } from '@wordpress/data';\nimport { __ } from '@wordpress/i18n';\nimport { useMergeRefs, useRefEffect } from '@wordpress/compose';\nimport { forwardRef } from '@wordpress/element';\n\n/**\n * Internal dependencies\n */\nimport useMultiSelection from './use-multi-selection';\nimport useTabNav from './use-tab-nav';\nimport useArrowNav from './use-arrow-nav';\nimport { usePreviewModeNav } from './use-preview-mode-nav';\nimport useSelectAll from './use-select-all';\nimport useDragSelection from './use-drag-selection';\nimport useSelectionObserver from './use-selection-observer';\nimport useClickSelection from './use-click-selection';\nimport useInput from './use-input';\nimport useClipboardHandler from './use-clipboard-handler';\nimport { store as blockEditorStore } from '../../store';\n\nexport function useWritingFlow() {\n\tconst [ before, ref, after ] = useTabNav();\n\tconst hasMultiSelection = useSelect(\n\t\t( select ) => select( blockEditorStore ).hasMultiSelection(),\n\t\t[]\n\t);\n\n\treturn [\n\t\tbefore,\n\t\tuseMergeRefs( [\n\t\t\tref,\n\t\t\tuseClipboardHandler(),\n\t\t\tuseInput(),\n\t\t\tuseDragSelection(),\n\t\t\tuseSelectionObserver(),\n\t\t\tuseClickSelection(),\n\t\t\tuseMultiSelection(),\n\t\t\tuseSelectAll(),\n\t\t\tuseArrowNav(),\n\t\t\tusePreviewModeNav(),\n\t\t\tuseRefEffect(\n\t\t\t\t( node ) => {\n\t\t\t\t\tnode.tabIndex = 0;\n\t\t\t\t\tnode.dataset.hasMultiSelection = hasMultiSelection;\n\n\t\t\t\t\tif ( ! hasMultiSelection ) {\n\t\t\t\t\t\treturn () => {\n\t\t\t\t\t\t\tdelete node.dataset.hasMultiSelection;\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\tnode.setAttribute(\n\t\t\t\t\t\t'aria-label',\n\t\t\t\t\t\t__( 'Multiple selected blocks' )\n\t\t\t\t\t);\n\n\t\t\t\t\treturn () => {\n\t\t\t\t\t\tdelete node.dataset.hasMultiSelection;\n\t\t\t\t\t\tnode.removeAttribute( 'aria-label' );\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t\t[ hasMultiSelection ]\n\t\t\t),\n\t\t] ),\n\t\tafter,\n\t];\n}\n\nfunction WritingFlow( { children, ...props }, forwardedRef ) {\n\tconst [ before, ref, after ] = useWritingFlow();\n\treturn (\n\t\t<>\n\t\t\t{ before }\n\t\t\t<div\n\t\t\t\t{ ...props }\n\t\t\t\tref={ useMergeRefs( [ ref, forwardedRef ] ) }\n\t\t\t\tclassName={ clsx(\n\t\t\t\t\tprops.className,\n\t\t\t\t\t'block-editor-writing-flow'\n\t\t\t\t) }\n\t\t\t>\n\t\t\t\t{ children }\n\t\t\t</div>\n\t\t\t{ after }\n\t\t</>\n\t);\n}\n\n/**\n * Handles selection and navigation across blocks. This component should be\n * wrapped around BlockList.\n *\n * @param {Object} props Component properties.\n * @param {Element} props.children Children to be rendered.\n */\nexport default forwardRef( WritingFlow );\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,kBAAiB;AAKjB,kBAA0B;AAC1B,kBAAmB;AACnB,qBAA2C;AAC3C,qBAA2B;AAK3B,iCAA8B;AAC9B,yBAAsB;AACtB,2BAAwB;AACxB,kCAAkC;AAClC,4BAAyB;AACzB,gCAA6B;AAC7B,oCAAiC;AACjC,iCAA8B;AAC9B,uBAAqB;AACrB,mCAAgC;AAChC,mBAA0C;
|
|
6
|
-
"names": ["useTabNav", "blockEditorStore", "useClipboardHandler", "useInput", "useDragSelection", "useSelectionObserver", "useClickSelection", "useMultiSelection", "useSelectAll", "useArrowNav", "clsx"]
|
|
4
|
+
"sourcesContent": ["/**\n * External dependencies\n */\nimport clsx from 'clsx';\n\n/**\n * WordPress dependencies\n */\nimport { useSelect } from '@wordpress/data';\nimport { __ } from '@wordpress/i18n';\nimport { useMergeRefs, useRefEffect } from '@wordpress/compose';\nimport { forwardRef } from '@wordpress/element';\n\n/**\n * Internal dependencies\n */\nimport useEditableRoot from './use-editable-root';\nimport useHomeEnd from './use-home-end';\nimport useMultiSelection from './use-multi-selection';\nimport useTabNav from './use-tab-nav';\nimport useArrowNav from './use-arrow-nav';\nimport { usePreviewModeNav } from './use-preview-mode-nav';\nimport useSelectAll from './use-select-all';\nimport useDragSelection from './use-drag-selection';\nimport useSelectionObserver from './use-selection-observer';\nimport useEditableRootEventHandlers from './use-editable-root-event-handlers';\nimport useClickSelection from './use-click-selection';\nimport useInput from './use-input';\nimport useClipboardHandler from './use-clipboard-handler';\nimport { store as blockEditorStore } from '../../store';\n\nexport function useWritingFlow() {\n\tconst [ before, ref, after ] = useTabNav();\n\tconst hasMultiSelection = useSelect(\n\t\t( select ) => select( blockEditorStore ).hasMultiSelection(),\n\t\t[]\n\t);\n\n\treturn [\n\t\tbefore,\n\t\tuseMergeRefs( [\n\t\t\tref,\n\t\t\tuseEditableRootEventHandlers(),\n\t\t\tuseClipboardHandler(),\n\t\t\tuseInput(),\n\t\t\tuseEditableRoot(),\n\t\t\tuseHomeEnd(),\n\t\t\tuseDragSelection(),\n\t\t\tuseSelectionObserver(),\n\t\t\tuseClickSelection(),\n\t\t\tuseMultiSelection(),\n\t\t\tuseSelectAll(),\n\t\t\tuseArrowNav(),\n\t\t\tusePreviewModeNav(),\n\t\t\tuseRefEffect(\n\t\t\t\t( node ) => {\n\t\t\t\t\tnode.tabIndex = 0;\n\t\t\t\t\tnode.dataset.hasMultiSelection = hasMultiSelection;\n\n\t\t\t\t\tif ( ! hasMultiSelection ) {\n\t\t\t\t\t\treturn () => {\n\t\t\t\t\t\t\tdelete node.dataset.hasMultiSelection;\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\tnode.setAttribute(\n\t\t\t\t\t\t'aria-label',\n\t\t\t\t\t\t__( 'Multiple selected blocks' )\n\t\t\t\t\t);\n\n\t\t\t\t\treturn () => {\n\t\t\t\t\t\tdelete node.dataset.hasMultiSelection;\n\t\t\t\t\t\t// The wrapper may remain the editing host (the\n\t\t\t\t\t\t// collapsed block supports `editableRoot`): keep it\n\t\t\t\t\t\t// named, as the textbox role requires.\n\t\t\t\t\t\tif ( node.contentEditable === 'true' ) {\n\t\t\t\t\t\t\tnode.setAttribute(\n\t\t\t\t\t\t\t\t'aria-label',\n\t\t\t\t\t\t\t\t__( 'Editor canvas' )\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tnode.removeAttribute( 'aria-label' );\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t\t[ hasMultiSelection ]\n\t\t\t),\n\t\t] ),\n\t\tafter,\n\t];\n}\n\nfunction WritingFlow( { children, ...props }, forwardedRef ) {\n\tconst [ before, ref, after ] = useWritingFlow();\n\treturn (\n\t\t<>\n\t\t\t{ before }\n\t\t\t<div\n\t\t\t\t{ ...props }\n\t\t\t\tref={ useMergeRefs( [ ref, forwardedRef ] ) }\n\t\t\t\tclassName={ clsx(\n\t\t\t\t\tprops.className,\n\t\t\t\t\t'block-editor-writing-flow'\n\t\t\t\t) }\n\t\t\t>\n\t\t\t\t{ children }\n\t\t\t</div>\n\t\t\t{ after }\n\t\t</>\n\t);\n}\n\n/**\n * Handles selection and navigation across blocks. This component should be\n * wrapped around BlockList.\n *\n * @param {Object} props Component properties.\n * @param {Element} props.children Children to be rendered.\n */\nexport default forwardRef( WritingFlow );\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,kBAAiB;AAKjB,kBAA0B;AAC1B,kBAAmB;AACnB,qBAA2C;AAC3C,qBAA2B;AAK3B,+BAA4B;AAC5B,0BAAuB;AACvB,iCAA8B;AAC9B,yBAAsB;AACtB,2BAAwB;AACxB,kCAAkC;AAClC,4BAAyB;AACzB,gCAA6B;AAC7B,oCAAiC;AACjC,8CAAyC;AACzC,iCAA8B;AAC9B,uBAAqB;AACrB,mCAAgC;AAChC,mBAA0C;AAkExC;AAhEK,SAAS,iBAAiB;AAChC,QAAM,CAAE,QAAQ,KAAK,KAAM,QAAI,mBAAAA,SAAU;AACzC,QAAM,wBAAoB;AAAA,IACzB,CAAE,WAAY,OAAQ,aAAAC,KAAiB,EAAE,kBAAkB;AAAA,IAC3D,CAAC;AAAA,EACF;AAEA,SAAO;AAAA,IACN;AAAA,QACA,6BAAc;AAAA,MACb;AAAA,UACA,wCAAAC,SAA6B;AAAA,UAC7B,6BAAAC,SAAoB;AAAA,UACpB,iBAAAC,SAAS;AAAA,UACT,yBAAAC,SAAgB;AAAA,UAChB,oBAAAC,SAAW;AAAA,UACX,0BAAAC,SAAiB;AAAA,UACjB,8BAAAC,SAAqB;AAAA,UACrB,2BAAAC,SAAkB;AAAA,UAClB,2BAAAC,SAAkB;AAAA,UAClB,sBAAAC,SAAa;AAAA,UACb,qBAAAC,SAAY;AAAA,UACZ,+CAAkB;AAAA,UAClB;AAAA,QACC,CAAE,SAAU;AACX,eAAK,WAAW;AAChB,eAAK,QAAQ,oBAAoB;AAEjC,cAAK,CAAE,mBAAoB;AAC1B,mBAAO,MAAM;AACZ,qBAAO,KAAK,QAAQ;AAAA,YACrB;AAAA,UACD;AAEA,eAAK;AAAA,YACJ;AAAA,gBACA,gBAAI,0BAA2B;AAAA,UAChC;AAEA,iBAAO,MAAM;AACZ,mBAAO,KAAK,QAAQ;AAIpB,gBAAK,KAAK,oBAAoB,QAAS;AACtC,mBAAK;AAAA,gBACJ;AAAA,oBACA,gBAAI,eAAgB;AAAA,cACrB;AAAA,YACD,OAAO;AACN,mBAAK,gBAAiB,YAAa;AAAA,YACpC;AAAA,UACD;AAAA,QACD;AAAA,QACA,CAAE,iBAAkB;AAAA,MACrB;AAAA,IACD,CAAE;AAAA,IACF;AAAA,EACD;AACD;AAEA,SAAS,YAAa,EAAE,UAAU,GAAG,MAAM,GAAG,cAAe;AAC5D,QAAM,CAAE,QAAQ,KAAK,KAAM,IAAI,eAAe;AAC9C,SACC,4EACG;AAAA;AAAA,IACF;AAAA,MAAC;AAAA;AAAA,QACE,GAAG;AAAA,QACL,SAAM,6BAAc,CAAE,KAAK,YAAa,CAAE;AAAA,QAC1C,eAAY,YAAAC;AAAA,UACX,MAAM;AAAA,UACN;AAAA,QACD;AAAA,QAEE;AAAA;AAAA,IACH;AAAA,IACE;AAAA,KACH;AAEF;AASA,IAAO,2BAAQ,2BAAY,WAAY;",
|
|
6
|
+
"names": ["useTabNav", "blockEditorStore", "useEditableRootEventHandlers", "useClipboardHandler", "useInput", "useEditableRoot", "useHomeEnd", "useDragSelection", "useSelectionObserver", "useClickSelection", "useMultiSelection", "useSelectAll", "useArrowNav", "clsx"]
|
|
7
7
|
}
|
|
@@ -31,6 +31,7 @@ var import_data = require("@wordpress/data");
|
|
|
31
31
|
var import_compose = require("@wordpress/compose");
|
|
32
32
|
var import_dom2 = require("../../utils/dom.cjs");
|
|
33
33
|
var import_store = require("../../store/index.cjs");
|
|
34
|
+
var import_utils = require("./utils.cjs");
|
|
34
35
|
function isNavigationCandidate(element, keyCode, hasModifier) {
|
|
35
36
|
const isVertical = keyCode === import_keycodes.UP || keyCode === import_keycodes.DOWN;
|
|
36
37
|
const { tagName } = element;
|
|
@@ -85,7 +86,7 @@ function getClosestTabbable(target, isReverse, containerElement, onlyVertical) {
|
|
|
85
86
|
if (!import_dom.focus.tabbable.isTabbableIndex(node)) {
|
|
86
87
|
return false;
|
|
87
88
|
}
|
|
88
|
-
if (node.isContentEditable && node.contentEditable !== "true") {
|
|
89
|
+
if (node.isContentEditable && node.contentEditable !== "true" && (0, import_dom2.getBlockClientId)(node.closest('[contenteditable="true"]'))) {
|
|
89
90
|
return false;
|
|
90
91
|
}
|
|
91
92
|
if (onlyVertical) {
|
|
@@ -102,11 +103,15 @@ function useArrowNav() {
|
|
|
102
103
|
const {
|
|
103
104
|
getMultiSelectedBlocksStartClientId,
|
|
104
105
|
getMultiSelectedBlocksEndClientId,
|
|
106
|
+
getNextBlockClientId,
|
|
107
|
+
getPreviousBlockClientId,
|
|
108
|
+
getSelectedBlockClientId,
|
|
109
|
+
getSelectionStart,
|
|
105
110
|
getSettings,
|
|
106
111
|
hasMultiSelection,
|
|
107
112
|
__unstableIsFullySelected
|
|
108
113
|
} = (0, import_data.useSelect)(import_store.store);
|
|
109
|
-
const { selectBlock } = (0, import_data.useDispatch)(import_store.store);
|
|
114
|
+
const { selectBlock, multiSelect } = (0, import_data.useDispatch)(import_store.store);
|
|
110
115
|
return (0, import_compose.useRefEffect)((node) => {
|
|
111
116
|
let verticalRect;
|
|
112
117
|
function onMouseDown() {
|
|
@@ -124,7 +129,11 @@ function useArrowNav() {
|
|
|
124
129
|
if (event.defaultPrevented) {
|
|
125
130
|
return;
|
|
126
131
|
}
|
|
127
|
-
const { keyCode,
|
|
132
|
+
const { keyCode, shiftKey, ctrlKey, altKey, metaKey } = event;
|
|
133
|
+
const target = event.target === node && (0, import_dom2.getSelectionEditableElement)(
|
|
134
|
+
node.ownerDocument.defaultView.getSelection(),
|
|
135
|
+
node
|
|
136
|
+
) || event.target;
|
|
128
137
|
const isUp = keyCode === import_keycodes.UP;
|
|
129
138
|
const isDown = keyCode === import_keycodes.DOWN;
|
|
130
139
|
const isLeft = keyCode === import_keycodes.LEFT;
|
|
@@ -145,6 +154,16 @@ function useArrowNav() {
|
|
|
145
154
|
}
|
|
146
155
|
if (hasMultiSelection()) {
|
|
147
156
|
if (shiftKey) {
|
|
157
|
+
const selection = defaultView.getSelection();
|
|
158
|
+
if (__unstableIsFullySelected() && (!selection.rangeCount || selection.isCollapsed)) {
|
|
159
|
+
const anchorClientId = getMultiSelectedBlocksStartClientId();
|
|
160
|
+
const focusClientId = getMultiSelectedBlocksEndClientId();
|
|
161
|
+
const nextClientId = isReverse ? getPreviousBlockClientId(focusClientId) : getNextBlockClientId(focusClientId);
|
|
162
|
+
if (nextClientId) {
|
|
163
|
+
multiSelect(anchorClientId, nextClientId);
|
|
164
|
+
event.preventDefault();
|
|
165
|
+
}
|
|
166
|
+
}
|
|
148
167
|
return;
|
|
149
168
|
}
|
|
150
169
|
if (!__unstableIsFullySelected()) {
|
|
@@ -158,6 +177,15 @@ function useArrowNav() {
|
|
|
158
177
|
}
|
|
159
178
|
return;
|
|
160
179
|
}
|
|
180
|
+
if (shiftKey && getSelectedBlockClientId() && !getSelectionStart().attributeKey) {
|
|
181
|
+
const selectedClientId = getSelectedBlockClientId();
|
|
182
|
+
const nextClientId = isReverse ? getPreviousBlockClientId(selectedClientId) : getNextBlockClientId(selectedClientId);
|
|
183
|
+
if (nextClientId) {
|
|
184
|
+
multiSelect(selectedClientId, nextClientId);
|
|
185
|
+
event.preventDefault();
|
|
186
|
+
}
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
161
189
|
if (!isNavigationCandidate(target, keyCode, hasModifier)) {
|
|
162
190
|
return;
|
|
163
191
|
}
|
|
@@ -169,9 +197,17 @@ function useArrowNav() {
|
|
|
169
197
|
const isReverseDir = (0, import_dom.isRTL)(target) ? !isReverse : isReverse;
|
|
170
198
|
const { keepCaretInsideBlock } = getSettings();
|
|
171
199
|
if (shiftKey) {
|
|
172
|
-
if (
|
|
173
|
-
|
|
174
|
-
|
|
200
|
+
if (isNavEdge(target, isReverse)) {
|
|
201
|
+
if (isClosestTabbableABlock(target, isReverse)) {
|
|
202
|
+
(0, import_utils.setContentEditableWrapper)(node, true);
|
|
203
|
+
} else if (node.contentEditable === "true") {
|
|
204
|
+
const selection = defaultView.getSelection();
|
|
205
|
+
selection.extend(
|
|
206
|
+
target,
|
|
207
|
+
isReverse ? 0 : target.childNodes.length
|
|
208
|
+
);
|
|
209
|
+
event.preventDefault();
|
|
210
|
+
}
|
|
175
211
|
}
|
|
176
212
|
} else if (isVertical && (0, import_dom.isVerticalEdge)(target, isReverse) && // When Alt is pressed, only intercept if the caret is also at
|
|
177
213
|
// the horizontal edge.
|