@zag-js/color-picker 1.43.0 → 2.0.0-next.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.
Files changed (49) hide show
  1. package/dist/color-picker.anatomy.d.mts +2 -2
  2. package/dist/color-picker.anatomy.d.ts +2 -2
  3. package/dist/color-picker.anatomy.js +1 -0
  4. package/dist/color-picker.anatomy.mjs +1 -0
  5. package/dist/color-picker.connect.d.mts +1 -0
  6. package/dist/color-picker.connect.d.ts +1 -0
  7. package/dist/color-picker.connect.js +130 -58
  8. package/dist/color-picker.connect.mjs +139 -60
  9. package/dist/color-picker.dom.js +23 -22
  10. package/dist/color-picker.dom.mjs +23 -22
  11. package/dist/color-picker.machine.d.mts +1 -0
  12. package/dist/color-picker.machine.d.ts +1 -0
  13. package/dist/color-picker.machine.js +43 -16
  14. package/dist/color-picker.machine.mjs +43 -16
  15. package/dist/color-picker.props.d.mts +1 -0
  16. package/dist/color-picker.props.d.ts +1 -0
  17. package/dist/color-picker.types.d.mts +115 -3
  18. package/dist/color-picker.types.d.ts +115 -3
  19. package/dist/index.d.mts +2 -1
  20. package/dist/index.d.ts +2 -1
  21. package/dist/utils/get-area-format.d.mts +6 -0
  22. package/dist/utils/get-area-format.d.ts +6 -0
  23. package/dist/utils/get-area-format.js +37 -0
  24. package/dist/utils/get-area-format.mjs +12 -0
  25. package/dist/utils/get-channel-display-color.d.mts +2 -1
  26. package/dist/utils/get-channel-display-color.d.ts +2 -1
  27. package/dist/utils/get-channel-display-color.js +7 -0
  28. package/dist/utils/get-channel-display-color.mjs +7 -0
  29. package/dist/utils/get-channel-input-value.d.mts +1 -0
  30. package/dist/utils/get-channel-input-value.d.ts +1 -0
  31. package/dist/utils/get-channel-input-value.js +39 -8
  32. package/dist/utils/get-channel-input-value.mjs +39 -8
  33. package/dist/utils/get-gamut-overlay-path.d.mts +33 -0
  34. package/dist/utils/get-gamut-overlay-path.d.ts +33 -0
  35. package/dist/utils/get-gamut-overlay-path.js +81 -0
  36. package/dist/utils/get-gamut-overlay-path.mjs +55 -0
  37. package/dist/utils/get-gamut-overlay-path.test.d.mts +2 -0
  38. package/dist/utils/get-gamut-overlay-path.test.d.ts +2 -0
  39. package/dist/utils/get-gamut-overlay-path.test.js +35 -0
  40. package/dist/utils/get-gamut-overlay-path.test.mjs +33 -0
  41. package/dist/utils/get-slider-background.d.mts +1 -0
  42. package/dist/utils/get-slider-background.d.ts +1 -0
  43. package/dist/utils/get-slider-background.js +16 -1
  44. package/dist/utils/get-slider-background.mjs +16 -1
  45. package/dist/utils/is-srgb-gamut.d.mts +6 -0
  46. package/dist/utils/is-srgb-gamut.d.ts +6 -0
  47. package/dist/utils/is-srgb-gamut.js +33 -0
  48. package/dist/utils/is-srgb-gamut.mjs +8 -0
  49. package/package.json +9 -9
@@ -1,18 +1,34 @@
1
1
  // src/color-picker.connect.ts
2
- import { getColorAreaGradient, normalizeColor } from "@zag-js/color-utils";
3
- import { getEventKey, getEventPoint, getEventStep, isComposingEvent, isLeftClick, isModifierKey } from "@zag-js/dom-query";
2
+ import { getColorAreaGradient, isInSrgbGamut, normalizeColor } from "@zag-js/color-utils";
3
+ import { getDismissableLayerAttrs, getDismissableLayerStyle } from "@zag-js/dismissable";
4
+ import {
5
+ getEventKey,
6
+ getEventPoint,
7
+ getEventStep,
8
+ isComposingEvent,
9
+ isLeftClick,
10
+ isModifierKey
11
+ } from "@zag-js/dom-query";
4
12
  import { dataAttr, query, visuallyHiddenStyle } from "@zag-js/dom-query";
5
13
  import { getPlacementSide, getPlacementStyles } from "@zag-js/popper";
6
14
  import { parts } from "./color-picker.anatomy.mjs";
7
15
  import * as dom from "./color-picker.dom.mjs";
8
16
  import { getChannelDisplayColor } from "./utils/get-channel-display-color.mjs";
9
17
  import { getChannelRange, getChannelValue } from "./utils/get-channel-input-value.mjs";
18
+ import { getGamutOverlayData } from "./utils/get-gamut-overlay-path.mjs";
10
19
  import { getSliderBackground } from "./utils/get-slider-background.mjs";
