So I have a problem with building block that has background-color attribute and the user can change it using ColorPalette component.
When creating a custom block in gutenberg we need 2 functions inside of registerBlockType: save and edit.
I'm using inline CSS to generate correct styles for each block. Here is my edit() function:
edit: ( { attributes, setAttributes } ) => {
/*
some code
*/
const [ isHover, setIsHover ] = useState( false );
const handleMouseEnter = () => {
setIsHover( true );
};
const handleMouseLeave = () => {
setIsHover( false );
};
return <div { ...blockProps }>
<InspectorControls key="settings" group="styles">
// controls are here
</InspectorControls>
<InnerBlocks />
<button style={ {
backgroundColor: isHover ? attributes.btnBgColorHover : attributes.btnBgColor,
color: isHover ? attributes.btnTextColorHover : attributes.btnTextColor } }
onMouseEnter={ handleMouseEnter } onMouseLeave={ handleMouseLeave }>
<span class="material-symbols-outlined">
expand_more
</span>
</button>
</div>
}
as you can see I'm using isHover state and onMouseEnter and onMouseLeave to set the correct color selected by the user. And now I can't use it in save function because content rendered by save function does not support things like onClick, onMouseEnter, onMouseLeave etc (even if I define these inside of save, gutenberg just renders the element using content returned by save).
save: ( { attributes } ) => {
return <div { ...blockProps }>
<InnerBlocks.Content />
<button style={ {
backgroundColor: isHover ? attributes.btnBgColorHover : attributes.btnBgColor,
color: isHover ? attributes.btnTextColorHover : attributes.btnTextColor } }
onMouseEnter={ handleMouseEnter } onMouseLeave={ handleMouseLeave }>
<span class="material-symbols-outlined">
expand_more
</span>
</button>
</div>
}
How to build a block with background color on hover (or just a color on hover) so the user will be able to change it?
So! If you want to allow users to choose the color on hover state you do not need any onMouseEnter & onMouseLeave events.
All I had to do was to declare CSS variables in inline styles and use these variables in external CSS sheets.
and then in external CSS (scss used here):