@wordpress/block-editor 11.2.0 → 11.3.1
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 +5 -0
- package/README.md +28 -4
- package/build/components/alignment-control/ui.js +1 -1
- package/build/components/alignment-control/ui.js.map +1 -1
- package/build/components/autocomplete/index.js +2 -7
- package/build/components/autocomplete/index.js.map +1 -1
- package/build/components/block-actions/index.js +7 -2
- package/build/components/block-actions/index.js.map +1 -1
- package/build/components/block-alignment-matrix-control/index.js +2 -2
- package/build/components/block-alignment-matrix-control/index.js.map +1 -1
- package/build/components/block-card/index.js +2 -4
- package/build/components/block-card/index.js.map +1 -1
- package/build/components/block-edit/index.js +8 -0
- package/build/components/block-edit/index.js.map +1 -1
- package/build/components/block-inspector/index.js +15 -14
- package/build/components/block-inspector/index.js.map +1 -1
- package/build/components/block-list/use-in-between-inserter.js +5 -0
- package/build/components/block-list/use-in-between-inserter.js.map +1 -1
- package/build/components/block-lock/modal.js +0 -1
- package/build/components/block-lock/modal.js.map +1 -1
- package/build/components/block-mover/mover-description.js +2 -2
- package/build/components/block-mover/mover-description.js.map +1 -1
- package/build/components/block-navigation/dropdown.js +3 -1
- package/build/components/block-navigation/dropdown.js.map +1 -1
- package/build/components/block-pattern-setup/index.js +1 -1
- package/build/components/block-pattern-setup/index.js.map +1 -1
- package/build/components/block-pattern-setup/use-patterns-setup.js +2 -2
- package/build/components/block-pattern-setup/use-patterns-setup.js.map +1 -1
- package/build/components/block-patterns-list/index.js +31 -3
- package/build/components/block-patterns-list/index.js.map +1 -1
- package/build/components/block-preview/auto.js +9 -11
- package/build/components/block-preview/auto.js.map +1 -1
- package/build/components/block-preview/index.js +32 -8
- package/build/components/block-preview/index.js.map +1 -1
- package/build/components/block-selection-clearer/index.js +1 -1
- package/build/components/block-selection-clearer/index.js.map +1 -1
- package/build/components/block-settings/container.native.js +7 -33
- package/build/components/block-settings/container.native.js.map +1 -1
- package/build/components/block-settings-menu/block-settings-dropdown.js +12 -6
- package/build/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
- package/build/components/block-settings-menu-controls/index.js +2 -8
- package/build/components/block-settings-menu-controls/index.js.map +1 -1
- package/build/components/block-switcher/utils.js +1 -1
- package/build/components/block-switcher/utils.js.map +1 -1
- package/build/components/block-tools/selected-block-popover.js +55 -47
- package/build/components/block-tools/selected-block-popover.js.map +1 -1
- package/build/components/block-vertical-alignment-control/icons.js +15 -1
- package/build/components/block-vertical-alignment-control/icons.js.map +1 -1
- package/build/components/block-vertical-alignment-control/ui.js +9 -4
- package/build/components/block-vertical-alignment-control/ui.js.map +1 -1
- package/build/components/color-style-selector/index.js +3 -1
- package/build/components/color-style-selector/index.js.map +1 -1
- package/build/components/date-format-picker/index.js +3 -4
- package/build/components/date-format-picker/index.js.map +1 -1
- package/build/components/font-family/index.js +1 -7
- package/build/components/font-family/index.js.map +1 -1
- package/build/components/font-sizes/fluid-utils.js +1 -1
- package/build/components/font-sizes/fluid-utils.js.map +1 -1
- package/build/components/font-sizes/utils.js +1 -1
- package/build/components/font-sizes/utils.js.map +1 -1
- package/build/components/global-styles/context.js +22 -0
- package/build/components/global-styles/context.js.map +1 -0
- package/build/components/global-styles/hooks.js +142 -0
- package/build/components/global-styles/hooks.js.map +1 -0
- package/build/components/global-styles/index.js +42 -0
- package/build/components/global-styles/index.js.map +1 -0
- package/build/components/global-styles/typography-utils.js +92 -0
- package/build/components/global-styles/typography-utils.js.map +1 -0
- package/build/components/global-styles/use-global-styles-output.js +974 -0
- package/build/components/global-styles/use-global-styles-output.js.map +1 -0
- package/build/components/global-styles/utils.js +340 -0
- package/build/components/global-styles/utils.js.map +1 -0
- package/build/components/height-control/index.js +13 -1
- package/build/components/height-control/index.js.map +1 -1
- package/build/components/iframe/index.js +5 -3
- package/build/components/iframe/index.js.map +1 -1
- package/build/components/image-editor/constants.js +1 -1
- package/build/components/image-editor/constants.js.map +1 -1
- package/build/components/image-editor/context.js +1 -2
- package/build/components/image-editor/context.js.map +1 -1
- package/build/components/image-editor/cropper.js +3 -1
- package/build/components/image-editor/cropper.js.map +1 -1
- package/build/components/image-editor/index.js +13 -9
- package/build/components/image-editor/index.js.map +1 -1
- package/build/components/image-editor/use-transform-image.js +11 -35
- package/build/components/image-editor/use-transform-image.js.map +1 -1
- package/build/components/image-size-control/index.js +1 -7
- package/build/components/image-size-control/index.js.map +1 -1
- package/build/components/index.js +8 -24
- package/build/components/index.js.map +1 -1
- package/build/components/inner-blocks/index.js +22 -32
- package/build/components/inner-blocks/index.js.map +1 -1
- package/build/components/inner-blocks/index.native.js +8 -23
- package/build/components/inner-blocks/index.native.js.map +1 -1
- package/build/components/inner-blocks/use-block-context.js +53 -0
- package/build/components/inner-blocks/use-block-context.js.map +1 -0
- package/build/components/inserter/block-patterns-explorer/explorer.js +0 -1
- package/build/components/inserter/block-patterns-explorer/explorer.js.map +1 -1
- package/build/components/inserter/block-patterns-tab.js +9 -2
- package/build/components/inserter/block-patterns-tab.js.map +1 -1
- package/build/components/inserter/block-types-tab.js +2 -2
- package/build/components/inserter/block-types-tab.js.map +1 -1
- package/build/components/inserter/hooks/use-patterns-state.js +1 -7
- package/build/components/inserter/hooks/use-patterns-state.js.map +1 -1
- package/build/components/inserter/index.js +5 -4
- package/build/components/inserter/index.js.map +1 -1
- package/build/components/inserter/media-tab/hooks.js +142 -56
- package/build/components/inserter/media-tab/hooks.js.map +1 -1
- package/build/components/inserter/media-tab/media-list.js +74 -21
- package/build/components/inserter/media-tab/media-list.js.map +1 -1
- package/build/components/inserter/media-tab/media-panel.js +11 -13
- package/build/components/inserter/media-tab/media-panel.js.map +1 -1
- package/build/components/inserter/media-tab/media-tab.js +6 -3
- package/build/components/inserter/media-tab/media-tab.js.map +1 -1
- package/build/components/inserter/media-tab/utils.js +26 -15
- package/build/components/inserter/media-tab/utils.js.map +1 -1
- package/build/components/inserter/menu.js +4 -0
- package/build/components/inserter/menu.js.map +1 -1
- package/build/components/inserter/preview-panel.js +5 -3
- package/build/components/inserter/preview-panel.js.map +1 -1
- package/build/components/inserter/search-results.js +2 -7
- package/build/components/inserter/search-results.js.map +1 -1
- package/build/components/inserter-list-item/index.js +1 -9
- package/build/components/inserter-list-item/index.js.map +1 -1
- package/build/components/inspector-controls/fill.js +15 -2
- package/build/components/inspector-controls/fill.js.map +1 -1
- package/build/components/inspector-controls/fill.native.js +14 -1
- package/build/components/inspector-controls/fill.native.js.map +1 -1
- package/build/components/inspector-controls/groups.js +4 -0
- package/build/components/inspector-controls/groups.js.map +1 -1
- package/build/components/inspector-controls/index.js +2 -2
- package/build/components/inspector-controls/index.js.map +1 -1
- package/build/components/inspector-controls/slot.js +14 -1
- package/build/components/inspector-controls/slot.js.map +1 -1
- package/build/components/inspector-controls/slot.native.js +14 -1
- package/build/components/inspector-controls/slot.native.js.map +1 -1
- package/build/components/inspector-controls-tabs/advanced-controls-panel.js +1 -1
- package/build/components/inspector-controls-tabs/advanced-controls-panel.js.map +1 -1
- package/build/components/inspector-controls-tabs/index.js +2 -2
- package/build/components/inspector-controls-tabs/index.js.map +1 -1
- package/build/components/inspector-controls-tabs/position-controls-panel.js +1 -1
- package/build/components/inspector-controls-tabs/position-controls-panel.js.map +1 -1
- package/build/components/inspector-controls-tabs/styles-tab.js +6 -4
- package/build/components/inspector-controls-tabs/styles-tab.js.map +1 -1
- package/build/components/inspector-controls-tabs/use-inspector-controls-tabs.js +17 -12
- package/build/components/inspector-controls-tabs/use-inspector-controls-tabs.js.map +1 -1
- package/build/components/justify-content-control/ui.js +8 -1
- package/build/components/justify-content-control/ui.js.map +1 -1
- package/build/components/link-control/index.js +45 -17
- package/build/components/link-control/index.js.map +1 -1
- package/build/components/list-view/block.js +1 -1
- package/build/components/list-view/block.js.map +1 -1
- package/build/components/list-view/use-list-view-drop-zone.js +1 -1
- package/build/components/list-view/use-list-view-drop-zone.js.map +1 -1
- package/build/components/media-upload/index.native.js +4 -1
- package/build/components/media-upload/index.native.js.map +1 -1
- package/build/components/off-canvas-editor/appender.js +50 -3
- package/build/components/off-canvas-editor/appender.js.map +1 -1
- package/build/components/off-canvas-editor/block-contents.js +3 -1
- package/build/components/off-canvas-editor/block-contents.js.map +1 -1
- package/build/components/off-canvas-editor/block-select-button.js +10 -4
- package/build/components/off-canvas-editor/block-select-button.js.map +1 -1
- package/build/components/off-canvas-editor/block.js +6 -27
- package/build/components/off-canvas-editor/block.js.map +1 -1
- package/build/components/off-canvas-editor/branch.js +25 -10
- package/build/components/off-canvas-editor/branch.js.map +1 -1
- package/build/components/off-canvas-editor/index.js +27 -20
- package/build/components/off-canvas-editor/index.js.map +1 -1
- package/build/components/off-canvas-editor/link-ui.js +2 -2
- package/build/components/off-canvas-editor/link-ui.js.map +1 -1
- package/build/components/off-canvas-editor/use-list-view-drop-zone.js +1 -1
- package/build/components/off-canvas-editor/use-list-view-drop-zone.js.map +1 -1
- package/build/components/provider/index.js +21 -9
- package/build/components/provider/index.js.map +1 -1
- package/build/components/provider/index.native.js +5 -6
- package/build/components/provider/index.native.js.map +1 -1
- package/build/components/rich-text/use-before-input-rules.js +11 -3
- package/build/components/rich-text/use-before-input-rules.js.map +1 -1
- package/build/components/rich-text/utils.js +1 -1
- package/build/components/rich-text/utils.js.map +1 -1
- package/build/components/spacing-sizes-control/utils.js +2 -8
- package/build/components/spacing-sizes-control/utils.js.map +1 -1
- package/build/components/tool-selector/index.js +3 -1
- package/build/components/tool-selector/index.js.map +1 -1
- package/build/components/url-popover/image-url-input-ui.js +7 -8
- package/build/components/url-popover/image-url-input-ui.js.map +1 -1
- package/build/components/use-block-display-information/index.js +1 -1
- package/build/components/use-block-display-information/index.js.map +1 -1
- package/build/experiments.js +45 -0
- package/build/experiments.js.map +1 -0
- package/build/experiments.native.js +40 -0
- package/build/experiments.native.js.map +1 -0
- package/build/hooks/anchor.js +2 -1
- package/build/hooks/anchor.js.map +1 -1
- package/build/hooks/border.js +1 -1
- package/build/hooks/border.js.map +1 -1
- package/build/hooks/child-layout.js +5 -1
- package/build/hooks/child-layout.js.map +1 -1
- package/build/hooks/color-panel.js +1 -1
- package/build/hooks/color-panel.js.map +1 -1
- package/build/hooks/color.js +3 -3
- package/build/hooks/color.js.map +1 -1
- package/build/hooks/custom-class-name.js +2 -1
- package/build/hooks/custom-class-name.js.map +1 -1
- package/build/hooks/dimensions.js +7 -5
- package/build/hooks/dimensions.js.map +1 -1
- package/build/hooks/margin.js +1 -0
- package/build/hooks/margin.js.map +1 -1
- package/build/hooks/padding.js +1 -0
- package/build/hooks/padding.js.map +1 -1
- package/build/hooks/position.js +39 -17
- package/build/hooks/position.js.map +1 -1
- package/build/hooks/typography.js +1 -1
- package/build/hooks/typography.js.map +1 -1
- package/build/hooks/use-color-props.js +3 -3
- package/build/hooks/use-color-props.js.map +1 -1
- package/build/hooks/utils.js +69 -3
- package/build/hooks/utils.js.map +1 -1
- package/build/index.js +10 -1
- package/build/index.js.map +1 -1
- package/build/layouts/constrained.js +3 -0
- package/build/layouts/constrained.js.map +1 -1
- package/build/layouts/flex.js +59 -9
- package/build/layouts/flex.js.map +1 -1
- package/build/layouts/flow.js +0 -18
- package/build/layouts/flow.js.map +1 -1
- package/build/store/actions.js +3 -30
- package/build/store/actions.js.map +1 -1
- package/build/store/defaults.js +5 -2
- package/build/store/defaults.js.map +1 -1
- package/build/store/index.js +11 -2
- package/build/store/index.js.map +1 -1
- package/build/store/private-actions.js +78 -0
- package/build/store/private-actions.js.map +1 -0
- package/build/store/private-selectors.js +32 -0
- package/build/store/private-selectors.js.map +1 -0
- package/build/store/reducer.js +1 -1
- package/build/store/reducer.js.map +1 -1
- package/build/store/selectors.js +60 -48
- package/build/store/selectors.js.map +1 -1
- package/build/utils/block-variation-transforms.js +1 -1
- package/build/utils/block-variation-transforms.js.map +1 -1
- package/build/utils/parse-css-unit-to-px.js +1 -1
- package/build/utils/parse-css-unit-to-px.js.map +1 -1
- package/build/utils/transform-styles/index.js +1 -7
- package/build/utils/transform-styles/index.js.map +1 -1
- package/build-module/components/alignment-control/ui.js +1 -1
- package/build-module/components/alignment-control/ui.js.map +1 -1
- package/build-module/components/autocomplete/index.js +2 -6
- package/build-module/components/autocomplete/index.js.map +1 -1
- package/build-module/components/block-actions/index.js +7 -2
- package/build-module/components/block-actions/index.js.map +1 -1
- package/build-module/components/block-alignment-matrix-control/index.js +2 -2
- package/build-module/components/block-alignment-matrix-control/index.js.map +1 -1
- package/build-module/components/block-card/index.js +2 -4
- package/build-module/components/block-card/index.js.map +1 -1
- package/build-module/components/block-edit/index.js +7 -0
- package/build-module/components/block-edit/index.js.map +1 -1
- package/build-module/components/block-inspector/index.js +15 -14
- package/build-module/components/block-inspector/index.js.map +1 -1
- package/build-module/components/block-list/use-in-between-inserter.js +5 -0
- package/build-module/components/block-list/use-in-between-inserter.js.map +1 -1
- package/build-module/components/block-lock/modal.js +0 -1
- package/build-module/components/block-lock/modal.js.map +1 -1
- package/build-module/components/block-mover/mover-description.js +2 -2
- package/build-module/components/block-mover/mover-description.js.map +1 -1
- package/build-module/components/block-navigation/dropdown.js +3 -1
- package/build-module/components/block-navigation/dropdown.js.map +1 -1
- package/build-module/components/block-pattern-setup/index.js +1 -1
- package/build-module/components/block-pattern-setup/index.js.map +1 -1
- package/build-module/components/block-pattern-setup/use-patterns-setup.js +2 -2
- package/build-module/components/block-pattern-setup/use-patterns-setup.js.map +1 -1
- package/build-module/components/block-patterns-list/index.js +32 -3
- package/build-module/components/block-patterns-list/index.js.map +1 -1
- package/build-module/components/block-preview/auto.js +9 -11
- package/build-module/components/block-preview/auto.js.map +1 -1
- package/build-module/components/block-preview/index.js +31 -8
- package/build-module/components/block-preview/index.js.map +1 -1
- package/build-module/components/block-selection-clearer/index.js +1 -1
- package/build-module/components/block-selection-clearer/index.js.map +1 -1
- package/build-module/components/block-settings/container.native.js +6 -30
- package/build-module/components/block-settings/container.native.js.map +1 -1
- package/build-module/components/block-settings-menu/block-settings-dropdown.js +12 -6
- package/build-module/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
- package/build-module/components/block-settings-menu-controls/index.js +2 -7
- package/build-module/components/block-settings-menu-controls/index.js.map +1 -1
- package/build-module/components/block-switcher/utils.js +1 -1
- package/build-module/components/block-switcher/utils.js.map +1 -1
- package/build-module/components/block-tools/selected-block-popover.js +55 -48
- package/build-module/components/block-tools/selected-block-popover.js.map +1 -1
- package/build-module/components/block-vertical-alignment-control/icons.js +12 -0
- package/build-module/components/block-vertical-alignment-control/icons.js.map +1 -1
- package/build-module/components/block-vertical-alignment-control/ui.js +10 -5
- package/build-module/components/block-vertical-alignment-control/ui.js.map +1 -1
- package/build-module/components/color-style-selector/index.js +3 -1
- package/build-module/components/color-style-selector/index.js.map +1 -1
- package/build-module/components/date-format-picker/index.js +4 -5
- package/build-module/components/date-format-picker/index.js.map +1 -1
- package/build-module/components/font-family/index.js +1 -6
- package/build-module/components/font-family/index.js.map +1 -1
- package/build-module/components/font-sizes/fluid-utils.js +1 -1
- package/build-module/components/font-sizes/fluid-utils.js.map +1 -1
- package/build-module/components/font-sizes/utils.js +1 -1
- package/build-module/components/font-sizes/utils.js.map +1 -1
- package/build-module/components/global-styles/context.js +12 -0
- package/build-module/components/global-styles/context.js.map +1 -0
- package/build-module/components/global-styles/hooks.js +121 -0
- package/build-module/components/global-styles/hooks.js.map +1 -0
- package/build-module/components/global-styles/index.js +4 -0
- package/build-module/components/global-styles/index.js.map +1 -0
- package/build-module/components/global-styles/typography-utils.js +84 -0
- package/build-module/components/global-styles/typography-utils.js.map +1 -0
- package/build-module/components/global-styles/use-global-styles-output.js +930 -0
- package/build-module/components/global-styles/use-global-styles-output.js.map +1 -0
- package/build-module/components/global-styles/utils.js +321 -0
- package/build-module/components/global-styles/utils.js.map +1 -0
- package/build-module/components/height-control/index.js +14 -1
- package/build-module/components/height-control/index.js.map +1 -1
- package/build-module/components/iframe/index.js +6 -4
- package/build-module/components/iframe/index.js.map +1 -1
- package/build-module/components/image-editor/constants.js +1 -1
- package/build-module/components/image-editor/constants.js.map +1 -1
- package/build-module/components/image-editor/context.js +1 -2
- package/build-module/components/image-editor/context.js.map +1 -1
- package/build-module/components/image-editor/cropper.js +3 -1
- package/build-module/components/image-editor/cropper.js.map +1 -1
- package/build-module/components/image-editor/index.js +13 -3
- package/build-module/components/image-editor/index.js.map +1 -1
- package/build-module/components/image-editor/use-transform-image.js +12 -37
- package/build-module/components/image-editor/use-transform-image.js.map +1 -1
- package/build-module/components/image-size-control/index.js +1 -6
- package/build-module/components/image-size-control/index.js.map +1 -1
- package/build-module/components/index.js +2 -3
- package/build-module/components/index.js.map +1 -1
- package/build-module/components/inner-blocks/index.js +21 -32
- package/build-module/components/inner-blocks/index.js.map +1 -1
- package/build-module/components/inner-blocks/index.native.js +9 -22
- package/build-module/components/inner-blocks/index.native.js.map +1 -1
- package/build-module/components/inner-blocks/use-block-context.js +43 -0
- package/build-module/components/inner-blocks/use-block-context.js.map +1 -0
- package/build-module/components/inserter/block-patterns-explorer/explorer.js +0 -1
- package/build-module/components/inserter/block-patterns-explorer/explorer.js.map +1 -1
- package/build-module/components/inserter/block-patterns-tab.js +9 -2
- package/build-module/components/inserter/block-patterns-tab.js.map +1 -1
- package/build-module/components/inserter/block-types-tab.js +3 -3
- package/build-module/components/inserter/block-types-tab.js.map +1 -1
- package/build-module/components/inserter/hooks/use-patterns-state.js +1 -6
- package/build-module/components/inserter/hooks/use-patterns-state.js.map +1 -1
- package/build-module/components/inserter/index.js +5 -4
- package/build-module/components/inserter/index.js.map +1 -1
- package/build-module/components/inserter/media-tab/hooks.js +145 -56
- package/build-module/components/inserter/media-tab/hooks.js.map +1 -1
- package/build-module/components/inserter/media-tab/media-list.js +74 -24
- package/build-module/components/inserter/media-tab/media-list.js.map +1 -1
- package/build-module/components/inserter/media-tab/media-panel.js +14 -14
- package/build-module/components/inserter/media-tab/media-panel.js.map +1 -1
- package/build-module/components/inserter/media-tab/media-tab.js +7 -4
- package/build-module/components/inserter/media-tab/media-tab.js.map +1 -1
- package/build-module/components/inserter/media-tab/utils.js +27 -15
- package/build-module/components/inserter/media-tab/utils.js.map +1 -1
- package/build-module/components/inserter/menu.js +4 -0
- package/build-module/components/inserter/menu.js.map +1 -1
- package/build-module/components/inserter/preview-panel.js +5 -3
- package/build-module/components/inserter/preview-panel.js.map +1 -1
- package/build-module/components/inserter/search-results.js +2 -6
- package/build-module/components/inserter/search-results.js.map +1 -1
- package/build-module/components/inserter-list-item/index.js +1 -9
- package/build-module/components/inserter-list-item/index.js.map +1 -1
- package/build-module/components/inspector-controls/fill.js +14 -2
- package/build-module/components/inspector-controls/fill.js.map +1 -1
- package/build-module/components/inspector-controls/fill.native.js +13 -1
- package/build-module/components/inspector-controls/fill.native.js.map +1 -1
- package/build-module/components/inspector-controls/groups.js +4 -0
- package/build-module/components/inspector-controls/groups.js.map +1 -1
- package/build-module/components/inspector-controls/index.js +2 -2
- package/build-module/components/inspector-controls/index.js.map +1 -1
- package/build-module/components/inspector-controls/slot.js +13 -1
- package/build-module/components/inspector-controls/slot.js.map +1 -1
- package/build-module/components/inspector-controls/slot.native.js +13 -1
- package/build-module/components/inspector-controls/slot.native.js.map +1 -1
- package/build-module/components/inspector-controls-tabs/advanced-controls-panel.js +1 -1
- package/build-module/components/inspector-controls-tabs/advanced-controls-panel.js.map +1 -1
- package/build-module/components/inspector-controls-tabs/index.js +2 -2
- package/build-module/components/inspector-controls-tabs/index.js.map +1 -1
- package/build-module/components/inspector-controls-tabs/position-controls-panel.js +1 -1
- package/build-module/components/inspector-controls-tabs/position-controls-panel.js.map +1 -1
- package/build-module/components/inspector-controls-tabs/styles-tab.js +6 -4
- package/build-module/components/inspector-controls-tabs/styles-tab.js.map +1 -1
- package/build-module/components/inspector-controls-tabs/use-inspector-controls-tabs.js +17 -12
- package/build-module/components/inspector-controls-tabs/use-inspector-controls-tabs.js.map +1 -1
- package/build-module/components/justify-content-control/ui.js +9 -2
- package/build-module/components/justify-content-control/ui.js.map +1 -1
- package/build-module/components/link-control/index.js +45 -16
- package/build-module/components/link-control/index.js.map +1 -1
- package/build-module/components/list-view/block.js +1 -1
- package/build-module/components/list-view/block.js.map +1 -1
- package/build-module/components/list-view/use-list-view-drop-zone.js +1 -1
- package/build-module/components/list-view/use-list-view-drop-zone.js.map +1 -1
- package/build-module/components/media-upload/index.native.js +4 -1
- package/build-module/components/media-upload/index.native.js.map +1 -1
- package/build-module/components/off-canvas-editor/appender.js +47 -4
- package/build-module/components/off-canvas-editor/appender.js.map +1 -1
- package/build-module/components/off-canvas-editor/block-contents.js +2 -1
- package/build-module/components/off-canvas-editor/block-contents.js.map +1 -1
- package/build-module/components/off-canvas-editor/block-select-button.js +9 -4
- package/build-module/components/off-canvas-editor/block-select-button.js.map +1 -1
- package/build-module/components/off-canvas-editor/block.js +6 -25
- package/build-module/components/off-canvas-editor/block.js.map +1 -1
- package/build-module/components/off-canvas-editor/branch.js +23 -11
- package/build-module/components/off-canvas-editor/branch.js.map +1 -1
- package/build-module/components/off-canvas-editor/index.js +27 -19
- package/build-module/components/off-canvas-editor/index.js.map +1 -1
- package/build-module/components/off-canvas-editor/link-ui.js +2 -2
- package/build-module/components/off-canvas-editor/link-ui.js.map +1 -1
- package/build-module/components/off-canvas-editor/use-list-view-drop-zone.js +1 -1
- package/build-module/components/off-canvas-editor/use-list-view-drop-zone.js.map +1 -1
- package/build-module/components/provider/index.js +16 -9
- package/build-module/components/provider/index.js.map +1 -1
- package/build-module/components/provider/index.native.js +4 -4
- package/build-module/components/provider/index.native.js.map +1 -1
- package/build-module/components/rich-text/use-before-input-rules.js +10 -2
- package/build-module/components/rich-text/use-before-input-rules.js.map +1 -1
- package/build-module/components/rich-text/utils.js +1 -1
- package/build-module/components/rich-text/utils.js.map +1 -1
- package/build-module/components/spacing-sizes-control/utils.js +2 -7
- package/build-module/components/spacing-sizes-control/utils.js.map +1 -1
- package/build-module/components/tool-selector/index.js +3 -1
- package/build-module/components/tool-selector/index.js.map +1 -1
- package/build-module/components/url-popover/image-url-input-ui.js +8 -8
- package/build-module/components/url-popover/image-url-input-ui.js.map +1 -1
- package/build-module/components/use-block-display-information/index.js +1 -1
- package/build-module/components/use-block-display-information/index.js.map +1 -1
- package/build-module/experiments.js +25 -0
- package/build-module/experiments.js.map +1 -0
- package/build-module/experiments.native.js +23 -0
- package/build-module/experiments.native.js.map +1 -0
- package/build-module/hooks/anchor.js +2 -1
- package/build-module/hooks/anchor.js.map +1 -1
- package/build-module/hooks/border.js +1 -1
- package/build-module/hooks/border.js.map +1 -1
- package/build-module/hooks/child-layout.js +5 -1
- package/build-module/hooks/child-layout.js.map +1 -1
- package/build-module/hooks/color-panel.js +1 -1
- package/build-module/hooks/color-panel.js.map +1 -1
- package/build-module/hooks/color.js +3 -3
- package/build-module/hooks/color.js.map +1 -1
- package/build-module/hooks/custom-class-name.js +2 -1
- package/build-module/hooks/custom-class-name.js.map +1 -1
- package/build-module/hooks/dimensions.js +6 -5
- package/build-module/hooks/dimensions.js.map +1 -1
- package/build-module/hooks/margin.js +1 -0
- package/build-module/hooks/margin.js.map +1 -1
- package/build-module/hooks/padding.js +1 -0
- package/build-module/hooks/padding.js.map +1 -1
- package/build-module/hooks/position.js +36 -16
- package/build-module/hooks/position.js.map +1 -1
- package/build-module/hooks/typography.js +1 -1
- package/build-module/hooks/typography.js.map +1 -1
- package/build-module/hooks/use-color-props.js +3 -3
- package/build-module/hooks/use-color-props.js.map +1 -1
- package/build-module/hooks/utils.js +70 -4
- package/build-module/hooks/utils.js.map +1 -1
- package/build-module/index.js +1 -0
- package/build-module/index.js.map +1 -1
- package/build-module/layouts/constrained.js +3 -0
- package/build-module/layouts/constrained.js.map +1 -1
- package/build-module/layouts/flex.js +60 -10
- package/build-module/layouts/flex.js.map +1 -1
- package/build-module/layouts/flow.js +0 -18
- package/build-module/layouts/flow.js.map +1 -1
- package/build-module/store/actions.js +2 -26
- package/build-module/store/actions.js.map +1 -1
- package/build-module/store/defaults.js +5 -2
- package/build-module/store/defaults.js.map +1 -1
- package/build-module/store/index.js +8 -2
- package/build-module/store/index.js.map +1 -1
- package/build-module/store/private-actions.js +66 -0
- package/build-module/store/private-actions.js.map +1 -0
- package/build-module/store/private-selectors.js +23 -0
- package/build-module/store/private-selectors.js.map +1 -0
- package/build-module/store/reducer.js +1 -1
- package/build-module/store/reducer.js.map +1 -1
- package/build-module/store/selectors.js +48 -37
- package/build-module/store/selectors.js.map +1 -1
- package/build-module/utils/block-variation-transforms.js +1 -1
- package/build-module/utils/block-variation-transforms.js.map +1 -1
- package/build-module/utils/parse-css-unit-to-px.js +1 -1
- package/build-module/utils/parse-css-unit-to-px.js.map +1 -1
- package/build-module/utils/transform-styles/index.js +1 -6
- package/build-module/utils/transform-styles/index.js.map +1 -1
- package/build-style/content-rtl.css +283 -3
- package/build-style/content.css +283 -3
- package/build-style/style-rtl.css +105 -221
- package/build-style/style.css +105 -221
- package/package.json +30 -29
- package/src/components/alignment-control/test/__snapshots__/index.js.snap +3 -3
- package/src/components/alignment-control/test/index.js +5 -15
- package/src/components/alignment-control/ui.js +1 -1
- package/src/components/autocomplete/index.js +3 -6
- package/src/components/block-actions/index.js +9 -0
- package/src/components/block-alignment-control/test/index.js +3 -11
- package/src/components/block-alignment-matrix-control/index.js +1 -2
- package/src/components/block-card/index.js +1 -4
- package/src/components/block-content-overlay/content.scss +4 -4
- package/src/components/block-edit/index.js +15 -1
- package/src/components/block-icon/content.scss +31 -0
- package/src/components/block-inspector/index.js +13 -17
- package/src/components/block-list/use-in-between-inserter.js +5 -0
- package/src/components/block-lock/modal.js +0 -1
- package/src/components/block-mover/mover-description.js +2 -2
- package/src/components/block-mover/stories/index.js +3 -3
- package/src/components/block-navigation/dropdown.js +1 -1
- package/src/components/block-pattern-setup/index.js +1 -4
- package/src/components/block-pattern-setup/use-patterns-setup.js +2 -5
- package/src/components/block-patterns-list/index.js +29 -3
- package/src/components/block-preview/README.md +9 -9
- package/src/components/block-preview/auto.js +9 -11
- package/src/components/block-preview/content.scss +23 -0
- package/src/components/block-preview/index.js +40 -10
- package/src/components/block-preview/style.scss +0 -23
- package/src/components/block-selection-clearer/index.js +1 -1
- package/src/components/block-selection-clearer/test/index.js +6 -6
- package/src/components/block-settings/container.native.js +7 -26
- package/src/components/block-settings-menu/block-settings-dropdown.js +13 -5
- package/src/components/block-settings-menu-controls/index.js +2 -10
- package/src/components/block-switcher/test/index.js +43 -44
- package/src/components/block-switcher/utils.js +1 -1
- package/src/components/block-tools/selected-block-popover.js +77 -80
- package/src/components/block-tools/style.scss +0 -1
- package/src/components/block-variation-picker/{style.scss → content.scss} +0 -0
- package/src/components/block-vertical-alignment-control/icons.js +12 -0
- package/src/components/block-vertical-alignment-control/test/index.js +3 -11
- package/src/components/block-vertical-alignment-control/ui.js +16 -6
- package/src/components/color-style-selector/index.js +1 -1
- package/src/components/colors/test/with-colors.js +2 -8
- package/src/components/date-format-picker/index.js +23 -24
- package/src/components/date-format-picker/style.scss +0 -6
- package/src/components/default-block-appender/content.scss +18 -0
- package/src/components/default-block-appender/test/index.js +2 -8
- package/src/components/font-family/index.js +1 -6
- package/src/components/font-sizes/fluid-utils.js +1 -1
- package/src/components/font-sizes/utils.js +1 -1
- package/src/components/global-styles/README.md +77 -0
- package/src/components/global-styles/context.js +15 -0
- package/src/components/global-styles/hooks.js +145 -0
- package/src/components/global-styles/index.js +7 -0
- package/src/components/global-styles/test/typography-utils.js +393 -0
- package/src/components/global-styles/test/use-global-styles-output.js +814 -0
- package/src/components/global-styles/test/utils.js +206 -0
- package/src/components/global-styles/typography-utils.js +87 -0
- package/src/components/global-styles/use-global-styles-output.js +1088 -0
- package/src/components/global-styles/utils.js +373 -0
- package/src/components/height-control/README.md +55 -0
- package/src/components/height-control/index.js +13 -1
- package/src/components/iframe/index.js +8 -2
- package/src/components/image-editor/constants.js +1 -1
- package/src/components/image-editor/context.js +5 -9
- package/src/components/image-editor/cropper.js +3 -1
- package/src/components/image-editor/index.js +13 -4
- package/src/components/image-editor/use-transform-image.js +14 -55
- package/src/components/image-size-control/index.js +1 -6
- package/src/components/index.js +2 -6
- package/src/components/inner-blocks/index.js +29 -33
- package/src/components/inner-blocks/index.native.js +27 -47
- package/src/components/inner-blocks/use-block-context.js +47 -0
- package/src/components/inserter/block-patterns-explorer/explorer.js +0 -1
- package/src/components/inserter/block-patterns-tab.js +9 -1
- package/src/components/inserter/block-types-tab.js +3 -4
- package/src/components/inserter/hooks/use-patterns-state.js +1 -6
- package/src/components/inserter/index.js +3 -4
- package/src/components/inserter/media-tab/hooks.js +167 -65
- package/src/components/inserter/media-tab/media-list.js +94 -26
- package/src/components/inserter/media-tab/media-panel.js +9 -20
- package/src/components/inserter/media-tab/media-tab.js +12 -4
- package/src/components/inserter/media-tab/utils.js +20 -10
- package/src/components/inserter/menu.js +8 -0
- package/src/components/inserter/preview-panel.js +4 -2
- package/src/components/inserter/search-results.js +2 -6
- package/src/components/inserter/stories/index.js +9 -9
- package/src/components/inserter/style.scss +58 -11
- package/src/components/inserter-list-item/index.js +0 -7
- package/src/components/inspector-controls/README.md +3 -7
- package/src/components/inspector-controls/fill.js +15 -1
- package/src/components/inspector-controls/fill.native.js +14 -1
- package/src/components/inspector-controls/groups.js +3 -0
- package/src/components/inspector-controls/index.js +2 -6
- package/src/components/inspector-controls/slot.js +14 -1
- package/src/components/inspector-controls/slot.native.js +14 -1
- package/src/components/inspector-controls-tabs/advanced-controls-panel.js +1 -1
- package/src/components/inspector-controls-tabs/index.js +2 -4
- package/src/components/inspector-controls-tabs/position-controls-panel.js +1 -1
- package/src/components/inspector-controls-tabs/styles-tab.js +5 -7
- package/src/components/inspector-controls-tabs/use-inspector-controls-tabs.js +21 -10
- package/src/components/justify-content-control/ui.js +9 -0
- package/src/components/link-control/index.js +59 -23
- package/src/components/link-control/style.scss +7 -24
- package/src/components/link-control/test/index.js +134 -5
- package/src/components/list-view/block.js +1 -1
- package/src/components/list-view/use-list-view-drop-zone.js +1 -1
- package/src/components/media-replace-flow/test/index.js +4 -12
- package/src/components/media-upload/index.native.js +2 -2
- package/src/components/off-canvas-editor/README.md +2 -2
- package/src/components/off-canvas-editor/appender.js +93 -37
- package/src/components/off-canvas-editor/block-contents.js +2 -1
- package/src/components/off-canvas-editor/block-select-button.js +12 -1
- package/src/components/off-canvas-editor/block.js +3 -42
- package/src/components/off-canvas-editor/branch.js +32 -5
- package/src/components/off-canvas-editor/index.js +20 -20
- package/src/components/off-canvas-editor/link-ui.js +2 -2
- package/src/components/off-canvas-editor/style.scss +5 -1
- package/src/components/off-canvas-editor/use-list-view-drop-zone.js +1 -1
- package/src/components/provider/index.js +33 -14
- package/src/components/provider/index.native.js +4 -3
- package/src/components/provider/test/experimental-provider.js +94 -0
- package/src/components/provider/test/use-block-sync.js +10 -0
- package/src/components/responsive-block-control/test/index.js +1 -5
- package/src/components/rich-text/use-before-input-rules.js +10 -2
- package/src/components/rich-text/utils.js +1 -1
- package/src/components/spacing-sizes-control/utils.js +2 -7
- package/src/components/tool-selector/index.js +1 -1
- package/src/components/url-input/test/button.js +24 -24
- package/src/components/url-popover/image-url-input-ui.js +7 -8
- package/src/components/url-popover/style.scss +0 -10
- package/src/components/use-block-display-information/index.js +1 -1
- package/src/components/warning/{style.scss → content.scss} +0 -0
- package/src/components/warning/test/index.js +1 -5
- package/src/content.scss +7 -0
- package/src/experiments.js +27 -0
- package/src/experiments.native.js +25 -0
- package/src/hooks/anchor.js +2 -1
- package/src/hooks/border.js +1 -1
- package/src/hooks/child-layout.js +6 -1
- package/src/hooks/color-panel.js +1 -1
- package/src/hooks/color.js +3 -3
- package/src/hooks/custom-class-name.js +2 -1
- package/src/hooks/dimensions.js +6 -6
- package/src/hooks/layout.scss +4 -0
- package/src/hooks/margin.js +1 -0
- package/src/hooks/padding.js +1 -0
- package/src/hooks/position.js +56 -36
- package/src/hooks/test/align.native.js +1 -1
- package/src/hooks/test/utils.js +104 -0
- package/src/hooks/typography.js +1 -1
- package/src/hooks/use-color-props.js +3 -3
- package/src/hooks/utils.js +68 -2
- package/src/index.js +1 -0
- package/src/layouts/constrained.js +3 -0
- package/src/layouts/flex.js +66 -14
- package/src/layouts/flow.js +0 -9
- package/src/store/actions.js +2 -26
- package/src/store/defaults.js +7 -2
- package/src/store/index.js +8 -2
- package/src/store/private-actions.js +65 -0
- package/src/store/private-selectors.js +20 -0
- package/src/store/reducer.js +1 -1
- package/src/store/selectors.js +103 -62
- package/src/store/test/actions.js +0 -18
- package/src/store/test/private-actions.js +22 -0
- package/src/store/test/private-selectors.js +52 -0
- package/src/store/test/selectors.js +52 -54
- package/src/style.scss +3 -5
- package/src/utils/block-variation-transforms.js +1 -1
- package/src/utils/parse-css-unit-to-px.js +3 -1
- package/src/utils/test/parse-css-unit-to-px.js +16 -24
- package/src/utils/transform-styles/index.js +1 -6
- package/build/components/inner-blocks/get-block-context.js +0 -45
- package/build/components/inner-blocks/get-block-context.js.map +0 -1
- package/build/components/off-canvas-editor/block-edit-button.js +0 -50
- package/build/components/off-canvas-editor/block-edit-button.js.map +0 -1
- package/build-module/components/inner-blocks/get-block-context.js +0 -37
- package/build-module/components/inner-blocks/get-block-context.js.map +0 -1
- package/build-module/components/off-canvas-editor/block-edit-button.js +0 -35
- package/build-module/components/off-canvas-editor/block-edit-button.js.map +0 -1
- package/src/components/inner-blocks/get-block-context.js +0 -39
- package/src/components/off-canvas-editor/block-edit-button.js +0 -27
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* WordPress dependencies
|
|
3
3
|
*/
|
|
4
|
-
import {
|
|
5
|
-
import { useEffect, useState } from '@wordpress/element';
|
|
4
|
+
import { useEffect, useState, useRef, useMemo } from '@wordpress/element';
|
|
6
5
|
import { useSelect } from '@wordpress/data';
|
|
7
6
|
|
|
8
7
|
/**
|
|
@@ -10,80 +9,183 @@ import { useSelect } from '@wordpress/data';
|
|
|
10
9
|
*/
|
|
11
10
|
import { store as blockEditorStore } from '../../../store';
|
|
12
11
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
12
|
+
/**
|
|
13
|
+
* Interface for inserter media requests.
|
|
14
|
+
*
|
|
15
|
+
* @typedef {Object} InserterMediaRequest
|
|
16
|
+
* @property {number} per_page How many items to fetch per page.
|
|
17
|
+
* @property {string} search The search term to use for filtering the results.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Interface for inserter media responses. Any media resource should
|
|
22
|
+
* map their response to this interface, in order to create the core
|
|
23
|
+
* WordPress media blocks (image, video, audio).
|
|
24
|
+
*
|
|
25
|
+
* @typedef {Object} InserterMediaItem
|
|
26
|
+
* @property {string} title The title of the media item.
|
|
27
|
+
* @property {string} url The source url of the media item.
|
|
28
|
+
* @property {string} [previewUrl] The preview source url of the media item to display in the media list.
|
|
29
|
+
* @property {number} [id] The WordPress id of the media item.
|
|
30
|
+
* @property {number|string} [sourceId] The id of the media item from external source.
|
|
31
|
+
* @property {string} [alt] The alt text of the media item.
|
|
32
|
+
* @property {string} [caption] The caption of the media item.
|
|
33
|
+
*/
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Fetches media items based on the provided category.
|
|
37
|
+
* Each media category is responsible for providing a `fetch` function.
|
|
38
|
+
*
|
|
39
|
+
* @param {Object} category The media category to fetch results for.
|
|
40
|
+
* @param {InserterMediaRequest} query The query args to use for the request.
|
|
41
|
+
* @return {InserterMediaItem[]} The media results.
|
|
42
|
+
*/
|
|
43
|
+
export function useMediaResults( category, query = {} ) {
|
|
44
|
+
const [ mediaList, setMediaList ] = useState();
|
|
45
|
+
const [ isLoading, setIsLoading ] = useState( false );
|
|
46
|
+
// We need to keep track of the last request made because
|
|
47
|
+
// multiple request can be fired without knowing the order
|
|
48
|
+
// of resolution, and we need to ensure we are showing
|
|
49
|
+
// the results of the last request.
|
|
50
|
+
// In the future we could use AbortController to cancel previous
|
|
51
|
+
// requests, but we don't for now as it involves adding support
|
|
52
|
+
// for this to `core-data` package.
|
|
53
|
+
const lastRequest = useRef();
|
|
19
54
|
useEffect( () => {
|
|
20
55
|
( async () => {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
56
|
+
const key = JSON.stringify( {
|
|
57
|
+
category: category.name,
|
|
58
|
+
...query,
|
|
59
|
+
} );
|
|
60
|
+
lastRequest.current = key;
|
|
61
|
+
setIsLoading( true );
|
|
62
|
+
setMediaList( [] ); // Empty the previous results.
|
|
63
|
+
const _media = await category.fetch?.( query );
|
|
64
|
+
if ( key === lastRequest.current ) {
|
|
65
|
+
setMediaList( _media );
|
|
66
|
+
setIsLoading( false );
|
|
67
|
+
}
|
|
24
68
|
} )();
|
|
25
|
-
}, Object.values(
|
|
26
|
-
return
|
|
69
|
+
}, [ category.name, ...Object.values( query ) ] );
|
|
70
|
+
return { mediaList, isLoading };
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function useInserterMediaCategories() {
|
|
74
|
+
const {
|
|
75
|
+
inserterMediaCategories,
|
|
76
|
+
allowedMimeTypes,
|
|
77
|
+
enableOpenverseMediaCategory,
|
|
78
|
+
} = useSelect( ( select ) => {
|
|
79
|
+
const settings = select( blockEditorStore ).getSettings();
|
|
80
|
+
return {
|
|
81
|
+
inserterMediaCategories: settings.inserterMediaCategories,
|
|
82
|
+
allowedMimeTypes: settings.allowedMimeTypes,
|
|
83
|
+
enableOpenverseMediaCategory: settings.enableOpenverseMediaCategory,
|
|
84
|
+
};
|
|
85
|
+
}, [] );
|
|
86
|
+
// The allowed `mime_types` can be altered by `upload_mimes` filter and restrict
|
|
87
|
+
// some of them. In this case we shouldn't add the category to the available media
|
|
88
|
+
// categories list in the inserter.
|
|
89
|
+
const allowedCategories = useMemo( () => {
|
|
90
|
+
if ( ! inserterMediaCategories || ! allowedMimeTypes ) {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
return inserterMediaCategories.filter( ( category ) => {
|
|
94
|
+
// Check if Openverse category is enabled.
|
|
95
|
+
if (
|
|
96
|
+
! enableOpenverseMediaCategory &&
|
|
97
|
+
category.name === 'openverse'
|
|
98
|
+
) {
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
// When a category has set `isExternalResource` to `true`, we
|
|
102
|
+
// don't need to check for allowed mime types, as they are used
|
|
103
|
+
// for restricting uploads for this media type and not for
|
|
104
|
+
// inserting media from external sources.
|
|
105
|
+
if ( category.isExternalResource ) {
|
|
106
|
+
return true;
|
|
107
|
+
}
|
|
108
|
+
return Object.values( allowedMimeTypes ).some( ( mimeType ) =>
|
|
109
|
+
mimeType.startsWith( `${ category.mediaType }/` )
|
|
110
|
+
);
|
|
111
|
+
} );
|
|
112
|
+
}, [
|
|
113
|
+
inserterMediaCategories,
|
|
114
|
+
allowedMimeTypes,
|
|
115
|
+
enableOpenverseMediaCategory,
|
|
116
|
+
] );
|
|
117
|
+
return allowedCategories;
|
|
27
118
|
}
|
|
28
119
|
|
|
29
|
-
const MEDIA_CATEGORIES = [
|
|
30
|
-
{ label: __( 'Images' ), name: 'images', mediaType: 'image' },
|
|
31
|
-
{ label: __( 'Videos' ), name: 'videos', mediaType: 'video' },
|
|
32
|
-
{ label: __( 'Audio' ), name: 'audio', mediaType: 'audio' },
|
|
33
|
-
];
|
|
34
120
|
export function useMediaCategories( rootClientId ) {
|
|
35
121
|
const [ categories, setCategories ] = useState( [] );
|
|
36
|
-
const { canInsertImage, canInsertVideo, canInsertAudio
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
[ rootClientId ]
|
|
58
|
-
);
|
|
122
|
+
const { canInsertImage, canInsertVideo, canInsertAudio } = useSelect(
|
|
123
|
+
( select ) => {
|
|
124
|
+
const { canInsertBlockType } = select( blockEditorStore );
|
|
125
|
+
return {
|
|
126
|
+
canInsertImage: canInsertBlockType(
|
|
127
|
+
'core/image',
|
|
128
|
+
rootClientId
|
|
129
|
+
),
|
|
130
|
+
canInsertVideo: canInsertBlockType(
|
|
131
|
+
'core/video',
|
|
132
|
+
rootClientId
|
|
133
|
+
),
|
|
134
|
+
canInsertAudio: canInsertBlockType(
|
|
135
|
+
'core/audio',
|
|
136
|
+
rootClientId
|
|
137
|
+
),
|
|
138
|
+
};
|
|
139
|
+
},
|
|
140
|
+
[ rootClientId ]
|
|
141
|
+
);
|
|
142
|
+
const inserterMediaCategories = useInserterMediaCategories();
|
|
59
143
|
useEffect( () => {
|
|
60
144
|
( async () => {
|
|
61
|
-
|
|
62
|
-
//
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
setCategories(
|
|
79
|
-
MEDIA_CATEGORIES.filter(
|
|
80
|
-
( { mediaType } ) =>
|
|
81
|
-
( mediaType === 'image' && showImage ) ||
|
|
82
|
-
( mediaType === 'video' && showVideo ) ||
|
|
83
|
-
( mediaType === 'audio' && showAudio )
|
|
145
|
+
const _categories = [];
|
|
146
|
+
// If `inserterMediaCategories` is not defined in
|
|
147
|
+
// block editor settings, do not show any media categories.
|
|
148
|
+
if ( ! inserterMediaCategories ) {
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
// Loop through categories to check if they have at least one media item.
|
|
152
|
+
const categoriesHaveMedia = new Map(
|
|
153
|
+
await Promise.all(
|
|
154
|
+
inserterMediaCategories.map( async ( category ) => {
|
|
155
|
+
// Some sources are external and we don't need to make a request.
|
|
156
|
+
if ( category.isExternalResource ) {
|
|
157
|
+
return [ category.name, true ];
|
|
158
|
+
}
|
|
159
|
+
const results = await category.fetch( { per_page: 1 } );
|
|
160
|
+
return [ category.name, !! results.length ];
|
|
161
|
+
} )
|
|
84
162
|
)
|
|
85
163
|
);
|
|
164
|
+
// We need to filter out categories that don't have any media items or
|
|
165
|
+
// whose corresponding block type is not allowed to be inserted, based
|
|
166
|
+
// on the category's `mediaType`.
|
|
167
|
+
const canInsertMediaType = {
|
|
168
|
+
image: canInsertImage,
|
|
169
|
+
video: canInsertVideo,
|
|
170
|
+
audio: canInsertAudio,
|
|
171
|
+
};
|
|
172
|
+
inserterMediaCategories.forEach( ( category ) => {
|
|
173
|
+
if (
|
|
174
|
+
canInsertMediaType[ category.mediaType ] &&
|
|
175
|
+
categoriesHaveMedia.get( category.name )
|
|
176
|
+
) {
|
|
177
|
+
_categories.push( category );
|
|
178
|
+
}
|
|
179
|
+
} );
|
|
180
|
+
if ( !! _categories.length ) {
|
|
181
|
+
setCategories( _categories );
|
|
182
|
+
}
|
|
86
183
|
} )();
|
|
87
|
-
}, [
|
|
184
|
+
}, [
|
|
185
|
+
canInsertImage,
|
|
186
|
+
canInsertVideo,
|
|
187
|
+
canInsertAudio,
|
|
188
|
+
inserterMediaCategories,
|
|
189
|
+
] );
|
|
88
190
|
return categories;
|
|
89
191
|
}
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* External dependencies
|
|
3
|
+
*/
|
|
4
|
+
import classnames from 'classnames';
|
|
5
|
+
|
|
1
6
|
/**
|
|
2
7
|
* WordPress dependencies
|
|
3
8
|
*/
|
|
@@ -6,10 +11,14 @@ import {
|
|
|
6
11
|
__unstableUseCompositeState as useCompositeState,
|
|
7
12
|
__unstableCompositeItem as CompositeItem,
|
|
8
13
|
Tooltip,
|
|
14
|
+
DropdownMenu,
|
|
15
|
+
MenuGroup,
|
|
16
|
+
MenuItem,
|
|
9
17
|
} from '@wordpress/components';
|
|
10
|
-
import { __ } from '@wordpress/i18n';
|
|
11
|
-
import { useMemo, useCallback } from '@wordpress/element';
|
|
18
|
+
import { __, sprintf } from '@wordpress/i18n';
|
|
19
|
+
import { useMemo, useCallback, useState } from '@wordpress/element';
|
|
12
20
|
import { cloneBlock } from '@wordpress/blocks';
|
|
21
|
+
import { moreVertical, external } from '@wordpress/icons';
|
|
13
22
|
|
|
14
23
|
/**
|
|
15
24
|
* Internal dependencies
|
|
@@ -17,39 +26,98 @@ import { cloneBlock } from '@wordpress/blocks';
|
|
|
17
26
|
import InserterDraggableBlocks from '../../inserter-draggable-blocks';
|
|
18
27
|
import { getBlockAndPreviewFromMedia } from './utils';
|
|
19
28
|
|
|
20
|
-
|
|
29
|
+
const MAXIMUM_TITLE_LENGTH = 25;
|
|
30
|
+
const MEDIA_OPTIONS_POPOVER_PROPS = {
|
|
31
|
+
position: 'bottom left',
|
|
32
|
+
className:
|
|
33
|
+
'block-editor-inserter__media-list__item-preview-options__popover',
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
function MediaPreviewOptions( { category, media } ) {
|
|
37
|
+
if ( ! category.getReportUrl ) {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
const reportUrl = category.getReportUrl( media );
|
|
41
|
+
return (
|
|
42
|
+
<DropdownMenu
|
|
43
|
+
className="block-editor-inserter__media-list__item-preview-options"
|
|
44
|
+
label={ __( 'Options' ) }
|
|
45
|
+
popoverProps={ MEDIA_OPTIONS_POPOVER_PROPS }
|
|
46
|
+
icon={ moreVertical }
|
|
47
|
+
>
|
|
48
|
+
{ () => (
|
|
49
|
+
<MenuGroup>
|
|
50
|
+
<MenuItem
|
|
51
|
+
onClick={ () =>
|
|
52
|
+
window.open( reportUrl, '_blank' ).focus()
|
|
53
|
+
}
|
|
54
|
+
icon={ external }
|
|
55
|
+
>
|
|
56
|
+
{ sprintf(
|
|
57
|
+
/* translators: %s: The media type to report e.g: "image", "video", "audio" */
|
|
58
|
+
__( 'Report %s' ),
|
|
59
|
+
category.mediaType
|
|
60
|
+
) }
|
|
61
|
+
</MenuItem>
|
|
62
|
+
</MenuGroup>
|
|
63
|
+
) }
|
|
64
|
+
</DropdownMenu>
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function MediaPreview( { media, onClick, composite, category } ) {
|
|
69
|
+
const [ isHovered, setIsHovered ] = useState( false );
|
|
21
70
|
const [ block, preview ] = useMemo(
|
|
22
|
-
() => getBlockAndPreviewFromMedia( media, mediaType ),
|
|
23
|
-
[ media, mediaType ]
|
|
71
|
+
() => getBlockAndPreviewFromMedia( media, category.mediaType ),
|
|
72
|
+
[ media, category.mediaType ]
|
|
24
73
|
);
|
|
25
74
|
const title = media.title?.rendered || media.title;
|
|
26
|
-
|
|
75
|
+
let truncatedTitle;
|
|
76
|
+
if ( title.length > MAXIMUM_TITLE_LENGTH ) {
|
|
77
|
+
const omission = '...';
|
|
78
|
+
truncatedTitle =
|
|
79
|
+
title.slice( 0, MAXIMUM_TITLE_LENGTH - omission.length ) + omission;
|
|
80
|
+
}
|
|
81
|
+
const onMouseEnter = useCallback( () => setIsHovered( true ), [] );
|
|
82
|
+
const onMouseLeave = useCallback( () => setIsHovered( false ), [] );
|
|
27
83
|
return (
|
|
28
84
|
<InserterDraggableBlocks isEnabled={ true } blocks={ [ block ] }>
|
|
29
85
|
{ ( { draggable, onDragStart, onDragEnd } ) => (
|
|
30
86
|
<div
|
|
31
|
-
className={
|
|
87
|
+
className={ classnames(
|
|
88
|
+
'block-editor-inserter__media-list__list-item',
|
|
89
|
+
{
|
|
90
|
+
'is-hovered': isHovered,
|
|
91
|
+
}
|
|
92
|
+
) }
|
|
32
93
|
draggable={ draggable }
|
|
33
94
|
onDragStart={ onDragStart }
|
|
34
95
|
onDragEnd={ onDragEnd }
|
|
35
96
|
>
|
|
36
|
-
<Tooltip text={ title }>
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
{
|
|
41
|
-
|
|
42
|
-
onClick={ () => {
|
|
43
|
-
onClick( block );
|
|
44
|
-
} }
|
|
45
|
-
aria-label={ title }
|
|
97
|
+
<Tooltip text={ truncatedTitle || title }>
|
|
98
|
+
{ /* Adding `is-hovered` class to the wrapper element is needed
|
|
99
|
+
because the options Popover is rendered outside of this node. */ }
|
|
100
|
+
<div
|
|
101
|
+
onMouseEnter={ onMouseEnter }
|
|
102
|
+
onMouseLeave={ onMouseLeave }
|
|
46
103
|
>
|
|
47
|
-
<
|
|
48
|
-
|
|
104
|
+
<CompositeItem
|
|
105
|
+
role="option"
|
|
106
|
+
as="div"
|
|
107
|
+
{ ...composite }
|
|
108
|
+
className="block-editor-inserter__media-list__item"
|
|
109
|
+
onClick={ () => onClick( block ) }
|
|
110
|
+
aria-label={ title }
|
|
49
111
|
>
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
112
|
+
<div className="block-editor-inserter__media-list__item-preview">
|
|
113
|
+
{ preview }
|
|
114
|
+
</div>
|
|
115
|
+
</CompositeItem>
|
|
116
|
+
<MediaPreviewOptions
|
|
117
|
+
category={ category }
|
|
118
|
+
media={ media }
|
|
119
|
+
/>
|
|
120
|
+
</div>
|
|
53
121
|
</Tooltip>
|
|
54
122
|
</div>
|
|
55
123
|
) }
|
|
@@ -59,7 +127,7 @@ function MediaPreview( { media, onClick, composite, mediaType } ) {
|
|
|
59
127
|
|
|
60
128
|
function MediaList( {
|
|
61
129
|
mediaList,
|
|
62
|
-
|
|
130
|
+
category,
|
|
63
131
|
onClick,
|
|
64
132
|
label = __( 'Media List' ),
|
|
65
133
|
} ) {
|
|
@@ -77,11 +145,11 @@ function MediaList( {
|
|
|
77
145
|
className="block-editor-inserter__media-list"
|
|
78
146
|
aria-label={ label }
|
|
79
147
|
>
|
|
80
|
-
{ mediaList.map( ( media ) => (
|
|
148
|
+
{ mediaList.map( ( media, index ) => (
|
|
81
149
|
<MediaPreview
|
|
82
|
-
key={ media.id }
|
|
150
|
+
key={ media.id || media.sourceId || index }
|
|
83
151
|
media={ media }
|
|
84
|
-
|
|
152
|
+
category={ category }
|
|
85
153
|
onClick={ onPreviewClick }
|
|
86
154
|
composite={ composite }
|
|
87
155
|
/>
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
import { useRef, useEffect } from '@wordpress/element';
|
|
5
5
|
import { Spinner, SearchControl } from '@wordpress/components';
|
|
6
6
|
import { focus } from '@wordpress/dom';
|
|
7
|
-
import { __
|
|
7
|
+
import { __ } from '@wordpress/i18n';
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
10
|
* Internal dependencies
|
|
@@ -38,44 +38,33 @@ export function MediaCategoryDialog( { rootClientId, onInsert, category } ) {
|
|
|
38
38
|
|
|
39
39
|
export function MediaCategoryPanel( { rootClientId, onInsert, category } ) {
|
|
40
40
|
const [ search, setSearch, debouncedSearch ] = useDebouncedInput();
|
|
41
|
-
const mediaList = useMediaResults( {
|
|
41
|
+
const { mediaList, isLoading } = useMediaResults( category, {
|
|
42
42
|
per_page: !! debouncedSearch ? 20 : INITIAL_MEDIA_ITEMS_PER_PAGE,
|
|
43
|
-
media_type: category.mediaType,
|
|
44
43
|
search: debouncedSearch,
|
|
45
|
-
orderBy: !! debouncedSearch ? 'relevance' : 'date',
|
|
46
44
|
} );
|
|
47
45
|
const baseCssClass = 'block-editor-inserter__media-panel';
|
|
46
|
+
const searchLabel = category.labels.search_items || __( 'Search' );
|
|
48
47
|
return (
|
|
49
48
|
<div className={ baseCssClass }>
|
|
50
49
|
<SearchControl
|
|
51
50
|
className={ `${ baseCssClass }-search` }
|
|
52
51
|
onChange={ setSearch }
|
|
53
52
|
value={ search }
|
|
54
|
-
label={
|
|
55
|
-
|
|
56
|
-
__( 'Search %s' ),
|
|
57
|
-
category.label.toLocaleLowerCase()
|
|
58
|
-
) }
|
|
59
|
-
placeholder={ sprintf(
|
|
60
|
-
/* translators: %s: Name of the media category(ex. 'images, videos'). */
|
|
61
|
-
__( 'Search %s' ),
|
|
62
|
-
category.label.toLocaleLowerCase()
|
|
63
|
-
) }
|
|
53
|
+
label={ searchLabel }
|
|
54
|
+
placeholder={ searchLabel }
|
|
64
55
|
/>
|
|
65
|
-
{
|
|
56
|
+
{ isLoading && (
|
|
66
57
|
<div className={ `${ baseCssClass }-spinner` }>
|
|
67
58
|
<Spinner />
|
|
68
59
|
</div>
|
|
69
60
|
) }
|
|
70
|
-
{
|
|
71
|
-
|
|
72
|
-
) }
|
|
73
|
-
{ !! mediaList?.length && (
|
|
61
|
+
{ ! isLoading && ! mediaList?.length && <InserterNoResults /> }
|
|
62
|
+
{ ! isLoading && !! mediaList?.length && (
|
|
74
63
|
<MediaList
|
|
75
64
|
rootClientId={ rootClientId }
|
|
76
65
|
onClick={ onInsert }
|
|
77
66
|
mediaList={ mediaList }
|
|
78
|
-
|
|
67
|
+
category={ category }
|
|
79
68
|
/>
|
|
80
69
|
) }
|
|
81
70
|
</div>
|
|
@@ -15,7 +15,7 @@ import {
|
|
|
15
15
|
FlexBlock,
|
|
16
16
|
Button,
|
|
17
17
|
} from '@wordpress/components';
|
|
18
|
-
import { useCallback } from '@wordpress/element';
|
|
18
|
+
import { useCallback, useMemo } from '@wordpress/element';
|
|
19
19
|
import { Icon, chevronRight } from '@wordpress/icons';
|
|
20
20
|
|
|
21
21
|
/**
|
|
@@ -49,6 +49,14 @@ function MediaTab( {
|
|
|
49
49
|
},
|
|
50
50
|
[ onInsert ]
|
|
51
51
|
);
|
|
52
|
+
const mobileMediaCategories = useMemo(
|
|
53
|
+
() =>
|
|
54
|
+
mediaCategories.map( ( mediaCategory ) => ( {
|
|
55
|
+
...mediaCategory,
|
|
56
|
+
label: mediaCategory.labels.name,
|
|
57
|
+
} ) ),
|
|
58
|
+
[ mediaCategories ]
|
|
59
|
+
);
|
|
52
60
|
return (
|
|
53
61
|
<>
|
|
54
62
|
{ ! isMobile && (
|
|
@@ -70,7 +78,7 @@ function MediaTab( {
|
|
|
70
78
|
mediaCategory,
|
|
71
79
|
}
|
|
72
80
|
) }
|
|
73
|
-
aria-label={ mediaCategory.
|
|
81
|
+
aria-label={ mediaCategory.labels.name }
|
|
74
82
|
aria-current={
|
|
75
83
|
mediaCategory === selectedCategory
|
|
76
84
|
? 'true'
|
|
@@ -79,7 +87,7 @@ function MediaTab( {
|
|
|
79
87
|
>
|
|
80
88
|
<HStack>
|
|
81
89
|
<FlexBlock>
|
|
82
|
-
{ mediaCategory.
|
|
90
|
+
{ mediaCategory.labels.name }
|
|
83
91
|
</FlexBlock>
|
|
84
92
|
<Icon icon={ chevronRight } />
|
|
85
93
|
</HStack>
|
|
@@ -118,7 +126,7 @@ function MediaTab( {
|
|
|
118
126
|
</div>
|
|
119
127
|
) }
|
|
120
128
|
{ isMobile && (
|
|
121
|
-
<MobileTabNavigation categories={
|
|
129
|
+
<MobileTabNavigation categories={ mobileMediaCategories }>
|
|
122
130
|
{ ( category ) => (
|
|
123
131
|
<MediaCategoryPanel
|
|
124
132
|
onInsert={ onInsert }
|
|
@@ -5,19 +5,23 @@ import { createBlock } from '@wordpress/blocks';
|
|
|
5
5
|
|
|
6
6
|
const mediaTypeTag = { image: 'img', video: 'video', audio: 'audio' };
|
|
7
7
|
|
|
8
|
+
/** @typedef {import('./hooks').InserterMediaItem} InserterMediaItem */
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Creates a block and a preview element from a media object.
|
|
12
|
+
*
|
|
13
|
+
* @param {InserterMediaItem} media The media object to create the block from.
|
|
14
|
+
* @param {('image'|'audio'|'video')} mediaType The media type to create the block for.
|
|
15
|
+
* @return {[WPBlock, JSX.Element]} An array containing the block and the preview element.
|
|
16
|
+
*/
|
|
8
17
|
export function getBlockAndPreviewFromMedia( media, mediaType ) {
|
|
9
18
|
// Add the common attributes between the different media types.
|
|
10
19
|
const attributes = {
|
|
11
|
-
id: media.id,
|
|
20
|
+
id: media.id || undefined,
|
|
21
|
+
caption: media.caption || undefined,
|
|
12
22
|
};
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
const mediaSrc = media.source_url || media.url;
|
|
16
|
-
const alt = media.alt_text || media.alt || undefined;
|
|
17
|
-
const caption = media.caption?.raw || media.caption;
|
|
18
|
-
if ( caption && typeof caption === 'string' ) {
|
|
19
|
-
attributes.caption = caption;
|
|
20
|
-
}
|
|
23
|
+
const mediaSrc = media.url;
|
|
24
|
+
const alt = media.alt || undefined;
|
|
21
25
|
if ( mediaType === 'image' ) {
|
|
22
26
|
attributes.url = mediaSrc;
|
|
23
27
|
attributes.alt = alt;
|
|
@@ -27,10 +31,16 @@ export function getBlockAndPreviewFromMedia( media, mediaType ) {
|
|
|
27
31
|
const PreviewTag = mediaTypeTag[ mediaType ];
|
|
28
32
|
const preview = (
|
|
29
33
|
<PreviewTag
|
|
30
|
-
src={ mediaSrc }
|
|
34
|
+
src={ media.previewUrl || mediaSrc }
|
|
31
35
|
alt={ alt }
|
|
32
36
|
controls={ mediaType === 'audio' ? true : undefined }
|
|
33
37
|
inert="true"
|
|
38
|
+
onError={ ( { currentTarget } ) => {
|
|
39
|
+
// Fall back to the media source if the preview cannot be loaded.
|
|
40
|
+
if ( currentTarget.src === media.previewUrl ) {
|
|
41
|
+
currentTarget.src = mediaSrc;
|
|
42
|
+
}
|
|
43
|
+
} }
|
|
34
44
|
/>
|
|
35
45
|
);
|
|
36
46
|
return [ createBlock( `core/${ mediaType }`, attributes ), preview ];
|
|
@@ -113,6 +113,13 @@ function InserterMenu(
|
|
|
113
113
|
[ onToggleInsertionPoint, setHoveredItem ]
|
|
114
114
|
);
|
|
115
115
|
|
|
116
|
+
const onHoverPattern = useCallback(
|
|
117
|
+
( item ) => {
|
|
118
|
+
onToggleInsertionPoint( !! item );
|
|
119
|
+
},
|
|
120
|
+
[ onToggleInsertionPoint ]
|
|
121
|
+
);
|
|
122
|
+
|
|
116
123
|
const onClickPatternCategory = useCallback(
|
|
117
124
|
( patternCategory ) => {
|
|
118
125
|
setSelectedPatternCategory( patternCategory );
|
|
@@ -296,6 +303,7 @@ function InserterMenu(
|
|
|
296
303
|
<BlockPatternsCategoryDialog
|
|
297
304
|
rootClientId={ destinationRootClientId }
|
|
298
305
|
onInsert={ onInsertPattern }
|
|
306
|
+
onHover={ onHoverPattern }
|
|
299
307
|
category={ selectedPatternCategory }
|
|
300
308
|
showTitlesAsTooltip
|
|
301
309
|
/>
|
|
@@ -23,8 +23,6 @@ function InserterPreviewPanel( { item } ) {
|
|
|
23
23
|
{ isReusable || example ? (
|
|
24
24
|
<div className="block-editor-inserter__preview-content">
|
|
25
25
|
<BlockPreview
|
|
26
|
-
__experimentalPadding={ 16 }
|
|
27
|
-
viewportWidth={ example?.viewportWidth ?? 500 }
|
|
28
26
|
blocks={
|
|
29
27
|
example
|
|
30
28
|
? getBlockFromExample( name, {
|
|
@@ -36,6 +34,10 @@ function InserterPreviewPanel( { item } ) {
|
|
|
36
34
|
} )
|
|
37
35
|
: createBlock( name, initialAttributes )
|
|
38
36
|
}
|
|
37
|
+
viewportWidth={ example?.viewportWidth ?? 500 }
|
|
38
|
+
additionalStyles={ [
|
|
39
|
+
{ css: 'body { padding: 16px; }' },
|
|
40
|
+
] }
|
|
39
41
|
/>
|
|
40
42
|
</div>
|
|
41
43
|
) : (
|
|
@@ -1,8 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* External dependencies
|
|
3
|
-
*/
|
|
4
|
-
import { isEmpty } from 'lodash';
|
|
5
|
-
|
|
6
1
|
/**
|
|
7
2
|
* WordPress dependencies
|
|
8
3
|
*/
|
|
@@ -135,7 +130,7 @@ function InserterSearchResults( {
|
|
|
135
130
|
);
|
|
136
131
|
|
|
137
132
|
const hasItems =
|
|
138
|
-
|
|
133
|
+
filteredBlockTypes.length > 0 || filteredBlockPatterns.length > 0;
|
|
139
134
|
|
|
140
135
|
const blocksUI = !! filteredBlockTypes.length && (
|
|
141
136
|
<InserterPanel
|
|
@@ -162,6 +157,7 @@ function InserterSearchResults( {
|
|
|
162
157
|
shownPatterns={ currentShownPatterns }
|
|
163
158
|
blockPatterns={ filteredBlockPatterns }
|
|
164
159
|
onClickPattern={ onSelectBlockPattern }
|
|
160
|
+
onHover={ onHover }
|
|
165
161
|
isDraggable={ isDraggable }
|
|
166
162
|
/>
|
|
167
163
|
</div>
|