@metamask/design-system-react-native 0.35.0 → 0.36.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/CHANGELOG.md +20 -1
  2. package/dist/components/BannerBase/BannerBase.cjs +8 -6
  3. package/dist/components/BannerBase/BannerBase.cjs.map +1 -1
  4. package/dist/components/BannerBase/BannerBase.d.cts.map +1 -1
  5. package/dist/components/BannerBase/BannerBase.d.mts.map +1 -1
  6. package/dist/components/BannerBase/BannerBase.mjs +9 -7
  7. package/dist/components/BannerBase/BannerBase.mjs.map +1 -1
  8. package/dist/components/BannerBase/index.cjs +3 -1
  9. package/dist/components/BannerBase/index.cjs.map +1 -1
  10. package/dist/components/BannerBase/index.d.cts +1 -0
  11. package/dist/components/BannerBase/index.d.cts.map +1 -1
  12. package/dist/components/BannerBase/index.d.mts +1 -0
  13. package/dist/components/BannerBase/index.d.mts.map +1 -1
  14. package/dist/components/BannerBase/index.mjs +1 -0
  15. package/dist/components/BannerBase/index.mjs.map +1 -1
  16. package/dist/components/Content/Content.cjs +27 -13
  17. package/dist/components/Content/Content.cjs.map +1 -1
  18. package/dist/components/Content/Content.d.cts.map +1 -1
  19. package/dist/components/Content/Content.d.mts.map +1 -1
  20. package/dist/components/Content/Content.mjs +28 -14
  21. package/dist/components/Content/Content.mjs.map +1 -1
  22. package/dist/components/Content/index.cjs +3 -3
  23. package/dist/components/Content/index.cjs.map +1 -1
  24. package/dist/components/Content/index.d.cts +1 -1
  25. package/dist/components/Content/index.d.cts.map +1 -1
  26. package/dist/components/Content/index.d.mts +1 -1
  27. package/dist/components/Content/index.d.mts.map +1 -1
  28. package/dist/components/Content/index.mjs +1 -1
  29. package/dist/components/Content/index.mjs.map +1 -1
  30. package/dist/components/ListItem/ListItem.cjs +19 -8
  31. package/dist/components/ListItem/ListItem.cjs.map +1 -1
  32. package/dist/components/ListItem/ListItem.d.cts.map +1 -1
  33. package/dist/components/ListItem/ListItem.d.mts.map +1 -1
  34. package/dist/components/ListItem/ListItem.mjs +20 -9
  35. package/dist/components/ListItem/ListItem.mjs.map +1 -1
  36. package/dist/components/ListItem/index.cjs +3 -3
  37. package/dist/components/ListItem/index.cjs.map +1 -1
  38. package/dist/components/ListItem/index.d.cts +1 -1
  39. package/dist/components/ListItem/index.d.cts.map +1 -1
  40. package/dist/components/ListItem/index.d.mts +1 -1
  41. package/dist/components/ListItem/index.d.mts.map +1 -1
  42. package/dist/components/ListItem/index.mjs +1 -1
  43. package/dist/components/ListItem/index.mjs.map +1 -1
  44. package/dist/components/Slider/Slider.cjs +26 -13
  45. package/dist/components/Slider/Slider.cjs.map +1 -1
  46. package/dist/components/Slider/Slider.constants.cjs +8 -3
  47. package/dist/components/Slider/Slider.constants.cjs.map +1 -1
  48. package/dist/components/Slider/Slider.constants.d.cts +2 -2
  49. package/dist/components/Slider/Slider.constants.d.cts.map +1 -1
  50. package/dist/components/Slider/Slider.constants.d.mts +2 -2
  51. package/dist/components/Slider/Slider.constants.d.mts.map +1 -1
  52. package/dist/components/Slider/Slider.constants.mjs +7 -2
  53. package/dist/components/Slider/Slider.constants.mjs.map +1 -1
  54. package/dist/components/Slider/Slider.d.cts +1 -1
  55. package/dist/components/Slider/Slider.d.cts.map +1 -1
  56. package/dist/components/Slider/Slider.d.mts +1 -1
  57. package/dist/components/Slider/Slider.d.mts.map +1 -1
  58. package/dist/components/Slider/Slider.mjs +31 -18
  59. package/dist/components/Slider/Slider.mjs.map +1 -1
  60. package/dist/components/Slider/Slider.types.cjs.map +1 -1
  61. package/dist/components/Slider/Slider.types.d.cts +14 -16
  62. package/dist/components/Slider/Slider.types.d.cts.map +1 -1
  63. package/dist/components/Slider/Slider.types.d.mts +14 -16
  64. package/dist/components/Slider/Slider.types.d.mts.map +1 -1
  65. package/dist/components/Slider/Slider.types.mjs.map +1 -1
  66. package/dist/components/Slider/Slider.utilities.cjs +96 -11
  67. package/dist/components/Slider/Slider.utilities.cjs.map +1 -1
  68. package/dist/components/Slider/Slider.utilities.d.cts +57 -8
  69. package/dist/components/Slider/Slider.utilities.d.cts.map +1 -1
  70. package/dist/components/Slider/Slider.utilities.d.mts +57 -8
  71. package/dist/components/Slider/Slider.utilities.d.mts.map +1 -1
  72. package/dist/components/Slider/Slider.utilities.mjs +89 -9
  73. package/dist/components/Slider/Slider.utilities.mjs.map +1 -1
  74. package/dist/components/Slider/index.cjs +4 -3
  75. package/dist/components/Slider/index.cjs.map +1 -1
  76. package/dist/components/Slider/index.d.cts +3 -1
  77. package/dist/components/Slider/index.d.cts.map +1 -1
  78. package/dist/components/Slider/index.d.mts +3 -1
  79. package/dist/components/Slider/index.d.mts.map +1 -1
  80. package/dist/components/Slider/index.mjs +2 -1
  81. package/dist/components/Slider/index.mjs.map +1 -1
  82. package/dist/components/Slider/useSliderGesture.cjs +55 -22
  83. package/dist/components/Slider/useSliderGesture.cjs.map +1 -1
  84. package/dist/components/Slider/useSliderGesture.d.cts +2 -2
  85. package/dist/components/Slider/useSliderGesture.d.cts.map +1 -1
  86. package/dist/components/Slider/useSliderGesture.d.mts +2 -2
  87. package/dist/components/Slider/useSliderGesture.d.mts.map +1 -1
  88. package/dist/components/Slider/useSliderGesture.mjs +58 -25
  89. package/dist/components/Slider/useSliderGesture.mjs.map +1 -1
  90. package/dist/components/index.cjs +8 -7
  91. package/dist/components/index.cjs.map +1 -1
  92. package/dist/components/index.d.cts +5 -5
  93. package/dist/components/index.d.cts.map +1 -1
  94. package/dist/components/index.d.mts +5 -5
  95. package/dist/components/index.d.mts.map +1 -1
  96. package/dist/components/index.mjs +4 -4
  97. package/dist/components/index.mjs.map +1 -1
  98. package/package.json +4 -4
  99. package/dist/components/Content/Content.constants.cjs +0 -9
  100. package/dist/components/Content/Content.constants.cjs.map +0 -1
  101. package/dist/components/Content/Content.constants.d.cts +0 -3
  102. package/dist/components/Content/Content.constants.d.cts.map +0 -1
  103. package/dist/components/Content/Content.constants.d.mts +0 -3
  104. package/dist/components/Content/Content.constants.d.mts.map +0 -1
  105. package/dist/components/Content/Content.constants.mjs +0 -6
  106. package/dist/components/Content/Content.constants.mjs.map +0 -1
