react-headless-color-picker 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +251 -0
- package/dist/index.d.mts +2 -25
- package/dist/index.d.ts +2 -25
- package/dist/index.js +216 -270
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +209 -260
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -1,180 +1,18 @@
|
|
|
1
|
-
// src/
|
|
2
|
-
import {
|
|
1
|
+
// src/components/Hue.tsx
|
|
2
|
+
import { memo as memo2 } from "react";
|
|
3
|
+
|
|
4
|
+
// src/utils/clamp.ts
|
|
5
|
+
var clamp = (number, min = 0, max = 1) => {
|
|
6
|
+
return number > max ? max : number < min ? min : number;
|
|
7
|
+
};
|
|
3
8
|
|
|
4
9
|
// src/utils/round.ts
|
|
5
10
|
var round = (number, digits = 0, base = Math.pow(10, digits)) => {
|
|
6
11
|
return Math.round(base * number) / base;
|
|
7
12
|
};
|
|
8
13
|
|
|
9
|
-
// src/
|
|
10
|
-
|
|
11
|
-
grad: 360 / 400,
|
|
12
|
-
turn: 360,
|
|
13
|
-
rad: 360 / (Math.PI * 2)
|
|
14
|
-
};
|
|
15
|
-
var hexToHsva = (hex) => rgbaToHsva(hexToRgba(hex));
|
|
16
|
-
var hexToRgba = (hex) => {
|
|
17
|
-
if (hex[0] === "#") hex = hex.substring(1);
|
|
18
|
-
if (hex.length < 6) {
|
|
19
|
-
return {
|
|
20
|
-
r: parseInt(hex[0] + hex[0], 16),
|
|
21
|
-
g: parseInt(hex[1] + hex[1], 16),
|
|
22
|
-
b: parseInt(hex[2] + hex[2], 16),
|
|
23
|
-
a: hex.length === 4 ? round(parseInt(hex[3] + hex[3], 16) / 255, 2) : 1
|
|
24
|
-
};
|
|
25
|
-
}
|
|
26
|
-
return {
|
|
27
|
-
r: parseInt(hex.substring(0, 2), 16),
|
|
28
|
-
g: parseInt(hex.substring(2, 4), 16),
|
|
29
|
-
b: parseInt(hex.substring(4, 6), 16),
|
|
30
|
-
a: hex.length === 8 ? round(parseInt(hex.substring(6, 8), 16) / 255, 2) : 1
|
|
31
|
-
};
|
|
32
|
-
};
|
|
33
|
-
var parseHue = (value, unit = "deg") => {
|
|
34
|
-
return Number(value) * (angleUnits[unit] || 1);
|
|
35
|
-
};
|
|
36
|
-
var hslaStringToHsva = (hslString) => {
|
|
37
|
-
const matcher2 = /hsla?\(?\s*(-?\d*\.?\d+)(deg|rad|grad|turn)?[,\s]+(-?\d*\.?\d+)%?[,\s]+(-?\d*\.?\d+)%?,?\s*[/\s]*(-?\d*\.?\d+)?(%)?\s*\)?/i;
|
|
38
|
-
const match = matcher2.exec(hslString);
|
|
39
|
-
if (!match) return { h: 0, s: 0, v: 0, a: 1 };
|
|
40
|
-
return hslaToHsva({
|
|
41
|
-
h: parseHue(match[1], match[2]),
|
|
42
|
-
s: Number(match[3]),
|
|
43
|
-
l: Number(match[4]),
|
|
44
|
-
a: match[5] === void 0 ? 1 : Number(match[5]) / (match[6] ? 100 : 1)
|
|
45
|
-
});
|
|
46
|
-
};
|
|
47
|
-
var hslStringToHsva = hslaStringToHsva;
|
|
48
|
-
var hslaToHsva = ({ h, s, l, a }) => {
|
|
49
|
-
s *= (l < 50 ? l : 100 - l) / 100;
|
|
50
|
-
return {
|
|
51
|
-
h,
|
|
52
|
-
s: s > 0 ? 2 * s / (l + s) * 100 : 0,
|
|
53
|
-
v: l + s,
|
|
54
|
-
a
|
|
55
|
-
};
|
|
56
|
-
};
|
|
57
|
-
var hsvaToHex = (hsva) => rgbaToHex(hsvaToRgba(hsva));
|
|
58
|
-
var hsvaToHsla = ({ h, s, v, a }) => {
|
|
59
|
-
const hh = (200 - s) * v / 100;
|
|
60
|
-
return {
|
|
61
|
-
h: round(h),
|
|
62
|
-
s: round(hh > 0 && hh < 200 ? s * v / 100 / (hh <= 100 ? hh : 200 - hh) * 100 : 0),
|
|
63
|
-
l: round(hh / 2),
|
|
64
|
-
a: round(a, 2)
|
|
65
|
-
};
|
|
66
|
-
};
|
|
67
|
-
var hsvaToHslString = (hsva) => {
|
|
68
|
-
const { h, s, l } = hsvaToHsla(hsva);
|
|
69
|
-
return `hsl(${h}, ${s}%, ${l}%)`;
|
|
70
|
-
};
|
|
71
|
-
var hsvaToHsvString = (hsva) => {
|
|
72
|
-
const { h, s, v } = roundHsva(hsva);
|
|
73
|
-
return `hsv(${h}, ${s}%, ${v}%)`;
|
|
74
|
-
};
|
|
75
|
-
var hsvaToHsvaString = (hsva) => {
|
|
76
|
-
const { h, s, v, a } = roundHsva(hsva);
|
|
77
|
-
return `hsva(${h}, ${s}%, ${v}%, ${a})`;
|
|
78
|
-
};
|
|
79
|
-
var hsvaToHslaString = (hsva) => {
|
|
80
|
-
const { h, s, l, a } = hsvaToHsla(hsva);
|
|
81
|
-
return `hsla(${h}, ${s}%, ${l}%, ${a})`;
|
|
82
|
-
};
|
|
83
|
-
var hsvaToRgba = ({ h, s, v, a }) => {
|
|
84
|
-
h = h / 360 * 6;
|
|
85
|
-
s = s / 100;
|
|
86
|
-
v = v / 100;
|
|
87
|
-
const hh = Math.floor(h), b = v * (1 - s), c = v * (1 - (h - hh) * s), d = v * (1 - (1 - h + hh) * s), module = hh % 6;
|
|
88
|
-
return {
|
|
89
|
-
r: round([v, c, b, b, d, v][module] * 255),
|
|
90
|
-
g: round([d, v, v, c, b, b][module] * 255),
|
|
91
|
-
b: round([b, b, d, v, v, c][module] * 255),
|
|
92
|
-
a: round(a, 2)
|
|
93
|
-
};
|
|
94
|
-
};
|
|
95
|
-
var hsvaToRgbString = (hsva) => {
|
|
96
|
-
const { r, g, b } = hsvaToRgba(hsva);
|
|
97
|
-
return `rgb(${r}, ${g}, ${b})`;
|
|
98
|
-
};
|
|
99
|
-
var hsvaToRgbaString = (hsva) => {
|
|
100
|
-
const { r, g, b, a } = hsvaToRgba(hsva);
|
|
101
|
-
return `rgba(${r}, ${g}, ${b}, ${a})`;
|
|
102
|
-
};
|
|
103
|
-
var hsvaStringToHsva = (hsvString) => {
|
|
104
|
-
const matcher2 = /hsva?\(?\s*(-?\d*\.?\d+)(deg|rad|grad|turn)?[,\s]+(-?\d*\.?\d+)%?[,\s]+(-?\d*\.?\d+)%?,?\s*[/\s]*(-?\d*\.?\d+)?(%)?\s*\)?/i;
|
|
105
|
-
const match = matcher2.exec(hsvString);
|
|
106
|
-
if (!match) return { h: 0, s: 0, v: 0, a: 1 };
|
|
107
|
-
return roundHsva({
|
|
108
|
-
h: parseHue(match[1], match[2]),
|
|
109
|
-
s: Number(match[3]),
|
|
110
|
-
v: Number(match[4]),
|
|
111
|
-
a: match[5] === void 0 ? 1 : Number(match[5]) / (match[6] ? 100 : 1)
|
|
112
|
-
});
|
|
113
|
-
};
|
|
114
|
-
var hsvStringToHsva = hsvaStringToHsva;
|
|
115
|
-
var rgbaStringToHsva = (rgbaString) => {
|
|
116
|
-
const matcher2 = /rgba?\(?\s*(-?\d*\.?\d+)(%)?[,\s]+(-?\d*\.?\d+)(%)?[,\s]+(-?\d*\.?\d+)(%)?,?\s*[/\s]*(-?\d*\.?\d+)?(%)?\s*\)?/i;
|
|
117
|
-
const match = matcher2.exec(rgbaString);
|
|
118
|
-
if (!match) return { h: 0, s: 0, v: 0, a: 1 };
|
|
119
|
-
return rgbaToHsva({
|
|
120
|
-
r: Number(match[1]) / (match[2] ? 100 / 255 : 1),
|
|
121
|
-
g: Number(match[3]) / (match[4] ? 100 / 255 : 1),
|
|
122
|
-
b: Number(match[5]) / (match[6] ? 100 / 255 : 1),
|
|
123
|
-
a: match[7] === void 0 ? 1 : Number(match[7]) / (match[8] ? 100 : 1)
|
|
124
|
-
});
|
|
125
|
-
};
|
|
126
|
-
var rgbStringToHsva = rgbaStringToHsva;
|
|
127
|
-
var format = (number) => {
|
|
128
|
-
const hex = number.toString(16);
|
|
129
|
-
return hex.length < 2 ? "0" + hex : hex;
|
|
130
|
-
};
|
|
131
|
-
var rgbaToHex = ({ r, g, b, a }) => {
|
|
132
|
-
const alphaHex = a < 1 ? format(round(a * 255)) : "";
|
|
133
|
-
return "#" + format(r) + format(g) + format(b) + alphaHex;
|
|
134
|
-
};
|
|
135
|
-
var rgbaToHsva = ({ r, g, b, a }) => {
|
|
136
|
-
const max = Math.max(r, g, b);
|
|
137
|
-
const delta = max - Math.min(r, g, b);
|
|
138
|
-
const hh = delta ? max === r ? (g - b) / delta : max === g ? 2 + (b - r) / delta : 4 + (r - g) / delta : 0;
|
|
139
|
-
return {
|
|
140
|
-
h: round(60 * (hh < 0 ? hh + 6 : hh)),
|
|
141
|
-
s: round(max ? delta / max * 100 : 0),
|
|
142
|
-
v: round(max / 255 * 100),
|
|
143
|
-
a
|
|
144
|
-
};
|
|
145
|
-
};
|
|
146
|
-
var roundHsva = (hsva) => ({
|
|
147
|
-
h: round(hsva.h),
|
|
148
|
-
s: round(hsva.s),
|
|
149
|
-
v: round(hsva.v),
|
|
150
|
-
a: round(hsva.a, 2)
|
|
151
|
-
});
|
|
152
|
-
var rgbaToRgb = ({ r, g, b }) => ({ r, g, b });
|
|
153
|
-
var hslaToHsl = ({ h, s, l }) => ({ h, s, l });
|
|
154
|
-
var hsvaToHsv = (hsva) => {
|
|
155
|
-
const { h, s, v } = roundHsva(hsva);
|
|
156
|
-
return { h, s, v };
|
|
157
|
-
};
|
|
158
|
-
var hsvaToHueHsl = (h) => {
|
|
159
|
-
return `hsl(${Math.round(h)}, 100%, 50%)`;
|
|
160
|
-
};
|
|
161
|
-
|
|
162
|
-
// src/utils/compare.ts
|
|
163
|
-
var equalColorObjects = (first, second) => {
|
|
164
|
-
if (first === second) return true;
|
|
165
|
-
for (const prop in first) {
|
|
166
|
-
if (first[prop] !== second[prop])
|
|
167
|
-
return false;
|
|
168
|
-
}
|
|
169
|
-
return true;
|
|
170
|
-
};
|
|
171
|
-
var equalColorString = (first, second) => {
|
|
172
|
-
return first.replace(/\s/g, "") === second.replace(/\s/g, "");
|
|
173
|
-
};
|
|
174
|
-
var equalHex = (first, second) => {
|
|
175
|
-
if (first.toLowerCase() === second.toLowerCase()) return true;
|
|
176
|
-
return equalColorObjects(hexToRgba(first), hexToRgba(second));
|
|
177
|
-
};
|
|
14
|
+
// src/components/Interactive.tsx
|
|
15
|
+
import { memo, useEffect, useMemo, useRef as useRef2 } from "react";
|
|
178
16
|
|
|
179
17
|
// src/hooks/useEventCallback.ts
|
|
180
18
|
import { useRef } from "react";
|
|
@@ -187,41 +25,7 @@ function useEventCallback(handler) {
|
|
|
187
25
|
return fn.current;
|
|
188
26
|
}
|
|
189
27
|
|
|
190
|
-
// src/hooks/useColorManipulation.ts
|
|
191
|
-
function useColorManipulation(colorModel, color, onChange) {
|
|
192
|
-
const onChangeCallback = useEventCallback(onChange);
|
|
193
|
-
const [hsva, updateHsva] = useState(() => colorModel.toHsva(color));
|
|
194
|
-
const cache = useRef2({ color, hsva });
|
|
195
|
-
useEffect(() => {
|
|
196
|
-
if (!colorModel.equal(color, cache.current.color)) {
|
|
197
|
-
const newHsva = colorModel.toHsva(color);
|
|
198
|
-
cache.current = { hsva: newHsva, color };
|
|
199
|
-
updateHsva(newHsva);
|
|
200
|
-
}
|
|
201
|
-
}, [color, colorModel]);
|
|
202
|
-
useEffect(() => {
|
|
203
|
-
let newColor;
|
|
204
|
-
if (!equalColorObjects(hsva, cache.current.hsva) && !colorModel.equal(newColor = colorModel.fromHsva(hsva), cache.current.color)) {
|
|
205
|
-
cache.current = { hsva, color: newColor };
|
|
206
|
-
onChangeCallback(newColor);
|
|
207
|
-
}
|
|
208
|
-
}, [hsva, colorModel, onChangeCallback]);
|
|
209
|
-
const handleChange = useCallback((params) => {
|
|
210
|
-
updateHsva((current) => Object.assign({}, current, params));
|
|
211
|
-
}, []);
|
|
212
|
-
return [hsva, handleChange];
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
// src/components/Hue.tsx
|
|
216
|
-
import { memo as memo2 } from "react";
|
|
217
|
-
|
|
218
|
-
// src/utils/clamp.ts
|
|
219
|
-
var clamp = (number, min = 0, max = 1) => {
|
|
220
|
-
return number > max ? max : number < min ? min : number;
|
|
221
|
-
};
|
|
222
|
-
|
|
223
28
|
// src/components/Interactive.tsx
|
|
224
|
-
import { memo, useEffect as useEffect2, useMemo, useRef as useRef3 } from "react";
|
|
225
29
|
import { jsx } from "react/jsx-runtime";
|
|
226
30
|
var isTouch = (e) => "touches" in e;
|
|
227
31
|
var getParentWindow = (node) => node?.ownerDocument?.defaultView ?? window;
|
|
@@ -244,11 +48,11 @@ var Interactive = memo(function Interactive2({
|
|
|
244
48
|
style,
|
|
245
49
|
...rest
|
|
246
50
|
}) {
|
|
247
|
-
const container =
|
|
51
|
+
const container = useRef2(null);
|
|
248
52
|
const onMoveCallback = useEventCallback(onMove);
|
|
249
53
|
const onKeyCallback = useEventCallback(onKey);
|
|
250
|
-
const touchId =
|
|
251
|
-
const hasTouch =
|
|
54
|
+
const touchId = useRef2(null);
|
|
55
|
+
const hasTouch = useRef2(false);
|
|
252
56
|
const [handleMoveStart, handleKeyDown, toggleDocumentEvents] = useMemo(() => {
|
|
253
57
|
const handleMoveStart2 = ({
|
|
254
58
|
nativeEvent
|
|
@@ -312,7 +116,7 @@ var Interactive = memo(function Interactive2({
|
|
|
312
116
|
}
|
|
313
117
|
return [handleMoveStart2, handleKeyDown2, toggleDocumentEvents2];
|
|
314
118
|
}, [onKeyCallback, onMoveCallback]);
|
|
315
|
-
|
|
119
|
+
useEffect(() => {
|
|
316
120
|
return () => toggleDocumentEvents(false);
|
|
317
121
|
}, [toggleDocumentEvents]);
|
|
318
122
|
return /* @__PURE__ */ jsx(
|
|
@@ -393,6 +197,161 @@ var Hue = memo2(function Hue2({
|
|
|
393
197
|
|
|
394
198
|
// src/components/Saturation.tsx
|
|
395
199
|
import { memo as memo3 } from "react";
|
|
200
|
+
|
|
201
|
+
// src/utils/convert.ts
|
|
202
|
+
var angleUnits = {
|
|
203
|
+
grad: 360 / 400,
|
|
204
|
+
turn: 360,
|
|
205
|
+
rad: 360 / (Math.PI * 2)
|
|
206
|
+
};
|
|
207
|
+
var hexToHsva = (hex) => rgbaToHsva(hexToRgba(hex));
|
|
208
|
+
var hexToRgba = (hex) => {
|
|
209
|
+
if (hex[0] === "#") hex = hex.substring(1);
|
|
210
|
+
if (hex.length < 6) {
|
|
211
|
+
return {
|
|
212
|
+
r: parseInt(hex[0] + hex[0], 16),
|
|
213
|
+
g: parseInt(hex[1] + hex[1], 16),
|
|
214
|
+
b: parseInt(hex[2] + hex[2], 16),
|
|
215
|
+
a: hex.length === 4 ? round(parseInt(hex[3] + hex[3], 16) / 255, 2) : 1
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
return {
|
|
219
|
+
r: parseInt(hex.substring(0, 2), 16),
|
|
220
|
+
g: parseInt(hex.substring(2, 4), 16),
|
|
221
|
+
b: parseInt(hex.substring(4, 6), 16),
|
|
222
|
+
a: hex.length === 8 ? round(parseInt(hex.substring(6, 8), 16) / 255, 2) : 1
|
|
223
|
+
};
|
|
224
|
+
};
|
|
225
|
+
var parseHue = (value, unit = "deg") => {
|
|
226
|
+
return Number(value) * (angleUnits[unit] || 1);
|
|
227
|
+
};
|
|
228
|
+
var hslaStringToHsva = (hslString) => {
|
|
229
|
+
const matcher2 = /hsla?\(?\s*(-?\d*\.?\d+)(deg|rad|grad|turn)?[,\s]+(-?\d*\.?\d+)%?[,\s]+(-?\d*\.?\d+)%?,?\s*[/\s]*(-?\d*\.?\d+)?(%)?\s*\)?/i;
|
|
230
|
+
const match = matcher2.exec(hslString);
|
|
231
|
+
if (!match) return { h: 0, s: 0, v: 0, a: 1 };
|
|
232
|
+
return hslaToHsva({
|
|
233
|
+
h: parseHue(match[1], match[2]),
|
|
234
|
+
s: Number(match[3]),
|
|
235
|
+
l: Number(match[4]),
|
|
236
|
+
a: match[5] === void 0 ? 1 : Number(match[5]) / (match[6] ? 100 : 1)
|
|
237
|
+
});
|
|
238
|
+
};
|
|
239
|
+
var hslStringToHsva = hslaStringToHsva;
|
|
240
|
+
var hslaToHsva = ({ h, s, l, a }) => {
|
|
241
|
+
s *= (l < 50 ? l : 100 - l) / 100;
|
|
242
|
+
return {
|
|
243
|
+
h,
|
|
244
|
+
s: s > 0 ? 2 * s / (l + s) * 100 : 0,
|
|
245
|
+
v: l + s,
|
|
246
|
+
a
|
|
247
|
+
};
|
|
248
|
+
};
|
|
249
|
+
var hsvaToHex = (hsva) => rgbaToHex(hsvaToRgba(hsva));
|
|
250
|
+
var hsvaToHsla = ({ h, s, v, a }) => {
|
|
251
|
+
const hh = (200 - s) * v / 100;
|
|
252
|
+
return {
|
|
253
|
+
h: round(h),
|
|
254
|
+
s: round(hh > 0 && hh < 200 ? s * v / 100 / (hh <= 100 ? hh : 200 - hh) * 100 : 0),
|
|
255
|
+
l: round(hh / 2),
|
|
256
|
+
a: round(a, 2)
|
|
257
|
+
};
|
|
258
|
+
};
|
|
259
|
+
var hsvaToHslString = (hsva) => {
|
|
260
|
+
const { h, s, l } = hsvaToHsla(hsva);
|
|
261
|
+
return `hsl(${h}, ${s}%, ${l}%)`;
|
|
262
|
+
};
|
|
263
|
+
var hsvaToHsvString = (hsva) => {
|
|
264
|
+
const { h, s, v } = roundHsva(hsva);
|
|
265
|
+
return `hsv(${h}, ${s}%, ${v}%)`;
|
|
266
|
+
};
|
|
267
|
+
var hsvaToHsvaString = (hsva) => {
|
|
268
|
+
const { h, s, v, a } = roundHsva(hsva);
|
|
269
|
+
return `hsva(${h}, ${s}%, ${v}%, ${a})`;
|
|
270
|
+
};
|
|
271
|
+
var hsvaToHslaString = (hsva) => {
|
|
272
|
+
const { h, s, l, a } = hsvaToHsla(hsva);
|
|
273
|
+
return `hsla(${h}, ${s}%, ${l}%, ${a})`;
|
|
274
|
+
};
|
|
275
|
+
var hsvaToRgba = ({ h, s, v, a }) => {
|
|
276
|
+
h = h / 360 * 6;
|
|
277
|
+
s = s / 100;
|
|
278
|
+
v = v / 100;
|
|
279
|
+
const hh = Math.floor(h), b = v * (1 - s), c = v * (1 - (h - hh) * s), d = v * (1 - (1 - h + hh) * s), module = hh % 6;
|
|
280
|
+
return {
|
|
281
|
+
r: round([v, c, b, b, d, v][module] * 255),
|
|
282
|
+
g: round([d, v, v, c, b, b][module] * 255),
|
|
283
|
+
b: round([b, b, d, v, v, c][module] * 255),
|
|
284
|
+
a: round(a, 2)
|
|
285
|
+
};
|
|
286
|
+
};
|
|
287
|
+
var hsvaToRgbString = (hsva) => {
|
|
288
|
+
const { r, g, b } = hsvaToRgba(hsva);
|
|
289
|
+
return `rgb(${r}, ${g}, ${b})`;
|
|
290
|
+
};
|
|
291
|
+
var hsvaToRgbaString = (hsva) => {
|
|
292
|
+
const { r, g, b, a } = hsvaToRgba(hsva);
|
|
293
|
+
return `rgba(${r}, ${g}, ${b}, ${a})`;
|
|
294
|
+
};
|
|
295
|
+
var hsvaStringToHsva = (hsvString) => {
|
|
296
|
+
const matcher2 = /hsva?\(?\s*(-?\d*\.?\d+)(deg|rad|grad|turn)?[,\s]+(-?\d*\.?\d+)%?[,\s]+(-?\d*\.?\d+)%?,?\s*[/\s]*(-?\d*\.?\d+)?(%)?\s*\)?/i;
|
|
297
|
+
const match = matcher2.exec(hsvString);
|
|
298
|
+
if (!match) return { h: 0, s: 0, v: 0, a: 1 };
|
|
299
|
+
return roundHsva({
|
|
300
|
+
h: parseHue(match[1], match[2]),
|
|
301
|
+
s: Number(match[3]),
|
|
302
|
+
v: Number(match[4]),
|
|
303
|
+
a: match[5] === void 0 ? 1 : Number(match[5]) / (match[6] ? 100 : 1)
|
|
304
|
+
});
|
|
305
|
+
};
|
|
306
|
+
var hsvStringToHsva = hsvaStringToHsva;
|
|
307
|
+
var rgbaStringToHsva = (rgbaString) => {
|
|
308
|
+
const matcher2 = /rgba?\(?\s*(-?\d*\.?\d+)(%)?[,\s]+(-?\d*\.?\d+)(%)?[,\s]+(-?\d*\.?\d+)(%)?,?\s*[/\s]*(-?\d*\.?\d+)?(%)?\s*\)?/i;
|
|
309
|
+
const match = matcher2.exec(rgbaString);
|
|
310
|
+
if (!match) return { h: 0, s: 0, v: 0, a: 1 };
|
|
311
|
+
return rgbaToHsva({
|
|
312
|
+
r: Number(match[1]) / (match[2] ? 100 / 255 : 1),
|
|
313
|
+
g: Number(match[3]) / (match[4] ? 100 / 255 : 1),
|
|
314
|
+
b: Number(match[5]) / (match[6] ? 100 / 255 : 1),
|
|
315
|
+
a: match[7] === void 0 ? 1 : Number(match[7]) / (match[8] ? 100 : 1)
|
|
316
|
+
});
|
|
317
|
+
};
|
|
318
|
+
var rgbStringToHsva = rgbaStringToHsva;
|
|
319
|
+
var format = (number) => {
|
|
320
|
+
const hex = number.toString(16);
|
|
321
|
+
return hex.length < 2 ? "0" + hex : hex;
|
|
322
|
+
};
|
|
323
|
+
var rgbaToHex = ({ r, g, b, a }) => {
|
|
324
|
+
const alphaHex = a < 1 ? format(round(a * 255)) : "";
|
|
325
|
+
return "#" + format(r) + format(g) + format(b) + alphaHex;
|
|
326
|
+
};
|
|
327
|
+
var rgbaToHsva = ({ r, g, b, a }) => {
|
|
328
|
+
const max = Math.max(r, g, b);
|
|
329
|
+
const delta = max - Math.min(r, g, b);
|
|
330
|
+
const hh = delta ? max === r ? (g - b) / delta : max === g ? 2 + (b - r) / delta : 4 + (r - g) / delta : 0;
|
|
331
|
+
return {
|
|
332
|
+
h: round(60 * (hh < 0 ? hh + 6 : hh)),
|
|
333
|
+
s: round(max ? delta / max * 100 : 0),
|
|
334
|
+
v: round(max / 255 * 100),
|
|
335
|
+
a
|
|
336
|
+
};
|
|
337
|
+
};
|
|
338
|
+
var roundHsva = (hsva) => ({
|
|
339
|
+
h: round(hsva.h),
|
|
340
|
+
s: round(hsva.s),
|
|
341
|
+
v: round(hsva.v),
|
|
342
|
+
a: round(hsva.a, 2)
|
|
343
|
+
});
|
|
344
|
+
var rgbaToRgb = ({ r, g, b }) => ({ r, g, b });
|
|
345
|
+
var hslaToHsl = ({ h, s, l }) => ({ h, s, l });
|
|
346
|
+
var hsvaToHsv = (hsva) => {
|
|
347
|
+
const { h, s, v } = roundHsva(hsva);
|
|
348
|
+
return { h, s, v };
|
|
349
|
+
};
|
|
350
|
+
var hsvaToHueHsl = (h) => {
|
|
351
|
+
return `hsl(${Math.round(h)}, 100%, 50%)`;
|
|
352
|
+
};
|
|
353
|
+
|
|
354
|
+
// src/components/Saturation.tsx
|
|
396
355
|
import { jsx as jsx4 } from "react/jsx-runtime";
|
|
397
356
|
var Saturation = memo3(function Saturation2({
|
|
398
357
|
hsva,
|
|
@@ -474,56 +433,49 @@ var Alpha = memo4(function Alpha2({
|
|
|
474
433
|
);
|
|
475
434
|
});
|
|
476
435
|
|
|
477
|
-
// src/
|
|
478
|
-
import {
|
|
479
|
-
function ColorPicker({
|
|
480
|
-
colorModel,
|
|
481
|
-
color,
|
|
482
|
-
onChange,
|
|
483
|
-
children,
|
|
484
|
-
renderSaturationPointer,
|
|
485
|
-
renderHuePointer,
|
|
486
|
-
...rest
|
|
487
|
-
}) {
|
|
488
|
-
const [hsva, updateHsva] = useColorManipulation(colorModel, color, onChange);
|
|
489
|
-
if (children) {
|
|
490
|
-
return /* @__PURE__ */ jsx6(Fragment, { children: children({ hsva, updateHsva, Saturation, Hue, Alpha, Pointer }) });
|
|
491
|
-
}
|
|
492
|
-
return /* @__PURE__ */ jsxs("div", { ...rest, children: [
|
|
493
|
-
/* @__PURE__ */ jsx6(
|
|
494
|
-
Saturation,
|
|
495
|
-
{
|
|
496
|
-
hsva,
|
|
497
|
-
onChange: updateHsva,
|
|
498
|
-
renderPointer: renderSaturationPointer,
|
|
499
|
-
style: { width: "100%", aspectRatio: "1", borderRadius: "4px 4px 0 0" }
|
|
500
|
-
}
|
|
501
|
-
),
|
|
502
|
-
/* @__PURE__ */ jsx6(
|
|
503
|
-
Hue,
|
|
504
|
-
{
|
|
505
|
-
hue: hsva.h,
|
|
506
|
-
onChange: updateHsva,
|
|
507
|
-
renderPointer: renderHuePointer,
|
|
508
|
-
style: { width: "100%", height: 24, borderRadius: "0 0 4px 4px", marginTop: 4 }
|
|
509
|
-
}
|
|
510
|
-
)
|
|
511
|
-
] });
|
|
512
|
-
}
|
|
436
|
+
// src/hooks/useColorManipulation.ts
|
|
437
|
+
import { useState, useEffect as useEffect2, useCallback, useRef as useRef3 } from "react";
|
|
513
438
|
|
|
514
|
-
// src/
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
439
|
+
// src/utils/compare.ts
|
|
440
|
+
var equalColorObjects = (first, second) => {
|
|
441
|
+
if (first === second) return true;
|
|
442
|
+
for (const prop in first) {
|
|
443
|
+
if (first[prop] !== second[prop])
|
|
444
|
+
return false;
|
|
445
|
+
}
|
|
446
|
+
return true;
|
|
521
447
|
};
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
448
|
+
var equalColorString = (first, second) => {
|
|
449
|
+
return first.replace(/\s/g, "") === second.replace(/\s/g, "");
|
|
450
|
+
};
|
|
451
|
+
var equalHex = (first, second) => {
|
|
452
|
+
if (first.toLowerCase() === second.toLowerCase()) return true;
|
|
453
|
+
return equalColorObjects(hexToRgba(first), hexToRgba(second));
|
|
454
|
+
};
|
|
455
|
+
|
|
456
|
+
// src/hooks/useColorManipulation.ts
|
|
457
|
+
function useColorManipulation(colorModel, color, onChange) {
|
|
458
|
+
const onChangeCallback = useEventCallback(onChange);
|
|
459
|
+
const [hsva, updateHsva] = useState(() => colorModel.toHsva(color));
|
|
460
|
+
const cache = useRef3({ color, hsva });
|
|
461
|
+
useEffect2(() => {
|
|
462
|
+
if (!colorModel.equal(color, cache.current.color)) {
|
|
463
|
+
const newHsva = colorModel.toHsva(color);
|
|
464
|
+
cache.current = { hsva: newHsva, color };
|
|
465
|
+
updateHsva(newHsva);
|
|
466
|
+
}
|
|
467
|
+
}, [color, colorModel]);
|
|
468
|
+
useEffect2(() => {
|
|
469
|
+
let newColor;
|
|
470
|
+
if (!equalColorObjects(hsva, cache.current.hsva) && !colorModel.equal(newColor = colorModel.fromHsva(hsva), cache.current.color)) {
|
|
471
|
+
cache.current = { hsva, color: newColor };
|
|
472
|
+
onChangeCallback(newColor);
|
|
473
|
+
}
|
|
474
|
+
}, [hsva, colorModel, onChangeCallback]);
|
|
475
|
+
const handleChange = useCallback((params) => {
|
|
476
|
+
updateHsva((current) => Object.assign({}, current, params));
|
|
477
|
+
}, []);
|
|
478
|
+
return [hsva, handleChange];
|
|
527
479
|
}
|
|
528
480
|
|
|
529
481
|
// src/utils/validate.ts
|
|
@@ -552,8 +504,6 @@ var setNonce = (hash) => {
|
|
|
552
504
|
var formatClassName = (names) => names.filter(Boolean).join(" ");
|
|
553
505
|
export {
|
|
554
506
|
Alpha,
|
|
555
|
-
ColorPicker,
|
|
556
|
-
HexColorPicker,
|
|
557
507
|
Hue,
|
|
558
508
|
Interactive,
|
|
559
509
|
Pointer,
|
|
@@ -564,7 +514,6 @@ export {
|
|
|
564
514
|
equalHex,
|
|
565
515
|
formatClassName,
|
|
566
516
|
getNonce,
|
|
567
|
-
hexColorModel,
|
|
568
517
|
hexToHsva,
|
|
569
518
|
hexToRgba,
|
|
570
519
|
hslStringToHsva,
|