react-headless-color-picker 1.0.0
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/LICENSE +21 -0
- package/README.md +1 -0
- package/dist/index.d.mts +163 -0
- package/dist/index.d.ts +163 -0
- package/dist/index.js +671 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +600 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +45 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,671 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/index.ts
|
|
21
|
+
var index_exports = {};
|
|
22
|
+
__export(index_exports, {
|
|
23
|
+
Alpha: () => Alpha,
|
|
24
|
+
ColorPicker: () => ColorPicker,
|
|
25
|
+
HexColorPicker: () => HexColorPicker,
|
|
26
|
+
Hue: () => Hue,
|
|
27
|
+
Interactive: () => Interactive,
|
|
28
|
+
Pointer: () => Pointer,
|
|
29
|
+
Saturation: () => Saturation,
|
|
30
|
+
clamp: () => clamp,
|
|
31
|
+
equalColorObjects: () => equalColorObjects,
|
|
32
|
+
equalColorString: () => equalColorString,
|
|
33
|
+
equalHex: () => equalHex,
|
|
34
|
+
formatClassName: () => formatClassName,
|
|
35
|
+
getNonce: () => getNonce,
|
|
36
|
+
hexColorModel: () => hexColorModel,
|
|
37
|
+
hexToHsva: () => hexToHsva,
|
|
38
|
+
hexToRgba: () => hexToRgba,
|
|
39
|
+
hslStringToHsva: () => hslStringToHsva,
|
|
40
|
+
hslaStringToHsva: () => hslaStringToHsva,
|
|
41
|
+
hslaToHsl: () => hslaToHsl,
|
|
42
|
+
hslaToHsva: () => hslaToHsva,
|
|
43
|
+
hsvStringToHsva: () => hsvStringToHsva,
|
|
44
|
+
hsvaStringToHsva: () => hsvaStringToHsva,
|
|
45
|
+
hsvaToHex: () => hsvaToHex,
|
|
46
|
+
hsvaToHslString: () => hsvaToHslString,
|
|
47
|
+
hsvaToHsla: () => hsvaToHsla,
|
|
48
|
+
hsvaToHslaString: () => hsvaToHslaString,
|
|
49
|
+
hsvaToHsv: () => hsvaToHsv,
|
|
50
|
+
hsvaToHsvString: () => hsvaToHsvString,
|
|
51
|
+
hsvaToHsvaString: () => hsvaToHsvaString,
|
|
52
|
+
hsvaToHueHsl: () => hsvaToHueHsl,
|
|
53
|
+
hsvaToRgbString: () => hsvaToRgbString,
|
|
54
|
+
hsvaToRgba: () => hsvaToRgba,
|
|
55
|
+
hsvaToRgbaString: () => hsvaToRgbaString,
|
|
56
|
+
parseHue: () => parseHue,
|
|
57
|
+
rgbStringToHsva: () => rgbStringToHsva,
|
|
58
|
+
rgbaStringToHsva: () => rgbaStringToHsva,
|
|
59
|
+
rgbaToHex: () => rgbaToHex,
|
|
60
|
+
rgbaToHsva: () => rgbaToHsva,
|
|
61
|
+
rgbaToRgb: () => rgbaToRgb,
|
|
62
|
+
round: () => round,
|
|
63
|
+
roundHsva: () => roundHsva,
|
|
64
|
+
setNonce: () => setNonce,
|
|
65
|
+
useColorManipulation: () => useColorManipulation,
|
|
66
|
+
useEventCallback: () => useEventCallback,
|
|
67
|
+
validHex: () => validHex
|
|
68
|
+
});
|
|
69
|
+
module.exports = __toCommonJS(index_exports);
|
|
70
|
+
|
|
71
|
+
// src/hooks/useColorManipulation.ts
|
|
72
|
+
var import_react2 = require("react");
|
|
73
|
+
|
|
74
|
+
// src/utils/round.ts
|
|
75
|
+
var round = (number, digits = 0, base = Math.pow(10, digits)) => {
|
|
76
|
+
return Math.round(base * number) / base;
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
// src/utils/convert.ts
|
|
80
|
+
var angleUnits = {
|
|
81
|
+
grad: 360 / 400,
|
|
82
|
+
turn: 360,
|
|
83
|
+
rad: 360 / (Math.PI * 2)
|
|
84
|
+
};
|
|
85
|
+
var hexToHsva = (hex) => rgbaToHsva(hexToRgba(hex));
|
|
86
|
+
var hexToRgba = (hex) => {
|
|
87
|
+
if (hex[0] === "#") hex = hex.substring(1);
|
|
88
|
+
if (hex.length < 6) {
|
|
89
|
+
return {
|
|
90
|
+
r: parseInt(hex[0] + hex[0], 16),
|
|
91
|
+
g: parseInt(hex[1] + hex[1], 16),
|
|
92
|
+
b: parseInt(hex[2] + hex[2], 16),
|
|
93
|
+
a: hex.length === 4 ? round(parseInt(hex[3] + hex[3], 16) / 255, 2) : 1
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
return {
|
|
97
|
+
r: parseInt(hex.substring(0, 2), 16),
|
|
98
|
+
g: parseInt(hex.substring(2, 4), 16),
|
|
99
|
+
b: parseInt(hex.substring(4, 6), 16),
|
|
100
|
+
a: hex.length === 8 ? round(parseInt(hex.substring(6, 8), 16) / 255, 2) : 1
|
|
101
|
+
};
|
|
102
|
+
};
|
|
103
|
+
var parseHue = (value, unit = "deg") => {
|
|
104
|
+
return Number(value) * (angleUnits[unit] || 1);
|
|
105
|
+
};
|
|
106
|
+
var hslaStringToHsva = (hslString) => {
|
|
107
|
+
const matcher2 = /hsla?\(?\s*(-?\d*\.?\d+)(deg|rad|grad|turn)?[,\s]+(-?\d*\.?\d+)%?[,\s]+(-?\d*\.?\d+)%?,?\s*[/\s]*(-?\d*\.?\d+)?(%)?\s*\)?/i;
|
|
108
|
+
const match = matcher2.exec(hslString);
|
|
109
|
+
if (!match) return { h: 0, s: 0, v: 0, a: 1 };
|
|
110
|
+
return hslaToHsva({
|
|
111
|
+
h: parseHue(match[1], match[2]),
|
|
112
|
+
s: Number(match[3]),
|
|
113
|
+
l: Number(match[4]),
|
|
114
|
+
a: match[5] === void 0 ? 1 : Number(match[5]) / (match[6] ? 100 : 1)
|
|
115
|
+
});
|
|
116
|
+
};
|
|
117
|
+
var hslStringToHsva = hslaStringToHsva;
|
|
118
|
+
var hslaToHsva = ({ h, s, l, a }) => {
|
|
119
|
+
s *= (l < 50 ? l : 100 - l) / 100;
|
|
120
|
+
return {
|
|
121
|
+
h,
|
|
122
|
+
s: s > 0 ? 2 * s / (l + s) * 100 : 0,
|
|
123
|
+
v: l + s,
|
|
124
|
+
a
|
|
125
|
+
};
|
|
126
|
+
};
|
|
127
|
+
var hsvaToHex = (hsva) => rgbaToHex(hsvaToRgba(hsva));
|
|
128
|
+
var hsvaToHsla = ({ h, s, v, a }) => {
|
|
129
|
+
const hh = (200 - s) * v / 100;
|
|
130
|
+
return {
|
|
131
|
+
h: round(h),
|
|
132
|
+
s: round(hh > 0 && hh < 200 ? s * v / 100 / (hh <= 100 ? hh : 200 - hh) * 100 : 0),
|
|
133
|
+
l: round(hh / 2),
|
|
134
|
+
a: round(a, 2)
|
|
135
|
+
};
|
|
136
|
+
};
|
|
137
|
+
var hsvaToHslString = (hsva) => {
|
|
138
|
+
const { h, s, l } = hsvaToHsla(hsva);
|
|
139
|
+
return `hsl(${h}, ${s}%, ${l}%)`;
|
|
140
|
+
};
|
|
141
|
+
var hsvaToHsvString = (hsva) => {
|
|
142
|
+
const { h, s, v } = roundHsva(hsva);
|
|
143
|
+
return `hsv(${h}, ${s}%, ${v}%)`;
|
|
144
|
+
};
|
|
145
|
+
var hsvaToHsvaString = (hsva) => {
|
|
146
|
+
const { h, s, v, a } = roundHsva(hsva);
|
|
147
|
+
return `hsva(${h}, ${s}%, ${v}%, ${a})`;
|
|
148
|
+
};
|
|
149
|
+
var hsvaToHslaString = (hsva) => {
|
|
150
|
+
const { h, s, l, a } = hsvaToHsla(hsva);
|
|
151
|
+
return `hsla(${h}, ${s}%, ${l}%, ${a})`;
|
|
152
|
+
};
|
|
153
|
+
var hsvaToRgba = ({ h, s, v, a }) => {
|
|
154
|
+
h = h / 360 * 6;
|
|
155
|
+
s = s / 100;
|
|
156
|
+
v = v / 100;
|
|
157
|
+
const hh = Math.floor(h), b = v * (1 - s), c = v * (1 - (h - hh) * s), d = v * (1 - (1 - h + hh) * s), module2 = hh % 6;
|
|
158
|
+
return {
|
|
159
|
+
r: round([v, c, b, b, d, v][module2] * 255),
|
|
160
|
+
g: round([d, v, v, c, b, b][module2] * 255),
|
|
161
|
+
b: round([b, b, d, v, v, c][module2] * 255),
|
|
162
|
+
a: round(a, 2)
|
|
163
|
+
};
|
|
164
|
+
};
|
|
165
|
+
var hsvaToRgbString = (hsva) => {
|
|
166
|
+
const { r, g, b } = hsvaToRgba(hsva);
|
|
167
|
+
return `rgb(${r}, ${g}, ${b})`;
|
|
168
|
+
};
|
|
169
|
+
var hsvaToRgbaString = (hsva) => {
|
|
170
|
+
const { r, g, b, a } = hsvaToRgba(hsva);
|
|
171
|
+
return `rgba(${r}, ${g}, ${b}, ${a})`;
|
|
172
|
+
};
|
|
173
|
+
var hsvaStringToHsva = (hsvString) => {
|
|
174
|
+
const matcher2 = /hsva?\(?\s*(-?\d*\.?\d+)(deg|rad|grad|turn)?[,\s]+(-?\d*\.?\d+)%?[,\s]+(-?\d*\.?\d+)%?,?\s*[/\s]*(-?\d*\.?\d+)?(%)?\s*\)?/i;
|
|
175
|
+
const match = matcher2.exec(hsvString);
|
|
176
|
+
if (!match) return { h: 0, s: 0, v: 0, a: 1 };
|
|
177
|
+
return roundHsva({
|
|
178
|
+
h: parseHue(match[1], match[2]),
|
|
179
|
+
s: Number(match[3]),
|
|
180
|
+
v: Number(match[4]),
|
|
181
|
+
a: match[5] === void 0 ? 1 : Number(match[5]) / (match[6] ? 100 : 1)
|
|
182
|
+
});
|
|
183
|
+
};
|
|
184
|
+
var hsvStringToHsva = hsvaStringToHsva;
|
|
185
|
+
var rgbaStringToHsva = (rgbaString) => {
|
|
186
|
+
const matcher2 = /rgba?\(?\s*(-?\d*\.?\d+)(%)?[,\s]+(-?\d*\.?\d+)(%)?[,\s]+(-?\d*\.?\d+)(%)?,?\s*[/\s]*(-?\d*\.?\d+)?(%)?\s*\)?/i;
|
|
187
|
+
const match = matcher2.exec(rgbaString);
|
|
188
|
+
if (!match) return { h: 0, s: 0, v: 0, a: 1 };
|
|
189
|
+
return rgbaToHsva({
|
|
190
|
+
r: Number(match[1]) / (match[2] ? 100 / 255 : 1),
|
|
191
|
+
g: Number(match[3]) / (match[4] ? 100 / 255 : 1),
|
|
192
|
+
b: Number(match[5]) / (match[6] ? 100 / 255 : 1),
|
|
193
|
+
a: match[7] === void 0 ? 1 : Number(match[7]) / (match[8] ? 100 : 1)
|
|
194
|
+
});
|
|
195
|
+
};
|
|
196
|
+
var rgbStringToHsva = rgbaStringToHsva;
|
|
197
|
+
var format = (number) => {
|
|
198
|
+
const hex = number.toString(16);
|
|
199
|
+
return hex.length < 2 ? "0" + hex : hex;
|
|
200
|
+
};
|
|
201
|
+
var rgbaToHex = ({ r, g, b, a }) => {
|
|
202
|
+
const alphaHex = a < 1 ? format(round(a * 255)) : "";
|
|
203
|
+
return "#" + format(r) + format(g) + format(b) + alphaHex;
|
|
204
|
+
};
|
|
205
|
+
var rgbaToHsva = ({ r, g, b, a }) => {
|
|
206
|
+
const max = Math.max(r, g, b);
|
|
207
|
+
const delta = max - Math.min(r, g, b);
|
|
208
|
+
const hh = delta ? max === r ? (g - b) / delta : max === g ? 2 + (b - r) / delta : 4 + (r - g) / delta : 0;
|
|
209
|
+
return {
|
|
210
|
+
h: round(60 * (hh < 0 ? hh + 6 : hh)),
|
|
211
|
+
s: round(max ? delta / max * 100 : 0),
|
|
212
|
+
v: round(max / 255 * 100),
|
|
213
|
+
a
|
|
214
|
+
};
|
|
215
|
+
};
|
|
216
|
+
var roundHsva = (hsva) => ({
|
|
217
|
+
h: round(hsva.h),
|
|
218
|
+
s: round(hsva.s),
|
|
219
|
+
v: round(hsva.v),
|
|
220
|
+
a: round(hsva.a, 2)
|
|
221
|
+
});
|
|
222
|
+
var rgbaToRgb = ({ r, g, b }) => ({ r, g, b });
|
|
223
|
+
var hslaToHsl = ({ h, s, l }) => ({ h, s, l });
|
|
224
|
+
var hsvaToHsv = (hsva) => {
|
|
225
|
+
const { h, s, v } = roundHsva(hsva);
|
|
226
|
+
return { h, s, v };
|
|
227
|
+
};
|
|
228
|
+
var hsvaToHueHsl = (h) => {
|
|
229
|
+
return `hsl(${Math.round(h)}, 100%, 50%)`;
|
|
230
|
+
};
|
|
231
|
+
|
|
232
|
+
// src/utils/compare.ts
|
|
233
|
+
var equalColorObjects = (first, second) => {
|
|
234
|
+
if (first === second) return true;
|
|
235
|
+
for (const prop in first) {
|
|
236
|
+
if (first[prop] !== second[prop])
|
|
237
|
+
return false;
|
|
238
|
+
}
|
|
239
|
+
return true;
|
|
240
|
+
};
|
|
241
|
+
var equalColorString = (first, second) => {
|
|
242
|
+
return first.replace(/\s/g, "") === second.replace(/\s/g, "");
|
|
243
|
+
};
|
|
244
|
+
var equalHex = (first, second) => {
|
|
245
|
+
if (first.toLowerCase() === second.toLowerCase()) return true;
|
|
246
|
+
return equalColorObjects(hexToRgba(first), hexToRgba(second));
|
|
247
|
+
};
|
|
248
|
+
|
|
249
|
+
// src/hooks/useEventCallback.ts
|
|
250
|
+
var import_react = require("react");
|
|
251
|
+
function useEventCallback(handler) {
|
|
252
|
+
const callbackRef = (0, import_react.useRef)(handler);
|
|
253
|
+
const fn = (0, import_react.useRef)((value) => {
|
|
254
|
+
callbackRef.current && callbackRef.current(value);
|
|
255
|
+
});
|
|
256
|
+
callbackRef.current = handler;
|
|
257
|
+
return fn.current;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
// src/hooks/useColorManipulation.ts
|
|
261
|
+
function useColorManipulation(colorModel, color, onChange) {
|
|
262
|
+
const onChangeCallback = useEventCallback(onChange);
|
|
263
|
+
const [hsva, updateHsva] = (0, import_react2.useState)(() => colorModel.toHsva(color));
|
|
264
|
+
const cache = (0, import_react2.useRef)({ color, hsva });
|
|
265
|
+
(0, import_react2.useEffect)(() => {
|
|
266
|
+
if (!colorModel.equal(color, cache.current.color)) {
|
|
267
|
+
const newHsva = colorModel.toHsva(color);
|
|
268
|
+
cache.current = { hsva: newHsva, color };
|
|
269
|
+
updateHsva(newHsva);
|
|
270
|
+
}
|
|
271
|
+
}, [color, colorModel]);
|
|
272
|
+
(0, import_react2.useEffect)(() => {
|
|
273
|
+
let newColor;
|
|
274
|
+
if (!equalColorObjects(hsva, cache.current.hsva) && !colorModel.equal(newColor = colorModel.fromHsva(hsva), cache.current.color)) {
|
|
275
|
+
cache.current = { hsva, color: newColor };
|
|
276
|
+
onChangeCallback(newColor);
|
|
277
|
+
}
|
|
278
|
+
}, [hsva, colorModel, onChangeCallback]);
|
|
279
|
+
const handleChange = (0, import_react2.useCallback)((params) => {
|
|
280
|
+
updateHsva((current) => Object.assign({}, current, params));
|
|
281
|
+
}, []);
|
|
282
|
+
return [hsva, handleChange];
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
// src/components/Hue.tsx
|
|
286
|
+
var import_react4 = require("react");
|
|
287
|
+
|
|
288
|
+
// src/utils/clamp.ts
|
|
289
|
+
var clamp = (number, min = 0, max = 1) => {
|
|
290
|
+
return number > max ? max : number < min ? min : number;
|
|
291
|
+
};
|
|
292
|
+
|
|
293
|
+
// src/components/Interactive.tsx
|
|
294
|
+
var import_react3 = require("react");
|
|
295
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
296
|
+
var isTouch = (e) => "touches" in e;
|
|
297
|
+
var getParentWindow = (node) => node?.ownerDocument?.defaultView ?? window;
|
|
298
|
+
var getRelativePosition = (node, event, touchId) => {
|
|
299
|
+
const rect = node.getBoundingClientRect();
|
|
300
|
+
const pointer = isTouch(event) ? Array.from(event.touches).find((t) => t.identifier === touchId) ?? event.touches[0] : event;
|
|
301
|
+
return {
|
|
302
|
+
left: clamp(
|
|
303
|
+
(pointer.pageX - (rect.left + getParentWindow(node).pageXOffset)) / rect.width
|
|
304
|
+
),
|
|
305
|
+
top: clamp(
|
|
306
|
+
(pointer.pageY - (rect.top + getParentWindow(node).pageYOffset)) / rect.height
|
|
307
|
+
)
|
|
308
|
+
};
|
|
309
|
+
};
|
|
310
|
+
var Interactive = (0, import_react3.memo)(function Interactive2({
|
|
311
|
+
onMove,
|
|
312
|
+
onKey,
|
|
313
|
+
children,
|
|
314
|
+
style,
|
|
315
|
+
...rest
|
|
316
|
+
}) {
|
|
317
|
+
const container = (0, import_react3.useRef)(null);
|
|
318
|
+
const onMoveCallback = useEventCallback(onMove);
|
|
319
|
+
const onKeyCallback = useEventCallback(onKey);
|
|
320
|
+
const touchId = (0, import_react3.useRef)(null);
|
|
321
|
+
const hasTouch = (0, import_react3.useRef)(false);
|
|
322
|
+
const [handleMoveStart, handleKeyDown, toggleDocumentEvents] = (0, import_react3.useMemo)(() => {
|
|
323
|
+
const handleMoveStart2 = ({
|
|
324
|
+
nativeEvent
|
|
325
|
+
}) => {
|
|
326
|
+
const el = container.current;
|
|
327
|
+
if (!el) return;
|
|
328
|
+
if (!isTouch(nativeEvent)) nativeEvent.preventDefault();
|
|
329
|
+
if (hasTouch.current && !isTouch(nativeEvent)) return;
|
|
330
|
+
if (isTouch(nativeEvent)) {
|
|
331
|
+
hasTouch.current = true;
|
|
332
|
+
touchId.current = nativeEvent.changedTouches?.[0]?.identifier ?? null;
|
|
333
|
+
}
|
|
334
|
+
el.focus();
|
|
335
|
+
onMoveCallback(
|
|
336
|
+
getRelativePosition(el, nativeEvent, touchId.current)
|
|
337
|
+
);
|
|
338
|
+
toggleDocumentEvents2(true);
|
|
339
|
+
};
|
|
340
|
+
const handleMove = (event) => {
|
|
341
|
+
if (!isTouch(event)) event.preventDefault();
|
|
342
|
+
const isDown = isTouch(event) ? event.touches.length > 0 : event.buttons > 0;
|
|
343
|
+
if (isDown && container.current) {
|
|
344
|
+
onMoveCallback(
|
|
345
|
+
getRelativePosition(
|
|
346
|
+
container.current,
|
|
347
|
+
event,
|
|
348
|
+
touchId.current
|
|
349
|
+
)
|
|
350
|
+
);
|
|
351
|
+
} else {
|
|
352
|
+
toggleDocumentEvents2(false);
|
|
353
|
+
}
|
|
354
|
+
};
|
|
355
|
+
const handleMoveEnd = () => {
|
|
356
|
+
hasTouch.current = false;
|
|
357
|
+
touchId.current = null;
|
|
358
|
+
toggleDocumentEvents2(false);
|
|
359
|
+
};
|
|
360
|
+
const handleKeyDown2 = (event) => {
|
|
361
|
+
const k = event.key;
|
|
362
|
+
if (!["ArrowLeft", "ArrowRight", "ArrowUp", "ArrowDown"].includes(k)) {
|
|
363
|
+
return;
|
|
364
|
+
}
|
|
365
|
+
event.preventDefault();
|
|
366
|
+
onKeyCallback({
|
|
367
|
+
left: k === "ArrowRight" ? 0.05 : k === "ArrowLeft" ? -0.05 : 0,
|
|
368
|
+
top: k === "ArrowDown" ? 0.05 : k === "ArrowUp" ? -0.05 : 0
|
|
369
|
+
});
|
|
370
|
+
};
|
|
371
|
+
function toggleDocumentEvents2(state) {
|
|
372
|
+
const el = container.current;
|
|
373
|
+
const win = getParentWindow(el);
|
|
374
|
+
const method = state ? win.addEventListener.bind(win) : win.removeEventListener.bind(win);
|
|
375
|
+
if (hasTouch.current) {
|
|
376
|
+
method("touchmove", handleMove);
|
|
377
|
+
method("touchend", handleMoveEnd);
|
|
378
|
+
} else {
|
|
379
|
+
method("mousemove", handleMove);
|
|
380
|
+
method("mouseup", handleMoveEnd);
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
return [handleMoveStart2, handleKeyDown2, toggleDocumentEvents2];
|
|
384
|
+
}, [onKeyCallback, onMoveCallback]);
|
|
385
|
+
(0, import_react3.useEffect)(() => {
|
|
386
|
+
return () => toggleDocumentEvents(false);
|
|
387
|
+
}, [toggleDocumentEvents]);
|
|
388
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
389
|
+
"div",
|
|
390
|
+
{
|
|
391
|
+
...rest,
|
|
392
|
+
ref: container,
|
|
393
|
+
onMouseDown: handleMoveStart,
|
|
394
|
+
onTouchStart: handleMoveStart,
|
|
395
|
+
onKeyDown: handleKeyDown,
|
|
396
|
+
tabIndex: 0,
|
|
397
|
+
role: "slider",
|
|
398
|
+
style: {
|
|
399
|
+
position: "relative",
|
|
400
|
+
cursor: "crosshair",
|
|
401
|
+
outline: "none",
|
|
402
|
+
...style
|
|
403
|
+
},
|
|
404
|
+
children
|
|
405
|
+
}
|
|
406
|
+
);
|
|
407
|
+
});
|
|
408
|
+
|
|
409
|
+
// src/components/Pointer.tsx
|
|
410
|
+
var import_jsx_runtime2 = require("react/jsx-runtime");
|
|
411
|
+
var Pointer = function Pointer2({
|
|
412
|
+
left,
|
|
413
|
+
top = 0.5,
|
|
414
|
+
children,
|
|
415
|
+
style,
|
|
416
|
+
...rest
|
|
417
|
+
}) {
|
|
418
|
+
return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
419
|
+
"div",
|
|
420
|
+
{
|
|
421
|
+
...rest,
|
|
422
|
+
style: {
|
|
423
|
+
position: "absolute",
|
|
424
|
+
left: `${left * 100}%`,
|
|
425
|
+
top: `${top * 100}%`,
|
|
426
|
+
transform: "translate(-50%, -50%)",
|
|
427
|
+
...style
|
|
428
|
+
},
|
|
429
|
+
children
|
|
430
|
+
}
|
|
431
|
+
);
|
|
432
|
+
};
|
|
433
|
+
|
|
434
|
+
// src/components/Hue.tsx
|
|
435
|
+
var import_jsx_runtime3 = require("react/jsx-runtime");
|
|
436
|
+
var Hue = (0, import_react4.memo)(function Hue2({
|
|
437
|
+
hue,
|
|
438
|
+
onChange,
|
|
439
|
+
renderPointer,
|
|
440
|
+
style,
|
|
441
|
+
...rest
|
|
442
|
+
}) {
|
|
443
|
+
const handleMove = ({ left }) => onChange({ h: 360 * left });
|
|
444
|
+
const handleKey = ({ left }) => onChange({ h: clamp(hue + left * 360, 0, 360) });
|
|
445
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
446
|
+
Interactive,
|
|
447
|
+
{
|
|
448
|
+
onMove: handleMove,
|
|
449
|
+
onKey: handleKey,
|
|
450
|
+
"aria-label": "Hue",
|
|
451
|
+
"aria-valuenow": round(hue),
|
|
452
|
+
"aria-valuemax": 360,
|
|
453
|
+
"aria-valuemin": 0,
|
|
454
|
+
style: {
|
|
455
|
+
background: "linear-gradient(to right, #f00 0%, #ff0 17%, #0f0 33%, #0ff 50%, #00f 67%, #f0f 83%, #f00 100%)",
|
|
456
|
+
...style
|
|
457
|
+
},
|
|
458
|
+
...rest,
|
|
459
|
+
children: renderPointer ? renderPointer({ left: hue / 360, top: 0.5, hue }) : /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Pointer, { left: hue / 360 })
|
|
460
|
+
}
|
|
461
|
+
);
|
|
462
|
+
});
|
|
463
|
+
|
|
464
|
+
// src/components/Saturation.tsx
|
|
465
|
+
var import_react5 = require("react");
|
|
466
|
+
var import_jsx_runtime4 = require("react/jsx-runtime");
|
|
467
|
+
var Saturation = (0, import_react5.memo)(function Saturation2({
|
|
468
|
+
hsva,
|
|
469
|
+
onChange,
|
|
470
|
+
style,
|
|
471
|
+
renderPointer,
|
|
472
|
+
...rest
|
|
473
|
+
}) {
|
|
474
|
+
const handleMove = ({ left, top }) => onChange({ s: left * 100, v: 100 - top * 100 });
|
|
475
|
+
const handleKey = ({ left, top }) => onChange({
|
|
476
|
+
s: clamp(hsva.s + left * 100, 0, 100),
|
|
477
|
+
v: clamp(hsva.v - top * 100, 0, 100)
|
|
478
|
+
});
|
|
479
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
480
|
+
Interactive,
|
|
481
|
+
{
|
|
482
|
+
onMove: handleMove,
|
|
483
|
+
onKey: handleKey,
|
|
484
|
+
"aria-label": "Color",
|
|
485
|
+
"aria-valuetext": `Saturation ${round(hsva.s)}%, Brightness ${round(hsva.v)}%`,
|
|
486
|
+
style: {
|
|
487
|
+
width: "100%",
|
|
488
|
+
height: "100%",
|
|
489
|
+
background: `
|
|
490
|
+
linear-gradient(to top, #000, transparent),
|
|
491
|
+
linear-gradient(to right, #fff, transparent),
|
|
492
|
+
${hsvaToHueHsl(hsva.h)}
|
|
493
|
+
`,
|
|
494
|
+
...style
|
|
495
|
+
},
|
|
496
|
+
...rest,
|
|
497
|
+
children: renderPointer ? renderPointer({ left: hsva.s / 100, top: 1 - hsva.v / 100, hsva }) : /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Pointer, { left: hsva.s / 100, top: 1 - hsva.v / 100 })
|
|
498
|
+
}
|
|
499
|
+
);
|
|
500
|
+
});
|
|
501
|
+
|
|
502
|
+
// src/components/Alpha.tsx
|
|
503
|
+
var import_react6 = require("react");
|
|
504
|
+
var import_jsx_runtime5 = require("react/jsx-runtime");
|
|
505
|
+
var Alpha = (0, import_react6.memo)(function Alpha2({
|
|
506
|
+
hsva,
|
|
507
|
+
onChange,
|
|
508
|
+
renderPointer,
|
|
509
|
+
style,
|
|
510
|
+
...rest
|
|
511
|
+
}) {
|
|
512
|
+
const handleMove = ({ left }) => onChange({ a: left });
|
|
513
|
+
const handleKey = ({ left }) => onChange({ a: clamp(hsva.a + left) });
|
|
514
|
+
const colorFrom = `hsla(${Math.round(hsva.h)}, 100%, 50%, 0)`;
|
|
515
|
+
const colorTo = `hsla(${Math.round(hsva.h)}, 100%, 50%, 1)`;
|
|
516
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
517
|
+
"div",
|
|
518
|
+
{
|
|
519
|
+
style: {
|
|
520
|
+
position: "relative",
|
|
521
|
+
backgroundImage: `url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Crect width='4' height='4' fill='%23ccc'/%3E%3Crect x='4' y='4' width='4' height='4' fill='%23ccc'/%3E%3C/svg%3E")`,
|
|
522
|
+
...style
|
|
523
|
+
},
|
|
524
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
525
|
+
Interactive,
|
|
526
|
+
{
|
|
527
|
+
onMove: handleMove,
|
|
528
|
+
onKey: handleKey,
|
|
529
|
+
"aria-label": "Alpha",
|
|
530
|
+
"aria-valuenow": round(hsva.a * 100),
|
|
531
|
+
"aria-valuemin": 0,
|
|
532
|
+
"aria-valuemax": 100,
|
|
533
|
+
"aria-valuetext": `${round(hsva.a * 100)}%`,
|
|
534
|
+
style: {
|
|
535
|
+
width: "100%",
|
|
536
|
+
height: "100%",
|
|
537
|
+
background: `linear-gradient(90deg, ${colorFrom}, ${colorTo})`
|
|
538
|
+
},
|
|
539
|
+
...rest,
|
|
540
|
+
children: renderPointer ? renderPointer({ left: hsva.a, top: 0.5, hsva }) : /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Pointer, { left: hsva.a })
|
|
541
|
+
}
|
|
542
|
+
)
|
|
543
|
+
}
|
|
544
|
+
);
|
|
545
|
+
});
|
|
546
|
+
|
|
547
|
+
// src/components/ColorPicker.tsx
|
|
548
|
+
var import_jsx_runtime6 = require("react/jsx-runtime");
|
|
549
|
+
function ColorPicker({
|
|
550
|
+
colorModel,
|
|
551
|
+
color,
|
|
552
|
+
onChange,
|
|
553
|
+
children,
|
|
554
|
+
renderSaturationPointer,
|
|
555
|
+
renderHuePointer,
|
|
556
|
+
...rest
|
|
557
|
+
}) {
|
|
558
|
+
const [hsva, updateHsva] = useColorManipulation(colorModel, color, onChange);
|
|
559
|
+
if (children) {
|
|
560
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_jsx_runtime6.Fragment, { children: children({ hsva, updateHsva, Saturation, Hue, Alpha, Pointer }) });
|
|
561
|
+
}
|
|
562
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { ...rest, children: [
|
|
563
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
564
|
+
Saturation,
|
|
565
|
+
{
|
|
566
|
+
hsva,
|
|
567
|
+
onChange: updateHsva,
|
|
568
|
+
renderPointer: renderSaturationPointer,
|
|
569
|
+
style: { width: "100%", aspectRatio: "1", borderRadius: "4px 4px 0 0" }
|
|
570
|
+
}
|
|
571
|
+
),
|
|
572
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
573
|
+
Hue,
|
|
574
|
+
{
|
|
575
|
+
hue: hsva.h,
|
|
576
|
+
onChange: updateHsva,
|
|
577
|
+
renderPointer: renderHuePointer,
|
|
578
|
+
style: { width: "100%", height: 24, borderRadius: "0 0 4px 4px", marginTop: 4 }
|
|
579
|
+
}
|
|
580
|
+
)
|
|
581
|
+
] });
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
// src/components/HexColorPicker.tsx
|
|
585
|
+
var import_jsx_runtime7 = require("react/jsx-runtime");
|
|
586
|
+
var hexColorModel = {
|
|
587
|
+
defaultColor: "#ff0000",
|
|
588
|
+
toHsva: hexToHsva,
|
|
589
|
+
fromHsva: (hsva) => hsvaToHex(hsva),
|
|
590
|
+
equal: equalHex
|
|
591
|
+
};
|
|
592
|
+
function HexColorPicker({
|
|
593
|
+
color = "#ff0000",
|
|
594
|
+
...rest
|
|
595
|
+
}) {
|
|
596
|
+
return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(ColorPicker, { colorModel: hexColorModel, color, ...rest });
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
// src/utils/validate.ts
|
|
600
|
+
var matcher = /^#?([0-9A-F]{3,8})$/i;
|
|
601
|
+
var validHex = (value, alpha) => {
|
|
602
|
+
const match = matcher.exec(value);
|
|
603
|
+
const length = match ? match[1].length : 0;
|
|
604
|
+
return length === 3 || // '#rgb' format
|
|
605
|
+
length === 6 || // '#rrggbb' format
|
|
606
|
+
!!alpha && length === 4 || // '#rgba' format
|
|
607
|
+
!!alpha && length === 8;
|
|
608
|
+
};
|
|
609
|
+
|
|
610
|
+
// src/utils/nonce.ts
|
|
611
|
+
var nonce;
|
|
612
|
+
var getNonce = () => {
|
|
613
|
+
if (nonce) return nonce;
|
|
614
|
+
if (typeof __webpack_nonce__ !== "undefined") return __webpack_nonce__;
|
|
615
|
+
return void 0;
|
|
616
|
+
};
|
|
617
|
+
var setNonce = (hash) => {
|
|
618
|
+
nonce = hash;
|
|
619
|
+
};
|
|
620
|
+
|
|
621
|
+
// src/utils/format.ts
|
|
622
|
+
var formatClassName = (names) => names.filter(Boolean).join(" ");
|
|
623
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
624
|
+
0 && (module.exports = {
|
|
625
|
+
Alpha,
|
|
626
|
+
ColorPicker,
|
|
627
|
+
HexColorPicker,
|
|
628
|
+
Hue,
|
|
629
|
+
Interactive,
|
|
630
|
+
Pointer,
|
|
631
|
+
Saturation,
|
|
632
|
+
clamp,
|
|
633
|
+
equalColorObjects,
|
|
634
|
+
equalColorString,
|
|
635
|
+
equalHex,
|
|
636
|
+
formatClassName,
|
|
637
|
+
getNonce,
|
|
638
|
+
hexColorModel,
|
|
639
|
+
hexToHsva,
|
|
640
|
+
hexToRgba,
|
|
641
|
+
hslStringToHsva,
|
|
642
|
+
hslaStringToHsva,
|
|
643
|
+
hslaToHsl,
|
|
644
|
+
hslaToHsva,
|
|
645
|
+
hsvStringToHsva,
|
|
646
|
+
hsvaStringToHsva,
|
|
647
|
+
hsvaToHex,
|
|
648
|
+
hsvaToHslString,
|
|
649
|
+
hsvaToHsla,
|
|
650
|
+
hsvaToHslaString,
|
|
651
|
+
hsvaToHsv,
|
|
652
|
+
hsvaToHsvString,
|
|
653
|
+
hsvaToHsvaString,
|
|
654
|
+
hsvaToHueHsl,
|
|
655
|
+
hsvaToRgbString,
|
|
656
|
+
hsvaToRgba,
|
|
657
|
+
hsvaToRgbaString,
|
|
658
|
+
parseHue,
|
|
659
|
+
rgbStringToHsva,
|
|
660
|
+
rgbaStringToHsva,
|
|
661
|
+
rgbaToHex,
|
|
662
|
+
rgbaToHsva,
|
|
663
|
+
rgbaToRgb,
|
|
664
|
+
round,
|
|
665
|
+
roundHsva,
|
|
666
|
+
setNonce,
|
|
667
|
+
useColorManipulation,
|
|
668
|
+
useEventCallback,
|
|
669
|
+
validHex
|
|
670
|
+
});
|
|
671
|
+
//# sourceMappingURL=index.js.map
|