@@ -4,12 +4,17 @@
4
4
  * Three coordinate systems:
5
5
  * - **Domain value** — the controlled `value` prop (`minimumValue`…`maximumValue`).
6
6
  * - **Track percent** — normalized 0–100 position along the track (used for dots,
7
- * labels, and `tickThresholds`; may be non-linear via `map*` hooks).
7
+ * labels, and haptic thresholds; may be non-linear via `map*` hooks).
8
8
  * - **Pixel position** — thumb/fill offset in layout pixels (`translateX`).
9
9
  *
10
10
  * Functions marked with `'worklet'` run on the UI thread inside gesture handlers.
11
11
  * JS-thread callers use the non-worklet wrappers (`getTrackPercentFromValue`, etc.).
12
12
  */
13
+ import type { SliderMark, SliderMarkColor } from "@metamask/design-system-shared";
14
+ export type SliderColorStop = {
15
+ step: number;
16
+ color: string;
17
+ };
13
18
  export declare function clampTrackPercent(trackPercent: number): number;
14
19
  /**
15
20
  * Linear default: domain value → 0–100 track position.
@@ -73,25 +78,69 @@ export declare function clampGesturePosition(position: number, width: number): n
73
78
  */
74
79
  export declare function getTrackPercentFromValue(value: number, minimumValue: number, maximumValue: number, mapValueToTrackPercent?: (value: number) => number): number;
75
80
  /**
76
- * Default `stepToValue`: linear track-percent → domain value.
81
+ * Default linear track-percent → domain value for a mark.
77
82
  *
78
- * @param step - Track-percent step from `rangeLabelSteps`.
83
+ * @param step - Track-percent step from a mark entry.
79
84
  * @param minimumValue - Lower bound of the domain range.
80
85
  * @param maximumValue - Upper bound of the domain range.
81
86
  * @returns Domain value for the step.
82
87
  */
83
88
  export declare function defaultStepToValue(step: number, minimumValue: number, maximumValue: number): number;
