@zag-js/color-picker 1.34.1 → 1.35.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.
Files changed (49) hide show
  1. package/dist/color-picker.anatomy.d.mts +6 -0
  2. package/dist/color-picker.anatomy.d.ts +6 -0
  3. package/dist/color-picker.anatomy.js +59 -0
  4. package/dist/color-picker.anatomy.mjs +33 -0
  5. package/dist/color-picker.connect.d.mts +10 -0
  6. package/dist/color-picker.connect.d.ts +10 -0
  7. package/dist/color-picker.connect.js +681 -0
  8. package/dist/color-picker.connect.mjs +646 -0
  9. package/dist/color-picker.dom.d.mts +39 -0
  10. package/dist/color-picker.dom.d.ts +39 -0
  11. package/dist/color-picker.dom.js +136 -0
  12. package/dist/color-picker.dom.mjs +85 -0
  13. package/dist/color-picker.machine.d.mts +10 -0
  14. package/dist/color-picker.machine.d.ts +10 -0
  15. package/dist/color-picker.machine.js +636 -0
  16. package/dist/color-picker.machine.mjs +609 -0
  17. package/dist/color-picker.parse.d.mts +5 -0
  18. package/dist/color-picker.parse.d.ts +5 -0
  19. package/dist/color-picker.parse.js +33 -0
  20. package/dist/color-picker.parse.mjs +8 -0
  21. package/dist/color-picker.props.d.mts +21 -0
  22. package/dist/color-picker.props.d.ts +21 -0
  23. package/dist/color-picker.props.js +94 -0
  24. package/dist/color-picker.props.mjs +58 -0
  25. package/dist/color-picker.types.d.mts +303 -0
  26. package/dist/color-picker.types.d.ts +303 -0
  27. package/dist/color-picker.types.js +18 -0
  28. package/dist/color-picker.types.mjs +0 -0
  29. package/dist/index.d.mts +9 -324
  30. package/dist/index.d.ts +9 -324
  31. package/dist/index.js +37 -1517
  32. package/dist/index.mjs +11 -1504
  33. package/dist/utils/get-channel-display-color.d.mts +5 -0
  34. package/dist/utils/get-channel-display-color.d.ts +5 -0
  35. package/dist/utils/get-channel-display-color.js +48 -0
  36. package/dist/utils/get-channel-display-color.mjs +23 -0
  37. package/dist/utils/get-channel-input-value.d.mts +11 -0
  38. package/dist/utils/get-channel-input-value.d.ts +11 -0
  39. package/dist/utils/get-channel-input-value.js +88 -0
  40. package/dist/utils/get-channel-input-value.mjs +62 -0
  41. package/dist/utils/get-slider-background.d.mts +14 -0
  42. package/dist/utils/get-slider-background.d.ts +14 -0
  43. package/dist/utils/get-slider-background.js +65 -0
  44. package/dist/utils/get-slider-background.mjs +40 -0
  45. package/dist/utils/is-valid-hex.d.mts +4 -0
  46. package/dist/utils/is-valid-hex.d.ts +4 -0
  47. package/dist/utils/is-valid-hex.js +40 -0
  48. package/dist/utils/is-valid-hex.mjs +14 -0
  49. package/package.json +20 -10
