@choice-ui/react 1.8.7 → 1.8.8
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/components/button/dist/index.js +7 -0
- package/dist/components/colors/src/color-image-paint/color-image-paint.js +3 -3
- package/dist/components/dropdown/dist/index.d.ts +6 -0
- package/dist/components/dropdown/dist/index.js +12 -8
- package/dist/components/emoji-picker/dist/index.d.ts +29 -1
- package/dist/components/emoji-picker/dist/index.js +144 -42
- package/dist/components/form/src/adapters/range-adapter.js +2 -2
- package/dist/components/icon-button/dist/index.d.ts +1 -1
- package/dist/components/icon-button/dist/index.js +39 -0
- package/dist/components/menus/dist/index.d.ts +5 -0
- package/dist/components/menus/dist/index.js +18 -1
- package/dist/components/range/dist/index.d.ts +276 -20
- package/dist/components/range/dist/index.js +1030 -602
- package/dist/components/range/src/components/connects.d.ts +26 -0
- package/dist/components/range/src/components/connects.js +192 -0
- package/dist/components/range/src/components/dot.d.ts +8 -0
- package/dist/components/range/src/components/dot.js +148 -0
- package/dist/components/range/src/components/thumb.d.ts +14 -0
- package/dist/components/range/src/components/thumb.js +159 -0
- package/dist/components/range/src/context/index.d.ts +4 -0
- package/dist/components/range/src/context/range-context.d.ts +35 -0
- package/dist/components/range/src/context/range-context.js +13 -0
- package/dist/components/range/src/context/range-tuple-context.d.ts +42 -0
- package/dist/components/range/src/context/range-tuple-context.js +15 -0
- package/dist/components/range/src/index.d.ts +4 -2
- package/dist/components/range/src/range-tuple.d.ts +17 -9
- package/dist/components/range/src/range-tuple.js +375 -441
- package/dist/components/range/src/range.d.ts +17 -9
- package/dist/components/range/src/range.js +164 -154
- package/dist/components/range/src/tv.d.ts +15 -3
- package/dist/components/range/src/tv.js +10 -7
- package/dist/components/textarea/dist/index.js +3 -1
- package/dist/components/tooltip/dist/index.d.ts +2 -0
- package/dist/components/tooltip/dist/index.js +23 -5
- package/dist/components/virtual-select/dist/index.d.ts +48 -0
- package/dist/index.js +6 -0
- package/package.json +20 -32
|
@@ -1,10 +1,28 @@
|
|
|
1
1
|
import { clamp } from "es-toolkit";
|
|
2
|
-
import { forwardRef, useState, useCallback,
|
|
2
|
+
import { forwardRef, useMemo, Children, isValidElement, useState, useCallback, useRef, useEffect, createContext, useContext } from "react";
|
|
3
3
|
import { useEventCallback } from "usehooks-ts";
|
|
4
|
-
import { jsx, jsxs } from "react/jsx-runtime";
|
|
4
|
+
import { jsx, jsxs, Fragment } from "react/jsx-runtime";
|
|
5
5
|
import { useIsomorphicLayoutEffect } from "../../../shared/hooks/use-isomorphic-layout-effect/use-isomorphic-layout-effect.js";
|
|
6
6
|
import { tcv, tcx } from "../../../shared/utils/tcx/tcx.js";
|
|
7
7
|
import { mergeRefs } from "../../../shared/utils/merge-refs/merge-refs.js";
|
|
8
|
+
var RangeContext = createContext(null);
|
|
9
|
+
function useRangeContext() {
|
|
10
|
+
const context = useContext(RangeContext);
|
|
11
|
+
if (!context) {
|
|
12
|
+
throw new Error("Range.Connects and Range.Thumb must be used within a Range component");
|
|
13
|
+
}
|
|
14
|
+
return context;
|
|
15
|
+
}
|
|
16
|
+
var RangeTupleContext = createContext(null);
|
|
17
|
+
function useRangeTupleContext() {
|
|
18
|
+
const context = useContext(RangeTupleContext);
|
|
19
|
+
if (!context) {
|
|
20
|
+
throw new Error(
|
|
21
|
+
"RangeTuple.Connects and RangeTuple.Thumb must be used within a RangeTuple component"
|
|
22
|
+
);
|
|
23
|
+
}
|
|
24
|
+
return context;
|
|
25
|
+
}
|
|
8
26
|
var rangeTv = tcv({
|
|
9
27
|
slots: {
|
|
10
28
|
container: [
|
|
@@ -13,19 +31,19 @@ var rangeTv = tcv({
|
|
|
13
31
|
"bg-secondary-background shadow-inset-border rounded-full"
|
|
14
32
|
],
|
|
15
33
|
connect: [
|
|
16
|
-
"pointer-events-none absolute",
|
|
34
|
+
"pointer-events-none absolute h-(--height)",
|
|
17
35
|
"after:absolute",
|
|
18
36
|
"after:content-['']",
|
|
19
37
|
"after:rounded-full",
|
|
20
|
-
"after:
|
|
21
|
-
"after:h-[
|
|
38
|
+
"after:[background:inherit]",
|
|
39
|
+
"after:h-[inherit]",
|
|
22
40
|
"after:left-[calc(var(--height)/-2)]",
|
|
23
41
|
"after:right-[calc(var(--height)/-2)]"
|
|
24
42
|
],
|
|
43
|
+
thumbWrapper: ["absolute top-1/2 box-border origin-center z-2"],
|
|
25
44
|
thumb: [
|
|
26
|
-
"
|
|
27
|
-
"
|
|
28
|
-
"bg-white"
|
|
45
|
+
"shadow-range-thumb border-2 border-white rounded-full size-(--thumb-size)",
|
|
46
|
+
"bg-white absolute -translate-y-1/2 -translate-x-1/2 left-1/2 top-1/2"
|
|
29
47
|
],
|
|
30
48
|
dotContainer: "pointer-events-none absolute inset-0",
|
|
31
49
|
dot: ["size-1 rounded-full", "absolute top-1/2", "-translate-x-1/2 -translate-y-1/2"],
|
|
@@ -55,9 +73,12 @@ var rangeTv = tcv({
|
|
|
55
73
|
},
|
|
56
74
|
disabled: {
|
|
57
75
|
true: {
|
|
76
|
+
connect: "bg-disabled-background",
|
|
58
77
|
thumb: "bg-secondary-background"
|
|
59
78
|
},
|
|
60
|
-
false: {
|
|
79
|
+
false: {
|
|
80
|
+
connect: "bg-accent-background"
|
|
81
|
+
}
|
|
61
82
|
}
|
|
62
83
|
},
|
|
63
84
|
compoundVariants: [
|
|
@@ -93,8 +114,477 @@ var rangeTv = tcv({
|
|
|
93
114
|
disabled: false
|
|
94
115
|
}
|
|
95
116
|
});
|
|
96
|
-
var
|
|
117
|
+
var RangeConnects = forwardRef(
|
|
118
|
+
function RangeConnects2(props, ref) {
|
|
119
|
+
const { className } = props;
|
|
120
|
+
const { currentValue, disabled, min, transforms, thumbSize, trackHeight, tv } = useRangeContext();
|
|
121
|
+
const connectsStatus = useMemo(() => {
|
|
122
|
+
if (disabled) return "disabled";
|
|
123
|
+
if (currentValue < 0) return "negative";
|
|
124
|
+
return "positive";
|
|
125
|
+
}, [disabled, currentValue]);
|
|
126
|
+
const connectStyle = useMemo(() => {
|
|
127
|
+
return {
|
|
128
|
+
left: min < 0 ? currentValue < 0 ? `${transforms.transformX + thumbSize / 2}px` : "50%" : trackHeight / 2 + "px",
|
|
129
|
+
right: min < 0 ? currentValue >= 0 ? `calc(100% - ${transforms.transformX + thumbSize / 2}px)` : "50%" : `calc(100% - ${transforms.transformX + thumbSize / 2}px)`,
|
|
130
|
+
height: trackHeight
|
|
131
|
+
};
|
|
132
|
+
}, [min, currentValue, transforms.transformX, thumbSize, trackHeight]);
|
|
133
|
+
return /* @__PURE__ */ jsx(
|
|
134
|
+
"div",
|
|
135
|
+
{
|
|
136
|
+
ref,
|
|
137
|
+
className: tcx(tv.connect(), disabled && "bg-disabled-background", className),
|
|
138
|
+
"data-connect-status": connectsStatus,
|
|
139
|
+
style: connectStyle
|
|
140
|
+
}
|
|
141
|
+
);
|
|
142
|
+
}
|
|
143
|
+
);
|
|
144
|
+
RangeConnects.displayName = "RangeConnects";
|
|
145
|
+
function RangeContainer(props) {
|
|
146
|
+
const { children, className, height: _height, ...rest } = props;
|
|
147
|
+
const {
|
|
148
|
+
currentValue,
|
|
149
|
+
step,
|
|
150
|
+
transforms,
|
|
151
|
+
thumbSize,
|
|
152
|
+
defaultStepValue,
|
|
153
|
+
dotsData,
|
|
154
|
+
defaultDotPosition,
|
|
155
|
+
defaultValue,
|
|
156
|
+
tv,
|
|
157
|
+
hasCustomDot,
|
|
158
|
+
hasCustomConnects
|
|
159
|
+
} = useRangeContext();
|
|
160
|
+
const hasStepOrDefault = step > 1 || defaultValue !== void 0;
|
|
161
|
+
const renderDots = () => {
|
|
162
|
+
if (dotsData) {
|
|
163
|
+
const { minTransform, maxTransform } = transforms;
|
|
164
|
+
return dotsData.map(({ value: dotValue, position: dotPosition }) => {
|
|
165
|
+
const dotTransform = minTransform + dotPosition * (maxTransform - minTransform);
|
|
166
|
+
const { dot } = rangeTv({
|
|
167
|
+
defaultStepValue: defaultStepValue === dotValue,
|
|
168
|
+
overStepValue: dotValue <= currentValue
|
|
169
|
+
});
|
|
170
|
+
return /* @__PURE__ */ jsx(
|
|
171
|
+
"div",
|
|
172
|
+
{
|
|
173
|
+
className: dot(),
|
|
174
|
+
style: {
|
|
175
|
+
left: dotTransform + thumbSize / 2
|
|
176
|
+
}
|
|
177
|
+
},
|
|
178
|
+
dotValue
|
|
179
|
+
);
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
if (defaultDotPosition !== null && defaultDotPosition !== void 0) {
|
|
183
|
+
return /* @__PURE__ */ jsx(
|
|
184
|
+
"div",
|
|
185
|
+
{
|
|
186
|
+
className: rangeTv({ defaultStepValue: true }).dot(),
|
|
187
|
+
style: {
|
|
188
|
+
left: transforms.minTransform + defaultDotPosition * (transforms.maxTransform - transforms.minTransform) + thumbSize / 2
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
);
|
|
192
|
+
}
|
|
193
|
+
return null;
|
|
194
|
+
};
|
|
195
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
196
|
+
!hasCustomConnects && /* @__PURE__ */ jsx(
|
|
197
|
+
RangeConnects,
|
|
198
|
+
{
|
|
199
|
+
className: tcx(tv.connect(), className),
|
|
200
|
+
...rest
|
|
201
|
+
}
|
|
202
|
+
),
|
|
203
|
+
children,
|
|
204
|
+
hasStepOrDefault && !hasCustomDot && /* @__PURE__ */ jsx("div", { className: tv.dotContainer(), children: renderDots() })
|
|
205
|
+
] });
|
|
206
|
+
}
|
|
207
|
+
RangeContainer.displayName = "RangeContainer";
|
|
208
|
+
var RangeTupleConnects = forwardRef(
|
|
209
|
+
function RangeTupleConnects2(props, ref) {
|
|
210
|
+
const { className, ...rest } = props;
|
|
211
|
+
const { transforms, thumbSize, trackHeight, tv } = useRangeTupleContext();
|
|
212
|
+
const connectStyle = useMemo(() => {
|
|
213
|
+
return {
|
|
214
|
+
left: `${transforms.transformX0 + thumbSize / 2}px`,
|
|
215
|
+
right: `calc(100% - ${transforms.transformX1 + thumbSize / 2}px)`,
|
|
216
|
+
height: trackHeight
|
|
217
|
+
};
|
|
218
|
+
}, [transforms.transformX0, transforms.transformX1, thumbSize, trackHeight]);
|
|
219
|
+
return /* @__PURE__ */ jsx(
|
|
220
|
+
"div",
|
|
221
|
+
{
|
|
222
|
+
ref,
|
|
223
|
+
className: tcx(tv.connect(), className),
|
|
224
|
+
style: connectStyle,
|
|
225
|
+
...rest
|
|
226
|
+
}
|
|
227
|
+
);
|
|
228
|
+
}
|
|
229
|
+
);
|
|
230
|
+
RangeTupleConnects.displayName = "RangeTupleConnects";
|
|
231
|
+
function RangeTupleContainer(props) {
|
|
232
|
+
const { children, className, height: _height, ...rest } = props;
|
|
233
|
+
const {
|
|
234
|
+
currentValue,
|
|
235
|
+
step,
|
|
236
|
+
transforms,
|
|
237
|
+
thumbSize,
|
|
238
|
+
defaultStepValue,
|
|
239
|
+
dotsData,
|
|
240
|
+
defaultDotPositions,
|
|
241
|
+
normalizedDefaultValue,
|
|
242
|
+
tv,
|
|
243
|
+
hasCustomDot,
|
|
244
|
+
hasCustomConnects
|
|
245
|
+
} = useRangeTupleContext();
|
|
246
|
+
const hasStepOrDefault = step > 1 || normalizedDefaultValue !== void 0;
|
|
247
|
+
const renderDots = () => {
|
|
248
|
+
if (dotsData) {
|
|
249
|
+
const { minTransform, maxTransform } = transforms;
|
|
250
|
+
return dotsData.map(({ value: dotValue, position: dotPosition }) => {
|
|
251
|
+
const dotTransform = minTransform + dotPosition * (maxTransform - minTransform);
|
|
252
|
+
const isWithinRange = dotValue >= currentValue[0] && dotValue <= currentValue[1];
|
|
253
|
+
const isDefaultValue = defaultStepValue == null ? void 0 : defaultStepValue.includes(dotValue);
|
|
254
|
+
const { dot } = rangeTv({
|
|
255
|
+
defaultStepValue: isDefaultValue,
|
|
256
|
+
overStepValue: isWithinRange
|
|
257
|
+
});
|
|
258
|
+
return /* @__PURE__ */ jsx(
|
|
259
|
+
"div",
|
|
260
|
+
{
|
|
261
|
+
className: dot(),
|
|
262
|
+
style: {
|
|
263
|
+
left: dotTransform + thumbSize / 2
|
|
264
|
+
}
|
|
265
|
+
},
|
|
266
|
+
dotValue
|
|
267
|
+
);
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
if (defaultDotPositions) {
|
|
271
|
+
return defaultDotPositions.map((position, idx) => /* @__PURE__ */ jsx(
|
|
272
|
+
"div",
|
|
273
|
+
{
|
|
274
|
+
className: rangeTv({ defaultStepValue: true }).dot(),
|
|
275
|
+
style: {
|
|
276
|
+
left: transforms.minTransform + position * (transforms.maxTransform - transforms.minTransform) + thumbSize / 2
|
|
277
|
+
}
|
|
278
|
+
},
|
|
279
|
+
`default-${idx}`
|
|
280
|
+
));
|
|
281
|
+
}
|
|
282
|
+
return null;
|
|
283
|
+
};
|
|
284
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
285
|
+
!hasCustomConnects && /* @__PURE__ */ jsx(
|
|
286
|
+
RangeTupleConnects,
|
|
287
|
+
{
|
|
288
|
+
className: tcx(tv.connect(), className),
|
|
289
|
+
...rest
|
|
290
|
+
}
|
|
291
|
+
),
|
|
292
|
+
children,
|
|
293
|
+
hasStepOrDefault && !hasCustomDot && /* @__PURE__ */ jsx("div", { className: tv.dotContainer(), children: renderDots() })
|
|
294
|
+
] });
|
|
295
|
+
}
|
|
296
|
+
RangeTupleContainer.displayName = "RangeTupleContainer";
|
|
297
|
+
var BaseThumb = forwardRef(function BaseThumb2(props, ref) {
|
|
298
|
+
const {
|
|
299
|
+
className,
|
|
300
|
+
thumbRef,
|
|
301
|
+
inputRef,
|
|
302
|
+
thumbSize,
|
|
303
|
+
transformX,
|
|
304
|
+
isDragging,
|
|
305
|
+
disabled,
|
|
306
|
+
readOnly,
|
|
307
|
+
tv,
|
|
308
|
+
thumbTv,
|
|
309
|
+
onPointerDown,
|
|
310
|
+
onKeyDown,
|
|
311
|
+
isDefaultValue
|
|
312
|
+
} = props;
|
|
313
|
+
const thumbStyle = useMemo(
|
|
314
|
+
() => ({
|
|
315
|
+
width: thumbSize,
|
|
316
|
+
height: thumbSize,
|
|
317
|
+
transform: `translate(${transformX}px, -50%)`,
|
|
318
|
+
willChange: isDragging ? "transform" : "auto"
|
|
319
|
+
}),
|
|
320
|
+
[thumbSize, transformX, isDragging]
|
|
321
|
+
);
|
|
322
|
+
return /* @__PURE__ */ jsx(
|
|
323
|
+
"div",
|
|
324
|
+
{
|
|
325
|
+
ref: (node) => {
|
|
326
|
+
if (thumbRef && "current" in thumbRef) {
|
|
327
|
+
thumbRef.current = node;
|
|
328
|
+
}
|
|
329
|
+
if (typeof ref === "function") {
|
|
330
|
+
ref(node);
|
|
331
|
+
} else if (ref) {
|
|
332
|
+
ref.current = node;
|
|
333
|
+
}
|
|
334
|
+
},
|
|
335
|
+
onPointerDown,
|
|
336
|
+
className: tv.thumbWrapper(),
|
|
337
|
+
style: thumbStyle,
|
|
338
|
+
children: /* @__PURE__ */ jsx(
|
|
339
|
+
"div",
|
|
340
|
+
{
|
|
341
|
+
className: tcx(thumbTv.thumb(), className),
|
|
342
|
+
"data-status": isDefaultValue ? "default" : void 0,
|
|
343
|
+
children: /* @__PURE__ */ jsx(
|
|
344
|
+
"input",
|
|
345
|
+
{
|
|
346
|
+
ref: (node) => {
|
|
347
|
+
if (inputRef && "current" in inputRef) {
|
|
348
|
+
inputRef.current = node;
|
|
349
|
+
}
|
|
350
|
+
},
|
|
351
|
+
type: "text",
|
|
352
|
+
onKeyDown,
|
|
353
|
+
className: tv.input(),
|
|
354
|
+
tabIndex: disabled || readOnly ? -1 : 0,
|
|
355
|
+
readOnly: true
|
|
356
|
+
}
|
|
357
|
+
)
|
|
358
|
+
}
|
|
359
|
+
)
|
|
360
|
+
}
|
|
361
|
+
);
|
|
362
|
+
});
|
|
363
|
+
var RangeThumb = forwardRef(
|
|
364
|
+
function RangeThumb2(props, ref) {
|
|
365
|
+
const { className, size: _size } = props;
|
|
366
|
+
const {
|
|
367
|
+
disabled,
|
|
368
|
+
readOnly,
|
|
369
|
+
transforms,
|
|
370
|
+
thumbSize,
|
|
371
|
+
thumbRef,
|
|
372
|
+
inputRef,
|
|
373
|
+
isDragging,
|
|
374
|
+
isDefaultValue,
|
|
375
|
+
handlePointerDown,
|
|
376
|
+
handleKeyDown,
|
|
377
|
+
tv
|
|
378
|
+
} = useRangeContext();
|
|
379
|
+
return /* @__PURE__ */ jsx(
|
|
380
|
+
BaseThumb,
|
|
381
|
+
{
|
|
382
|
+
ref,
|
|
383
|
+
className,
|
|
384
|
+
thumbRef,
|
|
385
|
+
inputRef,
|
|
386
|
+
thumbSize,
|
|
387
|
+
transformX: transforms.transformX,
|
|
388
|
+
isDragging: isDragging.current,
|
|
389
|
+
disabled,
|
|
390
|
+
readOnly,
|
|
391
|
+
tv,
|
|
392
|
+
thumbTv: tv,
|
|
393
|
+
onPointerDown: handlePointerDown,
|
|
394
|
+
onKeyDown: handleKeyDown,
|
|
395
|
+
isDefaultValue
|
|
396
|
+
}
|
|
397
|
+
);
|
|
398
|
+
}
|
|
399
|
+
);
|
|
400
|
+
RangeThumb.displayName = "RangeThumb";
|
|
401
|
+
var RangeTupleThumb = forwardRef(
|
|
402
|
+
function RangeTupleThumb2(props, ref) {
|
|
403
|
+
const { className, size: _size, index } = props;
|
|
404
|
+
const {
|
|
405
|
+
disabled,
|
|
406
|
+
readOnly,
|
|
407
|
+
transforms,
|
|
408
|
+
thumbSize,
|
|
409
|
+
thumb0Ref,
|
|
410
|
+
thumb1Ref,
|
|
411
|
+
input0Ref,
|
|
412
|
+
input1Ref,
|
|
413
|
+
isDragging,
|
|
414
|
+
isDefaultValue,
|
|
415
|
+
handlePointerDown,
|
|
416
|
+
handleKeyDown,
|
|
417
|
+
tv,
|
|
418
|
+
thumbTv0,
|
|
419
|
+
thumbTv1
|
|
420
|
+
} = useRangeTupleContext();
|
|
421
|
+
const thumbRef = index === 0 ? thumb0Ref : thumb1Ref;
|
|
422
|
+
const inputRef = index === 0 ? input0Ref : input1Ref;
|
|
423
|
+
const thumbTv = index === 0 ? thumbTv0 : thumbTv1;
|
|
424
|
+
const transformX = index === 0 ? transforms.transformX0 : transforms.transformX1;
|
|
425
|
+
return /* @__PURE__ */ jsx(
|
|
426
|
+
BaseThumb,
|
|
427
|
+
{
|
|
428
|
+
ref,
|
|
429
|
+
className,
|
|
430
|
+
thumbRef,
|
|
431
|
+
inputRef,
|
|
432
|
+
thumbSize,
|
|
433
|
+
transformX,
|
|
434
|
+
isDragging: isDragging.current === index,
|
|
435
|
+
disabled,
|
|
436
|
+
readOnly,
|
|
437
|
+
tv,
|
|
438
|
+
thumbTv,
|
|
439
|
+
onPointerDown: (e) => handlePointerDown(e, index),
|
|
440
|
+
onKeyDown: (e) => handleKeyDown(e, index),
|
|
441
|
+
isDefaultValue
|
|
442
|
+
}
|
|
443
|
+
);
|
|
444
|
+
}
|
|
445
|
+
);
|
|
446
|
+
RangeTupleThumb.displayName = "RangeTupleThumb";
|
|
447
|
+
function getDotStatus(isOver, isDefault) {
|
|
448
|
+
if (isOver && isDefault) return "default-over";
|
|
449
|
+
if (isOver) return "over";
|
|
450
|
+
if (isDefault) return "default";
|
|
451
|
+
return "under";
|
|
452
|
+
}
|
|
453
|
+
var RangeDot = forwardRef(function RangeDot2(props, ref) {
|
|
454
|
+
const { className, ...rest } = props;
|
|
455
|
+
const {
|
|
456
|
+
currentValue,
|
|
457
|
+
step,
|
|
458
|
+
transforms,
|
|
459
|
+
thumbSize,
|
|
460
|
+
defaultStepValue,
|
|
461
|
+
dotsData,
|
|
462
|
+
defaultDotPosition,
|
|
463
|
+
defaultValue,
|
|
464
|
+
tv
|
|
465
|
+
} = useRangeContext();
|
|
466
|
+
const hasStepOrDefault = step > 1 || defaultValue !== void 0;
|
|
467
|
+
if (!hasStepOrDefault) {
|
|
468
|
+
return null;
|
|
469
|
+
}
|
|
470
|
+
const renderDots = () => {
|
|
471
|
+
if (dotsData) {
|
|
472
|
+
const { minTransform, maxTransform } = transforms;
|
|
473
|
+
return dotsData.map(({ value: dotValue, position: dotPosition }, idx) => {
|
|
474
|
+
const dotTransform = minTransform + dotPosition * (maxTransform - minTransform);
|
|
475
|
+
const isDefault = defaultStepValue === dotValue;
|
|
476
|
+
const isOver = dotValue <= currentValue;
|
|
477
|
+
const { dot } = rangeTv({
|
|
478
|
+
defaultStepValue: isDefault,
|
|
479
|
+
overStepValue: isOver
|
|
480
|
+
});
|
|
481
|
+
return /* @__PURE__ */ jsx(
|
|
482
|
+
"div",
|
|
483
|
+
{
|
|
484
|
+
ref: idx === 0 ? ref : void 0,
|
|
485
|
+
className: tcx(dot(), className),
|
|
486
|
+
"data-status": getDotStatus(isOver, isDefault),
|
|
487
|
+
style: {
|
|
488
|
+
left: dotTransform + thumbSize / 2
|
|
489
|
+
},
|
|
490
|
+
...rest
|
|
491
|
+
},
|
|
492
|
+
dotValue
|
|
493
|
+
);
|
|
494
|
+
});
|
|
495
|
+
}
|
|
496
|
+
if (defaultDotPosition !== null && defaultDotPosition !== void 0 && defaultStepValue) {
|
|
497
|
+
const isOver = defaultStepValue <= currentValue;
|
|
498
|
+
return /* @__PURE__ */ jsx(
|
|
499
|
+
"div",
|
|
500
|
+
{
|
|
501
|
+
ref,
|
|
502
|
+
className: tcx(rangeTv({ defaultStepValue: true }).dot(), className),
|
|
503
|
+
"data-status": isOver ? "over" : "default",
|
|
504
|
+
style: {
|
|
505
|
+
left: transforms.minTransform + defaultDotPosition * (transforms.maxTransform - transforms.minTransform) + thumbSize / 2
|
|
506
|
+
},
|
|
507
|
+
...rest
|
|
508
|
+
}
|
|
509
|
+
);
|
|
510
|
+
}
|
|
511
|
+
return null;
|
|
512
|
+
};
|
|
513
|
+
return /* @__PURE__ */ jsx("div", { className: tv.dotContainer(), children: renderDots() });
|
|
514
|
+
});
|
|
515
|
+
RangeDot.displayName = "RangeDot";
|
|
516
|
+
var RangeTupleDot = forwardRef(
|
|
517
|
+
function RangeTupleDot2(props, ref) {
|
|
518
|
+
const { className, ...rest } = props;
|
|
519
|
+
const {
|
|
520
|
+
currentValue,
|
|
521
|
+
step,
|
|
522
|
+
transforms,
|
|
523
|
+
thumbSize,
|
|
524
|
+
defaultStepValue,
|
|
525
|
+
dotsData,
|
|
526
|
+
defaultDotPositions,
|
|
527
|
+
normalizedDefaultValue,
|
|
528
|
+
tv
|
|
529
|
+
} = useRangeTupleContext();
|
|
530
|
+
const hasStepOrDefault = step > 1 || normalizedDefaultValue !== void 0;
|
|
531
|
+
if (!hasStepOrDefault) {
|
|
532
|
+
return null;
|
|
533
|
+
}
|
|
534
|
+
const renderDots = () => {
|
|
535
|
+
if (dotsData) {
|
|
536
|
+
const { minTransform, maxTransform } = transforms;
|
|
537
|
+
return dotsData.map(({ value: dotValue, position: dotPosition }, idx) => {
|
|
538
|
+
const dotTransform = minTransform + dotPosition * (maxTransform - minTransform);
|
|
539
|
+
const isWithinRange = dotValue >= currentValue[0] && dotValue <= currentValue[1];
|
|
540
|
+
const isDefaultValue = defaultStepValue == null ? void 0 : defaultStepValue.includes(dotValue);
|
|
541
|
+
const { dot } = rangeTv({
|
|
542
|
+
defaultStepValue: isDefaultValue,
|
|
543
|
+
overStepValue: isWithinRange
|
|
544
|
+
});
|
|
545
|
+
return /* @__PURE__ */ jsx(
|
|
546
|
+
"div",
|
|
547
|
+
{
|
|
548
|
+
ref: idx === 0 ? ref : void 0,
|
|
549
|
+
className: tcx(dot(), className),
|
|
550
|
+
"data-status": getDotStatus(isWithinRange, !!isDefaultValue),
|
|
551
|
+
"data-position": idx === 0 ? "left" : "right",
|
|
552
|
+
style: {
|
|
553
|
+
left: dotTransform + thumbSize / 2
|
|
554
|
+
},
|
|
555
|
+
...rest
|
|
556
|
+
},
|
|
557
|
+
dotValue
|
|
558
|
+
);
|
|
559
|
+
});
|
|
560
|
+
}
|
|
561
|
+
if (defaultDotPositions && defaultStepValue) {
|
|
562
|
+
const leftIsOver = defaultStepValue[0] >= currentValue[0];
|
|
563
|
+
const rightIsOver = defaultStepValue[1] <= currentValue[1];
|
|
564
|
+
return defaultDotPositions.map((position, idx) => /* @__PURE__ */ jsx(
|
|
565
|
+
"div",
|
|
566
|
+
{
|
|
567
|
+
ref: idx === 0 ? ref : void 0,
|
|
568
|
+
className: tcx(rangeTv({ defaultStepValue: true }).dot(), className),
|
|
569
|
+
"data-status": leftIsOver && idx === 0 ? "left-over" : rightIsOver && idx === 1 ? "right-over" : "default",
|
|
570
|
+
"data-position": idx === 0 ? "left" : "right",
|
|
571
|
+
style: {
|
|
572
|
+
left: transforms.minTransform + position * (transforms.maxTransform - transforms.minTransform) + thumbSize / 2
|
|
573
|
+
},
|
|
574
|
+
...rest
|
|
575
|
+
},
|
|
576
|
+
`default-${idx}`
|
|
577
|
+
));
|
|
578
|
+
}
|
|
579
|
+
return null;
|
|
580
|
+
};
|
|
581
|
+
return /* @__PURE__ */ jsx("div", { className: tv.dotContainer(), children: renderDots() });
|
|
582
|
+
}
|
|
583
|
+
);
|
|
584
|
+
RangeTupleDot.displayName = "RangeTupleDot";
|
|
585
|
+
var RangeRoot = forwardRef(function Range(props, ref) {
|
|
97
586
|
const {
|
|
587
|
+
children,
|
|
98
588
|
defaultValue,
|
|
99
589
|
value,
|
|
100
590
|
onChange,
|
|
@@ -106,52 +596,82 @@ var Range = forwardRef(function Range2(props, ref) {
|
|
|
106
596
|
disabled = false,
|
|
107
597
|
readOnly = false,
|
|
108
598
|
className,
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
negative: "bg-accent-background"
|
|
112
|
-
},
|
|
113
|
-
trackSize = {
|
|
114
|
-
width: 256,
|
|
115
|
-
height: 16
|
|
116
|
-
},
|
|
117
|
-
thumbSize = 14
|
|
599
|
+
width: propsWidth = 256,
|
|
600
|
+
thumbSize: propsThumbSize = 14
|
|
118
601
|
} = props;
|
|
602
|
+
const {
|
|
603
|
+
hasCustomChildren,
|
|
604
|
+
hasCustomDot,
|
|
605
|
+
hasCustomConnects,
|
|
606
|
+
extractedThumbSize,
|
|
607
|
+
extractedTrackHeight
|
|
608
|
+
} = useMemo(() => {
|
|
609
|
+
const childArray = Children.toArray(children);
|
|
610
|
+
let hasCustom = false;
|
|
611
|
+
let hasDot = false;
|
|
612
|
+
let hasConnects = false;
|
|
613
|
+
let thumbSizeFromChild;
|
|
614
|
+
let trackHeightFromChild;
|
|
615
|
+
for (const child of childArray) {
|
|
616
|
+
if (isValidElement(child)) {
|
|
617
|
+
const type = child.type;
|
|
618
|
+
if (child.type === RangeThumb || (type == null ? void 0 : type.displayName) === "RangeThumb") {
|
|
619
|
+
hasCustom = true;
|
|
620
|
+
const childProps = child.props;
|
|
621
|
+
if (childProps.size !== void 0) {
|
|
622
|
+
thumbSizeFromChild = childProps.size;
|
|
623
|
+
}
|
|
624
|
+
} else if (child.type === RangeContainer || (type == null ? void 0 : type.displayName) === "RangeContainer") {
|
|
625
|
+
hasCustom = true;
|
|
626
|
+
const childProps = child.props;
|
|
627
|
+
if (childProps.height !== void 0) {
|
|
628
|
+
trackHeightFromChild = childProps.height;
|
|
629
|
+
}
|
|
630
|
+
} else if (child.type === RangeConnects || (type == null ? void 0 : type.displayName) === "RangeConnects") {
|
|
631
|
+
hasCustom = true;
|
|
632
|
+
hasConnects = true;
|
|
633
|
+
} else if (child.type === RangeDot || (type == null ? void 0 : type.displayName) === "RangeDot") {
|
|
634
|
+
hasCustom = true;
|
|
635
|
+
hasDot = true;
|
|
636
|
+
}
|
|
637
|
+
}
|
|
638
|
+
}
|
|
639
|
+
return {
|
|
640
|
+
hasCustomChildren: hasCustom,
|
|
641
|
+
hasCustomDot: hasDot,
|
|
642
|
+
hasCustomConnects: hasConnects,
|
|
643
|
+
extractedThumbSize: thumbSizeFromChild,
|
|
644
|
+
extractedTrackHeight: trackHeightFromChild
|
|
645
|
+
};
|
|
646
|
+
}, [children]);
|
|
647
|
+
const thumbSize = extractedThumbSize ?? propsThumbSize;
|
|
648
|
+
const trackHeight = extractedTrackHeight ?? 16;
|
|
649
|
+
const safeStep = step > 0 ? step : 1;
|
|
650
|
+
const range = max - min || 1;
|
|
119
651
|
const [actualTrackWidth, setActualTrackWidth] = useState();
|
|
120
|
-
const valueToPosition = useCallback((val) => (val - min) /
|
|
121
|
-
const positionToValue = useCallback(
|
|
122
|
-
(position) => min + position * (max - min),
|
|
123
|
-
[min, max]
|
|
124
|
-
);
|
|
652
|
+
const valueToPosition = useCallback((val) => (val - min) / range, [min, range]);
|
|
653
|
+
const positionToValue = useCallback((position) => min + position * range, [min, range]);
|
|
125
654
|
const defaultStepValue = useMemo(() => {
|
|
126
655
|
if (defaultValue === void 0 || defaultValue === null) return null;
|
|
127
|
-
if (
|
|
128
|
-
return Math.round((defaultValue - min) /
|
|
656
|
+
if (safeStep > 1) {
|
|
657
|
+
return Math.round((defaultValue - min) / safeStep) * safeStep + min;
|
|
129
658
|
}
|
|
130
659
|
return defaultValue;
|
|
131
|
-
}, [defaultValue,
|
|
660
|
+
}, [defaultValue, safeStep, min]);
|
|
132
661
|
const sliderRef = useRef(null);
|
|
133
662
|
const thumbRef = useRef(null);
|
|
134
663
|
const inputRef = useRef(null);
|
|
135
664
|
const isDragging = useRef(false);
|
|
665
|
+
const cleanupRef = useRef(null);
|
|
136
666
|
const [internalValue, setInternalValue] = useState(value ?? min);
|
|
137
667
|
const currentValue = value ?? internalValue;
|
|
138
668
|
const currentStepValue = useMemo(
|
|
139
|
-
() =>
|
|
140
|
-
[currentValue,
|
|
669
|
+
() => safeStep > 1 ? Math.round(currentValue / safeStep) * safeStep : currentValue,
|
|
670
|
+
[currentValue, safeStep]
|
|
141
671
|
);
|
|
142
|
-
const
|
|
143
|
-
minTransform: 1,
|
|
144
|
-
maxTransform: 0,
|
|
145
|
-
transformX: 0
|
|
146
|
-
});
|
|
147
|
-
const trackWidth = useMemo(() => {
|
|
148
|
-
if ((trackSize == null ? void 0 : trackSize.width) === "auto") {
|
|
149
|
-
return actualTrackWidth;
|
|
150
|
-
}
|
|
151
|
-
return trackSize == null ? void 0 : trackSize.width;
|
|
152
|
-
}, [trackSize == null ? void 0 : trackSize.width, actualTrackWidth]);
|
|
672
|
+
const trackWidth = typeof propsWidth === "number" ? propsWidth : actualTrackWidth;
|
|
153
673
|
useIsomorphicLayoutEffect(() => {
|
|
154
|
-
if (
|
|
674
|
+
if (typeof propsWidth !== "number" && sliderRef.current) {
|
|
155
675
|
const updateWidth = () => {
|
|
156
676
|
if (sliderRef.current) {
|
|
157
677
|
const width = sliderRef.current.getBoundingClientRect().width;
|
|
@@ -169,43 +689,39 @@ var Range = forwardRef(function Range2(props, ref) {
|
|
|
169
689
|
resizeObserver.disconnect();
|
|
170
690
|
};
|
|
171
691
|
}
|
|
172
|
-
}, [
|
|
173
|
-
|
|
692
|
+
}, [propsWidth]);
|
|
693
|
+
const transforms = useMemo(() => {
|
|
174
694
|
const position = valueToPosition(currentValue);
|
|
175
695
|
const minTransform = 1;
|
|
176
|
-
const maxTransform = (trackWidth
|
|
696
|
+
const maxTransform = (typeof trackWidth === "number" ? trackWidth : 0) - thumbSize - 1;
|
|
177
697
|
const transformX = minTransform + position * (maxTransform - minTransform);
|
|
178
|
-
|
|
179
|
-
minTransform,
|
|
180
|
-
maxTransform,
|
|
181
|
-
transformX
|
|
182
|
-
});
|
|
698
|
+
return { minTransform, maxTransform, transformX };
|
|
183
699
|
}, [currentValue, trackWidth, thumbSize, valueToPosition]);
|
|
184
700
|
const dotsData = useMemo(() => {
|
|
185
|
-
if (
|
|
186
|
-
return Array.from({ length: Math.ceil((max - min) /
|
|
187
|
-
const dotValue = min + i *
|
|
701
|
+
if (safeStep <= 1) return null;
|
|
702
|
+
return Array.from({ length: Math.ceil((max - min) / safeStep) + 1 }, (_, i) => {
|
|
703
|
+
const dotValue = min + i * safeStep;
|
|
188
704
|
const dotPosition = valueToPosition(dotValue);
|
|
189
705
|
return {
|
|
190
706
|
value: dotValue,
|
|
191
707
|
position: dotPosition
|
|
192
708
|
};
|
|
193
709
|
});
|
|
194
|
-
}, [
|
|
710
|
+
}, [safeStep, min, max, valueToPosition]);
|
|
195
711
|
const defaultDotPosition = useMemo(() => {
|
|
196
|
-
if (defaultValue === void 0 || defaultValue === null ||
|
|
712
|
+
if (defaultValue === void 0 || defaultValue === null || safeStep > 1) return null;
|
|
197
713
|
return valueToPosition(defaultValue);
|
|
198
|
-
}, [defaultValue,
|
|
714
|
+
}, [defaultValue, safeStep, valueToPosition]);
|
|
199
715
|
const updatePosition = useEventCallback((clientX, isEnd) => {
|
|
200
716
|
var _a;
|
|
201
717
|
if (readOnly) return;
|
|
202
718
|
const rect = (_a = sliderRef.current) == null ? void 0 : _a.getBoundingClientRect();
|
|
203
719
|
if (!rect) return;
|
|
204
720
|
const newPosition = clamp((clientX - rect.left) / rect.width, 0, 1);
|
|
205
|
-
const newValue = Math.round(positionToValue(newPosition) /
|
|
721
|
+
const newValue = Math.round(positionToValue(newPosition) / safeStep) * safeStep;
|
|
206
722
|
let clampedValue = clamp(newValue, min, max);
|
|
207
|
-
if (defaultValue !== void 0 && defaultValue !== null &&
|
|
208
|
-
const snapThreshold =
|
|
723
|
+
if (defaultValue !== void 0 && defaultValue !== null && safeStep <= 1) {
|
|
724
|
+
const snapThreshold = range * 0.05;
|
|
209
725
|
const distanceToDefault = Math.abs(clampedValue - defaultValue);
|
|
210
726
|
if (distanceToDefault <= snapThreshold) {
|
|
211
727
|
clampedValue = defaultValue;
|
|
@@ -242,6 +758,12 @@ var Range = forwardRef(function Range2(props, ref) {
|
|
|
242
758
|
e2.preventDefault();
|
|
243
759
|
updatePosition(e2.clientX);
|
|
244
760
|
};
|
|
761
|
+
const cleanup = () => {
|
|
762
|
+
window.removeEventListener("pointermove", handleMove);
|
|
763
|
+
window.removeEventListener("pointerup", handleUp);
|
|
764
|
+
window.removeEventListener("pointercancel", handleUp);
|
|
765
|
+
cleanupRef.current = null;
|
|
766
|
+
};
|
|
245
767
|
const handleUp = (e2) => {
|
|
246
768
|
if (!isDragging.current) return;
|
|
247
769
|
e2.preventDefault();
|
|
@@ -251,16 +773,21 @@ var Range = forwardRef(function Range2(props, ref) {
|
|
|
251
773
|
updatePosition(e2.clientX, true);
|
|
252
774
|
isDragging.current = false;
|
|
253
775
|
onChangeEnd == null ? void 0 : onChangeEnd();
|
|
254
|
-
|
|
255
|
-
window.removeEventListener("pointerup", handleUp);
|
|
256
|
-
window.removeEventListener("pointercancel", handleUp);
|
|
776
|
+
cleanup();
|
|
257
777
|
};
|
|
778
|
+
cleanupRef.current = cleanup;
|
|
258
779
|
window.addEventListener("pointermove", handleMove);
|
|
259
780
|
window.addEventListener("pointerup", handleUp);
|
|
260
781
|
window.addEventListener("pointercancel", handleUp);
|
|
261
782
|
},
|
|
262
783
|
[disabled, readOnly, onChangeEnd, onChangeStart, updatePosition]
|
|
263
784
|
);
|
|
785
|
+
useEffect(() => {
|
|
786
|
+
return () => {
|
|
787
|
+
var _a;
|
|
788
|
+
(_a = cleanupRef.current) == null ? void 0 : _a.call(cleanupRef);
|
|
789
|
+
};
|
|
790
|
+
}, []);
|
|
264
791
|
const handleSliderPointerDown = useCallback(
|
|
265
792
|
(e) => {
|
|
266
793
|
if (disabled || readOnly || e.target === thumbRef.current) return;
|
|
@@ -270,7 +797,7 @@ var Range = forwardRef(function Range2(props, ref) {
|
|
|
270
797
|
);
|
|
271
798
|
const handleKeyDown = useEventCallback((e) => {
|
|
272
799
|
if (disabled || readOnly) return;
|
|
273
|
-
const stepValue = e.shiftKey ?
|
|
800
|
+
const stepValue = e.shiftKey ? safeStep * 10 : safeStep;
|
|
274
801
|
let newValue = currentValue;
|
|
275
802
|
switch (e.key) {
|
|
276
803
|
case "ArrowLeft":
|
|
@@ -296,120 +823,88 @@ var Range = forwardRef(function Range2(props, ref) {
|
|
|
296
823
|
(_a = inputRef.current) == null ? void 0 : _a.blur();
|
|
297
824
|
}
|
|
298
825
|
}, [disabled]);
|
|
826
|
+
const hasStepOrDefault = safeStep > 1 || defaultValue !== void 0;
|
|
299
827
|
const tv = useMemo(
|
|
300
828
|
() => rangeTv({
|
|
301
829
|
currentDefaultValue: defaultStepValue === currentStepValue,
|
|
302
|
-
hasStepOrDefault
|
|
830
|
+
hasStepOrDefault,
|
|
303
831
|
disabled
|
|
304
832
|
}),
|
|
305
|
-
[defaultStepValue, currentStepValue,
|
|
833
|
+
[defaultStepValue, currentStepValue, hasStepOrDefault, disabled]
|
|
306
834
|
);
|
|
307
|
-
const
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
return () => {
|
|
357
|
-
if (typeof window !== "undefined") {
|
|
358
|
-
window.removeEventListener("pointermove", noop);
|
|
359
|
-
window.removeEventListener("pointerup", noop);
|
|
360
|
-
window.removeEventListener("pointercancel", noop);
|
|
361
|
-
}
|
|
362
|
-
};
|
|
363
|
-
}, []);
|
|
364
|
-
return /* @__PURE__ */ jsxs(
|
|
835
|
+
const contextValue = useMemo(
|
|
836
|
+
() => ({
|
|
837
|
+
currentValue,
|
|
838
|
+
disabled,
|
|
839
|
+
readOnly,
|
|
840
|
+
min,
|
|
841
|
+
max,
|
|
842
|
+
step: safeStep,
|
|
843
|
+
thumbSize,
|
|
844
|
+
trackHeight,
|
|
845
|
+
transforms,
|
|
846
|
+
defaultStepValue,
|
|
847
|
+
currentStepValue,
|
|
848
|
+
dotsData,
|
|
849
|
+
defaultDotPosition,
|
|
850
|
+
thumbRef,
|
|
851
|
+
inputRef,
|
|
852
|
+
isDragging,
|
|
853
|
+
handlePointerDown,
|
|
854
|
+
handleKeyDown,
|
|
855
|
+
tv,
|
|
856
|
+
defaultValue,
|
|
857
|
+
hasCustomDot,
|
|
858
|
+
hasCustomConnects,
|
|
859
|
+
isDefaultValue: defaultStepValue === currentStepValue && hasStepOrDefault
|
|
860
|
+
}),
|
|
861
|
+
[
|
|
862
|
+
currentValue,
|
|
863
|
+
disabled,
|
|
864
|
+
readOnly,
|
|
865
|
+
min,
|
|
866
|
+
max,
|
|
867
|
+
safeStep,
|
|
868
|
+
thumbSize,
|
|
869
|
+
trackHeight,
|
|
870
|
+
transforms,
|
|
871
|
+
defaultStepValue,
|
|
872
|
+
currentStepValue,
|
|
873
|
+
dotsData,
|
|
874
|
+
defaultDotPosition,
|
|
875
|
+
handlePointerDown,
|
|
876
|
+
handleKeyDown,
|
|
877
|
+
tv,
|
|
878
|
+
defaultValue,
|
|
879
|
+
hasCustomDot,
|
|
880
|
+
hasCustomConnects
|
|
881
|
+
]
|
|
882
|
+
);
|
|
883
|
+
return /* @__PURE__ */ jsx(RangeContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx(
|
|
365
884
|
"div",
|
|
366
885
|
{
|
|
367
886
|
ref: mergeRefs(sliderRef, ref),
|
|
368
887
|
onPointerDown: handleSliderPointerDown,
|
|
369
888
|
className: tcx(tv.container(), className),
|
|
370
889
|
style: {
|
|
371
|
-
"--width": `${trackWidth}px`,
|
|
372
|
-
"--height": `${
|
|
890
|
+
"--width": `${typeof trackWidth === "number" ? trackWidth : actualTrackWidth}px`,
|
|
891
|
+
"--height": `${trackHeight}px`,
|
|
892
|
+
"--thumb-size": `${thumbSize}px`
|
|
373
893
|
},
|
|
374
|
-
children: [
|
|
375
|
-
/* @__PURE__ */ jsx(
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
className: tcx(tv.connect(), connectsClass),
|
|
379
|
-
style: connectStyle
|
|
380
|
-
}
|
|
381
|
-
),
|
|
382
|
-
step > 1 || defaultValue !== void 0 ? /* @__PURE__ */ jsx("div", { className: tv.dotContainer(), children: renderDots() }) : "",
|
|
383
|
-
/* @__PURE__ */ jsx(
|
|
384
|
-
"div",
|
|
385
|
-
{
|
|
386
|
-
ref: thumbRef,
|
|
387
|
-
onPointerDown: handlePointerDown,
|
|
388
|
-
className: tv.thumb(),
|
|
389
|
-
style: {
|
|
390
|
-
width: thumbSize,
|
|
391
|
-
height: thumbSize,
|
|
392
|
-
transform: `translate(${transforms.transformX}px, -50%)`,
|
|
393
|
-
willChange: isDragging.current ? "transform" : "auto"
|
|
394
|
-
},
|
|
395
|
-
children: /* @__PURE__ */ jsx(
|
|
396
|
-
"input",
|
|
397
|
-
{
|
|
398
|
-
ref: inputRef,
|
|
399
|
-
type: "text",
|
|
400
|
-
onKeyDown: handleKeyDown,
|
|
401
|
-
className: tv.input(),
|
|
402
|
-
tabIndex: disabled || readOnly ? -1 : 0,
|
|
403
|
-
readOnly: true
|
|
404
|
-
}
|
|
405
|
-
)
|
|
406
|
-
}
|
|
407
|
-
)
|
|
408
|
-
]
|
|
894
|
+
children: hasCustomChildren ? children : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
895
|
+
/* @__PURE__ */ jsx(RangeContainer, {}),
|
|
896
|
+
/* @__PURE__ */ jsx(RangeThumb, {})
|
|
897
|
+
] })
|
|
409
898
|
}
|
|
410
|
-
);
|
|
899
|
+
) });
|
|
900
|
+
});
|
|
901
|
+
RangeRoot.displayName = "Range";
|
|
902
|
+
var Range2 = Object.assign(RangeRoot, {
|
|
903
|
+
Container: RangeContainer,
|
|
904
|
+
Connects: RangeConnects,
|
|
905
|
+
Thumb: RangeThumb,
|
|
906
|
+
Dot: RangeDot
|
|
411
907
|
});
|
|
412
|
-
Range.displayName = "Range";
|
|
413
908
|
function normalizeTuple(value, min, max) {
|
|
414
909
|
if (value === void 0) {
|
|
415
910
|
return [min, max];
|
|
@@ -420,281 +915,174 @@ function normalizeTuple(value, min, max) {
|
|
|
420
915
|
}
|
|
421
916
|
return [clamp(value, min, max), max];
|
|
422
917
|
}
|
|
423
|
-
var
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
const
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
const
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
}
|
|
462
|
-
return normalizedDefaultValue;
|
|
463
|
-
}, [normalizedDefaultValue, step, min]);
|
|
464
|
-
const sliderRef = useRef(null);
|
|
465
|
-
const thumb0Ref = useRef(null);
|
|
466
|
-
const thumb1Ref = useRef(null);
|
|
467
|
-
const input0Ref = useRef(null);
|
|
468
|
-
const input1Ref = useRef(null);
|
|
469
|
-
const isDragging = useRef(null);
|
|
470
|
-
const [internalValue, setInternalValue] = useState(
|
|
471
|
-
normalizeTuple(value, min, max)
|
|
472
|
-
);
|
|
473
|
-
const currentValue = useMemo(
|
|
474
|
-
() => value ? normalizeTuple(value, min, max) : internalValue,
|
|
475
|
-
[value, min, max, internalValue]
|
|
476
|
-
);
|
|
477
|
-
const currentStepValue = useMemo(() => {
|
|
478
|
-
if (step > 1) {
|
|
479
|
-
return currentValue.map((v) => Math.round(v / step) * step);
|
|
480
|
-
}
|
|
481
|
-
return currentValue;
|
|
482
|
-
}, [currentValue, step]);
|
|
483
|
-
const [transforms, setTransforms] = useState({
|
|
484
|
-
minTransform: 1,
|
|
485
|
-
maxTransform: 0,
|
|
486
|
-
transformX0: 0,
|
|
487
|
-
transformX1: 0
|
|
488
|
-
});
|
|
489
|
-
const trackWidth = useMemo(() => {
|
|
490
|
-
if ((trackSize == null ? void 0 : trackSize.width) === "auto") {
|
|
491
|
-
return actualTrackWidth;
|
|
492
|
-
}
|
|
493
|
-
return trackSize == null ? void 0 : trackSize.width;
|
|
494
|
-
}, [trackSize == null ? void 0 : trackSize.width, actualTrackWidth]);
|
|
495
|
-
useIsomorphicLayoutEffect(() => {
|
|
496
|
-
if ((trackSize == null ? void 0 : trackSize.width) === "auto" && sliderRef.current) {
|
|
497
|
-
const updateWidth = () => {
|
|
498
|
-
if (sliderRef.current) {
|
|
499
|
-
const width = sliderRef.current.getBoundingClientRect().width;
|
|
500
|
-
if (width > 0) {
|
|
501
|
-
setActualTrackWidth(width);
|
|
502
|
-
}
|
|
503
|
-
}
|
|
504
|
-
};
|
|
505
|
-
updateWidth();
|
|
506
|
-
const resizeObserver = new ResizeObserver(() => {
|
|
507
|
-
updateWidth();
|
|
508
|
-
});
|
|
509
|
-
resizeObserver.observe(sliderRef.current);
|
|
510
|
-
return () => {
|
|
511
|
-
resizeObserver.disconnect();
|
|
512
|
-
};
|
|
513
|
-
}
|
|
514
|
-
}, [trackSize == null ? void 0 : trackSize.width]);
|
|
515
|
-
useEffect(() => {
|
|
516
|
-
const position0 = valueToPosition(currentValue[0]);
|
|
517
|
-
const position1 = valueToPosition(currentValue[1]);
|
|
518
|
-
const minTransform = 1;
|
|
519
|
-
const maxTransform = (trackWidth ?? 0) - thumbSize - 1;
|
|
520
|
-
const transformX0 = minTransform + position0 * (maxTransform - minTransform);
|
|
521
|
-
const transformX1 = minTransform + position1 * (maxTransform - minTransform);
|
|
522
|
-
setTransforms({
|
|
523
|
-
minTransform,
|
|
524
|
-
maxTransform,
|
|
525
|
-
transformX0,
|
|
526
|
-
transformX1
|
|
527
|
-
});
|
|
528
|
-
}, [currentValue, trackWidth, thumbSize, valueToPosition]);
|
|
529
|
-
const dotsData = useMemo(() => {
|
|
530
|
-
if (!step || step <= 1) return null;
|
|
531
|
-
return Array.from({ length: Math.ceil((max - min) / step) + 1 }, (_, i) => {
|
|
532
|
-
const dotValue = min + i * step;
|
|
533
|
-
const dotPosition = valueToPosition(dotValue);
|
|
534
|
-
return {
|
|
535
|
-
value: dotValue,
|
|
536
|
-
position: dotPosition
|
|
537
|
-
};
|
|
538
|
-
});
|
|
539
|
-
}, [step, min, max, valueToPosition]);
|
|
540
|
-
const defaultDotPositions = useMemo(() => {
|
|
541
|
-
if (!normalizedDefaultValue || step > 1) return null;
|
|
542
|
-
return normalizedDefaultValue.map((v) => valueToPosition(v));
|
|
543
|
-
}, [normalizedDefaultValue, step, valueToPosition]);
|
|
544
|
-
const updatePosition = useEventCallback(
|
|
545
|
-
(clientX, thumbIndex, isEnd) => {
|
|
546
|
-
var _a;
|
|
547
|
-
if (readOnly) return;
|
|
548
|
-
const rect = (_a = sliderRef.current) == null ? void 0 : _a.getBoundingClientRect();
|
|
549
|
-
if (!rect) return;
|
|
550
|
-
const newPosition = clamp((clientX - rect.left) / rect.width, 0, 1);
|
|
551
|
-
const newValue = Math.round(positionToValue(newPosition) / step) * step;
|
|
552
|
-
let clampedValue = clamp(newValue, min, max);
|
|
553
|
-
if (normalizedDefaultValue && step === 1) {
|
|
554
|
-
const snapThreshold = (max - min) * 0.05;
|
|
555
|
-
for (const defVal of normalizedDefaultValue) {
|
|
556
|
-
const distanceToDefault = Math.abs(clampedValue - defVal);
|
|
557
|
-
if (distanceToDefault <= snapThreshold) {
|
|
558
|
-
clampedValue = defVal;
|
|
559
|
-
break;
|
|
560
|
-
}
|
|
918
|
+
var RangeTupleRoot = forwardRef(function RangeTuple(props, ref) {
|
|
919
|
+
const {
|
|
920
|
+
children,
|
|
921
|
+
defaultValue,
|
|
922
|
+
value,
|
|
923
|
+
onChange,
|
|
924
|
+
onChangeStart,
|
|
925
|
+
onChangeEnd,
|
|
926
|
+
min = 0,
|
|
927
|
+
max = 100,
|
|
928
|
+
step = 1,
|
|
929
|
+
disabled = false,
|
|
930
|
+
readOnly = false,
|
|
931
|
+
className,
|
|
932
|
+
width: propsWidth = 256,
|
|
933
|
+
thumbSize: propsThumbSize = 14
|
|
934
|
+
} = props;
|
|
935
|
+
const {
|
|
936
|
+
hasCustomChildren,
|
|
937
|
+
hasCustomDot,
|
|
938
|
+
hasCustomConnects,
|
|
939
|
+
extractedThumbSize,
|
|
940
|
+
extractedTrackHeight
|
|
941
|
+
} = useMemo(() => {
|
|
942
|
+
const childArray = Children.toArray(children);
|
|
943
|
+
let hasCustom = false;
|
|
944
|
+
let hasDot = false;
|
|
945
|
+
let hasConnects = false;
|
|
946
|
+
let thumbSizeFromChild;
|
|
947
|
+
let trackHeightFromChild;
|
|
948
|
+
for (const child of childArray) {
|
|
949
|
+
if (isValidElement(child)) {
|
|
950
|
+
const type = child.type;
|
|
951
|
+
if (child.type === RangeTupleThumb || (type == null ? void 0 : type.displayName) === "RangeTupleThumb") {
|
|
952
|
+
hasCustom = true;
|
|
953
|
+
const childProps = child.props;
|
|
954
|
+
if (childProps.size !== void 0) {
|
|
955
|
+
thumbSizeFromChild = childProps.size;
|
|
561
956
|
}
|
|
562
|
-
}
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
newTuple[0] = newTuple[1];
|
|
568
|
-
} else {
|
|
569
|
-
newTuple[1] = newTuple[0];
|
|
957
|
+
} else if (child.type === RangeTupleContainer || (type == null ? void 0 : type.displayName) === "RangeTupleContainer") {
|
|
958
|
+
hasCustom = true;
|
|
959
|
+
const childProps = child.props;
|
|
960
|
+
if (childProps.height !== void 0) {
|
|
961
|
+
trackHeightFromChild = childProps.height;
|
|
570
962
|
}
|
|
963
|
+
} else if (child.type === RangeTupleConnects || (type == null ? void 0 : type.displayName) === "RangeTupleConnects") {
|
|
964
|
+
hasCustom = true;
|
|
965
|
+
hasConnects = true;
|
|
966
|
+
} else if (child.type === RangeTupleDot || (type == null ? void 0 : type.displayName) === "RangeTupleDot") {
|
|
967
|
+
hasCustom = true;
|
|
968
|
+
hasDot = true;
|
|
571
969
|
}
|
|
572
|
-
if (isEnd) {
|
|
573
|
-
isDragging.current = null;
|
|
574
|
-
}
|
|
575
|
-
if (value === void 0) {
|
|
576
|
-
setInternalValue(newTuple);
|
|
577
|
-
}
|
|
578
|
-
onChange == null ? void 0 : onChange(newTuple);
|
|
579
|
-
}
|
|
580
|
-
);
|
|
581
|
-
useEffect(() => {
|
|
582
|
-
if (value !== void 0) {
|
|
583
|
-
setInternalValue(normalizeTuple(value, min, max));
|
|
584
970
|
}
|
|
585
|
-
}
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
971
|
+
}
|
|
972
|
+
return {
|
|
973
|
+
hasCustomChildren: hasCustom,
|
|
974
|
+
hasCustomDot: hasDot,
|
|
975
|
+
hasCustomConnects: hasConnects,
|
|
976
|
+
extractedThumbSize: thumbSizeFromChild,
|
|
977
|
+
extractedTrackHeight: trackHeightFromChild
|
|
978
|
+
};
|
|
979
|
+
}, [children]);
|
|
980
|
+
const thumbSize = extractedThumbSize ?? propsThumbSize;
|
|
981
|
+
const trackHeight = extractedTrackHeight ?? 16;
|
|
982
|
+
const safeStep = step > 0 ? step : 1;
|
|
983
|
+
const range = max - min || 1;
|
|
984
|
+
const [actualTrackWidth, setActualTrackWidth] = useState();
|
|
985
|
+
const valueToPosition = useCallback((val) => (val - min) / range, [min, range]);
|
|
986
|
+
const positionToValue = useCallback((position) => min + position * range, [min, range]);
|
|
987
|
+
const normalizedDefaultValue = useMemo(
|
|
988
|
+
() => defaultValue ? normalizeTuple(defaultValue, min, max) : void 0,
|
|
989
|
+
[defaultValue, min, max]
|
|
990
|
+
);
|
|
991
|
+
const defaultStepValue = useMemo(() => {
|
|
992
|
+
if (!normalizedDefaultValue) return null;
|
|
993
|
+
if (safeStep > 1) {
|
|
994
|
+
return normalizedDefaultValue.map(
|
|
995
|
+
(v) => Math.round((v - min) / safeStep) * safeStep + min
|
|
996
|
+
);
|
|
997
|
+
}
|
|
998
|
+
return normalizedDefaultValue;
|
|
999
|
+
}, [normalizedDefaultValue, safeStep, min]);
|
|
1000
|
+
const sliderRef = useRef(null);
|
|
1001
|
+
const thumb0Ref = useRef(null);
|
|
1002
|
+
const thumb1Ref = useRef(null);
|
|
1003
|
+
const input0Ref = useRef(null);
|
|
1004
|
+
const input1Ref = useRef(null);
|
|
1005
|
+
const isDragging = useRef(null);
|
|
1006
|
+
const cleanupRef = useRef(null);
|
|
1007
|
+
const [internalValue, setInternalValue] = useState(
|
|
1008
|
+
normalizeTuple(value, min, max)
|
|
1009
|
+
);
|
|
1010
|
+
const currentValue = useMemo(
|
|
1011
|
+
() => value ? normalizeTuple(value, min, max) : internalValue,
|
|
1012
|
+
[value, min, max, internalValue]
|
|
1013
|
+
);
|
|
1014
|
+
const currentStepValue = useMemo(() => {
|
|
1015
|
+
if (safeStep > 1) {
|
|
1016
|
+
return currentValue.map((v) => Math.round(v / safeStep) * safeStep);
|
|
1017
|
+
}
|
|
1018
|
+
return currentValue;
|
|
1019
|
+
}, [currentValue, safeStep]);
|
|
1020
|
+
const trackWidth = typeof propsWidth === "number" ? propsWidth : actualTrackWidth;
|
|
1021
|
+
useIsomorphicLayoutEffect(() => {
|
|
1022
|
+
if (typeof propsWidth !== "number" && sliderRef.current) {
|
|
1023
|
+
const updateWidth = () => {
|
|
1024
|
+
if (sliderRef.current) {
|
|
1025
|
+
const width = sliderRef.current.getBoundingClientRect().width;
|
|
1026
|
+
if (width > 0) {
|
|
1027
|
+
setActualTrackWidth(width);
|
|
611
1028
|
}
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
1029
|
+
}
|
|
1030
|
+
};
|
|
1031
|
+
updateWidth();
|
|
1032
|
+
const resizeObserver = new ResizeObserver(() => {
|
|
1033
|
+
updateWidth();
|
|
1034
|
+
});
|
|
1035
|
+
resizeObserver.observe(sliderRef.current);
|
|
1036
|
+
return () => {
|
|
1037
|
+
resizeObserver.disconnect();
|
|
1038
|
+
};
|
|
1039
|
+
}
|
|
1040
|
+
}, [propsWidth]);
|
|
1041
|
+
const transforms = useMemo(() => {
|
|
1042
|
+
const position0 = valueToPosition(currentValue[0]);
|
|
1043
|
+
const position1 = valueToPosition(currentValue[1]);
|
|
1044
|
+
const minTransform = 1;
|
|
1045
|
+
const maxTransform = (trackWidth ?? 0) - thumbSize - 1;
|
|
1046
|
+
const transformX0 = minTransform + position0 * (maxTransform - minTransform);
|
|
1047
|
+
const transformX1 = minTransform + position1 * (maxTransform - minTransform);
|
|
1048
|
+
return { minTransform, maxTransform, transformX0, transformX1 };
|
|
1049
|
+
}, [currentValue, trackWidth, thumbSize, valueToPosition]);
|
|
1050
|
+
const dotsData = useMemo(() => {
|
|
1051
|
+
if (safeStep <= 1) return null;
|
|
1052
|
+
return Array.from({ length: Math.ceil((max - min) / safeStep) + 1 }, (_, i) => {
|
|
1053
|
+
const dotValue = min + i * safeStep;
|
|
1054
|
+
const dotPosition = valueToPosition(dotValue);
|
|
1055
|
+
return {
|
|
1056
|
+
value: dotValue,
|
|
1057
|
+
position: dotPosition
|
|
1058
|
+
};
|
|
1059
|
+
});
|
|
1060
|
+
}, [safeStep, min, max, valueToPosition]);
|
|
1061
|
+
const defaultDotPositions = useMemo(() => {
|
|
1062
|
+
if (!normalizedDefaultValue || safeStep > 1) return null;
|
|
1063
|
+
return normalizedDefaultValue.map((v) => valueToPosition(v));
|
|
1064
|
+
}, [normalizedDefaultValue, safeStep, valueToPosition]);
|
|
1065
|
+
const updatePosition = useEventCallback(
|
|
1066
|
+
(clientX, thumbIndex, isEnd) => {
|
|
1067
|
+
var _a;
|
|
1068
|
+
if (readOnly) return;
|
|
1069
|
+
const rect = (_a = sliderRef.current) == null ? void 0 : _a.getBoundingClientRect();
|
|
1070
|
+
if (!rect) return;
|
|
1071
|
+
const newPosition = clamp((clientX - rect.left) / rect.width, 0, 1);
|
|
1072
|
+
const newValue = Math.round(positionToValue(newPosition) / safeStep) * safeStep;
|
|
1073
|
+
let clampedValue = clamp(newValue, min, max);
|
|
1074
|
+
if (normalizedDefaultValue && safeStep <= 1) {
|
|
1075
|
+
const snapThreshold = (max - min) * 0.05;
|
|
1076
|
+
for (const defVal of normalizedDefaultValue) {
|
|
1077
|
+
const distanceToDefault = Math.abs(clampedValue - defVal);
|
|
1078
|
+
if (distanceToDefault <= snapThreshold) {
|
|
1079
|
+
clampedValue = defVal;
|
|
1080
|
+
break;
|
|
639
1081
|
}
|
|
640
|
-
|
|
641
|
-
window.removeEventListener("pointerup", handleUp);
|
|
642
|
-
window.removeEventListener("pointercancel", handleUp);
|
|
643
|
-
};
|
|
644
|
-
window.addEventListener("pointermove", handleMove);
|
|
645
|
-
window.addEventListener("pointerup", handleUp);
|
|
646
|
-
window.addEventListener("pointercancel", handleUp);
|
|
647
|
-
},
|
|
648
|
-
[
|
|
649
|
-
disabled,
|
|
650
|
-
readOnly,
|
|
651
|
-
onChangeEnd,
|
|
652
|
-
onChangeStart,
|
|
653
|
-
updatePosition,
|
|
654
|
-
positionToValue,
|
|
655
|
-
step,
|
|
656
|
-
min,
|
|
657
|
-
max,
|
|
658
|
-
normalizedDefaultValue,
|
|
659
|
-
currentValue
|
|
660
|
-
]
|
|
661
|
-
);
|
|
662
|
-
const handleSliderPointerDown = useCallback(
|
|
663
|
-
(e) => {
|
|
664
|
-
var _a;
|
|
665
|
-
if (disabled || readOnly) return;
|
|
666
|
-
if (e.target === thumb0Ref.current || e.target === thumb1Ref.current) return;
|
|
667
|
-
const rect = (_a = sliderRef.current) == null ? void 0 : _a.getBoundingClientRect();
|
|
668
|
-
if (!rect) return;
|
|
669
|
-
const clickPosition = (e.clientX - rect.left) / rect.width;
|
|
670
|
-
const clickValue = positionToValue(clickPosition);
|
|
671
|
-
const dist0 = Math.abs(clickValue - currentValue[0]);
|
|
672
|
-
const dist1 = Math.abs(clickValue - currentValue[1]);
|
|
673
|
-
const thumbIndex = dist0 <= dist1 ? 0 : 1;
|
|
674
|
-
handlePointerDown(e, thumbIndex);
|
|
675
|
-
},
|
|
676
|
-
[disabled, readOnly, handlePointerDown, currentValue, positionToValue]
|
|
677
|
-
);
|
|
678
|
-
const handleKeyDown = useEventCallback((e, thumbIndex) => {
|
|
679
|
-
if (disabled || readOnly) return;
|
|
680
|
-
const stepValue = e.shiftKey ? step * 10 : step;
|
|
681
|
-
let newValue = currentValue[thumbIndex];
|
|
682
|
-
switch (e.key) {
|
|
683
|
-
case "ArrowLeft":
|
|
684
|
-
case "ArrowDown":
|
|
685
|
-
e.preventDefault();
|
|
686
|
-
newValue = clamp(newValue - stepValue, min, max);
|
|
687
|
-
break;
|
|
688
|
-
case "ArrowRight":
|
|
689
|
-
case "ArrowUp":
|
|
690
|
-
e.preventDefault();
|
|
691
|
-
newValue = clamp(newValue + stepValue, min, max);
|
|
692
|
-
break;
|
|
693
|
-
default:
|
|
694
|
-
return;
|
|
1082
|
+
}
|
|
695
1083
|
}
|
|
696
1084
|
const newTuple = [...currentValue];
|
|
697
|
-
newTuple[thumbIndex] =
|
|
1085
|
+
newTuple[thumbIndex] = clampedValue;
|
|
698
1086
|
if (newTuple[0] > newTuple[1]) {
|
|
699
1087
|
if (thumbIndex === 0) {
|
|
700
1088
|
newTuple[0] = newTuple[1];
|
|
@@ -702,185 +1090,225 @@ var RangeTuple = forwardRef(
|
|
|
702
1090
|
newTuple[1] = newTuple[0];
|
|
703
1091
|
}
|
|
704
1092
|
}
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
useEffect(() => {
|
|
708
|
-
var _a, _b;
|
|
709
|
-
if (disabled) {
|
|
710
|
-
if (document.activeElement === input0Ref.current) {
|
|
711
|
-
(_a = input0Ref.current) == null ? void 0 : _a.blur();
|
|
712
|
-
}
|
|
713
|
-
if (document.activeElement === input1Ref.current) {
|
|
714
|
-
(_b = input1Ref.current) == null ? void 0 : _b.blur();
|
|
715
|
-
}
|
|
716
|
-
}
|
|
717
|
-
}, [disabled]);
|
|
718
|
-
const tv = useMemo(
|
|
719
|
-
() => rangeTv({
|
|
720
|
-
hasStepOrDefault: step > 1 || normalizedDefaultValue !== void 0,
|
|
721
|
-
disabled
|
|
722
|
-
}),
|
|
723
|
-
[step, normalizedDefaultValue, disabled]
|
|
724
|
-
);
|
|
725
|
-
const connectsClass = useMemo(() => {
|
|
726
|
-
if (disabled) return "bg-disabled-background";
|
|
727
|
-
return connectsClassName.positive;
|
|
728
|
-
}, [disabled, connectsClassName]);
|
|
729
|
-
const connectStyle = useMemo(() => {
|
|
730
|
-
return {
|
|
731
|
-
left: `${transforms.transformX0 + thumbSize / 2}px`,
|
|
732
|
-
right: `calc(100% - ${transforms.transformX1 + thumbSize / 2}px)`,
|
|
733
|
-
height: trackSize == null ? void 0 : trackSize.height
|
|
734
|
-
};
|
|
735
|
-
}, [transforms.transformX0, transforms.transformX1, thumbSize, trackSize == null ? void 0 : trackSize.height]);
|
|
736
|
-
const renderDots = useCallback(() => {
|
|
737
|
-
if (dotsData) {
|
|
738
|
-
return dotsData.map(({ value: dotValue, position: dotPosition }) => {
|
|
739
|
-
const { minTransform, maxTransform } = transforms;
|
|
740
|
-
const dotTransform = minTransform + dotPosition * (maxTransform - minTransform);
|
|
741
|
-
const isWithinRange = dotValue >= currentValue[0] && dotValue <= currentValue[1];
|
|
742
|
-
const isDefaultValue = defaultStepValue == null ? void 0 : defaultStepValue.includes(dotValue);
|
|
743
|
-
const { dot } = rangeTv({
|
|
744
|
-
defaultStepValue: isDefaultValue,
|
|
745
|
-
overStepValue: isWithinRange
|
|
746
|
-
});
|
|
747
|
-
return /* @__PURE__ */ jsx(
|
|
748
|
-
"div",
|
|
749
|
-
{
|
|
750
|
-
className: dot(),
|
|
751
|
-
style: {
|
|
752
|
-
left: dotTransform + thumbSize / 2
|
|
753
|
-
}
|
|
754
|
-
},
|
|
755
|
-
dotValue
|
|
756
|
-
);
|
|
757
|
-
});
|
|
1093
|
+
if (isEnd) {
|
|
1094
|
+
isDragging.current = null;
|
|
758
1095
|
}
|
|
759
|
-
if (
|
|
760
|
-
|
|
761
|
-
"div",
|
|
762
|
-
{
|
|
763
|
-
className: rangeTv({ defaultStepValue: true }).dot(),
|
|
764
|
-
style: {
|
|
765
|
-
left: transforms.minTransform + position * (transforms.maxTransform - transforms.minTransform) + thumbSize / 2
|
|
766
|
-
}
|
|
767
|
-
},
|
|
768
|
-
`default-${idx}`
|
|
769
|
-
));
|
|
1096
|
+
if (value === void 0) {
|
|
1097
|
+
setInternalValue(newTuple);
|
|
770
1098
|
}
|
|
771
|
-
|
|
772
|
-
}
|
|
773
|
-
|
|
774
|
-
|
|
1099
|
+
onChange == null ? void 0 : onChange(newTuple);
|
|
1100
|
+
}
|
|
1101
|
+
);
|
|
1102
|
+
useEffect(() => {
|
|
1103
|
+
if (value !== void 0) {
|
|
1104
|
+
setInternalValue(normalizeTuple(value, min, max));
|
|
1105
|
+
}
|
|
1106
|
+
}, [value, min, max]);
|
|
1107
|
+
const latestValueRef = useRef(currentValue);
|
|
1108
|
+
latestValueRef.current = currentValue;
|
|
1109
|
+
const handlePointerDown = useCallback(
|
|
1110
|
+
(e, thumbIndex) => {
|
|
1111
|
+
var _a;
|
|
1112
|
+
if (disabled || readOnly) return;
|
|
1113
|
+
e.preventDefault();
|
|
1114
|
+
e.stopPropagation();
|
|
1115
|
+
const thumb = thumbIndex === 0 ? thumb0Ref.current : thumb1Ref.current;
|
|
1116
|
+
const inputRef = thumbIndex === 0 ? input0Ref : input1Ref;
|
|
1117
|
+
if (!thumb) return;
|
|
1118
|
+
onChangeStart == null ? void 0 : onChangeStart();
|
|
1119
|
+
isDragging.current = thumbIndex;
|
|
1120
|
+
thumb.setPointerCapture(e.pointerId);
|
|
1121
|
+
updatePosition(e.clientX, thumbIndex);
|
|
1122
|
+
(_a = inputRef.current) == null ? void 0 : _a.focus();
|
|
1123
|
+
const handleMove = (e2) => {
|
|
1124
|
+
if (isDragging.current !== thumbIndex) return;
|
|
1125
|
+
e2.preventDefault();
|
|
1126
|
+
updatePosition(e2.clientX, thumbIndex);
|
|
775
1127
|
};
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
1128
|
+
const cleanup = () => {
|
|
1129
|
+
window.removeEventListener("pointermove", handleMove);
|
|
1130
|
+
window.removeEventListener("pointerup", handleUp);
|
|
1131
|
+
window.removeEventListener("pointercancel", handleUp);
|
|
1132
|
+
cleanupRef.current = null;
|
|
1133
|
+
};
|
|
1134
|
+
const handleUp = (e2) => {
|
|
1135
|
+
if (isDragging.current !== thumbIndex) return;
|
|
1136
|
+
e2.preventDefault();
|
|
1137
|
+
if (thumb.hasPointerCapture(e2.pointerId)) {
|
|
1138
|
+
thumb.releasePointerCapture(e2.pointerId);
|
|
781
1139
|
}
|
|
1140
|
+
updatePosition(e2.clientX, thumbIndex, true);
|
|
1141
|
+
isDragging.current = null;
|
|
1142
|
+
onChangeEnd == null ? void 0 : onChangeEnd(latestValueRef.current);
|
|
1143
|
+
cleanup();
|
|
782
1144
|
};
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
},
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
()
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
()
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
willChange: isDragging.current === 0 ? "transform" : "auto"
|
|
838
|
-
},
|
|
839
|
-
children: /* @__PURE__ */ jsx(
|
|
840
|
-
"input",
|
|
841
|
-
{
|
|
842
|
-
ref: input0Ref,
|
|
843
|
-
type: "text",
|
|
844
|
-
onKeyDown: (e) => handleKeyDown(e, 0),
|
|
845
|
-
className: tv.input(),
|
|
846
|
-
tabIndex: disabled || readOnly ? -1 : 0,
|
|
847
|
-
readOnly: true
|
|
848
|
-
}
|
|
849
|
-
)
|
|
850
|
-
}
|
|
851
|
-
),
|
|
852
|
-
/* @__PURE__ */ jsx(
|
|
853
|
-
"div",
|
|
854
|
-
{
|
|
855
|
-
ref: thumb1Ref,
|
|
856
|
-
onPointerDown: (e) => handlePointerDown(e, 1),
|
|
857
|
-
className: thumbTv1.thumb(),
|
|
858
|
-
style: {
|
|
859
|
-
width: thumbSize,
|
|
860
|
-
height: thumbSize,
|
|
861
|
-
transform: `translate(${transforms.transformX1}px, -50%)`,
|
|
862
|
-
willChange: isDragging.current === 1 ? "transform" : "auto"
|
|
863
|
-
},
|
|
864
|
-
children: /* @__PURE__ */ jsx(
|
|
865
|
-
"input",
|
|
866
|
-
{
|
|
867
|
-
ref: input1Ref,
|
|
868
|
-
type: "text",
|
|
869
|
-
onKeyDown: (e) => handleKeyDown(e, 1),
|
|
870
|
-
className: tv.input(),
|
|
871
|
-
tabIndex: disabled || readOnly ? -1 : 0,
|
|
872
|
-
readOnly: true
|
|
873
|
-
}
|
|
874
|
-
)
|
|
875
|
-
}
|
|
876
|
-
)
|
|
877
|
-
]
|
|
1145
|
+
cleanupRef.current = cleanup;
|
|
1146
|
+
window.addEventListener("pointermove", handleMove);
|
|
1147
|
+
window.addEventListener("pointerup", handleUp);
|
|
1148
|
+
window.addEventListener("pointercancel", handleUp);
|
|
1149
|
+
},
|
|
1150
|
+
[disabled, readOnly, onChangeEnd, onChangeStart, updatePosition]
|
|
1151
|
+
);
|
|
1152
|
+
useEffect(() => {
|
|
1153
|
+
return () => {
|
|
1154
|
+
var _a;
|
|
1155
|
+
(_a = cleanupRef.current) == null ? void 0 : _a.call(cleanupRef);
|
|
1156
|
+
};
|
|
1157
|
+
}, []);
|
|
1158
|
+
const handleSliderPointerDown = useCallback(
|
|
1159
|
+
(e) => {
|
|
1160
|
+
var _a;
|
|
1161
|
+
if (disabled || readOnly) return;
|
|
1162
|
+
if (e.target === thumb0Ref.current || e.target === thumb1Ref.current) return;
|
|
1163
|
+
const rect = (_a = sliderRef.current) == null ? void 0 : _a.getBoundingClientRect();
|
|
1164
|
+
if (!rect) return;
|
|
1165
|
+
const clickPosition = (e.clientX - rect.left) / rect.width;
|
|
1166
|
+
const clickValue = positionToValue(clickPosition);
|
|
1167
|
+
const dist0 = Math.abs(clickValue - currentValue[0]);
|
|
1168
|
+
const dist1 = Math.abs(clickValue - currentValue[1]);
|
|
1169
|
+
const thumbIndex = dist0 <= dist1 ? 0 : 1;
|
|
1170
|
+
handlePointerDown(e, thumbIndex);
|
|
1171
|
+
},
|
|
1172
|
+
[disabled, readOnly, handlePointerDown, currentValue, positionToValue]
|
|
1173
|
+
);
|
|
1174
|
+
const handleKeyDown = useEventCallback((e, thumbIndex) => {
|
|
1175
|
+
if (disabled || readOnly) return;
|
|
1176
|
+
const stepValue = e.shiftKey ? safeStep * 10 : safeStep;
|
|
1177
|
+
let newValue = currentValue[thumbIndex];
|
|
1178
|
+
switch (e.key) {
|
|
1179
|
+
case "ArrowLeft":
|
|
1180
|
+
case "ArrowDown":
|
|
1181
|
+
e.preventDefault();
|
|
1182
|
+
newValue = clamp(newValue - stepValue, min, max);
|
|
1183
|
+
break;
|
|
1184
|
+
case "ArrowRight":
|
|
1185
|
+
case "ArrowUp":
|
|
1186
|
+
e.preventDefault();
|
|
1187
|
+
newValue = clamp(newValue + stepValue, min, max);
|
|
1188
|
+
break;
|
|
1189
|
+
default:
|
|
1190
|
+
return;
|
|
1191
|
+
}
|
|
1192
|
+
const newTuple = [...currentValue];
|
|
1193
|
+
newTuple[thumbIndex] = newValue;
|
|
1194
|
+
if (newTuple[0] > newTuple[1]) {
|
|
1195
|
+
if (thumbIndex === 0) {
|
|
1196
|
+
newTuple[0] = newTuple[1];
|
|
1197
|
+
} else {
|
|
1198
|
+
newTuple[1] = newTuple[0];
|
|
878
1199
|
}
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
);
|
|
882
|
-
|
|
1200
|
+
}
|
|
1201
|
+
onChange == null ? void 0 : onChange(newTuple);
|
|
1202
|
+
});
|
|
1203
|
+
useEffect(() => {
|
|
1204
|
+
var _a, _b;
|
|
1205
|
+
if (disabled) {
|
|
1206
|
+
if (document.activeElement === input0Ref.current) {
|
|
1207
|
+
(_a = input0Ref.current) == null ? void 0 : _a.blur();
|
|
1208
|
+
}
|
|
1209
|
+
if (document.activeElement === input1Ref.current) {
|
|
1210
|
+
(_b = input1Ref.current) == null ? void 0 : _b.blur();
|
|
1211
|
+
}
|
|
1212
|
+
}
|
|
1213
|
+
}, [disabled]);
|
|
1214
|
+
const hasStepOrDefault = safeStep > 1 || normalizedDefaultValue !== void 0;
|
|
1215
|
+
const tv = useMemo(() => rangeTv({ hasStepOrDefault, disabled }), [hasStepOrDefault, disabled]);
|
|
1216
|
+
const thumb0IsDefault = defaultStepValue ? currentStepValue[0] === defaultStepValue[0] : false;
|
|
1217
|
+
const thumb1IsDefault = defaultStepValue ? currentStepValue[1] === defaultStepValue[1] : false;
|
|
1218
|
+
const thumbTv0 = useMemo(
|
|
1219
|
+
() => rangeTv({ currentDefaultValue: thumb0IsDefault, hasStepOrDefault, disabled }),
|
|
1220
|
+
[thumb0IsDefault, hasStepOrDefault, disabled]
|
|
1221
|
+
);
|
|
1222
|
+
const thumbTv1 = useMemo(
|
|
1223
|
+
() => rangeTv({ currentDefaultValue: thumb1IsDefault, hasStepOrDefault, disabled }),
|
|
1224
|
+
[thumb1IsDefault, hasStepOrDefault, disabled]
|
|
1225
|
+
);
|
|
1226
|
+
const contextValue = useMemo(
|
|
1227
|
+
() => ({
|
|
1228
|
+
currentValue,
|
|
1229
|
+
disabled,
|
|
1230
|
+
readOnly,
|
|
1231
|
+
min,
|
|
1232
|
+
max,
|
|
1233
|
+
step: safeStep,
|
|
1234
|
+
thumbSize,
|
|
1235
|
+
trackHeight,
|
|
1236
|
+
transforms,
|
|
1237
|
+
defaultStepValue,
|
|
1238
|
+
currentStepValue,
|
|
1239
|
+
dotsData,
|
|
1240
|
+
defaultDotPositions,
|
|
1241
|
+
normalizedDefaultValue,
|
|
1242
|
+
thumb0Ref,
|
|
1243
|
+
thumb1Ref,
|
|
1244
|
+
input0Ref,
|
|
1245
|
+
input1Ref,
|
|
1246
|
+
isDragging,
|
|
1247
|
+
handlePointerDown,
|
|
1248
|
+
handleKeyDown,
|
|
1249
|
+
tv,
|
|
1250
|
+
thumbTv0,
|
|
1251
|
+
thumbTv1,
|
|
1252
|
+
hasCustomDot,
|
|
1253
|
+
hasCustomConnects,
|
|
1254
|
+
isDefaultValue: thumb0IsDefault && thumb1IsDefault
|
|
1255
|
+
}),
|
|
1256
|
+
[
|
|
1257
|
+
currentValue,
|
|
1258
|
+
disabled,
|
|
1259
|
+
readOnly,
|
|
1260
|
+
min,
|
|
1261
|
+
max,
|
|
1262
|
+
safeStep,
|
|
1263
|
+
thumbSize,
|
|
1264
|
+
trackHeight,
|
|
1265
|
+
transforms,
|
|
1266
|
+
defaultStepValue,
|
|
1267
|
+
currentStepValue,
|
|
1268
|
+
dotsData,
|
|
1269
|
+
defaultDotPositions,
|
|
1270
|
+
normalizedDefaultValue,
|
|
1271
|
+
handlePointerDown,
|
|
1272
|
+
handleKeyDown,
|
|
1273
|
+
tv,
|
|
1274
|
+
thumbTv0,
|
|
1275
|
+
thumbTv1,
|
|
1276
|
+
hasCustomDot,
|
|
1277
|
+
hasCustomConnects,
|
|
1278
|
+
thumb0IsDefault,
|
|
1279
|
+
thumb1IsDefault
|
|
1280
|
+
]
|
|
1281
|
+
);
|
|
1282
|
+
return /* @__PURE__ */ jsx(RangeTupleContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx(
|
|
1283
|
+
"div",
|
|
1284
|
+
{
|
|
1285
|
+
ref: mergeRefs(sliderRef, ref),
|
|
1286
|
+
onPointerDown: handleSliderPointerDown,
|
|
1287
|
+
className: tcx(tv.container(), className),
|
|
1288
|
+
style: {
|
|
1289
|
+
"--width": `${trackWidth}px`,
|
|
1290
|
+
"--height": `${trackHeight}px`,
|
|
1291
|
+
"--thumb-size": `${thumbSize}px`
|
|
1292
|
+
},
|
|
1293
|
+
children: hasCustomChildren ? children : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
1294
|
+
/* @__PURE__ */ jsx(RangeTupleContainer, {}),
|
|
1295
|
+
/* @__PURE__ */ jsx(RangeTupleThumb, { index: 0 }),
|
|
1296
|
+
/* @__PURE__ */ jsx(RangeTupleThumb, { index: 1 })
|
|
1297
|
+
] })
|
|
1298
|
+
}
|
|
1299
|
+
) });
|
|
1300
|
+
});
|
|
1301
|
+
RangeTupleRoot.displayName = "RangeTuple";
|
|
1302
|
+
Object.assign(RangeTupleRoot, {
|
|
1303
|
+
Container: RangeTupleContainer,
|
|
1304
|
+
Connects: RangeTupleConnects,
|
|
1305
|
+
Thumb: RangeTupleThumb,
|
|
1306
|
+
Dot: RangeTupleDot
|
|
1307
|
+
});
|
|
883
1308
|
export {
|
|
884
|
-
Range,
|
|
885
|
-
|
|
1309
|
+
Range2 as Range,
|
|
1310
|
+
RangeContext,
|
|
1311
|
+
RangeTupleContext,
|
|
1312
|
+
useRangeContext,
|
|
1313
|
+
useRangeTupleContext
|
|
886
1314
|
};
|