mobile-more
Version:
基于 antd-mobile v5 扩展移动端 UI 组件
281 lines (271 loc) • 11.7 kB
JavaScript
"use strict";
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _react = _interopRequireWildcard(require("react"));
var _ut = require("ut2");
var _classnames = _interopRequireDefault(require("classnames"));
var _rcHooks = require("rc-hooks");
var _antdMobile = require("antd-mobile");
var _tinycolor = _interopRequireDefault(require("tinycolor2"));
var _reactColor = require("@uiw/react-color");
var _config = require("../../config");
require("./index.css");
var prefixCls = "".concat(_config.prefixClass, "-color-picker");
var triggerPrefixCls = "".concat(prefixCls, "-trigger");
var colorBlockPrefixCls = "".concat(prefixCls, "-color-block");
var TRANSPARENT_VALUE = '#00000000';
var TRANSPARENT_TEXT = 'transparent';
var EMPTY_VALUE = TRANSPARENT_VALUE;
var EMPTY_TEXT = 'none';
var COLOR_FORMAT_MAP = {
rgb: 'rgb',
hex: 'hex',
hsl: 'hsl'
};
/**颜色值或对象 */
/**颜色格式 */
var INPUT_TYPE_MAP = {
rgb: _reactColor.ChromeInputType.RGBA,
hex: _reactColor.ChromeInputType.HEXA,
hsl: _reactColor.ChromeInputType.HSLA
};
/**
* 将颜色转换为十六进制文本格式。
*
* @param str 颜色字符串
* @returns 十六进制文本格式的颜色字符串
*/
function toHex8String(str) {
return (0, _reactColor.validHex)(str) ? str : (0, _tinycolor.default)(str).toHex8String(); // 使用 tinycolor 可以处理颜色名称
}
/**
* 将颜色转换为颜色对象。
*
* @param value 颜色值或对象
* @returns 颜色对象
*/
function wrapColor(value) {
if (!value) {
return (0, _reactColor.color)(EMPTY_VALUE);
} else if ((0, _ut.isString)(value)) {
var hex8 = value.toLowerCase() === TRANSPARENT_TEXT ? TRANSPARENT_VALUE : toHex8String(value);
return (0, _reactColor.color)(hex8);
}
return value;
}
/**
* 将颜色转换为十六进制文本格式。
*
* @param color 颜色值或对象
* @returns 十六进制文本格式的颜色字符串
* @example
* colorToHexString('red'); // '#ff0000'
* colorToHexString('rgb(230, 0, 0)'); // '#e60000'
* colorToHexString('rgba(230, 0, 0, 0.5)'); // '#e6000080'
* colorToHexString({ hex: '#e60000', hexa: '#e60000ff', hsva: { ..., a: 1 }, ... }) // '#e60000'
* colorToHexString({ hex: '#e60000', hexa: '#e6000080', hsva: { ..., a: 0.5 }, ... }) // '#e6000080'
*/
function colorToHexString(color) {
var colorRet = wrapColor(color);
return (0, _ut.round)(colorRet.rgba.a, 2) === 1 ? colorRet.hex : colorRet.hexa;
}
/**
* 将颜色转换为 rgb 字符串格式。
*
* 如果透明度不为 1 ,则在 rgb 字符串格式的颜色字符串后添加透明度值。
*
* @param color 颜色值或对象
* @returns rgb 字符串格式的颜色字符串
* @example
* colorToRgbString('red'); // 'rgb(255, 0, 0)'
* colorToRgbString('#e60000'); // 'rgb(230, 0, 0)'
* colorToRgbString('#e6000080'); // 'rgb(230, 0, 0, 0.5)'
* colorToRgbString({ hex: '#e60000', hexa: '#e60000ff', hsva: { ..., a: 1 }, ... }) // 'rgb(230, 0, 0)'
* colorToRgbString({ hex: '#e60000', hexa: '#e6000080', hsva: { ..., a: 0.5 }, ... }) // 'rgba(230, 0, 0, 0.5)'
*/
function colorToRgbString(color) {
var colorRet = wrapColor(color);
var rgbString = (0, _ut.round)(colorRet.rgb.r) + ', ' + (0, _ut.round)(colorRet.rgb.g) + ', ' + (0, _ut.round)(colorRet.rgb.b);
var roundA = (0, _ut.round)(colorRet.rgba.a, 2);
return roundA === 1 ? 'rgb(' + rgbString + ')' : 'rgba(' + rgbString + ', ' + roundA + ')';
}
/**
* 将颜色转换为 hsl 字符串格式。
*
* 如果透明度不为 1 ,则在 hsl 字符串格式的颜色字符串后添加透明度值。
*
* @param color 颜色值或对象
* @returns hsl 字符串格式的颜色字符串
* @example
* colorToHslString('red'); // 'hsl(0, 100%, 50%)'
* colorToHslString('#e60000'); // 'hsl(0, 100%, 45%)'
* colorToHslString('#e6000080'); // 'hsla(0, 100%, 45%, 0.5)'
* colorToHslString({ hex: '#e60000', hexa: '#e60000ff', hsva: { ..., a: 1 }, ... }) // 'hsl(0, 100%, 45%)'
* colorToHslString({ hex: '#e60000', hexa: '#e6000080', hsva: { ..., a: 0.5 }, ... }) // 'hsla(0, 100%, 45%, 0.5)'
*/
function colorToHslString(color) {
var colorRet = wrapColor(color);
var hslString = (0, _ut.round)(colorRet.hsl.h) + ', ' + (0, _ut.round)(colorRet.hsl.s) + '%, ' + (0, _ut.round)(colorRet.hsl.l) + '%';
var roundA = (0, _ut.round)(colorRet.hsla.a, 2);
return roundA === 1 ? 'hsl(' + hslString + ')' : 'hsla(' + hslString + ', ' + roundA + ')';
}
/**
* 将颜色转换为文本格式。
*
* @param color 颜色值或对象
* @param options 选项,选填。
* @param options.format 颜色格式。可选`hex`、`rgb`、`hsl`,默认`hex`。
* @param options.emptyText 空值文本。默认`none`。
* @param options.transparentText 透明文本。默认`transparent`。
* @returns 文本
* @example
*
* // Falsy 值,返回 emptyText
* toText(); // 'none'
* toText(''); // 'none'
* toText('', { emptyText: '未选择' }); // '未选择'
*
* // 'transparent' 返回 transparentText
* toText('transparent'); // 'transparent'
* toText('transparent', { transparentText: '透明' }); // '透明'
*
* // 颜色值为字符串或对象
* toText('red'); // '#ff0000'
* toText('red', { format: 'hsl' }); // 'hsl(0, 100%, 50%)'
* toText('#e6000080', { format: 'hsl' }); // 'hsla(0, 100%, 45%, 0.5)'
*
* const color1 = { hex: '#e60000', hexa: '#e60000ff', hsva: { ..., a: 1 }, ... };
* toText(color1); // '#e60000'
* toText(color1, { format: 'rgb' }); // 'rgb(230, 0, 0)'
* toText(color1, { format: 'hsl' }); // 'hsl(0, 100%, 45%)'
*
* const color2 = { hex: '#e60000', hexa: '#e6000080', hsva: { ..., a: 0.5 }, ... };
* toText(color2); // '#e6000080'
* toText(color2, { format: 'rgb' }); // 'rgba(230, 0, 0, 0.5)'
* toText(color2, { format: 'hsl' }); // 'hsla(0, 100%, 45%, 0.5)'
*/
function toText(value) {
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var _options$format = options.format,
format = _options$format === void 0 ? COLOR_FORMAT_MAP.hex : _options$format,
_options$emptyText = options.emptyText,
emptyText = _options$emptyText === void 0 ? EMPTY_TEXT : _options$emptyText,
_options$transparentT = options.transparentText,
transparentText = _options$transparentT === void 0 ? TRANSPARENT_TEXT : _options$transparentT;
if (!value) {
return emptyText;
}
if ((0, _ut.isString)(value) && value.toLowerCase() === TRANSPARENT_TEXT) {
return transparentText;
}
if (format === COLOR_FORMAT_MAP.rgb) {
return colorToRgbString(value);
}
if (format === COLOR_FORMAT_MAP.hsl) {
return colorToHslString(value);
}
return colorToHexString(value);
}
var BizColorPicker = function BizColorPicker(props) {
var _props$format = props.format,
format = _props$format === void 0 ? COLOR_FORMAT_MAP.hex : _props$format,
showText = props.showText,
readOnly = props.readOnly,
disabled = props.disabled,
children = props.children,
_props$emptyText = props.emptyText,
emptyText = _props$emptyText === void 0 ? EMPTY_TEXT : _props$emptyText,
_props$transparentTex = props.transparentText,
transparentText = _props$transparentTex === void 0 ? TRANSPARENT_TEXT : _props$transparentTex,
className = props.className,
style = props.style,
_props$placement = props.placement,
placement = _props$placement === void 0 ? 'bottom-start' : _props$placement,
popoverProps = props.popoverProps,
showAlpha = props.showAlpha,
chromeProps = props.chromeProps;
var _useControllableValue = (0, _rcHooks.useControllableValue)(props),
_useControllableValue2 = (0, _slicedToArray2.default)(_useControllableValue, 2),
value = _useControllableValue2[0],
setValue = _useControllableValue2[1];
var _useControllableValue3 = (0, _rcHooks.useControllableValue)(props, {
valuePropName: 'visible',
defaultValue: false,
defaultValuePropName: 'defaultVisible',
trigger: 'onVisibleChange'
}),
_useControllableValue4 = (0, _slicedToArray2.default)(_useControllableValue3, 2),
visible = _useControllableValue4[0],
setVisible = _useControllableValue4[1];
var _useMemo = (0, _react.useMemo)(function () {
var colorRet = wrapColor(value);
var valueIsTransparent = (0, _ut.isString)(value) && value.toLowerCase() === TRANSPARENT_TEXT;
return {
colorResult: colorRet,
colorValue: valueIsTransparent || !value ? (0, _objectSpread2.default)((0, _objectSpread2.default)({}, colorRet.hsva), {}, {
a: 1
}) : colorRet.hsva,
colorBlock: colorToRgbString(colorRet)
};
}, [value]),
colorResult = _useMemo.colorResult,
colorValue = _useMemo.colorValue,
colorBlock = _useMemo.colorBlock;
return /*#__PURE__*/_react.default.createElement(_antdMobile.Popover, (0, _extends2.default)({
content: /*#__PURE__*/_react.default.createElement(_reactColor.Chrome, (0, _extends2.default)({
showAlpha: showAlpha,
inputType: INPUT_TYPE_MAP[format]
}, chromeProps, {
style: (0, _objectSpread2.default)({
'--github-border': 'none',
'--github-box-shadow': 'none'
}, chromeProps === null || chromeProps === void 0 ? void 0 : chromeProps.style),
color: colorValue,
onChange: function onChange(v) {
setValue(v, colorToRgbString(v));
},
showTriangle: false
})),
trigger: "click",
placement: placement,
destroyOnHide: true,
className: (0, _classnames.default)(prefixCls, popoverProps === null || popoverProps === void 0 ? void 0 : popoverProps.className)
}, popoverProps, {
visible: visible,
onVisibleChange: function onVisibleChange(v) {
if (!disabled && !readOnly) {
setVisible(v);
}
}
}), children || /*#__PURE__*/_react.default.createElement("div", {
className: (0, _classnames.default)("".concat(triggerPrefixCls), (0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)({}, "".concat(triggerPrefixCls, "-active"), visible), "".concat(triggerPrefixCls, "-disabled"), disabled), "".concat(triggerPrefixCls, "-read"), readOnly), "".concat(triggerPrefixCls, "-empty"), !value), className),
style: style
}, /*#__PURE__*/_react.default.createElement("div", {
className: "".concat(colorBlockPrefixCls)
}, /*#__PURE__*/_react.default.createElement("div", {
className: "".concat(colorBlockPrefixCls, "-inner"),
style: {
background: colorBlock
}
})), showText && /*#__PURE__*/_react.default.createElement("div", {
className: "".concat(prefixCls, "-text")
}, (0, _ut.isBoolean)(showText) ? toText(value, {
format: format,
emptyText: emptyText,
transparentText: transparentText
}) : showText(colorResult, value))));
};
BizColorPicker.color = wrapColor;
BizColorPicker.colorToHexString = colorToHexString;
BizColorPicker.colorToRgbString = colorToRgbString;
BizColorPicker.colorToHslString = colorToHslString;
BizColorPicker.toText = toText;
var _default = exports.default = BizColorPicker;