diff --git a/packages/block-editor/src/components/global-styles/filters-panel.js b/packages/block-editor/src/components/global-styles/filters-panel.js index b630fc4023b1c8..000daf92a8dd59 100644 --- a/packages/block-editor/src/components/global-styles/filters-panel.js +++ b/packages/block-editor/src/components/global-styles/filters-panel.js @@ -1,11 +1,26 @@ +/** + * External dependencies + */ +import classnames from 'classnames'; + /** * WordPress dependencies */ import { __experimentalToolsPanel as ToolsPanel, __experimentalToolsPanelItem as ToolsPanelItem, + __experimentalItemGroup as ItemGroup, + __experimentalHStack as HStack, + __experimentalZStack as ZStack, __experimentalVStack as VStack, + __experimentalDropdownContentWrapper as DropdownContentWrapper, + Button, + ColorIndicator, DuotonePicker, + DuotoneSwatch, + Dropdown, + Flex, + FlexItem, } from '@wordpress/components'; import { __ } from '@wordpress/i18n'; import { useCallback, useMemo } from '@wordpress/element'; @@ -75,6 +90,29 @@ const DEFAULT_CONTROLS = { duotone: true, }; +const popoverProps = { + placement: 'left-start', + offset: 36, + shift: true, + className: 'block-editor-duotone-control__popover', + headerTitle: __( 'Duotone' ), +}; + +const LabeledColorIndicator = ( { indicator, label } ) => ( + + + + { indicator === 'unset' || ! indicator ? ( + + ) : ( + + ) } + + + { label } + +); + export default function FiltersPanel( { as: Wrapper = FiltersToolsPanel, value, @@ -110,6 +148,11 @@ export default function FiltersPanel( { const hasDuotone = () => !! value?.filter?.duotone; const resetDuotone = () => setDuotone( undefined ); + const disableCustomColors = ! settings?.color?.custom; + const disableCustomDuotone = + ! settings?.color?.customDuotone || + ( colorPalette?.length === 0 && disableCustomColors ); + const resetAllFilter = useCallback( ( previousValue ) => { return { ...previousValue, @@ -135,21 +178,51 @@ export default function FiltersPanel( { isShownByDefault={ defaultControls.duotone } panelId={ panelId } > - -

- { __( - 'Create a two-tone color effect without losing your original image.' - ) } -

- -
+ { + const toggleProps = { + onClick: onToggle, + className: classnames( { 'is-open': isOpen } ), + 'aria-expanded': isOpen, + }; + + return ( + + + + ); + } } + renderContent={ () => ( + + +

+ { __( + 'Create a two-tone color effect without losing your original image.' + ) } +

+ +
+
+ ) } + /> ) } diff --git a/packages/block-editor/src/components/global-styles/style.scss b/packages/block-editor/src/components/global-styles/style.scss index bf62586c2b6f07..7e0cb4d8f68ff6 100644 --- a/packages/block-editor/src/components/global-styles/style.scss +++ b/packages/block-editor/src/components/global-styles/style.scss @@ -6,11 +6,12 @@ width: 230px; } +.block-editor-global-styles-filters-panel__dropdown, .block-editor-global-styles-effects-panel__shadow-dropdown { display: block; padding: 0; - > button { + button { width: 100%; padding: $grid-unit-10; diff --git a/packages/block-editor/src/components/inspector-controls-tabs/styles-tab.js b/packages/block-editor/src/components/inspector-controls-tabs/styles-tab.js index 3a7f625d10de26..453b737cfbe3aa 100644 --- a/packages/block-editor/src/components/inspector-controls-tabs/styles-tab.js +++ b/packages/block-editor/src/components/inspector-controls-tabs/styles-tab.js @@ -32,6 +32,7 @@ const StylesTab = ( { blockName, clientId, hasBlockStyles } ) => { label={ __( 'Color' ) } className="color-block-support-panel__inner-wrapper" /> + - { - const maybePreset = getDuotonePresetFromColors( - newDuotone, - duotonePalette - ); - - const newStyle = { - ...style, - color: { - ...style?.color, - duotone: maybePreset ?? newDuotone, // use preset or fallback to custom colors. - }, - }; - setAttributes( { style: newStyle } ); - } } - /> - + <> + + { + const newStyle = { + color: { + ...newDuotone?.filter, + }, + }; + setAttributes( { style: newStyle } ); + } } + settings={ settings } + /> + + + { + const maybePreset = getDuotonePresetFromColors( + newDuotone, + duotonePalette + ); + + const newStyle = { + ...style, + color: { + ...style?.color, + duotone: maybePreset ?? newDuotone, // use preset or fallback to custom colors. + }, + }; + setAttributes( { style: newStyle } ); + } } + settings={ settings } + /> + + ); } diff --git a/packages/block-editor/src/hooks/utils.js b/packages/block-editor/src/hooks/utils.js index 6db0bad2eb64f0..7d22aa998fc5ad 100644 --- a/packages/block-editor/src/hooks/utils.js +++ b/packages/block-editor/src/hooks/utils.js @@ -150,9 +150,14 @@ export function useBlockSettings( name, parentLayout ) { const borderWidth = useSetting( 'border.width' ); const customColorsEnabled = useSetting( 'color.custom' ); const customColors = useSetting( 'color.palette.custom' ); + const customDuotone = useSetting( 'color.customDuotone' ); const themeColors = useSetting( 'color.palette.theme' ); const defaultColors = useSetting( 'color.palette.default' ); const defaultPalette = useSetting( 'color.defaultPalette' ); + const defaultDuotone = useSetting( 'color.defaultDuotone' ); + const userDuotonePalette = useSetting( 'color.duotone.custom' ); + const themeDuotonePalette = useSetting( 'color.duotone.theme' ); + const defaultDuotonePalette = useSetting( 'color.duotone.default' ); const userGradientPalette = useSetting( 'color.gradients.custom' ); const themeGradientPalette = useSetting( 'color.gradients.theme' ); const defaultGradientPalette = useSetting( 'color.gradients.default' ); @@ -175,10 +180,17 @@ export function useBlockSettings( name, parentLayout ) { theme: themeGradientPalette, default: defaultGradientPalette, }, + duotone: { + custom: userDuotonePalette, + theme: themeDuotonePalette, + default: defaultDuotonePalette, + }, defaultGradients, defaultPalette, + defaultDuotone, custom: customColorsEnabled, customGradient: areCustomGradientsEnabled, + customDuotone, background: isBackgroundEnabled, link: isLinkEnabled, text: isTextEnabled, @@ -245,9 +257,14 @@ export function useBlockSettings( name, parentLayout ) { borderWidth, customColorsEnabled, customColors, + customDuotone, themeColors, defaultColors, defaultPalette, + defaultDuotone, + userDuotonePalette, + themeDuotonePalette, + defaultDuotonePalette, userGradientPalette, themeGradientPalette, defaultGradientPalette, diff --git a/packages/edit-site/src/components/global-styles/filters-panel.js b/packages/edit-site/src/components/global-styles/filters-panel.js index 11096efa00f006..f62d6901073f36 100644 --- a/packages/edit-site/src/components/global-styles/filters-panel.js +++ b/packages/edit-site/src/components/global-styles/filters-panel.js @@ -27,7 +27,13 @@ export default function FiltersPanel( { name } ) { inheritedValue={ inheritedStyle } value={ style } onChange={ setStyle } - settings={ settings } + settings={ { + ...settings, + color: { + ...settings.color, + customDuotone: false, //TO FIX: Custom duotone only works on the block level right now + }, + } } /> ); }