20
+ function getDefaultDevicePixelRatio() {
21
+ if (typeof globalThis === "undefined") return 1;
22
+ const dpr = globalThis.devicePixelRatio;
23
+ return typeof dpr === "number" && Number.isFinite(dpr) ? dpr : 1;
24
+ }
11
25
  function connect(service, normalize) {
12
26
  const { context, send, prop, computed, state, scope } = service;
27
+ const layer = context.get("layer");
13
28
  const value = context.get("value");
14
29
  const format = context.get("format");
15
30
  const areaValue = computed("areaValue");
31
+ const stableAreaValue = context.get("areaBaseColor") ?? areaValue;
16
32
  const valueAsString = computed("valueAsString");
17
33
  const disabled = computed("disabled");
18
34
  const readOnly = !!prop("readOnly");
@@ -29,6 +45,10 @@ function connect(service, normalize) {
29
45
  yChannel: props.yChannel ?? channels[2]
30
46
  };
31
47
  };
48
+ function resolveGamutOverlay(props = {}) {
49
+ const pixelRatio = props.pixelRatio ?? getDefaultDevicePixelRatio();
50
+ return getGamutOverlayData(stableAreaValue, getAreaChannels(props), format, { pixelRatio });
51
+ }
32
52
  const currentPlacement = context.get("currentPlacement");
33
53
  const currentPlacementSide = currentPlacement ? getPlacementSide(currentPlacement) : void 0;
