@wordpress/components
Version:
UI components for WordPress.
160 lines (156 loc) • 5.01 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _clsx = _interopRequireDefault(require("clsx"));
var _compose = require("@wordpress/compose");
var _i18n = require("@wordpress/i18n");
var _element = require("@wordpress/element");
var _circularOptionPickerContext = require("./circular-option-picker-context");
var _composite = require("../composite");
var _circularOptionPickerOption = require("./circular-option-picker-option");
var _circularOptionPickerOptionGroup = require("./circular-option-picker-option-group");
var _circularOptionPickerActions = require("./circular-option-picker-actions");
var _jsxRuntime = require("react/jsx-runtime");
/**
* External dependencies
*/
/**
* WordPress dependencies
*/
/**
* Internal dependencies
*/
/**
*`CircularOptionPicker` is a component that displays a set of options as circular buttons.
*
* ```jsx
* import { CircularOptionPicker } from '../circular-option-picker';
* import { useState } from '@wordpress/element';
*
* const Example = () => {
* const [ currentColor, setCurrentColor ] = useState();
* const colors = [
* { color: '#f00', name: 'Red' },
* { color: '#0f0', name: 'Green' },
* { color: '#00f', name: 'Blue' },
* ];
* const colorOptions = (
* <>
* { colors.map( ( { color, name }, index ) => {
* return (
* <CircularOptionPicker.Option
* key={ `${ color }-${ index }` }
* tooltipText={ name }
* style={ { backgroundColor: color, color } }
* isSelected={ index === currentColor }
* onClick={ () => setCurrentColor( index ) }
* />
* );
* } ) }
* </>
* );
* return (
* <CircularOptionPicker
* options={ colorOptions }
* actions={
* <CircularOptionPicker.ButtonAction
* onClick={ () => setCurrentColor( undefined ) }
* >
* { 'Clear' }
* </CircularOptionPicker.ButtonAction>
* }
* />
* );
* };
* ```
*/function ListboxCircularOptionPicker(props) {
const {
actions,
options,
baseId,
className,
loop = true,
children,
...additionalProps
} = props;
const [activeId, setActiveId] = (0, _element.useState)(undefined);
const contextValue = (0, _element.useMemo)(() => ({
baseId,
activeId,
setActiveId
}), [baseId, activeId, setActiveId]);
return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
className: className,
children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_circularOptionPickerContext.CircularOptionPickerContext.Provider, {
value: contextValue,
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_composite.Composite, {
...additionalProps,
id: baseId,
focusLoop: loop,
rtl: (0, _i18n.isRTL)(),
role: "listbox",
activeId: activeId,
setActiveId: setActiveId,
children: options
}), children, actions]
})
});
}
function ButtonsCircularOptionPicker(props) {
const {
actions,
options,
children,
baseId,
...additionalProps
} = props;
const contextValue = (0, _element.useMemo)(() => ({
baseId
}), [baseId]);
return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
...additionalProps,
role: "group",
id: baseId,
children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_circularOptionPickerContext.CircularOptionPickerContext.Provider, {
value: contextValue,
children: [options, children, actions]
})
});
}
function CircularOptionPicker(props) {
const {
asButtons,
actions: actionsProp,
options: optionsProp,
children,
className,
...additionalProps
} = props;
const baseId = (0, _compose.useInstanceId)(CircularOptionPicker, 'components-circular-option-picker', additionalProps.id);
const OptionPickerImplementation = asButtons ? ButtonsCircularOptionPicker : ListboxCircularOptionPicker;
const actions = actionsProp ? /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
className: "components-circular-option-picker__custom-clear-wrapper",
children: actionsProp
}) : undefined;
const options = /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
className: "components-circular-option-picker__swatches",
children: optionsProp
});
return /*#__PURE__*/(0, _jsxRuntime.jsx)(OptionPickerImplementation, {
...additionalProps,
baseId: baseId,
className: (0, _clsx.default)('components-circular-option-picker', className),
actions: actions,
options: options,
children: children
});
}
CircularOptionPicker.Option = _circularOptionPickerOption.Option;
CircularOptionPicker.OptionGroup = _circularOptionPickerOptionGroup.OptionGroup;
CircularOptionPicker.ButtonAction = _circularOptionPickerActions.ButtonAction;
CircularOptionPicker.DropdownLinkAction = _circularOptionPickerActions.DropdownLinkAction;
var _default = exports.default = CircularOptionPicker;
//# sourceMappingURL=circular-option-picker.js.map