@wordpress/components
Version:
UI components for WordPress.
178 lines (171 loc) • 5.89 kB
JavaScript
;
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