UNPKG

@grafana/ui

Version:
90 lines (84 loc) 2.86 kB
'use strict'; var jsxRuntime = require('react/jsx-runtime'); var css = require('@emotion/css'); var lodash = require('lodash'); var React = require('react'); var tinycolor = require('tinycolor2'); var ThemeContext = require('../../themes/ThemeContext.cjs'); var Input = require('../Input/Input.cjs'); function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; } var tinycolor__default = /*#__PURE__*/_interopDefaultCompat(tinycolor); "use strict"; const ColorInput = React.forwardRef( ({ color, onChange, isClearable = false, onClick, onBlur, disabled, buttonAriaLabel, ...inputProps }, ref) => { const [value, setValue] = React.useState(color); const [previousColor, setPreviousColor] = React.useState(color); const updateColor = React.useMemo(() => lodash.debounce(onChange, 100), []); React.useEffect(() => { const newColor = tinycolor__default.default(color); if (newColor.isValid() && color !== previousColor) { setValue(newColor.toString()); setPreviousColor(color); } }, [color, previousColor]); const onChangeColor = (event) => { const { value: colorValue } = event.currentTarget; setValue(colorValue); if (colorValue === "" && isClearable) { updateColor(colorValue); return; } const newColor = tinycolor__default.default(colorValue); if (newColor.isValid()) { updateColor(newColor.toString()); } }; const onBlurInput = (event) => { const newColor = tinycolor__default.default(value); if (!newColor.isValid()) { setValue(color); } onBlur == null ? void 0 : onBlur(event); }; return /* @__PURE__ */ jsxRuntime.jsx( Input.Input, { ...inputProps, value, onChange: onChangeColor, disabled, onClick, onBlur: onBlurInput, addonBefore: /* @__PURE__ */ jsxRuntime.jsx(ColorPreview, { onClick, ariaLabel: buttonAriaLabel, disabled, color }), ref } ); } ); ColorInput.displayName = "ColorInput"; const ColorPreview = ({ color, onClick, disabled, ariaLabel }) => { const styles = ThemeContext.useStyles2(getColorPreviewStyles); return /* @__PURE__ */ jsxRuntime.jsx( "button", { type: "button", onClick, "aria-label": ariaLabel, disabled: disabled || !onClick, className: css.cx( styles, css.css({ backgroundColor: color }) ) } ); }; const getColorPreviewStyles = (theme) => css.css({ height: "100%", width: `${theme.spacing.gridSize * 4}px`, borderRadius: `${theme.shape.radius.default} 0 0 ${theme.shape.radius.default}`, border: `1px solid ${theme.colors.border.medium}` }); module.exports = ColorInput; //# sourceMappingURL=ColorInput.cjs.map