diff --git a/packages/block-editor/README.md b/packages/block-editor/README.md index d82de7b30f70e8..5192a61b220170 100644 --- a/packages/block-editor/README.md +++ b/packages/block-editor/README.md @@ -282,6 +282,14 @@ _Returns_ - `string`: String with the class corresponding to the fontSize passed. The class is generated by appending 'has-' followed by fontSizeSlug in kebabCase and ending with '-font-size'. +# **GradientPicker** + +Undocumented declaration. + +# **GradientPickerControl** + +Undocumented declaration. + # **InnerBlocks** _Related_ diff --git a/packages/block-editor/src/components/gradient-picker/control.js b/packages/block-editor/src/components/gradient-picker/control.js new file mode 100644 index 00000000000000..73609ffdf17e27 --- /dev/null +++ b/packages/block-editor/src/components/gradient-picker/control.js @@ -0,0 +1,35 @@ + +/** + * External dependencies + */ +import classnames from 'classnames'; + +/** + * WordPress dependencies + */ +import { BaseControl } from '@wordpress/components'; +import { __ } from '@wordpress/i18n'; + +/** + * Internal dependencies + */ +import GradientPicker from './'; + +export default function( { className, ...props } ) { + return ( + + + { __( 'Gradient Presets' ) } + + + + ); +} diff --git a/packages/block-editor/src/components/gradient-picker/control.scss b/packages/block-editor/src/components/gradient-picker/control.scss new file mode 100644 index 00000000000000..e73745321e6c93 --- /dev/null +++ b/packages/block-editor/src/components/gradient-picker/control.scss @@ -0,0 +1,4 @@ +.block-editor-gradient-picker-control__gradient-picker-presets { + display: inline-block; + margin-top: 0.6rem; +} diff --git a/packages/block-editor/src/components/gradient-picker/index.js b/packages/block-editor/src/components/gradient-picker/index.js new file mode 100644 index 00000000000000..c9d0257623fd6a --- /dev/null +++ b/packages/block-editor/src/components/gradient-picker/index.js @@ -0,0 +1,24 @@ +/** + * WordPress dependencies + */ +import { GradientPicker } from '@wordpress/components'; +import { useSelect } from '@wordpress/data'; + +function GradientPickerWithGradients( props ) { + const gradients = useSelect( ( select ) => ( + select( 'core/block-editor' ).getSettings().gradients + ) ); + return ( + + ); +} + +export default function( props ) { + const ComponentToUse = props.gradients ? + GradientPicker : + GradientPickerWithGradients; + return ( ); +} diff --git a/packages/block-editor/src/components/index.js b/packages/block-editor/src/components/index.js index 729fe3fd222295..6d9934c5446398 100644 --- a/packages/block-editor/src/components/index.js +++ b/packages/block-editor/src/components/index.js @@ -16,6 +16,8 @@ export { default as BlockVerticalAlignmentToolbar } from './block-vertical-align export { default as ButtonBlockerAppender } from './button-block-appender'; export { default as ColorPalette } from './color-palette'; export { default as ContrastChecker } from './contrast-checker'; +export { default as GradientPicker } from './gradient-picker'; +export { default as GradientPickerControl } from './gradient-picker/control'; export { default as InnerBlocks } from './inner-blocks'; export { default as InspectorAdvancedControls } from './inspector-advanced-controls'; export { default as InspectorControls } from './inspector-controls'; diff --git a/packages/block-editor/src/store/defaults.js b/packages/block-editor/src/store/defaults.js index 2e7cb1f59cb78e..355e80d48809fb 100644 --- a/packages/block-editor/src/store/defaults.js +++ b/packages/block-editor/src/store/defaults.js @@ -150,5 +150,31 @@ export const SETTINGS_DEFAULTS = { __experimentalCanUserUseUnfilteredHTML: false, __experimentalEnableLegacyWidgetBlock: false, __experimentalEnableMenuBlock: false, + gradients: [ + { + name: __( 'Radial pale pink to cyan' ), + gradient: 'radial-gradient(circle, rgba(247,141,167,1) 0%, rgba(6,147,227,1) 100%)', + }, + { + name: __( 'Linear purple to amber' ), + gradient: 'linear-gradient(90deg, rgba(155,81,224,1) 0%, rgba(252,185,0,1) 100%)', + }, + { + name: __( 'Linear red green blue combination' ), + gradient: 'linear-gradient(90deg, rgba(254,143,143,1) 7%, rgba(6,156,112,1) 53%, rgba(0,134,252,1) 99%)', + }, + { + name: __( 'Linear diagonal pink to cyan' ), + gradient: 'linear-gradient(45deg, rgba(247,141,167,1) 0%, rgba(6,147,227,1) 100%)', + }, + { + name: __( 'Vertical green and blue' ), + gradient: 'linear-gradient(0deg, rgba(34,87,195,1) 0%, rgba(253,187,45,1) 100%)', + }, + { + name: __( 'Radial orange and light green' ), + gradient: 'radial-gradient(circle, rgba(255,105,0,1) 0%, rgba(123,220,181,1) 100%)', + }, + ], }; diff --git a/packages/block-editor/src/style.scss b/packages/block-editor/src/style.scss index 644083ea80a810..8f88de5512465b 100644 --- a/packages/block-editor/src/style.scss +++ b/packages/block-editor/src/style.scss @@ -18,6 +18,7 @@ @import "./components/contrast-checker/style.scss"; @import "./components/default-block-appender/style.scss"; @import "./components/font-sizes/style.scss"; +@import "./components/gradient-picker/control.scss"; @import "./components/inner-blocks/style.scss"; @import "./components/inserter-with-shortcuts/style.scss"; @import "./components/inserter/style.scss"; diff --git a/packages/block-library/src/button/block.json b/packages/block-library/src/button/block.json index 9c7f24ea24692a..93f36a517b073f 100644 --- a/packages/block-library/src/button/block.json +++ b/packages/block-library/src/button/block.json @@ -45,6 +45,9 @@ }, "placeholder": { "type": "string" + }, + "gradient": { + "type": "string" } } } diff --git a/packages/block-library/src/button/edit.js b/packages/block-library/src/button/edit.js index b258486b989203..9fc4315262644b 100644 --- a/packages/block-library/src/button/edit.js +++ b/packages/block-library/src/button/edit.js @@ -28,6 +28,7 @@ import { InspectorControls, withColors, PanelColorSettings, + GradientPickerControl, } from '@wordpress/block-editor'; const { getComputedStyle } = window; @@ -105,6 +106,7 @@ class ButtonEdit extends Component { linkTarget, rel, placeholder, + gradient, } = attributes; const linkId = `wp-block-button__inline-link-${ instanceId }`; @@ -118,14 +120,15 @@ class ButtonEdit extends Component { withoutInteractiveFormatting className={ classnames( 'wp-block-button__link', { - 'has-background': backgroundColor.color, - [ backgroundColor.class ]: backgroundColor.class, + 'has-background': backgroundColor.color || gradient, + [ backgroundColor.class ]: ! gradient && backgroundColor.class, 'has-text-color': textColor.color, [ textColor.class ]: textColor.class, } ) } style={ { - backgroundColor: backgroundColor.color, + backgroundColor: ! gradient && backgroundColor.color, + background: gradient, color: textColor.color, } } /> @@ -153,7 +156,10 @@ class ButtonEdit extends Component { colorSettings={ [ { value: backgroundColor.color, - onChange: setBackgroundColor, + onChange: ( newColor ) => { + setAttributes( { gradient: undefined } ); + setBackgroundColor( newColor ); + }, label: __( 'Background Color' ), }, { @@ -175,6 +181,20 @@ class ButtonEdit extends Component { } } /> + + { + setAttributes( { + gradient: newGradient, + backgroundColor: undefined, + customBackgroundColor: undefined, + } ); + } + } + value={ gradient } + /> + onChange( undefined ), + [ onChange ] + ); + const gradientOptions = useMemo( + () => { + return map( gradients, ( { gradient, name } ) => ( + ( onChange( gradient ) ) + } + aria-label={ name ? + // translators: %s: The name of the gradient e.g: "Angular red to blue". + sprintf( __( 'Gradient: %s' ), name ) : + // translators: %s: gradient code e.g: "linear-gradient(90deg, rgba(98,16,153,1) 0%, rgba(172,110,22,1) 100%);". + sprintf( __( 'Gradient code: %s' ), gradient ) + } + /> + ) ); + }, + [ gradients, value, onChange, clearGradient ] + ); + return ( + + { __( 'Clear' ) } + + ) } + /> + ); +} diff --git a/packages/components/src/index.js b/packages/components/src/index.js index 5ce67b968084ea..d13be6e9ac2e30 100644 --- a/packages/components/src/index.js +++ b/packages/components/src/index.js @@ -25,6 +25,7 @@ export { default as FontSizePicker } from './font-size-picker'; export { default as FormFileUpload } from './form-file-upload'; export { default as FormToggle } from './form-toggle'; export { default as FormTokenField } from './form-token-field'; +export { default as GradientPicker } from './gradient-picker'; export { default as Icon } from './icon'; export { default as IconButton } from './icon-button'; export { default as KeyboardShortcuts } from './keyboard-shortcuts';