UNPKG

@gechiui/components

Version:
175 lines (165 loc) 4.92 kB
import _extends from "@babel/runtime/helpers/esm/extends"; import { createElement } from "@gechiui/element"; /** * External dependencies */ import { map } from 'lodash'; import { colord, extend } from 'colord'; import namesPlugin from 'colord/plugins/names'; import a11yPlugin from 'colord/plugins/a11y'; import classnames from 'classnames'; /** * GeChiUI dependencies */ import { __, sprintf } from '@gechiui/i18n'; import { useCallback, useMemo } from '@gechiui/element'; /** * Internal dependencies */ import Dropdown from '../dropdown'; import { ColorPicker } from '../color-picker'; import CircularOptionPicker from '../circular-option-picker'; import { VStack } from '../v-stack'; import { ColorHeading } from './styles'; extend([namesPlugin, a11yPlugin]); function SinglePalette(_ref) { let { className, clearColor, colors, onChange, value, actions } = _ref; const colorOptions = useMemo(() => { return map(colors, _ref2 => { let { color, name } = _ref2; const colordColor = colord(color); return createElement(CircularOptionPicker.Option, { key: color, isSelected: value === color, selectedIconProps: value === color ? { fill: colordColor.contrast() > colordColor.contrast('#000') ? '#fff' : '#000' } : {}, tooltipText: name || // translators: %s: color hex code e.g: "#f00". sprintf(__('颜色代码:%s'), color), style: { backgroundColor: color, color }, onClick: value === color ? clearColor : () => onChange(color), "aria-label": name ? // translators: %s: The name of the color e.g: "vivid red". sprintf(__('颜色:%s'), name) : // translators: %s: color hex code e.g: "#f00". sprintf(__('颜色代码:%s'), color) }); }); }, [colors, value, onChange, clearColor]); return createElement(CircularOptionPicker, { className: className, options: colorOptions, actions: actions }); } function MultiplePalettes(_ref3) { let { className, clearColor, colors, onChange, value, actions } = _ref3; return createElement(VStack, { spacing: 3, className: className }, colors.map((_ref4, index) => { let { name, colors: colorPalette } = _ref4; return createElement(VStack, { spacing: 2, key: index }, createElement(ColorHeading, null, name), createElement(SinglePalette, { clearColor: clearColor, colors: colorPalette, onChange: onChange, value: value, actions: colors.length === index + 1 ? actions : null })); })); } export function CustomColorPickerDropdown(_ref5) { let { isRenderedInSidebar, ...props } = _ref5; return createElement(Dropdown, _extends({ contentClassName: classnames('components-color-palette__custom-color-dropdown-content', { 'is-rendered-in-sidebar': isRenderedInSidebar }) }, props)); } export default function ColorPalette(_ref6) { let { clearable = true, className, colors, disableCustomColors = false, enableAlpha, onChange, value, __experimentalHasMultipleOrigins = false, __experimentalIsRenderedInSidebar = false } = _ref6; const clearColor = useCallback(() => onChange(undefined), [onChange]); const Component = __experimentalHasMultipleOrigins && colors !== null && colors !== void 0 && colors.length ? MultiplePalettes : SinglePalette; const renderCustomColorPicker = () => createElement(ColorPicker, { color: value, onChange: color => onChange(color), enableAlpha: enableAlpha }); let dropdownPosition; if (__experimentalIsRenderedInSidebar) { dropdownPosition = 'bottom left'; } const colordColor = colord(value); return createElement(VStack, { spacing: 3, className: className }, !disableCustomColors && createElement(CustomColorPickerDropdown, { position: dropdownPosition, isRenderedInSidebar: __experimentalIsRenderedInSidebar, renderContent: renderCustomColorPicker, renderToggle: _ref7 => { let { isOpen, onToggle } = _ref7; return createElement("button", { className: "components-color-palette__custom-color", "aria-expanded": isOpen, "aria-haspopup": "true", onClick: onToggle, "aria-label": __('自定义颜色选择器'), style: { background: value, color: colordColor.contrast() > colordColor.contrast('#000') ? '#fff' : '#000' } }, value); } }), createElement(Component, { clearable: clearable, clearColor: clearColor, colors: colors, onChange: onChange, value: value, actions: !!clearable && createElement(CircularOptionPicker.ButtonAction, { onClick: clearColor }, __('清除')) })); } //# sourceMappingURL=index.js.map