UNPKG

@wordpress/components

Version:
178 lines (171 loc) 5.89 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.CustomGradientPicker = CustomGradientPicker; exports.default = void 0; var _i18n = require("@wordpress/i18n"); var _anglePickerControl = _interopRequireDefault(require("../angle-picker-control")); var _gradientBar = _interopRequireDefault(require("./gradient-bar")); var _flex = require("../flex"); var _selectControl = _interopRequireDefault(require("../select-control")); var _vStack = require("../v-stack"); var _utils = require("./utils"); var _serializer = require("./serializer"); var _constants = require("./constants"); var _customGradientPickerStyles = require("./styles/custom-gradient-picker-styles"); var _jsxRuntime = require("react/jsx-runtime"); /** * External dependencies */ /** * WordPress dependencies */ /** * Internal dependencies */ const GradientAnglePicker = ({ gradientAST, hasGradient, onChange }) => { var _gradientAST$orientat; const angle = (_gradientAST$orientat = gradientAST?.orientation?.value) !== null && _gradientAST$orientat !== void 0 ? _gradientAST$orientat : _constants.DEFAULT_LINEAR_GRADIENT_ANGLE; const onAngleChange = newAngle => { onChange((0, _serializer.serializeGradient)({ ...gradientAST, orientation: { type: 'angular', value: `${newAngle}` } })); }; return /*#__PURE__*/(0, _jsxRuntime.jsx)(_anglePickerControl.default, { onChange: onAngleChange, value: hasGradient ? angle : '' }); }; const GradientTypePicker = ({ gradientAST, hasGradient, onChange }) => { const { type } = gradientAST; const onSetLinearGradient = () => { onChange((0, _serializer.serializeGradient)({ ...gradientAST, orientation: gradientAST.orientation ? undefined : _constants.HORIZONTAL_GRADIENT_ORIENTATION, type: 'linear-gradient' })); }; const onSetRadialGradient = () => { const { orientation, ...restGradientAST } = gradientAST; onChange((0, _serializer.serializeGradient)({ ...restGradientAST, type: 'radial-gradient' })); }; const handleOnChange = next => { if (next === 'linear-gradient') { onSetLinearGradient(); } if (next === 'radial-gradient') { onSetRadialGradient(); } }; return /*#__PURE__*/(0, _jsxRuntime.jsx)(_selectControl.default, { __nextHasNoMarginBottom: true, className: "components-custom-gradient-picker__type-picker", label: (0, _i18n.__)('Type'), labelPosition: "top", onChange: handleOnChange, options: _constants.GRADIENT_OPTIONS, size: "__unstable-large", value: hasGradient ? type : undefined }); }; /** * CustomGradientPicker is a React component that renders a UI for specifying * linear or radial gradients. Radial gradients are displayed in the picker as * a slice of the gradient from the center to the outside. * * ```jsx * import { CustomGradientPicker } from '@wordpress/components'; * import { useState } from '@wordpress/element'; * * const MyCustomGradientPicker = () => { * const [ gradient, setGradient ] = useState(); * * return ( * <CustomGradientPicker * value={ gradient } * onChange={ setGradient } * /> * ); * }; * ``` */ function CustomGradientPicker({ value, onChange, enableAlpha = true, __experimentalIsRenderedInSidebar = false }) { const { gradientAST, hasGradient } = (0, _utils.getGradientAstWithDefault)(value); // On radial gradients the bar should display a linear gradient. // On radial gradients the bar represents a slice of the gradient from the center until the outside. // On liner gradients the bar represents the color stops from left to right independently of the angle. const background = (0, _utils.getLinearGradientRepresentation)(gradientAST); // Control points color option may be hex from presets, custom colors will be rgb. // The position should always be a percentage. const controlPoints = gradientAST.colorStops.map(colorStop => { return { color: (0, _utils.getStopCssColor)(colorStop), // Although it's already been checked by `hasUnsupportedLength` in `getGradientAstWithDefault`, // TypeScript doesn't know that `colorStop.length` is not undefined here. // @ts-expect-error position: parseInt(colorStop.length.value) }; }); return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_vStack.VStack, { spacing: 4, className: "components-custom-gradient-picker", children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_gradientBar.default, { __experimentalIsRenderedInSidebar: __experimentalIsRenderedInSidebar, disableAlpha: !enableAlpha, background: background, hasGradient: hasGradient, value: controlPoints, onChange: newControlPoints => { onChange((0, _serializer.serializeGradient)((0, _utils.getGradientAstWithControlPoints)(gradientAST, newControlPoints))); } }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_flex.Flex, { gap: 3, className: "components-custom-gradient-picker__ui-line", children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_customGradientPickerStyles.SelectWrapper, { children: /*#__PURE__*/(0, _jsxRuntime.jsx)(GradientTypePicker, { gradientAST: gradientAST, hasGradient: hasGradient, onChange: onChange }) }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_customGradientPickerStyles.AccessoryWrapper, { children: gradientAST.type === 'linear-gradient' && /*#__PURE__*/(0, _jsxRuntime.jsx)(GradientAnglePicker, { gradientAST: gradientAST, hasGradient: hasGradient, onChange: onChange }) })] })] }); } var _default = exports.default = CustomGradientPicker; //# sourceMappingURL=index.js.map