@xsolla/xui-slider 0.158.0 → 0.159.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/README.md +62 -74
- package/native/index.js +3 -1
- package/native/index.js.map +1 -1
- package/native/index.mjs +3 -1
- package/native/index.mjs.map +1 -1
- package/package.json +4 -4
- package/web/index.js +6 -2
- package/web/index.js.map +1 -1
- package/web/index.mjs +6 -2
- package/web/index.mjs.map +1 -1
package/README.md
CHANGED
|
@@ -13,28 +13,21 @@ npm install @xsolla/xui-slider
|
|
|
13
13
|
### Basic Slider
|
|
14
14
|
|
|
15
15
|
```tsx
|
|
16
|
-
import * as React from
|
|
17
|
-
import { Slider } from
|
|
16
|
+
import * as React from "react";
|
|
17
|
+
import { Slider } from "@xsolla/xui-slider";
|
|
18
18
|
|
|
19
19
|
export default function BasicSlider() {
|
|
20
20
|
const [value, setValue] = React.useState(50);
|
|
21
21
|
|
|
22
|
-
return
|
|
23
|
-
<Slider
|
|
24
|
-
value={value}
|
|
25
|
-
onChange={setValue}
|
|
26
|
-
min={0}
|
|
27
|
-
max={100}
|
|
28
|
-
/>
|
|
29
|
-
);
|
|
22
|
+
return <Slider value={value} onChange={setValue} min={0} max={100} />;
|
|
30
23
|
}
|
|
31
24
|
```
|
|
32
25
|
|
|
33
26
|
### Slider with Label
|
|
34
27
|
|
|
35
28
|
```tsx
|
|
36
|
-
import * as React from
|
|
37
|
-
import { Slider } from
|
|
29
|
+
import * as React from "react";
|
|
30
|
+
import { Slider } from "@xsolla/xui-slider";
|
|
38
31
|
|
|
39
32
|
export default function SliderWithLabel() {
|
|
40
33
|
const [volume, setVolume] = React.useState(75);
|
|
@@ -54,8 +47,8 @@ export default function SliderWithLabel() {
|
|
|
54
47
|
### Range Slider
|
|
55
48
|
|
|
56
49
|
```tsx
|
|
57
|
-
import * as React from
|
|
58
|
-
import { Slider } from
|
|
50
|
+
import * as React from "react";
|
|
51
|
+
import { Slider } from "@xsolla/xui-slider";
|
|
59
52
|
|
|
60
53
|
export default function RangeSlider() {
|
|
61
54
|
const [minPrice, setMinPrice] = React.useState(20);
|
|
@@ -83,8 +76,8 @@ export default function RangeSlider() {
|
|
|
83
76
|
### Slider with Input Fields
|
|
84
77
|
|
|
85
78
|
```tsx
|
|
86
|
-
import * as React from
|
|
87
|
-
import { Slider } from
|
|
79
|
+
import * as React from "react";
|
|
80
|
+
import { Slider } from "@xsolla/xui-slider";
|
|
88
81
|
|
|
89
82
|
export default function SliderWithInputs() {
|
|
90
83
|
const [value, setValue] = React.useState(50);
|
|
@@ -105,8 +98,8 @@ export default function SliderWithInputs() {
|
|
|
105
98
|
### Range Slider with Both Inputs
|
|
106
99
|
|
|
107
100
|
```tsx
|
|
108
|
-
import * as React from
|
|
109
|
-
import { Slider } from
|
|
101
|
+
import * as React from "react";
|
|
102
|
+
import { Slider } from "@xsolla/xui-slider";
|
|
110
103
|
|
|
111
104
|
export default function RangeSliderWithInputs() {
|
|
112
105
|
const [min, setMin] = React.useState(1000);
|
|
@@ -170,12 +163,12 @@ import { Slider } from '@xsolla/xui-slider';
|
|
|
170
163
|
### Slider Sizes
|
|
171
164
|
|
|
172
165
|
```tsx
|
|
173
|
-
import * as React from
|
|
174
|
-
import { Slider } from
|
|
166
|
+
import * as React from "react";
|
|
167
|
+
import { Slider } from "@xsolla/xui-slider";
|
|
175
168
|
|
|
176
169
|
export default function SliderSizes() {
|
|
177
170
|
return (
|
|
178
|
-
<div style={{ display:
|
|
171
|
+
<div style={{ display: "flex", flexDirection: "column", gap: 24 }}>
|
|
179
172
|
<Slider value={50} size="sm" label="Small" />
|
|
180
173
|
<Slider value={50} size="md" label="Medium (default)" />
|
|
181
174
|
<Slider value={50} size="lg" label="Large" />
|
|
@@ -188,12 +181,12 @@ export default function SliderSizes() {
|
|
|
188
181
|
### Color Schemes
|
|
189
182
|
|
|
190
183
|
```tsx
|
|
191
|
-
import * as React from
|
|
192
|
-
import { Slider } from
|
|
184
|
+
import * as React from "react";
|
|
185
|
+
import { Slider } from "@xsolla/xui-slider";
|
|
193
186
|
|
|
194
187
|
export default function SliderColors() {
|
|
195
188
|
return (
|
|
196
|
-
<div style={{ display:
|
|
189
|
+
<div style={{ display: "flex", flexDirection: "column", gap: 24 }}>
|
|
197
190
|
<Slider value={60} activeColor="brand" label="Brand" />
|
|
198
191
|
<Slider value={60} activeColor="brandExtra" label="Brand Extra" />
|
|
199
192
|
<Slider value={60} activeColor="success" label="Success" />
|
|
@@ -208,9 +201,9 @@ export default function SliderColors() {
|
|
|
208
201
|
### Slider with Icons
|
|
209
202
|
|
|
210
203
|
```tsx
|
|
211
|
-
import * as React from
|
|
212
|
-
import { Slider } from
|
|
213
|
-
import { Volume1, Volume2 } from
|
|
204
|
+
import * as React from "react";
|
|
205
|
+
import { Slider } from "@xsolla/xui-slider";
|
|
206
|
+
import { Volume1, Volume2 } from "@xsolla/xui-icons-base";
|
|
214
207
|
|
|
215
208
|
export default function SliderWithIcons() {
|
|
216
209
|
const [value, setValue] = React.useState(50);
|
|
@@ -231,8 +224,8 @@ export default function SliderWithIcons() {
|
|
|
231
224
|
### Step Slider
|
|
232
225
|
|
|
233
226
|
```tsx
|
|
234
|
-
import * as React from
|
|
235
|
-
import { Slider } from
|
|
227
|
+
import * as React from "react";
|
|
228
|
+
import { Slider } from "@xsolla/xui-slider";
|
|
236
229
|
|
|
237
230
|
export default function StepSlider() {
|
|
238
231
|
const [value, setValue] = React.useState(50);
|
|
@@ -254,18 +247,12 @@ export default function StepSlider() {
|
|
|
254
247
|
### Disabled Slider
|
|
255
248
|
|
|
256
249
|
```tsx
|
|
257
|
-
import * as React from
|
|
258
|
-
import { Slider } from
|
|
250
|
+
import * as React from "react";
|
|
251
|
+
import { Slider } from "@xsolla/xui-slider";
|
|
259
252
|
|
|
260
253
|
export default function DisabledSlider() {
|
|
261
254
|
return (
|
|
262
|
-
<Slider
|
|
263
|
-
value={50}
|
|
264
|
-
min={0}
|
|
265
|
-
max={100}
|
|
266
|
-
disabled
|
|
267
|
-
label="Disabled slider"
|
|
268
|
-
/>
|
|
255
|
+
<Slider value={50} min={0} max={100} disabled label="Disabled slider" />
|
|
269
256
|
);
|
|
270
257
|
}
|
|
271
258
|
```
|
|
@@ -278,50 +265,51 @@ A slider component for value selection.
|
|
|
278
265
|
|
|
279
266
|
**Slider Props:**
|
|
280
267
|
|
|
281
|
-
| Prop
|
|
282
|
-
|
|
|
283
|
-
|
|
|
284
|
-
|
|
|
285
|
-
|
|
|
286
|
-
|
|
|
287
|
-
|
|
|
288
|
-
|
|
|
289
|
-
|
|
|
290
|
-
|
|
|
291
|
-
|
|
|
292
|
-
|
|
|
293
|
-
|
|
|
294
|
-
|
|
|
295
|
-
|
|
|
296
|
-
|
|
|
297
|
-
|
|
|
298
|
-
|
|
|
299
|
-
|
|
|
300
|
-
|
|
|
301
|
-
|
|
|
302
|
-
|
|
|
303
|
-
|
|
|
304
|
-
|
|
|
305
|
-
|
|
|
268
|
+
| Prop | Type | Default | Description |
|
|
269
|
+
| :----------------- | :-------------------------------------------------------------------------- | :---------------- | :------------------------------------------------------------------------------------------------------------ |
|
|
270
|
+
| `testID` | `string` | — | Test ID for testing frameworks. On web this renders as `data-testid`; on React Native it renders as `testID`. |
|
|
271
|
+
| value | `number` | `0` | Current value (single slider mode). |
|
|
272
|
+
| minValue | `number` | - | Minimum value (range mode). |
|
|
273
|
+
| maxValue | `number` | - | Maximum value (range mode). |
|
|
274
|
+
| min | `number` | `0` | Minimum bound of the slider. |
|
|
275
|
+
| max | `number` | `100` | Maximum bound of the slider. |
|
|
276
|
+
| step | `number` | `1` | Step increment for value changes. |
|
|
277
|
+
| onChange | `(value: number) => void` | - | Callback for single value changes. |
|
|
278
|
+
| onRangeChange | `(min: number, max: number) => void` | - | Callback for range value changes. |
|
|
279
|
+
| size | `"sm" \| "md" \| "lg" \| "xl"` | `"md"` | Size of the slider. |
|
|
280
|
+
| disabled | `boolean` | `false` | Whether the slider is disabled. |
|
|
281
|
+
| range | `boolean` | `false` | Enable range mode with two thumbs. |
|
|
282
|
+
| inputPosition | `"left" \| "right" \| "both" \| "none"` | `"none"` | Position of input field(s). |
|
|
283
|
+
| showLabels | `boolean` | `false` | Show min/max labels. |
|
|
284
|
+
| label | `string` | - | Label displayed above the slider. |
|
|
285
|
+
| activeColor | `"brand" \| "brandExtra" \| "success" \| "warning" \| "alert" \| "neutral"` | `"brand"` | Color scheme for the active track. |
|
|
286
|
+
| iconLeft | `ReactNode` | - | Icon on the left side. |
|
|
287
|
+
| iconRight | `ReactNode` | - | Icon on the right side. |
|
|
288
|
+
| iconInside | `ReactNode` | - | Icon inside input field. |
|
|
289
|
+
| iconInsidePosition | `"left" \| "right"` | - | Position of icon inside input. |
|
|
290
|
+
| aria-label | `string` | - | Accessible label. |
|
|
291
|
+
| minThumbAriaLabel | `string` | `"Minimum value"` | Label for min thumb in range mode. |
|
|
292
|
+
| maxThumbAriaLabel | `string` | `"Maximum value"` | Label for max thumb in range mode. |
|
|
293
|
+
| testID | `string` | - | Test identifier. |
|
|
306
294
|
|
|
307
295
|
**Size Configuration:**
|
|
308
296
|
|
|
309
297
|
| Size | Height | Track Height | Thumb Size | Input Width |
|
|
310
298
|
| :--- | :----- | :----------- | :--------- | :---------- |
|
|
311
|
-
| sm
|
|
312
|
-
| md
|
|
313
|
-
| lg
|
|
314
|
-
| xl
|
|
299
|
+
| sm | 32px | 4px | 14px | 48px |
|
|
300
|
+
| md | 40px | 6px | 16px | 56px |
|
|
301
|
+
| lg | 48px | 6px | 18px | 64px |
|
|
302
|
+
| xl | 56px | 8px | 20px | 72px |
|
|
315
303
|
|
|
316
304
|
## Keyboard Navigation
|
|
317
305
|
|
|
318
|
-
| Key
|
|
319
|
-
|
|
|
320
|
-
| Arrow Right/Up
|
|
321
|
-
| Arrow Left/Down | Decrease value by step
|
|
322
|
-
| Shift + Arrow
|
|
323
|
-
| Home
|
|
324
|
-
| End
|
|
306
|
+
| Key | Action |
|
|
307
|
+
| :-------------- | :---------------------------- |
|
|
308
|
+
| Arrow Right/Up | Increase value by step |
|
|
309
|
+
| Arrow Left/Down | Decrease value by step |
|
|
310
|
+
| Shift + Arrow | Increase/decrease by 10x step |
|
|
311
|
+
| Home | Jump to minimum value |
|
|
312
|
+
| End | Jump to maximum value |
|
|
325
313
|
|
|
326
314
|
## Accessibility
|
|
327
315
|
|
package/native/index.js
CHANGED
|
@@ -228,6 +228,8 @@ var Text = ({
|
|
|
228
228
|
numberOfLines,
|
|
229
229
|
id,
|
|
230
230
|
role,
|
|
231
|
+
testID,
|
|
232
|
+
"data-testid": dataTestId,
|
|
231
233
|
style: styleProp,
|
|
232
234
|
...props
|
|
233
235
|
}) => {
|
|
@@ -257,7 +259,7 @@ var Text = ({
|
|
|
257
259
|
{
|
|
258
260
|
style: baseStyle,
|
|
259
261
|
numberOfLines,
|
|
260
|
-
testID: id,
|
|
262
|
+
testID: dataTestId || testID || id,
|
|
261
263
|
accessibilityRole,
|
|
262
264
|
children
|
|
263
265
|
}
|
package/native/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/index.tsx","../../src/Slider.tsx","../../../../foundation/primitives-native/src/Box.tsx","../../../../foundation/primitives-native/src/Text.tsx","../../../../foundation/primitives-native/src/index.tsx"],"sourcesContent":["export * from \"./Slider\";\n","import React, { useState, useRef, useEffect, useCallback } from \"react\";\n// @ts-expect-error - this will be resolved at build time\nimport { Box, Text, isWeb } from \"@xsolla/xui-primitives\";\nimport {\n useResolvedTheme,\n useId,\n type ThemeOverrideProps,\n} from \"@xsolla/xui-core\";\nimport { Input } from \"@xsolla/xui-input\";\n\n/**\n * Available color options from the design system.\n */\nexport type SliderColorScheme =\n | \"brand\"\n | \"brandExtra\"\n | \"success\"\n | \"warning\"\n | \"alert\"\n | \"neutral\";\n\nexport interface SliderProps extends ThemeOverrideProps {\n /**\n * Current value for single slider mode.\n */\n value?: number;\n /**\n * Minimum value of the range (for range mode).\n */\n minValue?: number;\n /**\n * Maximum value of the range (for range mode).\n */\n maxValue?: number;\n /**\n * Minimum bound of the slider.\n */\n min?: number;\n /**\n * Maximum bound of the slider.\n */\n max?: number;\n /**\n * Step increment.\n */\n step?: number;\n /**\n * Callback for single value changes.\n */\n onChange?: (value: number) => void;\n /**\n * Callback for range value changes (min, max).\n */\n onRangeChange?: (minValue: number, maxValue: number) => void;\n /**\n * Size variant.\n */\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\";\n /**\n * Whether the slider is disabled.\n */\n disabled?: boolean;\n /**\n * Enable range mode with two thumbs.\n */\n range?: boolean;\n /**\n * Position of input field(s).\n */\n inputPosition?: \"left\" | \"right\" | \"both\" | \"none\";\n /**\n * Show min/max labels next to the track.\n */\n showLabels?: boolean;\n /**\n * Label text (displayed above the slider).\n */\n label?: string;\n /**\n * Color scheme for the active/filled portion of the track and thumb.\n * Uses colors from the design system.\n * @default \"brand\"\n */\n activeColor?: SliderColorScheme;\n /**\n * Test identifier.\n */\n testID?: string;\n /**\n * Accessible label for the slider (used when no visible label).\n */\n \"aria-label\"?: string;\n /**\n * Accessible label for the minimum thumb in range mode.\n */\n minThumbAriaLabel?: string;\n /**\n * Accessible label for the maximum thumb in range mode.\n */\n maxThumbAriaLabel?: string;\n /**\n * Icon to display on the left side of the slider.\n */\n iconLeft?: React.ReactNode;\n /**\n * Icon to display on the right side of the slider.\n */\n iconRight?: React.ReactNode;\n /**\n * Icon to display inside the input field.\n * Only works when inputPosition is not 'none'.\n */\n iconInside?: React.ReactNode;\n /**\n * Position of the icon inside the input field.\n * Defaults to the same side as inputPosition.\n */\n iconInsidePosition?: \"left\" | \"right\";\n}\n\n// Size configurations matching Figma design\nconst sizeConfig = {\n xl: {\n height: 56,\n trackHeight: 8,\n thumbSize: 20,\n inputWidth: 72,\n inputHeight: 56,\n fontSize: 16,\n gap: 24,\n iconSize: 24,\n inputIconSize: 18,\n inputIconGap: 10,\n },\n lg: {\n height: 48,\n trackHeight: 6,\n thumbSize: 18,\n inputWidth: 64,\n inputHeight: 48,\n fontSize: 14,\n gap: 20,\n iconSize: 20,\n inputIconSize: 18,\n inputIconGap: 10,\n },\n md: {\n height: 40,\n trackHeight: 6,\n thumbSize: 16,\n inputWidth: 56,\n inputHeight: 40,\n fontSize: 14,\n gap: 16,\n iconSize: 18,\n inputIconSize: 18,\n inputIconGap: 10,\n },\n sm: {\n height: 32,\n trackHeight: 4,\n thumbSize: 14,\n inputWidth: 48,\n inputHeight: 32,\n fontSize: 12,\n gap: 12,\n iconSize: 16,\n inputIconSize: 16,\n inputIconGap: 10,\n },\n};\n\nexport const Slider: React.FC<SliderProps> = ({\n value: propValue = 0,\n minValue: propMinValue,\n maxValue: propMaxValue,\n min = 0,\n max = 100,\n step = 1,\n onChange,\n onRangeChange,\n size = \"md\",\n disabled = false,\n range = false,\n inputPosition = \"none\",\n showLabels = false,\n label,\n activeColor: activeColorProp,\n testID,\n \"aria-label\": ariaLabel,\n minThumbAriaLabel = \"Minimum value\",\n maxThumbAriaLabel = \"Maximum value\",\n iconLeft,\n iconRight,\n iconInside,\n iconInsidePosition,\n themeMode,\n themeProductContext,\n}) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n\n // Generate unique IDs for accessibility\n const rawId = useId();\n const safeId = rawId.replace(/:/g, \"\");\n const sliderId = `slider-${safeId}`;\n const labelId = `${sliderId}-label`;\n\n // Single value state\n const [value, setValue] = useState(propValue);\n\n // Range values state\n const [rangeMin, setRangeMin] = useState(propMinValue ?? min);\n const [rangeMax, setRangeMax] = useState(propMaxValue ?? max);\n\n // Hover states\n const [isHovered, setIsHovered] = useState(false);\n const [activeThumb, setActiveThumb] = useState<\"min\" | \"max\" | null>(null);\n\n const trackRef = useRef<any>(null);\n\n // Sync with props\n useEffect(() => {\n setValue(propValue);\n }, [propValue]);\n\n useEffect(() => {\n if (propMinValue !== undefined) setRangeMin(propMinValue);\n }, [propMinValue]);\n\n useEffect(() => {\n if (propMaxValue !== undefined) setRangeMax(propMaxValue);\n }, [propMaxValue]);\n\n const sizing = sizeConfig[size];\n\n // Colors from theme\n const disabledColor = theme.colors.control.check.bgDisable;\n const inputColors = theme.colors.control.input;\n const trackBgColor = inputColors.bg; // rgba(0, 0, 0, 0.07)\n const trackBgDisabled = inputColors.bgDisable;\n\n // Helper to get colors from theme based on scheme\n // Control colors only exist for brand, brandExtra, alert\n // For success, warning, neutral - use background colors (consistent with Tag component)\n const getColorsFromScheme = (\n scheme: SliderColorScheme\n ): { bg: string; bgHover: string } => {\n const controlColors = theme.colors.control as any;\n const backgroundColors = theme.colors.background as any;\n\n // Check if scheme exists in control colors (brand, brandExtra, alert)\n const control = controlColors[scheme]?.primary;\n if (control?.bg) {\n return { bg: control.bg, bgHover: control.bgHover || control.bg };\n }\n\n // For success, warning, neutral - use background colors (like Tag component)\n const background = backgroundColors[scheme];\n if (background?.primary) {\n return { bg: background.primary, bgHover: background.primary };\n }\n\n // Fallback to brand\n return {\n bg: controlColors.brand.primary.bg,\n bgHover: controlColors.brand.primary.bgHover,\n };\n };\n\n // Active line and thumb color: use prop scheme, or default to brand\n const activeScheme = activeColorProp || \"brand\";\n const activeColors = getColorsFromScheme(activeScheme);\n const fillColor = disabled ? disabledColor : activeColors.bg;\n const thumbBgColor = disabled ? disabledColor : activeColors.bg;\n const thumbBgHoverColor = disabled ? disabledColor : activeColors.bgHover;\n\n // Shadow for thumb\n const thumbShadow =\n \"0px 1px 2px rgba(7, 7, 8, 0.2), 0px 1px 3px 1px rgba(7, 7, 8, 0.1)\";\n\n const calculateValue = useCallback(\n (clientX: number) => {\n if (!trackRef.current) return value;\n const rect = trackRef.current.getBoundingClientRect();\n const percentage = Math.max(\n 0,\n Math.min(1, (clientX - rect.left) / rect.width)\n );\n const rawValue = min + percentage * (max - min);\n return Math.round(rawValue / step) * step;\n },\n [min, max, step, value]\n );\n\n const handleSingleMove = useCallback(\n (clientX: number) => {\n if (disabled) return;\n const newValue = calculateValue(clientX);\n setValue(newValue);\n onChange?.(newValue);\n },\n [disabled, calculateValue, onChange]\n );\n\n const handleRangeMove = useCallback(\n (clientX: number, thumb: \"min\" | \"max\") => {\n if (disabled) return;\n const newValue = calculateValue(clientX);\n\n if (thumb === \"min\") {\n const clampedValue = Math.min(newValue, rangeMax - step);\n setRangeMin(clampedValue);\n onRangeChange?.(clampedValue, rangeMax);\n } else {\n const clampedValue = Math.max(newValue, rangeMin + step);\n setRangeMax(clampedValue);\n onRangeChange?.(rangeMin, clampedValue);\n }\n },\n [disabled, calculateValue, rangeMin, rangeMax, step, onRangeChange]\n );\n\n const handleMouseDown = (\n e: React.MouseEvent,\n thumb?: \"min\" | \"max\" | \"track\"\n ) => {\n if (disabled) return;\n\n const clientX = e.clientX;\n\n if (range) {\n // Determine which thumb to move based on click position\n let targetThumb: \"min\" | \"max\" = thumb === \"min\" ? \"min\" : \"max\";\n\n if (thumb === \"track\") {\n // Click on track - determine closest thumb\n const clickValue = calculateValue(clientX);\n const distToMin = Math.abs(clickValue - rangeMin);\n const distToMax = Math.abs(clickValue - rangeMax);\n targetThumb = distToMin < distToMax ? \"min\" : \"max\";\n }\n\n setActiveThumb(targetThumb);\n handleRangeMove(clientX, targetThumb);\n\n const onMouseMove = (moveEvent: MouseEvent) => {\n handleRangeMove(moveEvent.clientX, targetThumb);\n };\n\n const onMouseUp = () => {\n setActiveThumb(null);\n document.removeEventListener(\"mousemove\", onMouseMove);\n document.removeEventListener(\"mouseup\", onMouseUp);\n };\n\n document.addEventListener(\"mousemove\", onMouseMove);\n document.addEventListener(\"mouseup\", onMouseUp);\n } else {\n handleSingleMove(clientX);\n\n const onMouseMove = (moveEvent: MouseEvent) => {\n handleSingleMove(moveEvent.clientX);\n };\n\n const onMouseUp = () => {\n document.removeEventListener(\"mousemove\", onMouseMove);\n document.removeEventListener(\"mouseup\", onMouseUp);\n };\n\n document.addEventListener(\"mousemove\", onMouseMove);\n document.addEventListener(\"mouseup\", onMouseUp);\n }\n };\n\n // Keyboard navigation handlers\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent, thumbType?: \"min\" | \"max\") => {\n if (disabled) return;\n\n const stepValue = e.shiftKey ? step * 10 : step;\n let handled = false;\n\n if (range && thumbType) {\n // Range mode keyboard handling\n if (thumbType === \"min\") {\n if (e.key === \"ArrowRight\" || e.key === \"ArrowUp\") {\n const newValue = Math.min(rangeMin + stepValue, rangeMax - step);\n setRangeMin(newValue);\n onRangeChange?.(newValue, rangeMax);\n handled = true;\n } else if (e.key === \"ArrowLeft\" || e.key === \"ArrowDown\") {\n const newValue = Math.max(rangeMin - stepValue, min);\n setRangeMin(newValue);\n onRangeChange?.(newValue, rangeMax);\n handled = true;\n } else if (e.key === \"Home\") {\n setRangeMin(min);\n onRangeChange?.(min, rangeMax);\n handled = true;\n } else if (e.key === \"End\") {\n const newValue = rangeMax - step;\n setRangeMin(newValue);\n onRangeChange?.(newValue, rangeMax);\n handled = true;\n }\n } else {\n if (e.key === \"ArrowRight\" || e.key === \"ArrowUp\") {\n const newValue = Math.min(rangeMax + stepValue, max);\n setRangeMax(newValue);\n onRangeChange?.(rangeMin, newValue);\n handled = true;\n } else if (e.key === \"ArrowLeft\" || e.key === \"ArrowDown\") {\n const newValue = Math.max(rangeMax - stepValue, rangeMin + step);\n setRangeMax(newValue);\n onRangeChange?.(rangeMin, newValue);\n handled = true;\n } else if (e.key === \"Home\") {\n const newValue = rangeMin + step;\n setRangeMax(newValue);\n onRangeChange?.(rangeMin, newValue);\n handled = true;\n } else if (e.key === \"End\") {\n setRangeMax(max);\n onRangeChange?.(rangeMin, max);\n handled = true;\n }\n }\n } else {\n // Single slider keyboard handling\n if (e.key === \"ArrowRight\" || e.key === \"ArrowUp\") {\n const newValue = Math.min(value + stepValue, max);\n setValue(newValue);\n onChange?.(newValue);\n handled = true;\n } else if (e.key === \"ArrowLeft\" || e.key === \"ArrowDown\") {\n const newValue = Math.max(value - stepValue, min);\n setValue(newValue);\n onChange?.(newValue);\n handled = true;\n } else if (e.key === \"Home\") {\n setValue(min);\n onChange?.(min);\n handled = true;\n } else if (e.key === \"End\") {\n setValue(max);\n onChange?.(max);\n handled = true;\n }\n }\n\n if (handled) {\n e.preventDefault();\n }\n },\n [\n disabled,\n range,\n step,\n min,\n max,\n value,\n rangeMin,\n rangeMax,\n onChange,\n onRangeChange,\n ]\n );\n\n // React Native responder event handlers\n const handleResponderGrant = useCallback(\n (e: any, thumbType?: \"min\" | \"max\" | \"track\") => {\n if (disabled) return;\n\n // Get the location from the touch event\n const locationX = e.nativeEvent?.locationX ?? e.nativeEvent?.pageX ?? 0;\n\n if (range) {\n let targetThumb: \"min\" | \"max\" = thumbType === \"min\" ? \"min\" : \"max\";\n\n if (thumbType === \"track\" && trackRef.current) {\n // Determine closest thumb based on touch position\n const rect = trackRef.current.getBoundingClientRect?.() || {\n width: 100,\n left: 0,\n };\n const percentage = Math.max(0, Math.min(1, locationX / rect.width));\n const touchValue = min + percentage * (max - min);\n const distToMin = Math.abs(touchValue - rangeMin);\n const distToMax = Math.abs(touchValue - rangeMax);\n targetThumb = distToMin < distToMax ? \"min\" : \"max\";\n }\n\n setActiveThumb(targetThumb);\n }\n },\n [disabled, range, min, max, rangeMin, rangeMax]\n );\n\n const handleResponderMove = useCallback(\n (e: any, thumbType?: \"min\" | \"max\") => {\n if (disabled || !trackRef.current) return;\n\n const locationX = e.nativeEvent?.locationX ?? e.nativeEvent?.pageX ?? 0;\n const rect = trackRef.current.getBoundingClientRect?.() || {\n width: 100,\n left: 0,\n };\n const percentage = Math.max(0, Math.min(1, locationX / rect.width));\n const rawValue = min + percentage * (max - min);\n const newValue = Math.round(rawValue / step) * step;\n\n if (range) {\n const thumb = thumbType || activeThumb;\n if (thumb === \"min\") {\n const clampedValue = Math.min(newValue, rangeMax - step);\n setRangeMin(clampedValue);\n onRangeChange?.(clampedValue, rangeMax);\n } else if (thumb === \"max\") {\n const clampedValue = Math.max(newValue, rangeMin + step);\n setRangeMax(clampedValue);\n onRangeChange?.(rangeMin, clampedValue);\n }\n } else {\n const clampedValue = Math.max(min, Math.min(max, newValue));\n setValue(clampedValue);\n onChange?.(clampedValue);\n }\n },\n [\n disabled,\n min,\n max,\n step,\n range,\n activeThumb,\n rangeMin,\n rangeMax,\n onChange,\n onRangeChange,\n ]\n );\n\n const handleResponderRelease = useCallback(() => {\n setActiveThumb(null);\n }, []);\n\n // Input change handlers\n const handleInputChange = (\n e: React.ChangeEvent<HTMLInputElement>,\n type: \"single\" | \"min\" | \"max\"\n ) => {\n const inputValue = e.target.value;\n const numValue = parseFloat(inputValue);\n\n if (isNaN(numValue)) return;\n\n const clampedValue = Math.max(min, Math.min(max, numValue));\n\n if (type === \"single\") {\n setValue(clampedValue);\n onChange?.(clampedValue);\n } else if (type === \"min\") {\n const newMin = Math.min(clampedValue, rangeMax - step);\n setRangeMin(newMin);\n onRangeChange?.(newMin, rangeMax);\n } else {\n const newMax = Math.max(clampedValue, rangeMin + step);\n setRangeMax(newMax);\n onRangeChange?.(rangeMin, newMax);\n }\n };\n\n // Handle keyboard navigation in input fields (ArrowUp/ArrowDown)\n const handleInputKeyDown = (\n e: React.KeyboardEvent<HTMLInputElement>,\n type: \"single\" | \"min\" | \"max\"\n ) => {\n if (disabled) return;\n\n const stepValue = e.shiftKey ? step * 10 : step;\n let handled = false;\n\n if (e.key === \"ArrowUp\") {\n if (type === \"single\") {\n const newValue = Math.min(value + stepValue, max);\n setValue(newValue);\n onChange?.(newValue);\n } else if (type === \"min\") {\n const newValue = Math.min(rangeMin + stepValue, rangeMax - step);\n setRangeMin(newValue);\n onRangeChange?.(newValue, rangeMax);\n } else {\n const newValue = Math.min(rangeMax + stepValue, max);\n setRangeMax(newValue);\n onRangeChange?.(rangeMin, newValue);\n }\n handled = true;\n } else if (e.key === \"ArrowDown\") {\n if (type === \"single\") {\n const newValue = Math.max(value - stepValue, min);\n setValue(newValue);\n onChange?.(newValue);\n } else if (type === \"min\") {\n const newValue = Math.max(rangeMin - stepValue, min);\n setRangeMin(newValue);\n onRangeChange?.(newValue, rangeMax);\n } else {\n const newValue = Math.max(rangeMax - stepValue, rangeMin + step);\n setRangeMax(newValue);\n onRangeChange?.(rangeMin, newValue);\n }\n handled = true;\n }\n\n if (handled) {\n e.preventDefault();\n }\n };\n\n // Round to nearest step on blur (per Figma spec)\n const handleInputBlur = (type: \"single\" | \"min\" | \"max\") => {\n if (type === \"single\") {\n const rounded = Math.round(value / step) * step;\n const clampedRounded = Math.max(min, Math.min(max, rounded));\n if (clampedRounded !== value) {\n setValue(clampedRounded);\n onChange?.(clampedRounded);\n }\n } else if (type === \"min\") {\n const rounded = Math.round(rangeMin / step) * step;\n const clampedRounded = Math.max(min, Math.min(rangeMax - step, rounded));\n if (clampedRounded !== rangeMin) {\n setRangeMin(clampedRounded);\n onRangeChange?.(clampedRounded, rangeMax);\n }\n } else {\n const rounded = Math.round(rangeMax / step) * step;\n const clampedRounded = Math.max(rangeMin + step, Math.min(max, rounded));\n if (clampedRounded !== rangeMax) {\n setRangeMax(clampedRounded);\n onRangeChange?.(rangeMin, clampedRounded);\n }\n }\n };\n\n // Calculate percentages\n const singlePercentage = ((value - min) / (max - min)) * 100;\n const rangeMinPercentage = ((rangeMin - min) / (max - min)) * 100;\n const rangeMaxPercentage = ((rangeMax - min) / (max - min)) * 100;\n\n // Input field component using the Input component\n const renderInput = (\n inputValue: number,\n type: \"single\" | \"min\" | \"max\",\n position: \"left\" | \"right\"\n ) => {\n // Determine icon position - defaults to same side as input position\n const effectiveIconPosition = iconInsidePosition || position;\n const inputIconLeft =\n iconInside && effectiveIconPosition === \"left\" ? iconInside : undefined;\n const inputIconRight =\n iconInside && effectiveIconPosition === \"right\" ? iconInside : undefined;\n\n // Calculate input width - increase when iconInside is provided\n const inputWidth = iconInside\n ? sizing.inputWidth + sizing.inputIconSize + sizing.inputIconGap\n : sizing.inputWidth;\n\n return (\n <Box width={inputWidth} flexShrink={0}>\n <Input\n value={String(inputValue)}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n handleInputChange(e, type)\n }\n onBlur={() => handleInputBlur(type)}\n onKeyDown={(e: React.KeyboardEvent<HTMLInputElement>) =>\n handleInputKeyDown(e, type)\n }\n disabled={disabled}\n size={size}\n inputMode=\"numeric\"\n iconLeft={inputIconLeft}\n iconRight={inputIconRight}\n aria-label={\n type === \"single\"\n ? \"Slider value\"\n : type === \"min\"\n ? \"Minimum value\"\n : \"Maximum value\"\n }\n style={{\n textAlign: \"center\",\n }}\n />\n </Box>\n );\n };\n\n // Thumb component\n const renderThumb = (percentage: number, thumbType?: \"min\" | \"max\") => {\n const isActive = activeThumb === thumbType;\n const thumbHovered = isHovered || isActive;\n\n // Determine current value for this thumb\n const currentValue = range\n ? thumbType === \"min\"\n ? rangeMin\n : rangeMax\n : value;\n\n // Determine aria-label for this thumb\n const thumbAriaLabel = range\n ? thumbType === \"min\"\n ? minThumbAriaLabel\n : maxThumbAriaLabel\n : ariaLabel || label || \"Slider value\";\n\n // Determine background color based on hover state\n const currentThumbBg =\n thumbHovered && !disabled ? thumbBgHoverColor : thumbBgColor;\n\n // For disabled state, we need white background with colored overlay\n // to prevent the track from showing through\n const thumbBaseBg = disabled\n ? theme.colors.background.primary\n : currentThumbBg;\n\n return (\n <Box\n role=\"slider\"\n tabIndex={disabled ? -1 : 0}\n aria-label={thumbAriaLabel}\n aria-labelledby={label ? labelId : undefined}\n aria-disabled={disabled || undefined}\n testID={thumbType ? `slider-thumb-${thumbType}` : \"slider-thumb\"}\n data-testid={thumbType ? `slider-thumb-${thumbType}` : \"slider-thumb\"}\n position=\"absolute\"\n left={`${percentage}%`}\n width={sizing.thumbSize}\n height={sizing.thumbSize}\n backgroundColor={thumbBaseBg}\n borderRadius={sizing.thumbSize / 2}\n zIndex={isActive ? 3 : 2}\n cursor={disabled ? \"not-allowed\" : \"grab\"}\n // Web events\n onMouseDown={\n isWeb\n ? (e: React.MouseEvent) => handleMouseDown(e, thumbType || \"track\")\n : undefined\n }\n onKeyDown={(e: React.KeyboardEvent) => handleKeyDown(e, thumbType)}\n // React Native responder events\n onMoveShouldSetResponder={() => !disabled}\n onResponderGrant={(e: any) => handleResponderGrant(e, thumbType)}\n onResponderMove={(e: any) => handleResponderMove(e, thumbType)}\n onResponderRelease={handleResponderRelease}\n onResponderTerminate={handleResponderRelease}\n style={{\n top: \"50%\",\n transform:\n thumbHovered && !disabled\n ? \"translate(-50%, -50%) scale(1.1)\"\n : \"translate(-50%, -50%)\",\n boxShadow: disabled ? \"none\" : thumbShadow,\n transition: \"transform 0.1s ease, background-color 0.1s ease\",\n boxSizing: \"border-box\",\n outline: \"none\",\n // Accessibility attributes passed via style for native compatibility\n \"--aria-valuenow\": currentValue,\n \"--aria-valuemin\":\n range && thumbType === \"max\" ? rangeMin + step : min,\n \"--aria-valuemax\":\n range && thumbType === \"min\" ? rangeMax - step : max,\n \"--aria-orientation\": \"horizontal\",\n }}\n aria-valuenow={currentValue}\n aria-valuemin={range && thumbType === \"max\" ? rangeMin + step : min}\n aria-valuemax={range && thumbType === \"min\" ? rangeMax - step : max}\n aria-orientation=\"horizontal\"\n >\n {/* Disabled state overlay - white base with colored overlay */}\n {disabled && (\n <Box\n position=\"absolute\"\n width={sizing.thumbSize}\n height={sizing.thumbSize}\n backgroundColor={disabledColor}\n borderRadius={sizing.thumbSize / 2}\n style={{\n top: 0,\n left: 0,\n }}\n />\n )}\n </Box>\n );\n };\n\n return (\n <Box\n flexDirection=\"column\"\n gap={8}\n width=\"100%\"\n testID={testID}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n >\n {label && (\n <Text\n id={labelId}\n color={theme.colors.content.secondary}\n fontSize={sizing.fontSize - 2}\n >\n {label}\n </Text>\n )}\n\n <Box\n flexDirection=\"row\"\n alignItems=\"center\"\n gap={sizing.gap}\n height={sizing.height}\n >\n {/* Left input (for single or range min) */}\n {(inputPosition === \"left\" || inputPosition === \"both\") &&\n (range\n ? renderInput(rangeMin, \"min\", \"left\")\n : renderInput(value, \"single\", \"left\"))}\n\n {/* Left icon */}\n {iconLeft && (\n <Box\n flexShrink={0}\n width={sizing.iconSize}\n height={sizing.iconSize}\n alignItems=\"center\"\n justifyContent=\"center\"\n opacity={disabled ? 0.5 : 1}\n >\n {iconLeft}\n </Box>\n )}\n\n {/* Min label */}\n {showLabels && (\n <Text\n color={disabled ? inputColors.textDisable : inputColors.text}\n fontSize={sizing.fontSize}\n flexShrink={0}\n >\n {min}\n </Text>\n )}\n\n {/* Track container with padding for thumb space at edges */}\n <Box\n flex={1}\n paddingHorizontal={sizing.thumbSize / 2}\n height={sizing.height}\n alignItems=\"center\"\n justifyContent=\"center\"\n >\n <Box\n ref={trackRef}\n width=\"100%\"\n height={sizing.trackHeight}\n backgroundColor={disabled ? trackBgDisabled : trackBgColor}\n borderRadius={100}\n position=\"relative\"\n cursor={disabled ? \"not-allowed\" : \"pointer\"}\n testID=\"slider-track\"\n data-testid=\"slider-track\"\n // Web events (passed through to underlying div)\n onMouseDown={\n isWeb\n ? (e: React.MouseEvent) => handleMouseDown(e, \"track\")\n : undefined\n }\n // React Native responder events\n onMoveShouldSetResponder={() => !disabled}\n onResponderGrant={(e: any) => handleResponderGrant(e, \"track\")}\n onResponderMove={(e: any) => handleResponderMove(e)}\n onResponderRelease={handleResponderRelease}\n onResponderTerminate={handleResponderRelease}\n >\n {range ? (\n <>\n {/* Range fill */}\n <Box\n position=\"absolute\"\n left={`${rangeMinPercentage}%`}\n top={0}\n height=\"100%\"\n width={`${rangeMaxPercentage - rangeMinPercentage}%`}\n backgroundColor={fillColor}\n borderRadius={100}\n />\n {/* Min thumb */}\n {renderThumb(rangeMinPercentage, \"min\")}\n {/* Max thumb */}\n {renderThumb(rangeMaxPercentage, \"max\")}\n </>\n ) : (\n <>\n {/* Single fill */}\n <Box\n position=\"absolute\"\n left={0}\n top={0}\n height=\"100%\"\n width={`${singlePercentage}%`}\n backgroundColor={fillColor}\n borderRadius={100}\n />\n {/* Single thumb */}\n {renderThumb(singlePercentage)}\n </>\n )}\n </Box>\n </Box>\n\n {/* Max label */}\n {showLabels && (\n <Text\n color={disabled ? inputColors.textDisable : inputColors.text}\n fontSize={sizing.fontSize}\n flexShrink={0}\n >\n {max}\n </Text>\n )}\n\n {/* Right icon */}\n {iconRight && (\n <Box\n flexShrink={0}\n width={sizing.iconSize}\n height={sizing.iconSize}\n alignItems=\"center\"\n justifyContent=\"center\"\n opacity={disabled ? 0.5 : 1}\n >\n {iconRight}\n </Box>\n )}\n\n {/* Right input (for single or range max) */}\n {(inputPosition === \"right\" || inputPosition === \"both\") &&\n (range\n ? renderInput(rangeMax, \"max\", \"right\")\n : renderInput(value, \"single\", \"right\"))}\n </Box>\n </Box>\n );\n};\n","import React from \"react\";\nimport {\n View,\n Pressable,\n Image,\n ViewStyle,\n ImageStyle,\n DimensionValue,\n AnimatableNumericValue,\n} from \"react-native\";\nimport { BoxProps } from \"@xsolla/xui-primitives-core\";\n\nexport const Box: React.FC<BoxProps> = ({\n children,\n onPress,\n onLayout,\n onMoveShouldSetResponder,\n onResponderGrant,\n onResponderMove,\n onResponderRelease,\n onResponderTerminate,\n backgroundColor,\n borderColor,\n borderWidth,\n borderBottomWidth,\n borderBottomColor,\n borderTopWidth,\n borderTopColor,\n borderLeftWidth,\n borderLeftColor,\n borderRightWidth,\n borderRightColor,\n borderRadius,\n borderStyle,\n height,\n padding,\n paddingHorizontal,\n paddingVertical,\n margin,\n marginTop,\n marginBottom,\n marginLeft,\n marginRight,\n flexDirection,\n alignItems,\n justifyContent,\n position,\n top,\n bottom,\n left,\n right,\n width,\n minWidth,\n minHeight,\n maxWidth,\n maxHeight,\n flex,\n overflow,\n zIndex,\n hoverStyle,\n pressStyle,\n style,\n \"data-testid\": dataTestId,\n testID,\n as,\n src,\n alt,\n ...rest\n}) => {\n const getContainerStyle = (pressed?: boolean): ViewStyle => ({\n backgroundColor:\n pressed && pressStyle?.backgroundColor\n ? pressStyle.backgroundColor\n : backgroundColor,\n borderColor,\n borderWidth,\n borderBottomWidth,\n borderBottomColor,\n borderTopWidth,\n borderTopColor,\n borderLeftWidth,\n borderLeftColor,\n borderRightWidth,\n borderRightColor,\n borderRadius: borderRadius as AnimatableNumericValue,\n borderStyle: borderStyle as ViewStyle[\"borderStyle\"],\n overflow,\n zIndex,\n height: height as DimensionValue,\n width: width as DimensionValue,\n minWidth: minWidth as DimensionValue,\n minHeight: minHeight as DimensionValue,\n maxWidth: maxWidth as DimensionValue,\n maxHeight: maxHeight as DimensionValue,\n padding: padding as DimensionValue,\n paddingHorizontal: paddingHorizontal as DimensionValue,\n paddingVertical: paddingVertical as DimensionValue,\n margin: margin as DimensionValue,\n marginTop: marginTop as DimensionValue,\n marginBottom: marginBottom as DimensionValue,\n marginLeft: marginLeft as DimensionValue,\n marginRight: marginRight as DimensionValue,\n flexDirection,\n alignItems,\n justifyContent,\n position: position as ViewStyle[\"position\"],\n top: top as DimensionValue,\n bottom: bottom as DimensionValue,\n left: left as DimensionValue,\n right: right as DimensionValue,\n flex,\n ...(style as ViewStyle),\n });\n\n const finalTestID = dataTestId || testID;\n\n // Destructure and drop web-only props from rest before passing to RN components\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const {\n role,\n tabIndex,\n onKeyDown,\n onKeyUp,\n \"aria-label\": _ariaLabel,\n \"aria-labelledby\": _ariaLabelledBy,\n \"aria-current\": _ariaCurrent,\n \"aria-disabled\": _ariaDisabled,\n \"aria-live\": _ariaLive,\n className,\n \"data-testid\": _dataTestId,\n ...nativeRest\n } = rest as Record<string, unknown>;\n\n // Handle as=\"img\" for React Native\n if (as === \"img\" && src) {\n const imageStyle: ImageStyle = {\n width: width as DimensionValue,\n height: height as DimensionValue,\n borderRadius: borderRadius as number,\n position: position as ImageStyle[\"position\"],\n top: top as DimensionValue,\n bottom: bottom as DimensionValue,\n left: left as DimensionValue,\n right: right as DimensionValue,\n ...(style as ImageStyle),\n };\n\n return (\n <Image\n source={{ uri: src }}\n style={imageStyle}\n testID={finalTestID}\n resizeMode=\"cover\"\n {...nativeRest}\n />\n );\n }\n\n if (onPress) {\n return (\n <Pressable\n onPress={onPress}\n onLayout={onLayout}\n onMoveShouldSetResponder={onMoveShouldSetResponder}\n onResponderGrant={onResponderGrant}\n onResponderMove={onResponderMove}\n onResponderRelease={onResponderRelease}\n onResponderTerminate={onResponderTerminate}\n style={({ pressed }) => getContainerStyle(pressed)}\n testID={finalTestID}\n {...nativeRest}\n >\n {children}\n </Pressable>\n );\n }\n\n return (\n <View\n style={getContainerStyle()}\n testID={finalTestID}\n onLayout={onLayout}\n onMoveShouldSetResponder={onMoveShouldSetResponder}\n onResponderGrant={onResponderGrant}\n onResponderMove={onResponderMove}\n onResponderRelease={onResponderRelease}\n onResponderTerminate={onResponderTerminate}\n {...nativeRest}\n >\n {children}\n </View>\n );\n};\n","import React from \"react\";\nimport {\n Text as RNText,\n TextStyle,\n AccessibilityRole,\n StyleSheet,\n} from \"react-native\";\nimport { TextProps } from \"@xsolla/xui-primitives-core\";\n\nconst roleMap: Record<string, AccessibilityRole> = {\n alert: \"alert\",\n heading: \"header\",\n button: \"button\",\n link: \"link\",\n text: \"text\",\n};\n\nconst parseNumericValue = (\n value: string | number | undefined\n): number | undefined => {\n if (value === undefined) return undefined;\n if (typeof value === \"number\") return value;\n const parsed = parseFloat(value);\n return isNaN(parsed) ? undefined : parsed;\n};\n\nexport const Text: React.FC<TextProps> = ({\n children,\n color,\n fontSize,\n fontWeight,\n fontFamily,\n textAlign,\n lineHeight,\n numberOfLines,\n id,\n role,\n style: styleProp,\n ...props\n}) => {\n let resolvedFontFamily = fontFamily\n ? fontFamily.split(\",\")[0].replace(/['\"]/g, \"\").trim()\n : undefined;\n\n if (\n resolvedFontFamily === \"Pilat Wide\" ||\n resolvedFontFamily === \"Pilat Wide Bold\" ||\n resolvedFontFamily === \"Aktiv Grotesk\"\n ) {\n resolvedFontFamily = undefined;\n }\n\n const incomingStyle = StyleSheet.flatten(styleProp) as TextStyle | undefined;\n\n const baseStyle: TextStyle = {\n color: color ?? incomingStyle?.color,\n fontSize: typeof fontSize === \"number\" ? fontSize : undefined,\n fontWeight: fontWeight as TextStyle[\"fontWeight\"],\n fontFamily: resolvedFontFamily,\n textDecorationLine: props.textDecoration as TextStyle[\"textDecorationLine\"],\n textAlign: textAlign ?? incomingStyle?.textAlign,\n lineHeight: parseNumericValue(lineHeight ?? incomingStyle?.lineHeight),\n marginTop: parseNumericValue(\n incomingStyle?.marginTop as number | string | undefined\n ),\n marginBottom: parseNumericValue(\n incomingStyle?.marginBottom as number | string | undefined\n ),\n };\n\n const accessibilityRole = role ? roleMap[role] : undefined;\n\n return (\n <RNText\n style={baseStyle}\n numberOfLines={numberOfLines}\n testID={id}\n accessibilityRole={accessibilityRole}\n >\n {children}\n </RNText>\n );\n};\n","export * from \"./Box\";\nexport * from \"./Text\";\nexport * from \"./Spinner\";\nexport * from \"./Icon\";\nexport * from \"./Divider\";\nexport * from \"./Input\";\nexport * from \"./TextArea\";\nexport * from \"./LinearGradient\";\n\nexport const isWeb = false;\nexport const isNative = true;\n"],"mappings":"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","names":["import_react_native","import_jsx_runtime","RNText","import_jsx_runtime"]}
|
|
1
|
+
{"version":3,"sources":["../../src/index.tsx","../../src/Slider.tsx","../../../../foundation/primitives-native/src/Box.tsx","../../../../foundation/primitives-native/src/Text.tsx","../../../../foundation/primitives-native/src/index.tsx"],"sourcesContent":["export * from \"./Slider\";\n","import React, { useState, useRef, useEffect, useCallback } from \"react\";\n// @ts-expect-error - this will be resolved at build time\nimport { Box, Text, isWeb } from \"@xsolla/xui-primitives\";\nimport {\n useResolvedTheme,\n useId,\n type ThemeOverrideProps,\n} from \"@xsolla/xui-core\";\nimport { Input } from \"@xsolla/xui-input\";\n\n/**\n * Available color options from the design system.\n */\nexport type SliderColorScheme =\n | \"brand\"\n | \"brandExtra\"\n | \"success\"\n | \"warning\"\n | \"alert\"\n | \"neutral\";\n\nexport interface SliderProps extends ThemeOverrideProps {\n /**\n * Current value for single slider mode.\n */\n value?: number;\n /**\n * Minimum value of the range (for range mode).\n */\n minValue?: number;\n /**\n * Maximum value of the range (for range mode).\n */\n maxValue?: number;\n /**\n * Minimum bound of the slider.\n */\n min?: number;\n /**\n * Maximum bound of the slider.\n */\n max?: number;\n /**\n * Step increment.\n */\n step?: number;\n /**\n * Callback for single value changes.\n */\n onChange?: (value: number) => void;\n /**\n * Callback for range value changes (min, max).\n */\n onRangeChange?: (minValue: number, maxValue: number) => void;\n /**\n * Size variant.\n */\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\";\n /**\n * Whether the slider is disabled.\n */\n disabled?: boolean;\n /**\n * Enable range mode with two thumbs.\n */\n range?: boolean;\n /**\n * Position of input field(s).\n */\n inputPosition?: \"left\" | \"right\" | \"both\" | \"none\";\n /**\n * Show min/max labels next to the track.\n */\n showLabels?: boolean;\n /**\n * Label text (displayed above the slider).\n */\n label?: string;\n /**\n * Color scheme for the active/filled portion of the track and thumb.\n * Uses colors from the design system.\n * @default \"brand\"\n */\n activeColor?: SliderColorScheme;\n /**\n * Test identifier.\n */\n testID?: string;\n /**\n * Accessible label for the slider (used when no visible label).\n */\n \"aria-label\"?: string;\n /**\n * Accessible label for the minimum thumb in range mode.\n */\n minThumbAriaLabel?: string;\n /**\n * Accessible label for the maximum thumb in range mode.\n */\n maxThumbAriaLabel?: string;\n /**\n * Icon to display on the left side of the slider.\n */\n iconLeft?: React.ReactNode;\n /**\n * Icon to display on the right side of the slider.\n */\n iconRight?: React.ReactNode;\n /**\n * Icon to display inside the input field.\n * Only works when inputPosition is not 'none'.\n */\n iconInside?: React.ReactNode;\n /**\n * Position of the icon inside the input field.\n * Defaults to the same side as inputPosition.\n */\n iconInsidePosition?: \"left\" | \"right\";\n}\n\n// Size configurations matching Figma design\nconst sizeConfig = {\n xl: {\n height: 56,\n trackHeight: 8,\n thumbSize: 20,\n inputWidth: 72,\n inputHeight: 56,\n fontSize: 16,\n gap: 24,\n iconSize: 24,\n inputIconSize: 18,\n inputIconGap: 10,\n },\n lg: {\n height: 48,\n trackHeight: 6,\n thumbSize: 18,\n inputWidth: 64,\n inputHeight: 48,\n fontSize: 14,\n gap: 20,\n iconSize: 20,\n inputIconSize: 18,\n inputIconGap: 10,\n },\n md: {\n height: 40,\n trackHeight: 6,\n thumbSize: 16,\n inputWidth: 56,\n inputHeight: 40,\n fontSize: 14,\n gap: 16,\n iconSize: 18,\n inputIconSize: 18,\n inputIconGap: 10,\n },\n sm: {\n height: 32,\n trackHeight: 4,\n thumbSize: 14,\n inputWidth: 48,\n inputHeight: 32,\n fontSize: 12,\n gap: 12,\n iconSize: 16,\n inputIconSize: 16,\n inputIconGap: 10,\n },\n};\n\nexport const Slider: React.FC<SliderProps> = ({\n value: propValue = 0,\n minValue: propMinValue,\n maxValue: propMaxValue,\n min = 0,\n max = 100,\n step = 1,\n onChange,\n onRangeChange,\n size = \"md\",\n disabled = false,\n range = false,\n inputPosition = \"none\",\n showLabels = false,\n label,\n activeColor: activeColorProp,\n testID,\n \"aria-label\": ariaLabel,\n minThumbAriaLabel = \"Minimum value\",\n maxThumbAriaLabel = \"Maximum value\",\n iconLeft,\n iconRight,\n iconInside,\n iconInsidePosition,\n themeMode,\n themeProductContext,\n}) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n\n // Generate unique IDs for accessibility\n const rawId = useId();\n const safeId = rawId.replace(/:/g, \"\");\n const sliderId = `slider-${safeId}`;\n const labelId = `${sliderId}-label`;\n\n // Single value state\n const [value, setValue] = useState(propValue);\n\n // Range values state\n const [rangeMin, setRangeMin] = useState(propMinValue ?? min);\n const [rangeMax, setRangeMax] = useState(propMaxValue ?? max);\n\n // Hover states\n const [isHovered, setIsHovered] = useState(false);\n const [activeThumb, setActiveThumb] = useState<\"min\" | \"max\" | null>(null);\n\n const trackRef = useRef<any>(null);\n\n // Sync with props\n useEffect(() => {\n setValue(propValue);\n }, [propValue]);\n\n useEffect(() => {\n if (propMinValue !== undefined) setRangeMin(propMinValue);\n }, [propMinValue]);\n\n useEffect(() => {\n if (propMaxValue !== undefined) setRangeMax(propMaxValue);\n }, [propMaxValue]);\n\n const sizing = sizeConfig[size];\n\n // Colors from theme\n const disabledColor = theme.colors.control.check.bgDisable;\n const inputColors = theme.colors.control.input;\n const trackBgColor = inputColors.bg; // rgba(0, 0, 0, 0.07)\n const trackBgDisabled = inputColors.bgDisable;\n\n // Helper to get colors from theme based on scheme\n // Control colors only exist for brand, brandExtra, alert\n // For success, warning, neutral - use background colors (consistent with Tag component)\n const getColorsFromScheme = (\n scheme: SliderColorScheme\n ): { bg: string; bgHover: string } => {\n const controlColors = theme.colors.control as any;\n const backgroundColors = theme.colors.background as any;\n\n // Check if scheme exists in control colors (brand, brandExtra, alert)\n const control = controlColors[scheme]?.primary;\n if (control?.bg) {\n return { bg: control.bg, bgHover: control.bgHover || control.bg };\n }\n\n // For success, warning, neutral - use background colors (like Tag component)\n const background = backgroundColors[scheme];\n if (background?.primary) {\n return { bg: background.primary, bgHover: background.primary };\n }\n\n // Fallback to brand\n return {\n bg: controlColors.brand.primary.bg,\n bgHover: controlColors.brand.primary.bgHover,\n };\n };\n\n // Active line and thumb color: use prop scheme, or default to brand\n const activeScheme = activeColorProp || \"brand\";\n const activeColors = getColorsFromScheme(activeScheme);\n const fillColor = disabled ? disabledColor : activeColors.bg;\n const thumbBgColor = disabled ? disabledColor : activeColors.bg;\n const thumbBgHoverColor = disabled ? disabledColor : activeColors.bgHover;\n\n // Shadow for thumb\n const thumbShadow =\n \"0px 1px 2px rgba(7, 7, 8, 0.2), 0px 1px 3px 1px rgba(7, 7, 8, 0.1)\";\n\n const calculateValue = useCallback(\n (clientX: number) => {\n if (!trackRef.current) return value;\n const rect = trackRef.current.getBoundingClientRect();\n const percentage = Math.max(\n 0,\n Math.min(1, (clientX - rect.left) / rect.width)\n );\n const rawValue = min + percentage * (max - min);\n return Math.round(rawValue / step) * step;\n },\n [min, max, step, value]\n );\n\n const handleSingleMove = useCallback(\n (clientX: number) => {\n if (disabled) return;\n const newValue = calculateValue(clientX);\n setValue(newValue);\n onChange?.(newValue);\n },\n [disabled, calculateValue, onChange]\n );\n\n const handleRangeMove = useCallback(\n (clientX: number, thumb: \"min\" | \"max\") => {\n if (disabled) return;\n const newValue = calculateValue(clientX);\n\n if (thumb === \"min\") {\n const clampedValue = Math.min(newValue, rangeMax - step);\n setRangeMin(clampedValue);\n onRangeChange?.(clampedValue, rangeMax);\n } else {\n const clampedValue = Math.max(newValue, rangeMin + step);\n setRangeMax(clampedValue);\n onRangeChange?.(rangeMin, clampedValue);\n }\n },\n [disabled, calculateValue, rangeMin, rangeMax, step, onRangeChange]\n );\n\n const handleMouseDown = (\n e: React.MouseEvent,\n thumb?: \"min\" | \"max\" | \"track\"\n ) => {\n if (disabled) return;\n\n const clientX = e.clientX;\n\n if (range) {\n // Determine which thumb to move based on click position\n let targetThumb: \"min\" | \"max\" = thumb === \"min\" ? \"min\" : \"max\";\n\n if (thumb === \"track\") {\n // Click on track - determine closest thumb\n const clickValue = calculateValue(clientX);\n const distToMin = Math.abs(clickValue - rangeMin);\n const distToMax = Math.abs(clickValue - rangeMax);\n targetThumb = distToMin < distToMax ? \"min\" : \"max\";\n }\n\n setActiveThumb(targetThumb);\n handleRangeMove(clientX, targetThumb);\n\n const onMouseMove = (moveEvent: MouseEvent) => {\n handleRangeMove(moveEvent.clientX, targetThumb);\n };\n\n const onMouseUp = () => {\n setActiveThumb(null);\n document.removeEventListener(\"mousemove\", onMouseMove);\n document.removeEventListener(\"mouseup\", onMouseUp);\n };\n\n document.addEventListener(\"mousemove\", onMouseMove);\n document.addEventListener(\"mouseup\", onMouseUp);\n } else {\n handleSingleMove(clientX);\n\n const onMouseMove = (moveEvent: MouseEvent) => {\n handleSingleMove(moveEvent.clientX);\n };\n\n const onMouseUp = () => {\n document.removeEventListener(\"mousemove\", onMouseMove);\n document.removeEventListener(\"mouseup\", onMouseUp);\n };\n\n document.addEventListener(\"mousemove\", onMouseMove);\n document.addEventListener(\"mouseup\", onMouseUp);\n }\n };\n\n // Keyboard navigation handlers\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent, thumbType?: \"min\" | \"max\") => {\n if (disabled) return;\n\n const stepValue = e.shiftKey ? step * 10 : step;\n let handled = false;\n\n if (range && thumbType) {\n // Range mode keyboard handling\n if (thumbType === \"min\") {\n if (e.key === \"ArrowRight\" || e.key === \"ArrowUp\") {\n const newValue = Math.min(rangeMin + stepValue, rangeMax - step);\n setRangeMin(newValue);\n onRangeChange?.(newValue, rangeMax);\n handled = true;\n } else if (e.key === \"ArrowLeft\" || e.key === \"ArrowDown\") {\n const newValue = Math.max(rangeMin - stepValue, min);\n setRangeMin(newValue);\n onRangeChange?.(newValue, rangeMax);\n handled = true;\n } else if (e.key === \"Home\") {\n setRangeMin(min);\n onRangeChange?.(min, rangeMax);\n handled = true;\n } else if (e.key === \"End\") {\n const newValue = rangeMax - step;\n setRangeMin(newValue);\n onRangeChange?.(newValue, rangeMax);\n handled = true;\n }\n } else {\n if (e.key === \"ArrowRight\" || e.key === \"ArrowUp\") {\n const newValue = Math.min(rangeMax + stepValue, max);\n setRangeMax(newValue);\n onRangeChange?.(rangeMin, newValue);\n handled = true;\n } else if (e.key === \"ArrowLeft\" || e.key === \"ArrowDown\") {\n const newValue = Math.max(rangeMax - stepValue, rangeMin + step);\n setRangeMax(newValue);\n onRangeChange?.(rangeMin, newValue);\n handled = true;\n } else if (e.key === \"Home\") {\n const newValue = rangeMin + step;\n setRangeMax(newValue);\n onRangeChange?.(rangeMin, newValue);\n handled = true;\n } else if (e.key === \"End\") {\n setRangeMax(max);\n onRangeChange?.(rangeMin, max);\n handled = true;\n }\n }\n } else {\n // Single slider keyboard handling\n if (e.key === \"ArrowRight\" || e.key === \"ArrowUp\") {\n const newValue = Math.min(value + stepValue, max);\n setValue(newValue);\n onChange?.(newValue);\n handled = true;\n } else if (e.key === \"ArrowLeft\" || e.key === \"ArrowDown\") {\n const newValue = Math.max(value - stepValue, min);\n setValue(newValue);\n onChange?.(newValue);\n handled = true;\n } else if (e.key === \"Home\") {\n setValue(min);\n onChange?.(min);\n handled = true;\n } else if (e.key === \"End\") {\n setValue(max);\n onChange?.(max);\n handled = true;\n }\n }\n\n if (handled) {\n e.preventDefault();\n }\n },\n [\n disabled,\n range,\n step,\n min,\n max,\n value,\n rangeMin,\n rangeMax,\n onChange,\n onRangeChange,\n ]\n );\n\n // React Native responder event handlers\n const handleResponderGrant = useCallback(\n (e: any, thumbType?: \"min\" | \"max\" | \"track\") => {\n if (disabled) return;\n\n // Get the location from the touch event\n const locationX = e.nativeEvent?.locationX ?? e.nativeEvent?.pageX ?? 0;\n\n if (range) {\n let targetThumb: \"min\" | \"max\" = thumbType === \"min\" ? \"min\" : \"max\";\n\n if (thumbType === \"track\" && trackRef.current) {\n // Determine closest thumb based on touch position\n const rect = trackRef.current.getBoundingClientRect?.() || {\n width: 100,\n left: 0,\n };\n const percentage = Math.max(0, Math.min(1, locationX / rect.width));\n const touchValue = min + percentage * (max - min);\n const distToMin = Math.abs(touchValue - rangeMin);\n const distToMax = Math.abs(touchValue - rangeMax);\n targetThumb = distToMin < distToMax ? \"min\" : \"max\";\n }\n\n setActiveThumb(targetThumb);\n }\n },\n [disabled, range, min, max, rangeMin, rangeMax]\n );\n\n const handleResponderMove = useCallback(\n (e: any, thumbType?: \"min\" | \"max\") => {\n if (disabled || !trackRef.current) return;\n\n const locationX = e.nativeEvent?.locationX ?? e.nativeEvent?.pageX ?? 0;\n const rect = trackRef.current.getBoundingClientRect?.() || {\n width: 100,\n left: 0,\n };\n const percentage = Math.max(0, Math.min(1, locationX / rect.width));\n const rawValue = min + percentage * (max - min);\n const newValue = Math.round(rawValue / step) * step;\n\n if (range) {\n const thumb = thumbType || activeThumb;\n if (thumb === \"min\") {\n const clampedValue = Math.min(newValue, rangeMax - step);\n setRangeMin(clampedValue);\n onRangeChange?.(clampedValue, rangeMax);\n } else if (thumb === \"max\") {\n const clampedValue = Math.max(newValue, rangeMin + step);\n setRangeMax(clampedValue);\n onRangeChange?.(rangeMin, clampedValue);\n }\n } else {\n const clampedValue = Math.max(min, Math.min(max, newValue));\n setValue(clampedValue);\n onChange?.(clampedValue);\n }\n },\n [\n disabled,\n min,\n max,\n step,\n range,\n activeThumb,\n rangeMin,\n rangeMax,\n onChange,\n onRangeChange,\n ]\n );\n\n const handleResponderRelease = useCallback(() => {\n setActiveThumb(null);\n }, []);\n\n // Input change handlers\n const handleInputChange = (\n e: React.ChangeEvent<HTMLInputElement>,\n type: \"single\" | \"min\" | \"max\"\n ) => {\n const inputValue = e.target.value;\n const numValue = parseFloat(inputValue);\n\n if (isNaN(numValue)) return;\n\n const clampedValue = Math.max(min, Math.min(max, numValue));\n\n if (type === \"single\") {\n setValue(clampedValue);\n onChange?.(clampedValue);\n } else if (type === \"min\") {\n const newMin = Math.min(clampedValue, rangeMax - step);\n setRangeMin(newMin);\n onRangeChange?.(newMin, rangeMax);\n } else {\n const newMax = Math.max(clampedValue, rangeMin + step);\n setRangeMax(newMax);\n onRangeChange?.(rangeMin, newMax);\n }\n };\n\n // Handle keyboard navigation in input fields (ArrowUp/ArrowDown)\n const handleInputKeyDown = (\n e: React.KeyboardEvent<HTMLInputElement>,\n type: \"single\" | \"min\" | \"max\"\n ) => {\n if (disabled) return;\n\n const stepValue = e.shiftKey ? step * 10 : step;\n let handled = false;\n\n if (e.key === \"ArrowUp\") {\n if (type === \"single\") {\n const newValue = Math.min(value + stepValue, max);\n setValue(newValue);\n onChange?.(newValue);\n } else if (type === \"min\") {\n const newValue = Math.min(rangeMin + stepValue, rangeMax - step);\n setRangeMin(newValue);\n onRangeChange?.(newValue, rangeMax);\n } else {\n const newValue = Math.min(rangeMax + stepValue, max);\n setRangeMax(newValue);\n onRangeChange?.(rangeMin, newValue);\n }\n handled = true;\n } else if (e.key === \"ArrowDown\") {\n if (type === \"single\") {\n const newValue = Math.max(value - stepValue, min);\n setValue(newValue);\n onChange?.(newValue);\n } else if (type === \"min\") {\n const newValue = Math.max(rangeMin - stepValue, min);\n setRangeMin(newValue);\n onRangeChange?.(newValue, rangeMax);\n } else {\n const newValue = Math.max(rangeMax - stepValue, rangeMin + step);\n setRangeMax(newValue);\n onRangeChange?.(rangeMin, newValue);\n }\n handled = true;\n }\n\n if (handled) {\n e.preventDefault();\n }\n };\n\n // Round to nearest step on blur (per Figma spec)\n const handleInputBlur = (type: \"single\" | \"min\" | \"max\") => {\n if (type === \"single\") {\n const rounded = Math.round(value / step) * step;\n const clampedRounded = Math.max(min, Math.min(max, rounded));\n if (clampedRounded !== value) {\n setValue(clampedRounded);\n onChange?.(clampedRounded);\n }\n } else if (type === \"min\") {\n const rounded = Math.round(rangeMin / step) * step;\n const clampedRounded = Math.max(min, Math.min(rangeMax - step, rounded));\n if (clampedRounded !== rangeMin) {\n setRangeMin(clampedRounded);\n onRangeChange?.(clampedRounded, rangeMax);\n }\n } else {\n const rounded = Math.round(rangeMax / step) * step;\n const clampedRounded = Math.max(rangeMin + step, Math.min(max, rounded));\n if (clampedRounded !== rangeMax) {\n setRangeMax(clampedRounded);\n onRangeChange?.(rangeMin, clampedRounded);\n }\n }\n };\n\n // Calculate percentages\n const singlePercentage = ((value - min) / (max - min)) * 100;\n const rangeMinPercentage = ((rangeMin - min) / (max - min)) * 100;\n const rangeMaxPercentage = ((rangeMax - min) / (max - min)) * 100;\n\n // Input field component using the Input component\n const renderInput = (\n inputValue: number,\n type: \"single\" | \"min\" | \"max\",\n position: \"left\" | \"right\"\n ) => {\n // Determine icon position - defaults to same side as input position\n const effectiveIconPosition = iconInsidePosition || position;\n const inputIconLeft =\n iconInside && effectiveIconPosition === \"left\" ? iconInside : undefined;\n const inputIconRight =\n iconInside && effectiveIconPosition === \"right\" ? iconInside : undefined;\n\n // Calculate input width - increase when iconInside is provided\n const inputWidth = iconInside\n ? sizing.inputWidth + sizing.inputIconSize + sizing.inputIconGap\n : sizing.inputWidth;\n\n return (\n <Box width={inputWidth} flexShrink={0}>\n <Input\n value={String(inputValue)}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n handleInputChange(e, type)\n }\n onBlur={() => handleInputBlur(type)}\n onKeyDown={(e: React.KeyboardEvent<HTMLInputElement>) =>\n handleInputKeyDown(e, type)\n }\n disabled={disabled}\n size={size}\n inputMode=\"numeric\"\n iconLeft={inputIconLeft}\n iconRight={inputIconRight}\n aria-label={\n type === \"single\"\n ? \"Slider value\"\n : type === \"min\"\n ? \"Minimum value\"\n : \"Maximum value\"\n }\n style={{\n textAlign: \"center\",\n }}\n />\n </Box>\n );\n };\n\n // Thumb component\n const renderThumb = (percentage: number, thumbType?: \"min\" | \"max\") => {\n const isActive = activeThumb === thumbType;\n const thumbHovered = isHovered || isActive;\n\n // Determine current value for this thumb\n const currentValue = range\n ? thumbType === \"min\"\n ? rangeMin\n : rangeMax\n : value;\n\n // Determine aria-label for this thumb\n const thumbAriaLabel = range\n ? thumbType === \"min\"\n ? minThumbAriaLabel\n : maxThumbAriaLabel\n : ariaLabel || label || \"Slider value\";\n\n // Determine background color based on hover state\n const currentThumbBg =\n thumbHovered && !disabled ? thumbBgHoverColor : thumbBgColor;\n\n // For disabled state, we need white background with colored overlay\n // to prevent the track from showing through\n const thumbBaseBg = disabled\n ? theme.colors.background.primary\n : currentThumbBg;\n\n return (\n <Box\n role=\"slider\"\n tabIndex={disabled ? -1 : 0}\n aria-label={thumbAriaLabel}\n aria-labelledby={label ? labelId : undefined}\n aria-disabled={disabled || undefined}\n testID={thumbType ? `slider-thumb-${thumbType}` : \"slider-thumb\"}\n data-testid={thumbType ? `slider-thumb-${thumbType}` : \"slider-thumb\"}\n position=\"absolute\"\n left={`${percentage}%`}\n width={sizing.thumbSize}\n height={sizing.thumbSize}\n backgroundColor={thumbBaseBg}\n borderRadius={sizing.thumbSize / 2}\n zIndex={isActive ? 3 : 2}\n cursor={disabled ? \"not-allowed\" : \"grab\"}\n // Web events\n onMouseDown={\n isWeb\n ? (e: React.MouseEvent) => handleMouseDown(e, thumbType || \"track\")\n : undefined\n }\n onKeyDown={(e: React.KeyboardEvent) => handleKeyDown(e, thumbType)}\n // React Native responder events\n onMoveShouldSetResponder={() => !disabled}\n onResponderGrant={(e: any) => handleResponderGrant(e, thumbType)}\n onResponderMove={(e: any) => handleResponderMove(e, thumbType)}\n onResponderRelease={handleResponderRelease}\n onResponderTerminate={handleResponderRelease}\n style={{\n top: \"50%\",\n transform:\n thumbHovered && !disabled\n ? \"translate(-50%, -50%) scale(1.1)\"\n : \"translate(-50%, -50%)\",\n boxShadow: disabled ? \"none\" : thumbShadow,\n transition: \"transform 0.1s ease, background-color 0.1s ease\",\n boxSizing: \"border-box\",\n outline: \"none\",\n // Accessibility attributes passed via style for native compatibility\n \"--aria-valuenow\": currentValue,\n \"--aria-valuemin\":\n range && thumbType === \"max\" ? rangeMin + step : min,\n \"--aria-valuemax\":\n range && thumbType === \"min\" ? rangeMax - step : max,\n \"--aria-orientation\": \"horizontal\",\n }}\n aria-valuenow={currentValue}\n aria-valuemin={range && thumbType === \"max\" ? rangeMin + step : min}\n aria-valuemax={range && thumbType === \"min\" ? rangeMax - step : max}\n aria-orientation=\"horizontal\"\n >\n {/* Disabled state overlay - white base with colored overlay */}\n {disabled && (\n <Box\n position=\"absolute\"\n width={sizing.thumbSize}\n height={sizing.thumbSize}\n backgroundColor={disabledColor}\n borderRadius={sizing.thumbSize / 2}\n style={{\n top: 0,\n left: 0,\n }}\n />\n )}\n </Box>\n );\n };\n\n return (\n <Box\n flexDirection=\"column\"\n gap={8}\n width=\"100%\"\n testID={testID}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n >\n {label && (\n <Text\n id={labelId}\n color={theme.colors.content.secondary}\n fontSize={sizing.fontSize - 2}\n >\n {label}\n </Text>\n )}\n\n <Box\n flexDirection=\"row\"\n alignItems=\"center\"\n gap={sizing.gap}\n height={sizing.height}\n >\n {/* Left input (for single or range min) */}\n {(inputPosition === \"left\" || inputPosition === \"both\") &&\n (range\n ? renderInput(rangeMin, \"min\", \"left\")\n : renderInput(value, \"single\", \"left\"))}\n\n {/* Left icon */}\n {iconLeft && (\n <Box\n flexShrink={0}\n width={sizing.iconSize}\n height={sizing.iconSize}\n alignItems=\"center\"\n justifyContent=\"center\"\n opacity={disabled ? 0.5 : 1}\n >\n {iconLeft}\n </Box>\n )}\n\n {/* Min label */}\n {showLabels && (\n <Text\n color={disabled ? inputColors.textDisable : inputColors.text}\n fontSize={sizing.fontSize}\n flexShrink={0}\n >\n {min}\n </Text>\n )}\n\n {/* Track container with padding for thumb space at edges */}\n <Box\n flex={1}\n paddingHorizontal={sizing.thumbSize / 2}\n height={sizing.height}\n alignItems=\"center\"\n justifyContent=\"center\"\n >\n <Box\n ref={trackRef}\n width=\"100%\"\n height={sizing.trackHeight}\n backgroundColor={disabled ? trackBgDisabled : trackBgColor}\n borderRadius={100}\n position=\"relative\"\n cursor={disabled ? \"not-allowed\" : \"pointer\"}\n testID=\"slider-track\"\n data-testid=\"slider-track\"\n // Web events (passed through to underlying div)\n onMouseDown={\n isWeb\n ? (e: React.MouseEvent) => handleMouseDown(e, \"track\")\n : undefined\n }\n // React Native responder events\n onMoveShouldSetResponder={() => !disabled}\n onResponderGrant={(e: any) => handleResponderGrant(e, \"track\")}\n onResponderMove={(e: any) => handleResponderMove(e)}\n onResponderRelease={handleResponderRelease}\n onResponderTerminate={handleResponderRelease}\n >\n {range ? (\n <>\n {/* Range fill */}\n <Box\n position=\"absolute\"\n left={`${rangeMinPercentage}%`}\n top={0}\n height=\"100%\"\n width={`${rangeMaxPercentage - rangeMinPercentage}%`}\n backgroundColor={fillColor}\n borderRadius={100}\n />\n {/* Min thumb */}\n {renderThumb(rangeMinPercentage, \"min\")}\n {/* Max thumb */}\n {renderThumb(rangeMaxPercentage, \"max\")}\n </>\n ) : (\n <>\n {/* Single fill */}\n <Box\n position=\"absolute\"\n left={0}\n top={0}\n height=\"100%\"\n width={`${singlePercentage}%`}\n backgroundColor={fillColor}\n borderRadius={100}\n />\n {/* Single thumb */}\n {renderThumb(singlePercentage)}\n </>\n )}\n </Box>\n </Box>\n\n {/* Max label */}\n {showLabels && (\n <Text\n color={disabled ? inputColors.textDisable : inputColors.text}\n fontSize={sizing.fontSize}\n flexShrink={0}\n >\n {max}\n </Text>\n )}\n\n {/* Right icon */}\n {iconRight && (\n <Box\n flexShrink={0}\n width={sizing.iconSize}\n height={sizing.iconSize}\n alignItems=\"center\"\n justifyContent=\"center\"\n opacity={disabled ? 0.5 : 1}\n >\n {iconRight}\n </Box>\n )}\n\n {/* Right input (for single or range max) */}\n {(inputPosition === \"right\" || inputPosition === \"both\") &&\n (range\n ? renderInput(rangeMax, \"max\", \"right\")\n : renderInput(value, \"single\", \"right\"))}\n </Box>\n </Box>\n );\n};\n","import React from \"react\";\nimport {\n View,\n Pressable,\n Image,\n ViewStyle,\n ImageStyle,\n DimensionValue,\n AnimatableNumericValue,\n} from \"react-native\";\nimport { BoxProps } from \"@xsolla/xui-primitives-core\";\n\nexport const Box: React.FC<BoxProps> = ({\n children,\n onPress,\n onLayout,\n onMoveShouldSetResponder,\n onResponderGrant,\n onResponderMove,\n onResponderRelease,\n onResponderTerminate,\n backgroundColor,\n borderColor,\n borderWidth,\n borderBottomWidth,\n borderBottomColor,\n borderTopWidth,\n borderTopColor,\n borderLeftWidth,\n borderLeftColor,\n borderRightWidth,\n borderRightColor,\n borderRadius,\n borderStyle,\n height,\n padding,\n paddingHorizontal,\n paddingVertical,\n margin,\n marginTop,\n marginBottom,\n marginLeft,\n marginRight,\n flexDirection,\n alignItems,\n justifyContent,\n position,\n top,\n bottom,\n left,\n right,\n width,\n minWidth,\n minHeight,\n maxWidth,\n maxHeight,\n flex,\n overflow,\n zIndex,\n hoverStyle,\n pressStyle,\n style,\n \"data-testid\": dataTestId,\n testID,\n as,\n src,\n alt,\n ...rest\n}) => {\n const getContainerStyle = (pressed?: boolean): ViewStyle => ({\n backgroundColor:\n pressed && pressStyle?.backgroundColor\n ? pressStyle.backgroundColor\n : backgroundColor,\n borderColor,\n borderWidth,\n borderBottomWidth,\n borderBottomColor,\n borderTopWidth,\n borderTopColor,\n borderLeftWidth,\n borderLeftColor,\n borderRightWidth,\n borderRightColor,\n borderRadius: borderRadius as AnimatableNumericValue,\n borderStyle: borderStyle as ViewStyle[\"borderStyle\"],\n overflow,\n zIndex,\n height: height as DimensionValue,\n width: width as DimensionValue,\n minWidth: minWidth as DimensionValue,\n minHeight: minHeight as DimensionValue,\n maxWidth: maxWidth as DimensionValue,\n maxHeight: maxHeight as DimensionValue,\n padding: padding as DimensionValue,\n paddingHorizontal: paddingHorizontal as DimensionValue,\n paddingVertical: paddingVertical as DimensionValue,\n margin: margin as DimensionValue,\n marginTop: marginTop as DimensionValue,\n marginBottom: marginBottom as DimensionValue,\n marginLeft: marginLeft as DimensionValue,\n marginRight: marginRight as DimensionValue,\n flexDirection,\n alignItems,\n justifyContent,\n position: position as ViewStyle[\"position\"],\n top: top as DimensionValue,\n bottom: bottom as DimensionValue,\n left: left as DimensionValue,\n right: right as DimensionValue,\n flex,\n ...(style as ViewStyle),\n });\n\n const finalTestID = dataTestId || testID;\n\n // Destructure and drop web-only props from rest before passing to RN components\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const {\n role,\n tabIndex,\n onKeyDown,\n onKeyUp,\n \"aria-label\": _ariaLabel,\n \"aria-labelledby\": _ariaLabelledBy,\n \"aria-current\": _ariaCurrent,\n \"aria-disabled\": _ariaDisabled,\n \"aria-live\": _ariaLive,\n className,\n \"data-testid\": _dataTestId,\n ...nativeRest\n } = rest as Record<string, unknown>;\n\n // Handle as=\"img\" for React Native\n if (as === \"img\" && src) {\n const imageStyle: ImageStyle = {\n width: width as DimensionValue,\n height: height as DimensionValue,\n borderRadius: borderRadius as number,\n position: position as ImageStyle[\"position\"],\n top: top as DimensionValue,\n bottom: bottom as DimensionValue,\n left: left as DimensionValue,\n right: right as DimensionValue,\n ...(style as ImageStyle),\n };\n\n return (\n <Image\n source={{ uri: src }}\n style={imageStyle}\n testID={finalTestID}\n resizeMode=\"cover\"\n {...nativeRest}\n />\n );\n }\n\n if (onPress) {\n return (\n <Pressable\n onPress={onPress}\n onLayout={onLayout}\n onMoveShouldSetResponder={onMoveShouldSetResponder}\n onResponderGrant={onResponderGrant}\n onResponderMove={onResponderMove}\n onResponderRelease={onResponderRelease}\n onResponderTerminate={onResponderTerminate}\n style={({ pressed }) => getContainerStyle(pressed)}\n testID={finalTestID}\n {...nativeRest}\n >\n {children}\n </Pressable>\n );\n }\n\n return (\n <View\n style={getContainerStyle()}\n testID={finalTestID}\n onLayout={onLayout}\n onMoveShouldSetResponder={onMoveShouldSetResponder}\n onResponderGrant={onResponderGrant}\n onResponderMove={onResponderMove}\n onResponderRelease={onResponderRelease}\n onResponderTerminate={onResponderTerminate}\n {...nativeRest}\n >\n {children}\n </View>\n );\n};\n","import React from \"react\";\nimport {\n Text as RNText,\n TextStyle,\n AccessibilityRole,\n StyleSheet,\n} from \"react-native\";\nimport { TextProps } from \"@xsolla/xui-primitives-core\";\n\nconst roleMap: Record<string, AccessibilityRole> = {\n alert: \"alert\",\n heading: \"header\",\n button: \"button\",\n link: \"link\",\n text: \"text\",\n};\n\nconst parseNumericValue = (\n value: string | number | undefined\n): number | undefined => {\n if (value === undefined) return undefined;\n if (typeof value === \"number\") return value;\n const parsed = parseFloat(value);\n return isNaN(parsed) ? undefined : parsed;\n};\n\nexport const Text: React.FC<TextProps> = ({\n children,\n color,\n fontSize,\n fontWeight,\n fontFamily,\n textAlign,\n lineHeight,\n numberOfLines,\n id,\n role,\n testID,\n \"data-testid\": dataTestId,\n style: styleProp,\n ...props\n}) => {\n let resolvedFontFamily = fontFamily\n ? fontFamily.split(\",\")[0].replace(/['\"]/g, \"\").trim()\n : undefined;\n\n if (\n resolvedFontFamily === \"Pilat Wide\" ||\n resolvedFontFamily === \"Pilat Wide Bold\" ||\n resolvedFontFamily === \"Aktiv Grotesk\"\n ) {\n resolvedFontFamily = undefined;\n }\n\n const incomingStyle = StyleSheet.flatten(styleProp) as TextStyle | undefined;\n\n const baseStyle: TextStyle = {\n color: color ?? incomingStyle?.color,\n fontSize: typeof fontSize === \"number\" ? fontSize : undefined,\n fontWeight: fontWeight as TextStyle[\"fontWeight\"],\n fontFamily: resolvedFontFamily,\n textDecorationLine: props.textDecoration as TextStyle[\"textDecorationLine\"],\n textAlign: textAlign ?? incomingStyle?.textAlign,\n lineHeight: parseNumericValue(lineHeight ?? incomingStyle?.lineHeight),\n marginTop: parseNumericValue(\n incomingStyle?.marginTop as number | string | undefined\n ),\n marginBottom: parseNumericValue(\n incomingStyle?.marginBottom as number | string | undefined\n ),\n };\n\n const accessibilityRole = role ? roleMap[role] : undefined;\n\n return (\n <RNText\n style={baseStyle}\n numberOfLines={numberOfLines}\n testID={dataTestId || testID || id}\n accessibilityRole={accessibilityRole}\n >\n {children}\n </RNText>\n );\n};\n","export * from \"./Box\";\nexport * from \"./Text\";\nexport * from \"./Spinner\";\nexport * from \"./Icon\";\nexport * from \"./Divider\";\nexport * from \"./Input\";\nexport * from \"./TextArea\";\nexport * from \"./LinearGradient\";\n\nexport const isWeb = false;\nexport const isNative = true;\n"],"mappings":"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","names":["import_react_native","import_jsx_runtime","RNText","import_jsx_runtime"]}
|
package/native/index.mjs
CHANGED
|
@@ -209,6 +209,8 @@ var Text = ({
|
|
|
209
209
|
numberOfLines,
|
|
210
210
|
id,
|
|
211
211
|
role,
|
|
212
|
+
testID,
|
|
213
|
+
"data-testid": dataTestId,
|
|
212
214
|
style: styleProp,
|
|
213
215
|
...props
|
|
214
216
|
}) => {
|
|
@@ -238,7 +240,7 @@ var Text = ({
|
|
|
238
240
|
{
|
|
239
241
|
style: baseStyle,
|
|
240
242
|
numberOfLines,
|
|
241
|
-
testID: id,
|
|
243
|
+
testID: dataTestId || testID || id,
|
|
242
244
|
accessibilityRole,
|
|
243
245
|
children
|
|
244
246
|
}
|