@xsolla/xui-input-time 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 CHANGED
@@ -13,9 +13,9 @@ npm install @xsolla/xui-input-time
13
13
  ### Basic Usage
14
14
 
15
15
  ```tsx
16
- import * as React from 'react';
17
- import { InputTime } from '@xsolla/xui-input-time';
18
- import type { TimeValue } from '@xsolla/xui-input-time';
16
+ import * as React from "react";
17
+ import { InputTime } from "@xsolla/xui-input-time";
18
+ import type { TimeValue } from "@xsolla/xui-input-time";
19
19
 
20
20
  export default function BasicTime() {
21
21
  const [value, setValue] = React.useState<TimeValue | null>(null);
@@ -27,9 +27,9 @@ export default function BasicTime() {
27
27
  ### With Seconds
28
28
 
29
29
  ```tsx
30
- import * as React from 'react';
31
- import { InputTime } from '@xsolla/xui-input-time';
32
- import type { TimeValue } from '@xsolla/xui-input-time';
30
+ import * as React from "react";
31
+ import { InputTime } from "@xsolla/xui-input-time";
32
+ import type { TimeValue } from "@xsolla/xui-input-time";
33
33
 
34
34
  export default function WithSeconds() {
35
35
  const [value, setValue] = React.useState<TimeValue | null>(null);
@@ -41,24 +41,19 @@ export default function WithSeconds() {
41
41
  ### 12-Hour Format with AM/PM
42
42
 
43
43
  ```tsx
44
- import * as React from 'react';
45
- import { InputTime } from '@xsolla/xui-input-time';
46
- import type { TimeValue } from '@xsolla/xui-input-time';
44
+ import * as React from "react";
45
+ import { InputTime } from "@xsolla/xui-input-time";
46
+ import type { TimeValue } from "@xsolla/xui-input-time";
47
47
 
48
48
  export default function TwelveHour() {
49
49
  const [value, setValue] = React.useState<TimeValue | null>({
50
50
  hours: 3,
51
51
  minutes: 30,
52
- period: 'pm',
52
+ period: "pm",
53
53
  });
54
54
 
55
55
  return (
56
- <InputTime
57
- value={value}
58
- onChange={setValue}
59
- hourCycle={12}
60
- showPeriod
61
- />
56
+ <InputTime value={value} onChange={setValue} hourCycle={12} showPeriod />
62
57
  );
63
58
  }
64
59
  ```
@@ -68,10 +63,10 @@ export default function TwelveHour() {
68
63
  A Clock icon is displayed by default. Pass a custom icon via the `icon` prop, or set `icon={null}` to hide it.
69
64
 
70
65
  ```tsx
71
- import * as React from 'react';
72
- import { InputTime } from '@xsolla/xui-input-time';
73
- import { Clock } from '@xsolla/xui-icons-base';
74
- import type { TimeValue } from '@xsolla/xui-input-time';
66
+ import * as React from "react";
67
+ import { InputTime } from "@xsolla/xui-input-time";
68
+ import { Clock } from "@xsolla/xui-icons-base";
69
+ import type { TimeValue } from "@xsolla/xui-input-time";
75
70
 
76
71
  export default function CustomIcon() {
77
72
  const [value, setValue] = React.useState<TimeValue | null>(null);
@@ -89,12 +84,12 @@ export default function CustomIcon() {
89
84
  ### Different Sizes
90
85
 
91
86
  ```tsx
92
- import * as React from 'react';
93
- import { InputTime } from '@xsolla/xui-input-time';
87
+ import * as React from "react";
88
+ import { InputTime } from "@xsolla/xui-input-time";
94
89
 
95
90
  export default function Sizes() {
96
91
  return (
97
- <div style={{ display: 'flex', flexDirection: 'column', gap: 16 }}>
92
+ <div style={{ display: "flex", flexDirection: "column", gap: 16 }}>
98
93
  <InputTime size="xl" />
99
94
  <InputTime size="lg" />
100
95
  <InputTime size="md" />
@@ -111,45 +106,47 @@ export default function Sizes() {
111
106
 
112
107
  **InputTimeProps:**
113
108
 
114
- | Prop | Type | Default | Description |
115
- | :--- | :--- | :------ | :---------- |
116
- | value | `TimeValue \| null` | - | Current time value. |
117
- | onChange | `(value: TimeValue \| null) => void` | - | Time change callback. |
118
- | showSeconds | `boolean` | `false` | Show seconds segment (HH:MM:SS). |
119
- | showPeriod | `boolean` | `false` | Show AM/PM toggle. |
120
- | hourCycle | `12 \| 24` | `24` | Hour format (12h or 24h). |
121
- | icon | `ReactNode` | `<Clock />` | Icon displayed on the left. Set to `null` to hide. |
122
- | size | `"xl" \| "lg" \| "md" \| "sm" \| "xs"` | `"md"` | Input size variant. |
123
- | disabled | `boolean` | `false` | Disable the input. |
124
- | error | `string` | - | Error message (shows error state). |
125
- | aria-label | `string` | `"Time input"` | Accessible label. |
126
- | testID | `string` | - | Test identifier. |
109
+ | Prop | Type | Default | Description |
110
+ | :---------- | :------------------------------------- | :------------- | :------------------------------------------------------------------------------------------------------------ |
111
+ | `testID` | `string` | | Test ID for testing frameworks. On web this renders as `data-testid`; on React Native it renders as `testID`. |
112
+ | value | `TimeValue \| null` | - | Current time value. |
113
+ | onChange | `(value: TimeValue \| null) => void` | - | Time change callback. |
114
+ | showSeconds | `boolean` | `false` | Show seconds segment (HH:MM:SS). |
115
+ | showPeriod | `boolean` | `false` | Show AM/PM toggle. |
116
+ | hourCycle | `12 \| 24` | `24` | Hour format (12h or 24h). |
117
+ | icon | `ReactNode` | `<Clock />` | Icon displayed on the left. Set to `null` to hide. |
118
+ | size | `"xl" \| "lg" \| "md" \| "sm" \| "xs"` | `"md"` | Input size variant. |
119
+ | disabled | `boolean` | `false` | Disable the input. |
120
+ | error | `string` | - | Error message (shows error state). |
121
+ | aria-label | `string` | `"Time input"` | Accessible label. |
122
+ | testID | `string` | - | Test identifier. |
127
123
 
128
124
  ### TimeValue
129
125
 
130
- | Property | Type | Description |
131
- | :--- | :--- | :---------- |
132
- | hours | `number` | Hours (0-23 for 24h, 1-12 for 12h). |
133
- | minutes | `number` | Minutes (0-59). |
134
- | seconds | `number` (optional) | Seconds (0-59). Present when `showSeconds` is true. |
135
- | period | `"am" \| "pm"` (optional) | Time period. Present when `showPeriod` is true. |
126
+ | Property | Type | Description |
127
+ | :------- | :------------------------ | :-------------------------------------------------- |
128
+ | hours | `number` | Hours (0-23 for 24h, 1-12 for 12h). |
129
+ | minutes | `number` | Minutes (0-59). |
130
+ | seconds | `number` (optional) | Seconds (0-59). Present when `showSeconds` is true. |
131
+ | period | `"am" \| "pm"` (optional) | Time period. Present when `showPeriod` is true. |
136
132
 
137
133
  ## Keyboard Navigation
138
134
 
139
- | Key | Action |
140
- | :--- | :--- |
141
- | 0-9 | Type digit. Auto-advances to next segment after 2 digits. |
142
- | Tab | Move to next segment. |
143
- | Shift+Tab | Move to previous segment. |
144
- | ArrowUp | Increment focused segment by 1. |
145
- | ArrowDown | Decrement focused segment by 1. |
146
- | ArrowRight | Move to next segment. |
147
- | ArrowLeft | Move to previous segment. |
148
- | Backspace | Clear segment and move back. |
135
+ | Key | Action |
136
+ | :--------- | :-------------------------------------------------------- |
137
+ | 0-9 | Type digit. Auto-advances to next segment after 2 digits. |
138
+ | Tab | Move to next segment. |
139
+ | Shift+Tab | Move to previous segment. |
140
+ | ArrowUp | Increment focused segment by 1. |
141
+ | ArrowDown | Decrement focused segment by 1. |
142
+ | ArrowRight | Move to next segment. |
143
+ | ArrowLeft | Move to previous segment. |
144
+ | Backspace | Clear segment and move back. |
149
145
 
150
146
  ## Validation
151
147
 
152
148
  Values are clamped to valid ranges automatically:
149
+
153
150
  - Hours: 0-23 (24h) or 1-12 (12h)
154
151
  - Minutes: 0-59
155
152
  - Seconds: 0-59
package/native/index.js CHANGED
@@ -238,6 +238,8 @@ var Text = ({
238
238
  numberOfLines,
239
239
  id,
240
240
  role,
241
+ testID,
242
+ "data-testid": dataTestId,
241
243
  style: styleProp,
242
244
  ...props
243
245
  }) => {
@@ -267,7 +269,7 @@ var Text = ({
267
269
  {
268
270
  style: baseStyle,
269
271
  numberOfLines,
270
- testID: id,
272
+ testID: dataTestId || testID || id,
271
273
  accessibilityRole,
272
274
  children
273
275
  }
@@ -330,7 +332,8 @@ var InputPrimitive = (0, import_react.forwardRef)(
330
332
  "aria-describedby": ariaDescribedBy,
331
333
  "aria-label": ariaLabel,
332
334
  "aria-disabled": ariaDisabled,
333
- "data-testid": dataTestId
335
+ "data-testid": dataTestId,
336
+ testID
334
337
  }, ref) => {
335
338
  const handleChangeText = (text) => {
336
339
  onChangeText?.(text);
@@ -390,7 +393,7 @@ var InputPrimitive = (0, import_react.forwardRef)(
390
393
  ],
391
394
  placeholderTextColor,
392
395
  maxLength,
393
- testID: dataTestId || id,
396
+ testID: dataTestId || testID || id,
394
397
  accessibilityLabel: ariaLabel,
395
398
  accessibilityHint: ariaDescribedBy,
396
399
  accessibilityState: {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.tsx","../../src/InputTime.tsx","../../../../foundation/primitives-native/src/Box.tsx","../../../../foundation/primitives-native/src/Text.tsx","../../../../foundation/primitives-native/src/Input.tsx","../../src/TimeSegment.tsx","../../src/utils.ts","../../src/PeriodToggle.tsx"],"sourcesContent":["export { InputTime } from \"./InputTime\";\nexport type { InputTimeProps, TimeValue } from \"./types\";\n","import React, { useRef, useState, 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 { Clock } from \"@xsolla/xui-icons-base\";\nimport { TimeSegment } from \"./TimeSegment\";\nimport { PeriodToggle } from \"./PeriodToggle\";\nimport { clampHours, clampMinutes, clampSeconds } from \"./utils\";\nimport type { InputTimeProps, TimeValue } from \"./types\";\n\nexport const InputTime: React.FC<InputTimeProps> = ({\n value,\n onChange,\n showSeconds = false,\n showPeriod = false,\n hourCycle = 24,\n icon = <Clock />,\n size = \"md\",\n disabled = false,\n error,\n \"aria-label\": ariaLabel,\n testID,\n}) => {\n const { theme } = useDesignSystem();\n const rawId = useId();\n const safeId = rawId.replace(/:/g, \"\");\n const inputId = `input-time-${safeId}`;\n const errorId = `${inputId}-error`;\n\n const [internalState, setInternalState] = useState<\"default\" | \"focus\">(\n \"default\"\n );\n\n const segmentRefs = useRef<Array<{ focus: () => void }>>([]);\n\n const is12h = hourCycle === 12;\n\n const [hours, setHours] = useState<number | null>(value?.hours ?? null);\n const [minutes, setMinutes] = useState<number | null>(value?.minutes ?? null);\n const [seconds, setSeconds] = useState<number | null>(value?.seconds ?? null);\n const [period, setPeriod] = useState<\"am\" | \"pm\">(value?.period ?? \"am\");\n\n useEffect(() => {\n if (value) {\n setHours(value.hours);\n setMinutes(value.minutes);\n setSeconds(value.seconds ?? null);\n setPeriod(value.period ?? \"am\");\n } else if (value === null) {\n setHours(null);\n setMinutes(null);\n setSeconds(null);\n setPeriod(\"am\");\n }\n }, [value]);\n\n const emitChange = useCallback(\n (h: number | null, m: number | null, s: number | null, p: \"am\" | \"pm\") => {\n if (h === null || m === null) {\n onChange?.(null);\n return;\n }\n const result: TimeValue = {\n hours: clampHours(h, is12h),\n minutes: clampMinutes(m),\n };\n if (showSeconds) {\n result.seconds = s !== null ? clampSeconds(s) : 0;\n }\n if (showPeriod) {\n result.period = p;\n }\n onChange?.(result);\n },\n [onChange, is12h, showSeconds, showPeriod]\n );\n\n const handleHoursChange = (v: number | null) => {\n const clamped = v !== null ? clampHours(v, is12h) : null;\n setHours(clamped);\n emitChange(clamped, minutes, seconds, period);\n };\n\n const handleMinutesChange = (v: number | null) => {\n const clamped = v !== null ? clampMinutes(v) : null;\n setMinutes(clamped);\n emitChange(hours, clamped, seconds, period);\n };\n\n const handleSecondsChange = (v: number | null) => {\n const clamped = v !== null ? clampSeconds(v) : null;\n setSeconds(clamped);\n emitChange(hours, minutes, clamped, period);\n };\n\n const handlePeriodChange = (v: \"am\" | \"pm\") => {\n setPeriod(v);\n emitChange(hours, minutes, seconds, v);\n };\n\n const focusSegment = (index: number) => {\n segmentRefs.current[index]?.focus?.();\n };\n\n const segmentCount = showSeconds ? 3 : 2;\n const advanceFrom = (i: number) => () => {\n if (i < segmentCount - 1) focusSegment(i + 1);\n };\n const retreatFrom = (i: number) => () => {\n if (i > 0) focusSegment(i - 1);\n };\n\n const sizeStyles = theme.sizing.input(size);\n const inputColors = theme.colors.control.input;\n\n const isError = !!error;\n const isFocus = internalState === \"focus\";\n\n let backgroundColor = inputColors.bg;\n let borderColor = inputColors.border;\n let outlineColor: string | undefined;\n\n if (disabled) {\n backgroundColor = inputColors.bgDisable;\n borderColor = inputColors.borderDisable;\n } else if (isError) {\n outlineColor = theme.colors.border.alert;\n if (isFocus) {\n backgroundColor = theme.colors.control.focus.bg;\n }\n } else if (isFocus) {\n backgroundColor = theme.colors.control.focus.bg;\n outlineColor = theme.colors.border.brand;\n }\n\n const textColor = disabled ? inputColors.textDisable : inputColors.text;\n const placeholderColor = inputColors.placeholder;\n const iconColor = inputColors.placeholder;\n\n const paddingConfig: Record<\n string,\n { vertical: number; horizontal: number }\n > = {\n xl: { vertical: 12, horizontal: 12 },\n lg: { vertical: 14, horizontal: 12 },\n md: { vertical: 11, horizontal: 12 },\n sm: { vertical: 7, horizontal: 10 },\n xs: { vertical: 7, horizontal: 10 },\n };\n\n const borderRadiusConfig: Record<string, number> = {\n xl: 8,\n lg: 8,\n md: 8,\n sm: 4,\n xs: 4,\n };\n\n const iconSizeConfig: Record<string, number> = {\n xl: 22,\n lg: 20,\n md: 18,\n sm: 16,\n xs: 14,\n };\n\n const focusOutlineConfig: Record<string, { width: number; offset: number }> =\n {\n xl: { width: 1, offset: -1 },\n lg: { width: 1, offset: -1 },\n md: { width: 1, offset: -1 },\n sm: { width: 1, offset: -1 },\n xs: { width: 1, offset: -1 },\n };\n\n const padding = paddingConfig[size];\n const borderRadius = borderRadiusConfig[size];\n const iconSize = iconSizeConfig[size];\n const focusOutline = focusOutlineConfig[size];\n\n const handleContainerFocus = () => {\n if (!disabled) setInternalState(\"focus\");\n };\n const handleContainerBlur = () => {\n if (!disabled) setInternalState(\"default\");\n };\n\n const colonColor = disabled ? placeholderColor : textColor;\n\n return (\n <Box\n flexDirection=\"column\"\n gap={sizeStyles.fieldGap}\n width=\"100%\"\n testID={testID}\n >\n <Box\n backgroundColor={backgroundColor}\n borderColor={borderColor}\n borderWidth={borderColor !== \"transparent\" ? 1 : 0}\n borderRadius={borderRadius}\n height={sizeStyles.height}\n paddingVertical={padding.vertical}\n paddingHorizontal={padding.horizontal}\n flexDirection=\"row\"\n alignItems=\"center\"\n gap={2}\n position=\"relative\"\n style={{\n ...(outlineColor\n ? {\n outline: `${focusOutline.width}px solid ${outlineColor}`,\n outlineOffset: `${focusOutline.offset}px`,\n }\n : {}),\n }}\n hoverStyle={\n !disabled && !isFocus && !isError\n ? {\n backgroundColor: inputColors.bgHover,\n borderColor: inputColors.borderHover,\n }\n : undefined\n }\n onFocus={handleContainerFocus}\n onBlur={handleContainerBlur}\n role=\"group\"\n aria-label={ariaLabel || \"Time input\"}\n aria-describedby={error ? errorId : undefined}\n >\n {icon && (\n <Box marginRight={6} alignItems=\"center\" justifyContent=\"center\">\n {React.isValidElement(icon)\n ? React.cloneElement(icon as React.ReactElement<any>, {\n size: iconSize,\n color: iconColor,\n })\n : icon}\n </Box>\n )}\n\n <TimeSegment\n ref={(el: any) => {\n segmentRefs.current[0] = el;\n }}\n value={hours}\n onChange={handleHoursChange}\n onAdvance={advanceFrom(0)}\n onRetreat={retreatFrom(0)}\n min={is12h ? 1 : 0}\n max={is12h ? 12 : 23}\n disabled={disabled}\n placeholder=\"--\"\n fontSize={sizeStyles.fontSize}\n textColor={textColor}\n placeholderColor={placeholderColor}\n focusColor={theme.colors.background.brand.primary}\n aria-label=\"Hours\"\n testID={testID ? `${testID}-hours` : undefined}\n />\n\n <Text\n color={colonColor}\n fontSize={sizeStyles.fontSize}\n fontWeight=\"500\"\n >\n :\n </Text>\n\n <TimeSegment\n ref={(el: any) => {\n segmentRefs.current[1] = el;\n }}\n value={minutes}\n onChange={handleMinutesChange}\n onAdvance={advanceFrom(1)}\n onRetreat={retreatFrom(1)}\n min={0}\n max={59}\n disabled={disabled}\n placeholder=\"--\"\n fontSize={sizeStyles.fontSize}\n textColor={textColor}\n placeholderColor={placeholderColor}\n focusColor={theme.colors.background.brand.primary}\n aria-label=\"Minutes\"\n testID={testID ? `${testID}-minutes` : undefined}\n />\n\n {showSeconds && (\n <>\n <Text\n color={colonColor}\n fontSize={sizeStyles.fontSize}\n fontWeight=\"500\"\n >\n :\n </Text>\n <TimeSegment\n ref={(el: any) => {\n segmentRefs.current[2] = el;\n }}\n value={seconds}\n onChange={handleSecondsChange}\n onAdvance={advanceFrom(2)}\n onRetreat={retreatFrom(2)}\n min={0}\n max={59}\n disabled={disabled}\n placeholder=\"--\"\n fontSize={sizeStyles.fontSize}\n textColor={textColor}\n placeholderColor={placeholderColor}\n focusColor={theme.colors.background.brand.primary}\n aria-label=\"Seconds\"\n testID={testID ? `${testID}-seconds` : undefined}\n />\n </>\n )}\n\n {showPeriod && (\n <PeriodToggle\n value={period}\n onChange={handlePeriodChange}\n disabled={disabled}\n fontSize={sizeStyles.fontSize}\n textColor={textColor}\n testID={testID ? `${testID}-period` : undefined}\n />\n )}\n </Box>\n\n {error && (\n <Text\n id={errorId}\n role=\"alert\"\n color={theme.colors.content.alert.primary}\n fontSize={sizeStyles.fontSize - 2}\n >\n {error}\n </Text>\n )}\n </Box>\n );\n};\n\nInputTime.displayName = \"InputTime\";\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","import React, { forwardRef } from \"react\";\nimport { TextInput as RNTextInput } from \"react-native\";\nimport { InputPrimitiveProps } from \"@xsolla/xui-primitives-core\";\n\n// Map web input types to React Native keyboard types\nconst keyboardTypeMap: Record<string, any> = {\n text: \"default\",\n number: \"numeric\",\n email: \"email-address\",\n tel: \"phone-pad\",\n url: \"url\",\n decimal: \"decimal-pad\",\n};\n\n// Map web inputMode to React Native keyboard types\nconst inputModeToKeyboardType: Record<string, any> = {\n none: \"default\",\n text: \"default\",\n decimal: \"decimal-pad\",\n numeric: \"number-pad\",\n tel: \"phone-pad\",\n search: \"default\",\n email: \"email-address\",\n url: \"url\",\n};\n\n// Map web autoComplete to React Native textContentType (iOS)\nconst autoCompleteToTextContentType: Record<string, any> = {\n \"one-time-code\": \"oneTimeCode\",\n email: \"emailAddress\",\n username: \"username\",\n password: \"password\",\n \"new-password\": \"newPassword\",\n tel: \"telephoneNumber\",\n \"postal-code\": \"postalCode\",\n name: \"name\",\n};\n\nexport const InputPrimitive = forwardRef<RNTextInput, InputPrimitiveProps>(\n (\n {\n value,\n placeholder,\n onChange,\n onChangeText,\n onFocus,\n onBlur,\n onKeyDown,\n disabled,\n secureTextEntry,\n style,\n color,\n fontSize,\n fontFamily,\n placeholderTextColor,\n maxLength,\n type,\n inputMode,\n autoComplete,\n id,\n \"aria-describedby\": ariaDescribedBy,\n \"aria-label\": ariaLabel,\n \"aria-disabled\": ariaDisabled,\n \"data-testid\": dataTestId,\n },\n ref\n ) => {\n const handleChangeText = (text: string) => {\n onChangeText?.(text);\n\n // Create a synthetic event for onChange compatibility\n // Include nativeEvent and no-op methods to prevent runtime errors\n // when consumers expect DOM-like event behavior\n if (onChange) {\n const syntheticEvent = {\n target: { value: text },\n currentTarget: { value: text },\n type: \"change\",\n nativeEvent: { text },\n preventDefault: () => {},\n stopPropagation: () => {},\n isTrusted: false,\n } as unknown as React.ChangeEvent<HTMLInputElement>;\n onChange(syntheticEvent);\n }\n };\n\n // Determine keyboard type - inputMode takes precedence over type\n const keyboardType = inputMode\n ? inputModeToKeyboardType[inputMode] || \"default\"\n : type\n ? keyboardTypeMap[type] || \"default\"\n : \"default\";\n\n // Determine textContentType for iOS autofill\n const textContentType = autoComplete\n ? autoCompleteToTextContentType[autoComplete]\n : undefined;\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 return (\n <RNTextInput\n ref={ref}\n value={value}\n placeholder={placeholder}\n onChangeText={handleChangeText}\n onFocus={onFocus}\n onBlur={onBlur}\n onKeyPress={(e) => {\n // Map onKeyPress to onKeyDown for cross-platform compatibility\n // Include preventDefault to avoid runtime errors when consumers call it\n if (onKeyDown) {\n onKeyDown({\n key: e.nativeEvent.key,\n preventDefault: () => {},\n } as any);\n }\n }}\n editable={!disabled}\n secureTextEntry={secureTextEntry || type === \"password\"}\n keyboardType={keyboardType}\n textContentType={textContentType}\n style={[\n {\n color,\n fontSize: typeof fontSize === \"number\" ? fontSize : undefined,\n fontFamily: resolvedFontFamily,\n flex: 1,\n padding: 0,\n textAlign: (style as any)?.textAlign || \"left\",\n },\n style as any,\n ]}\n placeholderTextColor={placeholderTextColor}\n maxLength={maxLength}\n // React Native accessibility props\n testID={dataTestId || id}\n accessibilityLabel={ariaLabel}\n accessibilityHint={ariaDescribedBy}\n accessibilityState={{\n disabled: disabled || ariaDisabled,\n }}\n accessible={true}\n />\n );\n }\n);\n\nInputPrimitive.displayName = \"InputPrimitive\";\n","import React, {\n useRef,\n useState,\n useCallback,\n forwardRef,\n useImperativeHandle,\n} from \"react\";\n// @ts-expect-error - this will be resolved at build time\nimport { Box, InputPrimitive } from \"@xsolla/xui-primitives\";\nimport { formatSegment, parseSegmentInput } from \"./utils\";\n\ninterface TimeSegmentProps {\n value: number | null;\n onChange: (value: number | null) => void;\n onAdvance: () => void;\n onRetreat: () => void;\n min: number;\n max: number;\n disabled?: boolean;\n placeholder?: string;\n fontSize: number;\n textColor: string;\n placeholderColor: string;\n focusColor: string;\n \"aria-label\"?: string;\n testID?: string;\n}\n\nexport const TimeSegment = forwardRef<{ focus: () => void }, TimeSegmentProps>(\n (\n {\n value,\n onChange,\n onAdvance,\n onRetreat,\n min,\n max,\n disabled = false,\n placeholder = \"--\",\n fontSize,\n textColor,\n placeholderColor,\n focusColor,\n \"aria-label\": ariaLabel,\n testID,\n },\n ref\n ) => {\n const inputRef = useRef<any>(null);\n const [editBuffer, setEditBuffer] = useState<string>(\"\");\n const [isFocused, setIsFocused] = useState(false);\n const committedRef = useRef(false);\n const freshFocusRef = useRef(false);\n\n useImperativeHandle(ref, () => ({\n focus: () => inputRef.current?.focus?.(),\n }));\n\n const displayValue = isFocused\n ? editBuffer\n : value !== null\n ? formatSegment(value)\n : \"\";\n\n const commitValue = useCallback(\n (text: string) => {\n const parsed = parseSegmentInput(text);\n if (parsed !== null) {\n const clamped = Math.min(max, Math.max(min, parsed));\n onChange(clamped);\n }\n },\n [onChange, min, max]\n );\n\n const handleFocus = () => {\n setIsFocused(true);\n setEditBuffer(value !== null ? formatSegment(value) : \"\");\n committedRef.current = false;\n freshFocusRef.current = true;\n };\n\n const handleBlur = () => {\n setIsFocused(false);\n if (!committedRef.current && editBuffer) {\n commitValue(editBuffer);\n }\n committedRef.current = false;\n setEditBuffer(\"\");\n };\n\n const extractTypedDigit = (newText: string, oldText: string): string => {\n const newDigits = newText.replace(/\\D/g, \"\");\n const oldDigits = oldText.replace(/\\D/g, \"\");\n if (newDigits.length <= oldDigits.length) return \"\";\n let remaining = newDigits;\n for (const ch of oldDigits) {\n const idx = remaining.indexOf(ch);\n if (idx !== -1) {\n remaining = remaining.slice(0, idx) + remaining.slice(idx + 1);\n }\n }\n return remaining.charAt(0);\n };\n\n const handleChangeText = (text: string) => {\n let digitsOnly = text.replace(/\\D/g, \"\");\n if (freshFocusRef.current || committedRef.current) {\n const typed = extractTypedDigit(text, displayValue);\n freshFocusRef.current = false;\n committedRef.current = false;\n if (!typed) return;\n digitsOnly = typed;\n } else {\n digitsOnly = digitsOnly.slice(-2);\n }\n setEditBuffer(digitsOnly);\n if (digitsOnly.length === 2) {\n committedRef.current = true;\n commitValue(digitsOnly);\n onAdvance();\n }\n };\n\n const handleKeyDown = (e: any) => {\n const key = e.key || e.nativeEvent?.key;\n\n if (key === \"ArrowUp\") {\n e.preventDefault();\n const current = value ?? min;\n const next = current >= max ? min : current + 1;\n onChange(next);\n setEditBuffer(formatSegment(next));\n committedRef.current = true;\n } else if (key === \"ArrowDown\") {\n e.preventDefault();\n const current = value ?? min;\n const next = current <= min ? max : current - 1;\n onChange(next);\n setEditBuffer(formatSegment(next));\n committedRef.current = true;\n } else if (key === \"ArrowRight\") {\n onAdvance();\n } else if (key === \"ArrowLeft\") {\n onRetreat();\n } else if (key === \"Backspace\" && editBuffer.length === 0) {\n onChange(null);\n onRetreat();\n } else if (key === \"Tab\") {\n if (editBuffer) {\n commitValue(editBuffer);\n }\n } else if (key === \"Enter\") {\n if (editBuffer) {\n commitValue(editBuffer);\n }\n inputRef.current?.blur?.();\n }\n };\n\n return (\n <Box\n onPress={() => inputRef.current?.focus?.()}\n width={fontSize * 1.5}\n height={fontSize + 8}\n justifyContent=\"center\"\n alignItems=\"center\"\n backgroundColor={isFocused ? focusColor : \"transparent\"}\n borderRadius={4}\n >\n <InputPrimitive\n ref={inputRef}\n value={displayValue}\n placeholder={placeholder}\n onChangeText={handleChangeText}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n disabled={disabled}\n inputMode=\"numeric\"\n color={textColor}\n fontSize={fontSize}\n placeholderTextColor={placeholderColor}\n aria-label={ariaLabel}\n data-testid={testID}\n style={{\n textAlign: \"center\",\n width: \"100%\",\n padding: 0,\n border: \"none\",\n outline: \"none\",\n boxShadow: \"none\",\n background: \"transparent\",\n caretColor: \"transparent\",\n }}\n />\n </Box>\n );\n }\n);\n\nTimeSegment.displayName = \"TimeSegment\";\n","export function clampValue(value: number, min: number, max: number): number {\n if (isNaN(value)) return min;\n return Math.min(max, Math.max(min, value));\n}\n\nexport function clampHours(value: number, is12h: boolean): number {\n return is12h ? clampValue(value, 1, 12) : clampValue(value, 0, 23);\n}\n\nexport function clampMinutes(value: number): number {\n return clampValue(value, 0, 59);\n}\n\nexport function clampSeconds(value: number): number {\n return clampValue(value, 0, 59);\n}\n\nexport function formatSegment(value: number | undefined | null): string {\n if (value === undefined || value === null) return \"\";\n return value.toString().padStart(2, \"0\");\n}\n\nexport function parseSegmentInput(text: string): number | null {\n const num = parseInt(text, 10);\n return isNaN(num) ? null : num;\n}\n","import React from \"react\";\n// @ts-expect-error - this will be resolved at build time\nimport { Box, Text } from \"@xsolla/xui-primitives\";\n\ninterface PeriodToggleProps {\n value: \"am\" | \"pm\";\n onChange: (value: \"am\" | \"pm\") => void;\n disabled?: boolean;\n fontSize: number;\n textColor: string;\n testID?: string;\n}\n\nexport const PeriodToggle: React.FC<PeriodToggleProps> = ({\n value,\n onChange,\n disabled = false,\n fontSize,\n textColor,\n testID,\n}) => {\n const toggle = () => {\n if (!disabled) {\n onChange(value === \"am\" ? \"pm\" : \"am\");\n }\n };\n\n return (\n <Box\n onPress={toggle}\n cursor={disabled ? \"default\" : \"pointer\"}\n justifyContent=\"center\"\n alignItems=\"center\"\n paddingHorizontal={4}\n role=\"button\"\n aria-label={`Time period: ${value.toUpperCase()}. Click to toggle.`}\n data-testid={testID}\n >\n <Text color={textColor} fontSize={fontSize} fontWeight=\"500\">\n {value}\n </Text>\n </Box>\n );\n};\n"],"mappings":"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","names":["import_react","import_react_native","import_jsx_runtime","RNText","import_react_native","import_jsx_runtime","RNTextInput","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","React"]}
1
+ {"version":3,"sources":["../../src/index.tsx","../../src/InputTime.tsx","../../../../foundation/primitives-native/src/Box.tsx","../../../../foundation/primitives-native/src/Text.tsx","../../../../foundation/primitives-native/src/Input.tsx","../../src/TimeSegment.tsx","../../src/utils.ts","../../src/PeriodToggle.tsx"],"sourcesContent":["export { InputTime } from \"./InputTime\";\nexport type { InputTimeProps, TimeValue } from \"./types\";\n","import React, { useRef, useState, 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 { Clock } from \"@xsolla/xui-icons-base\";\nimport { TimeSegment } from \"./TimeSegment\";\nimport { PeriodToggle } from \"./PeriodToggle\";\nimport { clampHours, clampMinutes, clampSeconds } from \"./utils\";\nimport type { InputTimeProps, TimeValue } from \"./types\";\n\nexport const InputTime: React.FC<InputTimeProps> = ({\n value,\n onChange,\n showSeconds = false,\n showPeriod = false,\n hourCycle = 24,\n icon = <Clock />,\n size = \"md\",\n disabled = false,\n error,\n \"aria-label\": ariaLabel,\n testID,\n}) => {\n const { theme } = useDesignSystem();\n const rawId = useId();\n const safeId = rawId.replace(/:/g, \"\");\n const inputId = `input-time-${safeId}`;\n const errorId = `${inputId}-error`;\n\n const [internalState, setInternalState] = useState<\"default\" | \"focus\">(\n \"default\"\n );\n\n const segmentRefs = useRef<Array<{ focus: () => void }>>([]);\n\n const is12h = hourCycle === 12;\n\n const [hours, setHours] = useState<number | null>(value?.hours ?? null);\n const [minutes, setMinutes] = useState<number | null>(value?.minutes ?? null);\n const [seconds, setSeconds] = useState<number | null>(value?.seconds ?? null);\n const [period, setPeriod] = useState<\"am\" | \"pm\">(value?.period ?? \"am\");\n\n useEffect(() => {\n if (value) {\n setHours(value.hours);\n setMinutes(value.minutes);\n setSeconds(value.seconds ?? null);\n setPeriod(value.period ?? \"am\");\n } else if (value === null) {\n setHours(null);\n setMinutes(null);\n setSeconds(null);\n setPeriod(\"am\");\n }\n }, [value]);\n\n const emitChange = useCallback(\n (h: number | null, m: number | null, s: number | null, p: \"am\" | \"pm\") => {\n if (h === null || m === null) {\n onChange?.(null);\n return;\n }\n const result: TimeValue = {\n hours: clampHours(h, is12h),\n minutes: clampMinutes(m),\n };\n if (showSeconds) {\n result.seconds = s !== null ? clampSeconds(s) : 0;\n }\n if (showPeriod) {\n result.period = p;\n }\n onChange?.(result);\n },\n [onChange, is12h, showSeconds, showPeriod]\n );\n\n const handleHoursChange = (v: number | null) => {\n const clamped = v !== null ? clampHours(v, is12h) : null;\n setHours(clamped);\n emitChange(clamped, minutes, seconds, period);\n };\n\n const handleMinutesChange = (v: number | null) => {\n const clamped = v !== null ? clampMinutes(v) : null;\n setMinutes(clamped);\n emitChange(hours, clamped, seconds, period);\n };\n\n const handleSecondsChange = (v: number | null) => {\n const clamped = v !== null ? clampSeconds(v) : null;\n setSeconds(clamped);\n emitChange(hours, minutes, clamped, period);\n };\n\n const handlePeriodChange = (v: \"am\" | \"pm\") => {\n setPeriod(v);\n emitChange(hours, minutes, seconds, v);\n };\n\n const focusSegment = (index: number) => {\n segmentRefs.current[index]?.focus?.();\n };\n\n const segmentCount = showSeconds ? 3 : 2;\n const advanceFrom = (i: number) => () => {\n if (i < segmentCount - 1) focusSegment(i + 1);\n };\n const retreatFrom = (i: number) => () => {\n if (i > 0) focusSegment(i - 1);\n };\n\n const sizeStyles = theme.sizing.input(size);\n const inputColors = theme.colors.control.input;\n\n const isError = !!error;\n const isFocus = internalState === \"focus\";\n\n let backgroundColor = inputColors.bg;\n let borderColor = inputColors.border;\n let outlineColor: string | undefined;\n\n if (disabled) {\n backgroundColor = inputColors.bgDisable;\n borderColor = inputColors.borderDisable;\n } else if (isError) {\n outlineColor = theme.colors.border.alert;\n if (isFocus) {\n backgroundColor = theme.colors.control.focus.bg;\n }\n } else if (isFocus) {\n backgroundColor = theme.colors.control.focus.bg;\n outlineColor = theme.colors.border.brand;\n }\n\n const textColor = disabled ? inputColors.textDisable : inputColors.text;\n const placeholderColor = inputColors.placeholder;\n const iconColor = inputColors.placeholder;\n\n const paddingConfig: Record<\n string,\n { vertical: number; horizontal: number }\n > = {\n xl: { vertical: 12, horizontal: 12 },\n lg: { vertical: 14, horizontal: 12 },\n md: { vertical: 11, horizontal: 12 },\n sm: { vertical: 7, horizontal: 10 },\n xs: { vertical: 7, horizontal: 10 },\n };\n\n const borderRadiusConfig: Record<string, number> = {\n xl: 8,\n lg: 8,\n md: 8,\n sm: 4,\n xs: 4,\n };\n\n const iconSizeConfig: Record<string, number> = {\n xl: 22,\n lg: 20,\n md: 18,\n sm: 16,\n xs: 14,\n };\n\n const focusOutlineConfig: Record<string, { width: number; offset: number }> =\n {\n xl: { width: 1, offset: -1 },\n lg: { width: 1, offset: -1 },\n md: { width: 1, offset: -1 },\n sm: { width: 1, offset: -1 },\n xs: { width: 1, offset: -1 },\n };\n\n const padding = paddingConfig[size];\n const borderRadius = borderRadiusConfig[size];\n const iconSize = iconSizeConfig[size];\n const focusOutline = focusOutlineConfig[size];\n\n const handleContainerFocus = () => {\n if (!disabled) setInternalState(\"focus\");\n };\n const handleContainerBlur = () => {\n if (!disabled) setInternalState(\"default\");\n };\n\n const colonColor = disabled ? placeholderColor : textColor;\n\n return (\n <Box\n flexDirection=\"column\"\n gap={sizeStyles.fieldGap}\n width=\"100%\"\n testID={testID}\n >\n <Box\n backgroundColor={backgroundColor}\n borderColor={borderColor}\n borderWidth={borderColor !== \"transparent\" ? 1 : 0}\n borderRadius={borderRadius}\n height={sizeStyles.height}\n paddingVertical={padding.vertical}\n paddingHorizontal={padding.horizontal}\n flexDirection=\"row\"\n alignItems=\"center\"\n gap={2}\n position=\"relative\"\n style={{\n ...(outlineColor\n ? {\n outline: `${focusOutline.width}px solid ${outlineColor}`,\n outlineOffset: `${focusOutline.offset}px`,\n }\n : {}),\n }}\n hoverStyle={\n !disabled && !isFocus && !isError\n ? {\n backgroundColor: inputColors.bgHover,\n borderColor: inputColors.borderHover,\n }\n : undefined\n }\n onFocus={handleContainerFocus}\n onBlur={handleContainerBlur}\n role=\"group\"\n aria-label={ariaLabel || \"Time input\"}\n aria-describedby={error ? errorId : undefined}\n >\n {icon && (\n <Box marginRight={6} alignItems=\"center\" justifyContent=\"center\">\n {React.isValidElement(icon)\n ? React.cloneElement(icon as React.ReactElement<any>, {\n size: iconSize,\n color: iconColor,\n })\n : icon}\n </Box>\n )}\n\n <TimeSegment\n ref={(el: any) => {\n segmentRefs.current[0] = el;\n }}\n value={hours}\n onChange={handleHoursChange}\n onAdvance={advanceFrom(0)}\n onRetreat={retreatFrom(0)}\n min={is12h ? 1 : 0}\n max={is12h ? 12 : 23}\n disabled={disabled}\n placeholder=\"--\"\n fontSize={sizeStyles.fontSize}\n textColor={textColor}\n placeholderColor={placeholderColor}\n focusColor={theme.colors.background.brand.primary}\n aria-label=\"Hours\"\n testID={testID ? `${testID}-hours` : undefined}\n />\n\n <Text\n color={colonColor}\n fontSize={sizeStyles.fontSize}\n fontWeight=\"500\"\n >\n :\n </Text>\n\n <TimeSegment\n ref={(el: any) => {\n segmentRefs.current[1] = el;\n }}\n value={minutes}\n onChange={handleMinutesChange}\n onAdvance={advanceFrom(1)}\n onRetreat={retreatFrom(1)}\n min={0}\n max={59}\n disabled={disabled}\n placeholder=\"--\"\n fontSize={sizeStyles.fontSize}\n textColor={textColor}\n placeholderColor={placeholderColor}\n focusColor={theme.colors.background.brand.primary}\n aria-label=\"Minutes\"\n testID={testID ? `${testID}-minutes` : undefined}\n />\n\n {showSeconds && (\n <>\n <Text\n color={colonColor}\n fontSize={sizeStyles.fontSize}\n fontWeight=\"500\"\n >\n :\n </Text>\n <TimeSegment\n ref={(el: any) => {\n segmentRefs.current[2] = el;\n }}\n value={seconds}\n onChange={handleSecondsChange}\n onAdvance={advanceFrom(2)}\n onRetreat={retreatFrom(2)}\n min={0}\n max={59}\n disabled={disabled}\n placeholder=\"--\"\n fontSize={sizeStyles.fontSize}\n textColor={textColor}\n placeholderColor={placeholderColor}\n focusColor={theme.colors.background.brand.primary}\n aria-label=\"Seconds\"\n testID={testID ? `${testID}-seconds` : undefined}\n />\n </>\n )}\n\n {showPeriod && (\n <PeriodToggle\n value={period}\n onChange={handlePeriodChange}\n disabled={disabled}\n fontSize={sizeStyles.fontSize}\n textColor={textColor}\n testID={testID ? `${testID}-period` : undefined}\n />\n )}\n </Box>\n\n {error && (\n <Text\n id={errorId}\n role=\"alert\"\n color={theme.colors.content.alert.primary}\n fontSize={sizeStyles.fontSize - 2}\n >\n {error}\n </Text>\n )}\n </Box>\n );\n};\n\nInputTime.displayName = \"InputTime\";\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","import React, { forwardRef } from \"react\";\nimport { TextInput as RNTextInput } from \"react-native\";\nimport { InputPrimitiveProps } from \"@xsolla/xui-primitives-core\";\n\n// Map web input types to React Native keyboard types\nconst keyboardTypeMap: Record<string, any> = {\n text: \"default\",\n number: \"numeric\",\n email: \"email-address\",\n tel: \"phone-pad\",\n url: \"url\",\n decimal: \"decimal-pad\",\n};\n\n// Map web inputMode to React Native keyboard types\nconst inputModeToKeyboardType: Record<string, any> = {\n none: \"default\",\n text: \"default\",\n decimal: \"decimal-pad\",\n numeric: \"number-pad\",\n tel: \"phone-pad\",\n search: \"default\",\n email: \"email-address\",\n url: \"url\",\n};\n\n// Map web autoComplete to React Native textContentType (iOS)\nconst autoCompleteToTextContentType: Record<string, any> = {\n \"one-time-code\": \"oneTimeCode\",\n email: \"emailAddress\",\n username: \"username\",\n password: \"password\",\n \"new-password\": \"newPassword\",\n tel: \"telephoneNumber\",\n \"postal-code\": \"postalCode\",\n name: \"name\",\n};\n\nexport const InputPrimitive = forwardRef<RNTextInput, InputPrimitiveProps>(\n (\n {\n value,\n placeholder,\n onChange,\n onChangeText,\n onFocus,\n onBlur,\n onKeyDown,\n disabled,\n secureTextEntry,\n style,\n color,\n fontSize,\n fontFamily,\n placeholderTextColor,\n maxLength,\n type,\n inputMode,\n autoComplete,\n id,\n \"aria-describedby\": ariaDescribedBy,\n \"aria-label\": ariaLabel,\n \"aria-disabled\": ariaDisabled,\n \"data-testid\": dataTestId,\n testID,\n },\n ref\n ) => {\n const handleChangeText = (text: string) => {\n onChangeText?.(text);\n\n // Create a synthetic event for onChange compatibility\n // Include nativeEvent and no-op methods to prevent runtime errors\n // when consumers expect DOM-like event behavior\n if (onChange) {\n const syntheticEvent = {\n target: { value: text },\n currentTarget: { value: text },\n type: \"change\",\n nativeEvent: { text },\n preventDefault: () => {},\n stopPropagation: () => {},\n isTrusted: false,\n } as unknown as React.ChangeEvent<HTMLInputElement>;\n onChange(syntheticEvent);\n }\n };\n\n // Determine keyboard type - inputMode takes precedence over type\n const keyboardType = inputMode\n ? inputModeToKeyboardType[inputMode] || \"default\"\n : type\n ? keyboardTypeMap[type] || \"default\"\n : \"default\";\n\n // Determine textContentType for iOS autofill\n const textContentType = autoComplete\n ? autoCompleteToTextContentType[autoComplete]\n : undefined;\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 return (\n <RNTextInput\n ref={ref}\n value={value}\n placeholder={placeholder}\n onChangeText={handleChangeText}\n onFocus={onFocus}\n onBlur={onBlur}\n onKeyPress={(e) => {\n // Map onKeyPress to onKeyDown for cross-platform compatibility\n // Include preventDefault to avoid runtime errors when consumers call it\n if (onKeyDown) {\n onKeyDown({\n key: e.nativeEvent.key,\n preventDefault: () => {},\n } as any);\n }\n }}\n editable={!disabled}\n secureTextEntry={secureTextEntry || type === \"password\"}\n keyboardType={keyboardType}\n textContentType={textContentType}\n style={[\n {\n color,\n fontSize: typeof fontSize === \"number\" ? fontSize : undefined,\n fontFamily: resolvedFontFamily,\n flex: 1,\n padding: 0,\n textAlign: (style as any)?.textAlign || \"left\",\n },\n style as any,\n ]}\n placeholderTextColor={placeholderTextColor}\n maxLength={maxLength}\n // React Native accessibility props\n testID={dataTestId || testID || id}\n accessibilityLabel={ariaLabel}\n accessibilityHint={ariaDescribedBy}\n accessibilityState={{\n disabled: disabled || ariaDisabled,\n }}\n accessible={true}\n />\n );\n }\n);\n\nInputPrimitive.displayName = \"InputPrimitive\";\n","import React, {\n useRef,\n useState,\n useCallback,\n forwardRef,\n useImperativeHandle,\n} from \"react\";\n// @ts-expect-error - this will be resolved at build time\nimport { Box, InputPrimitive } from \"@xsolla/xui-primitives\";\nimport { formatSegment, parseSegmentInput } from \"./utils\";\n\ninterface TimeSegmentProps {\n value: number | null;\n onChange: (value: number | null) => void;\n onAdvance: () => void;\n onRetreat: () => void;\n min: number;\n max: number;\n disabled?: boolean;\n placeholder?: string;\n fontSize: number;\n textColor: string;\n placeholderColor: string;\n focusColor: string;\n \"aria-label\"?: string;\n testID?: string;\n}\n\nexport const TimeSegment = forwardRef<{ focus: () => void }, TimeSegmentProps>(\n (\n {\n value,\n onChange,\n onAdvance,\n onRetreat,\n min,\n max,\n disabled = false,\n placeholder = \"--\",\n fontSize,\n textColor,\n placeholderColor,\n focusColor,\n \"aria-label\": ariaLabel,\n testID,\n },\n ref\n ) => {\n const inputRef = useRef<any>(null);\n const [editBuffer, setEditBuffer] = useState<string>(\"\");\n const [isFocused, setIsFocused] = useState(false);\n const committedRef = useRef(false);\n const freshFocusRef = useRef(false);\n\n useImperativeHandle(ref, () => ({\n focus: () => inputRef.current?.focus?.(),\n }));\n\n const displayValue = isFocused\n ? editBuffer\n : value !== null\n ? formatSegment(value)\n : \"\";\n\n const commitValue = useCallback(\n (text: string) => {\n const parsed = parseSegmentInput(text);\n if (parsed !== null) {\n const clamped = Math.min(max, Math.max(min, parsed));\n onChange(clamped);\n }\n },\n [onChange, min, max]\n );\n\n const handleFocus = () => {\n setIsFocused(true);\n setEditBuffer(value !== null ? formatSegment(value) : \"\");\n committedRef.current = false;\n freshFocusRef.current = true;\n };\n\n const handleBlur = () => {\n setIsFocused(false);\n if (!committedRef.current && editBuffer) {\n commitValue(editBuffer);\n }\n committedRef.current = false;\n setEditBuffer(\"\");\n };\n\n const extractTypedDigit = (newText: string, oldText: string): string => {\n const newDigits = newText.replace(/\\D/g, \"\");\n const oldDigits = oldText.replace(/\\D/g, \"\");\n if (newDigits.length <= oldDigits.length) return \"\";\n let remaining = newDigits;\n for (const ch of oldDigits) {\n const idx = remaining.indexOf(ch);\n if (idx !== -1) {\n remaining = remaining.slice(0, idx) + remaining.slice(idx + 1);\n }\n }\n return remaining.charAt(0);\n };\n\n const handleChangeText = (text: string) => {\n let digitsOnly = text.replace(/\\D/g, \"\");\n if (freshFocusRef.current || committedRef.current) {\n const typed = extractTypedDigit(text, displayValue);\n freshFocusRef.current = false;\n committedRef.current = false;\n if (!typed) return;\n digitsOnly = typed;\n } else {\n digitsOnly = digitsOnly.slice(-2);\n }\n setEditBuffer(digitsOnly);\n if (digitsOnly.length === 2) {\n committedRef.current = true;\n commitValue(digitsOnly);\n onAdvance();\n }\n };\n\n const handleKeyDown = (e: any) => {\n const key = e.key || e.nativeEvent?.key;\n\n if (key === \"ArrowUp\") {\n e.preventDefault();\n const current = value ?? min;\n const next = current >= max ? min : current + 1;\n onChange(next);\n setEditBuffer(formatSegment(next));\n committedRef.current = true;\n } else if (key === \"ArrowDown\") {\n e.preventDefault();\n const current = value ?? min;\n const next = current <= min ? max : current - 1;\n onChange(next);\n setEditBuffer(formatSegment(next));\n committedRef.current = true;\n } else if (key === \"ArrowRight\") {\n onAdvance();\n } else if (key === \"ArrowLeft\") {\n onRetreat();\n } else if (key === \"Backspace\" && editBuffer.length === 0) {\n onChange(null);\n onRetreat();\n } else if (key === \"Tab\") {\n if (editBuffer) {\n commitValue(editBuffer);\n }\n } else if (key === \"Enter\") {\n if (editBuffer) {\n commitValue(editBuffer);\n }\n inputRef.current?.blur?.();\n }\n };\n\n return (\n <Box\n onPress={() => inputRef.current?.focus?.()}\n width={fontSize * 1.5}\n height={fontSize + 8}\n justifyContent=\"center\"\n alignItems=\"center\"\n backgroundColor={isFocused ? focusColor : \"transparent\"}\n borderRadius={4}\n >\n <InputPrimitive\n ref={inputRef}\n value={displayValue}\n placeholder={placeholder}\n onChangeText={handleChangeText}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n disabled={disabled}\n inputMode=\"numeric\"\n color={textColor}\n fontSize={fontSize}\n placeholderTextColor={placeholderColor}\n aria-label={ariaLabel}\n data-testid={testID}\n style={{\n textAlign: \"center\",\n width: \"100%\",\n padding: 0,\n border: \"none\",\n outline: \"none\",\n boxShadow: \"none\",\n background: \"transparent\",\n caretColor: \"transparent\",\n }}\n />\n </Box>\n );\n }\n);\n\nTimeSegment.displayName = \"TimeSegment\";\n","export function clampValue(value: number, min: number, max: number): number {\n if (isNaN(value)) return min;\n return Math.min(max, Math.max(min, value));\n}\n\nexport function clampHours(value: number, is12h: boolean): number {\n return is12h ? clampValue(value, 1, 12) : clampValue(value, 0, 23);\n}\n\nexport function clampMinutes(value: number): number {\n return clampValue(value, 0, 59);\n}\n\nexport function clampSeconds(value: number): number {\n return clampValue(value, 0, 59);\n}\n\nexport function formatSegment(value: number | undefined | null): string {\n if (value === undefined || value === null) return \"\";\n return value.toString().padStart(2, \"0\");\n}\n\nexport function parseSegmentInput(text: string): number | null {\n const num = parseInt(text, 10);\n return isNaN(num) ? null : num;\n}\n","import React from \"react\";\n// @ts-expect-error - this will be resolved at build time\nimport { Box, Text } from \"@xsolla/xui-primitives\";\n\ninterface PeriodToggleProps {\n value: \"am\" | \"pm\";\n onChange: (value: \"am\" | \"pm\") => void;\n disabled?: boolean;\n fontSize: number;\n textColor: string;\n testID?: string;\n}\n\nexport const PeriodToggle: React.FC<PeriodToggleProps> = ({\n value,\n onChange,\n disabled = false,\n fontSize,\n textColor,\n testID,\n}) => {\n const toggle = () => {\n if (!disabled) {\n onChange(value === \"am\" ? \"pm\" : \"am\");\n }\n };\n\n return (\n <Box\n onPress={toggle}\n cursor={disabled ? \"default\" : \"pointer\"}\n justifyContent=\"center\"\n alignItems=\"center\"\n paddingHorizontal={4}\n role=\"button\"\n aria-label={`Time period: ${value.toUpperCase()}. Click to toggle.`}\n data-testid={testID}\n >\n <Text color={textColor} fontSize={fontSize} fontWeight=\"500\">\n {value}\n </Text>\n </Box>\n );\n};\n"],"mappings":"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","names":["import_react","import_react_native","import_jsx_runtime","RNText","import_react_native","import_jsx_runtime","RNTextInput","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","React"]}
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
  }
@@ -301,7 +303,8 @@ var InputPrimitive = forwardRef(
301
303
  "aria-describedby": ariaDescribedBy,
302
304
  "aria-label": ariaLabel,
303
305
  "aria-disabled": ariaDisabled,
304
- "data-testid": dataTestId
306
+ "data-testid": dataTestId,
307
+ testID
305
308
  }, ref) => {
306
309
  const handleChangeText = (text) => {
307
310
  onChangeText?.(text);
@@ -361,7 +364,7 @@ var InputPrimitive = forwardRef(
361
364
  ],
362
365
  placeholderTextColor,
363
366
  maxLength,
364
- testID: dataTestId || id,
367
+ testID: dataTestId || testID || id,
365
368
  accessibilityLabel: ariaLabel,
366
369
  accessibilityHint: ariaDescribedBy,
367
370
  accessibilityState: {