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/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