84
89
  /**
85
- * Default `formatStepLabel`: display track percent as a percent string.
90
+ * Domain value for a mark: explicit `value` or linear default from step.
86
91
  *
87
- * @param step - Track-percent step from `rangeLabelSteps`.
88
- * @returns Formatted label string.
92
+ * @param mark - Mark entry.
93
+ * @param minimumValue - Lower bound of the domain range.
94
+ * @param maximumValue - Upper bound of the domain range.
95
+ * @returns Domain value for the mark.
96
+ */
97
+ export declare function getMarkValue(mark: SliderMark, minimumValue: number, maximumValue: number): number;
98
+ /**
99
+ * Track-percent thresholds that trigger onMark while dragging.
100
+ *
101
+ * @param marks - Mark entries.
102
+ * @returns Haptic threshold positions.
103
+ */
104
+ export declare function getMarkHapticThresholds(marks: readonly SliderMark[]): number[];
105
+ /**
106
+ * Resolves a mark color to a concrete color string for Reanimated.
107
+ * Design tokens are looked up on the palette; raw hex/rgb pass through
108
+ * (temporary migration bridge — prefer `SliderMarkColor` tokens in app code).
109
+ *
110
+ * @param color - Theme token key (or legacy hex/rgb string).
111
+ * @param palette - Flattened theme color palette.
112
+ * @param fallback - Fallback color when token is not found.
113
+ * @returns Resolved color string.
114
+ */
115
+ export declare function resolveMarkColor(color: SliderMarkColor | string, palette: Record<string, string>, fallback: string): string;
116
+ /**
117
+ * Builds color interpolation stops from marks, applying fallback for missing colors.
118
+ *
119
+ * @param marks - Mark entries.
120
+ * @param palette - Flattened theme color palette.
121
+ * @param fallbackToken - Default token key when mark.color is omitted.
122
+ * @returns Sorted color stops for interpolation.
123
+ */
124
+ export declare function buildColorStops(marks: readonly SliderMark[], palette: Record<string, string>, fallbackToken: string): SliderColorStop[];
125
+ /**
126
+ * Interpolates a color along the track based on mark color stops.
127
+ *
128
+ * @param trackPercent - Current track position from 0–100.
129
+ * @param stops - Sorted color stops.
130
+ * @returns Interpolated color string.
131
+ */
132
+ export declare function interpolateMarkColor(trackPercent: number, stops: readonly SliderColorStop[]): string;
133
+ /**
134
+ * Whether any mark defines a theme color.
135
+ *
136
+ * @param marks - Mark entries.
137
+ * @returns True when at least one mark has a color.
89
138
  */
90
- export declare function defaultFormatStepLabel(step: number): string;
139
+ export declare function hasThemedMarkColors(marks: readonly SliderMark[]): boolean;
91
140
  /**
92
141
  * Marker `left` percent for range dots and labels; edge steps inset to stay on track.
93
142
  *
94
- * @param step - Track-percent step from `rangeLabelSteps`.
143
+ * @param step - Track-percent step from a mark entry.
95
144
  * @returns CSS `left` percentage string.
96
145
  */
97
146
  export declare function getDotLeftPercent(step: number): string;
@@ -1 +1 @@
1
- {"version":3,"file":"Slider.utilities.d.cts","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"}
1
+ {"version":3,"file":"Slider.utilities.d.cts","sourceRoot":"","sources":["../../../src/components/Slider/Slider.utilities.ts"],"names":[],"mappings":"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"}
@@ -4,12 +4,17 @@
4
4
  * Three coordinate systems:
5
5
  * - **Domain value** — the controlled `value` prop (`minimumValue`…`maximumValue`).
6
6
  * - **Track percent** — normalized 0–100 position along the track (used for dots,
7
- * labels, and `tickThresholds`; may be non-linear via `map*` hooks).
7
+ * labels, and haptic thresholds; may be non-linear via `map*` hooks).
8
8
  * - **Pixel position** — thumb/fill offset in layout pixels (`translateX`).
9
9
  *
10
10
  * Functions marked with `'worklet'` run on the UI thread inside gesture handlers.
11
11
  * JS-thread callers use the non-worklet wrappers (`getTrackPercentFromValue`, etc.).
12
12
  */
13
+ import type { SliderMark, SliderMarkColor } from "@metamask/design-system-shared";
14
+ export type SliderColorStop = {
15
+ step: number;
16
+ color: string;
17
+ };
13
18
  export declare function clampTrackPercent(trackPercent: number): number;
14
19
  /**
15
20
  * Linear default: domain value → 0–100 track position.
@@ -73,25 +78,69 @@ export declare function clampGesturePosition(position: number, width: number): n
73
78
  */
74
79
  export declare function getTrackPercentFromValue(value: number, minimumValue: number, maximumValue: number, mapValueToTrackPercent?: (value: number) => number): number;
75
80
  /**
76
- * Default `stepToValue`: linear track-percent → domain value.
81
+ * Default linear track-percent → domain value for a mark.
77
82
  *
78
- * @param step - Track-percent step from `rangeLabelSteps`.
83
+ * @param step - Track-percent step from a mark entry.
79
84
  * @param minimumValue - Lower bound of the domain range.
80
85
  * @param maximumValue - Upper bound of the domain range.
81
86
  * @returns Domain value for the step.
82
87
  */
83
88
  export declare function defaultStepToValue(step: number, minimumValue: number, maximumValue: number): number;
