@wordpress/block-editor 15.19.1-next.v.202605131032.0 → 15.20.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 +15 -1
- package/build/components/block-card/index.cjs +51 -41
- package/build/components/block-card/index.cjs.map +3 -3
- package/build/components/block-heading-level-dropdown/heading-level-icon.cjs.map +3 -3
- package/build/components/block-icon/index.cjs +7 -1
- package/build/components/block-icon/index.cjs.map +3 -3
- package/build/components/block-inspector/index.cjs +156 -11
- package/build/components/block-inspector/index.cjs.map +3 -3
- package/build/components/block-inspector/inspector-pre-tabs-slot-fill.cjs +38 -0
- package/build/components/block-inspector/inspector-pre-tabs-slot-fill.cjs.map +7 -0
- package/build/components/block-list/use-block-props/index.cjs +1 -1
- package/build/components/block-list/use-block-props/index.cjs.map +2 -2
- package/build/components/block-list/use-block-props/use-focus-handler.cjs +3 -4
- package/build/components/block-list/use-block-props/use-focus-handler.cjs.map +3 -3
- package/build/components/block-list/use-block-props/use-is-hovered.cjs +24 -14
- package/build/components/block-list/use-block-props/use-is-hovered.cjs.map +3 -3
- package/build/components/block-lock/modal.cjs.map +3 -3
- package/build/components/block-patterns-list/index.cjs +13 -2
- package/build/components/block-patterns-list/index.cjs.map +2 -2
- package/build/components/block-popover/index.cjs +13 -3
- package/build/components/block-popover/index.cjs.map +2 -2
- package/build/components/block-toolbar/switch-section-style.cjs.map +3 -3
- package/build/components/block-visibility/modal.cjs.map +3 -3
- package/build/components/block-visibility/viewport-visibility-info.cjs.map +3 -3
- package/build/components/colors-gradients/control.cjs +7 -4
- package/build/components/colors-gradients/control.cjs.map +2 -2
- package/build/components/global-styles/advanced-panel.cjs +24 -22
- package/build/components/global-styles/advanced-panel.cjs.map +3 -3
- package/build/components/global-styles/color-panel.cjs +95 -58
- package/build/components/global-styles/color-panel.cjs.map +2 -2
- package/build/components/global-styles/dimensions-panel.cjs +11 -5
- package/build/components/global-styles/dimensions-panel.cjs.map +2 -2
- package/build/components/global-styles/index.cjs +3 -0
- package/build/components/global-styles/index.cjs.map +2 -2
- package/build/components/global-styles/shadow-panel-components.cjs +38 -26
- package/build/components/global-styles/shadow-panel-components.cjs.map +2 -2
- package/build/components/global-styles/state-control-badges.cjs +69 -0
- package/build/components/global-styles/state-control-badges.cjs.map +7 -0
- package/build/components/global-styles/state-control.cjs +54 -63
- package/build/components/global-styles/state-control.cjs.map +3 -3
- package/build/components/iframe/index.cjs +0 -3
- package/build/components/iframe/index.cjs.map +2 -2
- package/build/components/iframe/use-scale-canvas.cjs +4 -1
- package/build/components/iframe/use-scale-canvas.cjs.map +2 -2
- package/build/components/inserter/hooks/use-patterns-state.cjs +4 -6
- package/build/components/inserter/hooks/use-patterns-state.cjs.map +2 -2
- package/build/components/inserter/index.cjs +1 -0
- package/build/components/inserter/index.cjs.map +2 -2
- package/build/components/inserter/media-tab/media-preview.cjs +27 -18
- package/build/components/inserter/media-tab/media-preview.cjs.map +2 -2
- package/build/components/inserter/media-tab/utils.cjs +1 -1
- package/build/components/inserter/media-tab/utils.cjs.map +2 -2
- package/build/components/inserter/panel.cjs.map +3 -3
- package/build/components/inspector-controls/block-support-tools-panel.cjs +10 -2
- package/build/components/inspector-controls/block-support-tools-panel.cjs.map +2 -2
- package/build/components/inspector-controls/fill.cjs +14 -4
- package/build/components/inspector-controls/fill.cjs.map +2 -2
- package/build/components/inspector-controls/groups.cjs +2 -0
- package/build/components/inspector-controls/groups.cjs.map +2 -2
- package/build/components/inspector-controls-tabs/index.cjs +13 -8
- package/build/components/inspector-controls-tabs/index.cjs.map +3 -3
- package/build/components/inspector-controls-tabs/settings-tab.cjs +1 -4
- package/build/components/inspector-controls-tabs/settings-tab.cjs.map +3 -3
- package/build/components/inspector-controls-tabs/styles-tab.cjs +9 -0
- package/build/components/inspector-controls-tabs/styles-tab.cjs.map +3 -3
- package/build/components/inspector-controls-tabs/use-inspector-controls-tabs.cjs +11 -5
- package/build/components/inspector-controls-tabs/use-inspector-controls-tabs.cjs.map +2 -2
- package/build/components/list-view/block-select-button.cjs +20 -8
- package/build/components/list-view/block-select-button.cjs.map +2 -2
- package/build/components/list-view/block.cjs +2 -1
- package/build/components/list-view/block.cjs.map +2 -2
- package/build/components/preset-input-control/custom-value-controls.cjs +10 -1
- package/build/components/preset-input-control/custom-value-controls.cjs.map +2 -2
- package/build/components/preset-input-control/index.cjs.map +3 -3
- package/build/components/provider/use-media-upload-settings.cjs +1 -0
- package/build/components/provider/use-media-upload-settings.cjs.map +2 -2
- package/build/components/rich-text/event-listeners/enter.cjs +9 -2
- package/build/components/rich-text/event-listeners/enter.cjs.map +3 -3
- package/build/components/rich-text/event-listeners/paste-handler.cjs +4 -4
- package/build/components/rich-text/event-listeners/paste-handler.cjs.map +3 -3
- package/build/hooks/background.cjs +13 -3
- package/build/hooks/background.cjs.map +2 -2
- package/build/hooks/block-fields/link/index.cjs.map +3 -3
- package/build/hooks/block-fields/media/index.cjs.map +3 -3
- package/build/hooks/block-style-state.cjs +112 -0
- package/build/hooks/block-style-state.cjs.map +7 -0
- package/build/hooks/border.cjs +13 -3
- package/build/hooks/border.cjs.map +2 -2
- package/build/hooks/color.cjs +28 -9
- package/build/hooks/color.cjs.map +2 -2
- package/build/hooks/dimensions.cjs +15 -6
- package/build/hooks/dimensions.cjs.map +2 -2
- package/build/hooks/layout-child.cjs +147 -61
- package/build/hooks/layout-child.cjs.map +2 -2
- package/build/hooks/layout.cjs +263 -56
- package/build/hooks/layout.cjs.map +3 -3
- package/build/hooks/state-utils.cjs +94 -0
- package/build/hooks/state-utils.cjs.map +7 -0
- package/build/hooks/states.cjs +124 -0
- package/build/hooks/states.cjs.map +7 -0
- package/build/hooks/style.cjs +304 -17
- package/build/hooks/style.cjs.map +3 -3
- package/build/hooks/typography.cjs +14 -5
- package/build/hooks/typography.cjs.map +2 -2
- package/build/layouts/constrained.cjs +128 -55
- package/build/layouts/constrained.cjs.map +3 -3
- package/build/layouts/flex.cjs +119 -31
- package/build/layouts/flex.cjs.map +3 -3
- package/build/layouts/grid.cjs +103 -40
- package/build/layouts/grid.cjs.map +3 -3
- package/build/private-apis.cjs +2 -0
- package/build/private-apis.cjs.map +2 -2
- package/build/store/private-actions.cjs +18 -0
- package/build/store/private-actions.cjs.map +2 -2
- package/build/store/private-keys.cjs +10 -2
- package/build/store/private-keys.cjs.map +2 -2
- package/build/store/private-selectors.cjs +26 -2
- package/build/store/private-selectors.cjs.map +2 -2
- package/build/store/reducer.cjs +70 -1
- package/build/store/reducer.cjs.map +2 -2
- package/build/store/utils.cjs +1 -1
- package/build/store/utils.cjs.map +2 -2
- package/build/utils/color-values.cjs +44 -0
- package/build/utils/color-values.cjs.map +7 -0
- package/build-module/components/block-card/index.mjs +52 -45
- package/build-module/components/block-card/index.mjs.map +2 -2
- package/build-module/components/block-heading-level-dropdown/heading-level-icon.mjs +2 -2
- package/build-module/components/block-heading-level-dropdown/heading-level-icon.mjs.map +2 -2
- package/build-module/components/block-icon/index.mjs +8 -2
- package/build-module/components/block-icon/index.mjs.map +2 -2
- package/build-module/components/block-inspector/index.mjs +166 -13
- package/build-module/components/block-inspector/index.mjs.map +2 -2
- package/build-module/components/block-inspector/inspector-pre-tabs-slot-fill.mjs +12 -0
- package/build-module/components/block-inspector/inspector-pre-tabs-slot-fill.mjs.map +7 -0
- package/build-module/components/block-list/use-block-props/index.mjs +1 -1
- 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-handler.mjs +7 -5
- 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-is-hovered.mjs +28 -15
- package/build-module/components/block-list/use-block-props/use-is-hovered.mjs.map +2 -2
- package/build-module/components/block-lock/modal.mjs +4 -4
- package/build-module/components/block-lock/modal.mjs.map +2 -2
- package/build-module/components/block-patterns-list/index.mjs +14 -4
- package/build-module/components/block-patterns-list/index.mjs.map +2 -2
- package/build-module/components/block-popover/index.mjs +13 -3
- package/build-module/components/block-popover/index.mjs.map +2 -2
- package/build-module/components/block-toolbar/switch-section-style.mjs +2 -2
- package/build-module/components/block-toolbar/switch-section-style.mjs.map +2 -2
- package/build-module/components/block-visibility/modal.mjs +2 -2
- package/build-module/components/block-visibility/modal.mjs.map +2 -2
- package/build-module/components/block-visibility/viewport-visibility-info.mjs +2 -2
- package/build-module/components/block-visibility/viewport-visibility-info.mjs.map +2 -2
- package/build-module/components/colors-gradients/control.mjs +7 -4
- package/build-module/components/colors-gradients/control.mjs.map +2 -2
- package/build-module/components/global-styles/advanced-panel.mjs +25 -27
- package/build-module/components/global-styles/advanced-panel.mjs.map +2 -2
- package/build-module/components/global-styles/color-panel.mjs +96 -59
- package/build-module/components/global-styles/color-panel.mjs.map +2 -2
- package/build-module/components/global-styles/dimensions-panel.mjs +14 -5
- package/build-module/components/global-styles/dimensions-panel.mjs.map +2 -2
- package/build-module/components/global-styles/index.mjs +2 -0
- package/build-module/components/global-styles/index.mjs.map +2 -2
- package/build-module/components/global-styles/shadow-panel-components.mjs +39 -28
- package/build-module/components/global-styles/shadow-panel-components.mjs.map +2 -2
- package/build-module/components/global-styles/state-control-badges.mjs +48 -0
- package/build-module/components/global-styles/state-control-badges.mjs.map +7 -0
- package/build-module/components/global-styles/state-control.mjs +57 -71
- package/build-module/components/global-styles/state-control.mjs.map +2 -2
- package/build-module/components/iframe/index.mjs +0 -3
- package/build-module/components/iframe/index.mjs.map +2 -2
- package/build-module/components/iframe/use-scale-canvas.mjs +4 -1
- package/build-module/components/iframe/use-scale-canvas.mjs.map +2 -2
- package/build-module/components/inserter/hooks/use-patterns-state.mjs +8 -7
- package/build-module/components/inserter/hooks/use-patterns-state.mjs.map +2 -2
- package/build-module/components/inserter/index.mjs +1 -0
- package/build-module/components/inserter/index.mjs.map +2 -2
- package/build-module/components/inserter/media-tab/media-preview.mjs +27 -19
- package/build-module/components/inserter/media-tab/media-preview.mjs.map +2 -2
- package/build-module/components/inserter/media-tab/utils.mjs +1 -1
- package/build-module/components/inserter/media-tab/utils.mjs.map +2 -2
- package/build-module/components/inserter/panel.mjs +2 -2
- package/build-module/components/inserter/panel.mjs.map +2 -2
- package/build-module/components/inspector-controls/block-support-tools-panel.mjs +10 -2
- package/build-module/components/inspector-controls/block-support-tools-panel.mjs.map +2 -2
- package/build-module/components/inspector-controls/fill.mjs +18 -5
- package/build-module/components/inspector-controls/fill.mjs.map +2 -2
- package/build-module/components/inspector-controls/groups.mjs +2 -0
- package/build-module/components/inspector-controls/groups.mjs.map +2 -2
- package/build-module/components/inspector-controls-tabs/index.mjs +14 -10
- package/build-module/components/inspector-controls-tabs/index.mjs.map +2 -2
- package/build-module/components/inspector-controls-tabs/settings-tab.mjs +1 -4
- package/build-module/components/inspector-controls-tabs/settings-tab.mjs.map +2 -2
- package/build-module/components/inspector-controls-tabs/styles-tab.mjs +9 -0
- package/build-module/components/inspector-controls-tabs/styles-tab.mjs.map +2 -2
- package/build-module/components/inspector-controls-tabs/use-inspector-controls-tabs.mjs +11 -5
- package/build-module/components/inspector-controls-tabs/use-inspector-controls-tabs.mjs.map +2 -2
- package/build-module/components/list-view/block-select-button.mjs +20 -9
- package/build-module/components/list-view/block-select-button.mjs.map +2 -2
- package/build-module/components/list-view/block.mjs +2 -1
- package/build-module/components/list-view/block.mjs.map +2 -2
- package/build-module/components/preset-input-control/custom-value-controls.mjs +10 -2
- package/build-module/components/preset-input-control/custom-value-controls.mjs.map +2 -2
- package/build-module/components/preset-input-control/index.mjs +2 -2
- package/build-module/components/preset-input-control/index.mjs.map +2 -2
- package/build-module/components/provider/use-media-upload-settings.mjs +1 -0
- package/build-module/components/provider/use-media-upload-settings.mjs.map +2 -2
- package/build-module/components/rich-text/event-listeners/enter.mjs +9 -2
- package/build-module/components/rich-text/event-listeners/enter.mjs.map +2 -2
- package/build-module/components/rich-text/event-listeners/paste-handler.mjs +4 -4
- package/build-module/components/rich-text/event-listeners/paste-handler.mjs.map +2 -2
- package/build-module/hooks/background.mjs +18 -3
- package/build-module/hooks/background.mjs.map +2 -2
- package/build-module/hooks/block-fields/link/index.mjs +3 -3
- package/build-module/hooks/block-fields/link/index.mjs.map +2 -2
- package/build-module/hooks/block-fields/media/index.mjs +3 -3
- package/build-module/hooks/block-fields/media/index.mjs.map +2 -2
- package/build-module/hooks/block-style-state.mjs +79 -0
- package/build-module/hooks/block-style-state.mjs.map +7 -0
- package/build-module/hooks/border.mjs +18 -3
- package/build-module/hooks/border.mjs.map +2 -2
- package/build-module/hooks/color.mjs +33 -9
- package/build-module/hooks/color.mjs.map +2 -2
- package/build-module/hooks/dimensions.mjs +20 -6
- package/build-module/hooks/dimensions.mjs.map +2 -2
- package/build-module/hooks/layout-child.mjs +141 -61
- package/build-module/hooks/layout-child.mjs.map +2 -2
- package/build-module/hooks/layout.mjs +270 -58
- package/build-module/hooks/layout.mjs.map +2 -2
- package/build-module/hooks/state-utils.mjs +64 -0
- package/build-module/hooks/state-utils.mjs.map +7 -0
- package/build-module/hooks/states.mjs +85 -0
- package/build-module/hooks/states.mjs.map +7 -0
- package/build-module/hooks/style.mjs +309 -18
- package/build-module/hooks/style.mjs.map +2 -2
- package/build-module/hooks/typography.mjs +19 -5
- package/build-module/hooks/typography.mjs.map +2 -2
- package/build-module/layouts/constrained.mjs +130 -57
- package/build-module/layouts/constrained.mjs.map +2 -2
- package/build-module/layouts/flex.mjs +123 -35
- package/build-module/layouts/flex.mjs.map +2 -2
- package/build-module/layouts/grid.mjs +105 -42
- package/build-module/layouts/grid.mjs.map +2 -2
- package/build-module/private-apis.mjs +4 -0
- package/build-module/private-apis.mjs.map +2 -2
- package/build-module/store/private-actions.mjs +16 -0
- package/build-module/store/private-actions.mjs.map +2 -2
- package/build-module/store/private-keys.mjs +7 -1
- package/build-module/store/private-keys.mjs.map +2 -2
- package/build-module/store/private-selectors.mjs +25 -2
- package/build-module/store/private-selectors.mjs.map +2 -2
- package/build-module/store/reducer.mjs +69 -1
- package/build-module/store/reducer.mjs.map +2 -2
- package/build-module/store/utils.mjs +5 -2
- package/build-module/store/utils.mjs.map +2 -2
- package/build-module/utils/color-values.mjs +19 -0
- package/build-module/utils/color-values.mjs.map +7 -0
- package/build-style/content-rtl.css +18 -3
- package/build-style/content.css +18 -3
- package/build-style/style-rtl.css +14 -17
- package/build-style/style.css +14 -17
- package/package.json +41 -41
- package/src/components/audio-player/index.native.js +7 -3
- package/src/components/block-card/index.js +67 -60
- package/src/components/block-heading-level-dropdown/heading-level-icon.js +2 -2
- package/src/components/block-icon/index.js +5 -2
- package/src/components/block-icon/index.native.js +2 -2
- package/src/components/block-inspector/index.js +153 -7
- package/src/components/block-inspector/inspector-pre-tabs-slot-fill.js +11 -0
- package/src/components/block-list/block-selection-button.native.js +3 -3
- package/src/components/block-list/content.scss +0 -6
- package/src/components/block-list/use-block-props/index.js +1 -1
- package/src/components/block-list/use-block-props/use-focus-handler.js +8 -6
- package/src/components/block-list/use-block-props/use-is-hovered.js +32 -15
- package/src/components/block-lock/modal.js +4 -4
- package/src/components/block-patterns-list/index.js +14 -5
- package/src/components/block-patterns-list/stories/index.story.jsx +2 -0
- package/src/components/block-patterns-list/style.scss +0 -1
- package/src/components/block-popover/index.js +20 -10
- package/src/components/block-toolbar/switch-section-style.js +2 -2
- package/src/components/block-visibility/modal.js +2 -2
- package/src/components/block-visibility/viewport-visibility-info.js +2 -2
- package/src/components/colors/test/with-colors.js +1 -1
- package/src/components/colors-gradients/control.js +10 -8
- package/src/components/colors-gradients/test/control.js +98 -1
- package/src/components/global-styles/advanced-panel.js +44 -39
- package/src/components/global-styles/color-panel.js +133 -60
- package/src/components/global-styles/dimensions-panel.js +17 -4
- package/src/components/global-styles/index.js +1 -0
- package/src/components/global-styles/shadow-panel-components.js +29 -19
- package/src/components/global-styles/state-control-badges.js +58 -0
- package/src/components/global-styles/state-control.js +28 -36
- package/src/components/global-styles/test/color-panel.js +135 -0
- package/src/components/iframe/index.js +0 -3
- package/src/components/iframe/use-scale-canvas.js +8 -2
- package/src/components/inserter/hooks/use-patterns-state.js +12 -7
- package/src/components/inserter/index.js +1 -0
- package/src/components/inserter/media-tab/media-preview.js +29 -20
- package/src/components/inserter/media-tab/utils.js +1 -1
- package/src/components/inserter/panel.js +2 -2
- package/src/components/inserter/style.scss +1 -0
- package/src/components/inserter-button/index.native.js +5 -2
- package/src/components/inspector-controls/block-support-tools-panel.js +10 -2
- package/src/components/inspector-controls/fill.js +18 -5
- package/src/components/inspector-controls/groups.js +2 -0
- package/src/components/inspector-controls-tabs/index.js +9 -5
- package/src/components/inspector-controls-tabs/settings-tab.js +1 -7
- package/src/components/inspector-controls-tabs/styles-tab.js +6 -0
- package/src/components/inspector-controls-tabs/use-inspector-controls-tabs.js +13 -7
- package/src/components/list-view/block-select-button.js +19 -9
- package/src/components/list-view/block.js +6 -1
- package/src/components/media-replace-flow/style.scss +0 -18
- package/src/components/preset-input-control/custom-value-controls.js +13 -6
- package/src/components/preset-input-control/index.js +2 -2
- package/src/components/provider/use-media-upload-settings.js +1 -0
- package/src/components/rich-text/event-listeners/enter.js +14 -2
- package/src/components/rich-text/event-listeners/paste-handler.js +5 -4
- package/src/components/unsupported-block-details/index.native.js +6 -2
- package/src/components/video-player/index.native.js +2 -2
- package/src/components/warning/index.native.js +2 -2
- package/src/hooks/background.js +59 -37
- package/src/hooks/block-fields/link/index.js +3 -3
- package/src/hooks/block-fields/media/index.js +3 -3
- package/src/hooks/block-style-state.js +127 -0
- package/src/hooks/border.js +25 -6
- package/src/hooks/color.js +40 -18
- package/src/hooks/dimensions.js +32 -11
- package/src/hooks/layout-child.js +179 -62
- package/src/hooks/layout.js +349 -75
- package/src/hooks/layout.scss +6 -0
- package/src/hooks/state-utils.js +158 -0
- package/src/hooks/states.js +109 -0
- package/src/hooks/style.js +456 -19
- package/src/hooks/test/block-style-state.js +270 -0
- package/src/hooks/test/layout.js +185 -0
- package/src/hooks/test/state-utils.js +193 -0
- package/src/hooks/test/style.js +301 -1
- package/src/hooks/typography.js +33 -14
- package/src/layouts/constrained.js +182 -95
- package/src/layouts/flex.js +141 -36
- package/src/layouts/grid.js +122 -32
- package/src/layouts/test/flex.js +57 -20
- package/src/private-apis.js +4 -0
- package/src/store/private-actions.js +32 -0
- package/src/store/private-keys.js +4 -0
- package/src/store/private-selectors.js +44 -2
- package/src/store/reducer.js +105 -1
- package/src/store/test/private-actions.js +26 -0
- package/src/store/test/private-selectors.js +90 -0
- package/src/store/test/reducer.js +363 -0
- package/src/store/utils.js +6 -2
- package/src/utils/color-values.js +28 -0
- package/src/utils/test/color-values.js +78 -0
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WordPress dependencies
|
|
3
|
+
*/
|
|
4
|
+
import { getBlockType } from '@wordpress/blocks';
|
|
5
|
+
import { __ } from '@wordpress/i18n';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Internal dependencies
|
|
9
|
+
*/
|
|
10
|
+
import StateControl from '../components/global-styles/state-control';
|
|
11
|
+
import StateControlBadges from '../components/global-styles/state-control-badges';
|
|
12
|
+
import { useToolsPanelDropdownMenuProps } from '../components/global-styles/utils';
|
|
13
|
+
|
|
14
|
+
export const PSEUDO_STATE_LABELS = {
|
|
15
|
+
':hover': __( 'Hover' ),
|
|
16
|
+
':focus': __( 'Focus' ),
|
|
17
|
+
':focus-visible': __( 'Focus-visible' ),
|
|
18
|
+
':active': __( 'Active' ),
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
export const RESPONSIVE_STATE_LABELS = {
|
|
22
|
+
tablet: __( 'Tablet' ),
|
|
23
|
+
mobile: __( 'Mobile' ),
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
// Keep in sync with WP_Theme_JSON_Gutenberg::VALID_BLOCK_PSEUDO_SELECTORS
|
|
27
|
+
// and packages/global-styles-engine/src/core/render.tsx.
|
|
28
|
+
export const VALID_BLOCK_PSEUDO_STATES = {
|
|
29
|
+
'core/button': [ ':hover', ':focus', ':focus-visible', ':active' ],
|
|
30
|
+
'core/navigation-link': [ ':hover', ':focus', ':focus-visible', ':active' ],
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
function getPseudoStateOptions( name ) {
|
|
34
|
+
const validStates = VALID_BLOCK_PSEUDO_STATES[ name ] ?? [];
|
|
35
|
+
|
|
36
|
+
return validStates
|
|
37
|
+
.filter( ( state ) => PSEUDO_STATE_LABELS[ state ] )
|
|
38
|
+
.map( ( state ) => ( {
|
|
39
|
+
value: state,
|
|
40
|
+
label: PSEUDO_STATE_LABELS[ state ],
|
|
41
|
+
} ) );
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const DEFAULT_STATE_VALUE = 'default';
|
|
45
|
+
|
|
46
|
+
function getViewportStateOptions( name ) {
|
|
47
|
+
if ( ! getBlockType( name )?.attributes?.style ) {
|
|
48
|
+
return [];
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
return Object.entries( RESPONSIVE_STATE_LABELS ).map(
|
|
52
|
+
( [ value, label ] ) => ( {
|
|
53
|
+
value,
|
|
54
|
+
label,
|
|
55
|
+
} )
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Renders a style-state selector in the block card header.
|
|
61
|
+
* Viewport states are shown for blocks with a style attribute, while
|
|
62
|
+
* pseudo-states are shown for blocks with configured pseudo-state support.
|
|
63
|
+
*
|
|
64
|
+
* @param {Object} props Component props.
|
|
65
|
+
* @param {string} props.name Block name.
|
|
66
|
+
* @param {Object} props.value Currently selected style-state value.
|
|
67
|
+
* @param {Function} props.onChange Callback when style-state selection changes.
|
|
68
|
+
* @return {Element|null} State control component, or null if not applicable.
|
|
69
|
+
*/
|
|
70
|
+
export function BlockStatesControl( { name, value, onChange } ) {
|
|
71
|
+
const viewportStateOptions = getViewportStateOptions( name );
|
|
72
|
+
const pseudoStateOptions = getPseudoStateOptions( name );
|
|
73
|
+
const dropdownMenuProps = useToolsPanelDropdownMenuProps();
|
|
74
|
+
|
|
75
|
+
if ( ! viewportStateOptions.length && ! pseudoStateOptions.length ) {
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return (
|
|
80
|
+
<StateControl
|
|
81
|
+
viewportStates={ viewportStateOptions }
|
|
82
|
+
pseudoStates={ pseudoStateOptions }
|
|
83
|
+
viewportValue={ value?.viewport ?? DEFAULT_STATE_VALUE }
|
|
84
|
+
pseudoStateValue={ value?.pseudo ?? DEFAULT_STATE_VALUE }
|
|
85
|
+
onChangeViewport={ ( viewport ) => onChange( { viewport } ) }
|
|
86
|
+
onChangePseudoState={ ( pseudo ) => onChange( { pseudo } ) }
|
|
87
|
+
popoverProps={ dropdownMenuProps.popoverProps }
|
|
88
|
+
showText={ false }
|
|
89
|
+
/>
|
|
90
|
+
);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export function BlockStateBadges( { name, value } ) {
|
|
94
|
+
const viewportStateOptions = getViewportStateOptions( name );
|
|
95
|
+
const pseudoStateOptions = getPseudoStateOptions( name );
|
|
96
|
+
|
|
97
|
+
if ( ! viewportStateOptions.length && ! pseudoStateOptions.length ) {
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
return (
|
|
102
|
+
<StateControlBadges
|
|
103
|
+
viewportStates={ viewportStateOptions }
|
|
104
|
+
pseudoStates={ pseudoStateOptions }
|
|
105
|
+
viewportValue={ value?.viewport ?? DEFAULT_STATE_VALUE }
|
|
106
|
+
pseudoStateValue={ value?.pseudo ?? DEFAULT_STATE_VALUE }
|
|
107
|
+
/>
|
|
108
|
+
);
|
|
109
|
+
}
|
package/src/hooks/style.js
CHANGED
|
@@ -3,8 +3,11 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import { useMemo } from '@wordpress/element';
|
|
5
5
|
import { addFilter } from '@wordpress/hooks';
|
|
6
|
+
import { useSelect } from '@wordpress/data';
|
|
7
|
+
import { mergeGlobalStyles } from '@wordpress/global-styles-engine';
|
|
6
8
|
import {
|
|
7
9
|
getBlockSupport,
|
|
10
|
+
getBlockType,
|
|
8
11
|
hasBlockSupport,
|
|
9
12
|
__EXPERIMENTAL_ELEMENTS as ELEMENTS,
|
|
10
13
|
} from '@wordpress/blocks';
|
|
@@ -28,12 +31,34 @@ import {
|
|
|
28
31
|
DimensionsPanel,
|
|
29
32
|
} from './dimensions';
|
|
30
33
|
import {
|
|
34
|
+
cleanEmptyObject,
|
|
31
35
|
shouldSkipSerialization,
|
|
32
36
|
useStyleOverride,
|
|
33
37
|
useBlockSettings,
|
|
34
38
|
} from './utils';
|
|
39
|
+
import {
|
|
40
|
+
BlockStyleStateProvider,
|
|
41
|
+
DEFAULT_BLOCK_STYLE_STATE,
|
|
42
|
+
getStyleForState,
|
|
43
|
+
hasViewportBlockStyleState,
|
|
44
|
+
hasPseudoBlockStyleState,
|
|
45
|
+
} from './block-style-state';
|
|
46
|
+
import { VALID_BLOCK_PSEUDO_STATES } from './states';
|
|
47
|
+
import { buildScopedBlockSelector } from './state-utils';
|
|
35
48
|
import { scopeSelector } from '../components/global-styles/utils';
|
|
36
49
|
import { useBlockEditingMode } from '../components/block-editing-mode';
|
|
50
|
+
import { store as blockEditorStore } from '../store';
|
|
51
|
+
import { globalStylesDataKey } from '../store/private-keys';
|
|
52
|
+
import { unlock } from '../lock-unlock';
|
|
53
|
+
|
|
54
|
+
const BORDER_SIDES = [ 'Top', 'Right', 'Bottom', 'Left' ];
|
|
55
|
+
|
|
56
|
+
// Keep in sync with WP_Theme_JSON_Gutenberg::RESPONSIVE_BREAKPOINTS and
|
|
57
|
+
// packages/global-styles-engine/src/core/render.tsx.
|
|
58
|
+
const RESPONSIVE_BREAKPOINTS = {
|
|
59
|
+
mobile: '@media (width <= 480px)',
|
|
60
|
+
tablet: '@media (480px < width <= 782px)',
|
|
61
|
+
};
|
|
37
62
|
|
|
38
63
|
const styleSupportKeys = [
|
|
39
64
|
...TYPOGRAPHY_SUPPORT_KEYS,
|
|
@@ -66,6 +91,329 @@ export function getInlineStyles( styles = {} ) {
|
|
|
66
91
|
return output;
|
|
67
92
|
}
|
|
68
93
|
|
|
94
|
+
/**
|
|
95
|
+
* Returns fallback border styles for visible state border styles.
|
|
96
|
+
*
|
|
97
|
+
* State styles are emitted as stylesheet rules rather than inline styles, so
|
|
98
|
+
* they cannot rely on the block-library inline-style attribute fallback rules.
|
|
99
|
+
*
|
|
100
|
+
* @param {Object} stateStyles State style object.
|
|
101
|
+
* @return {Object|undefined} Style object containing fallback border styles.
|
|
102
|
+
*/
|
|
103
|
+
function getStateFallbackBorderStyles( stateStyles ) {
|
|
104
|
+
const border = stateStyles?.border;
|
|
105
|
+
if ( ! border ) {
|
|
106
|
+
return undefined;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
const hasBorderStyle = !! border.style;
|
|
110
|
+
const hasBorderColor = !! border.color;
|
|
111
|
+
const hasBorderWidth = !! border.width;
|
|
112
|
+
const fallbackBorder = {};
|
|
113
|
+
|
|
114
|
+
if ( ! hasBorderStyle && ( hasBorderColor || hasBorderWidth ) ) {
|
|
115
|
+
fallbackBorder.style = 'solid';
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
BORDER_SIDES.forEach( ( side ) => {
|
|
119
|
+
const sideKey = side.toLowerCase();
|
|
120
|
+
const sideBorder = border[ sideKey ];
|
|
121
|
+
const hasSideStyle = !! sideBorder?.style;
|
|
122
|
+
const hasSideColor = !! sideBorder?.color;
|
|
123
|
+
const hasSideWidth = !! sideBorder?.width;
|
|
124
|
+
|
|
125
|
+
if (
|
|
126
|
+
! hasBorderStyle &&
|
|
127
|
+
! hasSideStyle &&
|
|
128
|
+
( hasSideColor || hasSideWidth )
|
|
129
|
+
) {
|
|
130
|
+
fallbackBorder[ sideKey ] = { style: 'solid' };
|
|
131
|
+
}
|
|
132
|
+
} );
|
|
133
|
+
|
|
134
|
+
return cleanEmptyObject( { border: cleanEmptyObject( fallbackBorder ) } );
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Generates CSS for a block instance state style object.
|
|
139
|
+
*
|
|
140
|
+
* State declarations need to win over preset utility classes, but fallback
|
|
141
|
+
* border styles should not become important because they must not override
|
|
142
|
+
* explicitly authored default border styles.
|
|
143
|
+
*
|
|
144
|
+
* @param {Object} stateStyles State style object.
|
|
145
|
+
* @param {string} selector CSS selector for the generated style.
|
|
146
|
+
* @return {string} Generated stylesheet.
|
|
147
|
+
*/
|
|
148
|
+
export function getStateStylesCSS( stateStyles, selector ) {
|
|
149
|
+
const css = compileCSS( stateStyles, { selector } );
|
|
150
|
+
const importantCSS = css ? css.replace( /;/g, ' !important;' ) : undefined;
|
|
151
|
+
const fallbackBorderStyles = getStateFallbackBorderStyles( stateStyles );
|
|
152
|
+
const fallbackCSS = fallbackBorderStyles
|
|
153
|
+
? compileCSS( fallbackBorderStyles, { selector } )
|
|
154
|
+
: undefined;
|
|
155
|
+
|
|
156
|
+
return [ importantCSS, fallbackCSS ].filter( Boolean ).join( '\n' );
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
function isPlainObject( value ) {
|
|
160
|
+
return !! value && typeof value === 'object' && ! Array.isArray( value );
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
function mergeStyleObjects( target = {}, source = {} ) {
|
|
164
|
+
const merged = { ...target };
|
|
165
|
+
|
|
166
|
+
Object.entries( source ).forEach( ( [ key, value ] ) => {
|
|
167
|
+
merged[ key ] =
|
|
168
|
+
isPlainObject( value ) && isPlainObject( merged[ key ] )
|
|
169
|
+
? mergeStyleObjects( merged[ key ], value )
|
|
170
|
+
: value;
|
|
171
|
+
} );
|
|
172
|
+
|
|
173
|
+
return merged;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
function addStyleGroup( groups, selector, style ) {
|
|
177
|
+
const key = selector || '';
|
|
178
|
+
const existing = groups.get( key ) || { selector, style: {} };
|
|
179
|
+
|
|
180
|
+
groups.set( key, {
|
|
181
|
+
selector,
|
|
182
|
+
style: mergeStyleObjects( existing.style, style ),
|
|
183
|
+
} );
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
function getStateStyleGroups( stateStyles, name ) {
|
|
187
|
+
const blockSelectors = getBlockType( name )?.selectors || {};
|
|
188
|
+
const groups = new Map();
|
|
189
|
+
|
|
190
|
+
Object.entries( stateStyles || {} ).forEach(
|
|
191
|
+
( [ feature, featureStyles ] ) => {
|
|
192
|
+
const featureSelectors = blockSelectors[ feature ];
|
|
193
|
+
|
|
194
|
+
if ( typeof featureSelectors === 'string' ) {
|
|
195
|
+
addStyleGroup( groups, featureSelectors, {
|
|
196
|
+
[ feature ]: featureStyles,
|
|
197
|
+
} );
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
if (
|
|
202
|
+
isPlainObject( featureSelectors ) &&
|
|
203
|
+
isPlainObject( featureStyles )
|
|
204
|
+
) {
|
|
205
|
+
const remainingStyles = { ...featureStyles };
|
|
206
|
+
|
|
207
|
+
Object.entries( featureSelectors ).forEach(
|
|
208
|
+
( [ subfeature, subfeatureSelector ] ) => {
|
|
209
|
+
if (
|
|
210
|
+
subfeature === 'root' ||
|
|
211
|
+
typeof subfeatureSelector !== 'string' ||
|
|
212
|
+
! Object.hasOwn( featureStyles, subfeature )
|
|
213
|
+
) {
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
addStyleGroup( groups, subfeatureSelector, {
|
|
218
|
+
[ feature ]: {
|
|
219
|
+
[ subfeature ]: featureStyles[ subfeature ],
|
|
220
|
+
},
|
|
221
|
+
} );
|
|
222
|
+
delete remainingStyles[ subfeature ];
|
|
223
|
+
}
|
|
224
|
+
);
|
|
225
|
+
|
|
226
|
+
if ( Object.keys( remainingStyles ).length ) {
|
|
227
|
+
addStyleGroup(
|
|
228
|
+
groups,
|
|
229
|
+
featureSelectors.root || blockSelectors.root,
|
|
230
|
+
{
|
|
231
|
+
[ feature ]: remainingStyles,
|
|
232
|
+
}
|
|
233
|
+
);
|
|
234
|
+
}
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
addStyleGroup( groups, blockSelectors.root, {
|
|
239
|
+
[ feature ]: featureStyles,
|
|
240
|
+
} );
|
|
241
|
+
}
|
|
242
|
+
);
|
|
243
|
+
|
|
244
|
+
return Array.from( groups.values() );
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* Generates CSS for block instance state styles, honoring feature selectors.
|
|
249
|
+
*
|
|
250
|
+
* @param {Object} stateStyles State style object.
|
|
251
|
+
* @param {Object} options Generation options.
|
|
252
|
+
* @param {string} options.name Block name.
|
|
253
|
+
* @param {string} options.baseSelector Block-instance scoping selector.
|
|
254
|
+
* @param {string=} options.state Optional pseudo-state, e.g. ":hover".
|
|
255
|
+
* @return {string|undefined} Generated stylesheet.
|
|
256
|
+
*/
|
|
257
|
+
export function getBlockStateStylesCSS( stateStyles, options ) {
|
|
258
|
+
const { name, baseSelector, state = '' } = options;
|
|
259
|
+
const rules = getStateStyleGroups( stateStyles, name )
|
|
260
|
+
.map( ( { selector: blockSelector, style } ) =>
|
|
261
|
+
getStateStylesCSS(
|
|
262
|
+
style,
|
|
263
|
+
buildScopedBlockSelector( baseSelector, blockSelector, state )
|
|
264
|
+
)
|
|
265
|
+
)
|
|
266
|
+
.filter( Boolean );
|
|
267
|
+
|
|
268
|
+
return rules.length ? rules.join( '\n' ) : undefined;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
/**
|
|
272
|
+
* Returns a style object with nested state/element keys removed.
|
|
273
|
+
*
|
|
274
|
+
* Viewport state objects can contain root declarations alongside nested
|
|
275
|
+
* `elements` and pseudo-state styles. Only root declarations should be passed
|
|
276
|
+
* to the style engine for the viewport root selector.
|
|
277
|
+
*
|
|
278
|
+
* @param {Object} stateStyles Style object for a selected state.
|
|
279
|
+
* @param {string[]} nestedKeys Keys to remove from the root style object.
|
|
280
|
+
* @return {Object|undefined} Root-only style object.
|
|
281
|
+
*/
|
|
282
|
+
function getRootStateStyles( stateStyles, nestedKeys ) {
|
|
283
|
+
if ( ! stateStyles ) {
|
|
284
|
+
return stateStyles;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
const rootStyles = { ...stateStyles };
|
|
288
|
+
nestedKeys.forEach( ( key ) => {
|
|
289
|
+
delete rootStyles[ key ];
|
|
290
|
+
} );
|
|
291
|
+
return rootStyles;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/**
|
|
295
|
+
* Generates CSS rules for supported pseudo-state styles.
|
|
296
|
+
*
|
|
297
|
+
* @param {Object} style Block style object containing pseudo-state styles.
|
|
298
|
+
* @param {string} name Block name.
|
|
299
|
+
* @param {string} baseSelector Base selector used to scope generated CSS.
|
|
300
|
+
* @return {string[]} Generated CSS rule strings.
|
|
301
|
+
*/
|
|
302
|
+
function getPseudoStateCSSRules( style, name, baseSelector ) {
|
|
303
|
+
const validPseudoStates = VALID_BLOCK_PSEUDO_STATES[ name ];
|
|
304
|
+
if ( ! validPseudoStates ) {
|
|
305
|
+
return [];
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
const cssRules = [];
|
|
309
|
+
validPseudoStates.forEach( ( pseudoState ) => {
|
|
310
|
+
const stateStyles = style?.[ pseudoState ];
|
|
311
|
+
if ( stateStyles ) {
|
|
312
|
+
const css = getBlockStateStylesCSS( stateStyles, {
|
|
313
|
+
name,
|
|
314
|
+
baseSelector,
|
|
315
|
+
state: pseudoState,
|
|
316
|
+
} );
|
|
317
|
+
if ( css ) {
|
|
318
|
+
cssRules.push( css );
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
} );
|
|
322
|
+
return cssRules;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
/**
|
|
326
|
+
* Generates CSS rules for responsive block instance style states.
|
|
327
|
+
*
|
|
328
|
+
* Each responsive state can contain root styles, element styles, and nested
|
|
329
|
+
* pseudo-state styles. Generated rules are wrapped in the matching breakpoint
|
|
330
|
+
* media query.
|
|
331
|
+
*
|
|
332
|
+
* @param {Object} style Block style object containing responsive states.
|
|
333
|
+
* @param {string} name Block name.
|
|
334
|
+
* @param {string} baseSelector Base selector used to scope generated CSS.
|
|
335
|
+
* @return {string[]} Generated CSS rule strings.
|
|
336
|
+
*/
|
|
337
|
+
export function getResponsiveStateCSSRules( style, name, baseSelector ) {
|
|
338
|
+
const cssRules = [];
|
|
339
|
+
const validPseudoStates = VALID_BLOCK_PSEUDO_STATES[ name ] ?? [];
|
|
340
|
+
const nestedStateKeys = [ 'elements', ...validPseudoStates ];
|
|
341
|
+
|
|
342
|
+
Object.entries( RESPONSIVE_BREAKPOINTS ).forEach(
|
|
343
|
+
( [ viewport, mediaQuery ] ) => {
|
|
344
|
+
const viewportStyles = style?.[ viewport ];
|
|
345
|
+
if ( ! viewportStyles ) {
|
|
346
|
+
return;
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
const viewportCSSRules = [];
|
|
350
|
+
const rootCSS = getBlockStateStylesCSS(
|
|
351
|
+
getRootStateStyles( viewportStyles, nestedStateKeys ),
|
|
352
|
+
{
|
|
353
|
+
name,
|
|
354
|
+
baseSelector,
|
|
355
|
+
}
|
|
356
|
+
);
|
|
357
|
+
if ( rootCSS ) {
|
|
358
|
+
viewportCSSRules.push( rootCSS );
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
const elementCSS = getElementCSSRules(
|
|
362
|
+
viewportStyles.elements,
|
|
363
|
+
name,
|
|
364
|
+
baseSelector
|
|
365
|
+
);
|
|
366
|
+
if ( elementCSS ) {
|
|
367
|
+
viewportCSSRules.push( elementCSS );
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
viewportCSSRules.push(
|
|
371
|
+
...getPseudoStateCSSRules( viewportStyles, name, baseSelector )
|
|
372
|
+
);
|
|
373
|
+
|
|
374
|
+
if ( viewportCSSRules.length ) {
|
|
375
|
+
cssRules.push(
|
|
376
|
+
`${ mediaQuery }{${ viewportCSSRules.join( '' ) }}`
|
|
377
|
+
);
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
);
|
|
381
|
+
|
|
382
|
+
return cssRules;
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
/**
|
|
386
|
+
* Returns the style value used to force-preview a selected state on canvas.
|
|
387
|
+
*
|
|
388
|
+
* Responsive pseudo states inherit from their default-viewport pseudo state.
|
|
389
|
+
* For example, selecting `mobile + :hover` should preview styles from
|
|
390
|
+
* `:hover`, with `mobile.:hover` values layered on top when present.
|
|
391
|
+
*
|
|
392
|
+
* @param {Object} style Block style object.
|
|
393
|
+
* @param {Object} selectedState Selected block style state.
|
|
394
|
+
* @return {Object|undefined} Style value for the canvas preview.
|
|
395
|
+
*/
|
|
396
|
+
export function getCanvasStateStyleValue( style, selectedState ) {
|
|
397
|
+
const stateValue = getStyleForState( style, selectedState );
|
|
398
|
+
if ( ! hasViewportBlockStyleState( selectedState ) ) {
|
|
399
|
+
return stateValue;
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
const defaultViewportState = {
|
|
403
|
+
...selectedState,
|
|
404
|
+
viewport: DEFAULT_BLOCK_STYLE_STATE.viewport,
|
|
405
|
+
};
|
|
406
|
+
const defaultViewportStateValue = getStyleForState(
|
|
407
|
+
style,
|
|
408
|
+
defaultViewportState
|
|
409
|
+
);
|
|
410
|
+
|
|
411
|
+
if ( defaultViewportStateValue && stateValue ) {
|
|
412
|
+
return mergeGlobalStyles( defaultViewportStateValue, stateValue );
|
|
413
|
+
}
|
|
414
|
+
return stateValue || defaultViewportStateValue;
|
|
415
|
+
}
|
|
416
|
+
|
|
69
417
|
/**
|
|
70
418
|
* Filters registered block settings, extending attributes to include `style` attribute.
|
|
71
419
|
*
|
|
@@ -327,35 +675,107 @@ function BlockStyleControls( {
|
|
|
327
675
|
clientId,
|
|
328
676
|
name,
|
|
329
677
|
setAttributes,
|
|
678
|
+
style,
|
|
330
679
|
__unstableParentLayout,
|
|
331
680
|
} ) {
|
|
332
681
|
const settings = useBlockSettings( name, __unstableParentLayout );
|
|
333
682
|
const blockEditingMode = useBlockEditingMode();
|
|
334
|
-
const
|
|
683
|
+
const { globalBlockStyles, selectedState, showStateOnCanvas } = useSelect(
|
|
684
|
+
( select ) => {
|
|
685
|
+
const blockEditorSelect = select( blockEditorStore );
|
|
686
|
+
const {
|
|
687
|
+
getSelectedBlockStyleState,
|
|
688
|
+
isSelectedBlockStyleStateShownOnCanvas,
|
|
689
|
+
} = unlock( blockEditorSelect );
|
|
690
|
+
const editorSettings = blockEditorSelect.getSettings();
|
|
691
|
+
return {
|
|
692
|
+
globalBlockStyles:
|
|
693
|
+
editorSettings?.[ globalStylesDataKey ]?.blocks?.[ name ],
|
|
694
|
+
selectedState: getSelectedBlockStyleState( clientId ),
|
|
695
|
+
showStateOnCanvas:
|
|
696
|
+
isSelectedBlockStyleStateShownOnCanvas( clientId ),
|
|
697
|
+
};
|
|
698
|
+
},
|
|
699
|
+
[ clientId, name ]
|
|
700
|
+
);
|
|
701
|
+
const isPseudoSelectorState = hasPseudoBlockStyleState( selectedState );
|
|
702
|
+
|
|
703
|
+
// Inject state styles onto the editor canvas so the selected state is
|
|
704
|
+
// visible while editing. Scoped to this block instance via data-block so
|
|
705
|
+
// other blocks of the same type are not affected. Must be called before
|
|
706
|
+
// any early returns because it is a hook.
|
|
707
|
+
const canvasStateCSS = useMemo( () => {
|
|
708
|
+
if ( ! showStateOnCanvas || ! isPseudoSelectorState ) {
|
|
709
|
+
return undefined;
|
|
710
|
+
}
|
|
711
|
+
|
|
712
|
+
const globalStateValue = getCanvasStateStyleValue(
|
|
713
|
+
globalBlockStyles,
|
|
714
|
+
selectedState
|
|
715
|
+
);
|
|
716
|
+
const instanceStateValue = getCanvasStateStyleValue(
|
|
717
|
+
style,
|
|
718
|
+
selectedState
|
|
719
|
+
);
|
|
720
|
+
let stateValue;
|
|
721
|
+
|
|
722
|
+
if ( globalStateValue && instanceStateValue ) {
|
|
723
|
+
stateValue = mergeGlobalStyles(
|
|
724
|
+
globalStateValue,
|
|
725
|
+
instanceStateValue
|
|
726
|
+
);
|
|
727
|
+
} else if ( instanceStateValue ) {
|
|
728
|
+
stateValue = instanceStateValue;
|
|
729
|
+
} else if ( globalStateValue ) {
|
|
730
|
+
stateValue = globalStateValue;
|
|
731
|
+
} else {
|
|
732
|
+
return undefined;
|
|
733
|
+
}
|
|
734
|
+
|
|
735
|
+
return getBlockStateStylesCSS( stateValue, {
|
|
736
|
+
name,
|
|
737
|
+
baseSelector: `[data-block="${ clientId }"]`,
|
|
738
|
+
} );
|
|
739
|
+
}, [
|
|
740
|
+
showStateOnCanvas,
|
|
741
|
+
isPseudoSelectorState,
|
|
742
|
+
globalBlockStyles,
|
|
743
|
+
style,
|
|
744
|
+
selectedState,
|
|
335
745
|
clientId,
|
|
336
746
|
name,
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
typography: {
|
|
341
|
-
...settings.typography,
|
|
342
|
-
// The text alignment UI for individual blocks is rendered in
|
|
343
|
-
// the block toolbar, so disable it here.
|
|
344
|
-
textAlign: false,
|
|
345
|
-
},
|
|
346
|
-
},
|
|
347
|
-
};
|
|
747
|
+
] );
|
|
748
|
+
useStyleOverride( { css: canvasStateCSS } );
|
|
749
|
+
|
|
348
750
|
if ( blockEditingMode !== 'default' ) {
|
|
349
751
|
return null;
|
|
350
752
|
}
|
|
753
|
+
|
|
754
|
+
const panelSettings = {
|
|
755
|
+
...settings,
|
|
756
|
+
typography: {
|
|
757
|
+
...settings.typography,
|
|
758
|
+
// The text alignment UI for individual blocks is rendered in
|
|
759
|
+
// the block toolbar, so disable it here.
|
|
760
|
+
textAlign: false,
|
|
761
|
+
},
|
|
762
|
+
};
|
|
763
|
+
|
|
764
|
+
const passedProps = {
|
|
765
|
+
clientId,
|
|
766
|
+
name,
|
|
767
|
+
setAttributes,
|
|
768
|
+
settings: panelSettings,
|
|
769
|
+
};
|
|
770
|
+
|
|
351
771
|
return (
|
|
352
|
-
|
|
772
|
+
<BlockStyleStateProvider value={ selectedState }>
|
|
353
773
|
<ColorEdit { ...passedProps } />
|
|
354
774
|
<BackgroundImagePanel { ...passedProps } />
|
|
355
775
|
<TypographyPanel { ...passedProps } />
|
|
356
776
|
<BorderPanel { ...passedProps } />
|
|
357
777
|
<DimensionsPanel { ...passedProps } />
|
|
358
|
-
|
|
778
|
+
</BlockStyleStateProvider>
|
|
359
779
|
);
|
|
360
780
|
}
|
|
361
781
|
|
|
@@ -469,11 +889,28 @@ function useBlockProps( { name, style } ) {
|
|
|
469
889
|
const baseElementSelector = `.${ blockElementsContainerIdentifier }`;
|
|
470
890
|
const blockElementStyles = style?.elements;
|
|
471
891
|
|
|
472
|
-
const styles = useMemo(
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
892
|
+
const styles = useMemo( () => {
|
|
893
|
+
const cssRules = [];
|
|
894
|
+
|
|
895
|
+
const elementCSS = getElementCSSRules(
|
|
896
|
+
blockElementStyles,
|
|
897
|
+
name,
|
|
898
|
+
baseElementSelector
|
|
899
|
+
);
|
|
900
|
+
if ( elementCSS ) {
|
|
901
|
+
cssRules.push( elementCSS );
|
|
902
|
+
}
|
|
903
|
+
|
|
904
|
+
cssRules.push(
|
|
905
|
+
...getPseudoStateCSSRules( style, name, baseElementSelector )
|
|
906
|
+
);
|
|
907
|
+
|
|
908
|
+
cssRules.push(
|
|
909
|
+
...getResponsiveStateCSSRules( style, name, baseElementSelector )
|
|
910
|
+
);
|
|
911
|
+
|
|
912
|
+
return cssRules.length > 0 ? cssRules.join( '' ) : undefined;
|
|
913
|
+
}, [ baseElementSelector, blockElementStyles, name, style ] );
|
|
477
914
|
|
|
478
915
|
useStyleOverride( { css: styles } );
|
|
479
916
|
|