@zag-js/slider 0.49.0 → 0.51.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.mjs CHANGED
@@ -1,854 +1,2 @@
1
- // src/slider.anatomy.ts
2
- import { createAnatomy } from "@zag-js/anatomy";
3
- var anatomy = createAnatomy("slider").parts(
4
- "root",
5
- "label",
6
- "thumb",
7
- "valueText",
8
- "track",
9
- "range",
10
- "control",
11
- "markerGroup",
12
- "marker"
13
- );
14
- var parts = anatomy.build();
15
-
16
- // src/slider.connect.ts
17
- import {
18
- getEventKey,
19
- getEventPoint,
20
- getEventStep,
21
- getNativeEvent,
22
- isLeftClick,
23
- isModifierKey
24
- } from "@zag-js/dom-event";
25
- import { ariaAttr, dataAttr } from "@zag-js/dom-query";
26
- import { getPercentValue as getPercentValue2, getValuePercent as getValuePercent2 } from "@zag-js/numeric-range";
27
-
28
- // src/slider.dom.ts
29
- import { getRelativePoint } from "@zag-js/dom-event";
30
- import { createScope, queryAll } from "@zag-js/dom-query";
31
- import { dispatchInputValueEvent } from "@zag-js/form-utils";
32
- import { getPercentValue } from "@zag-js/numeric-range";
33
-
34
- // src/slider.style.ts
35
- import { getValuePercent, getValueTransformer } from "@zag-js/numeric-range";
36
- function getBounds(value) {
37
- const firstValue = value[0];
38
- const lastThumb = value[value.length - 1];
39
- return [firstValue, lastThumb];
40
- }
41
- function getRangeOffsets(ctx) {
42
- const [firstPercent, lastPercent] = getBounds(ctx.valuePercent);
43
- if (ctx.valuePercent.length === 1) {
44
- if (ctx.origin === "center") {
45
- const isNegative = ctx.valuePercent[0] < 50;
46
- const start = isNegative ? `${ctx.valuePercent[0]}%` : "50%";
47
- const end = isNegative ? "50%" : `${100 - ctx.valuePercent[0]}%`;
48
- return { start, end };
49
- }
50
- return { start: "0%", end: `${100 - lastPercent}%` };
51
- }
52
- return { start: `${firstPercent}%`, end: `${100 - lastPercent}%` };
53
- }
54
- function getRangeStyle(ctx) {
55
- if (ctx.isVertical) {
56
- return {
57
- position: "absolute",
58
- bottom: "var(--slider-range-start)",
59
- top: "var(--slider-range-end)"
60
- };
61
- }
62
- return {
63
- position: "absolute",
64
- [ctx.isRtl ? "right" : "left"]: "var(--slider-range-start)",
65
- [ctx.isRtl ? "left" : "right"]: "var(--slider-range-end)"
66
- };
67
- }
68
- function getVerticalThumbOffset(ctx) {
69
- const { height = 0 } = ctx.thumbSize ?? {};
70
- const getValue = getValueTransformer([ctx.min, ctx.max], [-height / 2, height / 2]);
71
- return parseFloat(getValue(ctx.value).toFixed(2));
72
- }
73
- function getHorizontalThumbOffset(ctx) {
74
- const { width = 0 } = ctx.thumbSize ?? {};
75
- if (ctx.isRtl) {
76
- const getValue2 = getValueTransformer([ctx.max, ctx.min], [-width / 2, width / 2]);
77
- return -1 * parseFloat(getValue2(ctx.value).toFixed(2));
78
- }
79
- const getValue = getValueTransformer([ctx.min, ctx.max], [-width / 2, width / 2]);
80
- return parseFloat(getValue(ctx.value).toFixed(2));
81
- }
82
- function getOffset(ctx, percent) {
83
- if (ctx.thumbAlignment === "center")
84
- return `${percent}%`;
85
- const offset = ctx.isVertical ? getVerticalThumbOffset(ctx) : getHorizontalThumbOffset(ctx);
86
- return `calc(${percent}% - ${offset}px)`;
87
- }
88
- function getThumbOffset(ctx) {
89
- let percent = getValuePercent(ctx.value, ctx.min, ctx.max) * 100;
90
- return getOffset(ctx, percent);
91
- }
92
- function getVisibility(ctx) {
93
- let visibility = "visible";
94
- if (ctx.thumbAlignment === "contain" && !ctx.hasMeasuredThumbSize) {
95
- visibility = "hidden";
96
- }
97
- return visibility;
98
- }
99
- function getThumbStyle(ctx, index) {
100
- const placementProp = ctx.isVertical ? "bottom" : "insetInlineStart";
101
- return {
102
- visibility: getVisibility(ctx),
103
- position: "absolute",
104
- transform: "var(--slider-thumb-transform)",
105
- [placementProp]: `var(--slider-thumb-offset-${index})`
106
- };
107
- }
108
- function getControlStyle() {
109
- return {
110
- touchAction: "none",
111
- userSelect: "none",
112
- position: "relative"
113
- };
114
- }
115
- function getRootStyle(ctx) {
116
- const range = getRangeOffsets(ctx);
117
- const offsetStyles = ctx.value.reduce((styles, value, index) => {
118
- const offset = getThumbOffset({ ...ctx, value });
119
- return { ...styles, [`--slider-thumb-offset-${index}`]: offset };
120
- }, {});
121
- return {
122
- ...offsetStyles,
123
- "--slider-thumb-transform": ctx.isVertical ? "translateY(50%)" : ctx.isRtl ? "translateX(50%)" : "translateX(-50%)",
124
- "--slider-range-start": range.start,
125
- "--slider-range-end": range.end
126
- };
127
- }
128
- function getMarkerStyle(ctx, value) {
129
- return {
130
- // @ts-expect-error
131
- visibility: getVisibility(ctx),
132
- position: "absolute",
133
- pointerEvents: "none",
134
- // @ts-expect-error
135
- [ctx.isHorizontal ? "insetInlineStart" : "bottom"]: getThumbOffset({ ...ctx, value }),
136
- translate: "var(--tx) var(--ty)",
137
- "--tx": ctx.isHorizontal ? ctx.isRtl ? "50%" : "-50%" : "0%",
138
- "--ty": !ctx.isHorizontal ? "50%" : "0%"
139
- };
140
- }
141
- function getMarkerGroupStyle() {
142
- return {
143
- userSelect: "none",
144
- pointerEvents: "none",
145
- position: "relative"
146
- };
147
- }
148
- var styleGetterFns = {
149
- getRootStyle,
150
- getControlStyle,
151
- getThumbStyle,
152
- getRangeStyle,
153
- getMarkerStyle,
154
- getMarkerGroupStyle
155
- };
156
-
157
- // src/slider.dom.ts
158
- var dom = createScope({
159
- ...styleGetterFns,
160
- getRootId: (ctx) => ctx.ids?.root ?? `slider:${ctx.id}`,
161
- getThumbId: (ctx, index) => ctx.ids?.thumb?.(index) ?? `slider:${ctx.id}:thumb:${index}`,
162
- getHiddenInputId: (ctx, index) => `slider:${ctx.id}:input:${index}`,
163
- getControlId: (ctx) => ctx.ids?.control ?? `slider:${ctx.id}:control`,
164
- getTrackId: (ctx) => ctx.ids?.track ?? `slider:${ctx.id}:track`,
165
- getRangeId: (ctx) => ctx.ids?.range ?? `slider:${ctx.id}:range`,
166
- getLabelId: (ctx) => ctx.ids?.label ?? `slider:${ctx.id}:label`,
167
- getValueTextId: (ctx) => ctx.ids?.valueText ?? `slider:${ctx.id}:valueText`,
168
- getMarkerId: (ctx, value) => ctx.ids?.marker?.(value) ?? `slider:${ctx.id}:marker:${value}`,
169
- getRootEl: (ctx) => dom.getById(ctx, dom.getRootId(ctx)),
170
- getThumbEl: (ctx, index) => dom.getById(ctx, dom.getThumbId(ctx, index)),
171
- getHiddenInputEl: (ctx, index) => dom.getById(ctx, dom.getHiddenInputId(ctx, index)),
172
- getControlEl: (ctx) => dom.getById(ctx, dom.getControlId(ctx)),
173
- getElements: (ctx) => queryAll(dom.getControlEl(ctx), "[role=slider]"),
174
- getFirstEl: (ctx) => dom.getElements(ctx)[0],
175
- getRangeEl: (ctx) => dom.getById(ctx, dom.getRangeId(ctx)),
176
- getValueFromPoint(ctx, point) {
177
- const controlEl = dom.getControlEl(ctx);
178
- if (!controlEl)
179
- return;
180
- const relativePoint = getRelativePoint(point, controlEl);
181
- const percent = relativePoint.getPercentValue({
182
- orientation: ctx.orientation,
183
- dir: ctx.dir,
184
- inverted: { y: true }
185
- });
186
- return getPercentValue(percent, ctx.min, ctx.max, ctx.step);
187
- },
188
- dispatchChangeEvent(ctx) {
189
- const valueArray = Array.from(ctx.value);
190
- valueArray.forEach((value, index) => {
191
- const inputEl = dom.getHiddenInputEl(ctx, index);
192
- if (!inputEl)
193
- return;
194
- dispatchInputValueEvent(inputEl, { value });
195
- });
196
- }
197
- });
198
-
199
- // src/slider.utils.ts
200
- import {
201
- clampValue,
202
- getClosestValueIndex,
203
- getNextStepValue,
204
- getPreviousStepValue,
205
- getValueRanges,
206
- snapValueToStep
207
- } from "@zag-js/numeric-range";
208
- function normalizeValues(ctx, nextValues) {
209
- return nextValues.map((value, index, values) => {
210
- return constrainValue({ ...ctx, value: values }, value, index);
211
- });
212
- }
213
- function getRangeAtIndex(ctx, index) {
214
- return getValueRanges(ctx.value, ctx.min, ctx.max, ctx.minStepsBetweenThumbs)[index];
215
- }
216
- function constrainValue(ctx, value, index) {
217
- const range = getRangeAtIndex(ctx, index);
218
- const snapValue = snapValueToStep(value, ctx.min, ctx.max, ctx.step);
219
- return clampValue(snapValue, range.min, range.max);
220
- }
221
- function decrement(ctx, index, step) {
222
- const idx = index ?? ctx.focusedIndex;
223
- const range = getRangeAtIndex(ctx, idx);
224
- const nextValues = getPreviousStepValue(idx, {
225
- ...range,
226
- step: step ?? ctx.step,
227
- values: ctx.value
228
- });
229
- nextValues[idx] = clampValue(nextValues[idx], range.min, range.max);
230
- return nextValues;
231
- }
232
- function increment(ctx, index, step) {
233
- const idx = index ?? ctx.focusedIndex;
234
- const range = getRangeAtIndex(ctx, idx);
235
- const nextValues = getNextStepValue(idx, {
236
- ...range,
237
- step: step ?? ctx.step,
238
- values: ctx.value
239
- });
240
- nextValues[idx] = clampValue(nextValues[idx], range.min, range.max);
241
- return nextValues;
242
- }
243
- function getClosestIndex(ctx, pointValue) {
244
- return getClosestValueIndex(ctx.value, pointValue);
245
- }
246
- function assignArray(current, next) {
247
- for (let i = 0; i < next.length; i++) {
248
- const value = next[i];
249
- current[i] = value;
250
- }
251
- }
252
-
253
- // src/slider.connect.ts
254
- function connect(state, send, normalize) {
255
- const ariaLabel = state.context["aria-label"];
256
- const ariaLabelledBy = state.context["aria-labelledby"];
257
- const sliderValue = state.context.value;
258
- const focused = state.matches("focus");
259
- const dragging = state.matches("dragging");
260
- const disabled = state.context.isDisabled;
261
- const invalid = state.context.invalid;
262
- const interactive = state.context.isInteractive;
263
- function getValuePercentFn(value) {
264
- return getValuePercent2(value, state.context.min, state.context.max);
265
- }
266
- function getPercentValueFn(percent) {
267
- return getPercentValue2(percent, state.context.min, state.context.max, state.context.step);
268
- }
269
- return {
270
- value: state.context.value,
271
- dragging,
272
- focused,
273
- setValue(value) {
274
- send({ type: "SET_VALUE", value });
275
- },
276
- getThumbValue(index) {
277
- return sliderValue[index];
278
- },
279
- setThumbValue(index, value) {
280
- send({ type: "SET_VALUE", index, value });
281
- },
282
- getValuePercent: getValuePercentFn,
283
- getPercentValue: getPercentValueFn,
284
- getThumbPercent(index) {
285
- return getValuePercentFn(sliderValue[index]);
286
- },
287
- setThumbPercent(index, percent) {
288
- const value = getPercentValueFn(percent);
289
- send({ type: "SET_VALUE", index, value });
290
- },
291
- getThumbMin(index) {
292
- return getRangeAtIndex(state.context, index).min;
293
- },
294
- getThumbMax(index) {
295
- return getRangeAtIndex(state.context, index).max;
296
- },
297
- increment(index) {
298
- send({ type: "INCREMENT", index });
299
- },
300
- decrement(index) {
301
- send({ type: "DECREMENT", index });
302
- },
303
- focus() {
304
- if (!interactive)
305
- return;
306
- send({ type: "FOCUS", index: 0 });
307
- },
308
- labelProps: normalize.label({
309
- ...parts.label.attrs,
310
- dir: state.context.dir,
311
- "data-disabled": dataAttr(disabled),
312
- "data-orientation": state.context.orientation,
313
- "data-invalid": dataAttr(invalid),
314
- "data-focus": dataAttr(focused),
315
- id: dom.getLabelId(state.context),
316
- htmlFor: dom.getHiddenInputId(state.context, 0),
317
- onClick(event) {
318
- if (!interactive)
319
- return;
320
- event.preventDefault();
321
- dom.getFirstEl(state.context)?.focus();
322
- },
323
- style: {
324
- userSelect: "none"
325
- }
326
- }),
327
- rootProps: normalize.element({
328
- ...parts.root.attrs,
329
- "data-disabled": dataAttr(disabled),
330
- "data-orientation": state.context.orientation,
331
- "data-invalid": dataAttr(invalid),
332
- "data-focus": dataAttr(focused),
333
- id: dom.getRootId(state.context),
334
- dir: state.context.dir,
335
- style: dom.getRootStyle(state.context)
336
- }),
337
- valueTextProps: normalize.element({
338
- ...parts.valueText.attrs,
339
- dir: state.context.dir,
340
- "data-disabled": dataAttr(disabled),
341
- "data-orientation": state.context.orientation,
342
- "data-invalid": dataAttr(invalid),
343
- "data-focus": dataAttr(focused),
344
- id: dom.getValueTextId(state.context)
345
- }),
346
- trackProps: normalize.element({
347
- ...parts.track.attrs,
348
- dir: state.context.dir,
349
- id: dom.getTrackId(state.context),
350
- "data-disabled": dataAttr(disabled),
351
- "data-invalid": dataAttr(invalid),
352
- "data-orientation": state.context.orientation,
353
- "data-focus": dataAttr(focused),
354
- style: { position: "relative" }
355
- }),
356
- getThumbProps(props2) {
357
- const { index = 0, name } = props2;
358
- const value = sliderValue[index];
359
- const range = getRangeAtIndex(state.context, index);
360
- const valueText = state.context.getAriaValueText?.({ value, index });
361
- const _ariaLabel = Array.isArray(ariaLabel) ? ariaLabel[index] : ariaLabel;
362
- const _ariaLabelledBy = Array.isArray(ariaLabelledBy) ? ariaLabelledBy[index] : ariaLabelledBy;
363
- return normalize.element({
364
- ...parts.thumb.attrs,
365
- dir: state.context.dir,
366
- "data-index": index,
367
- "data-name": name,
368
- id: dom.getThumbId(state.context, index),
369
- "data-disabled": dataAttr(disabled),
370
- "data-orientation": state.context.orientation,
371
- "data-focus": dataAttr(focused && state.context.focusedIndex === index),
372
- draggable: false,
373
- "aria-disabled": ariaAttr(disabled),
374
- "aria-label": _ariaLabel,
375
- "aria-labelledby": _ariaLabelledBy ?? dom.getLabelId(state.context),
376
- "aria-orientation": state.context.orientation,
377
- "aria-valuemax": range.max,
378
- "aria-valuemin": range.min,
379
- "aria-valuenow": sliderValue[index],
380
- "aria-valuetext": valueText,
381
- role: "slider",
382
- tabIndex: disabled ? void 0 : 0,
383
- style: dom.getThumbStyle(state.context, index),
384
- onPointerDown(event) {
385
- if (!interactive)
386
- return;
387
- send({ type: "THUMB_POINTER_DOWN", index });
388
- event.stopPropagation();
389
- },
390
- onBlur() {
391
- if (!interactive)
392
- return;
393
- send("BLUR");
394
- },
395
- onFocus() {
396
- if (!interactive)
397
- return;
398
- send({ type: "FOCUS", index });
399
- },
400
- onKeyDown(event) {
401
- if (event.defaultPrevented)
402
- return;
403
- if (!interactive)
404
- return;
405
- const step = getEventStep(event) * state.context.step;
406
- let prevent = true;
407
- const keyMap = {
408
- ArrowUp() {
409
- send({ type: "ARROW_UP", step });
410
- prevent = state.context.isVertical;
411
- },
412
- ArrowDown() {
413
- send({ type: "ARROW_DOWN", step });
414
- prevent = state.context.isVertical;
415
- },
416
- ArrowLeft() {
417
- send({ type: "ARROW_LEFT", step });
418
- prevent = state.context.isHorizontal;
419
- },
420
- ArrowRight() {
421
- send({ type: "ARROW_RIGHT", step });
422
- prevent = state.context.isHorizontal;
423
- },
424
- PageUp() {
425
- send({ type: "PAGE_UP", step });
426
- },
427
- PageDown() {
428
- send({ type: "PAGE_DOWN", step });
429
- },
430
- Home() {
431
- send("HOME");
432
- },
433
- End() {
434
- send("END");
435
- }
436
- };
437
- const key = getEventKey(event, state.context);
438
- const exec = keyMap[key];
439
- if (!exec)
440
- return;
441
- exec(event);
442
- if (prevent) {
443
- event.preventDefault();
444
- event.stopPropagation();
445
- }
446
- }
447
- });
448
- },
449
- getHiddenInputProps(props2) {
450
- const { index = 0, name } = props2;
451
- return normalize.input({
452
- name: name ?? (state.context.name ? state.context.name + (state.context.value.length > 1 ? "[]" : "") : void 0),
453
- form: state.context.form,
454
- type: "text",
455
- hidden: true,
456
- defaultValue: state.context.value[index],
457
- id: dom.getHiddenInputId(state.context, index)
458
- });
459
- },
460
- rangeProps: normalize.element({
461
- id: dom.getRangeId(state.context),
462
- ...parts.range.attrs,
463
- dir: state.context.dir,
464
- "data-focus": dataAttr(focused),
465
- "data-invalid": dataAttr(invalid),
466
- "data-disabled": dataAttr(disabled),
467
- "data-orientation": state.context.orientation,
468
- style: dom.getRangeStyle(state.context)
469
- }),
470
- controlProps: normalize.element({
471
- ...parts.control.attrs,
472
- dir: state.context.dir,
473
- id: dom.getControlId(state.context),
474
- "data-disabled": dataAttr(disabled),
475
- "data-orientation": state.context.orientation,
476
- "data-invalid": dataAttr(invalid),
477
- "data-focus": dataAttr(focused),
478
- style: dom.getControlStyle(),
479
- onPointerDown(event) {
480
- if (!interactive)
481
- return;
482
- const evt = getNativeEvent(event);
483
- if (!isLeftClick(evt) || isModifierKey(evt))
484
- return;
485
- const point = getEventPoint(evt);
486
- send({ type: "POINTER_DOWN", point });
487
- event.preventDefault();
488
- event.stopPropagation();
489
- }
490
- }),
491
- markerGroupProps: normalize.element({
492
- ...parts.markerGroup.attrs,
493
- role: "presentation",
494
- dir: state.context.dir,
495
- "aria-hidden": true,
496
- "data-orientation": state.context.orientation,
497
- style: dom.getMarkerGroupStyle()
498
- }),
499
- getMarkerProps(props2) {
500
- const style = dom.getMarkerStyle(state.context, props2.value);
501
- let markerState;
502
- const first = state.context.value[0];
503
- const last = state.context.value[state.context.value.length - 1];
504
- if (props2.value < first) {
505
- markerState = "under-value";
506
- } else if (props2.value > last) {
507
- markerState = "over-value";
508
- } else {
509
- markerState = "at-value";
510
- }
511
- return normalize.element({
512
- ...parts.marker.attrs,
513
- id: dom.getMarkerId(state.context, props2.value),
514
- role: "presentation",
515
- dir: state.context.dir,
516
- "data-orientation": state.context.orientation,
517
- "data-value": props2.value,
518
- "data-disabled": dataAttr(disabled),
519
- "data-state": markerState,
520
- style
521
- });
522
- }
523
- };
524
- }
525
-
526
- // src/slider.machine.ts
527
- import { createMachine } from "@zag-js/core";
528
- import { trackPointerMove } from "@zag-js/dom-event";
529
- import { raf } from "@zag-js/dom-query";
530
- import { trackElementsSize } from "@zag-js/element-size";
531
- import { trackFormControl } from "@zag-js/form-utils";
532
- import { getValuePercent as getValuePercent3 } from "@zag-js/numeric-range";
533
- import { compact, isEqual } from "@zag-js/utils";
534
- var isEqualSize = (a, b) => {
535
- return a?.width === b?.width && a?.height === b?.height;
536
- };
537
- function machine(userContext) {
538
- const ctx = compact(userContext);
539
- return createMachine(
540
- {
541
- id: "slider",
542
- initial: "idle",
543
- context: {
544
- thumbSize: null,
545
- thumbAlignment: "contain",
546
- focusedIndex: -1,
547
- min: 0,
548
- max: 100,
549
- step: 1,
550
- value: [0],
551
- origin: "start",
552
- orientation: "horizontal",
553
- dir: "ltr",
554
- minStepsBetweenThumbs: 0,
555
- disabled: false,
556
- ...ctx,
557
- fieldsetDisabled: false
558
- },
559
- computed: {
560
- isHorizontal: (ctx2) => ctx2.orientation === "horizontal",
561
- isVertical: (ctx2) => ctx2.orientation === "vertical",
562
- isRtl: (ctx2) => ctx2.orientation === "horizontal" && ctx2.dir === "rtl",
563
- isDisabled: (ctx2) => !!ctx2.disabled || ctx2.fieldsetDisabled,
564
- isInteractive: (ctx2) => !(ctx2.readOnly || ctx2.isDisabled),
565
- spacing: (ctx2) => ctx2.minStepsBetweenThumbs * ctx2.step,
566
- hasMeasuredThumbSize: (ctx2) => ctx2.thumbSize != null,
567
- valuePercent(ctx2) {
568
- return ctx2.value.map((value) => 100 * getValuePercent3(value, ctx2.min, ctx2.max));
569
- }
570
- },
571
- watch: {
572
- value: ["syncInputElements"]
573
- },
574
- entry: ["coarseValue"],
575
- activities: ["trackFormControlState", "trackThumbsSize"],
576
- on: {
577
- SET_VALUE: [
578
- {
579
- guard: "hasIndex",
580
- actions: "setValueAtIndex"
581
- },
582
- { actions: "setValue" }
583
- ],
584
- INCREMENT: {
585
- actions: "incrementAtIndex"
586
- },
587
- DECREMENT: {
588
- actions: "decrementAtIndex"
589
- }
590
- },
591
- states: {
592
- idle: {
593
- on: {
594
- POINTER_DOWN: {
595
- target: "dragging",
596
- actions: ["setClosestThumbIndex", "setPointerValue", "focusActiveThumb"]
597
- },
598
- FOCUS: {
599
- target: "focus",
600
- actions: "setFocusedIndex"
601
- },
602
- THUMB_POINTER_DOWN: {
603
- target: "dragging",
604
- actions: ["setFocusedIndex", "focusActiveThumb"]
605
- }
606
- }
607
- },
608
- focus: {
609
- entry: "focusActiveThumb",
610
- on: {
611
- POINTER_DOWN: {
612
- target: "dragging",
613
- actions: ["setClosestThumbIndex", "setPointerValue", "focusActiveThumb"]
614
- },
615
- THUMB_POINTER_DOWN: {
616
- target: "dragging",
617
- actions: ["setFocusedIndex", "focusActiveThumb"]
618
- },
619
- ARROW_LEFT: {
620
- guard: "isHorizontal",
621
- actions: "decrementAtIndex"
622
- },
623
- ARROW_RIGHT: {
624
- guard: "isHorizontal",
625
- actions: "incrementAtIndex"
626
- },
627
- ARROW_UP: {
628
- guard: "isVertical",
629
- actions: "incrementAtIndex"
630
- },
631
- ARROW_DOWN: {
632
- guard: "isVertical",
633
- actions: "decrementAtIndex"
634
- },
635
- PAGE_UP: {
636
- actions: "incrementAtIndex"
637
- },
638
- PAGE_DOWN: {
639
- actions: "decrementAtIndex"
640
- },
641
- HOME: {
642
- actions: "setActiveThumbToMin"
643
- },
644
- END: {
645
- actions: "setActiveThumbToMax"
646
- },
647
- BLUR: {
648
- target: "idle",
649
- actions: "clearFocusedIndex"
650
- }
651
- }
652
- },
653
- dragging: {
654
- entry: "focusActiveThumb",
655
- activities: "trackPointerMove",
656
- on: {
657
- POINTER_UP: {
658
- target: "focus",
659
- actions: "invokeOnChangeEnd"
660
- },
661
- POINTER_MOVE: {
662
- actions: "setPointerValue"
663
- }
664
- }
665
- }
666
- }
667
- },
668
- {
669
- guards: {
670
- isHorizontal: (ctx2) => ctx2.isHorizontal,
671
- isVertical: (ctx2) => ctx2.isVertical,
672
- hasIndex: (_ctx, evt) => evt.index != null
673
- },
674
- activities: {
675
- trackFormControlState(ctx2, _evt, { initialContext }) {
676
- return trackFormControl(dom.getRootEl(ctx2), {
677
- onFieldsetDisabledChange(disabled) {
678
- ctx2.fieldsetDisabled = disabled;
679
- },
680
- onFormReset() {
681
- set.value(ctx2, initialContext.value);
682
- }
683
- });
684
- },
685
- trackPointerMove(ctx2, _evt, { send }) {
686
- return trackPointerMove(dom.getDoc(ctx2), {
687
- onPointerMove(info) {
688
- send({ type: "POINTER_MOVE", point: info.point });
689
- },
690
- onPointerUp() {
691
- send("POINTER_UP");
692
- }
693
- });
694
- },
695
- trackThumbsSize(ctx2) {
696
- if (ctx2.thumbAlignment !== "contain" || ctx2.thumbSize)
697
- return;
698
- return trackElementsSize({
699
- getNodes: () => dom.getElements(ctx2),
700
- observeMutation: true,
701
- callback(size) {
702
- if (!size || isEqualSize(ctx2.thumbSize, size))
703
- return;
704
- ctx2.thumbSize = size;
705
- }
706
- });
707
- }
708
- },
709
- actions: {
710
- syncInputElements(ctx2) {
711
- ctx2.value.forEach((value, index) => {
712
- const inputEl = dom.getHiddenInputEl(ctx2, index);
713
- dom.setValue(inputEl, value);
714
- });
715
- },
716
- invokeOnChangeEnd(ctx2) {
717
- ctx2.onValueChangeEnd?.({ value: ctx2.value });
718
- },
719
- setClosestThumbIndex(ctx2, evt) {
720
- const pointValue = dom.getValueFromPoint(ctx2, evt.point);
721
- if (pointValue == null)
722
- return;
723
- const focusedIndex = getClosestIndex(ctx2, pointValue);
724
- set.focusedIndex(ctx2, focusedIndex);
725
- },
726
- setFocusedIndex(ctx2, evt) {
727
- set.focusedIndex(ctx2, evt.index);
728
- },
729
- clearFocusedIndex(ctx2) {
730
- set.focusedIndex(ctx2, -1);
731
- },
732
- setPointerValue(ctx2, evt) {
733
- const pointerValue = dom.getValueFromPoint(ctx2, evt.point);
734
- if (pointerValue == null)
735
- return;
736
- const value = constrainValue(ctx2, pointerValue, ctx2.focusedIndex);
737
- set.valueAtIndex(ctx2, ctx2.focusedIndex, value);
738
- },
739
- focusActiveThumb(ctx2) {
740
- raf(() => {
741
- const thumbEl = dom.getThumbEl(ctx2, ctx2.focusedIndex);
742
- thumbEl?.focus({ preventScroll: true });
743
- });
744
- },
745
- decrementAtIndex(ctx2, evt) {
746
- const value = decrement(ctx2, evt.index, evt.step);
747
- set.value(ctx2, value);
748
- },
749
- incrementAtIndex(ctx2, evt) {
750
- const value = increment(ctx2, evt.index, evt.step);
751
- set.value(ctx2, value);
752
- },
753
- setActiveThumbToMin(ctx2) {
754
- const { min } = getRangeAtIndex(ctx2, ctx2.focusedIndex);
755
- set.valueAtIndex(ctx2, ctx2.focusedIndex, min);
756
- },
757
- setActiveThumbToMax(ctx2) {
758
- const { max } = getRangeAtIndex(ctx2, ctx2.focusedIndex);
759
- set.valueAtIndex(ctx2, ctx2.focusedIndex, max);
760
- },
761
- coarseValue(ctx2) {
762
- const value = normalizeValues(ctx2, ctx2.value);
763
- set.value(ctx2, value);
764
- },
765
- setValueAtIndex(ctx2, evt) {
766
- const value = constrainValue(ctx2, evt.value, evt.index);
767
- set.valueAtIndex(ctx2, evt.index, value);
768
- },
769
- setValue(ctx2, evt) {
770
- const value = normalizeValues(ctx2, evt.value);
771
- set.value(ctx2, value);
772
- }
773
- }
774
- }
775
- );
776
- }
777
- var invoke = {
778
- change: (ctx) => {
779
- ctx.onValueChange?.({
780
- value: Array.from(ctx.value)
781
- });
782
- dom.dispatchChangeEvent(ctx);
783
- },
784
- focusChange: (ctx) => {
785
- ctx.onFocusChange?.({
786
- value: Array.from(ctx.value),
787
- focusedIndex: ctx.focusedIndex
788
- });
789
- }
790
- };
791
- var set = {
792
- valueAtIndex: (ctx, index, value) => {
793
- if (isEqual(ctx.value[index], value))
794
- return;
795
- ctx.value[index] = value;
796
- invoke.change(ctx);
797
- },
798
- value: (ctx, value) => {
799
- if (isEqual(ctx.value, value))
800
- return;
801
- assignArray(ctx.value, value);
802
- invoke.change(ctx);
803
- },
804
- focusedIndex: (ctx, index) => {
805
- if (isEqual(ctx.focusedIndex, index))
806
- return;
807
- ctx.focusedIndex = index;
808
- invoke.focusChange(ctx);
809
- }
810
- };
811
-
812
- // src/slider.props.ts
813
- import { createProps } from "@zag-js/types";
814
- import { createSplitProps } from "@zag-js/utils";
815
- var props = createProps()([
816
- "aria-label",
817
- "aria-labelledby",
818
- "dir",
819
- "disabled",
820
- "form",
821
- "getAriaValueText",
822
- "getRootNode",
823
- "id",
824
- "ids",
825
- "invalid",
826
- "max",
827
- "min",
828
- "minStepsBetweenThumbs",
829
- "name",
830
- "onFocusChange",
831
- "onValueChange",
832
- "onValueChangeEnd",
833
- "orientation",
834
- "origin",
835
- "readOnly",
836
- "step",
837
- "thumbAlignment",
838
- "thumbAlignment",
839
- "thumbSize",
840
- "value"
841
- ]);
842
- var splitProps = createSplitProps(props);
843
- var thumbProps = createProps()(["index", "name"]);
844
- var splitThumbProps = createSplitProps(thumbProps);
845
- export {
846
- anatomy,
847
- connect,
848
- machine,
849
- props,
850
- splitProps,
851
- splitThumbProps,
852
- thumbProps
853
- };
1
+ import{createAnatomy}from"@zag-js/anatomy";var anatomy=createAnatomy("slider").parts("root","label","thumb","valueText","track","range","control","markerGroup","marker");var parts=anatomy.build();import{getEventKey,getEventPoint,getEventStep,getNativeEvent,isLeftClick,isModifierKey}from"@zag-js/dom-event";import{ariaAttr,dataAttr}from"@zag-js/dom-query";import{getPercentValue as getPercentValue2,getValuePercent as getValuePercent2}from"@zag-js/numeric-range";import{getRelativePoint}from"@zag-js/dom-event";import{createScope,queryAll}from"@zag-js/dom-query";import{dispatchInputValueEvent}from"@zag-js/form-utils";import{getPercentValue}from"@zag-js/numeric-range";import{getValuePercent,getValueTransformer}from"@zag-js/numeric-range";function getBounds(value){const firstValue=value[0];const lastThumb=value[value.length-1];return[firstValue,lastThumb]}function getRangeOffsets(ctx){const[firstPercent,lastPercent]=getBounds(ctx.valuePercent);if(ctx.valuePercent.length===1){if(ctx.origin==="center"){const isNegative=ctx.valuePercent[0]<50;const start=isNegative?`${ctx.valuePercent[0]}%`:"50%";const end=isNegative?"50%":`${100-ctx.valuePercent[0]}%`;return{start,end}}return{start:"0%",end:`${100-lastPercent}%`}}return{start:`${firstPercent}%`,end:`${100-lastPercent}%`}}function getRangeStyle(ctx){if(ctx.isVertical){return{position:"absolute",bottom:"var(--slider-range-start)",top:"var(--slider-range-end)"}}return{position:"absolute",[ctx.isRtl?"right":"left"]:"var(--slider-range-start)",[ctx.isRtl?"left":"right"]:"var(--slider-range-end)"}}function getVerticalThumbOffset(ctx){const{height=0}=ctx.thumbSize??{};const getValue=getValueTransformer([ctx.min,ctx.max],[-height/2,height/2]);return parseFloat(getValue(ctx.value).toFixed(2))}function getHorizontalThumbOffset(ctx){const{width=0}=ctx.thumbSize??{};if(ctx.isRtl){const getValue2=getValueTransformer([ctx.max,ctx.min],[-width/2,width/2]);return-1*parseFloat(getValue2(ctx.value).toFixed(2))}const getValue=getValueTransformer([ctx.min,ctx.max],[-width/2,width/2]);return parseFloat(getValue(ctx.value).toFixed(2))}function getOffset(ctx,percent){if(ctx.thumbAlignment==="center")return`${percent}%`;const offset=ctx.isVertical?getVerticalThumbOffset(ctx):getHorizontalThumbOffset(ctx);return`calc(${percent}% - ${offset}px)`}function getThumbOffset(ctx){let percent=getValuePercent(ctx.value,ctx.min,ctx.max)*100;return getOffset(ctx,percent)}function getVisibility(ctx){let visibility="visible";if(ctx.thumbAlignment==="contain"&&!ctx.hasMeasuredThumbSize){visibility="hidden"}return visibility}function getThumbStyle(ctx,index){const placementProp=ctx.isVertical?"bottom":"insetInlineStart";return{visibility:getVisibility(ctx),position:"absolute",transform:"var(--slider-thumb-transform)",[placementProp]:`var(--slider-thumb-offset-${index})`}}function getControlStyle(){return{touchAction:"none",userSelect:"none",position:"relative"}}function getRootStyle(ctx){const range=getRangeOffsets(ctx);const offsetStyles=ctx.value.reduce((styles,value,index)=>{const offset=getThumbOffset({...ctx,value});return{...styles,[`--slider-thumb-offset-${index}`]:offset}},{});return{...offsetStyles,"--slider-thumb-transform":ctx.isVertical?"translateY(50%)":ctx.isRtl?"translateX(50%)":"translateX(-50%)","--slider-range-start":range.start,"--slider-range-end":range.end}}function getMarkerStyle(ctx,value){return{visibility:getVisibility(ctx),position:"absolute",pointerEvents:"none",[ctx.isHorizontal?"insetInlineStart":"bottom"]:getThumbOffset({...ctx,value}),translate:"var(--tx) var(--ty)","--tx":ctx.isHorizontal?ctx.isRtl?"50%":"-50%":"0%","--ty":!ctx.isHorizontal?"50%":"0%"}}function getMarkerGroupStyle(){return{userSelect:"none",pointerEvents:"none",position:"relative"}}var styleGetterFns={getRootStyle,getControlStyle,getThumbStyle,getRangeStyle,getMarkerStyle,getMarkerGroupStyle};var dom=createScope({...styleGetterFns,getRootId:ctx=>ctx.ids?.root??`slider:${ctx.id}`,getThumbId:(ctx,index)=>ctx.ids?.thumb?.(index)??`slider:${ctx.id}:thumb:${index}`,getHiddenInputId:(ctx,index)=>`slider:${ctx.id}:input:${index}`,getControlId:ctx=>ctx.ids?.control??`slider:${ctx.id}:control`,getTrackId:ctx=>ctx.ids?.track??`slider:${ctx.id}:track`,getRangeId:ctx=>ctx.ids?.range??`slider:${ctx.id}:range`,getLabelId:ctx=>ctx.ids?.label??`slider:${ctx.id}:label`,getValueTextId:ctx=>ctx.ids?.valueText??`slider:${ctx.id}:valueText`,getMarkerId:(ctx,value)=>ctx.ids?.marker?.(value)??`slider:${ctx.id}:marker:${value}`,getRootEl:ctx=>dom.getById(ctx,dom.getRootId(ctx)),getThumbEl:(ctx,index)=>dom.getById(ctx,dom.getThumbId(ctx,index)),getHiddenInputEl:(ctx,index)=>dom.getById(ctx,dom.getHiddenInputId(ctx,index)),getControlEl:ctx=>dom.getById(ctx,dom.getControlId(ctx)),getElements:ctx=>queryAll(dom.getControlEl(ctx),"[role=slider]"),getFirstEl:ctx=>dom.getElements(ctx)[0],getRangeEl:ctx=>dom.getById(ctx,dom.getRangeId(ctx)),getValueFromPoint(ctx,point){const controlEl=dom.getControlEl(ctx);if(!controlEl)return;const relativePoint=getRelativePoint(point,controlEl);const percent=relativePoint.getPercentValue({orientation:ctx.orientation,dir:ctx.dir,inverted:{y:true}});return getPercentValue(percent,ctx.min,ctx.max,ctx.step)},dispatchChangeEvent(ctx){const valueArray=Array.from(ctx.value);valueArray.forEach((value,index)=>{const inputEl=dom.getHiddenInputEl(ctx,index);if(!inputEl)return;dispatchInputValueEvent(inputEl,{value})})}});import{clampValue,getClosestValueIndex,getNextStepValue,getPreviousStepValue,getValueRanges,snapValueToStep}from"@zag-js/numeric-range";function normalizeValues(ctx,nextValues){return nextValues.map((value,index,values)=>{return constrainValue({...ctx,value:values},value,index)})}function getRangeAtIndex(ctx,index){return getValueRanges(ctx.value,ctx.min,ctx.max,ctx.minStepsBetweenThumbs)[index]}function constrainValue(ctx,value,index){const range=getRangeAtIndex(ctx,index);const snapValue=snapValueToStep(value,ctx.min,ctx.max,ctx.step);return clampValue(snapValue,range.min,range.max)}function decrement(ctx,index,step){const idx=index??ctx.focusedIndex;const range=getRangeAtIndex(ctx,idx);const nextValues=getPreviousStepValue(idx,{...range,step:step??ctx.step,values:ctx.value});nextValues[idx]=clampValue(nextValues[idx],range.min,range.max);return nextValues}function increment(ctx,index,step){const idx=index??ctx.focusedIndex;const range=getRangeAtIndex(ctx,idx);const nextValues=getNextStepValue(idx,{...range,step:step??ctx.step,values:ctx.value});nextValues[idx]=clampValue(nextValues[idx],range.min,range.max);return nextValues}function getClosestIndex(ctx,pointValue){return getClosestValueIndex(ctx.value,pointValue)}function assignArray(current,next){for(let i=0;i<next.length;i++){const value=next[i];current[i]=value}}function connect(state,send,normalize){const ariaLabel=state.context["aria-label"];const ariaLabelledBy=state.context["aria-labelledby"];const sliderValue=state.context.value;const focused=state.matches("focus");const dragging=state.matches("dragging");const disabled=state.context.isDisabled;const invalid=state.context.invalid;const interactive=state.context.isInteractive;const isHorizontal=state.context.orientation==="horizontal";const isVertical=state.context.orientation==="vertical";function getValuePercentFn(value){return getValuePercent2(value,state.context.min,state.context.max)}function getPercentValueFn(percent){return getPercentValue2(percent,state.context.min,state.context.max,state.context.step)}return{value:state.context.value,dragging,focused,setValue(value){send({type:"SET_VALUE",value})},getThumbValue(index){return sliderValue[index]},setThumbValue(index,value){send({type:"SET_VALUE",index,value})},getValuePercent:getValuePercentFn,getPercentValue:getPercentValueFn,getThumbPercent(index){return getValuePercentFn(sliderValue[index])},setThumbPercent(index,percent){const value=getPercentValueFn(percent);send({type:"SET_VALUE",index,value})},getThumbMin(index){return getRangeAtIndex(state.context,index).min},getThumbMax(index){return getRangeAtIndex(state.context,index).max},increment(index){send({type:"INCREMENT",index})},decrement(index){send({type:"DECREMENT",index})},focus(){if(!interactive)return;send({type:"FOCUS",index:0})},labelProps:normalize.label({...parts.label.attrs,dir:state.context.dir,"data-disabled":dataAttr(disabled),"data-orientation":state.context.orientation,"data-invalid":dataAttr(invalid),"data-focus":dataAttr(focused),id:dom.getLabelId(state.context),htmlFor:dom.getHiddenInputId(state.context,0),onClick(event){if(!interactive)return;event.preventDefault();dom.getFirstEl(state.context)?.focus()},style:{userSelect:"none"}}),rootProps:normalize.element({...parts.root.attrs,"data-disabled":dataAttr(disabled),"data-orientation":state.context.orientation,"data-invalid":dataAttr(invalid),"data-focus":dataAttr(focused),id:dom.getRootId(state.context),dir:state.context.dir,style:dom.getRootStyle(state.context)}),valueTextProps:normalize.element({...parts.valueText.attrs,dir:state.context.dir,"data-disabled":dataAttr(disabled),"data-orientation":state.context.orientation,"data-invalid":dataAttr(invalid),"data-focus":dataAttr(focused),id:dom.getValueTextId(state.context)}),trackProps:normalize.element({...parts.track.attrs,dir:state.context.dir,id:dom.getTrackId(state.context),"data-disabled":dataAttr(disabled),"data-invalid":dataAttr(invalid),"data-orientation":state.context.orientation,"data-focus":dataAttr(focused),style:{position:"relative"}}),getThumbProps(props2){const{index=0,name}=props2;const value=sliderValue[index];const range=getRangeAtIndex(state.context,index);const valueText=state.context.getAriaValueText?.({value,index});const _ariaLabel=Array.isArray(ariaLabel)?ariaLabel[index]:ariaLabel;const _ariaLabelledBy=Array.isArray(ariaLabelledBy)?ariaLabelledBy[index]:ariaLabelledBy;return normalize.element({...parts.thumb.attrs,dir:state.context.dir,"data-index":index,"data-name":name,id:dom.getThumbId(state.context,index),"data-disabled":dataAttr(disabled),"data-orientation":state.context.orientation,"data-focus":dataAttr(focused&&state.context.focusedIndex===index),draggable:false,"aria-disabled":ariaAttr(disabled),"aria-label":_ariaLabel,"aria-labelledby":_ariaLabelledBy??dom.getLabelId(state.context),"aria-orientation":state.context.orientation,"aria-valuemax":range.max,"aria-valuemin":range.min,"aria-valuenow":sliderValue[index],"aria-valuetext":valueText,role:"slider",tabIndex:disabled?void 0:0,style:dom.getThumbStyle(state.context,index),onPointerDown(event){if(!interactive)return;send({type:"THUMB_POINTER_DOWN",index});event.stopPropagation()},onBlur(){if(!interactive)return;send("BLUR")},onFocus(){if(!interactive)return;send({type:"FOCUS",index})},onKeyDown(event){if(event.defaultPrevented)return;if(!interactive)return;const step=getEventStep(event)*state.context.step;const keyMap={ArrowUp(){if(isHorizontal)return;send({type:"ARROW_INC",step,src:"ArrowUp"})},ArrowDown(){if(isHorizontal)return;send({type:"ARROW_DEC",step,src:"ArrowDown"})},ArrowLeft(){if(isVertical)return;send({type:"ARROW_DEC",step,src:"ArrowLeft"})},ArrowRight(){if(isVertical)return;send({type:"ARROW_INC",step,src:"ArrowRight"})},PageUp(){send({type:"ARROW_INC",step,src:"PageUp"})},PageDown(){send({type:"ARROW_DEC",step,src:"PageDown"})},Home(){send("HOME")},End(){send("END")}};const key=getEventKey(event,state.context);const exec=keyMap[key];if(exec){exec(event);event.preventDefault();event.stopPropagation()}}})},getHiddenInputProps(props2){const{index=0,name}=props2;return normalize.input({name:name??(state.context.name?state.context.name+(state.context.value.length>1?"[]":""):void 0),form:state.context.form,type:"text",hidden:true,defaultValue:state.context.value[index],id:dom.getHiddenInputId(state.context,index)})},rangeProps:normalize.element({id:dom.getRangeId(state.context),...parts.range.attrs,dir:state.context.dir,"data-focus":dataAttr(focused),"data-invalid":dataAttr(invalid),"data-disabled":dataAttr(disabled),"data-orientation":state.context.orientation,style:dom.getRangeStyle(state.context)}),controlProps:normalize.element({...parts.control.attrs,dir:state.context.dir,id:dom.getControlId(state.context),"data-disabled":dataAttr(disabled),"data-orientation":state.context.orientation,"data-invalid":dataAttr(invalid),"data-focus":dataAttr(focused),style:dom.getControlStyle(),onPointerDown(event){if(!interactive)return;const evt=getNativeEvent(event);if(!isLeftClick(evt)||isModifierKey(evt))return;const point=getEventPoint(evt);send({type:"POINTER_DOWN",point});event.preventDefault();event.stopPropagation()}}),markerGroupProps:normalize.element({...parts.markerGroup.attrs,role:"presentation",dir:state.context.dir,"aria-hidden":true,"data-orientation":state.context.orientation,style:dom.getMarkerGroupStyle()}),getMarkerProps(props2){const style=dom.getMarkerStyle(state.context,props2.value);let markerState;const first=state.context.value[0];const last=state.context.value[state.context.value.length-1];if(props2.value<first){markerState="under-value"}else if(props2.value>last){markerState="over-value"}else{markerState="at-value"}return normalize.element({...parts.marker.attrs,id:dom.getMarkerId(state.context,props2.value),role:"presentation",dir:state.context.dir,"data-orientation":state.context.orientation,"data-value":props2.value,"data-disabled":dataAttr(disabled),"data-state":markerState,style})}}}import{createMachine}from"@zag-js/core";import{trackPointerMove}from"@zag-js/dom-event";import{raf}from"@zag-js/dom-query";import{trackElementsSize}from"@zag-js/element-size";import{trackFormControl}from"@zag-js/form-utils";import{getValuePercent as getValuePercent3}from"@zag-js/numeric-range";import{compact,isEqual}from"@zag-js/utils";var isEqualSize=(a,b)=>{return a?.width===b?.width&&a?.height===b?.height};function machine(userContext){const ctx=compact(userContext);return createMachine({id:"slider",initial:"idle",context:{thumbSize:null,thumbAlignment:"contain",min:0,max:100,step:1,value:[0],origin:"start",orientation:"horizontal",dir:"ltr",minStepsBetweenThumbs:0,disabled:false,...ctx,focusedIndex:-1,fieldsetDisabled:false},computed:{isHorizontal:ctx2=>ctx2.orientation==="horizontal",isVertical:ctx2=>ctx2.orientation==="vertical",isRtl:ctx2=>ctx2.orientation==="horizontal"&&ctx2.dir==="rtl",isDisabled:ctx2=>!!ctx2.disabled||ctx2.fieldsetDisabled,isInteractive:ctx2=>!(ctx2.readOnly||ctx2.isDisabled),hasMeasuredThumbSize:ctx2=>ctx2.thumbSize!=null,valuePercent(ctx2){return ctx2.value.map(value=>100*getValuePercent3(value,ctx2.min,ctx2.max))}},watch:{value:["syncInputElements"]},entry:["coarseValue"],activities:["trackFormControlState","trackThumbsSize"],on:{SET_VALUE:[{guard:"hasIndex",actions:"setValueAtIndex"},{actions:"setValue"}],INCREMENT:{actions:"incrementThumbAtIndex"},DECREMENT:{actions:"decrementThumbAtIndex"}},states:{idle:{on:{POINTER_DOWN:{target:"dragging",actions:["setClosestThumbIndex","setPointerValue","focusActiveThumb"]},FOCUS:{target:"focus",actions:"setFocusedIndex"},THUMB_POINTER_DOWN:{target:"dragging",actions:["setFocusedIndex","focusActiveThumb"]}}},focus:{entry:"focusActiveThumb",on:{POINTER_DOWN:{target:"dragging",actions:["setClosestThumbIndex","setPointerValue","focusActiveThumb"]},THUMB_POINTER_DOWN:{target:"dragging",actions:["setFocusedIndex","focusActiveThumb"]},ARROW_DEC:{actions:["decrementThumbAtIndex","invokeOnChangeEnd"]},ARROW_INC:{actions:["incrementThumbAtIndex","invokeOnChangeEnd"]},HOME:{actions:["setFocusedThumbToMin","invokeOnChangeEnd"]},END:{actions:["setFocusedThumbToMax","invokeOnChangeEnd"]},BLUR:{target:"idle",actions:"clearFocusedIndex"}}},dragging:{entry:"focusActiveThumb",activities:"trackPointerMove",on:{POINTER_UP:{target:"focus",actions:"invokeOnChangeEnd"},POINTER_MOVE:{actions:"setPointerValue"}}}}},{guards:{hasIndex:(_ctx,evt)=>evt.index!=null},activities:{trackFormControlState(ctx2,_evt,{initialContext}){return trackFormControl(dom.getRootEl(ctx2),{onFieldsetDisabledChange(disabled){ctx2.fieldsetDisabled=disabled},onFormReset(){set.value(ctx2,initialContext.value)}})},trackPointerMove(ctx2,_evt,{send}){return trackPointerMove(dom.getDoc(ctx2),{onPointerMove(info){send({type:"POINTER_MOVE",point:info.point})},onPointerUp(){send("POINTER_UP")}})},trackThumbsSize(ctx2){if(ctx2.thumbAlignment!=="contain"||ctx2.thumbSize)return;return trackElementsSize({getNodes:()=>dom.getElements(ctx2),observeMutation:true,callback(size){if(!size||isEqualSize(ctx2.thumbSize,size))return;ctx2.thumbSize=size}})}},actions:{syncInputElements(ctx2){ctx2.value.forEach((value,index)=>{const inputEl=dom.getHiddenInputEl(ctx2,index);dom.setValue(inputEl,value)})},invokeOnChangeEnd(ctx2){ctx2.onValueChangeEnd?.({value:ctx2.value})},setClosestThumbIndex(ctx2,evt){const pointValue=dom.getValueFromPoint(ctx2,evt.point);if(pointValue==null)return;const focusedIndex=getClosestIndex(ctx2,pointValue);set.focusedIndex(ctx2,focusedIndex)},setFocusedIndex(ctx2,evt){set.focusedIndex(ctx2,evt.index)},clearFocusedIndex(ctx2){set.focusedIndex(ctx2,-1)},setPointerValue(ctx2,evt){const pointerValue=dom.getValueFromPoint(ctx2,evt.point);if(pointerValue==null)return;const value=constrainValue(ctx2,pointerValue,ctx2.focusedIndex);set.valueAtIndex(ctx2,ctx2.focusedIndex,value)},focusActiveThumb(ctx2){raf(()=>{const thumbEl=dom.getThumbEl(ctx2,ctx2.focusedIndex);thumbEl?.focus({preventScroll:true})})},decrementThumbAtIndex(ctx2,evt){const value=decrement(ctx2,evt.index,evt.step);set.value(ctx2,value)},incrementThumbAtIndex(ctx2,evt){const value=increment(ctx2,evt.index,evt.step);set.value(ctx2,value)},setFocusedThumbToMin(ctx2){const{min}=getRangeAtIndex(ctx2,ctx2.focusedIndex);set.valueAtIndex(ctx2,ctx2.focusedIndex,min)},setFocusedThumbToMax(ctx2){const{max}=getRangeAtIndex(ctx2,ctx2.focusedIndex);set.valueAtIndex(ctx2,ctx2.focusedIndex,max)},coarseValue(ctx2){const value=normalizeValues(ctx2,ctx2.value);set.value(ctx2,value)},setValueAtIndex(ctx2,evt){const value=constrainValue(ctx2,evt.value,evt.index);set.valueAtIndex(ctx2,evt.index,value)},setValue(ctx2,evt){const value=normalizeValues(ctx2,evt.value);set.value(ctx2,value)}}})}var invoke={change:ctx=>{ctx.onValueChange?.({value:Array.from(ctx.value)});dom.dispatchChangeEvent(ctx)},focusChange:ctx=>{ctx.onFocusChange?.({value:Array.from(ctx.value),focusedIndex:ctx.focusedIndex})}};var set={valueAtIndex:(ctx,index,value)=>{if(isEqual(ctx.value[index],value))return;ctx.value[index]=value;invoke.change(ctx)},value:(ctx,value)=>{if(isEqual(ctx.value,value))return;assignArray(ctx.value,value);invoke.change(ctx)},focusedIndex:(ctx,index)=>{if(isEqual(ctx.focusedIndex,index))return;ctx.focusedIndex=index;invoke.focusChange(ctx)}};import{createProps}from"@zag-js/types";import{createSplitProps}from"@zag-js/utils";var props=createProps()(["aria-label","aria-labelledby","dir","disabled","form","getAriaValueText","getRootNode","id","ids","invalid","max","min","minStepsBetweenThumbs","name","onFocusChange","onValueChange","onValueChangeEnd","orientation","origin","readOnly","step","thumbAlignment","thumbAlignment","thumbSize","value"]);var splitProps=createSplitProps(props);var thumbProps=createProps()(["index","name"]);var splitThumbProps=createSplitProps(thumbProps);export{anatomy,connect,machine,props,splitProps,splitThumbProps,thumbProps};
854
2
  //# sourceMappingURL=index.mjs.map