84
89
  /**
85
- * Default `formatStepLabel`: display track percent as a percent string.
90
+ * Domain value for a mark: explicit `value` or linear default from step.
86
91
  *
87
- * @param step - Track-percent step from `rangeLabelSteps`.
88
- * @returns Formatted label string.
92
+ * @param mark - Mark entry.
93
+ * @param minimumValue - Lower bound of the domain range.
94
+ * @param maximumValue - Upper bound of the domain range.
95
+ * @returns Domain value for the mark.
96
+ */
97
+ export declare function getMarkValue(mark: SliderMark, minimumValue: number, maximumValue: number): number;
98
+ /**
99
+ * Track-percent thresholds that trigger onMark while dragging.
100
+ *
101
+ * @param marks - Mark entries.
102
+ * @returns Haptic threshold positions.
103
+ */
104
+ export declare function getMarkHapticThresholds(marks: readonly SliderMark[]): number[];
105
+ /**
106
+ * Resolves a mark color to a concrete color string for Reanimated.
107
+ * Design tokens are looked up on the palette; raw hex/rgb pass through
108
+ * (temporary migration bridge — prefer `SliderMarkColor` tokens in app code).
109
+ *
110
+ * @param color - Theme token key (or legacy hex/rgb string).
111
+ * @param palette - Flattened theme color palette.
112
+ * @param fallback - Fallback color when token is not found.
113
+ * @returns Resolved color string.
114
+ */
115
+ export declare function resolveMarkColor(color: SliderMarkColor | string, palette: Record<string, string>, fallback: string): string;
116
+ /**
117
+ * Builds color interpolation stops from marks, applying fallback for missing colors.
118
+ *
119
+ * @param marks - Mark entries.
120
+ * @param palette - Flattened theme color palette.
121
+ * @param fallbackToken - Default token key when mark.color is omitted.
122
+ * @returns Sorted color stops for interpolation.
123
+ */
124
+ export declare function buildColorStops(marks: readonly SliderMark[], palette: Record<string, string>, fallbackToken: string): SliderColorStop[];
125
+ /**
126
+ * Interpolates a color along the track based on mark color stops.
127
+ *
128
+ * @param trackPercent - Current track position from 0–100.
129
+ * @param stops - Sorted color stops.
130
+ * @returns Interpolated color string.
131
+ */
132
+ export declare function interpolateMarkColor(trackPercent: number, stops: readonly SliderColorStop[]): string;
133
+ /**
134
+ * Whether any mark defines a theme color.
135
+ *
136
+ * @param marks - Mark entries.
137
+ * @returns True when at least one mark has a color.
89
138
  */
90
- export declare function defaultFormatStepLabel(step: number): string;
139
+ export declare function hasThemedMarkColors(marks: readonly SliderMark[]): boolean;
91
140
  /**
92
141
  * Marker `left` percent for range dots and labels; edge steps inset to stay on track.
93
142
  *
94
- * @param step - Track-percent step from `rangeLabelSteps`.
143
+ * @param step - Track-percent step from a mark entry.
95
144
  * @returns CSS `left` percentage string.
96
145
  */
97
146
  export declare function getDotLeftPercent(step: number): string;
@@ -1 +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"}
1
+ {"version":3,"file":"Slider.utilities.d.mts","sourceRoot":"","sources":["../../../src/components/Slider/Slider.utilities.ts"],"names":[],"mappings":"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"}
@@ -4,12 +4,13 @@
4
4
  * Three coordinate systems:
5
5
  * - **Domain value** — the controlled `value` prop (`minimumValue`…`maximumValue`).
6
6
  * - **Track percent** — normalized 0–100 position along the track (used for dots,
7
- * labels, and `tickThresholds`; may be non-linear via `map*` hooks).
7
+ * labels, and haptic thresholds; may be non-linear via `map*` hooks).
8
8
  * - **Pixel position** — thumb/fill offset in layout pixels (`translateX`).
9
9
  *
10
10
  * Functions marked with `'worklet'` run on the UI thread inside gesture handlers.
11
11
  * JS-thread callers use the non-worklet wrappers (`getTrackPercentFromValue`, etc.).
12
12
  */
13
+ import { interpolateColor } from "react-native-reanimated";
13
14
  import { DOT_EDGE_INSET_PERCENT, DOT_EDGE_MAX_PERCENT } from "./Slider.constants.mjs";
14
15
  // --- Track-percent primitives (worklet) ---
