@xsolla/xui-slider 0.111.0 → 0.113.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/native/index.js CHANGED
@@ -203,29 +203,57 @@ var roleMap = {
203
203
  link: "link",
204
204
  text: "text"
205
205
  };
206
+ var parseNumericValue = (value) => {
207
+ if (value === void 0) return void 0;
208
+ if (typeof value === "number") return value;
209
+ const parsed = parseFloat(value);
210
+ return isNaN(parsed) ? void 0 : parsed;
211
+ };
206
212
  var Text = ({
207
213
  children,
208
214
  color,
209
215
  fontSize,
210
216
  fontWeight,
211
217
  fontFamily,
218
+ textAlign,
219
+ lineHeight,
220
+ numberOfLines,
212
221
  id,
213
222
  role,
223
+ style: styleProp,
214
224
  ...props
215
225
  }) => {
216
226
  let resolvedFontFamily = fontFamily ? fontFamily.split(",")[0].replace(/['"]/g, "").trim() : void 0;
217
227
  if (resolvedFontFamily === "Pilat Wide" || resolvedFontFamily === "Pilat Wide Bold" || resolvedFontFamily === "Aktiv Grotesk") {
218
228
  resolvedFontFamily = void 0;
219
229
  }
220
- const style = {
230
+ const incomingStyle = import_react_native2.StyleSheet.flatten(styleProp);
231
+ const baseStyle = {
221
232
  color,
222
233
  fontSize: typeof fontSize === "number" ? fontSize : void 0,
223
234
  fontWeight,
224
235
  fontFamily: resolvedFontFamily,
225
- textDecorationLine: props.textDecoration
236
+ textDecorationLine: props.textDecoration,
237
+ textAlign: textAlign ?? incomingStyle?.textAlign,
238
+ lineHeight: parseNumericValue(lineHeight ?? incomingStyle?.lineHeight),
239
+ marginTop: parseNumericValue(
240
+ incomingStyle?.marginTop
241
+ ),
242
+ marginBottom: parseNumericValue(
243
+ incomingStyle?.marginBottom
244
+ )
226
245
  };
227
246
  const accessibilityRole = role ? roleMap[role] : void 0;
228
- return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react_native2.Text, { style, testID: id, accessibilityRole, children });
247
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
248
+ import_react_native2.Text,
249
+ {
250
+ style: baseStyle,
251
+ numberOfLines,
252
+ testID: id,
253
+ accessibilityRole,
254
+ children
255
+ }
256
+ );
229
257
  };
230
258
 
231
259
  // src/Slider.tsx
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.tsx","../../src/Slider.tsx","../../../primitives-native/src/Box.tsx","../../../primitives-native/src/Text.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 } from \"@xsolla/xui-primitives\";\nimport { useDesignSystem, useId } 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 {\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}) => {\n const { theme } = useDesignSystem();\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 // Platform detection for event handling\n const isWeb =\n typeof window !== \"undefined\" && typeof document !== \"undefined\";\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 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 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 { Text as RNText, TextStyle, AccessibilityRole } from \"react-native\";\nimport { TextProps } from \"@xsolla/xui-primitives-core\";\n\n// Map web roles to React Native accessibility roles\nconst roleMap: Record<string, AccessibilityRole> = {\n alert: \"alert\",\n heading: \"header\",\n button: \"button\",\n link: \"link\",\n text: \"text\",\n};\n\nexport const Text: React.FC<TextProps> = ({\n children,\n color,\n fontSize,\n fontWeight,\n fontFamily,\n id,\n role,\n ...props\n}) => {\n // Extract the first font name from a comma-separated list (e.g. for web-style font stacks)\n let resolvedFontFamily = fontFamily\n ? fontFamily.split(\",\")[0].replace(/['\"]/g, \"\").trim()\n : undefined;\n\n // On native, if we don't have the custom font loaded, fall back to the system font\n if (\n resolvedFontFamily === \"Pilat Wide\" ||\n resolvedFontFamily === \"Pilat Wide Bold\" ||\n resolvedFontFamily === \"Aktiv Grotesk\"\n ) {\n resolvedFontFamily = undefined;\n }\n\n const style: TextStyle = {\n 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 };\n\n // Map role to React Native accessibilityRole\n const accessibilityRole = role ? roleMap[role] : undefined;\n\n return (\n <RNText style={style} testID={id} accessibilityRole={accessibilityRole}>\n {children}\n </RNText>\n );\n};\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","../../../primitives-native/src/Box.tsx","../../../primitives-native/src/Text.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 } from \"@xsolla/xui-primitives\";\nimport { useDesignSystem, useId } 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 {\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}) => {\n const { theme } = useDesignSystem();\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 // Platform detection for event handling\n const isWeb =\n typeof window !== \"undefined\" && typeof document !== \"undefined\";\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 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 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,\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"],"mappings":"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","names":["import_react_native","import_jsx_runtime","RNText","import_jsx_runtime"]}
package/native/index.mjs CHANGED
@@ -172,7 +172,10 @@ var Box = ({
172
172
  };
173
173
 
174
174
  // ../primitives-native/src/Text.tsx
175
- import { Text as RNText } from "react-native";
175
+ import {
176
+ Text as RNText,
177
+ StyleSheet
178
+ } from "react-native";
176
179
  import { jsx as jsx2 } from "react/jsx-runtime";
177
180
  var roleMap = {
178
181
  alert: "alert",
@@ -181,29 +184,57 @@ var roleMap = {
181
184
  link: "link",
182
185
  text: "text"
183
186
  };
187
+ var parseNumericValue = (value) => {
188
+ if (value === void 0) return void 0;
189
+ if (typeof value === "number") return value;
190
+ const parsed = parseFloat(value);
191
+ return isNaN(parsed) ? void 0 : parsed;
192
+ };
184
193
  var Text = ({
185
194
  children,
186
195
  color,
187
196
  fontSize,
188
197
  fontWeight,
189
198
  fontFamily,
199
+ textAlign,
200
+ lineHeight,
201
+ numberOfLines,
190
202
  id,
191
203
  role,
204
+ style: styleProp,
192
205
  ...props
193
206
  }) => {
194
207
  let resolvedFontFamily = fontFamily ? fontFamily.split(",")[0].replace(/['"]/g, "").trim() : void 0;
195
208
  if (resolvedFontFamily === "Pilat Wide" || resolvedFontFamily === "Pilat Wide Bold" || resolvedFontFamily === "Aktiv Grotesk") {
196
209
  resolvedFontFamily = void 0;
197
210
  }
198
- const style = {
211
+ const incomingStyle = StyleSheet.flatten(styleProp);
212
+ const baseStyle = {
199
213
  color,
200
214
  fontSize: typeof fontSize === "number" ? fontSize : void 0,
201
215
  fontWeight,
202
216
  fontFamily: resolvedFontFamily,
203
- textDecorationLine: props.textDecoration
217
+ textDecorationLine: props.textDecoration,
218
+ textAlign: textAlign ?? incomingStyle?.textAlign,
219
+ lineHeight: parseNumericValue(lineHeight ?? incomingStyle?.lineHeight),
220
+ marginTop: parseNumericValue(
221
+ incomingStyle?.marginTop
222
+ ),
223
+ marginBottom: parseNumericValue(
224
+ incomingStyle?.marginBottom
225
+ )
204
226
  };
205
227
  const accessibilityRole = role ? roleMap[role] : void 0;
206
- return /* @__PURE__ */ jsx2(RNText, { style, testID: id, accessibilityRole, children });
228
+ return /* @__PURE__ */ jsx2(
229
+ RNText,
230
+ {
231
+ style: baseStyle,
232
+ numberOfLines,
233
+ testID: id,
234
+ accessibilityRole,
235
+ children
236
+ }
237
+ );
207
238
  };
208
239
 
209
240
  // src/Slider.tsx