Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Color Block Support: Add utilities to retrieve color classes and styles #30869

Merged
merged 1 commit into from
Apr 16, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions packages/block-editor/src/hooks/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,5 @@ import './style';
import './color';
import './font-size';
import './layout';

export { getColorClassesAndStyles, useColorProps } from './use-color-props';
118 changes: 118 additions & 0 deletions packages/block-editor/src/hooks/use-color-props.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
/**
* External dependencies
*/
import classnames from 'classnames';

/**
* Internal dependencies
*/
import { getInlineStyles } from './style';
import {
getColorClassName,
getColorObjectByAttributeValues,
} from '../components/colors';
import {
__experimentalGetGradientClass,
getGradientValueBySlug,
} from '../components/gradients';
import useEditorFeature from '../components/use-editor-feature';

// The code in this file has largely been lifted from the color block support
// hook.
//
// This utility is intended to assist where the serialization of the colors
// block support is being skipped for a block but the color related CSS classes
// & styles still need to be generated so they can be applied to inner elements.

const EMPTY_ARRAY = [];

/**
* Provides the CSS class names and inline styles for a block's color support
* attributes.
*
* @param {Object} attributes Block attributes.
* @return {Object} Color block support derived CSS classes & styles.
*/
export function getColorClassesAndStyles( attributes ) {
const { backgroundColor, textColor, gradient, style } = attributes;

// Collect color CSS classes.
const backgroundClass = getColorClassName(
'background-color',
backgroundColor
);
const textClass = getColorClassName( 'color', textColor );

const gradientClass = __experimentalGetGradientClass( gradient );
const hasGradient = gradientClass || style?.color?.gradient;

// Determine color CSS class name list.
const className = classnames( textClass, gradientClass, {
// Don't apply the background class if there's a gradient.
[ backgroundClass ]: ! hasGradient && !! backgroundClass,
'has-text-color': textColor || style?.color?.text,
'has-background':
backgroundColor ||
style?.color?.background ||
gradient ||
style?.color?.gradient,
'has-link-color': style?.color?.link,
} );

// Collect inline styles for colors.
const colorStyles = style?.color || {};
const styleProp = getInlineStyles( { color: colorStyles } );

return {
className: className || undefined,
style: styleProp,
};
}

/**
* Determines the color related props for a block derived from its color block
* support attributes.
*
* Inline styles are forced for named colors to ensure these selections are
* reflected when themes do not load their color stylesheets in the editor.
*
* @param {Object} attributes Block attributes.
* @return {Object} ClassName & style props from colors block support.
*/
export function useColorProps( attributes ) {
const { backgroundColor, textColor, gradient } = attributes;

const colors = useEditorFeature( 'color.palette' ) || EMPTY_ARRAY;
const gradients = useEditorFeature( 'color.gradients' ) || EMPTY_ARRAY;

const colorProps = getColorClassesAndStyles( attributes );

// Force inline styles to apply colors when themes do not load their color
// stylesheets in the editor.
if ( backgroundColor ) {
const backgroundColorObject = getColorObjectByAttributeValues(
colors,
backgroundColor
);

colorProps.style.backgroundColor = backgroundColorObject.color;
}

if ( gradient ) {
colorProps.style.background = getGradientValueBySlug(
gradients,
gradient
);
}

if ( textColor ) {
const textColorObject = getColorObjectByAttributeValues(
colors,
textColor
);

colorProps.style.color = textColorObject.color;
}

return colorProps;
}
4 changes: 4 additions & 0 deletions packages/block-editor/src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@ import '@wordpress/rich-text';
* Internal dependencies
*/
import './hooks';
export {
getColorClassesAndStyles as __experimentalGetColorClassesAndStyles,
useColorProps as __experimentalUseColorProps,
} from './hooks';
export * from './components';
export * from './utils';
export { storeConfig, store } from './store';
Expand Down