15
16
  export function clampTrackPercent(trackPercent) {
@@ -131,9 +132,9 @@ export function getTrackPercentFromValue(value, minimumValue, maximumValue, mapV
131
132
  }
132
133
  // --- Range label / dot defaults (Slider.tsx) ---
133
134
  /**
134
- * Default `stepToValue`: linear track-percent → domain value.
135
+ * Default linear track-percent → domain value for a mark.
135
136
  *
136
- * @param step - Track-percent step from `rangeLabelSteps`.
137
+ * @param step - Track-percent step from a mark entry.
137
138
  * @param minimumValue - Lower bound of the domain range.
138
139
  * @param maximumValue - Upper bound of the domain range.
139
140
  * @returns Domain value for the step.
@@ -142,18 +143,97 @@ export function defaultStepToValue(step, minimumValue, maximumValue) {
142
143
  return (step / 100) * (maximumValue - minimumValue) + minimumValue;
143
144
  }
144
145
  /**
145
- * Default `formatStepLabel`: display track percent as a percent string.
146
+ * Domain value for a mark: explicit `value` or linear default from step.
146
147
  *
147
- * @param step - Track-percent step from `rangeLabelSteps`.
148
- * @returns Formatted label string.
148
+ * @param mark - Mark entry.
149
+ * @param minimumValue - Lower bound of the domain range.
150
+ * @param maximumValue - Upper bound of the domain range.
151
+ * @returns Domain value for the mark.
149
152
  */
150
- export function defaultFormatStepLabel(step) {
151
- return `${step}%`;
153
+ export function getMarkValue(mark, minimumValue, maximumValue) {
154
+ if (mark.value !== undefined) {
155
+ return mark.value;
156
+ }
157
+ return defaultStepToValue(mark.step, minimumValue, maximumValue);
158
+ }
159
+ /**
160
+ * Track-percent thresholds that trigger onMark while dragging.
161
+ *
162
+ * @param marks - Mark entries.
163
+ * @returns Haptic threshold positions.
164
+ */
165
+ export function getMarkHapticThresholds(marks) {
166
+ return marks
167
+ .filter((mark) => mark.haptic ?? Boolean(mark.label))
168
+ .map((mark) => mark.step);
169
+ }
170
+ /**
171
+ * Resolves a mark color to a concrete color string for Reanimated.
172
+ * Design tokens are looked up on the palette; raw hex/rgb pass through
173
+ * (temporary migration bridge — prefer `SliderMarkColor` tokens in app code).
174
+ *
175
+ * @param color - Theme token key (or legacy hex/rgb string).
176
+ * @param palette - Flattened theme color palette.
177
+ * @param fallback - Fallback color when token is not found.
178
+ * @returns Resolved color string.
179
+ */
180
+ export function resolveMarkColor(color, palette, fallback) {
181
+ if (color.startsWith('#') || color.startsWith('rgb')) {
182
+ return color;
183
+ }
184
+ return palette[color] ?? fallback;
185
+ }
186
+ /**
187
+ * Builds color interpolation stops from marks, applying fallback for missing colors.
188
+ *
189
+ * @param marks - Mark entries.
190
+ * @param palette - Flattened theme color palette.
191
+ * @param fallbackToken - Default token key when mark.color is omitted.
192
+ * @returns Sorted color stops for interpolation.
193
+ */
194
+ export function buildColorStops(marks, palette, fallbackToken) {
195
+ const fallback = palette[fallbackToken] ?? '#000000';
196
+ return [...marks]
197
+ .sort((a, b) => a.step - b.step)
198
+ .map((mark) => ({
199
+ step: mark.step,
200
+ color: mark.color
201
+ ? resolveMarkColor(mark.color, palette, fallback)
202
+ : fallback,
203
+ }));
204
+ }
205
+ /**
206
+ * Interpolates a color along the track based on mark color stops.
207
+ *
208
+ * @param trackPercent - Current track position from 0–100.
209
+ * @param stops - Sorted color stops.
210
+ * @returns Interpolated color string.
211
+ */
212
+ export function interpolateMarkColor(trackPercent, stops) {
213
+ 'worklet';
214
+ if (stops.length === 0) {
215
+ return '#000000';
216
+ }
217
+ if (stops.length === 1) {
218
+ return stops[0].color;
219
+ }
220
+ const inputRange = stops.map((stop) => stop.step);
221
+ const outputRange = stops.map((stop) => stop.color);
222
+ return interpolateColor(clampTrackPercent(trackPercent), inputRange, outputRange, 'RGB');
223
+ }
224
+ /**
225
+ * Whether any mark defines a theme color.
226
+ *
227
+ * @param marks - Mark entries.
228
+ * @returns True when at least one mark has a color.
229
+ */
230
+ export function hasThemedMarkColors(marks) {
231
+ return marks.some((mark) => Boolean(mark.color));
152
232
  }
153
233
  /**
154
234
  * Marker `left` percent for range dots and labels; edge steps inset to stay on track.
155
235
  *
156
- * @param step - Track-percent step from `rangeLabelSteps`.
236
+ * @param step - Track-percent step from a mark entry.
157
237
  * @returns CSS `left` percentage string.
158
238
  */
159
239
  export function getDotLeftPercent(step) {
@@ -1 +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"]}
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 haptic thresholds; 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 type {\n SliderMark,\n SliderMarkColor,\n} from '@metamask/design-system-shared';\nimport { interpolateColor } from 'react-native-reanimated';\n\nimport {\n DOT_EDGE_INSET_PERCENT,\n DOT_EDGE_MAX_PERCENT,\n} from './Slider.constants';\n\nexport type SliderColorStop = {\n step: number;\n color: string;\n};\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 linear track-percent → domain value for a mark.\n *\n * @param step - Track-percent step from a mark entry.\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 * Domain value for a mark: explicit `value` or linear default from step.\n *\n * @param mark - Mark entry.\n * @param minimumValue - Lower bound of the domain range.\n * @param maximumValue - Upper bound of the domain range.\n * @returns Domain value for the mark.\n */\nexport function getMarkValue(\n mark: SliderMark,\n minimumValue: number,\n maximumValue: number,\n): number {\n if (mark.value !== undefined) {\n return mark.value;\n }\n\n return defaultStepToValue(mark.step, minimumValue, maximumValue);\n}\n\n/**\n * Track-percent thresholds that trigger onMark while dragging.\n *\n * @param marks - Mark entries.\n * @returns Haptic threshold positions.\n */\nexport function getMarkHapticThresholds(\n marks: readonly SliderMark[],\n): number[] {\n return marks\n .filter((mark) => mark.haptic ?? Boolean(mark.label))\n .map((mark) => mark.step);\n}\n\n/**\n * Resolves a mark color to a concrete color string for Reanimated.\n * Design tokens are looked up on the palette; raw hex/rgb pass through\n * (temporary migration bridge — prefer `SliderMarkColor` tokens in app code).\n *\n * @param color - Theme token key (or legacy hex/rgb string).\n * @param palette - Flattened theme color palette.\n * @param fallback - Fallback color when token is not found.\n * @returns Resolved color string.\n */\nexport function resolveMarkColor(\n color: SliderMarkColor | string,\n palette: Record<string, string>,\n fallback: string,\n): string {\n if (color.startsWith('#') || color.startsWith('rgb')) {\n return color;\n }\n\n return palette[color] ?? fallback;\n}\n\n/**\n * Builds color interpolation stops from marks, applying fallback for missing colors.\n *\n * @param marks - Mark entries.\n * @param palette - Flattened theme color palette.\n * @param fallbackToken - Default token key when mark.color is omitted.\n * @returns Sorted color stops for interpolation.\n */\nexport function buildColorStops(\n marks: readonly SliderMark[],\n palette: Record<string, string>,\n fallbackToken: string,\n): SliderColorStop[] {\n const fallback = palette[fallbackToken] ?? '#000000';\n\n return [...marks]\n .sort((a, b) => a.step - b.step)\n .map((mark) => ({\n step: mark.step,\n color: mark.color\n ? resolveMarkColor(mark.color, palette, fallback)\n : fallback,\n }));\n}\n\n/**\n * Interpolates a color along the track based on mark color stops.\n *\n * @param trackPercent - Current track position from 0–100.\n * @param stops - Sorted color stops.\n * @returns Interpolated color string.\n */\nexport function interpolateMarkColor(\n trackPercent: number,\n stops: readonly SliderColorStop[],\n): string {\n 'worklet';\n\n if (stops.length === 0) {\n return '#000000';\n }\n\n if (stops.length === 1) {\n return stops[0].color;\n }\n\n const inputRange = stops.map((stop) => stop.step);\n const outputRange = stops.map((stop) => stop.color);\n\n return interpolateColor(\n clampTrackPercent(trackPercent),\n inputRange,\n outputRange,\n 'RGB',\n );\n}\n\n/**\n * Whether any mark defines a theme color.\n *\n * @param marks - Mark entries.\n * @returns True when at least one mark has a color.\n */\nexport function hasThemedMarkColors(marks: readonly SliderMark[]): boolean {\n return marks.some((mark) => Boolean(mark.color));\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 a mark entry.\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"]}
@@ -1,9 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DEFAULT_TICK_THRESHOLDS = exports.DEFAULT_RANGE_LABEL_STEPS = exports.Slider = void 0;
3
+ exports.SliderMarkColor = exports.DEFAULT_MARKS = exports.Slider = void 0;
4
4
  var Slider_1 = require("./Slider.cjs");
5
5
  Object.defineProperty(exports, "Slider", { enumerable: true, get: function () { return Slider_1.Slider; } });
6
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; } });
7
+ Object.defineProperty(exports, "DEFAULT_MARKS", { enumerable: true, get: function () { return Slider_constants_1.DEFAULT_MARKS; } });
8
+ var design_system_shared_1 = require("@metamask/design-system-shared");
9
+ Object.defineProperty(exports, "SliderMarkColor", { enumerable: true, get: function () { return design_system_shared_1.SliderMarkColor; } });
9
10
  //# sourceMappingURL=index.cjs.map
@@ -1 +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"]}
1
+ {"version":3,"file":"index.cjs","sourceRoot":"","sources":["../../../src/components/Slider/index.ts"],"names":[],"mappings":";;;AAAA,uCAAkC;AAAzB,gGAAA,MAAM,OAAA;AACf,2DAAmD;AAA1C,iHAAA,aAAa,OAAA;AACtB,uEAAiE;AAAxD,uHAAA,eAAe,OAAA","sourcesContent":["export { Slider } from './Slider';\nexport { DEFAULT_MARKS } from './Slider.constants';\nexport { SliderMarkColor } from '@metamask/design-system-shared';\nexport type { SliderProps } from './Slider.types';\nexport type { SliderMark } from '@metamask/design-system-shared';\n"]}
@@ -1,4 +1,6 @@
1
1
  export { Slider } from "./Slider.cjs";
2
+ export { DEFAULT_MARKS } from "./Slider.constants.cjs";
3
+ export { SliderMarkColor } from "@metamask/design-system-shared";
2
4
  export type { SliderProps } from "./Slider.types.cjs";
3
- export { DEFAULT_RANGE_LABEL_STEPS, DEFAULT_TICK_THRESHOLDS, } from "./Slider.constants.cjs";
5
+ export type { SliderMark } from "@metamask/design-system-shared";
4
6
  //# sourceMappingURL=index.d.cts.map
@@ -1 +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"}
1
+ {"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../../../src/components/Slider/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,qBAAiB;AAClC,OAAO,EAAE,aAAa,EAAE,+BAA2B;AACnD,OAAO,EAAE,eAAe,EAAE,uCAAuC;AACjE,YAAY,EAAE,WAAW,EAAE,2BAAuB;AAClD,YAAY,EAAE,UAAU,EAAE,uCAAuC"}
@@ -1,4 +1,6 @@
1
1
  export { Slider } from "./Slider.mjs";
2
+ export { DEFAULT_MARKS } from "./Slider.constants.mjs";
3
+ export { SliderMarkColor } from "@metamask/design-system-shared";
2
4
  export type { SliderProps } from "./Slider.types.mjs";
3
- export { DEFAULT_RANGE_LABEL_STEPS, DEFAULT_TICK_THRESHOLDS, } from "./Slider.constants.mjs";
5
+ export type { SliderMark } from "@metamask/design-system-shared";
4
6
  //# sourceMappingURL=index.d.mts.map
@@ -1 +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"}
1
+ {"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../../../src/components/Slider/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,qBAAiB;AAClC,OAAO,EAAE,aAAa,EAAE,+BAA2B;AACnD,OAAO,EAAE,eAAe,EAAE,uCAAuC;AACjE,YAAY,EAAE,WAAW,EAAE,2BAAuB;AAClD,YAAY,EAAE,UAAU,EAAE,uCAAuC"}
@@ -1,3 +1,4 @@
1
1
  export { Slider } from "./Slider.mjs";
2
- export { DEFAULT_RANGE_LABEL_STEPS, DEFAULT_TICK_THRESHOLDS } from "./Slider.constants.mjs";
2
+ export { DEFAULT_MARKS } from "./Slider.constants.mjs";
3
+ export { SliderMarkColor } from "@metamask/design-system-shared";
3
4
  //# sourceMappingURL=index.mjs.map
@@ -1 +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"]}
1
+ {"version":3,"file":"index.mjs","sourceRoot":"","sources":["../../../src/components/Slider/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,qBAAiB;AAClC,OAAO,EAAE,aAAa,EAAE,+BAA2B;AACnD,OAAO,EAAE,eAAe,EAAE,uCAAuC","sourcesContent":["export { Slider } from './Slider';\nexport { DEFAULT_MARKS } from './Slider.constants';\nexport { SliderMarkColor } from '@metamask/design-system-shared';\nexport type { SliderProps } from './Slider.types';\nexport type { SliderMark } from '@metamask/design-system-shared';\n"]}
@@ -12,8 +12,8 @@ const Slider_utilities_1 = require("./Slider.utilities.cjs");
12
12
  * Flow during drag (UI thread):
13
13
  * touch X → clamp to track width → trackPercent → domain value → callbacks
14
14
  *
15
- * Flow when `value` prop changes (JS thread):
16
- * domain value → trackPercent → translateX (thumb + progress fill)
15
+ * Flow when `value` prop changes (JS thread → UI thread via useAnimatedReaction):
16
+ * domain value → trackPercent → translateX (skipped while dragging)
17
17
  *
18
18
  * `mapValueToTrackPercent` / `mapTrackPercentToValue` must be worklets when provided.
19
19
  *
@@ -21,13 +21,14 @@ const Slider_utilities_1 = require("./Slider.utilities.cjs");
21
21
  * @returns Gesture state and handlers for Slider.
22
22
  */
23
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]);
24
+ const { value, minimumValue = 0, maximumValue = 100, step = 1, isDisabled = false, onValueChange, onDragEnd, onGrip, onMark, marks, fillColorStops, thumbColorStops, hasThemedColors, mapValueToTrackPercent, mapTrackPercentToValue, } = params;
25
+ const hapticThresholds = (0, react_1.useMemo)(() => (0, Slider_utilities_1.getMarkHapticThresholds)(marks), [marks]);
27
26
  // --- Animated state ---
