@grafana/ui
Version:
Grafana Components Library
90 lines (84 loc) • 2.86 kB
JavaScript
;
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);
;
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