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';