28
27
  const sliderWidth = (0, react_native_reanimated_1.useSharedValue)(0);
29
28
  const translateX = (0, react_native_reanimated_1.useSharedValue)(0);
30
29
  const thumbScale = (0, react_native_reanimated_1.useSharedValue)(1);
30
+ const isDragging = (0, react_native_reanimated_1.useSharedValue)(false);
31
+ const propValue = (0, react_native_reanimated_1.useSharedValue)(value);
31
32
  const previousTrackPercentRef = (0, react_1.useRef)((0, Slider_utilities_1.getTrackPercentFromValue)(value, minimumValue, maximumValue, mapValueToTrackPercent));
32
33
  const isDraggingRef = (0, react_1.useRef)(false);
33
34
  // --- Position sync (domain value → thumb pixels) ---
@@ -47,17 +48,21 @@ function useSliderGesture(params) {
47
48
  syncPositionFromValue(value, width);
48
49
  }, [sliderWidth, syncPositionFromValue, value]);
49
50
  (0, react_1.useEffect)(() => {
50
- syncPositionFromValue(value);
51
+ propValue.value = value;
51
52
  if (!isDraggingRef.current) {
52
53
  previousTrackPercentRef.current = (0, Slider_utilities_1.getTrackPercentFromValue)(value, minimumValue, maximumValue, mapValueToTrackPercent);
53
54
  }
54
- }, [
55
- mapValueToTrackPercent,
56
- maximumValue,
57
- minimumValue,
58
- syncPositionFromValue,
59
- value,
60
- ]);
55
+ }, [mapValueToTrackPercent, maximumValue, minimumValue, propValue, value]);
56
+ (0, react_native_reanimated_1.useAnimatedReaction)(() => propValue.value, (currentValue, previousValue) => {
57
+ if (isDragging.value) {
58
+ return;
59
+ }
60
+ if (previousValue !== null && currentValue === previousValue) {
61
+ return;
62
+ }
63
+ const trackPercent = (0, Slider_utilities_1.resolveValueToTrackPercent)(currentValue, minimumValue, maximumValue, mapValueToTrackPercent);
64
+ translateX.value = (0, Slider_utilities_1.trackPercentToPosition)(trackPercent, sliderWidth.value);
65
+ }, [mapValueToTrackPercent, maximumValue, minimumValue]);
61
66
  // --- JS-thread bridges (stable refs for runOnJS from worklets) ---
