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/dist/index.js CHANGED
@@ -21,8 +21,6 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
21
21
  var index_exports = {};
22
22
  __export(index_exports, {
23
23
  Alpha: () => Alpha,
24
- ColorPicker: () => ColorPicker,
25
- HexColorPicker: () => HexColorPicker,
26
24
  Hue: () => Hue,
27
25
  Interactive: () => Interactive,
28
26
  Pointer: () => Pointer,
@@ -33,7 +31,6 @@ __export(index_exports, {
33
31
  equalHex: () => equalHex,
34
32
  formatClassName: () => formatClassName,
35
33
  getNonce: () => getNonce,
36
- hexColorModel: () => hexColorModel,
37
34
  hexToHsva: () => hexToHsva,
38
35
  hexToRgba: () => hexToRgba,
39
36
  hslStringToHsva: () => hslStringToHsva,
@@ -68,183 +65,21 @@ __export(index_exports, {
68
65
  });
69
66
  module.exports = __toCommonJS(index_exports);
70
67
 
71
- // src/hooks/useColorManipulation.ts
72
- var import_react2 = require("react");
68
+ // src/components/Hue.tsx
69
+ var import_react3 = require("react");
70
+
71
+ // src/utils/clamp.ts
72
+ var clamp = (number, min = 0, max = 1) => {
73
+ return number > max ? max : number < min ? min : number;
74
+ };
73
75
 
74
76
  // src/utils/round.ts
75
77
  var round = (number, digits = 0, base = Math.pow(10, digits)) => {
76
78
  return Math.round(base * number) / base;
77
79
  };
78
80
 
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
- };
81
+ // src/components/Interactive.tsx
82
+ var import_react2 = require("react");
248
83
 
249
84
  // src/hooks/useEventCallback.ts
250
85
  var import_react = require("react");
@@ -257,41 +92,7 @@ function useEventCallback(handler) {
257
92
  return fn.current;
258
93
  }
259
94
 
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
95
  // src/components/Interactive.tsx
294
- var import_react3 = require("react");
295
96
  var import_jsx_runtime = require("react/jsx-runtime");
296
97
  var isTouch = (e) => "touches" in e;
297
98
  var getParentWindow = (node) => node?.ownerDocument?.defaultView ?? window;
@@ -307,19 +108,19 @@ var getRelativePosition = (node, event, touchId) => {
307
108
  )
308
109
  };
309
110
  };
310
- var Interactive = (0, import_react3.memo)(function Interactive2({
111
+ var Interactive = (0, import_react2.memo)(function Interactive2({
311
112
  onMove,
312
113
  onKey,
313
114
  children,
314
115
  style,
315
116
  ...rest
316
117
  }) {
317
- const container = (0, import_react3.useRef)(null);
118
+ const container = (0, import_react2.useRef)(null);
318
119
  const onMoveCallback = useEventCallback(onMove);
319
120
  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)(() => {
121
+ const touchId = (0, import_react2.useRef)(null);
122
+ const hasTouch = (0, import_react2.useRef)(false);
123
+ const [handleMoveStart, handleKeyDown, toggleDocumentEvents] = (0, import_react2.useMemo)(() => {
323
124
  const handleMoveStart2 = ({
324
125
  nativeEvent
325
126
  }) => {
@@ -382,7 +183,7 @@ var Interactive = (0, import_react3.memo)(function Interactive2({
382
183
  }
383
184
  return [handleMoveStart2, handleKeyDown2, toggleDocumentEvents2];
384
185
  }, [onKeyCallback, onMoveCallback]);
385
- (0, import_react3.useEffect)(() => {
186
+ (0, import_react2.useEffect)(() => {
386
187
  return () => toggleDocumentEvents(false);
387
188
  }, [toggleDocumentEvents]);
388
189
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
@@ -433,7 +234,7 @@ var Pointer = function Pointer2({
433
234
 
434
235
  // src/components/Hue.tsx
435
236
  var import_jsx_runtime3 = require("react/jsx-runtime");
436
- var Hue = (0, import_react4.memo)(function Hue2({
237
+ var Hue = (0, import_react3.memo)(function Hue2({
437
238
  hue,
438
239
  onChange,
439
240
  renderPointer,
@@ -462,9 +263,164 @@ var Hue = (0, import_react4.memo)(function Hue2({
462
263
  });
463
264
 
464
265
  // src/components/Saturation.tsx
465
- var import_react5 = require("react");
266
+ var import_react4 = require("react");
267
+
268
+ // src/utils/convert.ts
269
+ var angleUnits = {
270
+ grad: 360 / 400,
271
+ turn: 360,
272
+ rad: 360 / (Math.PI * 2)
273
+ };
274
+ var hexToHsva = (hex) => rgbaToHsva(hexToRgba(hex));
275
+ var hexToRgba = (hex) => {
276
+ if (hex[0] === "#") hex = hex.substring(1);
277
+ if (hex.length < 6) {
278
+ return {
279
+ r: parseInt(hex[0] + hex[0], 16),
280
+ g: parseInt(hex[1] + hex[1], 16),
281
+ b: parseInt(hex[2] + hex[2], 16),
282
+ a: hex.length === 4 ? round(parseInt(hex[3] + hex[3], 16) / 255, 2) : 1
283
+ };
284
+ }
285
+ return {
286
+ r: parseInt(hex.substring(0, 2), 16),
287
+ g: parseInt(hex.substring(2, 4), 16),
288
+ b: parseInt(hex.substring(4, 6), 16),
289
+ a: hex.length === 8 ? round(parseInt(hex.substring(6, 8), 16) / 255, 2) : 1
290
+ };
291
+ };
292
+ var parseHue = (value, unit = "deg") => {
293
+ return Number(value) * (angleUnits[unit] || 1);
294
+ };
295
+ var hslaStringToHsva = (hslString) => {
296
+ const matcher2 = /hsla?\(?\s*(-?\d*\.?\d+)(deg|rad|grad|turn)?[,\s]+(-?\d*\.?\d+)%?[,\s]+(-?\d*\.?\d+)%?,?\s*[/\s]*(-?\d*\.?\d+)?(%)?\s*\)?/i;
297
+ const match = matcher2.exec(hslString);
298
+ if (!match) return { h: 0, s: 0, v: 0, a: 1 };
299
+ return hslaToHsva({
300
+ h: parseHue(match[1], match[2]),
301
+ s: Number(match[3]),
302
+ l: Number(match[4]),
303
+ a: match[5] === void 0 ? 1 : Number(match[5]) / (match[6] ? 100 : 1)
304
+ });
305
+ };
306
+ var hslStringToHsva = hslaStringToHsva;
307
+ var hslaToHsva = ({ h, s, l, a }) => {
308
+ s *= (l < 50 ? l : 100 - l) / 100;
309
+ return {
310
+ h,
311
+ s: s > 0 ? 2 * s / (l + s) * 100 : 0,
312
+ v: l + s,
313
+ a
314
+ };
315
+ };
316
+ var hsvaToHex = (hsva) => rgbaToHex(hsvaToRgba(hsva));
317
+ var hsvaToHsla = ({ h, s, v, a }) => {
318
+ const hh = (200 - s) * v / 100;
319
+ return {
320
+ h: round(h),
321
+ s: round(hh > 0 && hh < 200 ? s * v / 100 / (hh <= 100 ? hh : 200 - hh) * 100 : 0),
322
+ l: round(hh / 2),
323
+ a: round(a, 2)
324
+ };
325
+ };
326
+ var hsvaToHslString = (hsva) => {
327
+ const { h, s, l } = hsvaToHsla(hsva);
328
+ return `hsl(${h}, ${s}%, ${l}%)`;
329
+ };
330
+ var hsvaToHsvString = (hsva) => {
331
+ const { h, s, v } = roundHsva(hsva);
332
+ return `hsv(${h}, ${s}%, ${v}%)`;
333
+ };
334
+ var hsvaToHsvaString = (hsva) => {
335
+ const { h, s, v, a } = roundHsva(hsva);
336
+ return `hsva(${h}, ${s}%, ${v}%, ${a})`;
337
+ };
338
+ var hsvaToHslaString = (hsva) => {
339
+ const { h, s, l, a } = hsvaToHsla(hsva);
340
+ return `hsla(${h}, ${s}%, ${l}%, ${a})`;
341
+ };
342
+ var hsvaToRgba = ({ h, s, v, a }) => {
343
+ h = h / 360 * 6;
344
+ s = s / 100;
345
+ v = v / 100;
346
+ 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;
347
+ return {
348
+ r: round([v, c, b, b, d, v][module2] * 255),
349
+ g: round([d, v, v, c, b, b][module2] * 255),
350
+ b: round([b, b, d, v, v, c][module2] * 255),
351
+ a: round(a, 2)
352
+ };
353
+ };
354
+ var hsvaToRgbString = (hsva) => {
355
+ const { r, g, b } = hsvaToRgba(hsva);
356
+ return `rgb(${r}, ${g}, ${b})`;
357
+ };
358
+ var hsvaToRgbaString = (hsva) => {
359
+ const { r, g, b, a } = hsvaToRgba(hsva);
360
+ return `rgba(${r}, ${g}, ${b}, ${a})`;
361
+ };
362
+ var hsvaStringToHsva = (hsvString) => {
363
+ const matcher2 = /hsva?\(?\s*(-?\d*\.?\d+)(deg|rad|grad|turn)?[,\s]+(-?\d*\.?\d+)%?[,\s]+(-?\d*\.?\d+)%?,?\s*[/\s]*(-?\d*\.?\d+)?(%)?\s*\)?/i;
364
+ const match = matcher2.exec(hsvString);
365
+ if (!match) return { h: 0, s: 0, v: 0, a: 1 };
366
+ return roundHsva({
367
+ h: parseHue(match[1], match[2]),
368
+ s: Number(match[3]),
369
+ v: Number(match[4]),
370
+ a: match[5] === void 0 ? 1 : Number(match[5]) / (match[6] ? 100 : 1)
371
+ });
372
+ };
373
+ var hsvStringToHsva = hsvaStringToHsva;
374
+ var rgbaStringToHsva = (rgbaString) => {
375
+ const matcher2 = /rgba?\(?\s*(-?\d*\.?\d+)(%)?[,\s]+(-?\d*\.?\d+)(%)?[,\s]+(-?\d*\.?\d+)(%)?,?\s*[/\s]*(-?\d*\.?\d+)?(%)?\s*\)?/i;
376
+ const match = matcher2.exec(rgbaString);
377
+ if (!match) return { h: 0, s: 0, v: 0, a: 1 };
378
+ return rgbaToHsva({
379
+ r: Number(match[1]) / (match[2] ? 100 / 255 : 1),
380
+ g: Number(match[3]) / (match[4] ? 100 / 255 : 1),
381
+ b: Number(match[5]) / (match[6] ? 100 / 255 : 1),
382
+ a: match[7] === void 0 ? 1 : Number(match[7]) / (match[8] ? 100 : 1)
383
+ });
384
+ };
385
+ var rgbStringToHsva = rgbaStringToHsva;
386
+ var format = (number) => {
387
+ const hex = number.toString(16);
388
+ return hex.length < 2 ? "0" + hex : hex;
389
+ };
390
+ var rgbaToHex = ({ r, g, b, a }) => {
391
+ const alphaHex = a < 1 ? format(round(a * 255)) : "";
392
+ return "#" + format(r) + format(g) + format(b) + alphaHex;
393
+ };
394
+ var rgbaToHsva = ({ r, g, b, a }) => {
395
+ const max = Math.max(r, g, b);
396
+ const delta = max - Math.min(r, g, b);
397
+ const hh = delta ? max === r ? (g - b) / delta : max === g ? 2 + (b - r) / delta : 4 + (r - g) / delta : 0;
398
+ return {
399
+ h: round(60 * (hh < 0 ? hh + 6 : hh)),
400
+ s: round(max ? delta / max * 100 : 0),
401
+ v: round(max / 255 * 100),
402
+ a
403
+ };
404
+ };
405
+ var roundHsva = (hsva) => ({
406
+ h: round(hsva.h),
407
+ s: round(hsva.s),
408
+ v: round(hsva.v),
409
+ a: round(hsva.a, 2)
410
+ });
411
+ var rgbaToRgb = ({ r, g, b }) => ({ r, g, b });
412
+ var hslaToHsl = ({ h, s, l }) => ({ h, s, l });
413
+ var hsvaToHsv = (hsva) => {
414
+ const { h, s, v } = roundHsva(hsva);
415
+ return { h, s, v };
416
+ };
417
+ var hsvaToHueHsl = (h) => {
418
+ return `hsl(${Math.round(h)}, 100%, 50%)`;
419
+ };
420
+
421
+ // src/components/Saturation.tsx
466
422
  var import_jsx_runtime4 = require("react/jsx-runtime");
467
- var Saturation = (0, import_react5.memo)(function Saturation2({
423
+ var Saturation = (0, import_react4.memo)(function Saturation2({
468
424
  hsva,
469
425
  onChange,
470
426
  style,
@@ -500,9 +456,9 @@ var Saturation = (0, import_react5.memo)(function Saturation2({
500
456
  });
501
457
 
502
458
  // src/components/Alpha.tsx
503
- var import_react6 = require("react");
459
+ var import_react5 = require("react");
504
460
  var import_jsx_runtime5 = require("react/jsx-runtime");
505
- var Alpha = (0, import_react6.memo)(function Alpha2({
461
+ var Alpha = (0, import_react5.memo)(function Alpha2({
506
462
  hsva,
507
463
  onChange,
508
464
  renderPointer,
@@ -544,56 +500,49 @@ var Alpha = (0, import_react6.memo)(function Alpha2({
544
500
  );
545
501
  });
546
502
 
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 }) });
503
+ // src/hooks/useColorManipulation.ts
504
+ var import_react6 = require("react");
505
+
506
+ // src/utils/compare.ts
507
+ var equalColorObjects = (first, second) => {
508
+ if (first === second) return true;
509
+ for (const prop in first) {
510
+ if (first[prop] !== second[prop])
511
+ return false;
561
512
  }
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
- }
513
+ return true;
514
+ };
515
+ var equalColorString = (first, second) => {
516
+ return first.replace(/\s/g, "") === second.replace(/\s/g, "");
517
+ };
518
+ var equalHex = (first, second) => {
519
+ if (first.toLowerCase() === second.toLowerCase()) return true;
520
+ return equalColorObjects(hexToRgba(first), hexToRgba(second));
521
+ };
583
522
 
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 });
523
+ // src/hooks/useColorManipulation.ts
524
+ function useColorManipulation(colorModel, color, onChange) {
525
+ const onChangeCallback = useEventCallback(onChange);
526
+ const [hsva, updateHsva] = (0, import_react6.useState)(() => colorModel.toHsva(color));
527
+ const cache = (0, import_react6.useRef)({ color, hsva });
528
+ (0, import_react6.useEffect)(() => {
529
+ if (!colorModel.equal(color, cache.current.color)) {
530
+ const newHsva = colorModel.toHsva(color);
531
+ cache.current = { hsva: newHsva, color };
532
+ updateHsva(newHsva);
533
+ }
534
+ }, [color, colorModel]);
535
+ (0, import_react6.useEffect)(() => {
536
+ let newColor;
537
+ if (!equalColorObjects(hsva, cache.current.hsva) && !colorModel.equal(newColor = colorModel.fromHsva(hsva), cache.current.color)) {
538
+ cache.current = { hsva, color: newColor };
539
+ onChangeCallback(newColor);
540
+ }
541
+ }, [hsva, colorModel, onChangeCallback]);
542
+ const handleChange = (0, import_react6.useCallback)((params) => {
543
+ updateHsva((current) => Object.assign({}, current, params));
544
+ }, []);
545
+ return [hsva, handleChange];
597
546
  }
598
547
 
599
548
  // src/utils/validate.ts
@@ -623,8 +572,6 @@ var formatClassName = (names) => names.filter(Boolean).join(" ");
623
572
  // Annotate the CommonJS export names for ESM import in node:
624
573
  0 && (module.exports = {
625
574
  Alpha,
626
- ColorPicker,
627
- HexColorPicker,
628
575
  Hue,
629
576
  Interactive,
630
577
  Pointer,
@@ -635,7 +582,6 @@ var formatClassName = (names) => names.filter(Boolean).join(" ");
635
582
  equalHex,
636
583
  formatClassName,
637
584
  getNonce,
638
- hexColorModel,
639
585
  hexToHsva,
640
586
  hexToRgba,
641
587
  hslStringToHsva,