react-best-gradient-color-picker
Version:
An easy to use color/gradient picker for React.js
159 lines (158 loc) • 7.73 kB
JavaScript
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
if (ar || !(i in from)) {
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
ar[i] = from[i];
}
}
return to.concat(ar || Array.prototype.slice.call(from));
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = PickerContextWrapper;
exports.usePicker = usePicker;
var react_1 = __importStar(require("react"));
var utils_js_1 = require("./utils/utils.js");
var formatters_js_1 = require("./utils/formatters.js");
var tinycolor2_1 = __importDefault(require("tinycolor2"));
var PickerContext = (0, react_1.createContext)(null);
function PickerContextWrapper(_a) {
var _b, _c, _d, _e;
var value = _a.value, children = _a.children, onChange = _a.onChange, isDarkMode = _a.isDarkMode, squareWidth = _a.squareWidth, hideOpacity = _a.hideOpacity, showHexAlpha = _a.showHexAlpha, squareHeight = _a.squareHeight, passedConfig = _a.passedConfig, defaultStyles = _a.defaultStyles, pickerIdSuffix = _a.pickerIdSuffix;
var config = {
barSize: (_b = passedConfig.barSize) !== null && _b !== void 0 ? _b : defaultConfig.barSize,
crossSize: (_c = passedConfig.crossSize) !== null && _c !== void 0 ? _c : defaultConfig.crossSize,
defaultColor: (_d = passedConfig.defaultColor) !== null && _d !== void 0 ? _d : defaultConfig.defaultColor,
defaultGradient: (_e = passedConfig.defaultGradient) !== null && _e !== void 0 ? _e : defaultConfig.defaultGradient,
};
var colors = (0, formatters_js_1.getColors)(value, config.defaultColor, config.defaultGradient);
var _f = (0, utils_js_1.getDetails)(value), degrees = _f.degrees, degreeStr = _f.degreeStr, isGradient = _f.isGradient, gradientType = _f.gradientType;
var _g = (0, utils_js_1.getColorObj)(colors, config.defaultGradient), currentColor = _g.currentColor, selectedColor = _g.selectedColor, currentLeft = _g.currentLeft;
var _h = (0, react_1.useState)('rgb'), inputType = _h[0], setInputType = _h[1];
var _j = (0, react_1.useState)({}), previous = _j[0], setPrevious = _j[1];
var tinyColor = (0, tinycolor2_1.default)(currentColor);
var rgba = tinyColor.toRgb();
var hsv = tinyColor.toHsv();
var _k = (0, react_1.useState)(__assign(__assign({}, rgba), hsv)), hc = _k[0], setHc = _k[1];
(0, react_1.useEffect)(function () {
if ((hsv === null || hsv === void 0 ? void 0 : hsv.s) === 0) {
setHc(__assign(__assign(__assign({}, rgba), hsv), { h: hc === null || hc === void 0 ? void 0 : hc.h }));
}
else {
setHc(__assign(__assign({}, rgba), hsv));
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [currentColor]);
var createGradientStr = function (newColors) {
var sorted = newColors.sort(function (a, b) { return a.left - b.left; });
var colorString = sorted === null || sorted === void 0 ? void 0 : sorted.map(function (cc) { return "".concat(cc === null || cc === void 0 ? void 0 : cc.value, " ").concat(cc.left, "%"); });
var newGrade = "".concat(gradientType, "(").concat(degreeStr, ", ").concat(colorString.join(', '), ")");
setPrevious(__assign(__assign({}, previous), { gradient: newGrade }));
onChange(newGrade);
};
var handleGradient = function (newColor, left) {
var remaining = colors === null || colors === void 0 ? void 0 : colors.filter(function (c) { return !(0, utils_js_1.isUpperCase)(c.value); });
var newColors = __spreadArray([
{ value: newColor.toUpperCase(), left: left !== null && left !== void 0 ? left : currentLeft }
], remaining, true);
createGradientStr(newColors);
};
var handleChange = function (newColor) {
if (isGradient) {
handleGradient(newColor);
}
else {
setPrevious(__assign(__assign({}, previous), { color: newColor }));
onChange(newColor);
}
};
var deletePoint = function () {
if ((colors === null || colors === void 0 ? void 0 : colors.length) > 2) {
var formatted = colors === null || colors === void 0 ? void 0 : colors.map(function (fc, i) { return (__assign(__assign({}, fc), { value: i === selectedColor - 1 ? (0, formatters_js_1.high)(fc) : (0, formatters_js_1.low)(fc) })); });
var remaining = formatted === null || formatted === void 0 ? void 0 : formatted.filter(function (_, i) { return i !== selectedColor; });
createGradientStr(remaining);
}
};
var pickerContext = {
hc: hc,
setHc: setHc,
value: value,
colors: colors,
config: config,
degrees: degrees,
onChange: onChange,
previous: previous,
inputType: inputType,
tinyColor: tinyColor,
isDarkMode: isDarkMode,
isGradient: isGradient,
squareWidth: squareWidth,
hideOpacity: hideOpacity,
currentLeft: currentLeft,
deletePoint: deletePoint,
showHexAlpha: showHexAlpha,
squareHeight: squareHeight,
setInputType: setInputType,
gradientType: gradientType,
handleChange: handleChange,
currentColor: currentColor,
selectedColor: selectedColor,
defaultStyles: defaultStyles,
handleGradient: handleGradient,
pickerIdSuffix: pickerIdSuffix,
createGradientStr: createGradientStr,
};
return (react_1.default.createElement(PickerContext.Provider, { value: pickerContext }, children));
}
function usePicker() {
var pickerContext = (0, react_1.useContext)(PickerContext);
if (!pickerContext) {
throw new Error('usePicker has to be used within <PickerContext.Provider>');
}
return pickerContext;
}
var defaultConfig = {
barSize: 18,
crossSize: 18,
inputSize: 40,
delay: 150,
defaultColor: 'rgba(175, 51, 242, 1)',
defaultGradient: 'linear-gradient(90deg, rgba(2,0,36,1) 0%, rgba(9,9,121,1) 35%, rgba(0,212,255,1) 100%)',
};
;