62
67
  const emitValueChange = (0, react_1.useCallback)((nextValue) => {
63
68
  onValueChange(nextValue);
@@ -75,22 +80,43 @@ function useSliderGesture(params) {
75
80
  }, []);
76
81
  const checkThresholdCrossing = (0, react_1.useCallback)((newTrackPercent) => {
77
82
  const prevTrackPercent = previousTrackPercentRef.current;
78
- for (const threshold of tickThresholds) {
83
+ for (const threshold of hapticThresholds) {
79
84
  if ((prevTrackPercent < threshold && newTrackPercent >= threshold) ||
80
85
  (prevTrackPercent > threshold && newTrackPercent <= threshold)) {
81
- onTick?.();
86
+ onMark?.();
82
87
  break;
83
88
  }
84
89
  }
85
90
  previousTrackPercentRef.current = newTrackPercent;
86
- }, [onTick, tickThresholds]);
91
+ }, [hapticThresholds, onMark]);
87
92
  // --- Animated styles (thumb + fill width follow translateX) ---
93
+ const activeFillColor = (0, react_native_reanimated_1.useDerivedValue)(() => {
94
+ if (!hasThemedColors) {
95
+ return undefined;
96
+ }
97
+ return (0, Slider_utilities_1.interpolateMarkColor)((0, Slider_utilities_1.positionToTrackPercent)(translateX.value, sliderWidth.value), fillColorStops);
98
+ });
99
+ const activeThumbColor = (0, react_native_reanimated_1.useDerivedValue)(() => {
100
+ if (!hasThemedColors) {
101
+ return undefined;
102
+ }
103
+ return (0, Slider_utilities_1.interpolateMarkColor)((0, Slider_utilities_1.positionToTrackPercent)(translateX.value, sliderWidth.value), thumbColorStops);
104
+ });
88
105
  const progressStyle = (0, react_native_reanimated_1.useAnimatedStyle)(() => ({
89
106
  width: translateX.value,
90
- }));
107
+ ...(hasThemedColors && {
108
+ backgroundColor: activeFillColor.value,
109
+ }),
110
+ }), [fillColorStops, hasThemedColors]);
91
111
  const thumbStyle = (0, react_native_reanimated_1.useAnimatedStyle)(() => ({
92
- transform: [{ translateX: translateX.value }, { scale: thumbScale.value }],
93
- }));
112
+ transform: [
113
+ { translateX: translateX.value },
114
+ { scale: thumbScale.value },
115
+ ],
116
+ ...(hasThemedColors && {
117
+ backgroundColor: activeThumbColor.value,
118
+ }),
119
+ }), [hasThemedColors, thumbColorStops]);
94
120
  // --- Pan + tap gestures ---
