@xsolla/xui-input-color 0.199.0 → 0.201.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
@@ -30,6 +30,38 @@ var import_react2 = require("react");
30
30
  // ../../foundation/primitives-native/src/Box.tsx
31
31
  var import_react_native = require("react-native");
32
32
  var import_jsx_runtime = require("react/jsx-runtime");
33
+ var roleToAccessibilityRole = {
34
+ button: "button",
35
+ link: "link",
36
+ img: "image",
37
+ image: "image",
38
+ summary: "summary",
39
+ switch: "switch",
40
+ checkbox: "checkbox",
41
+ radio: "radio",
42
+ heading: "header",
43
+ text: "text",
44
+ search: "search",
45
+ alert: "alert",
46
+ none: "none",
47
+ presentation: "none",
48
+ progressbar: "progressbar",
49
+ scrollbar: "scrollbar",
50
+ adjustable: "adjustable",
51
+ tab: "tab",
52
+ menu: "menu",
53
+ menuitem: "menuitem",
54
+ list: "list",
55
+ timer: "timer"
56
+ };
57
+ var toGapValue = (gap) => {
58
+ if (gap === void 0) return void 0;
59
+ if (typeof gap === "number") return gap;
60
+ const pxMatch = /^(\d+(?:\.\d+)?)px$/.exec(gap);
61
+ if (pxMatch) return Number(pxMatch[1]);
62
+ const asNumber = Number(gap);
63
+ return Number.isFinite(asNumber) ? asNumber : void 0;
64
+ };
33
65
  var Box = ({
34
66
  children,
35
67
  onPress,
@@ -62,8 +94,10 @@ var Box = ({
62
94
  marginLeft,
63
95
  marginRight,
64
96
  flexDirection,
97
+ flexWrap,
65
98
  alignItems,
66
99
  justifyContent,
100
+ alignSelf,
67
101
  position,
68
102
  top,
69
103
  bottom,
@@ -75,11 +109,14 @@ var Box = ({
75
109
  maxWidth,
76
110
  maxHeight,
77
111
  flex,
112
+ flexShrink,
113
+ gap,
78
114
  overflow,
79
115
  zIndex,
80
116
  hoverStyle,
81
117
  pressStyle,
82
118
  style,
119
+ disabled,
83
120
  "data-testid": dataTestId,
84
121
  testID,
85
122
  as,
@@ -118,14 +155,18 @@ var Box = ({
118
155
  marginLeft,
119
156
  marginRight,
120
157
  flexDirection,
158
+ flexWrap,
121
159
  alignItems,
122
160
  justifyContent,
161
+ alignSelf,
123
162
  position,
124
163
  top,
125
164
  bottom,
126
165
  left,
127
166
  right,
128
167
  flex,
168
+ flexShrink,
169
+ gap: toGapValue(gap),
129
170
  ...style
130
171
  });
131
172
  const finalTestID = dataTestId || testID;
@@ -134,15 +175,25 @@ var Box = ({
134
175
  tabIndex,
135
176
  onKeyDown,
136
177
  onKeyUp,
137
- "aria-label": _ariaLabel,
178
+ "aria-label": ariaLabel,
138
179
  "aria-labelledby": _ariaLabelledBy,
139
180
  "aria-current": _ariaCurrent,
140
- "aria-disabled": _ariaDisabled,
141
- "aria-live": _ariaLive,
181
+ "aria-disabled": ariaDisabled,
182
+ "aria-live": ariaLive,
183
+ "aria-busy": ariaBusy,
142
184
  className,
143
185
  "data-testid": _dataTestId,
186
+ cursor: _cursor,
187
+ type: _type,
144
188
  ...nativeRest
145
189
  } = rest;
190
+ const accessibilityRole = typeof role === "string" && roleToAccessibilityRole[role] || (as === "button" ? "button" : void 0);
191
+ const isDisabled = Boolean(disabled || ariaDisabled);
192
+ const accessibilityState = {
193
+ disabled: isDisabled || void 0,
194
+ busy: Boolean(ariaBusy) || void 0
195
+ };
196
+ const accessibilityLiveRegion = ariaLive === "polite" || ariaLive === "assertive" ? ariaLive : void 0;
146
197
  if (as === "img" && src) {
147
198
  const imageStyle = {
148
199
  width,
@@ -161,16 +212,18 @@ var Box = ({
161
212
  source: { uri: src },
162
213
  style: imageStyle,
163
214
  testID: finalTestID,
215
+ accessibilityLabel: typeof ariaLabel === "string" ? ariaLabel : alt,
164
216
  resizeMode: "cover",
165
217
  ...nativeRest
166
218
  }
167
219
  );
168
220
  }
169
- if (onPress) {
221
+ if (onPress || as === "button") {
170
222
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
171
223
  import_react_native.Pressable,
172
224
  {
173
- onPress,
225
+ onPress: !isDisabled && onPress ? onPress : void 0,
226
+ disabled: isDisabled,
174
227
  onLayout,
175
228
  onMoveShouldSetResponder,
176
229
  onResponderGrant,
@@ -179,6 +232,10 @@ var Box = ({
179
232
  onResponderTerminate,
180
233
  style: ({ pressed }) => getContainerStyle(pressed),
181
234
  testID: finalTestID,
235
+ accessibilityRole,
236
+ accessibilityLabel: typeof ariaLabel === "string" ? ariaLabel : void 0,
237
+ accessibilityState,
238
+ accessibilityLiveRegion,
182
239
  ...nativeRest,
183
240
  children
184
241
  }
@@ -195,6 +252,10 @@ var Box = ({
195
252
  onResponderMove,
196
253
  onResponderRelease,
197
254
  onResponderTerminate,
255
+ accessibilityRole,
256
+ accessibilityLabel: typeof ariaLabel === "string" ? ariaLabel : void 0,
257
+ accessibilityState,
258
+ accessibilityLiveRegion,
198
259
  ...nativeRest,
199
260
  children
200
261
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.tsx","../../src/InputColor.tsx","../../../../foundation/primitives-native/src/Box.tsx","../../../../foundation/primitives-native/src/Text.tsx","../../../../foundation/primitives-native/src/Input.tsx","../../../../foundation/primitives-native/src/index.tsx"],"sourcesContent":["export * from \"./InputColor\";\n","import React, { forwardRef, useEffect, useMemo, useRef, useState } from \"react\";\n// @ts-expect-error - this will be resolved at build time\nimport { Box, Text, InputPrimitive, isWeb } from \"@xsolla/xui-primitives\";\nimport {\n useResolvedTheme,\n useId,\n type ThemeOverrideProps,\n} from \"@xsolla/xui-core\";\n\n/**\n * Display variant of the InputColor control. Maps 1:1 to the Figma `Type` prop:\n * - `color` → \"Color only\" (swatch preview only, no editable field)\n * - `color-hex` → \"Color + HEX\" (swatch + editable hex field)\n * - `color-rgb` → \"Color + HSL/HSB/RGB\" (swatch + editable R/G/B channels)\n * - `hex` → \"HEX\" (editable hex field only)\n * - `rgb` → \"HSL/HSB/RGB\" (editable R/G/B channels only)\n */\nexport type InputColorType =\n | \"color\"\n | \"color-hex\"\n | \"color-rgb\"\n | \"hex\"\n | \"rgb\";\n\nexport type InputColorSize = \"xl\" | \"lg\" | \"md\" | \"sm\" | \"xs\";\n\nexport interface InputColorProps extends ThemeOverrideProps {\n /**\n * The current color value as a hex string (controlled mode), e.g. `#22A8C3`.\n * When `transparency` is enabled an 8-digit hex (`#RRGGBBAA`) is accepted.\n */\n value?: string;\n /**\n * The initial color value for uncontrolled usage. Defaults to `#000000`.\n */\n defaultValue?: string;\n /**\n * Event handler fired when the color changes. Always receives a hex string.\n */\n onChange?: (value: string) => void;\n /**\n * Fired when the swatch is activated. The swatch is only interactive when\n * `type=\"color\"` — its role is to open the parent ColorPicker panel. For all\n * other types the swatch is a decorative preview and this is never called.\n */\n onSwatchClick?: () => void;\n /**\n * Display variant of the control. Defaults to `color-hex`.\n */\n type?: InputColorType;\n /**\n * Enables the alpha channel. Adds an alpha field and splits the swatch to\n * preview the transparency against a checkerboard.\n */\n transparency?: boolean;\n /**\n * Property for changing the size of the control.\n */\n size?: InputColorSize;\n /**\n * Property for displaying a label above the control.\n */\n label?: string;\n /**\n * Unique identifier for the control. Used for accessibility linking.\n */\n id?: string;\n /**\n * Accessible label for screen readers when no visible label is present.\n */\n \"aria-label\"?: string;\n testID?: string;\n}\n\ntype Rgba = { r: number; g: number; b: number; a: number };\n\nconst clamp = (n: number, min: number, max: number) =>\n Math.min(Math.max(n, min), max);\n\nconst HEX_CHARS = /[^0-9a-fA-F]/g;\n\n/** Parse a `#RGB`/`#RGBA`/`#RRGGBB`/`#RRGGBBAA` hex string into RGBA. */\nfunction hexToRgba(hex: string): Rgba {\n let h = (hex || \"\").replace(/^#/, \"\");\n if (h.length === 3 || h.length === 4) {\n h = h\n .split(\"\")\n .map((c) => c + c)\n .join(\"\");\n }\n const r = parseInt(h.slice(0, 2), 16);\n const g = parseInt(h.slice(2, 4), 16);\n const b = parseInt(h.slice(4, 6), 16);\n const a = h.length >= 8 ? parseInt(h.slice(6, 8), 16) / 255 : 1;\n return {\n r: Number.isNaN(r) ? 0 : r,\n g: Number.isNaN(g) ? 0 : g,\n b: Number.isNaN(b) ? 0 : b,\n a: Number.isNaN(a) ? 1 : parseFloat(a.toFixed(2)),\n };\n}\n\n/** Serialize RGBA back to an uppercase hex string. */\nfunction rgbaToHex({ r, g, b, a }: Rgba, includeAlpha: boolean): string {\n const toHex = (n: number) =>\n Math.round(clamp(n, 0, 255))\n .toString(16)\n .padStart(2, \"0\");\n const alpha = includeAlpha ? toHex(clamp(a, 0, 1) * 255) : \"\";\n return `#${toHex(r)}${toHex(g)}${toHex(b)}${alpha}`.toUpperCase();\n}\n\nconst SWATCH_SIZE: Record<InputColorSize, number> = {\n xl: 36,\n lg: 32,\n md: 26,\n sm: 20,\n xs: 14,\n};\n\n// Width of the trailing alpha (\"%\") segment per size, derived from the Figma\n// \"Color only / Transparency=True\" widths (total − swatch square − 2px gap).\nconst ALPHA_WIDTH: Record<InputColorSize, number> = {\n xl: 96,\n lg: 86,\n md: 77,\n sm: 67,\n xs: 58,\n};\n\n// Gap between the swatch and the value content inside a field, from the Figma\n// `input/<size>/frame/gap` tokens.\nconst FRAME_GAP: Record<InputColorSize, number> = {\n xl: 10,\n lg: 10,\n md: 8,\n sm: 6,\n xs: 4,\n};\n\n// CSS checkerboard, only visible behind partially-transparent colors.\nconst CHECKERBOARD =\n \"conic-gradient(rgba(0,0,0,0.45) 25%, transparent 0 50%, rgba(0,0,0,0.45) 0 75%, transparent 0)\";\n\ntype Corner = \"left\" | \"right\" | \"middle\" | \"all\";\n\nfunction cornerRadii(corner: Corner, radius: number) {\n const map = {\n all: [radius, radius, radius, radius],\n left: [radius, 0, 0, radius],\n right: [0, radius, radius, 0],\n middle: [0, 0, 0, 0],\n } as const;\n const [tl, tr, br, bl] = map[corner];\n return {\n borderTopLeftRadius: tl,\n borderTopRightRadius: tr,\n borderBottomRightRadius: br,\n borderBottomLeftRadius: bl,\n };\n}\n\n/* -------------------------------------------------------------------------- */\n/* Color swatch */\n/* -------------------------------------------------------------------------- */\n\nfunction ColorSwatch({\n size,\n rgba,\n transparency,\n borderColor,\n}: {\n size: number;\n rgba: Rgba;\n transparency: boolean;\n borderColor: string;\n}) {\n const solid = `rgb(${rgba.r}, ${rgba.g}, ${rgba.b})`;\n const withAlpha = `rgba(${rgba.r}, ${rgba.g}, ${rgba.b}, ${rgba.a})`;\n return (\n <Box\n width={size}\n height={size}\n position=\"relative\"\n borderColor={borderColor}\n borderWidth={1}\n style={{ borderRadius: 4, overflow: \"hidden\" }}\n data-testid=\"input-color__swatch-preview\"\n >\n {transparency && (\n <Box\n aria-hidden\n style={{\n position: \"absolute\",\n inset: 0,\n backgroundImage: CHECKERBOARD,\n backgroundSize: \"8px 8px\",\n opacity: 0.2,\n }}\n />\n )}\n {transparency ? (\n <>\n <Box\n style={{\n position: \"absolute\",\n top: 0,\n bottom: 0,\n left: 0,\n right: \"50%\",\n backgroundColor: solid,\n }}\n />\n <Box\n style={{\n position: \"absolute\",\n top: 0,\n bottom: 0,\n left: \"50%\",\n right: 0,\n backgroundColor: withAlpha,\n }}\n />\n </>\n ) : (\n <Box\n style={{ position: \"absolute\", inset: 0, backgroundColor: solid }}\n />\n )}\n </Box>\n );\n}\n\n/* -------------------------------------------------------------------------- */\n/* Editable text field */\n/* -------------------------------------------------------------------------- */\n\ntype TextFieldProps = {\n value: string;\n onCommit: (text: string) => void;\n sanitize: (text: string) => string;\n maxLength?: number;\n textAlign?: \"left\" | \"center\";\n color: string;\n fontSize: number;\n fontFamily: string;\n ariaLabel: string;\n inputMode?: \"numeric\" | \"text\";\n /** When set, Arrow Up/Down step the numeric value within [min, max]. */\n step?: { min: number; max: number };\n testID?: string;\n onFocus: () => void;\n onBlur: () => void;\n};\n\n/**\n * A controlled-but-buffered text field. Keeps the raw keystrokes locally so the\n * user can type freely, but resyncs to the canonical `value` on prop change and\n * on blur.\n */\nfunction TextField({\n value,\n onCommit,\n sanitize,\n maxLength,\n textAlign = \"left\",\n color,\n fontSize,\n fontFamily,\n ariaLabel,\n inputMode = \"text\",\n step,\n testID,\n onFocus,\n onBlur,\n}: TextFieldProps) {\n const [text, setText] = useState(value);\n // While the field is focused we keep the user's raw keystrokes and never\n // overwrite them with the canonical (normalized/expanded/clamped) value —\n // that resync is what caused the field to \"auto-fill\" mid-typing. We only\n // resync from `value` for external changes (unfocused) and on blur.\n const isFocusedRef = useRef(false);\n\n useEffect(() => {\n if (!isFocusedRef.current) setText(value);\n }, [value]);\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const next = sanitize(e.target.value);\n setText(next);\n onCommit(next);\n };\n\n const handleFocus = () => {\n isFocusedRef.current = true;\n onFocus();\n };\n\n const handleBlur = () => {\n isFocusedRef.current = false;\n setText(value);\n onBlur();\n };\n\n // Enter commits/normalizes by blurring (the value already propagates live).\n // Arrow Up/Down step numeric fields by ±1 within their range.\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n e.currentTarget.blur();\n return;\n }\n if (step && (e.key === \"ArrowUp\" || e.key === \"ArrowDown\")) {\n e.preventDefault();\n const current = Number.parseInt(text, 10);\n const base = Number.isNaN(current) ? 0 : current;\n const next = String(\n clamp(base + (e.key === \"ArrowUp\" ? 1 : -1), step.min, step.max)\n );\n setText(next);\n onCommit(next);\n }\n };\n\n return (\n <Box flex={1} height=\"100%\" justifyContent=\"center\">\n <InputPrimitive\n value={text}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n type=\"text\"\n inputMode={inputMode}\n maxLength={maxLength}\n color={color}\n fontSize={fontSize}\n fontFamily={fontFamily}\n aria-label={ariaLabel}\n data-testid={testID}\n style={textAlign === \"center\" ? { textAlign: \"center\" } : undefined}\n />\n </Box>\n );\n}\n\n/* -------------------------------------------------------------------------- */\n/* InputColor */\n/* -------------------------------------------------------------------------- */\n\nconst CHANNEL_LABEL: Record<\"red\" | \"green\" | \"blue\" | \"alpha\", string> = {\n red: \"Red channel\",\n green: \"Green channel\",\n blue: \"Blue channel\",\n alpha: \"Opacity percentage\",\n};\n\nexport const InputColor = forwardRef<HTMLDivElement, InputColorProps>(\n (\n {\n value,\n defaultValue,\n onChange,\n onSwatchClick,\n type = \"color-hex\",\n transparency = false,\n size = \"md\",\n label,\n id: providedId,\n \"aria-label\": ariaLabel,\n testID,\n themeMode,\n themeProductContext,\n },\n ref\n ) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n\n // Mirrors the Input \"useUpdatableState\" pattern: always keep an internal\n // value so the swatch and fields reflect edits immediately — even if a\n // controlled parent doesn't echo onChange back — and sync from `value`\n // whenever it changes externally.\n const [internalValue, setInternalValue] = useState(\n value ?? defaultValue ?? \"#000000\"\n );\n useEffect(() => {\n if (value !== undefined) setInternalValue(value);\n }, [value]);\n const currentValue = internalValue;\n\n // Which segment currently owns focus (for outline styling).\n const [focusedKey, setFocusedKey] = useState<string | null>(null);\n\n // Polite live-region message announced to screen readers on each edit.\n const [liveMessage, setLiveMessage] = useState(\"\");\n\n const rawId = useId();\n const safeId = rawId.replace(/:/g, \"\");\n const inputId = providedId || `input-color-${safeId}`;\n const labelId = `${inputId}-label`;\n\n const rgba = useMemo(() => hexToRgba(currentValue), [currentValue]);\n\n const sizeStyles = theme.sizing.input(size);\n const inputColors = theme.colors.control.input;\n const borderRadius = theme.shape.input[size].borderRadius;\n const swatchSize = SWATCH_SIZE[size];\n\n const showSwatch =\n type === \"color\" || type === \"color-hex\" || type === \"color-rgb\";\n const isHex = type === \"hex\" || type === \"color-hex\";\n const isRgb = type === \"rgb\" || type === \"color-rgb\";\n const isSwatchOnly = type === \"color\";\n\n const textColor = inputColors.text;\n const placeholderColor = inputColors.placeholder;\n const fontFamily = theme.fonts.body;\n\n const emit = (next: string) => {\n setInternalValue(next);\n setLiveMessage(`Color updated to ${next}`);\n onChange?.(next);\n };\n\n const emitFromRgba = (next: Rgba) => emit(rgbaToHex(next, transparency));\n\n /* ---- per-segment visual state ---- */\n const segmentVisuals = (focused: boolean) => {\n let backgroundColor = inputColors.bg;\n let borderColor = inputColors.border;\n let outlineColor: string | undefined;\n if (focused) {\n backgroundColor = theme.colors.control.focus.bg;\n outlineColor = theme.colors.border.brand;\n }\n return { backgroundColor, borderColor, outlineColor };\n };\n\n const renderSegment = (\n key: string,\n corner: Corner,\n content: React.ReactNode,\n opts: { flex?: number; width?: number; square?: boolean } = {}\n ) => {\n const focused = focusedKey === key;\n const { backgroundColor, borderColor, outlineColor } =\n segmentVisuals(focused);\n const width = opts.square ? sizeStyles.height : opts.width;\n return (\n <Box\n key={key}\n backgroundColor={backgroundColor}\n borderColor={borderColor}\n borderWidth={1}\n height={sizeStyles.height}\n width={width}\n flex={opts.flex}\n flexDirection=\"row\"\n alignItems=\"center\"\n justifyContent={opts.square ? \"center\" : \"flex-start\"}\n gap={FRAME_GAP[size]}\n paddingHorizontal={opts.square ? 0 : sizeStyles.paddingHorizontal}\n position=\"relative\"\n style={{\n ...cornerRadii(corner, borderRadius),\n minWidth: opts.square ? undefined : 40,\n ...(outlineColor && isWeb\n ? { outline: `1px solid ${outlineColor}`, outlineOffset: \"-1px\" }\n : outlineColor && !isWeb\n ? { borderColor: outlineColor }\n : {}),\n }}\n hoverStyle={\n !focused\n ? {\n backgroundColor: inputColors.bgHover,\n borderColor: inputColors.borderHover,\n }\n : undefined\n }\n >\n {content}\n </Box>\n );\n };\n\n /* ---- swatch node ----\n * Per the Figma spec the swatch is only interactive when type=\"color\": it\n * acts as the trigger that opens the parent ColorPicker panel (via\n * onSwatchClick). For every other type it is a decorative preview. */\n const swatchVisual = (\n <ColorSwatch\n size={swatchSize}\n rgba={rgba}\n transparency={transparency}\n borderColor={theme.colors.border.secondary}\n />\n );\n const swatchNode = isSwatchOnly ? (\n <Box\n as=\"button\"\n type=\"button\"\n onPress={() => onSwatchClick?.()}\n cursor=\"pointer\"\n backgroundColor=\"transparent\"\n borderWidth={0}\n padding={0}\n alignItems=\"center\"\n justifyContent=\"center\"\n aria-label=\"Open color picker\"\n data-testid=\"input-color__swatch\"\n onFocus={() => setFocusedKey(\"swatch\")}\n onBlur={() => setFocusedKey(null)}\n >\n {swatchVisual}\n </Box>\n ) : (\n <Box\n aria-hidden\n alignItems=\"center\"\n justifyContent=\"center\"\n data-testid=\"input-color__swatch-decorative\"\n >\n {swatchVisual}\n </Box>\n );\n\n /* ---- hex field content ---- */\n const hexContent = (\n <>\n <Text\n color={placeholderColor}\n fontSize={sizeStyles.fontSize}\n style={{ lineHeight: `${sizeStyles.lineHeight}px` }}\n >\n #\n </Text>\n <TextField\n // Hex field is always the RGB triplet; alpha is edited via its own\n // \"%\" segment, so the value never carries an alpha pair here.\n value={rgbaToHex(rgba, false).replace(/^#/, \"\")}\n sanitize={(t) => t.replace(HEX_CHARS, \"\").toUpperCase()}\n maxLength={6}\n onCommit={(digits) => {\n if (digits.length === 3 || digits.length === 6) {\n const next = hexToRgba(`#${digits}`);\n emitFromRgba({ ...next, a: rgba.a });\n }\n }}\n color={textColor}\n fontSize={sizeStyles.fontSize}\n fontFamily={fontFamily}\n ariaLabel=\"Hex color value\"\n testID=\"input-color__hex\"\n onFocus={() => setFocusedKey(\"hex\")}\n onBlur={() => setFocusedKey(null)}\n />\n </>\n );\n\n /* ---- channel field ---- */\n const channelContent = (channel: \"red\" | \"green\" | \"blue\" | \"alpha\") => {\n const isAlpha = channel === \"alpha\";\n const display = isAlpha\n ? Math.round(rgba.a * 100)\n : rgba[channel[0] as \"r\" | \"g\" | \"b\"];\n const field = (\n <TextField\n value={String(display)}\n inputMode=\"numeric\"\n sanitize={(t) => t.replace(/[^0-9]/g, \"\")}\n maxLength={3}\n step={isAlpha ? { min: 0, max: 100 } : { min: 0, max: 255 }}\n onCommit={(t) => {\n if (t === \"\") return;\n const num = parseInt(t, 10);\n if (Number.isNaN(num)) return;\n if (isAlpha) {\n emitFromRgba({ ...rgba, a: clamp(num, 0, 100) / 100 });\n } else {\n const k = channel[0] as \"r\" | \"g\" | \"b\";\n emitFromRgba({ ...rgba, [k]: clamp(num, 0, 255) });\n }\n }}\n color={textColor}\n fontSize={sizeStyles.fontSize}\n fontFamily={fontFamily}\n ariaLabel={CHANNEL_LABEL[channel]}\n testID={`input-color__channel-${channel}`}\n onFocus={() => setFocusedKey(`channel-${channel}`)}\n onBlur={() => setFocusedKey(null)}\n />\n );\n if (!isAlpha) return field;\n return (\n <>\n {field}\n <Text\n color={placeholderColor}\n fontSize={sizeStyles.fontSize}\n style={{ lineHeight: `${sizeStyles.lineHeight}px` }}\n >\n %\n </Text>\n </>\n );\n };\n\n /* ---- assemble control by type ----\n * Build an ordered list of cells, then enabling `transparency` simply\n * appends a trailing alpha (\"%\") cell. Corners are rounded across the whole\n * list: a single cell is fully rounded; otherwise first → left, last →\n * right, the rest square. */\n type Cell = {\n key: string;\n content: React.ReactNode;\n flex?: number;\n width?: number;\n square?: boolean;\n };\n const cells: Cell[] = [];\n\n if (isSwatchOnly) {\n cells.push({ key: \"swatch\", content: swatchNode, square: true });\n } else if (isHex) {\n cells.push({\n key: \"field\",\n flex: 1,\n content: (\n <>\n {showSwatch && swatchNode}\n <Box flex={1} flexDirection=\"row\" alignItems=\"center\" gap={4}>\n {hexContent}\n </Box>\n </>\n ),\n });\n } else if (isRgb) {\n if (showSwatch) {\n cells.push({ key: \"swatch\", content: swatchNode, square: true });\n }\n ([\"red\", \"green\", \"blue\"] as const).forEach((channel) =>\n cells.push({\n key: `channel-${channel}`,\n content: channelContent(channel),\n flex: 1,\n })\n );\n }\n\n if (transparency) {\n cells.push({\n key: \"channel-alpha\",\n content: channelContent(\"alpha\"),\n width: ALPHA_WIDTH[size],\n });\n }\n\n const control = cells.map((cell, i) => {\n const corner: Corner =\n cells.length === 1\n ? \"all\"\n : i === 0\n ? \"left\"\n : i === cells.length - 1\n ? \"right\"\n : \"middle\";\n return renderSegment(cell.key, corner, cell.content, {\n flex: cell.flex,\n width: cell.width,\n square: cell.square,\n });\n });\n\n return (\n <Box\n ref={ref}\n flexDirection=\"column\"\n gap={sizeStyles.fieldGap}\n width={isSwatchOnly ? undefined : \"100%\"}\n testID={testID}\n >\n {label && (\n <Box as=\"label\" id={labelId}>\n <Text\n color={theme.colors.content.secondary}\n fontSize={sizeStyles.fontSize - 2}\n fontWeight=\"500\"\n >\n {label}\n </Text>\n </Box>\n )}\n <Box\n flexDirection=\"row\"\n alignItems=\"center\"\n gap={2}\n width={isSwatchOnly ? undefined : \"100%\"}\n role=\"group\"\n aria-labelledby={label ? labelId : undefined}\n aria-label={!label ? ariaLabel : undefined}\n >\n {control}\n </Box>\n {isWeb && (\n <Box\n role=\"status\"\n aria-live=\"polite\"\n data-testid=\"input-color__live\"\n style={{\n position: \"absolute\",\n width: 1,\n height: 1,\n padding: 0,\n margin: -1,\n overflow: \"hidden\",\n clip: \"rect(0 0 0 0)\",\n whiteSpace: \"nowrap\",\n border: 0,\n }}\n >\n {liveMessage}\n </Box>\n )}\n </Box>\n );\n }\n);\n\nInputColor.displayName = \"InputColor\";\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","export * from \"./Box\";\nexport * from \"./Text\";\nexport * from \"./Spinner\";\nexport * from \"./Icon\";\nexport * from \"./Divider\";\nexport * from \"./Input\";\nexport * from \"./TextArea\";\nexport * from \"./LinearGradient\";\n\nexport const isWeb = false;\nexport const isNative = true;\n"],"mappings":"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","names":["import_react","import_react_native","import_jsx_runtime","RNText","import_react_native","import_jsx_runtime","RNTextInput","import_jsx_runtime"]}
1
+ {"version":3,"sources":["../../src/index.tsx","../../src/InputColor.tsx","../../../../foundation/primitives-native/src/Box.tsx","../../../../foundation/primitives-native/src/Text.tsx","../../../../foundation/primitives-native/src/Input.tsx","../../../../foundation/primitives-native/src/index.tsx"],"sourcesContent":["export * from \"./InputColor\";\n","import React, { forwardRef, useEffect, useMemo, useRef, useState } from \"react\";\n// @ts-expect-error - this will be resolved at build time\nimport { Box, Text, InputPrimitive, isWeb } from \"@xsolla/xui-primitives\";\nimport {\n useResolvedTheme,\n useId,\n type ThemeOverrideProps,\n} from \"@xsolla/xui-core\";\n\n/**\n * Display variant of the InputColor control. Maps 1:1 to the Figma `Type` prop:\n * - `color` → \"Color only\" (swatch preview only, no editable field)\n * - `color-hex` → \"Color + HEX\" (swatch + editable hex field)\n * - `color-rgb` → \"Color + HSL/HSB/RGB\" (swatch + editable R/G/B channels)\n * - `hex` → \"HEX\" (editable hex field only)\n * - `rgb` → \"HSL/HSB/RGB\" (editable R/G/B channels only)\n */\nexport type InputColorType =\n | \"color\"\n | \"color-hex\"\n | \"color-rgb\"\n | \"hex\"\n | \"rgb\";\n\nexport type InputColorSize = \"xl\" | \"lg\" | \"md\" | \"sm\" | \"xs\";\n\nexport interface InputColorProps extends ThemeOverrideProps {\n /**\n * The current color value as a hex string (controlled mode), e.g. `#22A8C3`.\n * When `transparency` is enabled an 8-digit hex (`#RRGGBBAA`) is accepted.\n */\n value?: string;\n /**\n * The initial color value for uncontrolled usage. Defaults to `#000000`.\n */\n defaultValue?: string;\n /**\n * Event handler fired when the color changes. Always receives a hex string.\n */\n onChange?: (value: string) => void;\n /**\n * Fired when the swatch is activated. The swatch is only interactive when\n * `type=\"color\"` — its role is to open the parent ColorPicker panel. For all\n * other types the swatch is a decorative preview and this is never called.\n */\n onSwatchClick?: () => void;\n /**\n * Display variant of the control. Defaults to `color-hex`.\n */\n type?: InputColorType;\n /**\n * Enables the alpha channel. Adds an alpha field and splits the swatch to\n * preview the transparency against a checkerboard.\n */\n transparency?: boolean;\n /**\n * Property for changing the size of the control.\n */\n size?: InputColorSize;\n /**\n * Property for displaying a label above the control.\n */\n label?: string;\n /**\n * Unique identifier for the control. Used for accessibility linking.\n */\n id?: string;\n /**\n * Accessible label for screen readers when no visible label is present.\n */\n \"aria-label\"?: string;\n testID?: string;\n}\n\ntype Rgba = { r: number; g: number; b: number; a: number };\n\nconst clamp = (n: number, min: number, max: number) =>\n Math.min(Math.max(n, min), max);\n\nconst HEX_CHARS = /[^0-9a-fA-F]/g;\n\n/** Parse a `#RGB`/`#RGBA`/`#RRGGBB`/`#RRGGBBAA` hex string into RGBA. */\nfunction hexToRgba(hex: string): Rgba {\n let h = (hex || \"\").replace(/^#/, \"\");\n if (h.length === 3 || h.length === 4) {\n h = h\n .split(\"\")\n .map((c) => c + c)\n .join(\"\");\n }\n const r = parseInt(h.slice(0, 2), 16);\n const g = parseInt(h.slice(2, 4), 16);\n const b = parseInt(h.slice(4, 6), 16);\n const a = h.length >= 8 ? parseInt(h.slice(6, 8), 16) / 255 : 1;\n return {\n r: Number.isNaN(r) ? 0 : r,\n g: Number.isNaN(g) ? 0 : g,\n b: Number.isNaN(b) ? 0 : b,\n a: Number.isNaN(a) ? 1 : parseFloat(a.toFixed(2)),\n };\n}\n\n/** Serialize RGBA back to an uppercase hex string. */\nfunction rgbaToHex({ r, g, b, a }: Rgba, includeAlpha: boolean): string {\n const toHex = (n: number) =>\n Math.round(clamp(n, 0, 255))\n .toString(16)\n .padStart(2, \"0\");\n const alpha = includeAlpha ? toHex(clamp(a, 0, 1) * 255) : \"\";\n return `#${toHex(r)}${toHex(g)}${toHex(b)}${alpha}`.toUpperCase();\n}\n\nconst SWATCH_SIZE: Record<InputColorSize, number> = {\n xl: 36,\n lg: 32,\n md: 26,\n sm: 20,\n xs: 14,\n};\n\n// Width of the trailing alpha (\"%\") segment per size, derived from the Figma\n// \"Color only / Transparency=True\" widths (total − swatch square − 2px gap).\nconst ALPHA_WIDTH: Record<InputColorSize, number> = {\n xl: 96,\n lg: 86,\n md: 77,\n sm: 67,\n xs: 58,\n};\n\n// Gap between the swatch and the value content inside a field, from the Figma\n// `input/<size>/frame/gap` tokens.\nconst FRAME_GAP: Record<InputColorSize, number> = {\n xl: 10,\n lg: 10,\n md: 8,\n sm: 6,\n xs: 4,\n};\n\n// CSS checkerboard, only visible behind partially-transparent colors.\nconst CHECKERBOARD =\n \"conic-gradient(rgba(0,0,0,0.45) 25%, transparent 0 50%, rgba(0,0,0,0.45) 0 75%, transparent 0)\";\n\ntype Corner = \"left\" | \"right\" | \"middle\" | \"all\";\n\nfunction cornerRadii(corner: Corner, radius: number) {\n const map = {\n all: [radius, radius, radius, radius],\n left: [radius, 0, 0, radius],\n right: [0, radius, radius, 0],\n middle: [0, 0, 0, 0],\n } as const;\n const [tl, tr, br, bl] = map[corner];\n return {\n borderTopLeftRadius: tl,\n borderTopRightRadius: tr,\n borderBottomRightRadius: br,\n borderBottomLeftRadius: bl,\n };\n}\n\n/* -------------------------------------------------------------------------- */\n/* Color swatch */\n/* -------------------------------------------------------------------------- */\n\nfunction ColorSwatch({\n size,\n rgba,\n transparency,\n borderColor,\n}: {\n size: number;\n rgba: Rgba;\n transparency: boolean;\n borderColor: string;\n}) {\n const solid = `rgb(${rgba.r}, ${rgba.g}, ${rgba.b})`;\n const withAlpha = `rgba(${rgba.r}, ${rgba.g}, ${rgba.b}, ${rgba.a})`;\n return (\n <Box\n width={size}\n height={size}\n position=\"relative\"\n borderColor={borderColor}\n borderWidth={1}\n style={{ borderRadius: 4, overflow: \"hidden\" }}\n data-testid=\"input-color__swatch-preview\"\n >\n {transparency && (\n <Box\n aria-hidden\n style={{\n position: \"absolute\",\n inset: 0,\n backgroundImage: CHECKERBOARD,\n backgroundSize: \"8px 8px\",\n opacity: 0.2,\n }}\n />\n )}\n {transparency ? (\n <>\n <Box\n style={{\n position: \"absolute\",\n top: 0,\n bottom: 0,\n left: 0,\n right: \"50%\",\n backgroundColor: solid,\n }}\n />\n <Box\n style={{\n position: \"absolute\",\n top: 0,\n bottom: 0,\n left: \"50%\",\n right: 0,\n backgroundColor: withAlpha,\n }}\n />\n </>\n ) : (\n <Box\n style={{ position: \"absolute\", inset: 0, backgroundColor: solid }}\n />\n )}\n </Box>\n );\n}\n\n/* -------------------------------------------------------------------------- */\n/* Editable text field */\n/* -------------------------------------------------------------------------- */\n\ntype TextFieldProps = {\n value: string;\n onCommit: (text: string) => void;\n sanitize: (text: string) => string;\n maxLength?: number;\n textAlign?: \"left\" | \"center\";\n color: string;\n fontSize: number;\n fontFamily: string;\n ariaLabel: string;\n inputMode?: \"numeric\" | \"text\";\n /** When set, Arrow Up/Down step the numeric value within [min, max]. */\n step?: { min: number; max: number };\n testID?: string;\n onFocus: () => void;\n onBlur: () => void;\n};\n\n/**\n * A controlled-but-buffered text field. Keeps the raw keystrokes locally so the\n * user can type freely, but resyncs to the canonical `value` on prop change and\n * on blur.\n */\nfunction TextField({\n value,\n onCommit,\n sanitize,\n maxLength,\n textAlign = \"left\",\n color,\n fontSize,\n fontFamily,\n ariaLabel,\n inputMode = \"text\",\n step,\n testID,\n onFocus,\n onBlur,\n}: TextFieldProps) {\n const [text, setText] = useState(value);\n // While the field is focused we keep the user's raw keystrokes and never\n // overwrite them with the canonical (normalized/expanded/clamped) value —\n // that resync is what caused the field to \"auto-fill\" mid-typing. We only\n // resync from `value` for external changes (unfocused) and on blur.\n const isFocusedRef = useRef(false);\n\n useEffect(() => {\n if (!isFocusedRef.current) setText(value);\n }, [value]);\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const next = sanitize(e.target.value);\n setText(next);\n onCommit(next);\n };\n\n const handleFocus = () => {\n isFocusedRef.current = true;\n onFocus();\n };\n\n const handleBlur = () => {\n isFocusedRef.current = false;\n setText(value);\n onBlur();\n };\n\n // Enter commits/normalizes by blurring (the value already propagates live).\n // Arrow Up/Down step numeric fields by ±1 within their range.\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n e.currentTarget.blur();\n return;\n }\n if (step && (e.key === \"ArrowUp\" || e.key === \"ArrowDown\")) {\n e.preventDefault();\n const current = Number.parseInt(text, 10);\n const base = Number.isNaN(current) ? 0 : current;\n const next = String(\n clamp(base + (e.key === \"ArrowUp\" ? 1 : -1), step.min, step.max)\n );\n setText(next);\n onCommit(next);\n }\n };\n\n return (\n <Box flex={1} height=\"100%\" justifyContent=\"center\">\n <InputPrimitive\n value={text}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n type=\"text\"\n inputMode={inputMode}\n maxLength={maxLength}\n color={color}\n fontSize={fontSize}\n fontFamily={fontFamily}\n aria-label={ariaLabel}\n data-testid={testID}\n style={textAlign === \"center\" ? { textAlign: \"center\" } : undefined}\n />\n </Box>\n );\n}\n\n/* -------------------------------------------------------------------------- */\n/* InputColor */\n/* -------------------------------------------------------------------------- */\n\nconst CHANNEL_LABEL: Record<\"red\" | \"green\" | \"blue\" | \"alpha\", string> = {\n red: \"Red channel\",\n green: \"Green channel\",\n blue: \"Blue channel\",\n alpha: \"Opacity percentage\",\n};\n\nexport const InputColor = forwardRef<HTMLDivElement, InputColorProps>(\n (\n {\n value,\n defaultValue,\n onChange,\n onSwatchClick,\n type = \"color-hex\",\n transparency = false,\n size = \"md\",\n label,\n id: providedId,\n \"aria-label\": ariaLabel,\n testID,\n themeMode,\n themeProductContext,\n },\n ref\n ) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n\n // Mirrors the Input \"useUpdatableState\" pattern: always keep an internal\n // value so the swatch and fields reflect edits immediately — even if a\n // controlled parent doesn't echo onChange back — and sync from `value`\n // whenever it changes externally.\n const [internalValue, setInternalValue] = useState(\n value ?? defaultValue ?? \"#000000\"\n );\n useEffect(() => {\n if (value !== undefined) setInternalValue(value);\n }, [value]);\n const currentValue = internalValue;\n\n // Which segment currently owns focus (for outline styling).\n const [focusedKey, setFocusedKey] = useState<string | null>(null);\n\n // Polite live-region message announced to screen readers on each edit.\n const [liveMessage, setLiveMessage] = useState(\"\");\n\n const rawId = useId();\n const safeId = rawId.replace(/:/g, \"\");\n const inputId = providedId || `input-color-${safeId}`;\n const labelId = `${inputId}-label`;\n\n const rgba = useMemo(() => hexToRgba(currentValue), [currentValue]);\n\n const sizeStyles = theme.sizing.input(size);\n const inputColors = theme.colors.control.input;\n const borderRadius = theme.shape.input[size].borderRadius;\n const swatchSize = SWATCH_SIZE[size];\n\n const showSwatch =\n type === \"color\" || type === \"color-hex\" || type === \"color-rgb\";\n const isHex = type === \"hex\" || type === \"color-hex\";\n const isRgb = type === \"rgb\" || type === \"color-rgb\";\n const isSwatchOnly = type === \"color\";\n\n const textColor = inputColors.text;\n const placeholderColor = inputColors.placeholder;\n const fontFamily = theme.fonts.body;\n\n const emit = (next: string) => {\n setInternalValue(next);\n setLiveMessage(`Color updated to ${next}`);\n onChange?.(next);\n };\n\n const emitFromRgba = (next: Rgba) => emit(rgbaToHex(next, transparency));\n\n /* ---- per-segment visual state ---- */\n const segmentVisuals = (focused: boolean) => {\n let backgroundColor = inputColors.bg;\n let borderColor = inputColors.border;\n let outlineColor: string | undefined;\n if (focused) {\n backgroundColor = theme.colors.control.focus.bg;\n outlineColor = theme.colors.border.brand;\n }\n return { backgroundColor, borderColor, outlineColor };\n };\n\n const renderSegment = (\n key: string,\n corner: Corner,\n content: React.ReactNode,\n opts: { flex?: number; width?: number; square?: boolean } = {}\n ) => {\n const focused = focusedKey === key;\n const { backgroundColor, borderColor, outlineColor } =\n segmentVisuals(focused);\n const width = opts.square ? sizeStyles.height : opts.width;\n return (\n <Box\n key={key}\n backgroundColor={backgroundColor}\n borderColor={borderColor}\n borderWidth={1}\n height={sizeStyles.height}\n width={width}\n flex={opts.flex}\n flexDirection=\"row\"\n alignItems=\"center\"\n justifyContent={opts.square ? \"center\" : \"flex-start\"}\n gap={FRAME_GAP[size]}\n paddingHorizontal={opts.square ? 0 : sizeStyles.paddingHorizontal}\n position=\"relative\"\n style={{\n ...cornerRadii(corner, borderRadius),\n minWidth: opts.square ? undefined : 40,\n ...(outlineColor && isWeb\n ? { outline: `1px solid ${outlineColor}`, outlineOffset: \"-1px\" }\n : outlineColor && !isWeb\n ? { borderColor: outlineColor }\n : {}),\n }}\n hoverStyle={\n !focused\n ? {\n backgroundColor: inputColors.bgHover,\n borderColor: inputColors.borderHover,\n }\n : undefined\n }\n >\n {content}\n </Box>\n );\n };\n\n /* ---- swatch node ----\n * Per the Figma spec the swatch is only interactive when type=\"color\": it\n * acts as the trigger that opens the parent ColorPicker panel (via\n * onSwatchClick). For every other type it is a decorative preview. */\n const swatchVisual = (\n <ColorSwatch\n size={swatchSize}\n rgba={rgba}\n transparency={transparency}\n borderColor={theme.colors.border.secondary}\n />\n );\n const swatchNode = isSwatchOnly ? (\n <Box\n as=\"button\"\n type=\"button\"\n onPress={() => onSwatchClick?.()}\n cursor=\"pointer\"\n backgroundColor=\"transparent\"\n borderWidth={0}\n padding={0}\n alignItems=\"center\"\n justifyContent=\"center\"\n aria-label=\"Open color picker\"\n data-testid=\"input-color__swatch\"\n onFocus={() => setFocusedKey(\"swatch\")}\n onBlur={() => setFocusedKey(null)}\n >\n {swatchVisual}\n </Box>\n ) : (\n <Box\n aria-hidden\n alignItems=\"center\"\n justifyContent=\"center\"\n data-testid=\"input-color__swatch-decorative\"\n >\n {swatchVisual}\n </Box>\n );\n\n /* ---- hex field content ---- */\n const hexContent = (\n <>\n <Text\n color={placeholderColor}\n fontSize={sizeStyles.fontSize}\n style={{ lineHeight: `${sizeStyles.lineHeight}px` }}\n >\n #\n </Text>\n <TextField\n // Hex field is always the RGB triplet; alpha is edited via its own\n // \"%\" segment, so the value never carries an alpha pair here.\n value={rgbaToHex(rgba, false).replace(/^#/, \"\")}\n sanitize={(t) => t.replace(HEX_CHARS, \"\").toUpperCase()}\n maxLength={6}\n onCommit={(digits) => {\n if (digits.length === 3 || digits.length === 6) {\n const next = hexToRgba(`#${digits}`);\n emitFromRgba({ ...next, a: rgba.a });\n }\n }}\n color={textColor}\n fontSize={sizeStyles.fontSize}\n fontFamily={fontFamily}\n ariaLabel=\"Hex color value\"\n testID=\"input-color__hex\"\n onFocus={() => setFocusedKey(\"hex\")}\n onBlur={() => setFocusedKey(null)}\n />\n </>\n );\n\n /* ---- channel field ---- */\n const channelContent = (channel: \"red\" | \"green\" | \"blue\" | \"alpha\") => {\n const isAlpha = channel === \"alpha\";\n const display = isAlpha\n ? Math.round(rgba.a * 100)\n : rgba[channel[0] as \"r\" | \"g\" | \"b\"];\n const field = (\n <TextField\n value={String(display)}\n inputMode=\"numeric\"\n sanitize={(t) => t.replace(/[^0-9]/g, \"\")}\n maxLength={3}\n step={isAlpha ? { min: 0, max: 100 } : { min: 0, max: 255 }}\n onCommit={(t) => {\n if (t === \"\") return;\n const num = parseInt(t, 10);\n if (Number.isNaN(num)) return;\n if (isAlpha) {\n emitFromRgba({ ...rgba, a: clamp(num, 0, 100) / 100 });\n } else {\n const k = channel[0] as \"r\" | \"g\" | \"b\";\n emitFromRgba({ ...rgba, [k]: clamp(num, 0, 255) });\n }\n }}\n color={textColor}\n fontSize={sizeStyles.fontSize}\n fontFamily={fontFamily}\n ariaLabel={CHANNEL_LABEL[channel]}\n testID={`input-color__channel-${channel}`}\n onFocus={() => setFocusedKey(`channel-${channel}`)}\n onBlur={() => setFocusedKey(null)}\n />\n );\n if (!isAlpha) return field;\n return (\n <>\n {field}\n <Text\n color={placeholderColor}\n fontSize={sizeStyles.fontSize}\n style={{ lineHeight: `${sizeStyles.lineHeight}px` }}\n >\n %\n </Text>\n </>\n );\n };\n\n /* ---- assemble control by type ----\n * Build an ordered list of cells, then enabling `transparency` simply\n * appends a trailing alpha (\"%\") cell. Corners are rounded across the whole\n * list: a single cell is fully rounded; otherwise first → left, last →\n * right, the rest square. */\n type Cell = {\n key: string;\n content: React.ReactNode;\n flex?: number;\n width?: number;\n square?: boolean;\n };\n const cells: Cell[] = [];\n\n if (isSwatchOnly) {\n cells.push({ key: \"swatch\", content: swatchNode, square: true });\n } else if (isHex) {\n cells.push({\n key: \"field\",\n flex: 1,\n content: (\n <>\n {showSwatch && swatchNode}\n <Box flex={1} flexDirection=\"row\" alignItems=\"center\" gap={4}>\n {hexContent}\n </Box>\n </>\n ),\n });\n } else if (isRgb) {\n if (showSwatch) {\n cells.push({ key: \"swatch\", content: swatchNode, square: true });\n }\n ([\"red\", \"green\", \"blue\"] as const).forEach((channel) =>\n cells.push({\n key: `channel-${channel}`,\n content: channelContent(channel),\n flex: 1,\n })\n );\n }\n\n if (transparency) {\n cells.push({\n key: \"channel-alpha\",\n content: channelContent(\"alpha\"),\n width: ALPHA_WIDTH[size],\n });\n }\n\n const control = cells.map((cell, i) => {\n const corner: Corner =\n cells.length === 1\n ? \"all\"\n : i === 0\n ? \"left\"\n : i === cells.length - 1\n ? \"right\"\n : \"middle\";\n return renderSegment(cell.key, corner, cell.content, {\n flex: cell.flex,\n width: cell.width,\n square: cell.square,\n });\n });\n\n return (\n <Box\n ref={ref}\n flexDirection=\"column\"\n gap={sizeStyles.fieldGap}\n width={isSwatchOnly ? undefined : \"100%\"}\n testID={testID}\n >\n {label && (\n <Box as=\"label\" id={labelId}>\n <Text\n color={theme.colors.content.secondary}\n fontSize={sizeStyles.fontSize - 2}\n fontWeight=\"500\"\n >\n {label}\n </Text>\n </Box>\n )}\n <Box\n flexDirection=\"row\"\n alignItems=\"center\"\n gap={2}\n width={isSwatchOnly ? undefined : \"100%\"}\n role=\"group\"\n aria-labelledby={label ? labelId : undefined}\n aria-label={!label ? ariaLabel : undefined}\n >\n {control}\n </Box>\n {isWeb && (\n <Box\n role=\"status\"\n aria-live=\"polite\"\n data-testid=\"input-color__live\"\n style={{\n position: \"absolute\",\n width: 1,\n height: 1,\n padding: 0,\n margin: -1,\n overflow: \"hidden\",\n clip: \"rect(0 0 0 0)\",\n whiteSpace: \"nowrap\",\n border: 0,\n }}\n >\n {liveMessage}\n </Box>\n )}\n </Box>\n );\n }\n);\n\nInputColor.displayName = \"InputColor\";\n","import React from \"react\";\nimport {\n View,\n Pressable,\n Image,\n ViewStyle,\n ImageStyle,\n DimensionValue,\n AnimatableNumericValue,\n AccessibilityRole,\n} from \"react-native\";\nimport { BoxProps } from \"@xsolla/xui-primitives-core\";\n\nconst roleToAccessibilityRole: Record<string, AccessibilityRole> = {\n button: \"button\",\n link: \"link\",\n img: \"image\",\n image: \"image\",\n summary: \"summary\",\n switch: \"switch\",\n checkbox: \"checkbox\",\n radio: \"radio\",\n heading: \"header\",\n text: \"text\",\n search: \"search\",\n alert: \"alert\",\n none: \"none\",\n presentation: \"none\",\n progressbar: \"progressbar\",\n scrollbar: \"scrollbar\",\n adjustable: \"adjustable\",\n tab: \"tab\",\n menu: \"menu\",\n menuitem: \"menuitem\",\n list: \"list\",\n timer: \"timer\",\n};\n\n/** RN ViewStyle.gap is typed as number (Yoga gap), not DimensionValue. */\nconst toGapValue = (gap: number | string | undefined): number | undefined => {\n if (gap === undefined) return undefined;\n if (typeof gap === \"number\") return gap;\n const pxMatch = /^(\\d+(?:\\.\\d+)?)px$/.exec(gap);\n if (pxMatch) return Number(pxMatch[1]);\n const asNumber = Number(gap);\n return Number.isFinite(asNumber) ? asNumber : undefined;\n};\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 flexWrap,\n alignItems,\n justifyContent,\n alignSelf,\n position,\n top,\n bottom,\n left,\n right,\n width,\n minWidth,\n minHeight,\n maxWidth,\n maxHeight,\n flex,\n flexShrink,\n gap,\n overflow,\n zIndex,\n hoverStyle,\n pressStyle,\n style,\n disabled,\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 flexWrap,\n alignItems,\n justifyContent,\n alignSelf,\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 flexShrink,\n gap: toGapValue(gap),\n ...(style as ViewStyle),\n });\n\n const finalTestID = dataTestId || testID;\n\n // Map web a11y props; drop the rest of the web-only attributes before\n // spreading onto RN hosts (unknown props warn at runtime).\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 \"aria-busy\": ariaBusy,\n className,\n \"data-testid\": _dataTestId,\n cursor: _cursor,\n type: _type,\n ...nativeRest\n } = rest as Record<string, unknown>;\n\n const accessibilityRole =\n (typeof role === \"string\" && roleToAccessibilityRole[role]) ||\n (as === \"button\" ? \"button\" : undefined);\n const isDisabled = Boolean(disabled || ariaDisabled);\n const accessibilityState = {\n disabled: isDisabled || undefined,\n busy: Boolean(ariaBusy) || undefined,\n };\n const accessibilityLiveRegion =\n ariaLive === \"polite\" || ariaLive === \"assertive\" ? ariaLive : undefined;\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 accessibilityLabel={typeof ariaLabel === \"string\" ? ariaLabel : alt}\n resizeMode=\"cover\"\n {...nativeRest}\n />\n );\n }\n\n // Prefer Pressable whenever the node is interactive or explicitly a button,\n // so disabled / aria-disabled controls stay in the a11y tree as buttons.\n if (onPress || as === \"button\") {\n return (\n <Pressable\n onPress={!isDisabled && onPress ? onPress : undefined}\n disabled={isDisabled}\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 accessibilityRole={accessibilityRole}\n accessibilityLabel={\n typeof ariaLabel === \"string\" ? ariaLabel : undefined\n }\n accessibilityState={accessibilityState}\n accessibilityLiveRegion={accessibilityLiveRegion}\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 accessibilityRole={accessibilityRole}\n accessibilityLabel={typeof ariaLabel === \"string\" ? ariaLabel : undefined}\n accessibilityState={accessibilityState}\n accessibilityLiveRegion={accessibilityLiveRegion}\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","export * from \"./Box\";\nexport * from \"./Text\";\nexport * from \"./Spinner\";\nexport * from \"./Icon\";\nexport * from \"./Divider\";\nexport * from \"./Input\";\nexport * from \"./TextArea\";\nexport * from \"./LinearGradient\";\n\nexport const isWeb = false;\nexport const isNative = true;\n"],"mappings":"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","names":["import_react","import_react_native","import_jsx_runtime","RNText","import_react_native","import_jsx_runtime","RNTextInput","import_jsx_runtime"]}
package/native/index.mjs CHANGED
@@ -8,6 +8,38 @@ import {
8
8
  Image
9
9
  } from "react-native";
10
10
  import { jsx } from "react/jsx-runtime";
11
+ var roleToAccessibilityRole = {
12
+ button: "button",
13
+ link: "link",
14
+ img: "image",
15
+ image: "image",
16
+ summary: "summary",
17
+ switch: "switch",
18
+ checkbox: "checkbox",
19
+ radio: "radio",
20
+ heading: "header",
21
+ text: "text",
22
+ search: "search",
23
+ alert: "alert",
24
+ none: "none",
25
+ presentation: "none",
26
+ progressbar: "progressbar",
27
+ scrollbar: "scrollbar",
28
+ adjustable: "adjustable",
29
+ tab: "tab",
30
+ menu: "menu",
31
+ menuitem: "menuitem",
32
+ list: "list",
33
+ timer: "timer"
34
+ };
35
+ var toGapValue = (gap) => {
36
+ if (gap === void 0) return void 0;
37
+ if (typeof gap === "number") return gap;
38
+ const pxMatch = /^(\d+(?:\.\d+)?)px$/.exec(gap);
39
+ if (pxMatch) return Number(pxMatch[1]);
40
+ const asNumber = Number(gap);
41
+ return Number.isFinite(asNumber) ? asNumber : void 0;
42
+ };
11
43
  var Box = ({
12
44
  children,
13
45
  onPress,
@@ -40,8 +72,10 @@ var Box = ({
40
72
  marginLeft,
41
73
  marginRight,
42
74
  flexDirection,
75
+ flexWrap,
43
76
  alignItems,
44
77
  justifyContent,
78
+ alignSelf,
45
79
  position,
46
80
  top,
47
81
  bottom,
@@ -53,11 +87,14 @@ var Box = ({
53
87
  maxWidth,
54
88
  maxHeight,
55
89
  flex,
90
+ flexShrink,
91
+ gap,
56
92
  overflow,
57
93
  zIndex,
58
94
  hoverStyle,
59
95
  pressStyle,
60
96
  style,
97
+ disabled,
61
98
  "data-testid": dataTestId,
62
99
  testID,
63
100
  as,
@@ -96,14 +133,18 @@ var Box = ({
96
133
  marginLeft,
97
134
  marginRight,
98
135
  flexDirection,
136
+ flexWrap,
99
137
  alignItems,
100
138
  justifyContent,
139
+ alignSelf,
101
140
  position,
102
141
  top,
103
142
  bottom,
104
143
  left,
105
144
  right,
106
145
  flex,
146
+ flexShrink,
147
+ gap: toGapValue(gap),
107
148
  ...style
108
149
  });
109
150
  const finalTestID = dataTestId || testID;
@@ -112,15 +153,25 @@ var Box = ({
112
153
  tabIndex,
113
154
  onKeyDown,
114
155
  onKeyUp,
115
- "aria-label": _ariaLabel,
156
+ "aria-label": ariaLabel,
116
157
  "aria-labelledby": _ariaLabelledBy,
117
158
  "aria-current": _ariaCurrent,
118
- "aria-disabled": _ariaDisabled,
119
- "aria-live": _ariaLive,
159
+ "aria-disabled": ariaDisabled,
160
+ "aria-live": ariaLive,
161
+ "aria-busy": ariaBusy,
120
162
  className,
121
163
  "data-testid": _dataTestId,
164
+ cursor: _cursor,
165
+ type: _type,
122
166
  ...nativeRest
123
167
  } = rest;
168
+ const accessibilityRole = typeof role === "string" && roleToAccessibilityRole[role] || (as === "button" ? "button" : void 0);
169
+ const isDisabled = Boolean(disabled || ariaDisabled);
170
+ const accessibilityState = {
171
+ disabled: isDisabled || void 0,
172
+ busy: Boolean(ariaBusy) || void 0
173
+ };
174
+ const accessibilityLiveRegion = ariaLive === "polite" || ariaLive === "assertive" ? ariaLive : void 0;
124
175
  if (as === "img" && src) {
125
176
  const imageStyle = {
126
177
  width,
@@ -139,16 +190,18 @@ var Box = ({
139
190
  source: { uri: src },
140
191
  style: imageStyle,
141
192
  testID: finalTestID,
193
+ accessibilityLabel: typeof ariaLabel === "string" ? ariaLabel : alt,
142
194
  resizeMode: "cover",
143
195
  ...nativeRest
144
196
  }
145
197
  );
146
198
  }
147
- if (onPress) {
199
+ if (onPress || as === "button") {
148
200
  return /* @__PURE__ */ jsx(
149
201
  Pressable,
150
202
  {
151
- onPress,
203
+ onPress: !isDisabled && onPress ? onPress : void 0,
204
+ disabled: isDisabled,
152
205
  onLayout,
153
206
  onMoveShouldSetResponder,
154
207
  onResponderGrant,
@@ -157,6 +210,10 @@ var Box = ({
157
210
  onResponderTerminate,
158
211
  style: ({ pressed }) => getContainerStyle(pressed),
159
212
  testID: finalTestID,
213
+ accessibilityRole,
214
+ accessibilityLabel: typeof ariaLabel === "string" ? ariaLabel : void 0,
215
+ accessibilityState,
216
+ accessibilityLiveRegion,
160
217
  ...nativeRest,
161
218
  children
162
219
  }
@@ -173,6 +230,10 @@ var Box = ({
173
230
  onResponderMove,
174
231
  onResponderRelease,
175
232
  onResponderTerminate,
233
+ accessibilityRole,
234
+ accessibilityLabel: typeof ariaLabel === "string" ? ariaLabel : void 0,
235
+ accessibilityState,
236
+ accessibilityLiveRegion,
176
237
  ...nativeRest,
177
238
  children
178
239
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/InputColor.tsx","../../../../foundation/primitives-native/src/Box.tsx","../../../../foundation/primitives-native/src/Text.tsx","../../../../foundation/primitives-native/src/Input.tsx","../../../../foundation/primitives-native/src/index.tsx"],"sourcesContent":["import React, { forwardRef, useEffect, useMemo, useRef, useState } from \"react\";\n// @ts-expect-error - this will be resolved at build time\nimport { Box, Text, InputPrimitive, isWeb } from \"@xsolla/xui-primitives\";\nimport {\n useResolvedTheme,\n useId,\n type ThemeOverrideProps,\n} from \"@xsolla/xui-core\";\n\n/**\n * Display variant of the InputColor control. Maps 1:1 to the Figma `Type` prop:\n * - `color` → \"Color only\" (swatch preview only, no editable field)\n * - `color-hex` → \"Color + HEX\" (swatch + editable hex field)\n * - `color-rgb` → \"Color + HSL/HSB/RGB\" (swatch + editable R/G/B channels)\n * - `hex` → \"HEX\" (editable hex field only)\n * - `rgb` → \"HSL/HSB/RGB\" (editable R/G/B channels only)\n */\nexport type InputColorType =\n | \"color\"\n | \"color-hex\"\n | \"color-rgb\"\n | \"hex\"\n | \"rgb\";\n\nexport type InputColorSize = \"xl\" | \"lg\" | \"md\" | \"sm\" | \"xs\";\n\nexport interface InputColorProps extends ThemeOverrideProps {\n /**\n * The current color value as a hex string (controlled mode), e.g. `#22A8C3`.\n * When `transparency` is enabled an 8-digit hex (`#RRGGBBAA`) is accepted.\n */\n value?: string;\n /**\n * The initial color value for uncontrolled usage. Defaults to `#000000`.\n */\n defaultValue?: string;\n /**\n * Event handler fired when the color changes. Always receives a hex string.\n */\n onChange?: (value: string) => void;\n /**\n * Fired when the swatch is activated. The swatch is only interactive when\n * `type=\"color\"` — its role is to open the parent ColorPicker panel. For all\n * other types the swatch is a decorative preview and this is never called.\n */\n onSwatchClick?: () => void;\n /**\n * Display variant of the control. Defaults to `color-hex`.\n */\n type?: InputColorType;\n /**\n * Enables the alpha channel. Adds an alpha field and splits the swatch to\n * preview the transparency against a checkerboard.\n */\n transparency?: boolean;\n /**\n * Property for changing the size of the control.\n */\n size?: InputColorSize;\n /**\n * Property for displaying a label above the control.\n */\n label?: string;\n /**\n * Unique identifier for the control. Used for accessibility linking.\n */\n id?: string;\n /**\n * Accessible label for screen readers when no visible label is present.\n */\n \"aria-label\"?: string;\n testID?: string;\n}\n\ntype Rgba = { r: number; g: number; b: number; a: number };\n\nconst clamp = (n: number, min: number, max: number) =>\n Math.min(Math.max(n, min), max);\n\nconst HEX_CHARS = /[^0-9a-fA-F]/g;\n\n/** Parse a `#RGB`/`#RGBA`/`#RRGGBB`/`#RRGGBBAA` hex string into RGBA. */\nfunction hexToRgba(hex: string): Rgba {\n let h = (hex || \"\").replace(/^#/, \"\");\n if (h.length === 3 || h.length === 4) {\n h = h\n .split(\"\")\n .map((c) => c + c)\n .join(\"\");\n }\n const r = parseInt(h.slice(0, 2), 16);\n const g = parseInt(h.slice(2, 4), 16);\n const b = parseInt(h.slice(4, 6), 16);\n const a = h.length >= 8 ? parseInt(h.slice(6, 8), 16) / 255 : 1;\n return {\n r: Number.isNaN(r) ? 0 : r,\n g: Number.isNaN(g) ? 0 : g,\n b: Number.isNaN(b) ? 0 : b,\n a: Number.isNaN(a) ? 1 : parseFloat(a.toFixed(2)),\n };\n}\n\n/** Serialize RGBA back to an uppercase hex string. */\nfunction rgbaToHex({ r, g, b, a }: Rgba, includeAlpha: boolean): string {\n const toHex = (n: number) =>\n Math.round(clamp(n, 0, 255))\n .toString(16)\n .padStart(2, \"0\");\n const alpha = includeAlpha ? toHex(clamp(a, 0, 1) * 255) : \"\";\n return `#${toHex(r)}${toHex(g)}${toHex(b)}${alpha}`.toUpperCase();\n}\n\nconst SWATCH_SIZE: Record<InputColorSize, number> = {\n xl: 36,\n lg: 32,\n md: 26,\n sm: 20,\n xs: 14,\n};\n\n// Width of the trailing alpha (\"%\") segment per size, derived from the Figma\n// \"Color only / Transparency=True\" widths (total − swatch square − 2px gap).\nconst ALPHA_WIDTH: Record<InputColorSize, number> = {\n xl: 96,\n lg: 86,\n md: 77,\n sm: 67,\n xs: 58,\n};\n\n// Gap between the swatch and the value content inside a field, from the Figma\n// `input/<size>/frame/gap` tokens.\nconst FRAME_GAP: Record<InputColorSize, number> = {\n xl: 10,\n lg: 10,\n md: 8,\n sm: 6,\n xs: 4,\n};\n\n// CSS checkerboard, only visible behind partially-transparent colors.\nconst CHECKERBOARD =\n \"conic-gradient(rgba(0,0,0,0.45) 25%, transparent 0 50%, rgba(0,0,0,0.45) 0 75%, transparent 0)\";\n\ntype Corner = \"left\" | \"right\" | \"middle\" | \"all\";\n\nfunction cornerRadii(corner: Corner, radius: number) {\n const map = {\n all: [radius, radius, radius, radius],\n left: [radius, 0, 0, radius],\n right: [0, radius, radius, 0],\n middle: [0, 0, 0, 0],\n } as const;\n const [tl, tr, br, bl] = map[corner];\n return {\n borderTopLeftRadius: tl,\n borderTopRightRadius: tr,\n borderBottomRightRadius: br,\n borderBottomLeftRadius: bl,\n };\n}\n\n/* -------------------------------------------------------------------------- */\n/* Color swatch */\n/* -------------------------------------------------------------------------- */\n\nfunction ColorSwatch({\n size,\n rgba,\n transparency,\n borderColor,\n}: {\n size: number;\n rgba: Rgba;\n transparency: boolean;\n borderColor: string;\n}) {\n const solid = `rgb(${rgba.r}, ${rgba.g}, ${rgba.b})`;\n const withAlpha = `rgba(${rgba.r}, ${rgba.g}, ${rgba.b}, ${rgba.a})`;\n return (\n <Box\n width={size}\n height={size}\n position=\"relative\"\n borderColor={borderColor}\n borderWidth={1}\n style={{ borderRadius: 4, overflow: \"hidden\" }}\n data-testid=\"input-color__swatch-preview\"\n >\n {transparency && (\n <Box\n aria-hidden\n style={{\n position: \"absolute\",\n inset: 0,\n backgroundImage: CHECKERBOARD,\n backgroundSize: \"8px 8px\",\n opacity: 0.2,\n }}\n />\n )}\n {transparency ? (\n <>\n <Box\n style={{\n position: \"absolute\",\n top: 0,\n bottom: 0,\n left: 0,\n right: \"50%\",\n backgroundColor: solid,\n }}\n />\n <Box\n style={{\n position: \"absolute\",\n top: 0,\n bottom: 0,\n left: \"50%\",\n right: 0,\n backgroundColor: withAlpha,\n }}\n />\n </>\n ) : (\n <Box\n style={{ position: \"absolute\", inset: 0, backgroundColor: solid }}\n />\n )}\n </Box>\n );\n}\n\n/* -------------------------------------------------------------------------- */\n/* Editable text field */\n/* -------------------------------------------------------------------------- */\n\ntype TextFieldProps = {\n value: string;\n onCommit: (text: string) => void;\n sanitize: (text: string) => string;\n maxLength?: number;\n textAlign?: \"left\" | \"center\";\n color: string;\n fontSize: number;\n fontFamily: string;\n ariaLabel: string;\n inputMode?: \"numeric\" | \"text\";\n /** When set, Arrow Up/Down step the numeric value within [min, max]. */\n step?: { min: number; max: number };\n testID?: string;\n onFocus: () => void;\n onBlur: () => void;\n};\n\n/**\n * A controlled-but-buffered text field. Keeps the raw keystrokes locally so the\n * user can type freely, but resyncs to the canonical `value` on prop change and\n * on blur.\n */\nfunction TextField({\n value,\n onCommit,\n sanitize,\n maxLength,\n textAlign = \"left\",\n color,\n fontSize,\n fontFamily,\n ariaLabel,\n inputMode = \"text\",\n step,\n testID,\n onFocus,\n onBlur,\n}: TextFieldProps) {\n const [text, setText] = useState(value);\n // While the field is focused we keep the user's raw keystrokes and never\n // overwrite them with the canonical (normalized/expanded/clamped) value —\n // that resync is what caused the field to \"auto-fill\" mid-typing. We only\n // resync from `value` for external changes (unfocused) and on blur.\n const isFocusedRef = useRef(false);\n\n useEffect(() => {\n if (!isFocusedRef.current) setText(value);\n }, [value]);\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const next = sanitize(e.target.value);\n setText(next);\n onCommit(next);\n };\n\n const handleFocus = () => {\n isFocusedRef.current = true;\n onFocus();\n };\n\n const handleBlur = () => {\n isFocusedRef.current = false;\n setText(value);\n onBlur();\n };\n\n // Enter commits/normalizes by blurring (the value already propagates live).\n // Arrow Up/Down step numeric fields by ±1 within their range.\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n e.currentTarget.blur();\n return;\n }\n if (step && (e.key === \"ArrowUp\" || e.key === \"ArrowDown\")) {\n e.preventDefault();\n const current = Number.parseInt(text, 10);\n const base = Number.isNaN(current) ? 0 : current;\n const next = String(\n clamp(base + (e.key === \"ArrowUp\" ? 1 : -1), step.min, step.max)\n );\n setText(next);\n onCommit(next);\n }\n };\n\n return (\n <Box flex={1} height=\"100%\" justifyContent=\"center\">\n <InputPrimitive\n value={text}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n type=\"text\"\n inputMode={inputMode}\n maxLength={maxLength}\n color={color}\n fontSize={fontSize}\n fontFamily={fontFamily}\n aria-label={ariaLabel}\n data-testid={testID}\n style={textAlign === \"center\" ? { textAlign: \"center\" } : undefined}\n />\n </Box>\n );\n}\n\n/* -------------------------------------------------------------------------- */\n/* InputColor */\n/* -------------------------------------------------------------------------- */\n\nconst CHANNEL_LABEL: Record<\"red\" | \"green\" | \"blue\" | \"alpha\", string> = {\n red: \"Red channel\",\n green: \"Green channel\",\n blue: \"Blue channel\",\n alpha: \"Opacity percentage\",\n};\n\nexport const InputColor = forwardRef<HTMLDivElement, InputColorProps>(\n (\n {\n value,\n defaultValue,\n onChange,\n onSwatchClick,\n type = \"color-hex\",\n transparency = false,\n size = \"md\",\n label,\n id: providedId,\n \"aria-label\": ariaLabel,\n testID,\n themeMode,\n themeProductContext,\n },\n ref\n ) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n\n // Mirrors the Input \"useUpdatableState\" pattern: always keep an internal\n // value so the swatch and fields reflect edits immediately — even if a\n // controlled parent doesn't echo onChange back — and sync from `value`\n // whenever it changes externally.\n const [internalValue, setInternalValue] = useState(\n value ?? defaultValue ?? \"#000000\"\n );\n useEffect(() => {\n if (value !== undefined) setInternalValue(value);\n }, [value]);\n const currentValue = internalValue;\n\n // Which segment currently owns focus (for outline styling).\n const [focusedKey, setFocusedKey] = useState<string | null>(null);\n\n // Polite live-region message announced to screen readers on each edit.\n const [liveMessage, setLiveMessage] = useState(\"\");\n\n const rawId = useId();\n const safeId = rawId.replace(/:/g, \"\");\n const inputId = providedId || `input-color-${safeId}`;\n const labelId = `${inputId}-label`;\n\n const rgba = useMemo(() => hexToRgba(currentValue), [currentValue]);\n\n const sizeStyles = theme.sizing.input(size);\n const inputColors = theme.colors.control.input;\n const borderRadius = theme.shape.input[size].borderRadius;\n const swatchSize = SWATCH_SIZE[size];\n\n const showSwatch =\n type === \"color\" || type === \"color-hex\" || type === \"color-rgb\";\n const isHex = type === \"hex\" || type === \"color-hex\";\n const isRgb = type === \"rgb\" || type === \"color-rgb\";\n const isSwatchOnly = type === \"color\";\n\n const textColor = inputColors.text;\n const placeholderColor = inputColors.placeholder;\n const fontFamily = theme.fonts.body;\n\n const emit = (next: string) => {\n setInternalValue(next);\n setLiveMessage(`Color updated to ${next}`);\n onChange?.(next);\n };\n\n const emitFromRgba = (next: Rgba) => emit(rgbaToHex(next, transparency));\n\n /* ---- per-segment visual state ---- */\n const segmentVisuals = (focused: boolean) => {\n let backgroundColor = inputColors.bg;\n let borderColor = inputColors.border;\n let outlineColor: string | undefined;\n if (focused) {\n backgroundColor = theme.colors.control.focus.bg;\n outlineColor = theme.colors.border.brand;\n }\n return { backgroundColor, borderColor, outlineColor };\n };\n\n const renderSegment = (\n key: string,\n corner: Corner,\n content: React.ReactNode,\n opts: { flex?: number; width?: number; square?: boolean } = {}\n ) => {\n const focused = focusedKey === key;\n const { backgroundColor, borderColor, outlineColor } =\n segmentVisuals(focused);\n const width = opts.square ? sizeStyles.height : opts.width;\n return (\n <Box\n key={key}\n backgroundColor={backgroundColor}\n borderColor={borderColor}\n borderWidth={1}\n height={sizeStyles.height}\n width={width}\n flex={opts.flex}\n flexDirection=\"row\"\n alignItems=\"center\"\n justifyContent={opts.square ? \"center\" : \"flex-start\"}\n gap={FRAME_GAP[size]}\n paddingHorizontal={opts.square ? 0 : sizeStyles.paddingHorizontal}\n position=\"relative\"\n style={{\n ...cornerRadii(corner, borderRadius),\n minWidth: opts.square ? undefined : 40,\n ...(outlineColor && isWeb\n ? { outline: `1px solid ${outlineColor}`, outlineOffset: \"-1px\" }\n : outlineColor && !isWeb\n ? { borderColor: outlineColor }\n : {}),\n }}\n hoverStyle={\n !focused\n ? {\n backgroundColor: inputColors.bgHover,\n borderColor: inputColors.borderHover,\n }\n : undefined\n }\n >\n {content}\n </Box>\n );\n };\n\n /* ---- swatch node ----\n * Per the Figma spec the swatch is only interactive when type=\"color\": it\n * acts as the trigger that opens the parent ColorPicker panel (via\n * onSwatchClick). For every other type it is a decorative preview. */\n const swatchVisual = (\n <ColorSwatch\n size={swatchSize}\n rgba={rgba}\n transparency={transparency}\n borderColor={theme.colors.border.secondary}\n />\n );\n const swatchNode = isSwatchOnly ? (\n <Box\n as=\"button\"\n type=\"button\"\n onPress={() => onSwatchClick?.()}\n cursor=\"pointer\"\n backgroundColor=\"transparent\"\n borderWidth={0}\n padding={0}\n alignItems=\"center\"\n justifyContent=\"center\"\n aria-label=\"Open color picker\"\n data-testid=\"input-color__swatch\"\n onFocus={() => setFocusedKey(\"swatch\")}\n onBlur={() => setFocusedKey(null)}\n >\n {swatchVisual}\n </Box>\n ) : (\n <Box\n aria-hidden\n alignItems=\"center\"\n justifyContent=\"center\"\n data-testid=\"input-color__swatch-decorative\"\n >\n {swatchVisual}\n </Box>\n );\n\n /* ---- hex field content ---- */\n const hexContent = (\n <>\n <Text\n color={placeholderColor}\n fontSize={sizeStyles.fontSize}\n style={{ lineHeight: `${sizeStyles.lineHeight}px` }}\n >\n #\n </Text>\n <TextField\n // Hex field is always the RGB triplet; alpha is edited via its own\n // \"%\" segment, so the value never carries an alpha pair here.\n value={rgbaToHex(rgba, false).replace(/^#/, \"\")}\n sanitize={(t) => t.replace(HEX_CHARS, \"\").toUpperCase()}\n maxLength={6}\n onCommit={(digits) => {\n if (digits.length === 3 || digits.length === 6) {\n const next = hexToRgba(`#${digits}`);\n emitFromRgba({ ...next, a: rgba.a });\n }\n }}\n color={textColor}\n fontSize={sizeStyles.fontSize}\n fontFamily={fontFamily}\n ariaLabel=\"Hex color value\"\n testID=\"input-color__hex\"\n onFocus={() => setFocusedKey(\"hex\")}\n onBlur={() => setFocusedKey(null)}\n />\n </>\n );\n\n /* ---- channel field ---- */\n const channelContent = (channel: \"red\" | \"green\" | \"blue\" | \"alpha\") => {\n const isAlpha = channel === \"alpha\";\n const display = isAlpha\n ? Math.round(rgba.a * 100)\n : rgba[channel[0] as \"r\" | \"g\" | \"b\"];\n const field = (\n <TextField\n value={String(display)}\n inputMode=\"numeric\"\n sanitize={(t) => t.replace(/[^0-9]/g, \"\")}\n maxLength={3}\n step={isAlpha ? { min: 0, max: 100 } : { min: 0, max: 255 }}\n onCommit={(t) => {\n if (t === \"\") return;\n const num = parseInt(t, 10);\n if (Number.isNaN(num)) return;\n if (isAlpha) {\n emitFromRgba({ ...rgba, a: clamp(num, 0, 100) / 100 });\n } else {\n const k = channel[0] as \"r\" | \"g\" | \"b\";\n emitFromRgba({ ...rgba, [k]: clamp(num, 0, 255) });\n }\n }}\n color={textColor}\n fontSize={sizeStyles.fontSize}\n fontFamily={fontFamily}\n ariaLabel={CHANNEL_LABEL[channel]}\n testID={`input-color__channel-${channel}`}\n onFocus={() => setFocusedKey(`channel-${channel}`)}\n onBlur={() => setFocusedKey(null)}\n />\n );\n if (!isAlpha) return field;\n return (\n <>\n {field}\n <Text\n color={placeholderColor}\n fontSize={sizeStyles.fontSize}\n style={{ lineHeight: `${sizeStyles.lineHeight}px` }}\n >\n %\n </Text>\n </>\n );\n };\n\n /* ---- assemble control by type ----\n * Build an ordered list of cells, then enabling `transparency` simply\n * appends a trailing alpha (\"%\") cell. Corners are rounded across the whole\n * list: a single cell is fully rounded; otherwise first → left, last →\n * right, the rest square. */\n type Cell = {\n key: string;\n content: React.ReactNode;\n flex?: number;\n width?: number;\n square?: boolean;\n };\n const cells: Cell[] = [];\n\n if (isSwatchOnly) {\n cells.push({ key: \"swatch\", content: swatchNode, square: true });\n } else if (isHex) {\n cells.push({\n key: \"field\",\n flex: 1,\n content: (\n <>\n {showSwatch && swatchNode}\n <Box flex={1} flexDirection=\"row\" alignItems=\"center\" gap={4}>\n {hexContent}\n </Box>\n </>\n ),\n });\n } else if (isRgb) {\n if (showSwatch) {\n cells.push({ key: \"swatch\", content: swatchNode, square: true });\n }\n ([\"red\", \"green\", \"blue\"] as const).forEach((channel) =>\n cells.push({\n key: `channel-${channel}`,\n content: channelContent(channel),\n flex: 1,\n })\n );\n }\n\n if (transparency) {\n cells.push({\n key: \"channel-alpha\",\n content: channelContent(\"alpha\"),\n width: ALPHA_WIDTH[size],\n });\n }\n\n const control = cells.map((cell, i) => {\n const corner: Corner =\n cells.length === 1\n ? \"all\"\n : i === 0\n ? \"left\"\n : i === cells.length - 1\n ? \"right\"\n : \"middle\";\n return renderSegment(cell.key, corner, cell.content, {\n flex: cell.flex,\n width: cell.width,\n square: cell.square,\n });\n });\n\n return (\n <Box\n ref={ref}\n flexDirection=\"column\"\n gap={sizeStyles.fieldGap}\n width={isSwatchOnly ? undefined : \"100%\"}\n testID={testID}\n >\n {label && (\n <Box as=\"label\" id={labelId}>\n <Text\n color={theme.colors.content.secondary}\n fontSize={sizeStyles.fontSize - 2}\n fontWeight=\"500\"\n >\n {label}\n </Text>\n </Box>\n )}\n <Box\n flexDirection=\"row\"\n alignItems=\"center\"\n gap={2}\n width={isSwatchOnly ? undefined : \"100%\"}\n role=\"group\"\n aria-labelledby={label ? labelId : undefined}\n aria-label={!label ? ariaLabel : undefined}\n >\n {control}\n </Box>\n {isWeb && (\n <Box\n role=\"status\"\n aria-live=\"polite\"\n data-testid=\"input-color__live\"\n style={{\n position: \"absolute\",\n width: 1,\n height: 1,\n padding: 0,\n margin: -1,\n overflow: \"hidden\",\n clip: \"rect(0 0 0 0)\",\n whiteSpace: \"nowrap\",\n border: 0,\n }}\n >\n {liveMessage}\n </Box>\n )}\n </Box>\n );\n }\n);\n\nInputColor.displayName = \"InputColor\";\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","export * from \"./Box\";\nexport * from \"./Text\";\nexport * from \"./Spinner\";\nexport * from \"./Icon\";\nexport * from \"./Divider\";\nexport * from \"./Input\";\nexport * from \"./TextArea\";\nexport * from \"./LinearGradient\";\n\nexport const isWeb = false;\nexport const isNative = true;\n"],"mappings":"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","names":["forwardRef","jsx","jsx","jsx","forwardRef"]}
1
+ {"version":3,"sources":["../../src/InputColor.tsx","../../../../foundation/primitives-native/src/Box.tsx","../../../../foundation/primitives-native/src/Text.tsx","../../../../foundation/primitives-native/src/Input.tsx","../../../../foundation/primitives-native/src/index.tsx"],"sourcesContent":["import React, { forwardRef, useEffect, useMemo, useRef, useState } from \"react\";\n// @ts-expect-error - this will be resolved at build time\nimport { Box, Text, InputPrimitive, isWeb } from \"@xsolla/xui-primitives\";\nimport {\n useResolvedTheme,\n useId,\n type ThemeOverrideProps,\n} from \"@xsolla/xui-core\";\n\n/**\n * Display variant of the InputColor control. Maps 1:1 to the Figma `Type` prop:\n * - `color` → \"Color only\" (swatch preview only, no editable field)\n * - `color-hex` → \"Color + HEX\" (swatch + editable hex field)\n * - `color-rgb` → \"Color + HSL/HSB/RGB\" (swatch + editable R/G/B channels)\n * - `hex` → \"HEX\" (editable hex field only)\n * - `rgb` → \"HSL/HSB/RGB\" (editable R/G/B channels only)\n */\nexport type InputColorType =\n | \"color\"\n | \"color-hex\"\n | \"color-rgb\"\n | \"hex\"\n | \"rgb\";\n\nexport type InputColorSize = \"xl\" | \"lg\" | \"md\" | \"sm\" | \"xs\";\n\nexport interface InputColorProps extends ThemeOverrideProps {\n /**\n * The current color value as a hex string (controlled mode), e.g. `#22A8C3`.\n * When `transparency` is enabled an 8-digit hex (`#RRGGBBAA`) is accepted.\n */\n value?: string;\n /**\n * The initial color value for uncontrolled usage. Defaults to `#000000`.\n */\n defaultValue?: string;\n /**\n * Event handler fired when the color changes. Always receives a hex string.\n */\n onChange?: (value: string) => void;\n /**\n * Fired when the swatch is activated. The swatch is only interactive when\n * `type=\"color\"` — its role is to open the parent ColorPicker panel. For all\n * other types the swatch is a decorative preview and this is never called.\n */\n onSwatchClick?: () => void;\n /**\n * Display variant of the control. Defaults to `color-hex`.\n */\n type?: InputColorType;\n /**\n * Enables the alpha channel. Adds an alpha field and splits the swatch to\n * preview the transparency against a checkerboard.\n */\n transparency?: boolean;\n /**\n * Property for changing the size of the control.\n */\n size?: InputColorSize;\n /**\n * Property for displaying a label above the control.\n */\n label?: string;\n /**\n * Unique identifier for the control. Used for accessibility linking.\n */\n id?: string;\n /**\n * Accessible label for screen readers when no visible label is present.\n */\n \"aria-label\"?: string;\n testID?: string;\n}\n\ntype Rgba = { r: number; g: number; b: number; a: number };\n\nconst clamp = (n: number, min: number, max: number) =>\n Math.min(Math.max(n, min), max);\n\nconst HEX_CHARS = /[^0-9a-fA-F]/g;\n\n/** Parse a `#RGB`/`#RGBA`/`#RRGGBB`/`#RRGGBBAA` hex string into RGBA. */\nfunction hexToRgba(hex: string): Rgba {\n let h = (hex || \"\").replace(/^#/, \"\");\n if (h.length === 3 || h.length === 4) {\n h = h\n .split(\"\")\n .map((c) => c + c)\n .join(\"\");\n }\n const r = parseInt(h.slice(0, 2), 16);\n const g = parseInt(h.slice(2, 4), 16);\n const b = parseInt(h.slice(4, 6), 16);\n const a = h.length >= 8 ? parseInt(h.slice(6, 8), 16) / 255 : 1;\n return {\n r: Number.isNaN(r) ? 0 : r,\n g: Number.isNaN(g) ? 0 : g,\n b: Number.isNaN(b) ? 0 : b,\n a: Number.isNaN(a) ? 1 : parseFloat(a.toFixed(2)),\n };\n}\n\n/** Serialize RGBA back to an uppercase hex string. */\nfunction rgbaToHex({ r, g, b, a }: Rgba, includeAlpha: boolean): string {\n const toHex = (n: number) =>\n Math.round(clamp(n, 0, 255))\n .toString(16)\n .padStart(2, \"0\");\n const alpha = includeAlpha ? toHex(clamp(a, 0, 1) * 255) : \"\";\n return `#${toHex(r)}${toHex(g)}${toHex(b)}${alpha}`.toUpperCase();\n}\n\nconst SWATCH_SIZE: Record<InputColorSize, number> = {\n xl: 36,\n lg: 32,\n md: 26,\n sm: 20,\n xs: 14,\n};\n\n// Width of the trailing alpha (\"%\") segment per size, derived from the Figma\n// \"Color only / Transparency=True\" widths (total − swatch square − 2px gap).\nconst ALPHA_WIDTH: Record<InputColorSize, number> = {\n xl: 96,\n lg: 86,\n md: 77,\n sm: 67,\n xs: 58,\n};\n\n// Gap between the swatch and the value content inside a field, from the Figma\n// `input/<size>/frame/gap` tokens.\nconst FRAME_GAP: Record<InputColorSize, number> = {\n xl: 10,\n lg: 10,\n md: 8,\n sm: 6,\n xs: 4,\n};\n\n// CSS checkerboard, only visible behind partially-transparent colors.\nconst CHECKERBOARD =\n \"conic-gradient(rgba(0,0,0,0.45) 25%, transparent 0 50%, rgba(0,0,0,0.45) 0 75%, transparent 0)\";\n\ntype Corner = \"left\" | \"right\" | \"middle\" | \"all\";\n\nfunction cornerRadii(corner: Corner, radius: number) {\n const map = {\n all: [radius, radius, radius, radius],\n left: [radius, 0, 0, radius],\n right: [0, radius, radius, 0],\n middle: [0, 0, 0, 0],\n } as const;\n const [tl, tr, br, bl] = map[corner];\n return {\n borderTopLeftRadius: tl,\n borderTopRightRadius: tr,\n borderBottomRightRadius: br,\n borderBottomLeftRadius: bl,\n };\n}\n\n/* -------------------------------------------------------------------------- */\n/* Color swatch */\n/* -------------------------------------------------------------------------- */\n\nfunction ColorSwatch({\n size,\n rgba,\n transparency,\n borderColor,\n}: {\n size: number;\n rgba: Rgba;\n transparency: boolean;\n borderColor: string;\n}) {\n const solid = `rgb(${rgba.r}, ${rgba.g}, ${rgba.b})`;\n const withAlpha = `rgba(${rgba.r}, ${rgba.g}, ${rgba.b}, ${rgba.a})`;\n return (\n <Box\n width={size}\n height={size}\n position=\"relative\"\n borderColor={borderColor}\n borderWidth={1}\n style={{ borderRadius: 4, overflow: \"hidden\" }}\n data-testid=\"input-color__swatch-preview\"\n >\n {transparency && (\n <Box\n aria-hidden\n style={{\n position: \"absolute\",\n inset: 0,\n backgroundImage: CHECKERBOARD,\n backgroundSize: \"8px 8px\",\n opacity: 0.2,\n }}\n />\n )}\n {transparency ? (\n <>\n <Box\n style={{\n position: \"absolute\",\n top: 0,\n bottom: 0,\n left: 0,\n right: \"50%\",\n backgroundColor: solid,\n }}\n />\n <Box\n style={{\n position: \"absolute\",\n top: 0,\n bottom: 0,\n left: \"50%\",\n right: 0,\n backgroundColor: withAlpha,\n }}\n />\n </>\n ) : (\n <Box\n style={{ position: \"absolute\", inset: 0, backgroundColor: solid }}\n />\n )}\n </Box>\n );\n}\n\n/* -------------------------------------------------------------------------- */\n/* Editable text field */\n/* -------------------------------------------------------------------------- */\n\ntype TextFieldProps = {\n value: string;\n onCommit: (text: string) => void;\n sanitize: (text: string) => string;\n maxLength?: number;\n textAlign?: \"left\" | \"center\";\n color: string;\n fontSize: number;\n fontFamily: string;\n ariaLabel: string;\n inputMode?: \"numeric\" | \"text\";\n /** When set, Arrow Up/Down step the numeric value within [min, max]. */\n step?: { min: number; max: number };\n testID?: string;\n onFocus: () => void;\n onBlur: () => void;\n};\n\n/**\n * A controlled-but-buffered text field. Keeps the raw keystrokes locally so the\n * user can type freely, but resyncs to the canonical `value` on prop change and\n * on blur.\n */\nfunction TextField({\n value,\n onCommit,\n sanitize,\n maxLength,\n textAlign = \"left\",\n color,\n fontSize,\n fontFamily,\n ariaLabel,\n inputMode = \"text\",\n step,\n testID,\n onFocus,\n onBlur,\n}: TextFieldProps) {\n const [text, setText] = useState(value);\n // While the field is focused we keep the user's raw keystrokes and never\n // overwrite them with the canonical (normalized/expanded/clamped) value —\n // that resync is what caused the field to \"auto-fill\" mid-typing. We only\n // resync from `value` for external changes (unfocused) and on blur.\n const isFocusedRef = useRef(false);\n\n useEffect(() => {\n if (!isFocusedRef.current) setText(value);\n }, [value]);\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const next = sanitize(e.target.value);\n setText(next);\n onCommit(next);\n };\n\n const handleFocus = () => {\n isFocusedRef.current = true;\n onFocus();\n };\n\n const handleBlur = () => {\n isFocusedRef.current = false;\n setText(value);\n onBlur();\n };\n\n // Enter commits/normalizes by blurring (the value already propagates live).\n // Arrow Up/Down step numeric fields by ±1 within their range.\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n e.currentTarget.blur();\n return;\n }\n if (step && (e.key === \"ArrowUp\" || e.key === \"ArrowDown\")) {\n e.preventDefault();\n const current = Number.parseInt(text, 10);\n const base = Number.isNaN(current) ? 0 : current;\n const next = String(\n clamp(base + (e.key === \"ArrowUp\" ? 1 : -1), step.min, step.max)\n );\n setText(next);\n onCommit(next);\n }\n };\n\n return (\n <Box flex={1} height=\"100%\" justifyContent=\"center\">\n <InputPrimitive\n value={text}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n type=\"text\"\n inputMode={inputMode}\n maxLength={maxLength}\n color={color}\n fontSize={fontSize}\n fontFamily={fontFamily}\n aria-label={ariaLabel}\n data-testid={testID}\n style={textAlign === \"center\" ? { textAlign: \"center\" } : undefined}\n />\n </Box>\n );\n}\n\n/* -------------------------------------------------------------------------- */\n/* InputColor */\n/* -------------------------------------------------------------------------- */\n\nconst CHANNEL_LABEL: Record<\"red\" | \"green\" | \"blue\" | \"alpha\", string> = {\n red: \"Red channel\",\n green: \"Green channel\",\n blue: \"Blue channel\",\n alpha: \"Opacity percentage\",\n};\n\nexport const InputColor = forwardRef<HTMLDivElement, InputColorProps>(\n (\n {\n value,\n defaultValue,\n onChange,\n onSwatchClick,\n type = \"color-hex\",\n transparency = false,\n size = \"md\",\n label,\n id: providedId,\n \"aria-label\": ariaLabel,\n testID,\n themeMode,\n themeProductContext,\n },\n ref\n ) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n\n // Mirrors the Input \"useUpdatableState\" pattern: always keep an internal\n // value so the swatch and fields reflect edits immediately — even if a\n // controlled parent doesn't echo onChange back — and sync from `value`\n // whenever it changes externally.\n const [internalValue, setInternalValue] = useState(\n value ?? defaultValue ?? \"#000000\"\n );\n useEffect(() => {\n if (value !== undefined) setInternalValue(value);\n }, [value]);\n const currentValue = internalValue;\n\n // Which segment currently owns focus (for outline styling).\n const [focusedKey, setFocusedKey] = useState<string | null>(null);\n\n // Polite live-region message announced to screen readers on each edit.\n const [liveMessage, setLiveMessage] = useState(\"\");\n\n const rawId = useId();\n const safeId = rawId.replace(/:/g, \"\");\n const inputId = providedId || `input-color-${safeId}`;\n const labelId = `${inputId}-label`;\n\n const rgba = useMemo(() => hexToRgba(currentValue), [currentValue]);\n\n const sizeStyles = theme.sizing.input(size);\n const inputColors = theme.colors.control.input;\n const borderRadius = theme.shape.input[size].borderRadius;\n const swatchSize = SWATCH_SIZE[size];\n\n const showSwatch =\n type === \"color\" || type === \"color-hex\" || type === \"color-rgb\";\n const isHex = type === \"hex\" || type === \"color-hex\";\n const isRgb = type === \"rgb\" || type === \"color-rgb\";\n const isSwatchOnly = type === \"color\";\n\n const textColor = inputColors.text;\n const placeholderColor = inputColors.placeholder;\n const fontFamily = theme.fonts.body;\n\n const emit = (next: string) => {\n setInternalValue(next);\n setLiveMessage(`Color updated to ${next}`);\n onChange?.(next);\n };\n\n const emitFromRgba = (next: Rgba) => emit(rgbaToHex(next, transparency));\n\n /* ---- per-segment visual state ---- */\n const segmentVisuals = (focused: boolean) => {\n let backgroundColor = inputColors.bg;\n let borderColor = inputColors.border;\n let outlineColor: string | undefined;\n if (focused) {\n backgroundColor = theme.colors.control.focus.bg;\n outlineColor = theme.colors.border.brand;\n }\n return { backgroundColor, borderColor, outlineColor };\n };\n\n const renderSegment = (\n key: string,\n corner: Corner,\n content: React.ReactNode,\n opts: { flex?: number; width?: number; square?: boolean } = {}\n ) => {\n const focused = focusedKey === key;\n const { backgroundColor, borderColor, outlineColor } =\n segmentVisuals(focused);\n const width = opts.square ? sizeStyles.height : opts.width;\n return (\n <Box\n key={key}\n backgroundColor={backgroundColor}\n borderColor={borderColor}\n borderWidth={1}\n height={sizeStyles.height}\n width={width}\n flex={opts.flex}\n flexDirection=\"row\"\n alignItems=\"center\"\n justifyContent={opts.square ? \"center\" : \"flex-start\"}\n gap={FRAME_GAP[size]}\n paddingHorizontal={opts.square ? 0 : sizeStyles.paddingHorizontal}\n position=\"relative\"\n style={{\n ...cornerRadii(corner, borderRadius),\n minWidth: opts.square ? undefined : 40,\n ...(outlineColor && isWeb\n ? { outline: `1px solid ${outlineColor}`, outlineOffset: \"-1px\" }\n : outlineColor && !isWeb\n ? { borderColor: outlineColor }\n : {}),\n }}\n hoverStyle={\n !focused\n ? {\n backgroundColor: inputColors.bgHover,\n borderColor: inputColors.borderHover,\n }\n : undefined\n }\n >\n {content}\n </Box>\n );\n };\n\n /* ---- swatch node ----\n * Per the Figma spec the swatch is only interactive when type=\"color\": it\n * acts as the trigger that opens the parent ColorPicker panel (via\n * onSwatchClick). For every other type it is a decorative preview. */\n const swatchVisual = (\n <ColorSwatch\n size={swatchSize}\n rgba={rgba}\n transparency={transparency}\n borderColor={theme.colors.border.secondary}\n />\n );\n const swatchNode = isSwatchOnly ? (\n <Box\n as=\"button\"\n type=\"button\"\n onPress={() => onSwatchClick?.()}\n cursor=\"pointer\"\n backgroundColor=\"transparent\"\n borderWidth={0}\n padding={0}\n alignItems=\"center\"\n justifyContent=\"center\"\n aria-label=\"Open color picker\"\n data-testid=\"input-color__swatch\"\n onFocus={() => setFocusedKey(\"swatch\")}\n onBlur={() => setFocusedKey(null)}\n >\n {swatchVisual}\n </Box>\n ) : (\n <Box\n aria-hidden\n alignItems=\"center\"\n justifyContent=\"center\"\n data-testid=\"input-color__swatch-decorative\"\n >\n {swatchVisual}\n </Box>\n );\n\n /* ---- hex field content ---- */\n const hexContent = (\n <>\n <Text\n color={placeholderColor}\n fontSize={sizeStyles.fontSize}\n style={{ lineHeight: `${sizeStyles.lineHeight}px` }}\n >\n #\n </Text>\n <TextField\n // Hex field is always the RGB triplet; alpha is edited via its own\n // \"%\" segment, so the value never carries an alpha pair here.\n value={rgbaToHex(rgba, false).replace(/^#/, \"\")}\n sanitize={(t) => t.replace(HEX_CHARS, \"\").toUpperCase()}\n maxLength={6}\n onCommit={(digits) => {\n if (digits.length === 3 || digits.length === 6) {\n const next = hexToRgba(`#${digits}`);\n emitFromRgba({ ...next, a: rgba.a });\n }\n }}\n color={textColor}\n fontSize={sizeStyles.fontSize}\n fontFamily={fontFamily}\n ariaLabel=\"Hex color value\"\n testID=\"input-color__hex\"\n onFocus={() => setFocusedKey(\"hex\")}\n onBlur={() => setFocusedKey(null)}\n />\n </>\n );\n\n /* ---- channel field ---- */\n const channelContent = (channel: \"red\" | \"green\" | \"blue\" | \"alpha\") => {\n const isAlpha = channel === \"alpha\";\n const display = isAlpha\n ? Math.round(rgba.a * 100)\n : rgba[channel[0] as \"r\" | \"g\" | \"b\"];\n const field = (\n <TextField\n value={String(display)}\n inputMode=\"numeric\"\n sanitize={(t) => t.replace(/[^0-9]/g, \"\")}\n maxLength={3}\n step={isAlpha ? { min: 0, max: 100 } : { min: 0, max: 255 }}\n onCommit={(t) => {\n if (t === \"\") return;\n const num = parseInt(t, 10);\n if (Number.isNaN(num)) return;\n if (isAlpha) {\n emitFromRgba({ ...rgba, a: clamp(num, 0, 100) / 100 });\n } else {\n const k = channel[0] as \"r\" | \"g\" | \"b\";\n emitFromRgba({ ...rgba, [k]: clamp(num, 0, 255) });\n }\n }}\n color={textColor}\n fontSize={sizeStyles.fontSize}\n fontFamily={fontFamily}\n ariaLabel={CHANNEL_LABEL[channel]}\n testID={`input-color__channel-${channel}`}\n onFocus={() => setFocusedKey(`channel-${channel}`)}\n onBlur={() => setFocusedKey(null)}\n />\n );\n if (!isAlpha) return field;\n return (\n <>\n {field}\n <Text\n color={placeholderColor}\n fontSize={sizeStyles.fontSize}\n style={{ lineHeight: `${sizeStyles.lineHeight}px` }}\n >\n %\n </Text>\n </>\n );\n };\n\n /* ---- assemble control by type ----\n * Build an ordered list of cells, then enabling `transparency` simply\n * appends a trailing alpha (\"%\") cell. Corners are rounded across the whole\n * list: a single cell is fully rounded; otherwise first → left, last →\n * right, the rest square. */\n type Cell = {\n key: string;\n content: React.ReactNode;\n flex?: number;\n width?: number;\n square?: boolean;\n };\n const cells: Cell[] = [];\n\n if (isSwatchOnly) {\n cells.push({ key: \"swatch\", content: swatchNode, square: true });\n } else if (isHex) {\n cells.push({\n key: \"field\",\n flex: 1,\n content: (\n <>\n {showSwatch && swatchNode}\n <Box flex={1} flexDirection=\"row\" alignItems=\"center\" gap={4}>\n {hexContent}\n </Box>\n </>\n ),\n });\n } else if (isRgb) {\n if (showSwatch) {\n cells.push({ key: \"swatch\", content: swatchNode, square: true });\n }\n ([\"red\", \"green\", \"blue\"] as const).forEach((channel) =>\n cells.push({\n key: `channel-${channel}`,\n content: channelContent(channel),\n flex: 1,\n })\n );\n }\n\n if (transparency) {\n cells.push({\n key: \"channel-alpha\",\n content: channelContent(\"alpha\"),\n width: ALPHA_WIDTH[size],\n });\n }\n\n const control = cells.map((cell, i) => {\n const corner: Corner =\n cells.length === 1\n ? \"all\"\n : i === 0\n ? \"left\"\n : i === cells.length - 1\n ? \"right\"\n : \"middle\";\n return renderSegment(cell.key, corner, cell.content, {\n flex: cell.flex,\n width: cell.width,\n square: cell.square,\n });\n });\n\n return (\n <Box\n ref={ref}\n flexDirection=\"column\"\n gap={sizeStyles.fieldGap}\n width={isSwatchOnly ? undefined : \"100%\"}\n testID={testID}\n >\n {label && (\n <Box as=\"label\" id={labelId}>\n <Text\n color={theme.colors.content.secondary}\n fontSize={sizeStyles.fontSize - 2}\n fontWeight=\"500\"\n >\n {label}\n </Text>\n </Box>\n )}\n <Box\n flexDirection=\"row\"\n alignItems=\"center\"\n gap={2}\n width={isSwatchOnly ? undefined : \"100%\"}\n role=\"group\"\n aria-labelledby={label ? labelId : undefined}\n aria-label={!label ? ariaLabel : undefined}\n >\n {control}\n </Box>\n {isWeb && (\n <Box\n role=\"status\"\n aria-live=\"polite\"\n data-testid=\"input-color__live\"\n style={{\n position: \"absolute\",\n width: 1,\n height: 1,\n padding: 0,\n margin: -1,\n overflow: \"hidden\",\n clip: \"rect(0 0 0 0)\",\n whiteSpace: \"nowrap\",\n border: 0,\n }}\n >\n {liveMessage}\n </Box>\n )}\n </Box>\n );\n }\n);\n\nInputColor.displayName = \"InputColor\";\n","import React from \"react\";\nimport {\n View,\n Pressable,\n Image,\n ViewStyle,\n ImageStyle,\n DimensionValue,\n AnimatableNumericValue,\n AccessibilityRole,\n} from \"react-native\";\nimport { BoxProps } from \"@xsolla/xui-primitives-core\";\n\nconst roleToAccessibilityRole: Record<string, AccessibilityRole> = {\n button: \"button\",\n link: \"link\",\n img: \"image\",\n image: \"image\",\n summary: \"summary\",\n switch: \"switch\",\n checkbox: \"checkbox\",\n radio: \"radio\",\n heading: \"header\",\n text: \"text\",\n search: \"search\",\n alert: \"alert\",\n none: \"none\",\n presentation: \"none\",\n progressbar: \"progressbar\",\n scrollbar: \"scrollbar\",\n adjustable: \"adjustable\",\n tab: \"tab\",\n menu: \"menu\",\n menuitem: \"menuitem\",\n list: \"list\",\n timer: \"timer\",\n};\n\n/** RN ViewStyle.gap is typed as number (Yoga gap), not DimensionValue. */\nconst toGapValue = (gap: number | string | undefined): number | undefined => {\n if (gap === undefined) return undefined;\n if (typeof gap === \"number\") return gap;\n const pxMatch = /^(\\d+(?:\\.\\d+)?)px$/.exec(gap);\n if (pxMatch) return Number(pxMatch[1]);\n const asNumber = Number(gap);\n return Number.isFinite(asNumber) ? asNumber : undefined;\n};\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 flexWrap,\n alignItems,\n justifyContent,\n alignSelf,\n position,\n top,\n bottom,\n left,\n right,\n width,\n minWidth,\n minHeight,\n maxWidth,\n maxHeight,\n flex,\n flexShrink,\n gap,\n overflow,\n zIndex,\n hoverStyle,\n pressStyle,\n style,\n disabled,\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 flexWrap,\n alignItems,\n justifyContent,\n alignSelf,\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 flexShrink,\n gap: toGapValue(gap),\n ...(style as ViewStyle),\n });\n\n const finalTestID = dataTestId || testID;\n\n // Map web a11y props; drop the rest of the web-only attributes before\n // spreading onto RN hosts (unknown props warn at runtime).\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 \"aria-busy\": ariaBusy,\n className,\n \"data-testid\": _dataTestId,\n cursor: _cursor,\n type: _type,\n ...nativeRest\n } = rest as Record<string, unknown>;\n\n const accessibilityRole =\n (typeof role === \"string\" && roleToAccessibilityRole[role]) ||\n (as === \"button\" ? \"button\" : undefined);\n const isDisabled = Boolean(disabled || ariaDisabled);\n const accessibilityState = {\n disabled: isDisabled || undefined,\n busy: Boolean(ariaBusy) || undefined,\n };\n const accessibilityLiveRegion =\n ariaLive === \"polite\" || ariaLive === \"assertive\" ? ariaLive : undefined;\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 accessibilityLabel={typeof ariaLabel === \"string\" ? ariaLabel : alt}\n resizeMode=\"cover\"\n {...nativeRest}\n />\n );\n }\n\n // Prefer Pressable whenever the node is interactive or explicitly a button,\n // so disabled / aria-disabled controls stay in the a11y tree as buttons.\n if (onPress || as === \"button\") {\n return (\n <Pressable\n onPress={!isDisabled && onPress ? onPress : undefined}\n disabled={isDisabled}\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 accessibilityRole={accessibilityRole}\n accessibilityLabel={\n typeof ariaLabel === \"string\" ? ariaLabel : undefined\n }\n accessibilityState={accessibilityState}\n accessibilityLiveRegion={accessibilityLiveRegion}\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 accessibilityRole={accessibilityRole}\n accessibilityLabel={typeof ariaLabel === \"string\" ? ariaLabel : undefined}\n accessibilityState={accessibilityState}\n accessibilityLiveRegion={accessibilityLiveRegion}\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","export * from \"./Box\";\nexport * from \"./Text\";\nexport * from \"./Spinner\";\nexport * from \"./Icon\";\nexport * from \"./Divider\";\nexport * from \"./Input\";\nexport * from \"./TextArea\";\nexport * from \"./LinearGradient\";\n\nexport const isWeb = false;\nexport const isNative = true;\n"],"mappings":"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","names":["forwardRef","jsx","jsx","jsx","forwardRef"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xsolla/xui-input-color",
3
- "version": "0.199.0",
3
+ "version": "0.201.0",
4
4
  "main": "./web/index.js",
5
5
  "module": "./web/index.mjs",
6
6
  "types": "./web/index.d.ts",
@@ -13,8 +13,8 @@
13
13
  "test:coverage": "vitest run --coverage"
14
14
  },
15
15
  "dependencies": {
16
- "@xsolla/xui-core": "0.199.0",
17
- "@xsolla/xui-primitives-core": "0.199.0"
16
+ "@xsolla/xui-core": "0.201.0",
17
+ "@xsolla/xui-primitives-core": "0.201.0"
18
18
  },
19
19
  "peerDependencies": {
20
20
  "react": ">=16.8.0",