@@ -0,0 +1,681 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/color-picker.connect.ts
31
+ var color_picker_connect_exports = {};
32
+ __export(color_picker_connect_exports, {
33
+ connect: () => connect
34
+ });
35
+ module.exports = __toCommonJS(color_picker_connect_exports);
36
+ var import_color_utils = require("@zag-js/color-utils");
37
+ var import_dom_query = require("@zag-js/dom-query");
38
+ var import_dom_query2 = require("@zag-js/dom-query");
39
+ var import_popper = require("@zag-js/popper");
40
+ var import_color_picker = require("./color-picker.anatomy.cjs");
41
+ var dom = __toESM(require("./color-picker.dom.cjs"));
42
+ var import_get_channel_display_color = require("./utils/get-channel-display-color.cjs");
43
+ var import_get_channel_input_value = require("./utils/get-channel-input-value.cjs");
44
+ var import_get_slider_background = require("./utils/get-slider-background.cjs");
45
+ function connect(service, normalize) {
46
+ const { context, send, prop, computed, state, scope } = service;
47
+ const value = context.get("value");
48
+ const format = context.get("format");
49
+ const areaValue = computed("areaValue");
50
+ const valueAsString = computed("valueAsString");
51
+ const disabled = computed("disabled");
52
+ const readOnly = !!prop("readOnly");
53
+ const invalid = !!prop("invalid");
54
+ const required = !!prop("required");
55
+ const interactive = computed("interactive");
56
+ const dragging = state.hasTag("dragging");
57
+ const open = state.hasTag("open");
58
+ const focused = state.hasTag("focused");
59
+ const getAreaChannels = (props) => {
60
+ const channels = areaValue.getChannels();
61
+ return {
62
+ xChannel: props.xChannel ?? channels[1],
63
+ yChannel: props.yChannel ?? channels[2]
64
+ };
65
+ };
66
+ const currentPlacement = context.get("currentPlacement");
67
+ const popperStyles = (0, import_popper.getPlacementStyles)({
68
+ ...prop("positioning"),
69
+ placement: currentPlacement
70
+ });
71
+ function getSwatchTriggerState(props) {
72
+ const color = (0, import_color_utils.normalizeColor)(props.value).toFormat(context.get("format"));
73
+ return {
74
+ value: color,
75
+ valueAsString: color.toString("hex"),
76
+ checked: color.isEqual(value),
77
+ disabled: props.disabled || !interactive
78
+ };
79
+ }
80
+ return {
81
+ dragging,
82
+ open,
83
+ valueAsString,
84
+ value,
85
+ inline: !!prop("inline"),
86
+ setOpen(nextOpen) {
87
+ if (prop("inline")) return;
88
+ const open2 = state.hasTag("open");
89
+ if (open2 === nextOpen) return;
90
+ send({ type: nextOpen ? "OPEN" : "CLOSE" });
91
+ },
92
+ setValue(value2) {
93
+ send({ type: "VALUE.SET", value: (0, import_color_utils.normalizeColor)(value2), src: "set-color" });
94
+ },
95
+ getChannelValue(channel) {
96
+ return (0, import_get_channel_input_value.getChannelValue)(value, channel);
97
+ },
98
+ getChannelValueText(channel, locale) {
99
+ return value.formatChannelValue(channel, locale);
100
+ },
101
+ setChannelValue(channel, channelValue) {
102
+ const color = value.withChannelValue(channel, channelValue);
103
+ send({ type: "VALUE.SET", value: color, src: "set-channel" });
104
+ },
105
+ format: context.get("format"),
106
+ setFormat(format2) {
107
+ const formatValue = value.toFormat(format2);
108
+ send({ type: "VALUE.SET", value: formatValue, src: "set-format" });
109
+ },
110
+ alpha: value.getChannelValue("alpha"),
111
+ setAlpha(alphaValue) {
112
+ const color = value.withChannelValue("alpha", alphaValue);
113
+ send({ type: "VALUE.SET", value: color, src: "set-alpha" });
114
+ },
115
+ getRootProps() {
116
+ return normalize.element({
117
+ ...import_color_picker.parts.root.attrs,
118
+ dir: prop("dir"),
119
+ id: dom.getRootId(scope),
120
+ "data-disabled": (0, import_dom_query2.dataAttr)(disabled),
121
+ "data-readonly": (0, import_dom_query2.dataAttr)(readOnly),
122
+ "data-invalid": (0, import_dom_query2.dataAttr)(invalid),
123
+ style: {
124
+ "--value": value.toString("css")
125
+ }
126
+ });
127
+ },
128
+ getLabelProps() {
129
+ return normalize.element({
130
+ ...import_color_picker.parts.label.attrs,
131
+ dir: prop("dir"),
132
+ id: dom.getLabelId(scope),
133
+ htmlFor: dom.getHiddenInputId(scope),
134
+ "data-disabled": (0, import_dom_query2.dataAttr)(disabled),
135
+ "data-readonly": (0, import_dom_query2.dataAttr)(readOnly),
136
+ "data-invalid": (0, import_dom_query2.dataAttr)(invalid),
137
+ "data-required": (0, import_dom_query2.dataAttr)(required),
138
+ "data-focus": (0, import_dom_query2.dataAttr)(focused),
139
+ onClick(event) {
140
+ event.preventDefault();
141
+ const inputEl = (0, import_dom_query2.query)(dom.getControlEl(scope), "[data-channel=hex]");
142
+ inputEl?.focus({ preventScroll: true });
143
+ }
144
+ });
145
+ },
146
+ getControlProps() {
147
+ return normalize.element({
148
+ ...import_color_picker.parts.control.attrs,
149
+ id: dom.getControlId(scope),
150
+ dir: prop("dir"),
151
+ "data-disabled": (0, import_dom_query2.dataAttr)(disabled),
152
+ "data-readonly": (0, import_dom_query2.dataAttr)(readOnly),
153
+ "data-invalid": (0, import_dom_query2.dataAttr)(invalid),
154
+ "data-state": open ? "open" : "closed",
155
+ "data-focus": (0, import_dom_query2.dataAttr)(focused)
156
+ });
157
+ },
158
+ getTriggerProps() {
159
+ return normalize.button({
160
+ ...import_color_picker.parts.trigger.attrs,
161
+ id: dom.getTriggerId(scope),
162
+ dir: prop("dir"),
163
+ disabled,
164
+ "aria-label": `select color. current color is ${valueAsString}`,
165
+ "aria-controls": dom.getContentId(scope),
166
+ "aria-labelledby": dom.getLabelId(scope),
167
+ "aria-haspopup": prop("inline") ? void 0 : "dialog",
168
+ "data-disabled": (0, import_dom_query2.dataAttr)(disabled),
169
+ "data-readonly": (0, import_dom_query2.dataAttr)(readOnly),
170
+ "data-invalid": (0, import_dom_query2.dataAttr)(invalid),
171
+ "data-placement": currentPlacement,
172
+ "aria-expanded": open,
173
+ "data-state": open ? "open" : "closed",
174
+ "data-focus": (0, import_dom_query2.dataAttr)(focused),
175
+ type: "button",
176
+ onClick() {
177
+ if (!interactive) return;
178
+ send({ type: "TRIGGER.CLICK" });
179
+ },
180
+ onBlur() {
181
+ if (!interactive) return;
182
+ send({ type: "TRIGGER.BLUR" });
183
+ },
184
+ style: {
185
+ position: "relative"
186
+ }
187
+ });
188
+ },
189
+ getPositionerProps() {
190
+ return normalize.element({
191
+ ...import_color_picker.parts.positioner.attrs,
192
+ id: dom.getPositionerId(scope),
193
+ dir: prop("dir"),
194
+ style: popperStyles.floating
195
+ });
196
+ },
197
+ getContentProps() {
198
+ return normalize.element({
199
+ ...import_color_picker.parts.content.attrs,
200
+ id: dom.getContentId(scope),
201
+ dir: prop("dir"),
202
+ role: prop("inline") ? void 0 : "dialog",
203
+ tabIndex: -1,
204
+ "data-placement": currentPlacement,
205
+ "data-state": open ? "open" : "closed",
206
+ hidden: !open
207
+ });
208
+ },
209
+ getValueTextProps() {
210
+ return normalize.element({
211
+ ...import_color_picker.parts.valueText.attrs,
212
+ dir: prop("dir"),
213
+ "data-disabled": (0, import_dom_query2.dataAttr)(disabled),
214
+ "data-focus": (0, import_dom_query2.dataAttr)(focused)
215
+ });
216
+ },
217
+ getAreaProps(props = {}) {
218
+ const { xChannel, yChannel } = getAreaChannels(props);
219
+ const { areaStyles } = (0, import_color_utils.getColorAreaGradient)(areaValue, {
220
+ xChannel,
221
+ yChannel,
222
+ dir: prop("dir")
223
+ });
224
+ return normalize.element({
225
+ ...import_color_picker.parts.area.attrs,
226
+ id: dom.getAreaId(scope),
227
+ role: "group",
228
+ "data-invalid": (0, import_dom_query2.dataAttr)(invalid),
229
+ "data-disabled": (0, import_dom_query2.dataAttr)(disabled),
230
+ "data-readonly": (0, import_dom_query2.dataAttr)(readOnly),
231
+ onPointerDown(event) {
232
+ if (!interactive) return;
233
+ if (!(0, import_dom_query.isLeftClick)(event)) return;
234
+ if ((0, import_dom_query.isModifierKey)(event)) return;
235
+ const point = (0, import_dom_query.getEventPoint)(event);
236
+ const channel = { xChannel, yChannel };
237
+ send({ type: "AREA.POINTER_DOWN", point, channel, id: "area" });
238
+ event.preventDefault();
239
+ },
240
+ style: {
241
+ position: "relative",
242
+ touchAction: "none",
243
+ forcedColorAdjust: "none",
244
+ ...areaStyles
245
+ }
246
+ });
247
+ },
248
+ getAreaBackgroundProps(props = {}) {
249
+ const { xChannel, yChannel } = getAreaChannels(props);
250
+ const { areaGradientStyles } = (0, import_color_utils.getColorAreaGradient)(areaValue, {
251
+ xChannel,
252
+ yChannel,
253
+ dir: prop("dir")
254
+ });
255
+ return normalize.element({
256
+ ...import_color_picker.parts.areaBackground.attrs,
257
+ id: dom.getAreaGradientId(scope),
258
+ "data-invalid": (0, import_dom_query2.dataAttr)(invalid),
259
+ "data-disabled": (0, import_dom_query2.dataAttr)(disabled),
260
+ "data-readonly": (0, import_dom_query2.dataAttr)(readOnly),
261
+ style: {
262
+ position: "relative",
263
+ touchAction: "none",
264
+ forcedColorAdjust: "none",
265
+ ...areaGradientStyles
266
+ }
267
+ });
268
+ },
269
+ getAreaThumbProps(props = {}) {
270
+ const { xChannel, yChannel } = getAreaChannels(props);
271
+ const channel = { xChannel, yChannel };
272
+ const xPercent = areaValue.getChannelValuePercent(xChannel);
273
+ const yPercent = 1 - areaValue.getChannelValuePercent(yChannel);
274
+ const isRtl = prop("dir") === "rtl";
275
+ const finalXPercent = isRtl ? 1 - xPercent : xPercent;
276
+ const xValue = areaValue.getChannelValue(xChannel);
277
+ const yValue = areaValue.getChannelValue(yChannel);
278
+ const color = areaValue.withChannelValue("alpha", 1).toString("css");
279
+ return normalize.element({
280
+ ...import_color_picker.parts.areaThumb.attrs,
281
+ id: dom.getAreaThumbId(scope),
282
+ dir: prop("dir"),
283
+ tabIndex: disabled ? void 0 : 0,
284
+ "data-disabled": (0, import_dom_query2.dataAttr)(disabled),
285
+ "data-invalid": (0, import_dom_query2.dataAttr)(invalid),
286
+ "data-readonly": (0, import_dom_query2.dataAttr)(readOnly),
287
+ role: "slider",
288
+ "aria-valuemin": 0,
289
+ "aria-valuemax": 100,
290
+ "aria-valuenow": xValue,
291
+ "aria-label": `${xChannel} and ${yChannel}`,
292
+ "aria-roledescription": "2d slider",
293
+ "aria-valuetext": `${xChannel} ${xValue}, ${yChannel} ${yValue}`,
294
+ style: {
295
+ position: "absolute",
296
+ left: `${finalXPercent * 100}%`,
297
+ top: `${yPercent * 100}%`,
298
+ transform: "translate(-50%, -50%)",
299
+ touchAction: "none",
300
+ forcedColorAdjust: "none",
301
+ "--color": color,
302
+ background: color
303
+ },
304
+ onFocus() {
305
+ if (!interactive) return;
306
+ send({ type: "AREA.FOCUS", id: "area", channel });
307
+ },
308
+ onKeyDown(event) {
309
+ if (event.defaultPrevented) return;
310
+ if (!interactive) return;
311
+ const step = (0, import_dom_query.getEventStep)(event);
312
+ const keyMap = {
313
+ ArrowUp() {
314
+ send({ type: "AREA.ARROW_UP", channel, step });
315
+ },
316
+ ArrowDown() {
317
+ send({ type: "AREA.ARROW_DOWN", channel, step });
318
+ },
319
+ ArrowLeft() {
320
+ send({ type: "AREA.ARROW_LEFT", channel, step });
321
+ },
322
+ ArrowRight() {
323
+ send({ type: "AREA.ARROW_RIGHT", channel, step });
324
+ },
325
+ PageUp() {
326
+ send({ type: "AREA.PAGE_UP", channel, step });
327
+ },
328
+ PageDown() {
329
+ send({ type: "AREA.PAGE_DOWN", channel, step });
330
+ },
331
+ Escape(event2) {
332
+ event2.stopPropagation();
333
+ }
334
+ };
335
+ const exec = keyMap[(0, import_dom_query.getEventKey)(event, {
336
+ dir: prop("dir")
337
+ })];
338
+ if (exec) {
339
+ exec(event);
340
+ event.preventDefault();
341
+ }
342
+ }
343
+ });
344
+ },
345
+ getTransparencyGridProps(props = {}) {
346
+ const { size = "12px" } = props;
347
+ return normalize.element({
348
+ ...import_color_picker.parts.transparencyGrid.attrs,
349
+ style: {
350
+ "--size": size,
351
+ width: "100%",
352
+ height: "100%",
353
+ position: "absolute",
354
+ backgroundColor: "#fff",
355
+ backgroundImage: "conic-gradient(#eeeeee 0 25%, transparent 0 50%, #eeeeee 0 75%, transparent 0)",
356
+ backgroundSize: "var(--size) var(--size)",
357
+ inset: "0px",
358
+ zIndex: "auto",
359
+ pointerEvents: "none"
360
+ }
361
+ });
362
+ },
363
+ getChannelSliderProps(props) {
364
+ const { orientation = "horizontal", channel, format: format2 } = props;
365
+ return normalize.element({
366
+ ...import_color_picker.parts.channelSlider.attrs,
367
+ "data-channel": channel,
368
+ "data-orientation": orientation,
369
+ role: "presentation",
370
+ onPointerDown(event) {
371
+ if (!interactive) return;
372
+ if (!(0, import_dom_query.isLeftClick)(event)) return;
373
+ if ((0, import_dom_query.isModifierKey)(event)) return;
374
+ const point = (0, import_dom_query.getEventPoint)(event);
375
+ send({ type: "CHANNEL_SLIDER.POINTER_DOWN", channel, format: format2, point, id: channel, orientation });
376
+ event.preventDefault();
377
+ },
378
+ style: {
379
+ position: "relative",
380
+ touchAction: "none"
381
+ }
382
+ });
383
+ },
384
+ getChannelSliderTrackProps(props) {
385
+ const { orientation = "horizontal", channel, format: format2 } = props;
386
+ const normalizedValue = format2 ? value.toFormat(format2) : areaValue;
387
+ return normalize.element({
388
+ ...import_color_picker.parts.channelSliderTrack.attrs,
389
+ id: dom.getChannelSliderTrackId(scope, channel),
390
+ role: "group",
391
+ "data-channel": channel,
392
+ "data-orientation": orientation,
393
+ style: {
394
+ position: "relative",
395
+ forcedColorAdjust: "none",
396
+ backgroundImage: (0, import_get_slider_background.getSliderBackground)({
397
+ orientation,
398
+ channel,
399
+ dir: prop("dir"),
400
+ value: normalizedValue
401
+ })
402
+ }
403
+ });
404
+ },
405
+ getChannelSliderLabelProps(props) {
406
+ const { channel } = props;
407
+ return normalize.element({
408
+ ...import_color_picker.parts.channelSliderLabel.attrs,
409
+ "data-channel": channel,
410
+ onClick(event) {
411
+ if (!interactive) return;
412
+ event.preventDefault();
413
+ const thumbId = dom.getChannelSliderThumbId(scope, channel);
414
+ scope.getById(thumbId)?.focus({ preventScroll: true });
415
+ },
416
+ style: {
417
+ userSelect: "none",
418
+ WebkitUserSelect: "none"
419
+ }
420
+ });
421
+ },
422
+ getChannelSliderValueTextProps(props) {
423
+ return normalize.element({
424
+ ...import_color_picker.parts.channelSliderValueText.attrs,
425
+ "data-channel": props.channel
426
+ });
427
+ },
428
+ getChannelSliderThumbProps(props) {
429
+ const { orientation = "horizontal", channel, format: format2 } = props;
430
+ const normalizedValue = format2 ? value.toFormat(format2) : areaValue;
431
+ const channelRange = normalizedValue.getChannelRange(channel);
432
+ const channelValue = normalizedValue.getChannelValue(channel);
433
+ const offset = (channelValue - channelRange.minValue) / (channelRange.maxValue - channelRange.minValue);
434
+ const isRtl = prop("dir") === "rtl";
435
+ const finalOffset = orientation === "horizontal" && isRtl ? 1 - offset : offset;
436
+ const placementStyles = orientation === "horizontal" ? { left: `${finalOffset * 100}%`, top: "50%" } : { top: `${offset * 100}%`, left: "50%" };
437
+ return normalize.element({
438
+ ...import_color_picker.parts.channelSliderThumb.attrs,
439
+ id: dom.getChannelSliderThumbId(scope, channel),
440
+ role: "slider",
441
+ "aria-label": channel,
442
+ tabIndex: disabled ? void 0 : 0,
443
+ "data-channel": channel,
444
+ "data-disabled": (0, import_dom_query2.dataAttr)(disabled),
445
+ "data-orientation": orientation,
446
+ "aria-disabled": (0, import_dom_query2.dataAttr)(disabled),
447
+ "aria-orientation": orientation,
448
+ "aria-valuemax": channelRange.maxValue,
449
+ "aria-valuemin": channelRange.minValue,
450
+ "aria-valuenow": channelValue,
451
+ "aria-valuetext": `${channel} ${channelValue}`,
452
+ style: {
453
+ forcedColorAdjust: "none",
454
+ position: "absolute",
455
+ background: (0, import_get_channel_display_color.getChannelDisplayColor)(areaValue, channel).toString("css"),
456
+ ...placementStyles
457
+ },
458
+ onFocus() {
459
+ if (!interactive) return;
460
+ send({ type: "CHANNEL_SLIDER.FOCUS", channel });
461
+ },
462
+ onKeyDown(event) {
463
+ if (event.defaultPrevented) return;
464
+ if (!interactive) return;
465
+ const step = (0, import_dom_query.getEventStep)(event) * channelRange.step;
466
+ const keyMap = {
467
+ ArrowUp() {
468
+ send({ type: "CHANNEL_SLIDER.ARROW_UP", channel, step });
469
+ },
470
+ ArrowDown() {
471
+ send({ type: "CHANNEL_SLIDER.ARROW_DOWN", channel, step });
472
+ },
473
+ ArrowLeft() {
474
+ send({ type: "CHANNEL_SLIDER.ARROW_LEFT", channel, step });
475
+ },
476
+ ArrowRight() {
477
+ send({ type: "CHANNEL_SLIDER.ARROW_RIGHT", channel, step });
478
+ },
479
+ PageUp() {
480
+ send({ type: "CHANNEL_SLIDER.PAGE_UP", channel });
481
+ },
482
+ PageDown() {
483
+ send({ type: "CHANNEL_SLIDER.PAGE_DOWN", channel });
484
+ },
485
+ Home() {
486
+ send({ type: "CHANNEL_SLIDER.HOME", channel });
487
+ },
488
+ End() {
489
+ send({ type: "CHANNEL_SLIDER.END", channel });
490
+ },
491
+ Escape(event2) {
492
+ event2.stopPropagation();
493
+ }
494
+ };
495
+ const exec = keyMap[(0, import_dom_query.getEventKey)(event, {
496
+ dir: prop("dir")
497
+ })];
498
+ if (exec) {
499
+ exec(event);
500
+ event.preventDefault();
501
+ }
502
+ }
503
+ });
504
+ },
505
+ getChannelInputProps(props) {
506
+ const { channel } = props;
507
+ const isTextField = channel === "hex" || channel === "css";
508
+ const channelRange = (0, import_get_channel_input_value.getChannelRange)(value, channel);
509
+ return normalize.input({
510
+ ...import_color_picker.parts.channelInput.attrs,
511
+ dir: prop("dir"),
512
+ type: isTextField ? "text" : "number",
513
+ "data-channel": channel,
514
+ "aria-label": channel,
515
+ spellCheck: false,
516
+ autoComplete: "off",
517
+ disabled,
518
+ "data-disabled": (0, import_dom_query2.dataAttr)(disabled),
519
+ "data-invalid": (0, import_dom_query2.dataAttr)(invalid),
520
+ "data-readonly": (0, import_dom_query2.dataAttr)(readOnly),
521
+ readOnly,
522
+ defaultValue: (0, import_get_channel_input_value.getChannelValue)(value, channel),
523
+ min: channelRange?.minValue,
524
+ max: channelRange?.maxValue,
525
+ step: channelRange?.step,
526
+ onBeforeInput(event) {
527
+ if (isTextField || !interactive) return;
528
+ const value2 = event.currentTarget.value;
529
+ if (value2.match(/[^0-9.]/g)) {
530
+ event.preventDefault();
531
+ }
532
+ },
533
+ onFocus(event) {
534
+ if (!interactive) return;
535
+ send({ type: "CHANNEL_INPUT.FOCUS", channel });
536
+ event.currentTarget.select();
537
+ },
538
+ onBlur(event) {
539
+ if (!interactive) return;
540
+ const value2 = isTextField ? event.currentTarget.value : event.currentTarget.valueAsNumber;
541
+ send({ type: "CHANNEL_INPUT.BLUR", channel, value: value2, isTextField });
542
+ },
543
+ onKeyDown(event) {
544
+ if (event.defaultPrevented) return;
545
+ if (!interactive) return;
546
+ if (event.key === "Enter") {
547
+ const value2 = isTextField ? event.currentTarget.value : event.currentTarget.valueAsNumber;
548
+ send({ type: "CHANNEL_INPUT.CHANGE", channel, value: value2, isTextField });
549
+ event.preventDefault();
550
+ }
551
+ },
552
+ style: {
553
+ appearance: "none",
554
+ WebkitAppearance: "none",
555
+ MozAppearance: "textfield"
556
+ }
557
+ });
558
+ },
559
+ getHiddenInputProps() {
560
+ return normalize.input({
561
+ type: "text",
562
+ disabled,
563
+ name: prop("name"),
564
+ tabIndex: -1,
565
+ readOnly,
566
+ required,
567
+ id: dom.getHiddenInputId(scope),
568
+ style: import_dom_query2.visuallyHiddenStyle,
569
+ defaultValue: valueAsString
570
+ });
571
+ },
572
+ getEyeDropperTriggerProps() {
573
+ return normalize.button({
574
+ ...import_color_picker.parts.eyeDropperTrigger.attrs,
575
+ type: "button",
576
+ dir: prop("dir"),
577
+ disabled,
578
+ "data-disabled": (0, import_dom_query2.dataAttr)(disabled),
579
+ "data-invalid": (0, import_dom_query2.dataAttr)(invalid),
580
+ "data-readonly": (0, import_dom_query2.dataAttr)(readOnly),
581
+ "aria-label": "Pick a color from the screen",
582
+ onClick() {
583
+ if (!interactive) return;
584
+ send({ type: "EYEDROPPER.CLICK" });
585
+ }
586
+ });
587
+ },
588
+ getSwatchGroupProps() {
589
+ return normalize.element({
590
+ ...import_color_picker.parts.swatchGroup.attrs,
591
+ role: "group"
592
+ });
593
+ },
594
+ getSwatchTriggerState,
595
+ getSwatchTriggerProps(props) {
596
+ const swatchState = getSwatchTriggerState(props);
597
+ return normalize.button({
598
+ ...import_color_picker.parts.swatchTrigger.attrs,
599
+ disabled: swatchState.disabled,
600
+ dir: prop("dir"),
601
+ type: "button",
602
+ "aria-label": `select ${swatchState.valueAsString} as the color`,
603
+ "data-state": swatchState.checked ? "checked" : "unchecked",
604
+ "data-value": swatchState.valueAsString,
605
+ "data-disabled": (0, import_dom_query2.dataAttr)(swatchState.disabled),
606
+ onClick() {
607
+ if (swatchState.disabled) return;
608
+ send({ type: "SWATCH_TRIGGER.CLICK", value: swatchState.value });
609
+ },
610
+ style: {
611
+ "--color": swatchState.valueAsString,
612
+ position: "relative"
613
+ }
614
+ });
615
+ },
616
+ getSwatchIndicatorProps(props) {
617
+ const swatchState = getSwatchTriggerState(props);
618
+ return normalize.element({
619
+ ...import_color_picker.parts.swatchIndicator.attrs,
620
+ dir: prop("dir"),
621
+ hidden: !swatchState.checked
622
+ });
623
+ },
624
+ getSwatchProps(props) {
625
+ const { respectAlpha = true } = props;
626
+ const swatchState = getSwatchTriggerState(props);
627
+ const color = swatchState.value.toString(respectAlpha ? "css" : "hex");
628
+ return normalize.element({
629
+ ...import_color_picker.parts.swatch.attrs,
630
+ dir: prop("dir"),
631
+ "data-state": swatchState.checked ? "checked" : "unchecked",
632
+ "data-value": swatchState.valueAsString,
633
+ style: {
634
+ "--color": color,
635
+ position: "relative",
636
+ background: color
637
+ }
638
+ });
639
+ },
640
+ getFormatTriggerProps() {
641
+ return normalize.button({
642
+ ...import_color_picker.parts.formatTrigger.attrs,
643
+ dir: prop("dir"),
644
+ type: "button",
645
+ "aria-label": `change color format to ${getNextFormat(format)}`,
646
+ onClick(event) {
647
+ if (event.currentTarget.disabled) return;
648
+ const nextFormat = getNextFormat(format);
649
+ send({ type: "FORMAT.SET", format: nextFormat, src: "format-trigger" });
650
+ }
651
+ });
652
+ },
653
+ getFormatSelectProps() {
654
+ return normalize.select({
655
+ ...import_color_picker.parts.formatSelect.attrs,
656
+ "aria-label": "change color format",
657
+ dir: prop("dir"),
658
+ defaultValue: prop("format"),
659
+ disabled,
660
+ onChange(event) {
661
+ const format2 = assertFormat(event.currentTarget.value);
662
+ send({ type: "FORMAT.SET", format: format2, src: "format-select" });
663
+ }
664
+ });
665
+ }
666
+ };
667
+ }
668
+ var formats = ["hsba", "hsla", "rgba"];
669
+ var formatRegex = new RegExp(`^(${formats.join("|")})$`);
670
+ function getNextFormat(format) {
671
+ const index = formats.indexOf(format);
672
+ return formats[index + 1] ?? formats[0];
673
+ }
674
+ function assertFormat(format) {
675
+ if (formatRegex.test(format)) return format;
676
+ throw new Error(`Unsupported color format: ${format}`);
677
+ }
678
+ // Annotate the CommonJS export names for ESM import in node:
679
+ 0 && (module.exports = {
680
+ connect
681
+ });