@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
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
// `wp-block-image` class prefixes are used for back compat.
|
|
2
|
+
// This component was previously in the block library package.
|
|
3
|
+
.wp-block-image__crop-area {
|
|
4
|
+
position: relative;
|
|
5
|
+
max-width: 100%;
|
|
6
|
+
width: 100%;
|
|
7
|
+
overflow: hidden;
|
|
8
|
+
|
|
9
|
+
// stylelint-disable selector-class-pattern -- react-easy-crop library class names.
|
|
10
|
+
.reactEasyCrop_Container {
|
|
11
|
+
// The linked Image block has `pointer-events: none` applied. Override it
|
|
12
|
+
// here to enable the crop action.
|
|
13
|
+
pointer-events: auto;
|
|
14
|
+
|
|
15
|
+
// This removes the border from the img within the image cropper so it
|
|
16
|
+
// can be applied to the cropper itself. This then allows the image to be
|
|
17
|
+
// cropped within the visual border providing more accurate editing and
|
|
18
|
+
// smoother UX.
|
|
19
|
+
.reactEasyCrop_Image {
|
|
20
|
+
border: none;
|
|
21
|
+
border-radius: 0; // Prevent's theme.json radius bleeding into cropper.
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// stylelint-enable selector-class-pattern
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
.wp-block-image__zoom {
|
|
29
|
+
.components-popover__content {
|
|
30
|
+
min-width: 260px;
|
|
31
|
+
overflow: visible !important;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
@@ -108,7 +108,6 @@ export default function ImageSizeControl( {
|
|
|
108
108
|
onChange={ ( value ) =>
|
|
109
109
|
updateDimension( 'width', value )
|
|
110
110
|
}
|
|
111
|
-
size="__unstable-large"
|
|
112
111
|
/>
|
|
113
112
|
<NumberControl
|
|
114
113
|
label={ __( 'Height' ) }
|
|
@@ -117,7 +116,6 @@ export default function ImageSizeControl( {
|
|
|
117
116
|
onChange={ ( value ) =>
|
|
118
117
|
updateDimension( 'height', value )
|
|
119
118
|
}
|
|
120
|
-
size="__unstable-large"
|
|
121
119
|
/>
|
|
122
120
|
</HStack>
|
|
123
121
|
<ToggleGroupControl
|
|
@@ -12,6 +12,27 @@ import { unlock } from '../../../lock-unlock';
|
|
|
12
12
|
|
|
13
13
|
/** @typedef {import('../../../store/actions').InserterMediaRequest} InserterMediaRequest */
|
|
14
14
|
/** @typedef {import('../../../store/actions').InserterMediaItem} InserterMediaItem */
|
|
15
|
+
/** @typedef {import('../../../store/actions').InserterMediaResponse} InserterMediaResponse */
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Normalizes the result of a media category's `fetch`, which may be either a
|
|
19
|
+
* plain array of media items or an `InserterMediaResponse` carrying pagination
|
|
20
|
+
* totals. Sources that don't report totals leave them `undefined`, which is how
|
|
21
|
+
* the panel knows to hide the pager.
|
|
22
|
+
*
|
|
23
|
+
* @param {InserterMediaItem[]|InserterMediaResponse|undefined} result The raw `fetch` result.
|
|
24
|
+
* @return {{ mediaItems: InserterMediaItem[], totalItems: number|undefined, totalPages: number|undefined }} The normalized result.
|
|
25
|
+
*/
|
|
26
|
+
function normalizeFetchResult( result ) {
|
|
27
|
+
if ( Array.isArray( result ) ) {
|
|
28
|
+
return { mediaItems: result };
|
|
29
|
+
}
|
|
30
|
+
return {
|
|
31
|
+
mediaItems: result?.mediaItems ?? [],
|
|
32
|
+
totalItems: result?.totalItems,
|
|
33
|
+
totalPages: result?.totalPages,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
15
36
|
|
|
16
37
|
/**
|
|
17
38
|
* Fetches media items based on the provided category.
|
|
@@ -21,10 +42,11 @@ import { unlock } from '../../../lock-unlock';
|
|
|
21
42
|
* @param {InserterMediaRequest} query The query args to use for the request.
|
|
22
43
|
* @param {any} refreshKey Optional value that, when changed, forces
|
|
23
44
|
* a refetch (e.g. after attaching/detaching).
|
|
24
|
-
* @return {InserterMediaItem[]} The media results.
|
|
45
|
+
* @return {{ mediaList: InserterMediaItem[], isLoading: boolean, totalItems: number|undefined, totalPages: number|undefined }} The media results and paging totals.
|
|
25
46
|
*/
|
|
26
47
|
export function useMediaResults( category, query = {}, refreshKey ) {
|
|
27
48
|
const [ mediaList, setMediaList ] = useState();
|
|
49
|
+
const [ totals, setTotals ] = useState( {} );
|
|
28
50
|
const [ isLoading, setIsLoading ] = useState( false );
|
|
29
51
|
// We need to keep track of the last request made because
|
|
30
52
|
// multiple request can be fired without knowing the order
|
|
@@ -36,6 +58,7 @@ export function useMediaResults( category, query = {}, refreshKey ) {
|
|
|
36
58
|
const lastRequestRef = useRef();
|
|
37
59
|
const lastQueryKeyRef = useRef();
|
|
38
60
|
const lastFetchRef = useRef();
|
|
61
|
+
const lastSourceRef = useRef();
|
|
39
62
|
useEffect( () => {
|
|
40
63
|
( async () => {
|
|
41
64
|
const key = JSON.stringify( {
|
|
@@ -56,11 +79,30 @@ export function useMediaResults( category, query = {}, refreshKey ) {
|
|
|
56
79
|
) {
|
|
57
80
|
setMediaList( [] );
|
|
58
81
|
}
|
|
82
|
+
// Reset paging totals only when the source (category or its `fetch`)
|
|
83
|
+
// changes, so switching to an array-returning source doesn't leave a
|
|
84
|
+
// stale pager showing. A mere page change keeps the previous totals,
|
|
85
|
+
// which is what holds the footer mounted while the next page loads.
|
|
86
|
+
if (
|
|
87
|
+
lastSourceRef.current !== category.name ||
|
|
88
|
+
lastFetchRef.current !== category.fetch
|
|
89
|
+
) {
|
|
90
|
+
setTotals( {} );
|
|
91
|
+
}
|
|
59
92
|
lastQueryKeyRef.current = key;
|
|
60
93
|
lastFetchRef.current = category.fetch;
|
|
61
|
-
|
|
94
|
+
lastSourceRef.current = category.name;
|
|
95
|
+
// Omit the default first page so sources that forward the query to a
|
|
96
|
+
// strict external API don't receive an unexpected `page` arg.
|
|
97
|
+
const { page, ...queryWithoutPage } = query;
|
|
98
|
+
const fetchQuery = page > 1 ? query : queryWithoutPage;
|
|
99
|
+
const { mediaItems, totalItems, totalPages } = normalizeFetchResult(
|
|
100
|
+
await category.fetch?.( fetchQuery )
|
|
101
|
+
);
|
|
62
102
|
if ( request === lastRequestRef.current ) {
|
|
63
|
-
|
|
103
|
+
// Set together so the grid and the pager never disagree.
|
|
104
|
+
setMediaList( mediaItems );
|
|
105
|
+
setTotals( { totalItems, totalPages } );
|
|
64
106
|
setIsLoading( false );
|
|
65
107
|
}
|
|
66
108
|
} )();
|
|
@@ -70,7 +112,12 @@ export function useMediaResults( category, query = {}, refreshKey ) {
|
|
|
70
112
|
...Object.values( query ),
|
|
71
113
|
refreshKey,
|
|
72
114
|
] );
|
|
73
|
-
return {
|
|
115
|
+
return {
|
|
116
|
+
mediaList,
|
|
117
|
+
isLoading,
|
|
118
|
+
totalItems: totals.totalItems,
|
|
119
|
+
totalPages: totals.totalPages,
|
|
120
|
+
};
|
|
74
121
|
}
|
|
75
122
|
|
|
76
123
|
/**
|
|
@@ -144,9 +191,10 @@ export function useMediaCategories( rootClientId ) {
|
|
|
144
191
|
}
|
|
145
192
|
let results = [];
|
|
146
193
|
try {
|
|
147
|
-
|
|
148
|
-
per_page: 1
|
|
149
|
-
|
|
194
|
+
const { mediaItems } = normalizeFetchResult(
|
|
195
|
+
await category.fetch( { per_page: 1 } )
|
|
196
|
+
);
|
|
197
|
+
results = mediaItems;
|
|
150
198
|
} catch {
|
|
151
199
|
// If the request fails, we shallow the error and just don't show
|
|
152
200
|
// the category, in order to not break the media tab.
|
|
@@ -8,10 +8,18 @@ import clsx from 'clsx';
|
|
|
8
8
|
*/
|
|
9
9
|
import { Button, Modal, Spinner, SearchControl } from '@wordpress/components';
|
|
10
10
|
import { __, _n, sprintf } from '@wordpress/i18n';
|
|
11
|
-
import {
|
|
12
|
-
|
|
11
|
+
import {
|
|
12
|
+
useCallback,
|
|
13
|
+
useEffect,
|
|
14
|
+
useMemo,
|
|
15
|
+
useRef,
|
|
16
|
+
useState,
|
|
17
|
+
} from '@wordpress/element';
|
|
18
|
+
import { useDebouncedInput, usePrevious } from '@wordpress/compose';
|
|
13
19
|
import { useDispatch } from '@wordpress/data';
|
|
20
|
+
import { getScrollContainer } from '@wordpress/dom';
|
|
14
21
|
import { store as noticesStore } from '@wordpress/notices';
|
|
22
|
+
import { Stack } from '@wordpress/ui';
|
|
15
23
|
|
|
16
24
|
/**
|
|
17
25
|
* Internal dependencies
|
|
@@ -21,8 +29,9 @@ import MediaUpload from '../../media-upload';
|
|
|
21
29
|
import MediaUploadCheck from '../../media-upload/check';
|
|
22
30
|
import { useMediaResults, useDelayedLoading } from './hooks';
|
|
23
31
|
import InserterNoResults from '../no-results';
|
|
32
|
+
import BlockPatternsPaging from '../../block-patterns-paging';
|
|
24
33
|
|
|
25
|
-
const
|
|
34
|
+
const MEDIA_ITEMS_PER_PAGE = 20;
|
|
26
35
|
|
|
27
36
|
// The attach flow is image-only, so the picker is constrained to images.
|
|
28
37
|
const ATTACH_ALLOWED_TYPES = [ 'image' ];
|
|
@@ -68,21 +77,74 @@ function AttachImagesButton( { onSelect } ) {
|
|
|
68
77
|
|
|
69
78
|
export function MediaCategoryPanel( { rootClientId, onInsert, category } ) {
|
|
70
79
|
const [ search, setSearch, debouncedSearch ] = useDebouncedInput();
|
|
80
|
+
const [ page, setPage ] = useState( 1 );
|
|
81
|
+
// The desktop panel persists across category switches (it's driven by the
|
|
82
|
+
// selected category, not remounted), so reset paging whenever the source
|
|
83
|
+
// category or the search term changes. Adjusting state during render (rather
|
|
84
|
+
// than in an effect) keeps the query on page 1 for the very next fetch,
|
|
85
|
+
// avoiding a wasted request for the previous page. Mirrors `usePatternsPaging`.
|
|
86
|
+
const previousCategory = usePrevious( category.name );
|
|
87
|
+
const previousSearch = usePrevious( debouncedSearch );
|
|
88
|
+
if (
|
|
89
|
+
( previousCategory !== category.name ||
|
|
90
|
+
previousSearch !== debouncedSearch ) &&
|
|
91
|
+
page !== 1
|
|
92
|
+
) {
|
|
93
|
+
setPage( 1 );
|
|
94
|
+
}
|
|
71
95
|
const query = useMemo(
|
|
72
96
|
() => ( {
|
|
73
|
-
per_page:
|
|
97
|
+
per_page: MEDIA_ITEMS_PER_PAGE,
|
|
98
|
+
page,
|
|
74
99
|
search: debouncedSearch,
|
|
75
100
|
} ),
|
|
76
|
-
[ debouncedSearch ]
|
|
101
|
+
[ page, debouncedSearch ]
|
|
77
102
|
);
|
|
78
103
|
const [ refreshKey, setRefreshKey ] = useState( 0 );
|
|
79
|
-
const { mediaList, isLoading } = useMediaResults(
|
|
104
|
+
const { mediaList, isLoading, totalItems, totalPages } = useMediaResults(
|
|
80
105
|
category,
|
|
81
106
|
query,
|
|
82
107
|
refreshKey
|
|
83
108
|
);
|
|
109
|
+
const numPages = totalPages || 1;
|
|
110
|
+
// If the current set shrinks below the active page (e.g. detaching images
|
|
111
|
+
// empties the last page), clamp back into range so the grid isn't left blank
|
|
112
|
+
// on a page that no longer exists.
|
|
113
|
+
if ( typeof totalPages === 'number' && page > numPages ) {
|
|
114
|
+
setPage( numPages );
|
|
115
|
+
}
|
|
116
|
+
// Private to core's media categories, these capabilities act on WordPress
|
|
117
|
+
// attachments:
|
|
118
|
+
// - `attach`/`detach`/`invalidate` manage the images attached to this post.
|
|
119
|
+
// - `subscribe` watches the attachment cache backing them.
|
|
120
|
+
// An external resource can never own a post's attachments, and every category
|
|
121
|
+
// registered by an extender through the public `registerInserterMediaCategory`
|
|
122
|
+
// API is flagged as one — so this guard stops such a category from opting into
|
|
123
|
+
// the workflow just by setting these props.
|
|
124
|
+
const supportsAttachments = ! category.isExternalResource;
|
|
125
|
+
const attach = supportsAttachments ? category.attach : undefined;
|
|
126
|
+
const detach = supportsAttachments ? category.detach : undefined;
|
|
127
|
+
const subscribe = supportsAttachments ? category.subscribe : undefined;
|
|
128
|
+
|
|
129
|
+
// Only show the pager for multi-page sources. Gating on the page count (not
|
|
130
|
+
// `mediaList.length`) keeps the footer mounted while paging, since the count
|
|
131
|
+
// persists across the fetch. It also skips the shared component's stray
|
|
132
|
+
// single-page item count, which reads oddly here.
|
|
133
|
+
const showPagination = numPages > 1;
|
|
134
|
+
// The footer holds the pager and/or the attach button; it exists when either
|
|
135
|
+
// is present so it can own their shared top/horizontal breathing room.
|
|
136
|
+
const hasFooter = showPagination || !! attach;
|
|
137
|
+
const scrollContainerRef = useRef();
|
|
138
|
+
const changePage = useCallback( ( nextPage ) => {
|
|
139
|
+
const scrollContainer = getScrollContainer(
|
|
140
|
+
scrollContainerRef.current
|
|
141
|
+
);
|
|
142
|
+
scrollContainer?.scrollTo( 0, 0 );
|
|
143
|
+
setPage( nextPage );
|
|
144
|
+
}, [] );
|
|
84
145
|
const { createErrorNotice, createSuccessNotice, createWarningNotice } =
|
|
85
146
|
useDispatch( noticesStore );
|
|
147
|
+
|
|
86
148
|
// Dim (rather than blank) the populated grid while a refetch is in flight,
|
|
87
149
|
// but only once it has run long enough to be worth signalling — quick
|
|
88
150
|
// attach/detach refetches resolve before this and show nothing.
|
|
@@ -91,14 +153,27 @@ export function MediaCategoryPanel( { rootClientId, onInsert, category } ) {
|
|
|
91
153
|
// Invalidate the cached results and force `useMediaResults` to refetch so
|
|
92
154
|
// the grid reflects images that were just attached or detached.
|
|
93
155
|
const refresh = useCallback( () => {
|
|
94
|
-
|
|
156
|
+
if ( supportsAttachments ) {
|
|
157
|
+
category.invalidate?.( query );
|
|
158
|
+
}
|
|
95
159
|
setRefreshKey( ( key ) => key + 1 );
|
|
96
|
-
}, [ category, query ] );
|
|
160
|
+
}, [ category, query, supportsAttachments ] );
|
|
161
|
+
|
|
162
|
+
// A media modal opened anywhere in the editor (a canvas block, the featured
|
|
163
|
+
// image panel, the "Attach images" button) attaches its uploads to the current
|
|
164
|
+
// post, and invalidates the cached attachment queries when it closes. Refetch
|
|
165
|
+
// so the grid reflects the newly attached images.
|
|
166
|
+
useEffect( () => {
|
|
167
|
+
if ( ! subscribe ) {
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
return subscribe( () => setRefreshKey( ( key ) => key + 1 ), query );
|
|
171
|
+
}, [ subscribe, query ] );
|
|
97
172
|
|
|
98
173
|
const handleAttach = useCallback(
|
|
99
174
|
async ( selectedMedia ) => {
|
|
100
175
|
try {
|
|
101
|
-
const attachedCount = await
|
|
176
|
+
const attachedCount = await attach( selectedMedia );
|
|
102
177
|
|
|
103
178
|
if ( ! attachedCount ) {
|
|
104
179
|
// This source only attaches images (the picker's "Upload
|
|
@@ -143,6 +218,7 @@ export function MediaCategoryPanel( { rootClientId, onInsert, category } ) {
|
|
|
143
218
|
}
|
|
144
219
|
},
|
|
145
220
|
[
|
|
221
|
+
attach,
|
|
146
222
|
category,
|
|
147
223
|
refresh,
|
|
148
224
|
createErrorNotice,
|
|
@@ -154,7 +230,7 @@ export function MediaCategoryPanel( { rootClientId, onInsert, category } ) {
|
|
|
154
230
|
const handleDetach = useCallback(
|
|
155
231
|
async ( media ) => {
|
|
156
232
|
try {
|
|
157
|
-
await
|
|
233
|
+
await detach( media );
|
|
158
234
|
refresh();
|
|
159
235
|
createSuccessNotice(
|
|
160
236
|
category.postTypeLabel
|
|
@@ -173,7 +249,7 @@ export function MediaCategoryPanel( { rootClientId, onInsert, category } ) {
|
|
|
173
249
|
} );
|
|
174
250
|
}
|
|
175
251
|
},
|
|
176
|
-
[ category, refresh, createErrorNotice, createSuccessNotice ]
|
|
252
|
+
[ detach, category, refresh, createErrorNotice, createSuccessNotice ]
|
|
177
253
|
);
|
|
178
254
|
|
|
179
255
|
// Detaching is confirmed first: the dropdown sets the pending item, which
|
|
@@ -189,10 +265,11 @@ export function MediaCategoryPanel( { rootClientId, onInsert, category } ) {
|
|
|
189
265
|
const searchLabel = category.labels.search_items || __( 'Search' );
|
|
190
266
|
return (
|
|
191
267
|
<div
|
|
268
|
+
ref={ scrollContainerRef }
|
|
192
269
|
className={ clsx( baseCssClass, {
|
|
193
|
-
// The
|
|
194
|
-
//
|
|
195
|
-
'has-
|
|
270
|
+
// The footer supplies the breathing room beneath the grid, so the
|
|
271
|
+
// list drops its own bottom padding (see styles).
|
|
272
|
+
'has-footer': hasFooter,
|
|
196
273
|
} ) }
|
|
197
274
|
>
|
|
198
275
|
<SearchControl
|
|
@@ -231,18 +308,37 @@ export function MediaCategoryPanel( { rootClientId, onInsert, category } ) {
|
|
|
231
308
|
<MediaList
|
|
232
309
|
rootClientId={ rootClientId }
|
|
233
310
|
onClick={ onInsert }
|
|
234
|
-
onDetach={
|
|
235
|
-
category.detach ? setMediaPendingDetach : undefined
|
|
236
|
-
}
|
|
311
|
+
onDetach={ detach ? setMediaPendingDetach : undefined }
|
|
237
312
|
mediaList={ mediaList }
|
|
238
313
|
category={ category }
|
|
239
314
|
/>
|
|
240
315
|
</div>
|
|
241
316
|
) }
|
|
242
|
-
{
|
|
243
|
-
//
|
|
244
|
-
//
|
|
245
|
-
|
|
317
|
+
{ hasFooter && (
|
|
318
|
+
// A single footer wrapper owns the top and horizontal breathing
|
|
319
|
+
// room, so the pager and attach button don't span the full width
|
|
320
|
+
// and sit clear of the grid above (see styles).
|
|
321
|
+
<Stack
|
|
322
|
+
direction="column"
|
|
323
|
+
gap="sm"
|
|
324
|
+
className={ `${ baseCssClass }-footer` }
|
|
325
|
+
>
|
|
326
|
+
{ showPagination && (
|
|
327
|
+
// Reuse the Patterns tab pager (presentational only); only
|
|
328
|
+
// rendered for multi-page sources (see `showPagination`).
|
|
329
|
+
<BlockPatternsPaging
|
|
330
|
+
currentPage={ page }
|
|
331
|
+
numPages={ numPages }
|
|
332
|
+
changePage={ changePage }
|
|
333
|
+
totalItems={ totalItems }
|
|
334
|
+
/>
|
|
335
|
+
) }
|
|
336
|
+
{ attach && (
|
|
337
|
+
// Lines up with the "Open Media Library" button in the
|
|
338
|
+
// adjacent column.
|
|
339
|
+
<AttachImagesButton onSelect={ handleAttach } />
|
|
340
|
+
) }
|
|
341
|
+
</Stack>
|
|
246
342
|
) }
|
|
247
343
|
{ mediaPendingDetach && (
|
|
248
344
|
// A plain `Modal` (not `ConfirmDialog`) so we can pass
|
|
@@ -78,6 +78,69 @@ describe( 'useMediaResults', () => {
|
|
|
78
78
|
expect( result.current.mediaList ).toEqual( [ { id: 1 } ] );
|
|
79
79
|
} );
|
|
80
80
|
|
|
81
|
+
it( 'omits the default first page from the fetch query', async () => {
|
|
82
|
+
const category = createCategory( 'images', [ { id: 1 } ] );
|
|
83
|
+
renderHook( () =>
|
|
84
|
+
useMediaResults(
|
|
85
|
+
category,
|
|
86
|
+
{ per_page: 20, page: 1, search: '' },
|
|
87
|
+
0
|
|
88
|
+
)
|
|
89
|
+
);
|
|
90
|
+
await waitFor( () =>
|
|
91
|
+
expect( category.fetch ).toHaveBeenCalledWith( {
|
|
92
|
+
per_page: 20,
|
|
93
|
+
search: '',
|
|
94
|
+
} )
|
|
95
|
+
);
|
|
96
|
+
} );
|
|
97
|
+
|
|
98
|
+
it( 'passes `page` to the fetch query when paging past the first page', async () => {
|
|
99
|
+
const category = createCategory( 'images', [ { id: 1 } ] );
|
|
100
|
+
renderHook( () =>
|
|
101
|
+
useMediaResults(
|
|
102
|
+
category,
|
|
103
|
+
{ per_page: 20, page: 2, search: '' },
|
|
104
|
+
0
|
|
105
|
+
)
|
|
106
|
+
);
|
|
107
|
+
await waitFor( () =>
|
|
108
|
+
expect( category.fetch ).toHaveBeenCalledWith( {
|
|
109
|
+
per_page: 20,
|
|
110
|
+
page: 2,
|
|
111
|
+
search: '',
|
|
112
|
+
} )
|
|
113
|
+
);
|
|
114
|
+
} );
|
|
115
|
+
|
|
116
|
+
it( 'leaves paging totals undefined for an array-returning source', async () => {
|
|
117
|
+
const category = createCategory( 'images', [ { id: 1 } ] );
|
|
118
|
+
const { result } = renderHook( () =>
|
|
119
|
+
useMediaResults( category, { search: '' }, 0 )
|
|
120
|
+
);
|
|
121
|
+
await waitFor( () => expect( result.current.isLoading ).toBe( false ) );
|
|
122
|
+
expect( result.current.totalItems ).toBeUndefined();
|
|
123
|
+
expect( result.current.totalPages ).toBeUndefined();
|
|
124
|
+
} );
|
|
125
|
+
|
|
126
|
+
it( 'surfaces paging totals from a source that returns them', async () => {
|
|
127
|
+
const category = {
|
|
128
|
+
name: 'images',
|
|
129
|
+
fetch: jest.fn( async () => ( {
|
|
130
|
+
mediaItems: [ { id: 1 } ],
|
|
131
|
+
totalItems: 42,
|
|
132
|
+
totalPages: 3,
|
|
133
|
+
} ) ),
|
|
134
|
+
};
|
|
135
|
+
const { result } = renderHook( () =>
|
|
136
|
+
useMediaResults( category, { search: '' }, 0 )
|
|
137
|
+
);
|
|
138
|
+
await waitFor( () => expect( result.current.isLoading ).toBe( false ) );
|
|
139
|
+
expect( result.current.mediaList ).toEqual( [ { id: 1 } ] );
|
|
140
|
+
expect( result.current.totalItems ).toBe( 42 );
|
|
141
|
+
expect( result.current.totalPages ).toBe( 3 );
|
|
142
|
+
} );
|
|
143
|
+
|
|
81
144
|
it( 'clears the previous results when the query changes', async () => {
|
|
82
145
|
const category = createCategory( 'images', [ { id: 1 } ] );
|
|
83
146
|
const { result, rerender } = renderHook(
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* External dependencies
|
|
3
|
+
*/
|
|
4
|
+
import { render, screen } from '@testing-library/react';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Internal dependencies
|
|
8
|
+
*/
|
|
9
|
+
import { MediaCategoryPanel } from '../media-panel';
|
|
10
|
+
|
|
11
|
+
// Keep the panel's data + async surface out of the test: return a small,
|
|
12
|
+
// non-empty result set so the grid (and the detach affordance) render.
|
|
13
|
+
jest.mock( '../hooks', () => ( {
|
|
14
|
+
useMediaResults: () => ( {
|
|
15
|
+
mediaList: [
|
|
16
|
+
{ id: 1, title: 'Example', url: 'https://example.com/1' },
|
|
17
|
+
],
|
|
18
|
+
isLoading: false,
|
|
19
|
+
} ),
|
|
20
|
+
useDelayedLoading: () => false,
|
|
21
|
+
} ) );
|
|
22
|
+
|
|
23
|
+
// Replace `MediaList` with a marker that only reports whether it was wired for
|
|
24
|
+
// detach, so the gate can be asserted without the full preview/dropdown tree.
|
|
25
|
+
jest.mock( '../media-list', () => ( {
|
|
26
|
+
__esModule: true,
|
|
27
|
+
default: ( { onDetach } ) => (
|
|
28
|
+
<div
|
|
29
|
+
data-testid="media-list"
|
|
30
|
+
data-has-detach={ String( !! onDetach ) }
|
|
31
|
+
/>
|
|
32
|
+
),
|
|
33
|
+
} ) );
|
|
34
|
+
|
|
35
|
+
// The attach button renders through MediaUpload's render prop behind a
|
|
36
|
+
// capability check; stub both so the real Button (and its label) render.
|
|
37
|
+
jest.mock( '../../../media-upload', () => ( {
|
|
38
|
+
__esModule: true,
|
|
39
|
+
default: ( { render: renderProp } ) => renderProp( { open: () => {} } ),
|
|
40
|
+
} ) );
|
|
41
|
+
jest.mock( '../../../media-upload/check', () => ( {
|
|
42
|
+
__esModule: true,
|
|
43
|
+
default: ( { children } ) => children,
|
|
44
|
+
} ) );
|
|
45
|
+
|
|
46
|
+
const baseCategory = {
|
|
47
|
+
name: 'attached-images',
|
|
48
|
+
labels: { name: 'Attached images', search_items: 'Search attachments' },
|
|
49
|
+
mediaType: 'image',
|
|
50
|
+
fetch: jest.fn(),
|
|
51
|
+
attach: jest.fn(),
|
|
52
|
+
detach: jest.fn(),
|
|
53
|
+
invalidate: jest.fn(),
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
function renderPanel( category ) {
|
|
57
|
+
return render(
|
|
58
|
+
<MediaCategoryPanel
|
|
59
|
+
rootClientId=""
|
|
60
|
+
onInsert={ jest.fn() }
|
|
61
|
+
category={ category }
|
|
62
|
+
/>
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
describe( 'MediaCategoryPanel attach/detach gating', () => {
|
|
67
|
+
it( 'exposes attach/detach for the built-in Attachments source', () => {
|
|
68
|
+
renderPanel( baseCategory );
|
|
69
|
+
|
|
70
|
+
expect(
|
|
71
|
+
screen.getByRole( 'button', { name: 'Attach images' } )
|
|
72
|
+
).toBeInTheDocument();
|
|
73
|
+
expect( screen.getByTestId( 'media-list' ) ).toHaveAttribute(
|
|
74
|
+
'data-has-detach',
|
|
75
|
+
'true'
|
|
76
|
+
);
|
|
77
|
+
} );
|
|
78
|
+
|
|
79
|
+
it( 'ignores attach/detach when the source is an external resource', () => {
|
|
80
|
+
// Every category registered by an extender through the public
|
|
81
|
+
// `registerInserterMediaCategory` API is forced to `isExternalResource:
|
|
82
|
+
// true`, so an extender-registered source cannot opt into the workflow
|
|
83
|
+
// even if it sets `attach`/`detach`.
|
|
84
|
+
renderPanel( { ...baseCategory, isExternalResource: true } );
|
|
85
|
+
|
|
86
|
+
expect(
|
|
87
|
+
screen.queryByRole( 'button', { name: 'Attach images' } )
|
|
88
|
+
).not.toBeInTheDocument();
|
|
89
|
+
expect( screen.getByTestId( 'media-list' ) ).toHaveAttribute(
|
|
90
|
+
'data-has-detach',
|
|
91
|
+
'false'
|
|
92
|
+
);
|
|
93
|
+
} );
|
|
94
|
+
} );
|
|
95
|
+
|
|
96
|
+
describe( 'MediaCategoryPanel subscription gating', () => {
|
|
97
|
+
it( 'subscribes a local source to media changes and unsubscribes on unmount', () => {
|
|
98
|
+
const unsubscribe = jest.fn();
|
|
99
|
+
const subscribe = jest.fn( () => unsubscribe );
|
|
100
|
+
|
|
101
|
+
const { unmount } = renderPanel( { ...baseCategory, subscribe } );
|
|
102
|
+
|
|
103
|
+
// The panel hands its own query over, so the source can watch the exact
|
|
104
|
+
// results the grid is showing.
|
|
105
|
+
expect( subscribe ).toHaveBeenCalledTimes( 1 );
|
|
106
|
+
expect( subscribe ).toHaveBeenCalledWith(
|
|
107
|
+
expect.any( Function ),
|
|
108
|
+
expect.objectContaining( { per_page: expect.any( Number ) } )
|
|
109
|
+
);
|
|
110
|
+
expect( unsubscribe ).not.toHaveBeenCalled();
|
|
111
|
+
|
|
112
|
+
unmount();
|
|
113
|
+
|
|
114
|
+
expect( unsubscribe ).toHaveBeenCalledTimes( 1 );
|
|
115
|
+
} );
|
|
116
|
+
|
|
117
|
+
it( 'ignores subscribe when the source is an external resource', () => {
|
|
118
|
+
// `subscribe` is core-only, gated like `attach`/`detach`: an
|
|
119
|
+
// extender-registered source is always external, so it cannot hook into
|
|
120
|
+
// the panel's refresh cycle just by setting the prop.
|
|
121
|
+
const subscribe = jest.fn();
|
|
122
|
+
|
|
123
|
+
renderPanel( { ...baseCategory, subscribe, isExternalResource: true } );
|
|
124
|
+
|
|
125
|
+
expect( subscribe ).not.toHaveBeenCalled();
|
|
126
|
+
} );
|
|
127
|
+
} );
|
|
@@ -163,7 +163,7 @@ $block-inserter-tabs-height: 44px;
|
|
|
163
163
|
color: $gray-700;
|
|
164
164
|
text-transform: uppercase;
|
|
165
165
|
font-size: 11px;
|
|
166
|
-
font-weight:
|
|
166
|
+
font-weight: var(--wpds-typography-font-weight-emphasis);
|
|
167
167
|
}
|
|
168
168
|
|
|
169
169
|
.block-editor-inserter__panel-dropdown select.components-select-control__input.components-select-control__input.components-select-control__input {
|
|
@@ -456,7 +456,7 @@ $block-inserter-tabs-height: 44px;
|
|
|
456
456
|
}
|
|
457
457
|
|
|
458
458
|
.components-heading.block-editor-inserter__patterns-category-panel-title {
|
|
459
|
-
font-weight:
|
|
459
|
+
font-weight: var(--wpds-typography-font-weight-emphasis);
|
|
460
460
|
}
|
|
461
461
|
|
|
462
462
|
.block-editor-inserter__patterns-explore-button,
|
|
@@ -518,6 +518,19 @@ $block-inserter-tabs-height: 44px;
|
|
|
518
518
|
flex-grow: 1;
|
|
519
519
|
}
|
|
520
520
|
|
|
521
|
+
.block-editor-inserter__media-panel-footer {
|
|
522
|
+
// Keeps the footer at its natural height rather than collapsing to make
|
|
523
|
+
// room for the scrolling grid above.
|
|
524
|
+
flex-shrink: 0;
|
|
525
|
+
padding-top: $grid-unit-20;
|
|
526
|
+
padding-bottom: $grid-unit-20;
|
|
527
|
+
@include break-medium() {
|
|
528
|
+
// Align with the search field and grid gutters.
|
|
529
|
+
padding-left: $grid-unit-30;
|
|
530
|
+
padding-right: $grid-unit-30;
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
|
|
521
534
|
.block-editor-inserter__media-panel-attach {
|
|
522
535
|
// Match the padding (and so the height) of the "Open Media Library"
|
|
523
536
|
// footer button in the adjacent column, so the two line up.
|
|
@@ -525,16 +538,6 @@ $block-inserter-tabs-height: 44px;
|
|
|
525
538
|
justify-content: center;
|
|
526
539
|
padding: $grid-unit-20;
|
|
527
540
|
}
|
|
528
|
-
// Balanced breathing room above and below the footer button.
|
|
529
|
-
// `flex-shrink: 0` keeps it full height as a flex child rather than
|
|
530
|
-
// collapsing to its content.
|
|
531
|
-
flex-shrink: 0;
|
|
532
|
-
margin-top: $grid-unit-20;
|
|
533
|
-
margin-bottom: $grid-unit-20;
|
|
534
|
-
@include break-medium() {
|
|
535
|
-
margin-left: $grid-unit-30;
|
|
536
|
-
margin-right: $grid-unit-30;
|
|
537
|
-
}
|
|
538
541
|
}
|
|
539
542
|
|
|
540
543
|
.block-editor-inserter__media-panel-results {
|
|
@@ -561,10 +564,10 @@ $block-inserter-tabs-height: 44px;
|
|
|
561
564
|
}
|
|
562
565
|
}
|
|
563
566
|
|
|
564
|
-
// When the
|
|
565
|
-
//
|
|
566
|
-
//
|
|
567
|
-
&.has-
|
|
567
|
+
// When the footer is present it supplies the breathing room beneath the grid,
|
|
568
|
+
// so drop the list's own bottom padding — otherwise scrolling to the end
|
|
569
|
+
// leaves a doubled gap before the footer.
|
|
570
|
+
&.has-footer .block-editor-inserter__media-list {
|
|
568
571
|
padding-bottom: 0;
|
|
569
572
|
}
|
|
570
573
|
}
|
|
@@ -82,21 +82,6 @@
|
|
|
82
82
|
pointer-events: none;
|
|
83
83
|
}
|
|
84
84
|
}
|
|
85
|
-
|
|
86
|
-
&.is-active {
|
|
87
|
-
color: $white;
|
|
88
|
-
background: $gray-900;
|
|
89
|
-
|
|
90
|
-
// Windows High Contrast mode will show this outline, but not the box-shadow.
|
|
91
|
-
outline: 2px solid transparent;
|
|
92
|
-
outline-offset: -2px;
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
&:not(:disabled) {
|
|
97
|
-
&:focus {
|
|
98
|
-
box-shadow: inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
|
|
99
|
-
}
|
|
100
85
|
}
|
|
101
86
|
}
|
|
102
87
|
|