95
121
  const gesture = (0, react_1.useMemo)(() => {
96
122
  // Gesture callbacks need explicit 'worklet' directives because this package
@@ -127,6 +153,7 @@ function useSliderGesture(params) {
127
153
  .enabled(!isDisabled)
128
154
  .onStart(() => {
129
155
  'worklet';
156
+ isDragging.value = true;
130
157
  thumbScale.value = (0, react_native_reanimated_1.withTiming)(Slider_constants_1.THUMB_GRIP_SCALE, {
131
158
  duration: Slider_constants_1.THUMB_GRIP_ANIMATION_DURATION,
132
159
  easing: gripEasing,
@@ -152,6 +179,7 @@ function useSliderGesture(params) {
152
179
  })
153
180
  .onFinalize(() => {
154
181
  'worklet';
182
+ isDragging.value = false;
155
183
  thumbScale.value = (0, react_native_reanimated_1.withTiming)(1, {
156
184
  duration: Slider_constants_1.THUMB_GRIP_ANIMATION_DURATION,
157
185
  easing: gripEasing,
@@ -174,6 +202,7 @@ function useSliderGesture(params) {
174
202
  emitDragEnd,
175
203
  emitValueChange,
176
204
  isDisabled,
205
+ isDragging,
177
206
  mapTrackPercentToValue,
178
207
  mapValueToTrackPercent,
179
208
  maximumValue,
@@ -185,12 +214,16 @@ function useSliderGesture(params) {
185
214
  translateX,
186
215
  triggerGrip,
187
216
  ]);
188
- // --- Range label tap (JS thread; uses stepToValue from Slider.tsx) ---
217
+ // --- Range label tap (JS thread) ---
189
218
  const handlePressStep = (0, react_1.useCallback)((rangeStep) => {
190
219
  if (isDisabled) {
191
220
  return;
192
221
  }
193
- const newValue = stepToValue(rangeStep);
222
+ const mark = marks.find((entry) => entry.step === rangeStep);
223
+ if (!mark) {
224
+ return;
225
+ }
226
+ const newValue = (0, Slider_utilities_1.getMarkValue)(mark, minimumValue, maximumValue);
194
227
  onValueChange(newValue);
195
228
  const trackPercent = (0, Slider_utilities_1.getTrackPercentFromValue)(newValue, minimumValue, maximumValue, mapValueToTrackPercent);
196
229
  checkThresholdCrossing(trackPercent);
@@ -204,8 +237,8 @@ function useSliderGesture(params) {
204
237
  minimumValue,
205
238
  onDragEnd,
206
239
  onValueChange,
207
- stepToValue,
208
240
  syncPositionFromValue,
241
+ marks,
209
242
  ]);
210
243
  return {
211
244
  handleLayout,