34
54
  const popperStyles = getPlacementStyles({
@@ -44,11 +64,38 @@ function connect(service, normalize) {
44
64
  disabled: props.disabled || !interactive
45
65
  };
46
66
  }
67
+ function getRootState() {
68
+ return { disabled, readOnly, invalid };
69
+ }
70
+ function getTriggerState() {
71
+ return {
72
+ open,
73
+ focused,
74
+ disabled,
75
+ invalid,
76
+ readOnly,
77
+ placement: currentPlacement,
78
+ side: currentPlacementSide
79
+ };
80
+ }
81
+ function getContentState() {
82
+ return {
83
+ open,
84
+ nested: !!layer?.nested,
85
+ hasNested: !!layer?.hasNested,
86
+ placement: currentPlacement,
87
+ side: currentPlacementSide
88
+ };
89
+ }
47
90
  return {
48
91
  dragging,
49
92
  open,
50
93
  valueAsString,
51
94
  value,
95
+ isInSrgbGamut: isInSrgbGamut(value),
96
+ getGamutOverlay(props = {}) {
97
+ return resolveGamutOverlay(props);
98
+ },
52
99
  inline: !!prop("inline"),
53
100
  setOpen(nextOpen) {
54
101
  if (prop("inline")) return;
@@ -70,23 +117,23 @@ function connect(service, normalize) {
70
117
  send({ type: "VALUE.SET", value: color, src: "set-channel" });
71
118
  },
72
119
  format: context.get("format"),
73
- setFormat(format2) {
74
- const formatValue = value.toFormat(format2);
75
- send({ type: "VALUE.SET", value: formatValue, src: "set-format" });
120
+ setFormat(nextFormat) {
121
+ send({ type: "FORMAT.SET", format: nextFormat, src: "set-format" });
76
122
  },
77
123
  alpha: value.getChannelValue("alpha"),
78
124
  setAlpha(alphaValue) {
79
125
  const color = value.withChannelValue("alpha", alphaValue);
80
126
  send({ type: "VALUE.SET", value: color, src: "set-alpha" });
81
127
  },
128
+ getRootState,
82
129
  getRootProps() {
130
+ const rootState = getRootState();
83
131
  return normalize.element({
84
- ...parts.root.attrs,
132
+ ...parts.root.attrs(scope.id),
85
133
  dir: prop("dir"),
86
- id: dom.getRootId(scope),
87
- "data-disabled": dataAttr(disabled),
88
- "data-readonly": dataAttr(readOnly),
89
- "data-invalid": dataAttr(invalid),
134
+ "data-disabled": dataAttr(rootState.disabled),
135
+ "data-readonly": dataAttr(rootState.readOnly),
136
+ "data-invalid": dataAttr(rootState.invalid),
90
137
  style: {
91
138
  "--value": value.toString("css")
92
139
  }
@@ -94,7 +141,7 @@ function connect(service, normalize) {
94
141
  },
95
142
  getLabelProps() {
96
143
  return normalize.element({
97
- ...parts.label.attrs,
144
+ ...parts.label.attrs(scope.id),
98
145
  dir: prop("dir"),
99
146
  id: dom.getLabelId(scope),
100
147
  htmlFor: dom.getHiddenInputId(scope),
@@ -112,8 +159,7 @@ function connect(service, normalize) {
112
159
  },
113
160
  getControlProps() {
114
161
  return normalize.element({
115
- ...parts.control.attrs,
116
- id: dom.getControlId(scope),
162
+ ...parts.control.attrs(scope.id),
117
163
  dir: prop("dir"),
118
164
  "data-disabled": dataAttr(disabled),
119
165
  "data-readonly": dataAttr(readOnly),
@@ -122,24 +168,26 @@ function connect(service, normalize) {
122
168
  "data-focus": dataAttr(focused)
123
169
  });
124
170
  },
171
+ getTriggerState,
125
172
  getTriggerProps() {
173
+ const triggerState = getTriggerState();
126
174
  return normalize.button({
127
- ...parts.trigger.attrs,
175
+ ...parts.trigger.attrs(scope.id),
128
176
  id: dom.getTriggerId(scope),
129
177
  dir: prop("dir"),
130
- disabled,
178
+ disabled: triggerState.disabled,
131
179
  "aria-label": `select color. current color is ${valueAsString}`,
132
180
  "aria-controls": dom.getContentId(scope),
133
181
  "aria-labelledby": dom.getLabelId(scope),
134
182
  "aria-haspopup": prop("inline") ? void 0 : "dialog",
135
- "data-disabled": dataAttr(disabled),
136
- "data-readonly": dataAttr(readOnly),
137
- "data-invalid": dataAttr(invalid),
138
- "data-placement": currentPlacement,
139
- "data-side": currentPlacementSide,
140
- "aria-expanded": open,
141
- "data-state": open ? "open" : "closed",
142
- "data-focus": dataAttr(focused),
183
+ "data-disabled": dataAttr(triggerState.disabled),
184
+ "data-readonly": dataAttr(triggerState.readOnly),
185
+ "data-invalid": dataAttr(triggerState.invalid),
186
+ "data-placement": triggerState.placement,
187
+ "data-side": triggerState.side,
188
+ "aria-expanded": triggerState.open,
189
+ "data-state": triggerState.open ? "open" : "closed",
190
+ "data-focus": dataAttr(triggerState.focused),
143
191
  type: "button",
144
192
  onClick() {
145
193
  if (!interactive) return;
@@ -156,28 +204,35 @@ function connect(service, normalize) {
156
204
  },
157
205
  getPositionerProps() {
158
206
  return normalize.element({
159
- ...parts.positioner.attrs,
160
- id: dom.getPositionerId(scope),
207
+ ...parts.positioner.attrs(scope.id),
161
208
  dir: prop("dir"),
162
- style: popperStyles.floating
209
+ ...getDismissableLayerAttrs(layer),
210
+ style: {
211
+ ...popperStyles.floating,
212
+ ...getDismissableLayerStyle(layer, { zIndex: true })
213
+ }
163
214
  });
164
215
  },
216
+ getContentState,
165
217
  getContentProps() {
218
+ const contentState = getContentState();
166
219
  return normalize.element({
167
- ...parts.content.attrs,
220
+ ...parts.content.attrs(scope.id),
168
221
  id: dom.getContentId(scope),
169
222
  dir: prop("dir"),
170
223
  role: prop("inline") ? void 0 : "dialog",
171
224
  tabIndex: -1,
172
- "data-placement": currentPlacement,
173
- "data-side": currentPlacementSide,
174
- "data-state": open ? "open" : "closed",
175
- hidden: !open
225
+ "data-placement": contentState.placement,
226
+ "data-side": contentState.side,
227
+ "data-state": contentState.open ? "open" : "closed",
228
+ hidden: !contentState.open,
229
+ ...getDismissableLayerAttrs(layer),
230
+ style: getDismissableLayerStyle(layer, { pointerEvents: true })
176
231
  });
177
232
  },
178
233
  getValueTextProps() {
179
234
  return normalize.element({
180
- ...parts.valueText.attrs,
235
+ ...parts.valueText.attrs(scope.id),
181
236
  dir: prop("dir"),
182
237
  "data-disabled": dataAttr(disabled),
183
238
  "data-focus": dataAttr(focused)
@@ -185,14 +240,13 @@ function connect(service, normalize) {
185
240
  },
186
241
  getAreaProps(props = {}) {
187
242
  const { xChannel, yChannel } = getAreaChannels(props);
188
- const { areaStyles } = getColorAreaGradient(areaValue, {
243
+ const { areaStyles } = getColorAreaGradient(stableAreaValue, {
189
244
  xChannel,
190
245
  yChannel,
191
246
  dir: prop("dir")
192
247
  });
193
248
  return normalize.element({
194
- ...parts.area.attrs,
195
- id: dom.getAreaId(scope),
249
+ ...parts.area.attrs(scope.id),
196
250
  role: "group",
197
251
  "data-invalid": dataAttr(invalid),
198
252
  "data-disabled": dataAttr(disabled),
@@ -216,14 +270,13 @@ function connect(service, normalize) {
216
270
  },
217
271
  getAreaBackgroundProps(props = {}) {
218
272
  const { xChannel, yChannel } = getAreaChannels(props);
219
- const { areaGradientStyles } = getColorAreaGradient(areaValue, {
273
+ const { areaGradientStyles } = getColorAreaGradient(stableAreaValue, {
220
274
  xChannel,
221
275
  yChannel,
222
276
  dir: prop("dir")
223
277
  });
224
278
  return normalize.element({
225
- ...parts.areaBackground.attrs,
226
- id: dom.getAreaGradientId(scope),
279
+ ...parts.areaBackground.attrs(scope.id),
227
280
  "data-invalid": dataAttr(invalid),
228
281
  "data-disabled": dataAttr(disabled),
229
282
  "data-readonly": dataAttr(readOnly),
@@ -235,18 +288,45 @@ function connect(service, normalize) {
235
288
  }
236
289
  });
237
290
  },
291
+ getGamutOverlayProps(props = {}) {
292
+ const data = resolveGamutOverlay(props);
293
+ return normalize.element({
294
+ ...parts.gamutOverlay.attrs(scope.id),
295
+ viewBox: "0 0 100 100",
296
+ preserveAspectRatio: "none",
297
+ xmlns: "http://www.w3.org/2000/svg",
298
+ "aria-hidden": true,
299
+ "data-state": data ? "visible" : "hidden",
300
+ style: {
301
+ position: "absolute",
302
+ inset: "0",
303
+ width: "100%",
304
+ height: "100%",
305
+ overflow: "hidden",
306
+ pointerEvents: "none"
307
+ }
308
+ });
309
+ },
238
310
  getAreaThumbProps(props = {}) {
239
311
  const { xChannel, yChannel } = getAreaChannels(props);
240
312
  const channel = { xChannel, yChannel };
241
- const xPercent = areaValue.getChannelValuePercent(xChannel);
242
- const yPercent = 1 - areaValue.getChannelValuePercent(yChannel);
313
+ const dragPos = context.get("areaDragPosition");
243
314
  const isRtl = prop("dir") === "rtl";
315
+ let xPercent;
316
+ let yPercent;
317
+ if (dragPos) {
318
+ xPercent = dragPos.x;
319
+ yPercent = dragPos.y;
320
+ } else {
321
+ xPercent = areaValue.getChannelValuePercent(xChannel);
322
+ yPercent = 1 - areaValue.getChannelValuePercent(yChannel);
323
+ }
244
324
  const finalXPercent = isRtl ? 1 - xPercent : xPercent;
245
325
  const xValue = areaValue.getChannelValue(xChannel);
246
326
  const yValue = areaValue.getChannelValue(yChannel);
247
327
  const color = areaValue.withChannelValue("alpha", 1).toString("css");
248
328
  return normalize.element({
249
- ...parts.areaThumb.attrs,
329
+ ...parts.areaThumb.attrs(scope.id),
250
330
  id: dom.getAreaThumbId(scope),
251
331
  dir: prop("dir"),
252
332
  tabIndex: disabled ? void 0 : 0,
@@ -314,7 +394,7 @@ function connect(service, normalize) {
314
394
  getTransparencyGridProps(props = {}) {
315
395
  const { size = "12px" } = props;
316
396
  return normalize.element({
317
- ...parts.transparencyGrid.attrs,
397
+ ...parts.transparencyGrid.attrs(scope.id),
318
398
  style: {
319
399
  "--size": size,
320
400
  width: "100%",
@@ -332,7 +412,7 @@ function connect(service, normalize) {
332
412
  getChannelSliderProps(props) {
333
413
  const { orientation = "horizontal", channel, format: format2 } = props;
334
414
  return normalize.element({
335
- ...parts.channelSlider.attrs,
415
+ ...parts.channelSlider.attrs(scope.id),
336
416
  "data-channel": channel,
337
417
  "data-orientation": orientation,
338
418
  role: "presentation",
@@ -352,10 +432,9 @@ function connect(service, normalize) {
352
432
  },
353
433
  getChannelSliderTrackProps(props) {
354
434
  const { orientation = "horizontal", channel, format: format2 } = props;
355
- const normalizedValue = format2 ? value.toFormat(format2) : areaValue;
435
+ const normalizedValue = format2 ? value.toFormat(format2) : stableAreaValue;
356
436
  return normalize.element({
357
- ...parts.channelSliderTrack.attrs,
358
- id: dom.getChannelSliderTrackId(scope, channel),
437
+ ...parts.channelSliderTrack.attrs(scope.id),
359
438
  role: "group",
360
439
  "data-channel": channel,
361
440
  "data-orientation": orientation,
@@ -374,7 +453,7 @@ function connect(service, normalize) {
374
453
  getChannelSliderLabelProps(props) {
375
454
  const { channel } = props;
376
455
  return normalize.element({
377
- ...parts.channelSliderLabel.attrs,
456
+ ...parts.channelSliderLabel.attrs(scope.id),
378
457
  "data-channel": channel,
379
458
  onClick(event) {
380
459
  if (!interactive) return;
@@ -390,13 +469,13 @@ function connect(service, normalize) {
390
469
  },
391
470
  getChannelSliderValueTextProps(props) {
392
471
  return normalize.element({
393
- ...parts.channelSliderValueText.attrs,
472
+ ...parts.channelSliderValueText.attrs(scope.id),
394
473
  "data-channel": props.channel
395
474
  });
396
475
  },
397
476
  getChannelSliderThumbProps(props) {
398
477
  const { orientation = "horizontal", channel, format: format2 } = props;
399
- const normalizedValue = format2 ? value.toFormat(format2) : areaValue;
478
+ const normalizedValue = format2 ? value.toFormat(format2) : stableAreaValue;
400
479
  const channelRange = normalizedValue.getChannelRange(channel);
401
480
  const channelValue = normalizedValue.getChannelValue(channel);
402
481
  const offset = (channelValue - channelRange.minValue) / (channelRange.maxValue - channelRange.minValue);
@@ -404,7 +483,7 @@ function connect(service, normalize) {
404
483
  const finalOffset = orientation === "horizontal" && isRtl ? 1 - offset : offset;
405
484
  const placementStyles = orientation === "horizontal" ? { left: `${finalOffset * 100}%`, top: "50%" } : { top: `${offset * 100}%`, left: "50%" };
406
485
  return normalize.element({
407
- ...parts.channelSliderThumb.attrs,
486
+ ...parts.channelSliderThumb.attrs(scope.id),
408
487
  id: dom.getChannelSliderThumbId(scope, channel),
409
488
  role: "slider",
410
489
  "aria-label": channel,
@@ -421,7 +500,7 @@ function connect(service, normalize) {
421
500
  style: {
422
501
  forcedColorAdjust: "none",
423
502
  position: "absolute",
424
- background: getChannelDisplayColor(areaValue, channel).toString("css"),
503
+ background: getChannelDisplayColor(stableAreaValue, channel).toString("css"),
425
504
  ...placementStyles
426
505
  },
427
506
  onFocus() {
@@ -476,7 +555,7 @@ function connect(service, normalize) {
476
555
  const isTextField = channel === "hex" || channel === "css";
477
556
  const channelRange = getChannelRange(value, channel);
478
557
  return normalize.input({
479
- ...parts.channelInput.attrs,
558
+ ...parts.channelInput.attrs(scope.id),
480
559
  dir: prop("dir"),
481
560
  type: isTextField ? "text" : "number",
482
561
  "data-channel": channel,
@@ -541,7 +620,7 @@ function connect(service, normalize) {
541
620
  },
542
621
  getEyeDropperTriggerProps() {
543
622
  return normalize.button({
544
- ...parts.eyeDropperTrigger.attrs,
623
+ ...parts.eyeDropperTrigger.attrs(scope.id),
545
624
  type: "button",
546
625
  dir: prop("dir"),
547
626
  disabled,
@@ -557,7 +636,7 @@ function connect(service, normalize) {
557
636
  },
558
637
  getSwatchGroupProps() {
559
638
  return normalize.element({
560
- ...parts.swatchGroup.attrs,
639
+ ...parts.swatchGroup.attrs(scope.id),
561
640
  role: "group"
562
641
  });
563
642
  },
@@ -565,7 +644,7 @@ function connect(service, normalize) {
565
644
  getSwatchTriggerProps(props) {
566
645
  const swatchState = getSwatchTriggerState(props);
567
646
  return normalize.button({
568
- ...parts.swatchTrigger.attrs,
647
+ ...parts.swatchTrigger.attrs(scope.id),
569
648
  disabled: swatchState.disabled,
570
649
  dir: prop("dir"),
571
650
  type: "button",
@@ -586,7 +665,7 @@ function connect(service, normalize) {
586
665
  getSwatchIndicatorProps(props) {
587
666
  const swatchState = getSwatchTriggerState(props);
588
667
  return normalize.element({
589
- ...parts.swatchIndicator.attrs,
668
+ ...parts.swatchIndicator.attrs(scope.id),
590
669
  dir: prop("dir"),
591
670
  hidden: !swatchState.checked
592
671
  });
@@ -596,7 +675,7 @@ function connect(service, normalize) {
596
675
  const swatchState = getSwatchTriggerState(props);
597
676
  const color = swatchState.value.toString(respectAlpha ? "css" : "hex");
598
677
  return normalize.element({
599
- ...parts.swatch.attrs,
678
+ ...parts.swatch.attrs(scope.id),
600
679
  dir: prop("dir"),
601
680
  "data-state": swatchState.checked ? "checked" : "unchecked",
602
681
  "data-value": swatchState.valueAsString,
@@ -609,7 +688,7 @@ function connect(service, normalize) {
609
688
  },
610
689
  getFormatTriggerProps() {
611
690
  return normalize.button({
612
- ...parts.formatTrigger.attrs,
691
+ ...parts.formatTrigger.attrs(scope.id),
613
692
  dir: prop("dir"),
614
693
  type: "button",
615
694
  "aria-label": `change color format to ${getNextFormat(format)}`,
@@ -622,7 +701,7 @@ function connect(service, normalize) {
622
701
  },
623
702
  getFormatSelectProps() {
624
703
  return normalize.select({
625
- ...parts.formatSelect.attrs,
704
+ ...parts.formatSelect.attrs(scope.id),
626
705
  "aria-label": "change color format",
627
706
  dir: prop("dir"),
628
707
  defaultValue: prop("format"),
@@ -635,7 +714,7 @@ function connect(service, normalize) {
635
714
  }
636
715
  };
637
716
  }
638
- var formats = ["hsba", "hsla", "rgba"];
717
+ var formats = ["hsba", "hsla", "rgba", "oklab", "oklch"];
639
718
  var formatRegex = new RegExp(`^(${formats.join("|")})$`);
640
719
  function getNextFormat(format) {
641
720
  const index = formats.indexOf(format);
@@ -50,22 +50,23 @@ __export(color_picker_dom_exports, {
50
50
  });
51
51
  module.exports = __toCommonJS(color_picker_dom_exports);
52
52
  var import_dom_query = require("@zag-js/dom-query");
53
- var getRootId = (ctx) => ctx.ids?.root ?? `color-picker:${ctx.id}`;
54
- var getLabelId = (ctx) => ctx.ids?.label ?? `color-picker:${ctx.id}:label`;
55
- var getHiddenInputId = (ctx) => ctx.ids?.hiddenInput ?? `color-picker:${ctx.id}:hidden-input`;
56
- var getControlId = (ctx) => ctx.ids?.control ?? `color-picker:${ctx.id}:control`;
57
- var getTriggerId = (ctx) => ctx.ids?.trigger ?? `color-picker:${ctx.id}:trigger`;
58
- var getContentId = (ctx) => ctx.ids?.content ?? `color-picker:${ctx.id}:content`;
59
- var getPositionerId = (ctx) => ctx.ids?.positioner ?? `color-picker:${ctx.id}:positioner`;
60
- var getFormatSelectId = (ctx) => ctx.ids?.formatSelect ?? `color-picker:${ctx.id}:format-select`;
61
- var getAreaId = (ctx) => ctx.ids?.area ?? `color-picker:${ctx.id}:area`;
62
- var getAreaGradientId = (ctx) => ctx.ids?.areaGradient ?? `color-picker:${ctx.id}:area-gradient`;
63
- var getAreaThumbId = (ctx) => ctx.ids?.areaThumb ?? `color-picker:${ctx.id}:area-thumb`;
64
- var getChannelSliderTrackId = (ctx, channel) => ctx.ids?.channelSliderTrack?.(channel) ?? `color-picker:${ctx.id}:slider-track:${channel}`;
65
- var getChannelSliderThumbId = (ctx, channel) => ctx.ids?.channelSliderThumb?.(channel) ?? `color-picker:${ctx.id}:slider-thumb:${channel}`;
66
- var getContentEl = (ctx) => ctx.getById(getContentId(ctx));
67
- var getAreaThumbEl = (ctx) => ctx.getById(getAreaThumbId(ctx));
68
- var getChannelSliderThumbEl = (ctx, channel) => ctx.getById(getChannelSliderThumbId(ctx, channel));
53
+ var import_color_picker = require("./color-picker.anatomy.js");
54
+ var getRootId = (ctx) => ctx.ids?.root ?? `${ctx.id}`;
55
+ var getLabelId = (ctx) => ctx.ids?.label ?? `${ctx.id}:label`;
56
+ var getHiddenInputId = (ctx) => ctx.ids?.hiddenInput ?? `${ctx.id}:hidden-input`;
57
+ var getControlId = (ctx) => ctx.ids?.control ?? `${ctx.id}:control`;
58
+ var getTriggerId = (ctx) => ctx.ids?.trigger ?? `${ctx.id}:trigger`;
59
+ var getContentId = (ctx) => ctx.ids?.content ?? `${ctx.id}:content`;
60
+ var getPositionerId = (ctx) => ctx.ids?.positioner ?? `${ctx.id}:positioner`;
61
+ var getFormatSelectId = (ctx) => ctx.ids?.formatSelect ?? `${ctx.id}:format-select`;
62
+ var getAreaId = (ctx) => ctx.ids?.area ?? `${ctx.id}:area`;
63
+ var getAreaGradientId = (ctx) => ctx.ids?.areaGradient ?? `${ctx.id}:area-gradient`;
64
+ var getAreaThumbId = (ctx) => ctx.ids?.areaThumb ?? `${ctx.id}:area-thumb`;
65
+ var getChannelSliderTrackId = (ctx, channel) => ctx.ids?.channelSliderTrack?.(channel) ?? `${ctx.id}:slider-track:${channel}`;
66
+ var getChannelSliderThumbId = (ctx, channel) => ctx.ids?.channelSliderThumb?.(channel) ?? `${ctx.id}:slider-thumb:${channel}`;
67
+ var getContentEl = (ctx) => ctx.query(ctx.selector(import_color_picker.parts.content));
68
+ var getAreaThumbEl = (ctx) => ctx.query(ctx.selector(import_color_picker.parts.areaThumb));
69
+ var getChannelSliderThumbEl = (ctx, channel) => ctx.query(`${ctx.selector(import_color_picker.parts.channelSliderThumb)}[data-channel="${channel}"]`);
69
70
  var getChannelInputEl = (ctx, channel) => {
70
71
  const selector = `input[data-channel="${channel}"]`;
71
72
  return [
@@ -73,9 +74,9 @@ var getChannelInputEl = (ctx, channel) => {
73
74
  ...(0, import_dom_query.queryAll)(getControlEl(ctx), selector)
74
75
  ];
75
76
  };
76
- var getFormatSelectEl = (ctx) => ctx.getById(getFormatSelectId(ctx));
77
+ var getFormatSelectEl = (ctx) => ctx.query(ctx.selector(import_color_picker.parts.formatSelect));
77
78
  var getHiddenInputEl = (ctx) => ctx.getById(getHiddenInputId(ctx));
78
- var getAreaEl = (ctx) => ctx.getById(getAreaId(ctx));
79
+ var getAreaEl = (ctx) => ctx.query(ctx.selector(import_color_picker.parts.area));
79
80
  var getAreaValueFromPoint = (ctx, point, dir) => {
80
81
  const areaEl = getAreaEl(ctx);
81
82
  if (!areaEl) return;
@@ -85,10 +86,10 @@ var getAreaValueFromPoint = (ctx, point, dir) => {
85
86
  y: getPercentValue({ orientation: "vertical" })
86
87
  };
87
88
  };
88
- var getControlEl = (ctx) => ctx.getById(getControlId(ctx));
89
- var getTriggerEl = (ctx) => ctx.getById(getTriggerId(ctx));
90
- var getPositionerEl = (ctx) => ctx.getById(getPositionerId(ctx));
91
- var getChannelSliderTrackEl = (ctx, channel) => ctx.getById(getChannelSliderTrackId(ctx, channel));
89
+ var getControlEl = (ctx) => ctx.query(ctx.selector(import_color_picker.parts.control));
90
+ var getTriggerEl = (ctx) => ctx.query(ctx.selector(import_color_picker.parts.trigger));
91
+ var getPositionerEl = (ctx) => ctx.query(ctx.selector(import_color_picker.parts.positioner));
92
+ var getChannelSliderTrackEl = (ctx, channel) => ctx.query(`${ctx.selector(import_color_picker.parts.channelSliderTrack)}[data-channel="${channel}"]`);
92
93
  var getChannelSliderValueFromPoint = (ctx, point, channel, dir) => {
93
94
  const trackEl = getChannelSliderTrackEl(ctx, channel);
94
95
  if (!trackEl) return;
@@ -1,21 +1,22 @@
1
1
  // src/color-picker.dom.ts
2
2
  import { getRelativePoint, queryAll } from "@zag-js/dom-query";
3
- var getRootId = (ctx) => ctx.ids?.root ?? `color-picker:${ctx.id}`;
4
- var getLabelId = (ctx) => ctx.ids?.label ?? `color-picker:${ctx.id}:label`;
5
- var getHiddenInputId = (ctx) => ctx.ids?.hiddenInput ?? `color-picker:${ctx.id}:hidden-input`;
6
- var getControlId = (ctx) => ctx.ids?.control ?? `color-picker:${ctx.id}:control`;
7
- var getTriggerId = (ctx) => ctx.ids?.trigger ?? `color-picker:${ctx.id}:trigger`;
8
- var getContentId = (ctx) => ctx.ids?.content ?? `color-picker:${ctx.id}:content`;
9
- var getPositionerId = (ctx) => ctx.ids?.positioner ?? `color-picker:${ctx.id}:positioner`;
10
- var getFormatSelectId = (ctx) => ctx.ids?.formatSelect ?? `color-picker:${ctx.id}:format-select`;
11
- var getAreaId = (ctx) => ctx.ids?.area ?? `color-picker:${ctx.id}:area`;
12
- var getAreaGradientId = (ctx) => ctx.ids?.areaGradient ?? `color-picker:${ctx.id}:area-gradient`;
13
- var getAreaThumbId = (ctx) => ctx.ids?.areaThumb ?? `color-picker:${ctx.id}:area-thumb`;
14
- var getChannelSliderTrackId = (ctx, channel) => ctx.ids?.channelSliderTrack?.(channel) ?? `color-picker:${ctx.id}:slider-track:${channel}`;
15
- var getChannelSliderThumbId = (ctx, channel) => ctx.ids?.channelSliderThumb?.(channel) ?? `color-picker:${ctx.id}:slider-thumb:${channel}`;
16
- var getContentEl = (ctx) => ctx.getById(getContentId(ctx));
17
- var getAreaThumbEl = (ctx) => ctx.getById(getAreaThumbId(ctx));
18
- var getChannelSliderThumbEl = (ctx, channel) => ctx.getById(getChannelSliderThumbId(ctx, channel));
3
+ import { parts } from "./color-picker.anatomy.mjs";
4
+ var getRootId = (ctx) => ctx.ids?.root ?? `${ctx.id}`;
5
+ var getLabelId = (ctx) => ctx.ids?.label ?? `${ctx.id}:label`;
6
+ var getHiddenInputId = (ctx) => ctx.ids?.hiddenInput ?? `${ctx.id}:hidden-input`;
7
+ var getControlId = (ctx) => ctx.ids?.control ?? `${ctx.id}:control`;
8
+ var getTriggerId = (ctx) => ctx.ids?.trigger ?? `${ctx.id}:trigger`;
9
+ var getContentId = (ctx) => ctx.ids?.content ?? `${ctx.id}:content`;
10
+ var getPositionerId = (ctx) => ctx.ids?.positioner ?? `${ctx.id}:positioner`;
11
+ var getFormatSelectId = (ctx) => ctx.ids?.formatSelect ?? `${ctx.id}:format-select`;
12
+ var getAreaId = (ctx) => ctx.ids?.area ?? `${ctx.id}:area`;
13
+ var getAreaGradientId = (ctx) => ctx.ids?.areaGradient ?? `${ctx.id}:area-gradient`;
14
+ var getAreaThumbId = (ctx) => ctx.ids?.areaThumb ?? `${ctx.id}:area-thumb`;
15
+ var getChannelSliderTrackId = (ctx, channel) => ctx.ids?.channelSliderTrack?.(channel) ?? `${ctx.id}:slider-track:${channel}`;
16
+ var getChannelSliderThumbId = (ctx, channel) => ctx.ids?.channelSliderThumb?.(channel) ?? `${ctx.id}:slider-thumb:${channel}`;
17
+ var getContentEl = (ctx) => ctx.query(ctx.selector(parts.content));
18
+ var getAreaThumbEl = (ctx) => ctx.query(ctx.selector(parts.areaThumb));
19
+ var getChannelSliderThumbEl = (ctx, channel) => ctx.query(`${ctx.selector(parts.channelSliderThumb)}[data-channel="${channel}"]`);
19
20
  var getChannelInputEl = (ctx, channel) => {
20
21
  const selector = `input[data-channel="${channel}"]`;
21
22
  return [
@@ -23,9 +24,9 @@ var getChannelInputEl = (ctx, channel) => {
23
24
  ...queryAll(getControlEl(ctx), selector)
24
25
  ];
25
26
  };
26
- var getFormatSelectEl = (ctx) => ctx.getById(getFormatSelectId(ctx));
27
+ var getFormatSelectEl = (ctx) => ctx.query(ctx.selector(parts.formatSelect));
27
28
  var getHiddenInputEl = (ctx) => ctx.getById(getHiddenInputId(ctx));
28
- var getAreaEl = (ctx) => ctx.getById(getAreaId(ctx));
29
+ var getAreaEl = (ctx) => ctx.query(ctx.selector(parts.area));
29
30
  var getAreaValueFromPoint = (ctx, point, dir) => {
30
31
  const areaEl = getAreaEl(ctx);
31
32
  if (!areaEl) return;
@@ -35,10 +36,10 @@ var getAreaValueFromPoint = (ctx, point, dir) => {
35
36
  y: getPercentValue({ orientation: "vertical" })
36
37
  };
37
38
  };
38
- var getControlEl = (ctx) => ctx.getById(getControlId(ctx));
39
- var getTriggerEl = (ctx) => ctx.getById(getTriggerId(ctx));
40
- var getPositionerEl = (ctx) => ctx.getById(getPositionerId(ctx));
41
- var getChannelSliderTrackEl = (ctx, channel) => ctx.getById(getChannelSliderTrackId(ctx, channel));
39
+ var getControlEl = (ctx) => ctx.query(ctx.selector(parts.control));
40
+ var getTriggerEl = (ctx) => ctx.query(ctx.selector(parts.trigger));
41
+ var getPositionerEl = (ctx) => ctx.query(ctx.selector(parts.positioner));
42
+ var getChannelSliderTrackEl = (ctx, channel) => ctx.query(`${ctx.selector(parts.channelSliderTrack)}[data-channel="${channel}"]`);
42
43
  var getChannelSliderValueFromPoint = (ctx, point, channel, dir) => {
43
44
  const trackEl = getChannelSliderTrackEl(ctx, channel);
44
45
  if (!trackEl) return;
@@ -1,6 +1,7 @@
1
1
  import * as _zag_js_core from '@zag-js/core';
2
2
  import { ColorPickerSchema } from './color-picker.types.mjs';
3
3
  import '@zag-js/color-utils';
4
+ import './utils/get-gamut-overlay-path.mjs';
4
5
  import '@zag-js/dismissable';
5
6
  import '@zag-js/popper';
6
7
  import '@zag-js/types';
@@ -1,6 +1,7 @@
1
1
  import * as _zag_js_core from '@zag-js/core';
2
2
  import { ColorPickerSchema } from './color-picker.types.js';
3
3
  import '@zag-js/color-utils';
4
+ import './utils/get-gamut-overlay-path.js';
4
5
  import '@zag-js/dismissable';
5
6
  import '@zag-js/popper';
6
7
  import '@zag-js/types';