@metamask/design-system-react-native 0.34.0 → 0.35.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +18 -1
- package/dist/components/ActionListItem/ActionListItem.cjs +1 -1
- package/dist/components/ActionListItem/ActionListItem.cjs.map +1 -1
- package/dist/components/ActionListItem/ActionListItem.mjs +1 -1
- package/dist/components/ActionListItem/ActionListItem.mjs.map +1 -1
- package/dist/components/ButtonBase/ButtonBase.cjs +1 -1
- package/dist/components/ButtonBase/ButtonBase.cjs.map +1 -1
- package/dist/components/ButtonBase/ButtonBase.d.cts.map +1 -1
- package/dist/components/ButtonBase/ButtonBase.d.mts.map +1 -1
- package/dist/components/ButtonBase/ButtonBase.mjs +1 -1
- package/dist/components/ButtonBase/ButtonBase.mjs.map +1 -1
- package/dist/components/FilterButton/FilterButton.cjs +24 -36
- package/dist/components/FilterButton/FilterButton.cjs.map +1 -1
- package/dist/components/FilterButton/FilterButton.d.cts.map +1 -1
- package/dist/components/FilterButton/FilterButton.d.mts.map +1 -1
- package/dist/components/FilterButton/FilterButton.mjs +25 -37
- package/dist/components/FilterButton/FilterButton.mjs.map +1 -1
- package/dist/components/Slider/Slider.cjs +139 -0
- package/dist/components/Slider/Slider.cjs.map +1 -0
- package/dist/components/Slider/Slider.constants.cjs +36 -0
- package/dist/components/Slider/Slider.constants.cjs.map +1 -0
- package/dist/components/Slider/Slider.constants.d.cts +33 -0
- package/dist/components/Slider/Slider.constants.d.cts.map +1 -0
- package/dist/components/Slider/Slider.constants.d.mts +33 -0
- package/dist/components/Slider/Slider.constants.d.mts.map +1 -0
- package/dist/components/Slider/Slider.constants.mjs +33 -0
- package/dist/components/Slider/Slider.constants.mjs.map +1 -0
- package/dist/components/Slider/Slider.d.cts +7 -0
- package/dist/components/Slider/Slider.d.cts.map +1 -0
- package/dist/components/Slider/Slider.d.mts +7 -0
- package/dist/components/Slider/Slider.d.mts.map +1 -0
- package/dist/components/Slider/Slider.mjs +116 -0
- package/dist/components/Slider/Slider.mjs.map +1 -0
- package/dist/components/Slider/Slider.types.cjs +3 -0
- package/dist/components/Slider/Slider.types.cjs.map +1 -0
- package/dist/components/Slider/Slider.types.d.cts +135 -0
- package/dist/components/Slider/Slider.types.d.cts.map +1 -0
- package/dist/components/Slider/Slider.types.d.mts +135 -0
- package/dist/components/Slider/Slider.types.d.mts.map +1 -0
- package/dist/components/Slider/Slider.types.mjs +2 -0
- package/dist/components/Slider/Slider.types.mjs.map +1 -0
- package/dist/components/Slider/Slider.utilities.cjs +202 -0
- package/dist/components/Slider/Slider.utilities.cjs.map +1 -0
- package/dist/components/Slider/Slider.utilities.d.cts +108 -0
- package/dist/components/Slider/Slider.utilities.d.cts.map +1 -0
- package/dist/components/Slider/Slider.utilities.d.mts +108 -0
- package/dist/components/Slider/Slider.utilities.d.mts.map +1 -0
- package/dist/components/Slider/Slider.utilities.mjs +186 -0
- package/dist/components/Slider/Slider.utilities.mjs.map +1 -0
- package/dist/components/Slider/index.cjs +9 -0
- package/dist/components/Slider/index.cjs.map +1 -0
- package/dist/components/Slider/index.d.cts +4 -0
- package/dist/components/Slider/index.d.cts.map +1 -0
- package/dist/components/Slider/index.d.mts +4 -0
- package/dist/components/Slider/index.d.mts.map +1 -0
- package/dist/components/Slider/index.mjs +3 -0
- package/dist/components/Slider/index.mjs.map +1 -0
- package/dist/components/Slider/useSliderGesture.cjs +219 -0
- package/dist/components/Slider/useSliderGesture.cjs.map +1 -0
- package/dist/components/Slider/useSliderGesture.d.cts +17 -0
- package/dist/components/Slider/useSliderGesture.d.cts.map +1 -0
- package/dist/components/Slider/useSliderGesture.d.mts +17 -0
- package/dist/components/Slider/useSliderGesture.d.mts.map +1 -0
- package/dist/components/Slider/useSliderGesture.mjs +215 -0
- package/dist/components/Slider/useSliderGesture.mjs.map +1 -0
- package/dist/components/index.cjs +5 -1
- package/dist/components/index.cjs.map +1 -1
- package/dist/components/index.d.cts +2 -0
- package/dist/components/index.d.cts.map +1 -1
- package/dist/components/index.d.mts +2 -0
- package/dist/components/index.d.mts.map +1 -1
- package/dist/components/index.mjs +1 -0
- package/dist/components/index.mjs.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure helpers for Slider coordinate conversion and UI defaults.
|
|
3
|
+
*
|
|
4
|
+
* Three coordinate systems:
|
|
5
|
+
* - **Domain value** — the controlled `value` prop (`minimumValue`…`maximumValue`).
|
|
6
|
+
* - **Track percent** — normalized 0–100 position along the track (used for dots,
|
|
7
|
+
* labels, and `tickThresholds`; may be non-linear via `map*` hooks).
|
|
8
|
+
* - **Pixel position** — thumb/fill offset in layout pixels (`translateX`).
|
|
9
|
+
*
|
|
10
|
+
* Functions marked with `'worklet'` run on the UI thread inside gesture handlers.
|
|
11
|
+
* JS-thread callers use the non-worklet wrappers (`getTrackPercentFromValue`, etc.).
|
|
12
|
+
*/
|
|
13
|
+
export declare function clampTrackPercent(trackPercent: number): number;
|
|
14
|
+
/**
|
|
15
|
+
* Linear default: domain value → 0–100 track position.
|
|
16
|
+
*
|
|
17
|
+
* @param value - Domain value to map.
|
|
18
|
+
* @param minimumValue - Lower bound of the domain range.
|
|
19
|
+
* @param maximumValue - Upper bound of the domain range.
|
|
20
|
+
* @returns Track percent clamped to 0–100.
|
|
21
|
+
*/
|
|
22
|
+
export declare function defaultMapValueToTrackPercent(value: number, minimumValue: number, maximumValue: number): number;
|
|
23
|
+
/**
|
|
24
|
+
* Linear default: track position → stepped domain value.
|
|
25
|
+
*
|
|
26
|
+
* @param trackPercent - Track position from 0–100.
|
|
27
|
+
* @param minimumValue - Lower bound of the domain range.
|
|
28
|
+
* @param maximumValue - Upper bound of the domain range.
|
|
29
|
+
* @param step - Step increment for rounding.
|
|
30
|
+
* @returns Stepped domain value clamped to the range.
|
|
31
|
+
*/
|
|
32
|
+
export declare function defaultMapTrackPercentToValue(trackPercent: number, minimumValue: number, maximumValue: number, step: number): number;
|
|
33
|
+
/**
|
|
34
|
+
* UI-thread entry: custom `mapTrackPercentToValue` or linear default.
|
|
35
|
+
*
|
|
36
|
+
* @param trackPercent - Track position from 0–100.
|
|
37
|
+
* @param minimumValue - Lower bound of the domain range.
|
|
38
|
+
* @param maximumValue - Upper bound of the domain range.
|
|
39
|
+
* @param step - Step increment for the default mapper.
|
|
40
|
+
* @param mapTrackPercentToValue - Optional custom mapper.
|
|
41
|
+
* @returns Domain value for the track position.
|
|
42
|
+
*/
|
|
43
|
+
export declare function resolveTrackPercentToValue(trackPercent: number, minimumValue: number, maximumValue: number, step: number, mapTrackPercentToValue?: (trackPercent: number) => number): number;
|
|
44
|
+
/**
|
|
45
|
+
* UI-thread entry: custom `mapValueToTrackPercent` or linear default.
|
|
46
|
+
*
|
|
47
|
+
* @param value - Domain value to map.
|
|
48
|
+
* @param minimumValue - Lower bound of the domain range.
|
|
49
|
+
* @param maximumValue - Upper bound of the domain range.
|
|
50
|
+
* @param mapValueToTrackPercent - Optional custom mapper.
|
|
51
|
+
* @returns Track percent for the domain value.
|
|
52
|
+
*/
|
|
53
|
+
export declare function resolveValueToTrackPercent(value: number, minimumValue: number, maximumValue: number, mapValueToTrackPercent?: (value: number) => number): number;
|
|
54
|
+
export declare function trackPercentToPosition(trackPercent: number, width: number): number;
|
|
55
|
+
export declare function positionToTrackPercent(position: number, width: number): number;
|
|
56
|
+
/**
|
|
57
|
+
* Clamps a touch X coordinate to the track bounds.
|
|
58
|
+
*
|
|
59
|
+
* @param position - Touch X in track coordinates.
|
|
60
|
+
* @param width - Track width in pixels.
|
|
61
|
+
* @returns Clamped pixel position.
|
|
62
|
+
*/
|
|
63
|
+
export declare function clampGesturePosition(position: number, width: number): number;
|
|
64
|
+
/**
|
|
65
|
+
* JS-thread entry for mapping domain value → track percent.
|
|
66
|
+
* Used by Slider (labels, a11y) and useSliderGesture (prop/layout sync).
|
|
67
|
+
*
|
|
68
|
+
* @param value - Domain value to map.
|
|
69
|
+
* @param minimumValue - Lower bound of the domain range.
|
|
70
|
+
* @param maximumValue - Upper bound of the domain range.
|
|
71
|
+
* @param mapValueToTrackPercent - Optional custom mapper.
|
|
72
|
+
* @returns Track percent for the domain value.
|
|
73
|
+
*/
|
|
74
|
+
export declare function getTrackPercentFromValue(value: number, minimumValue: number, maximumValue: number, mapValueToTrackPercent?: (value: number) => number): number;
|
|
75
|
+
/**
|
|
76
|
+
* Default `stepToValue`: linear track-percent → domain value.
|
|
77
|
+
*
|
|
78
|
+
* @param step - Track-percent step from `rangeLabelSteps`.
|
|
79
|
+
* @param minimumValue - Lower bound of the domain range.
|
|
80
|
+
* @param maximumValue - Upper bound of the domain range.
|
|
81
|
+
* @returns Domain value for the step.
|
|
82
|
+
*/
|
|
83
|
+
export declare function defaultStepToValue(step: number, minimumValue: number, maximumValue: number): number;
|
|
84
|
+
/**
|
|
85
|
+
* Default `formatStepLabel`: display track percent as a percent string.
|
|
86
|
+
*
|
|
87
|
+
* @param step - Track-percent step from `rangeLabelSteps`.
|
|
88
|
+
* @returns Formatted label string.
|
|
89
|
+
*/
|
|
90
|
+
export declare function defaultFormatStepLabel(step: number): string;
|
|
91
|
+
/**
|
|
92
|
+
* Marker `left` percent for range dots and labels; edge steps inset to stay on track.
|
|
93
|
+
*
|
|
94
|
+
* @param step - Track-percent step from `rangeLabelSteps`.
|
|
95
|
+
* @returns CSS `left` percentage string.
|
|
96
|
+
*/
|
|
97
|
+
export declare function getDotLeftPercent(step: number): string;
|
|
98
|
+
/**
|
|
99
|
+
* Clamps and steps a domain value for increment/decrement actions.
|
|
100
|
+
*
|
|
101
|
+
* @param value - Domain value to clamp.
|
|
102
|
+
* @param minimumValue - Lower bound of the domain range.
|
|
103
|
+
* @param maximumValue - Upper bound of the domain range.
|
|
104
|
+
* @param step - Step increment for rounding.
|
|
105
|
+
* @returns Clamped and stepped domain value.
|
|
106
|
+
*/
|
|
107
|
+
export declare function clampValueToRange(value: number, minimumValue: number, maximumValue: number, step: number): number;
|
|
108
|
+
//# sourceMappingURL=Slider.utilities.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Slider.utilities.d.mts","sourceRoot":"","sources":["../../../src/components/Slider/Slider.utilities.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AASH,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAI9D;AAID;;;;;;;GAOG;AACH,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,GACnB,MAAM,CAUR;AAED;;;;;;;;GAQG;AACH,wBAAgB,6BAA6B,CAC3C,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,MAAM,GACX,MAAM,CAYR;AAED;;;;;;;;;GASG;AACH,wBAAgB,0BAA0B,CACxC,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,MAAM,EACZ,sBAAsB,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,MAAM,GACxD,MAAM,CAaR;AAED;;;;;;;;GAQG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,sBAAsB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GACjD,MAAM,CAQR;AAID,wBAAgB,sBAAsB,CACpC,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,GACZ,MAAM,CAQR;AAED,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GACZ,MAAM,CAQR;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAI5E;AAID;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,sBAAsB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GACjD,MAAM,CAMR;AAID;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,GACnB,MAAM,CAER;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAStD;AAID;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,MAAM,GACX,MAAM,CAQR"}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure helpers for Slider coordinate conversion and UI defaults.
|
|
3
|
+
*
|
|
4
|
+
* Three coordinate systems:
|
|
5
|
+
* - **Domain value** — the controlled `value` prop (`minimumValue`…`maximumValue`).
|
|
6
|
+
* - **Track percent** — normalized 0–100 position along the track (used for dots,
|
|
7
|
+
* labels, and `tickThresholds`; may be non-linear via `map*` hooks).
|
|
8
|
+
* - **Pixel position** — thumb/fill offset in layout pixels (`translateX`).
|
|
9
|
+
*
|
|
10
|
+
* Functions marked with `'worklet'` run on the UI thread inside gesture handlers.
|
|
11
|
+
* JS-thread callers use the non-worklet wrappers (`getTrackPercentFromValue`, etc.).
|
|
12
|
+
*/
|
|
13
|
+
import { DOT_EDGE_INSET_PERCENT, DOT_EDGE_MAX_PERCENT } from "./Slider.constants.mjs";
|
|
14
|
+
// --- Track-percent primitives (worklet) ---
|
|
15
|
+
export function clampTrackPercent(trackPercent) {
|
|
16
|
+
'worklet';
|
|
17
|
+
return Math.max(0, Math.min(100, trackPercent));
|
|
18
|
+
}
|
|
19
|
+
// --- Domain ↔ track-percent mappers (worklet) ---
|
|
20
|
+
/**
|
|
21
|
+
* Linear default: domain value → 0–100 track position.
|
|
22
|
+
*
|
|
23
|
+
* @param value - Domain value to map.
|
|
24
|
+
* @param minimumValue - Lower bound of the domain range.
|
|
25
|
+
* @param maximumValue - Upper bound of the domain range.
|
|
26
|
+
* @returns Track percent clamped to 0–100.
|
|
27
|
+
*/
|
|
28
|
+
export function defaultMapValueToTrackPercent(value, minimumValue, maximumValue) {
|
|
29
|
+
'worklet';
|
|
30
|
+
const range = maximumValue - minimumValue;
|
|
31
|
+
if (range === 0) {
|
|
32
|
+
return 0;
|
|
33
|
+
}
|
|
34
|
+
const percent = ((value - minimumValue) / range) * 100;
|
|
35
|
+
return clampTrackPercent(percent);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Linear default: track position → stepped domain value.
|
|
39
|
+
*
|
|
40
|
+
* @param trackPercent - Track position from 0–100.
|
|
41
|
+
* @param minimumValue - Lower bound of the domain range.
|
|
42
|
+
* @param maximumValue - Upper bound of the domain range.
|
|
43
|
+
* @param step - Step increment for rounding.
|
|
44
|
+
* @returns Stepped domain value clamped to the range.
|
|
45
|
+
*/
|
|
46
|
+
export function defaultMapTrackPercentToValue(trackPercent, minimumValue, maximumValue, step) {
|
|
47
|
+
'worklet';
|
|
48
|
+
const range = maximumValue - minimumValue;
|
|
49
|
+
if (range === 0) {
|
|
50
|
+
return minimumValue;
|
|
51
|
+
}
|
|
52
|
+
const rawValue = (clampTrackPercent(trackPercent) / 100) * range + minimumValue;
|
|
53
|
+
const stepped = Math.round(rawValue / step) * step;
|
|
54
|
+
return Math.max(minimumValue, Math.min(maximumValue, stepped));
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* UI-thread entry: custom `mapTrackPercentToValue` or linear default.
|
|
58
|
+
*
|
|
59
|
+
* @param trackPercent - Track position from 0–100.
|
|
60
|
+
* @param minimumValue - Lower bound of the domain range.
|
|
61
|
+
* @param maximumValue - Upper bound of the domain range.
|
|
62
|
+
* @param step - Step increment for the default mapper.
|
|
63
|
+
* @param mapTrackPercentToValue - Optional custom mapper.
|
|
64
|
+
* @returns Domain value for the track position.
|
|
65
|
+
*/
|
|
66
|
+
export function resolveTrackPercentToValue(trackPercent, minimumValue, maximumValue, step, mapTrackPercentToValue) {
|
|
67
|
+
'worklet';
|
|
68
|
+
if (mapTrackPercentToValue) {
|
|
69
|
+
return mapTrackPercentToValue(trackPercent);
|
|
70
|
+
}
|
|
71
|
+
return defaultMapTrackPercentToValue(trackPercent, minimumValue, maximumValue, step);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* UI-thread entry: custom `mapValueToTrackPercent` or linear default.
|
|
75
|
+
*
|
|
76
|
+
* @param value - Domain value to map.
|
|
77
|
+
* @param minimumValue - Lower bound of the domain range.
|
|
78
|
+
* @param maximumValue - Upper bound of the domain range.
|
|
79
|
+
* @param mapValueToTrackPercent - Optional custom mapper.
|
|
80
|
+
* @returns Track percent for the domain value.
|
|
81
|
+
*/
|
|
82
|
+
export function resolveValueToTrackPercent(value, minimumValue, maximumValue, mapValueToTrackPercent) {
|
|
83
|
+
'worklet';
|
|
84
|
+
if (mapValueToTrackPercent) {
|
|
85
|
+
return mapValueToTrackPercent(value);
|
|
86
|
+
}
|
|
87
|
+
return defaultMapValueToTrackPercent(value, minimumValue, maximumValue);
|
|
88
|
+
}
|
|
89
|
+
// --- Track-percent ↔ pixel position (worklet) ---
|
|
90
|
+
export function trackPercentToPosition(trackPercent, width) {
|
|
91
|
+
'worklet';
|
|
92
|
+
if (width === 0) {
|
|
93
|
+
return 0;
|
|
94
|
+
}
|
|
95
|
+
return (clampTrackPercent(trackPercent) / 100) * width;
|
|
96
|
+
}
|
|
97
|
+
export function positionToTrackPercent(position, width) {
|
|
98
|
+
'worklet';
|
|
99
|
+
if (width === 0) {
|
|
100
|
+
return 0;
|
|
101
|
+
}
|
|
102
|
+
return clampTrackPercent((position / width) * 100);
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Clamps a touch X coordinate to the track bounds.
|
|
106
|
+
*
|
|
107
|
+
* @param position - Touch X in track coordinates.
|
|
108
|
+
* @param width - Track width in pixels.
|
|
109
|
+
* @returns Clamped pixel position.
|
|
110
|
+
*/
|
|
111
|
+
export function clampGesturePosition(position, width) {
|
|
112
|
+
'worklet';
|
|
113
|
+
return Math.max(0, Math.min(position, width));
|
|
114
|
+
}
|
|
115
|
+
// --- JS-thread domain ↔ track-percent ---
|
|
116
|
+
/**
|
|
117
|
+
* JS-thread entry for mapping domain value → track percent.
|
|
118
|
+
* Used by Slider (labels, a11y) and useSliderGesture (prop/layout sync).
|
|
119
|
+
*
|
|
120
|
+
* @param value - Domain value to map.
|
|
121
|
+
* @param minimumValue - Lower bound of the domain range.
|
|
122
|
+
* @param maximumValue - Upper bound of the domain range.
|
|
123
|
+
* @param mapValueToTrackPercent - Optional custom mapper.
|
|
124
|
+
* @returns Track percent for the domain value.
|
|
125
|
+
*/
|
|
126
|
+
export function getTrackPercentFromValue(value, minimumValue, maximumValue, mapValueToTrackPercent) {
|
|
127
|
+
if (mapValueToTrackPercent) {
|
|
128
|
+
return mapValueToTrackPercent(value);
|
|
129
|
+
}
|
|
130
|
+
return defaultMapValueToTrackPercent(value, minimumValue, maximumValue);
|
|
131
|
+
}
|
|
132
|
+
// --- Range label / dot defaults (Slider.tsx) ---
|
|
133
|
+
/**
|
|
134
|
+
* Default `stepToValue`: linear track-percent → domain value.
|
|
135
|
+
*
|
|
136
|
+
* @param step - Track-percent step from `rangeLabelSteps`.
|
|
137
|
+
* @param minimumValue - Lower bound of the domain range.
|
|
138
|
+
* @param maximumValue - Upper bound of the domain range.
|
|
139
|
+
* @returns Domain value for the step.
|
|
140
|
+
*/
|
|
141
|
+
export function defaultStepToValue(step, minimumValue, maximumValue) {
|
|
142
|
+
return (step / 100) * (maximumValue - minimumValue) + minimumValue;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Default `formatStepLabel`: display track percent as a percent string.
|
|
146
|
+
*
|
|
147
|
+
* @param step - Track-percent step from `rangeLabelSteps`.
|
|
148
|
+
* @returns Formatted label string.
|
|
149
|
+
*/
|
|
150
|
+
export function defaultFormatStepLabel(step) {
|
|
151
|
+
return `${step}%`;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Marker `left` percent for range dots and labels; edge steps inset to stay on track.
|
|
155
|
+
*
|
|
156
|
+
* @param step - Track-percent step from `rangeLabelSteps`.
|
|
157
|
+
* @returns CSS `left` percentage string.
|
|
158
|
+
*/
|
|
159
|
+
export function getDotLeftPercent(step) {
|
|
160
|
+
if (step === 0) {
|
|
161
|
+
return DOT_EDGE_INSET_PERCENT;
|
|
162
|
+
}
|
|
163
|
+
if (step === 100) {
|
|
164
|
+
return DOT_EDGE_MAX_PERCENT;
|
|
165
|
+
}
|
|
166
|
+
return `${step}%`;
|
|
167
|
+
}
|
|
168
|
+
// --- Accessibility (Slider.tsx) ---
|
|
169
|
+
/**
|
|
170
|
+
* Clamps and steps a domain value for increment/decrement actions.
|
|
171
|
+
*
|
|
172
|
+
* @param value - Domain value to clamp.
|
|
173
|
+
* @param minimumValue - Lower bound of the domain range.
|
|
174
|
+
* @param maximumValue - Upper bound of the domain range.
|
|
175
|
+
* @param step - Step increment for rounding.
|
|
176
|
+
* @returns Clamped and stepped domain value.
|
|
177
|
+
*/
|
|
178
|
+
export function clampValueToRange(value, minimumValue, maximumValue, step) {
|
|
179
|
+
const range = maximumValue - minimumValue;
|
|
180
|
+
if (range === 0) {
|
|
181
|
+
return minimumValue;
|
|
182
|
+
}
|
|
183
|
+
const clamped = Math.max(minimumValue, Math.min(maximumValue, value));
|
|
184
|
+
return Math.round(clamped / step) * step;
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=Slider.utilities.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Slider.utilities.mjs","sourceRoot":"","sources":["../../../src/components/Slider/Slider.utilities.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Pure helpers for Slider coordinate conversion and UI defaults.\n *\n * Three coordinate systems:\n * - **Domain value** — the controlled `value` prop (`minimumValue`…`maximumValue`).\n * - **Track percent** — normalized 0–100 position along the track (used for dots,\n * labels, and `tickThresholds`; may be non-linear via `map*` hooks).\n * - **Pixel position** — thumb/fill offset in layout pixels (`translateX`).\n *\n * Functions marked with `'worklet'` run on the UI thread inside gesture handlers.\n * JS-thread callers use the non-worklet wrappers (`getTrackPercentFromValue`, etc.).\n */\n\nimport {\n DOT_EDGE_INSET_PERCENT,\n DOT_EDGE_MAX_PERCENT,\n} from './Slider.constants';\n\n// --- Track-percent primitives (worklet) ---\n\nexport function clampTrackPercent(trackPercent: number): number {\n 'worklet';\n\n return Math.max(0, Math.min(100, trackPercent));\n}\n\n// --- Domain ↔ track-percent mappers (worklet) ---\n\n/**\n * Linear default: domain value → 0–100 track position.\n *\n * @param value - Domain value to map.\n * @param minimumValue - Lower bound of the domain range.\n * @param maximumValue - Upper bound of the domain range.\n * @returns Track percent clamped to 0–100.\n */\nexport function defaultMapValueToTrackPercent(\n value: number,\n minimumValue: number,\n maximumValue: number,\n): number {\n 'worklet';\n\n const range = maximumValue - minimumValue;\n if (range === 0) {\n return 0;\n }\n\n const percent = ((value - minimumValue) / range) * 100;\n return clampTrackPercent(percent);\n}\n\n/**\n * Linear default: track position → stepped domain value.\n *\n * @param trackPercent - Track position from 0–100.\n * @param minimumValue - Lower bound of the domain range.\n * @param maximumValue - Upper bound of the domain range.\n * @param step - Step increment for rounding.\n * @returns Stepped domain value clamped to the range.\n */\nexport function defaultMapTrackPercentToValue(\n trackPercent: number,\n minimumValue: number,\n maximumValue: number,\n step: number,\n): number {\n 'worklet';\n\n const range = maximumValue - minimumValue;\n if (range === 0) {\n return minimumValue;\n }\n\n const rawValue =\n (clampTrackPercent(trackPercent) / 100) * range + minimumValue;\n const stepped = Math.round(rawValue / step) * step;\n return Math.max(minimumValue, Math.min(maximumValue, stepped));\n}\n\n/**\n * UI-thread entry: custom `mapTrackPercentToValue` or linear default.\n *\n * @param trackPercent - Track position from 0–100.\n * @param minimumValue - Lower bound of the domain range.\n * @param maximumValue - Upper bound of the domain range.\n * @param step - Step increment for the default mapper.\n * @param mapTrackPercentToValue - Optional custom mapper.\n * @returns Domain value for the track position.\n */\nexport function resolveTrackPercentToValue(\n trackPercent: number,\n minimumValue: number,\n maximumValue: number,\n step: number,\n mapTrackPercentToValue?: (trackPercent: number) => number,\n): number {\n 'worklet';\n\n if (mapTrackPercentToValue) {\n return mapTrackPercentToValue(trackPercent);\n }\n\n return defaultMapTrackPercentToValue(\n trackPercent,\n minimumValue,\n maximumValue,\n step,\n );\n}\n\n/**\n * UI-thread entry: custom `mapValueToTrackPercent` or linear default.\n *\n * @param value - Domain value to map.\n * @param minimumValue - Lower bound of the domain range.\n * @param maximumValue - Upper bound of the domain range.\n * @param mapValueToTrackPercent - Optional custom mapper.\n * @returns Track percent for the domain value.\n */\nexport function resolveValueToTrackPercent(\n value: number,\n minimumValue: number,\n maximumValue: number,\n mapValueToTrackPercent?: (value: number) => number,\n): number {\n 'worklet';\n\n if (mapValueToTrackPercent) {\n return mapValueToTrackPercent(value);\n }\n\n return defaultMapValueToTrackPercent(value, minimumValue, maximumValue);\n}\n\n// --- Track-percent ↔ pixel position (worklet) ---\n\nexport function trackPercentToPosition(\n trackPercent: number,\n width: number,\n): number {\n 'worklet';\n\n if (width === 0) {\n return 0;\n }\n\n return (clampTrackPercent(trackPercent) / 100) * width;\n}\n\nexport function positionToTrackPercent(\n position: number,\n width: number,\n): number {\n 'worklet';\n\n if (width === 0) {\n return 0;\n }\n\n return clampTrackPercent((position / width) * 100);\n}\n\n/**\n * Clamps a touch X coordinate to the track bounds.\n *\n * @param position - Touch X in track coordinates.\n * @param width - Track width in pixels.\n * @returns Clamped pixel position.\n */\nexport function clampGesturePosition(position: number, width: number): number {\n 'worklet';\n\n return Math.max(0, Math.min(position, width));\n}\n\n// --- JS-thread domain ↔ track-percent ---\n\n/**\n * JS-thread entry for mapping domain value → track percent.\n * Used by Slider (labels, a11y) and useSliderGesture (prop/layout sync).\n *\n * @param value - Domain value to map.\n * @param minimumValue - Lower bound of the domain range.\n * @param maximumValue - Upper bound of the domain range.\n * @param mapValueToTrackPercent - Optional custom mapper.\n * @returns Track percent for the domain value.\n */\nexport function getTrackPercentFromValue(\n value: number,\n minimumValue: number,\n maximumValue: number,\n mapValueToTrackPercent?: (value: number) => number,\n): number {\n if (mapValueToTrackPercent) {\n return mapValueToTrackPercent(value);\n }\n\n return defaultMapValueToTrackPercent(value, minimumValue, maximumValue);\n}\n\n// --- Range label / dot defaults (Slider.tsx) ---\n\n/**\n * Default `stepToValue`: linear track-percent → domain value.\n *\n * @param step - Track-percent step from `rangeLabelSteps`.\n * @param minimumValue - Lower bound of the domain range.\n * @param maximumValue - Upper bound of the domain range.\n * @returns Domain value for the step.\n */\nexport function defaultStepToValue(\n step: number,\n minimumValue: number,\n maximumValue: number,\n): number {\n return (step / 100) * (maximumValue - minimumValue) + minimumValue;\n}\n\n/**\n * Default `formatStepLabel`: display track percent as a percent string.\n *\n * @param step - Track-percent step from `rangeLabelSteps`.\n * @returns Formatted label string.\n */\nexport function defaultFormatStepLabel(step: number): string {\n return `${step}%`;\n}\n\n/**\n * Marker `left` percent for range dots and labels; edge steps inset to stay on track.\n *\n * @param step - Track-percent step from `rangeLabelSteps`.\n * @returns CSS `left` percentage string.\n */\nexport function getDotLeftPercent(step: number): string {\n if (step === 0) {\n return DOT_EDGE_INSET_PERCENT;\n }\n if (step === 100) {\n return DOT_EDGE_MAX_PERCENT;\n }\n\n return `${step}%`;\n}\n\n// --- Accessibility (Slider.tsx) ---\n\n/**\n * Clamps and steps a domain value for increment/decrement actions.\n *\n * @param value - Domain value to clamp.\n * @param minimumValue - Lower bound of the domain range.\n * @param maximumValue - Upper bound of the domain range.\n * @param step - Step increment for rounding.\n * @returns Clamped and stepped domain value.\n */\nexport function clampValueToRange(\n value: number,\n minimumValue: number,\n maximumValue: number,\n step: number,\n): number {\n const range = maximumValue - minimumValue;\n if (range === 0) {\n return minimumValue;\n }\n\n const clamped = Math.max(minimumValue, Math.min(maximumValue, value));\n return Math.round(clamped / step) * step;\n}\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DEFAULT_TICK_THRESHOLDS = exports.DEFAULT_RANGE_LABEL_STEPS = exports.Slider = void 0;
|
|
4
|
+
var Slider_1 = require("./Slider.cjs");
|
|
5
|
+
Object.defineProperty(exports, "Slider", { enumerable: true, get: function () { return Slider_1.Slider; } });
|
|
6
|
+
var Slider_constants_1 = require("./Slider.constants.cjs");
|
|
7
|
+
Object.defineProperty(exports, "DEFAULT_RANGE_LABEL_STEPS", { enumerable: true, get: function () { return Slider_constants_1.DEFAULT_RANGE_LABEL_STEPS; } });
|
|
8
|
+
Object.defineProperty(exports, "DEFAULT_TICK_THRESHOLDS", { enumerable: true, get: function () { return Slider_constants_1.DEFAULT_TICK_THRESHOLDS; } });
|
|
9
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","sourceRoot":"","sources":["../../../src/components/Slider/index.ts"],"names":[],"mappings":";;;AAAA,uCAAkC;AAAzB,gGAAA,MAAM,OAAA;AAEf,2DAG4B;AAF1B,6HAAA,yBAAyB,OAAA;AACzB,2HAAA,uBAAuB,OAAA","sourcesContent":["export { Slider } from './Slider';\nexport type { SliderProps } from './Slider.types';\nexport {\n DEFAULT_RANGE_LABEL_STEPS,\n DEFAULT_TICK_THRESHOLDS,\n} from './Slider.constants';\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../../../src/components/Slider/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,qBAAiB;AAClC,YAAY,EAAE,WAAW,EAAE,2BAAuB;AAClD,OAAO,EACL,yBAAyB,EACzB,uBAAuB,GACxB,+BAA2B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../../../src/components/Slider/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,qBAAiB;AAClC,YAAY,EAAE,WAAW,EAAE,2BAAuB;AAClD,OAAO,EACL,yBAAyB,EACzB,uBAAuB,GACxB,+BAA2B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sourceRoot":"","sources":["../../../src/components/Slider/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,qBAAiB;AAElC,OAAO,EACL,yBAAyB,EACzB,uBAAuB,EACxB,+BAA2B","sourcesContent":["export { Slider } from './Slider';\nexport type { SliderProps } from './Slider.types';\nexport {\n DEFAULT_RANGE_LABEL_STEPS,\n DEFAULT_TICK_THRESHOLDS,\n} from './Slider.constants';\n"]}
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.useSliderGesture = void 0;
|
|
4
|
+
const react_1 = require("react");
|
|
5
|
+
const react_native_gesture_handler_1 = require("react-native-gesture-handler");
|
|
6
|
+
const react_native_reanimated_1 = require("react-native-reanimated");
|
|
7
|
+
const Slider_constants_1 = require("./Slider.constants.cjs");
|
|
8
|
+
const Slider_utilities_1 = require("./Slider.utilities.cjs");
|
|
9
|
+
/**
|
|
10
|
+
* Owns Slider gesture handling, animated thumb/fill position, and range-label taps.
|
|
11
|
+
*
|
|
12
|
+
* Flow during drag (UI thread):
|
|
13
|
+
* touch X → clamp to track width → trackPercent → domain value → callbacks
|
|
14
|
+
*
|
|
15
|
+
* Flow when `value` prop changes (JS thread):
|
|
16
|
+
* domain value → trackPercent → translateX (thumb + progress fill)
|
|
17
|
+
*
|
|
18
|
+
* `mapValueToTrackPercent` / `mapTrackPercentToValue` must be worklets when provided.
|
|
19
|
+
*
|
|
20
|
+
* @param params - Gesture configuration and callbacks.
|
|
21
|
+
* @returns Gesture state and handlers for Slider.
|
|
22
|
+
*/
|
|
23
|
+
function useSliderGesture(params) {
|
|
24
|
+
const { value, minimumValue = 0, maximumValue = 100, step = 1, isDisabled = false, onValueChange, onDragEnd, onGrip, onTick, tickThresholds = Slider_constants_1.DEFAULT_TICK_THRESHOLDS, mapValueToTrackPercent, mapTrackPercentToValue, stepToValue: stepToValueProp, } = params;
|
|
25
|
+
const stepToValue = (0, react_1.useMemo)(() => stepToValueProp ??
|
|
26
|
+
((rangeStep) => (0, Slider_utilities_1.defaultStepToValue)(rangeStep, minimumValue, maximumValue)), [maximumValue, minimumValue, stepToValueProp]);
|
|
27
|
+
// --- Animated state ---
|
|
28
|
+
const sliderWidth = (0, react_native_reanimated_1.useSharedValue)(0);
|
|
29
|
+
const translateX = (0, react_native_reanimated_1.useSharedValue)(0);
|
|
30
|
+
const thumbScale = (0, react_native_reanimated_1.useSharedValue)(1);
|
|
31
|
+
const previousTrackPercentRef = (0, react_1.useRef)((0, Slider_utilities_1.getTrackPercentFromValue)(value, minimumValue, maximumValue, mapValueToTrackPercent));
|
|
32
|
+
const isDraggingRef = (0, react_1.useRef)(false);
|
|
33
|
+
// --- Position sync (domain value → thumb pixels) ---
|
|
34
|
+
const syncPositionFromValue = (0, react_1.useCallback)((nextValue, width = sliderWidth.value) => {
|
|
35
|
+
const trackPercent = (0, Slider_utilities_1.getTrackPercentFromValue)(nextValue, minimumValue, maximumValue, mapValueToTrackPercent);
|
|
36
|
+
translateX.value = (0, Slider_utilities_1.trackPercentToPosition)(trackPercent, width);
|
|
37
|
+
}, [
|
|
38
|
+
mapValueToTrackPercent,
|
|
39
|
+
maximumValue,
|
|
40
|
+
minimumValue,
|
|
41
|
+
sliderWidth,
|
|
42
|
+
translateX,
|
|
43
|
+
]);
|
|
44
|
+
const handleLayout = (0, react_1.useCallback)((event) => {
|
|
45
|
+
const { width } = event.nativeEvent.layout;
|
|
46
|
+
sliderWidth.value = width;
|
|
47
|
+
syncPositionFromValue(value, width);
|
|
48
|
+
}, [sliderWidth, syncPositionFromValue, value]);
|
|
49
|
+
(0, react_1.useEffect)(() => {
|
|
50
|
+
syncPositionFromValue(value);
|
|
51
|
+
if (!isDraggingRef.current) {
|
|
52
|
+
previousTrackPercentRef.current = (0, Slider_utilities_1.getTrackPercentFromValue)(value, minimumValue, maximumValue, mapValueToTrackPercent);
|
|
53
|
+
}
|
|
54
|
+
}, [
|
|
55
|
+
mapValueToTrackPercent,
|
|
56
|
+
maximumValue,
|
|
57
|
+
minimumValue,
|
|
58
|
+
syncPositionFromValue,
|
|
59
|
+
value,
|
|
60
|
+
]);
|
|
61
|
+
// --- JS-thread bridges (stable refs for runOnJS from worklets) ---
|
|
62
|
+
const emitValueChange = (0, react_1.useCallback)((nextValue) => {
|
|
63
|
+
onValueChange(nextValue);
|
|
64
|
+
}, [onValueChange]);
|
|
65
|
+
const emitDragEnd = (0, react_1.useCallback)((nextValue) => {
|
|
66
|
+
onDragEnd?.(nextValue);
|
|
67
|
+
}, [onDragEnd]);
|
|
68
|
+
const triggerGrip = (0, react_1.useCallback)(() => {
|
|
69
|
+
if (!isDisabled) {
|
|
70
|
+
onGrip?.();
|
|
71
|
+
}
|
|
72
|
+
}, [isDisabled, onGrip]);
|
|
73
|
+
const setDragging = (0, react_1.useCallback)((dragging) => {
|
|
74
|
+
isDraggingRef.current = dragging;
|
|
75
|
+
}, []);
|
|
76
|
+
const checkThresholdCrossing = (0, react_1.useCallback)((newTrackPercent) => {
|
|
77
|
+
const prevTrackPercent = previousTrackPercentRef.current;
|
|
78
|
+
for (const threshold of tickThresholds) {
|
|
79
|
+
if ((prevTrackPercent < threshold && newTrackPercent >= threshold) ||
|
|
80
|
+
(prevTrackPercent > threshold && newTrackPercent <= threshold)) {
|
|
81
|
+
onTick?.();
|
|
82
|
+
break;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
previousTrackPercentRef.current = newTrackPercent;
|
|
86
|
+
}, [onTick, tickThresholds]);
|
|
87
|
+
// --- Animated styles (thumb + fill width follow translateX) ---
|
|
88
|
+
const progressStyle = (0, react_native_reanimated_1.useAnimatedStyle)(() => ({
|
|
89
|
+
width: translateX.value,
|
|
90
|
+
}));
|
|
91
|
+
const thumbStyle = (0, react_native_reanimated_1.useAnimatedStyle)(() => ({
|
|
92
|
+
transform: [{ translateX: translateX.value }, { scale: thumbScale.value }],
|
|
93
|
+
}));
|
|
94
|
+
// --- Pan + tap gestures ---
|
|
95
|
+
const gesture = (0, react_1.useMemo)(() => {
|
|
96
|
+
// Gesture callbacks need explicit 'worklet' directives because this package
|
|
97
|
+
// ships pre-built dist compiled by ts-bridge. The consumer's Reanimated Babel
|
|
98
|
+
// plugin does not auto-detect the compiled namespaced Gesture form.
|
|
99
|
+
const gripEasing = react_native_reanimated_1.Easing.bezier(0.3, 0.8, 0.3, 1);
|
|
100
|
+
const positionToDomainValue = (position) => {
|
|
101
|
+
'worklet';
|
|
102
|
+
const trackPercent = (0, Slider_utilities_1.positionToTrackPercent)(position, sliderWidth.value);
|
|
103
|
+
const domainValue = (0, Slider_utilities_1.resolveTrackPercentToValue)(trackPercent, minimumValue, maximumValue, step, mapTrackPercentToValue);
|
|
104
|
+
return { trackPercent, domainValue };
|
|
105
|
+
};
|
|
106
|
+
const snapThumbToValue = (domainValue) => {
|
|
107
|
+
'worklet';
|
|
108
|
+
const snappedTrackPercent = (0, Slider_utilities_1.resolveValueToTrackPercent)(domainValue, minimumValue, maximumValue, mapValueToTrackPercent);
|
|
109
|
+
translateX.value = (0, Slider_utilities_1.trackPercentToPosition)(snappedTrackPercent, sliderWidth.value);
|
|
110
|
+
};
|
|
111
|
+
// Finalize a gesture: emit callbacks, then re-sync thumb to stepped value.
|
|
112
|
+
const commitAtPosition = (position, options) => {
|
|
113
|
+
'worklet';
|
|
114
|
+
translateX.value = position;
|
|
115
|
+
const { trackPercent, domainValue } = positionToDomainValue(position);
|
|
116
|
+
(0, react_native_reanimated_1.runOnJS)(emitValueChange)(domainValue);
|
|
117
|
+
if (options.checkThreshold) {
|
|
118
|
+
(0, react_native_reanimated_1.runOnJS)(checkThresholdCrossing)(trackPercent);
|
|
119
|
+
}
|
|
120
|
+
(0, react_native_reanimated_1.runOnJS)(emitDragEnd)(domainValue);
|
|
121
|
+
if (options.triggerGrip) {
|
|
122
|
+
(0, react_native_reanimated_1.runOnJS)(triggerGrip)();
|
|
123
|
+
}
|
|
124
|
+
snapThumbToValue(domainValue);
|
|
125
|
+
};
|
|
126
|
+
const panGesture = react_native_gesture_handler_1.Gesture.Pan()
|
|
127
|
+
.enabled(!isDisabled)
|
|
128
|
+
.onStart(() => {
|
|
129
|
+
'worklet';
|
|
130
|
+
thumbScale.value = (0, react_native_reanimated_1.withTiming)(Slider_constants_1.THUMB_GRIP_SCALE, {
|
|
131
|
+
duration: Slider_constants_1.THUMB_GRIP_ANIMATION_DURATION,
|
|
132
|
+
easing: gripEasing,
|
|
133
|
+
});
|
|
134
|
+
(0, react_native_reanimated_1.runOnJS)(setDragging)(true);
|
|
135
|
+
(0, react_native_reanimated_1.runOnJS)(triggerGrip)();
|
|
136
|
+
})
|
|
137
|
+
.onUpdate((event) => {
|
|
138
|
+
'worklet';
|
|
139
|
+
const position = (0, Slider_utilities_1.clampGesturePosition)(event.x, sliderWidth.value);
|
|
140
|
+
translateX.value = position;
|
|
141
|
+
const { trackPercent, domainValue } = positionToDomainValue(position);
|
|
142
|
+
(0, react_native_reanimated_1.runOnJS)(emitValueChange)(domainValue);
|
|
143
|
+
(0, react_native_reanimated_1.runOnJS)(checkThresholdCrossing)(trackPercent);
|
|
144
|
+
})
|
|
145
|
+
.onEnd(() => {
|
|
146
|
+
'worklet';
|
|
147
|
+
// Thresholds already checked during onUpdate; grip fires again on release.
|
|
148
|
+
commitAtPosition(translateX.value, {
|
|
149
|
+
checkThreshold: false,
|
|
150
|
+
triggerGrip: true,
|
|
151
|
+
});
|
|
152
|
+
})
|
|
153
|
+
.onFinalize(() => {
|
|
154
|
+
'worklet';
|
|
155
|
+
thumbScale.value = (0, react_native_reanimated_1.withTiming)(1, {
|
|
156
|
+
duration: Slider_constants_1.THUMB_GRIP_ANIMATION_DURATION,
|
|
157
|
+
easing: gripEasing,
|
|
158
|
+
});
|
|
159
|
+
(0, react_native_reanimated_1.runOnJS)(setDragging)(false);
|
|
160
|
+
});
|
|
161
|
+
const tapGesture = react_native_gesture_handler_1.Gesture.Tap()
|
|
162
|
+
.enabled(!isDisabled)
|
|
163
|
+
.onEnd((event) => {
|
|
164
|
+
'worklet';
|
|
165
|
+
const position = (0, Slider_utilities_1.clampGesturePosition)(event.x, sliderWidth.value);
|
|
166
|
+
commitAtPosition(position, {
|
|
167
|
+
checkThreshold: true,
|
|
168
|
+
triggerGrip: false,
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
return react_native_gesture_handler_1.Gesture.Simultaneous(tapGesture, panGesture);
|
|
172
|
+
}, [
|
|
173
|
+
checkThresholdCrossing,
|
|
174
|
+
emitDragEnd,
|
|
175
|
+
emitValueChange,
|
|
176
|
+
isDisabled,
|
|
177
|
+
mapTrackPercentToValue,
|
|
178
|
+
mapValueToTrackPercent,
|
|
179
|
+
maximumValue,
|
|
180
|
+
minimumValue,
|
|
181
|
+
setDragging,
|
|
182
|
+
sliderWidth,
|
|
183
|
+
step,
|
|
184
|
+
thumbScale,
|
|
185
|
+
translateX,
|
|
186
|
+
triggerGrip,
|
|
187
|
+
]);
|
|
188
|
+
// --- Range label tap (JS thread; uses stepToValue from Slider.tsx) ---
|
|
189
|
+
const handlePressStep = (0, react_1.useCallback)((rangeStep) => {
|
|
190
|
+
if (isDisabled) {
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
const newValue = stepToValue(rangeStep);
|
|
194
|
+
onValueChange(newValue);
|
|
195
|
+
const trackPercent = (0, Slider_utilities_1.getTrackPercentFromValue)(newValue, minimumValue, maximumValue, mapValueToTrackPercent);
|
|
196
|
+
checkThresholdCrossing(trackPercent);
|
|
197
|
+
onDragEnd?.(newValue);
|
|
198
|
+
syncPositionFromValue(newValue);
|
|
199
|
+
}, [
|
|
200
|
+
checkThresholdCrossing,
|
|
201
|
+
isDisabled,
|
|
202
|
+
mapValueToTrackPercent,
|
|
203
|
+
maximumValue,
|
|
204
|
+
minimumValue,
|
|
205
|
+
onDragEnd,
|
|
206
|
+
onValueChange,
|
|
207
|
+
stepToValue,
|
|
208
|
+
syncPositionFromValue,
|
|
209
|
+
]);
|
|
210
|
+
return {
|
|
211
|
+
handleLayout,
|
|
212
|
+
progressStyle,
|
|
213
|
+
thumbStyle,
|
|
214
|
+
gesture,
|
|
215
|
+
handlePressStep,
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
exports.useSliderGesture = useSliderGesture;
|
|
219
|
+
//# sourceMappingURL=useSliderGesture.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSliderGesture.cjs","sourceRoot":"","sources":["../../../src/components/Slider/useSliderGesture.ts"],"names":[],"mappings":"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","sourcesContent":["import { useCallback, useEffect, useMemo, useRef } from 'react';\nimport { Gesture } from 'react-native-gesture-handler';\nimport {\n Easing,\n runOnJS,\n useAnimatedStyle,\n useSharedValue,\n withTiming,\n} from 'react-native-reanimated';\n\nimport {\n DEFAULT_TICK_THRESHOLDS,\n THUMB_GRIP_ANIMATION_DURATION,\n THUMB_GRIP_SCALE,\n} from './Slider.constants';\nimport type {\n UseSliderGestureParams,\n UseSliderGestureResult,\n} from './Slider.types';\nimport {\n clampGesturePosition,\n defaultStepToValue,\n getTrackPercentFromValue,\n positionToTrackPercent,\n resolveTrackPercentToValue,\n resolveValueToTrackPercent,\n trackPercentToPosition,\n} from './Slider.utilities';\n\n/**\n * Owns Slider gesture handling, animated thumb/fill position, and range-label taps.\n *\n * Flow during drag (UI thread):\n * touch X → clamp to track width → trackPercent → domain value → callbacks\n *\n * Flow when `value` prop changes (JS thread):\n * domain value → trackPercent → translateX (thumb + progress fill)\n *\n * `mapValueToTrackPercent` / `mapTrackPercentToValue` must be worklets when provided.\n *\n * @param params - Gesture configuration and callbacks.\n * @returns Gesture state and handlers for Slider.\n */\nexport function useSliderGesture(\n params: UseSliderGestureParams,\n): UseSliderGestureResult {\n const {\n value,\n minimumValue = 0,\n maximumValue = 100,\n step = 1,\n isDisabled = false,\n onValueChange,\n onDragEnd,\n onGrip,\n onTick,\n tickThresholds = DEFAULT_TICK_THRESHOLDS,\n mapValueToTrackPercent,\n mapTrackPercentToValue,\n stepToValue: stepToValueProp,\n } = params;\n const stepToValue = useMemo(\n () =>\n stepToValueProp ??\n ((rangeStep: number) =>\n defaultStepToValue(rangeStep, minimumValue, maximumValue)),\n [maximumValue, minimumValue, stepToValueProp],\n );\n\n // --- Animated state ---\n\n const sliderWidth = useSharedValue(0);\n const translateX = useSharedValue(0);\n const thumbScale = useSharedValue(1);\n const previousTrackPercentRef = useRef(\n getTrackPercentFromValue(\n value,\n minimumValue,\n maximumValue,\n mapValueToTrackPercent,\n ),\n );\n const isDraggingRef = useRef(false);\n\n // --- Position sync (domain value → thumb pixels) ---\n\n const syncPositionFromValue = useCallback(\n (nextValue: number, width = sliderWidth.value) => {\n const trackPercent = getTrackPercentFromValue(\n nextValue,\n minimumValue,\n maximumValue,\n mapValueToTrackPercent,\n );\n translateX.value = trackPercentToPosition(trackPercent, width);\n },\n [\n mapValueToTrackPercent,\n maximumValue,\n minimumValue,\n sliderWidth,\n translateX,\n ],\n );\n\n const handleLayout = useCallback(\n (event: { nativeEvent: { layout: { width: number } } }) => {\n const { width } = event.nativeEvent.layout;\n sliderWidth.value = width;\n syncPositionFromValue(value, width);\n },\n [sliderWidth, syncPositionFromValue, value],\n );\n\n useEffect(() => {\n syncPositionFromValue(value);\n if (!isDraggingRef.current) {\n previousTrackPercentRef.current = getTrackPercentFromValue(\n value,\n minimumValue,\n maximumValue,\n mapValueToTrackPercent,\n );\n }\n }, [\n mapValueToTrackPercent,\n maximumValue,\n minimumValue,\n syncPositionFromValue,\n value,\n ]);\n\n // --- JS-thread bridges (stable refs for runOnJS from worklets) ---\n\n const emitValueChange = useCallback(\n (nextValue: number) => {\n onValueChange(nextValue);\n },\n [onValueChange],\n );\n\n const emitDragEnd = useCallback(\n (nextValue: number) => {\n onDragEnd?.(nextValue);\n },\n [onDragEnd],\n );\n\n const triggerGrip = useCallback(() => {\n if (!isDisabled) {\n onGrip?.();\n }\n }, [isDisabled, onGrip]);\n\n const setDragging = useCallback((dragging: boolean) => {\n isDraggingRef.current = dragging;\n }, []);\n\n const checkThresholdCrossing = useCallback(\n (newTrackPercent: number) => {\n const prevTrackPercent = previousTrackPercentRef.current;\n\n for (const threshold of tickThresholds) {\n if (\n (prevTrackPercent < threshold && newTrackPercent >= threshold) ||\n (prevTrackPercent > threshold && newTrackPercent <= threshold)\n ) {\n onTick?.();\n break;\n }\n }\n\n previousTrackPercentRef.current = newTrackPercent;\n },\n [onTick, tickThresholds],\n );\n\n // --- Animated styles (thumb + fill width follow translateX) ---\n\n const progressStyle = useAnimatedStyle(() => ({\n width: translateX.value,\n }));\n\n const thumbStyle = useAnimatedStyle(() => ({\n transform: [{ translateX: translateX.value }, { scale: thumbScale.value }],\n }));\n\n // --- Pan + tap gestures ---\n\n const gesture = useMemo(() => {\n // Gesture callbacks need explicit 'worklet' directives because this package\n // ships pre-built dist compiled by ts-bridge. The consumer's Reanimated Babel\n // plugin does not auto-detect the compiled namespaced Gesture form.\n\n const gripEasing = Easing.bezier(0.3, 0.8, 0.3, 1);\n\n const positionToDomainValue = (position: number) => {\n 'worklet';\n\n const trackPercent = positionToTrackPercent(position, sliderWidth.value);\n const domainValue = resolveTrackPercentToValue(\n trackPercent,\n minimumValue,\n maximumValue,\n step,\n mapTrackPercentToValue,\n );\n\n return { trackPercent, domainValue };\n };\n\n const snapThumbToValue = (domainValue: number) => {\n 'worklet';\n\n const snappedTrackPercent = resolveValueToTrackPercent(\n domainValue,\n minimumValue,\n maximumValue,\n mapValueToTrackPercent,\n );\n translateX.value = trackPercentToPosition(\n snappedTrackPercent,\n sliderWidth.value,\n );\n };\n\n // Finalize a gesture: emit callbacks, then re-sync thumb to stepped value.\n const commitAtPosition = (\n position: number,\n options: { checkThreshold: boolean; triggerGrip: boolean },\n ) => {\n 'worklet';\n\n translateX.value = position;\n const { trackPercent, domainValue } = positionToDomainValue(position);\n\n runOnJS(emitValueChange)(domainValue);\n if (options.checkThreshold) {\n runOnJS(checkThresholdCrossing)(trackPercent);\n }\n runOnJS(emitDragEnd)(domainValue);\n if (options.triggerGrip) {\n runOnJS(triggerGrip)();\n }\n snapThumbToValue(domainValue);\n };\n\n const panGesture = Gesture.Pan()\n .enabled(!isDisabled)\n .onStart(() => {\n 'worklet';\n\n thumbScale.value = withTiming(THUMB_GRIP_SCALE, {\n duration: THUMB_GRIP_ANIMATION_DURATION,\n easing: gripEasing,\n });\n runOnJS(setDragging)(true);\n runOnJS(triggerGrip)();\n })\n .onUpdate((event) => {\n 'worklet';\n\n const position = clampGesturePosition(event.x, sliderWidth.value);\n translateX.value = position;\n const { trackPercent, domainValue } = positionToDomainValue(position);\n\n runOnJS(emitValueChange)(domainValue);\n runOnJS(checkThresholdCrossing)(trackPercent);\n })\n .onEnd(() => {\n 'worklet';\n\n // Thresholds already checked during onUpdate; grip fires again on release.\n commitAtPosition(translateX.value, {\n checkThreshold: false,\n triggerGrip: true,\n });\n })\n .onFinalize(() => {\n 'worklet';\n\n thumbScale.value = withTiming(1, {\n duration: THUMB_GRIP_ANIMATION_DURATION,\n easing: gripEasing,\n });\n runOnJS(setDragging)(false);\n });\n\n const tapGesture = Gesture.Tap()\n .enabled(!isDisabled)\n .onEnd((event) => {\n 'worklet';\n\n const position = clampGesturePosition(event.x, sliderWidth.value);\n commitAtPosition(position, {\n checkThreshold: true,\n triggerGrip: false,\n });\n });\n\n return Gesture.Simultaneous(tapGesture, panGesture);\n }, [\n checkThresholdCrossing,\n emitDragEnd,\n emitValueChange,\n isDisabled,\n mapTrackPercentToValue,\n mapValueToTrackPercent,\n maximumValue,\n minimumValue,\n setDragging,\n sliderWidth,\n step,\n thumbScale,\n translateX,\n triggerGrip,\n ]);\n\n // --- Range label tap (JS thread; uses stepToValue from Slider.tsx) ---\n\n const handlePressStep = useCallback(\n (rangeStep: number) => {\n if (isDisabled) {\n return;\n }\n\n const newValue = stepToValue(rangeStep);\n onValueChange(newValue);\n const trackPercent = getTrackPercentFromValue(\n newValue,\n minimumValue,\n maximumValue,\n mapValueToTrackPercent,\n );\n checkThresholdCrossing(trackPercent);\n onDragEnd?.(newValue);\n syncPositionFromValue(newValue);\n },\n [\n checkThresholdCrossing,\n isDisabled,\n mapValueToTrackPercent,\n maximumValue,\n minimumValue,\n onDragEnd,\n onValueChange,\n stepToValue,\n syncPositionFromValue,\n ],\n );\n\n return {\n handleLayout,\n progressStyle,\n thumbStyle,\n gesture,\n handlePressStep,\n };\n}\n"]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { UseSliderGestureParams, UseSliderGestureResult } from "./Slider.types.cjs";
|
|
2
|
+
/**
|
|
3
|
+
* Owns Slider gesture handling, animated thumb/fill position, and range-label taps.
|
|
4
|
+
*
|
|
5
|
+
* Flow during drag (UI thread):
|
|
6
|
+
* touch X → clamp to track width → trackPercent → domain value → callbacks
|
|
7
|
+
*
|
|
8
|
+
* Flow when `value` prop changes (JS thread):
|
|
9
|
+
* domain value → trackPercent → translateX (thumb + progress fill)
|
|
10
|
+
*
|
|
11
|
+
* `mapValueToTrackPercent` / `mapTrackPercentToValue` must be worklets when provided.
|
|
12
|
+
*
|
|
13
|
+
* @param params - Gesture configuration and callbacks.
|
|
14
|
+
* @returns Gesture state and handlers for Slider.
|
|
15
|
+
*/
|
|
16
|
+
export declare function useSliderGesture(params: UseSliderGestureParams): UseSliderGestureResult;
|
|
17
|
+
//# sourceMappingURL=useSliderGesture.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSliderGesture.d.cts","sourceRoot":"","sources":["../../../src/components/Slider/useSliderGesture.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EACV,sBAAsB,EACtB,sBAAsB,EACvB,2BAAuB;AAWxB;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,sBAAsB,GAC7B,sBAAsB,CAyTxB"}
|