@xsolla/xui-b2c-bottom-bar 0.198.0 → 0.200.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 +66 -5
- package/native/index.js.map +1 -1
- package/native/index.mjs +66 -5
- package/native/index.mjs.map +1 -1
- package/package.json +5 -5
package/native/index.js
CHANGED
|
@@ -38,6 +38,38 @@ module.exports = __toCommonJS(index_exports);
|
|
|
38
38
|
// ../../foundation/primitives-native/src/Box.tsx
|
|
39
39
|
var import_react_native = require("react-native");
|
|
40
40
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
41
|
+
var roleToAccessibilityRole = {
|
|
42
|
+
button: "button",
|
|
43
|
+
link: "link",
|
|
44
|
+
img: "image",
|
|
45
|
+
image: "image",
|
|
46
|
+
summary: "summary",
|
|
47
|
+
switch: "switch",
|
|
48
|
+
checkbox: "checkbox",
|
|
49
|
+
radio: "radio",
|
|
50
|
+
heading: "header",
|
|
51
|
+
text: "text",
|
|
52
|
+
search: "search",
|
|
53
|
+
alert: "alert",
|
|
54
|
+
none: "none",
|
|
55
|
+
presentation: "none",
|
|
56
|
+
progressbar: "progressbar",
|
|
57
|
+
scrollbar: "scrollbar",
|
|
58
|
+
adjustable: "adjustable",
|
|
59
|
+
tab: "tab",
|
|
60
|
+
menu: "menu",
|
|
61
|
+
menuitem: "menuitem",
|
|
62
|
+
list: "list",
|
|
63
|
+
timer: "timer"
|
|
64
|
+
};
|
|
65
|
+
var toGapValue = (gap) => {
|
|
66
|
+
if (gap === void 0) return void 0;
|
|
67
|
+
if (typeof gap === "number") return gap;
|
|
68
|
+
const pxMatch = /^(\d+(?:\.\d+)?)px$/.exec(gap);
|
|
69
|
+
if (pxMatch) return Number(pxMatch[1]);
|
|
70
|
+
const asNumber = Number(gap);
|
|
71
|
+
return Number.isFinite(asNumber) ? asNumber : void 0;
|
|
72
|
+
};
|
|
41
73
|
var Box = ({
|
|
42
74
|
children,
|
|
43
75
|
onPress,
|
|
@@ -70,8 +102,10 @@ var Box = ({
|
|
|
70
102
|
marginLeft,
|
|
71
103
|
marginRight,
|
|
72
104
|
flexDirection,
|
|
105
|
+
flexWrap,
|
|
73
106
|
alignItems,
|
|
74
107
|
justifyContent,
|
|
108
|
+
alignSelf,
|
|
75
109
|
position,
|
|
76
110
|
top,
|
|
77
111
|
bottom,
|
|
@@ -83,11 +117,14 @@ var Box = ({
|
|
|
83
117
|
maxWidth,
|
|
84
118
|
maxHeight,
|
|
85
119
|
flex,
|
|
120
|
+
flexShrink,
|
|
121
|
+
gap,
|
|
86
122
|
overflow,
|
|
87
123
|
zIndex,
|
|
88
124
|
hoverStyle,
|
|
89
125
|
pressStyle,
|
|
90
126
|
style,
|
|
127
|
+
disabled,
|
|
91
128
|
"data-testid": dataTestId,
|
|
92
129
|
testID,
|
|
93
130
|
as,
|
|
@@ -126,14 +163,18 @@ var Box = ({
|
|
|
126
163
|
marginLeft,
|
|
127
164
|
marginRight,
|
|
128
165
|
flexDirection,
|
|
166
|
+
flexWrap,
|
|
129
167
|
alignItems,
|
|
130
168
|
justifyContent,
|
|
169
|
+
alignSelf,
|
|
131
170
|
position,
|
|
132
171
|
top,
|
|
133
172
|
bottom,
|
|
134
173
|
left,
|
|
135
174
|
right,
|
|
136
175
|
flex,
|
|
176
|
+
flexShrink,
|
|
177
|
+
gap: toGapValue(gap),
|
|
137
178
|
...style
|
|
138
179
|
});
|
|
139
180
|
const finalTestID = dataTestId || testID;
|
|
@@ -142,15 +183,25 @@ var Box = ({
|
|
|
142
183
|
tabIndex,
|
|
143
184
|
onKeyDown,
|
|
144
185
|
onKeyUp,
|
|
145
|
-
"aria-label":
|
|
186
|
+
"aria-label": ariaLabel,
|
|
146
187
|
"aria-labelledby": _ariaLabelledBy,
|
|
147
188
|
"aria-current": _ariaCurrent,
|
|
148
|
-
"aria-disabled":
|
|
149
|
-
"aria-live":
|
|
189
|
+
"aria-disabled": ariaDisabled,
|
|
190
|
+
"aria-live": ariaLive,
|
|
191
|
+
"aria-busy": ariaBusy,
|
|
150
192
|
className,
|
|
151
193
|
"data-testid": _dataTestId,
|
|
194
|
+
cursor: _cursor,
|
|
195
|
+
type: _type,
|
|
152
196
|
...nativeRest
|
|
153
197
|
} = rest;
|
|
198
|
+
const accessibilityRole = typeof role === "string" && roleToAccessibilityRole[role] || (as === "button" ? "button" : void 0);
|
|
199
|
+
const isDisabled = Boolean(disabled || ariaDisabled);
|
|
200
|
+
const accessibilityState = {
|
|
201
|
+
disabled: isDisabled || void 0,
|
|
202
|
+
busy: Boolean(ariaBusy) || void 0
|
|
203
|
+
};
|
|
204
|
+
const accessibilityLiveRegion = ariaLive === "polite" || ariaLive === "assertive" ? ariaLive : void 0;
|
|
154
205
|
if (as === "img" && src) {
|
|
155
206
|
const imageStyle = {
|
|
156
207
|
width,
|
|
@@ -169,16 +220,18 @@ var Box = ({
|
|
|
169
220
|
source: { uri: src },
|
|
170
221
|
style: imageStyle,
|
|
171
222
|
testID: finalTestID,
|
|
223
|
+
accessibilityLabel: typeof ariaLabel === "string" ? ariaLabel : alt,
|
|
172
224
|
resizeMode: "cover",
|
|
173
225
|
...nativeRest
|
|
174
226
|
}
|
|
175
227
|
);
|
|
176
228
|
}
|
|
177
|
-
if (onPress) {
|
|
229
|
+
if (onPress || as === "button") {
|
|
178
230
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
179
231
|
import_react_native.Pressable,
|
|
180
232
|
{
|
|
181
|
-
onPress,
|
|
233
|
+
onPress: !isDisabled && onPress ? onPress : void 0,
|
|
234
|
+
disabled: isDisabled,
|
|
182
235
|
onLayout,
|
|
183
236
|
onMoveShouldSetResponder,
|
|
184
237
|
onResponderGrant,
|
|
@@ -187,6 +240,10 @@ var Box = ({
|
|
|
187
240
|
onResponderTerminate,
|
|
188
241
|
style: ({ pressed }) => getContainerStyle(pressed),
|
|
189
242
|
testID: finalTestID,
|
|
243
|
+
accessibilityRole,
|
|
244
|
+
accessibilityLabel: typeof ariaLabel === "string" ? ariaLabel : void 0,
|
|
245
|
+
accessibilityState,
|
|
246
|
+
accessibilityLiveRegion,
|
|
190
247
|
...nativeRest,
|
|
191
248
|
children
|
|
192
249
|
}
|
|
@@ -203,6 +260,10 @@ var Box = ({
|
|
|
203
260
|
onResponderMove,
|
|
204
261
|
onResponderRelease,
|
|
205
262
|
onResponderTerminate,
|
|
263
|
+
accessibilityRole,
|
|
264
|
+
accessibilityLabel: typeof ariaLabel === "string" ? ariaLabel : void 0,
|
|
265
|
+
accessibilityState,
|
|
266
|
+
accessibilityLiveRegion,
|
|
206
267
|
...nativeRest,
|
|
207
268
|
children
|
|
208
269
|
}
|
package/native/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/index.tsx","../../../../foundation/primitives-native/src/Box.tsx","../../../../foundation/primitives-native/src/Text.tsx","../../src/BottomBar.tsx","../../src/BottomBarItem.tsx"],"sourcesContent":["export { BottomBar } from \"./BottomBar\";\nexport { BottomBarItem } from \"./BottomBarItem\";\n\nexport type {\n BottomBarItemData,\n BottomBarItemProps,\n BottomBarItemState,\n BottomBarLinkProps,\n BottomBarProps,\n} from \"./types\";\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 from \"react\";\n// @ts-expect-error - this will be resolved at build time\nimport { Box } from \"@xsolla/xui-primitives\";\nimport { useResolvedTheme } from \"@xsolla/xui-core\";\nimport { BottomBarItem } from \"./BottomBarItem\";\nimport type { BottomBarProps } from \"./types\";\n\nconst MAX_ITEMS = 5;\n\nconst getDefaultMaxWidth = (count: number): number | string => {\n if (count <= 3) return 240;\n if (count === 4) return 294;\n return \"100%\";\n};\n\nexport const BottomBar: React.FC<BottomBarProps> = ({\n items,\n activeKey,\n onItemClick,\n linkComponent,\n maxWidth,\n \"aria-label\": ariaLabel = \"Bottom navigation\",\n testID,\n themeMode,\n themeProductContext = \"b2c\",\n}) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n const visibleItems = items.slice(0, MAX_ITEMS);\n\n return (\n <Box\n as=\"nav\"\n role=\"tablist\"\n aria-label={ariaLabel}\n flexDirection=\"row\"\n alignItems=\"center\"\n justifyContent=\"center\"\n width=\"100%\"\n maxWidth={maxWidth ?? getDefaultMaxWidth(visibleItems.length)}\n alignSelf=\"center\"\n height={56}\n padding={4}\n borderRadius={8}\n borderWidth={1}\n borderStyle=\"solid\"\n borderColor={theme.colors.control.segmented.border}\n backgroundColor={theme.colors.control.segmented.bg}\n overflow=\"hidden\"\n testID={testID || \"bottom-bar\"}\n >\n {visibleItems.map((item) => (\n <BottomBarItem\n key={item.key}\n item={item}\n isActive={item.key === activeKey}\n onItemClick={onItemClick}\n linkComponent={linkComponent}\n themeMode={themeMode}\n themeProductContext={themeProductContext}\n />\n ))}\n </Box>\n );\n};\n","import React from \"react\";\n// @ts-expect-error - this will be resolved at build time\nimport { Box, Text } from \"@xsolla/xui-primitives\";\nimport { Badge } from \"@xsolla/xui-badge\";\nimport { useResolvedTheme } from \"@xsolla/xui-core\";\nimport type { BottomBarItemProps } from \"./types\";\n\nconst renderIcon = (icon: React.ReactNode, size: number, color: string) => {\n if (!React.isValidElement(icon)) return icon;\n\n return React.cloneElement(\n icon as React.ReactElement<{ size?: number | string; color?: string }>,\n {\n size,\n color,\n }\n );\n};\n\nexport const BottomBarItem: React.FC<BottomBarItemProps> = ({\n item,\n state = \"default\",\n isActive,\n onItemClick,\n linkComponent: LinkComponent,\n testID,\n themeMode,\n themeProductContext = \"b2c\",\n}) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n const isDisabled = Boolean(item.disabled) || state === \"disabled\";\n const resolvedState = isActive || state === \"active\" ? \"active\" : state;\n const active = resolvedState === \"active\" && !isDisabled;\n const contentColor = active\n ? theme.colors.content.primary\n : theme.colors.content.secondary;\n const backgroundColor = active\n ? theme.colors.control.segmented.bgActive\n : \"transparent\";\n const hoverBackground =\n theme.colors.control.segmented.bgHover || theme.colors.overlay.mono;\n\n const handlePress = () => {\n if (isDisabled) return;\n item.onPress?.();\n onItemClick?.(item);\n };\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if (event.key !== \"Enter\" && event.key !== \" \") return;\n event.preventDefault();\n handlePress();\n };\n\n const content = (\n <Box\n width=\"100%\"\n height=\"100%\"\n minWidth={48}\n flex={1}\n flexDirection=\"column\"\n alignItems=\"center\"\n justifyContent=\"center\"\n gap={2}\n paddingHorizontal={8}\n paddingVertical={4}\n borderRadius={4}\n backgroundColor={backgroundColor}\n role={LinkComponent ? undefined : \"tab\"}\n aria-label={item.accessibilityLabel || item.label}\n aria-current={active ? \"page\" : undefined}\n aria-disabled={isDisabled || undefined}\n tabIndex={isDisabled || LinkComponent ? undefined : 0}\n disabled={isDisabled}\n onPress={!LinkComponent && !isDisabled ? handlePress : undefined}\n onKeyDown={!LinkComponent && !isDisabled ? handleKeyDown : undefined}\n hoverStyle={\n !active && !isDisabled\n ? { backgroundColor: hoverBackground }\n : undefined\n }\n pressStyle={{ backgroundColor: hoverBackground }}\n testID={item.testID || `bottom-bar-item-${item.key}`}\n >\n <Box\n width={56}\n height={24}\n position=\"relative\"\n alignItems=\"center\"\n justifyContent=\"center\"\n flexShrink={0}\n >\n {item.icon && renderIcon(item.icon, 24, contentColor)}\n {item.badge && (\n <Box position=\"absolute\" top={0} right={12} width={8} height={8}>\n <Badge\n size=\"sm\"\n square\n aria-label={`${item.label} has updates`}\n themeMode={themeMode}\n themeProductContext={themeProductContext}\n />\n </Box>\n )}\n </Box>\n <Text\n color={contentColor}\n fontFamily={theme.fonts.body}\n fontSize={10}\n lineHeight={14}\n fontWeight=\"400\"\n textAlign=\"center\"\n numberOfLines={1}\n style={{\n maxWidth: \"100%\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {item.label}\n </Text>\n </Box>\n );\n\n if (!LinkComponent) return content;\n\n return (\n <LinkComponent\n item={item}\n href={item.href}\n isActive={active}\n disabled={isDisabled}\n onPress={handlePress}\n testID={item.testID || `bottom-bar-link-${item.key}`}\n >\n {content}\n </LinkComponent>\n );\n};\n"],"mappings":"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","names":["import_react_native","import_jsx_runtime","RNText","import_xui_core","import_jsx_runtime","React","import_jsx_runtime"]}
|
|
1
|
+
{"version":3,"sources":["../../src/index.tsx","../../../../foundation/primitives-native/src/Box.tsx","../../../../foundation/primitives-native/src/Text.tsx","../../src/BottomBar.tsx","../../src/BottomBarItem.tsx"],"sourcesContent":["export { BottomBar } from \"./BottomBar\";\nexport { BottomBarItem } from \"./BottomBarItem\";\n\nexport type {\n BottomBarItemData,\n BottomBarItemProps,\n BottomBarItemState,\n BottomBarLinkProps,\n BottomBarProps,\n} from \"./types\";\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 from \"react\";\n// @ts-expect-error - this will be resolved at build time\nimport { Box } from \"@xsolla/xui-primitives\";\nimport { useResolvedTheme } from \"@xsolla/xui-core\";\nimport { BottomBarItem } from \"./BottomBarItem\";\nimport type { BottomBarProps } from \"./types\";\n\nconst MAX_ITEMS = 5;\n\nconst getDefaultMaxWidth = (count: number): number | string => {\n if (count <= 3) return 240;\n if (count === 4) return 294;\n return \"100%\";\n};\n\nexport const BottomBar: React.FC<BottomBarProps> = ({\n items,\n activeKey,\n onItemClick,\n linkComponent,\n maxWidth,\n \"aria-label\": ariaLabel = \"Bottom navigation\",\n testID,\n themeMode,\n themeProductContext = \"b2c\",\n}) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n const visibleItems = items.slice(0, MAX_ITEMS);\n\n return (\n <Box\n as=\"nav\"\n role=\"tablist\"\n aria-label={ariaLabel}\n flexDirection=\"row\"\n alignItems=\"center\"\n justifyContent=\"center\"\n width=\"100%\"\n maxWidth={maxWidth ?? getDefaultMaxWidth(visibleItems.length)}\n alignSelf=\"center\"\n height={56}\n padding={4}\n borderRadius={8}\n borderWidth={1}\n borderStyle=\"solid\"\n borderColor={theme.colors.control.segmented.border}\n backgroundColor={theme.colors.control.segmented.bg}\n overflow=\"hidden\"\n testID={testID || \"bottom-bar\"}\n >\n {visibleItems.map((item) => (\n <BottomBarItem\n key={item.key}\n item={item}\n isActive={item.key === activeKey}\n onItemClick={onItemClick}\n linkComponent={linkComponent}\n themeMode={themeMode}\n themeProductContext={themeProductContext}\n />\n ))}\n </Box>\n );\n};\n","import React from \"react\";\n// @ts-expect-error - this will be resolved at build time\nimport { Box, Text } from \"@xsolla/xui-primitives\";\nimport { Badge } from \"@xsolla/xui-badge\";\nimport { useResolvedTheme } from \"@xsolla/xui-core\";\nimport type { BottomBarItemProps } from \"./types\";\n\nconst renderIcon = (icon: React.ReactNode, size: number, color: string) => {\n if (!React.isValidElement(icon)) return icon;\n\n return React.cloneElement(\n icon as React.ReactElement<{ size?: number | string; color?: string }>,\n {\n size,\n color,\n }\n );\n};\n\nexport const BottomBarItem: React.FC<BottomBarItemProps> = ({\n item,\n state = \"default\",\n isActive,\n onItemClick,\n linkComponent: LinkComponent,\n testID,\n themeMode,\n themeProductContext = \"b2c\",\n}) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n const isDisabled = Boolean(item.disabled) || state === \"disabled\";\n const resolvedState = isActive || state === \"active\" ? \"active\" : state;\n const active = resolvedState === \"active\" && !isDisabled;\n const contentColor = active\n ? theme.colors.content.primary\n : theme.colors.content.secondary;\n const backgroundColor = active\n ? theme.colors.control.segmented.bgActive\n : \"transparent\";\n const hoverBackground =\n theme.colors.control.segmented.bgHover || theme.colors.overlay.mono;\n\n const handlePress = () => {\n if (isDisabled) return;\n item.onPress?.();\n onItemClick?.(item);\n };\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if (event.key !== \"Enter\" && event.key !== \" \") return;\n event.preventDefault();\n handlePress();\n };\n\n const content = (\n <Box\n width=\"100%\"\n height=\"100%\"\n minWidth={48}\n flex={1}\n flexDirection=\"column\"\n alignItems=\"center\"\n justifyContent=\"center\"\n gap={2}\n paddingHorizontal={8}\n paddingVertical={4}\n borderRadius={4}\n backgroundColor={backgroundColor}\n role={LinkComponent ? undefined : \"tab\"}\n aria-label={item.accessibilityLabel || item.label}\n aria-current={active ? \"page\" : undefined}\n aria-disabled={isDisabled || undefined}\n tabIndex={isDisabled || LinkComponent ? undefined : 0}\n disabled={isDisabled}\n onPress={!LinkComponent && !isDisabled ? handlePress : undefined}\n onKeyDown={!LinkComponent && !isDisabled ? handleKeyDown : undefined}\n hoverStyle={\n !active && !isDisabled\n ? { backgroundColor: hoverBackground }\n : undefined\n }\n pressStyle={{ backgroundColor: hoverBackground }}\n testID={item.testID || `bottom-bar-item-${item.key}`}\n >\n <Box\n width={56}\n height={24}\n position=\"relative\"\n alignItems=\"center\"\n justifyContent=\"center\"\n flexShrink={0}\n >\n {item.icon && renderIcon(item.icon, 24, contentColor)}\n {item.badge && (\n <Box position=\"absolute\" top={0} right={12} width={8} height={8}>\n <Badge\n size=\"sm\"\n square\n aria-label={`${item.label} has updates`}\n themeMode={themeMode}\n themeProductContext={themeProductContext}\n />\n </Box>\n )}\n </Box>\n <Text\n color={contentColor}\n fontFamily={theme.fonts.body}\n fontSize={10}\n lineHeight={14}\n fontWeight=\"400\"\n textAlign=\"center\"\n numberOfLines={1}\n style={{\n maxWidth: \"100%\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {item.label}\n </Text>\n </Box>\n );\n\n if (!LinkComponent) return content;\n\n return (\n <LinkComponent\n item={item}\n href={item.href}\n isActive={active}\n disabled={isDisabled}\n onPress={handlePress}\n testID={item.testID || `bottom-bar-link-${item.key}`}\n >\n {content}\n </LinkComponent>\n );\n};\n"],"mappings":"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","names":["import_react_native","import_jsx_runtime","RNText","import_xui_core","import_jsx_runtime","React","import_jsx_runtime"]}
|
package/native/index.mjs
CHANGED
|
@@ -5,6 +5,38 @@ import {
|
|
|
5
5
|
Image
|
|
6
6
|
} from "react-native";
|
|
7
7
|
import { jsx } from "react/jsx-runtime";
|
|
8
|
+
var roleToAccessibilityRole = {
|
|
9
|
+
button: "button",
|
|
10
|
+
link: "link",
|
|
11
|
+
img: "image",
|
|
12
|
+
image: "image",
|
|
13
|
+
summary: "summary",
|
|
14
|
+
switch: "switch",
|
|
15
|
+
checkbox: "checkbox",
|
|
16
|
+
radio: "radio",
|
|
17
|
+
heading: "header",
|
|
18
|
+
text: "text",
|
|
19
|
+
search: "search",
|
|
20
|
+
alert: "alert",
|
|
21
|
+
none: "none",
|
|
22
|
+
presentation: "none",
|
|
23
|
+
progressbar: "progressbar",
|
|
24
|
+
scrollbar: "scrollbar",
|
|
25
|
+
adjustable: "adjustable",
|
|
26
|
+
tab: "tab",
|
|
27
|
+
menu: "menu",
|
|
28
|
+
menuitem: "menuitem",
|
|
29
|
+
list: "list",
|
|
30
|
+
timer: "timer"
|
|
31
|
+
};
|
|
32
|
+
var toGapValue = (gap) => {
|
|
33
|
+
if (gap === void 0) return void 0;
|
|
34
|
+
if (typeof gap === "number") return gap;
|
|
35
|
+
const pxMatch = /^(\d+(?:\.\d+)?)px$/.exec(gap);
|
|
36
|
+
if (pxMatch) return Number(pxMatch[1]);
|
|
37
|
+
const asNumber = Number(gap);
|
|
38
|
+
return Number.isFinite(asNumber) ? asNumber : void 0;
|
|
39
|
+
};
|
|
8
40
|
var Box = ({
|
|
9
41
|
children,
|
|
10
42
|
onPress,
|
|
@@ -37,8 +69,10 @@ var Box = ({
|
|
|
37
69
|
marginLeft,
|
|
38
70
|
marginRight,
|
|
39
71
|
flexDirection,
|
|
72
|
+
flexWrap,
|
|
40
73
|
alignItems,
|
|
41
74
|
justifyContent,
|
|
75
|
+
alignSelf,
|
|
42
76
|
position,
|
|
43
77
|
top,
|
|
44
78
|
bottom,
|
|
@@ -50,11 +84,14 @@ var Box = ({
|
|
|
50
84
|
maxWidth,
|
|
51
85
|
maxHeight,
|
|
52
86
|
flex,
|
|
87
|
+
flexShrink,
|
|
88
|
+
gap,
|
|
53
89
|
overflow,
|
|
54
90
|
zIndex,
|
|
55
91
|
hoverStyle,
|
|
56
92
|
pressStyle,
|
|
57
93
|
style,
|
|
94
|
+
disabled,
|
|
58
95
|
"data-testid": dataTestId,
|
|
59
96
|
testID,
|
|
60
97
|
as,
|
|
@@ -93,14 +130,18 @@ var Box = ({
|
|
|
93
130
|
marginLeft,
|
|
94
131
|
marginRight,
|
|
95
132
|
flexDirection,
|
|
133
|
+
flexWrap,
|
|
96
134
|
alignItems,
|
|
97
135
|
justifyContent,
|
|
136
|
+
alignSelf,
|
|
98
137
|
position,
|
|
99
138
|
top,
|
|
100
139
|
bottom,
|
|
101
140
|
left,
|
|
102
141
|
right,
|
|
103
142
|
flex,
|
|
143
|
+
flexShrink,
|
|
144
|
+
gap: toGapValue(gap),
|
|
104
145
|
...style
|
|
105
146
|
});
|
|
106
147
|
const finalTestID = dataTestId || testID;
|
|
@@ -109,15 +150,25 @@ var Box = ({
|
|
|
109
150
|
tabIndex,
|
|
110
151
|
onKeyDown,
|
|
111
152
|
onKeyUp,
|
|
112
|
-
"aria-label":
|
|
153
|
+
"aria-label": ariaLabel,
|
|
113
154
|
"aria-labelledby": _ariaLabelledBy,
|
|
114
155
|
"aria-current": _ariaCurrent,
|
|
115
|
-
"aria-disabled":
|
|
116
|
-
"aria-live":
|
|
156
|
+
"aria-disabled": ariaDisabled,
|
|
157
|
+
"aria-live": ariaLive,
|
|
158
|
+
"aria-busy": ariaBusy,
|
|
117
159
|
className,
|
|
118
160
|
"data-testid": _dataTestId,
|
|
161
|
+
cursor: _cursor,
|
|
162
|
+
type: _type,
|
|
119
163
|
...nativeRest
|
|
120
164
|
} = rest;
|
|
165
|
+
const accessibilityRole = typeof role === "string" && roleToAccessibilityRole[role] || (as === "button" ? "button" : void 0);
|
|
166
|
+
const isDisabled = Boolean(disabled || ariaDisabled);
|
|
167
|
+
const accessibilityState = {
|
|
168
|
+
disabled: isDisabled || void 0,
|
|
169
|
+
busy: Boolean(ariaBusy) || void 0
|
|
170
|
+
};
|
|
171
|
+
const accessibilityLiveRegion = ariaLive === "polite" || ariaLive === "assertive" ? ariaLive : void 0;
|
|
121
172
|
if (as === "img" && src) {
|
|
122
173
|
const imageStyle = {
|
|
123
174
|
width,
|
|
@@ -136,16 +187,18 @@ var Box = ({
|
|
|
136
187
|
source: { uri: src },
|
|
137
188
|
style: imageStyle,
|
|
138
189
|
testID: finalTestID,
|
|
190
|
+
accessibilityLabel: typeof ariaLabel === "string" ? ariaLabel : alt,
|
|
139
191
|
resizeMode: "cover",
|
|
140
192
|
...nativeRest
|
|
141
193
|
}
|
|
142
194
|
);
|
|
143
195
|
}
|
|
144
|
-
if (onPress) {
|
|
196
|
+
if (onPress || as === "button") {
|
|
145
197
|
return /* @__PURE__ */ jsx(
|
|
146
198
|
Pressable,
|
|
147
199
|
{
|
|
148
|
-
onPress,
|
|
200
|
+
onPress: !isDisabled && onPress ? onPress : void 0,
|
|
201
|
+
disabled: isDisabled,
|
|
149
202
|
onLayout,
|
|
150
203
|
onMoveShouldSetResponder,
|
|
151
204
|
onResponderGrant,
|
|
@@ -154,6 +207,10 @@ var Box = ({
|
|
|
154
207
|
onResponderTerminate,
|
|
155
208
|
style: ({ pressed }) => getContainerStyle(pressed),
|
|
156
209
|
testID: finalTestID,
|
|
210
|
+
accessibilityRole,
|
|
211
|
+
accessibilityLabel: typeof ariaLabel === "string" ? ariaLabel : void 0,
|
|
212
|
+
accessibilityState,
|
|
213
|
+
accessibilityLiveRegion,
|
|
157
214
|
...nativeRest,
|
|
158
215
|
children
|
|
159
216
|
}
|
|
@@ -170,6 +227,10 @@ var Box = ({
|
|
|
170
227
|
onResponderMove,
|
|
171
228
|
onResponderRelease,
|
|
172
229
|
onResponderTerminate,
|
|
230
|
+
accessibilityRole,
|
|
231
|
+
accessibilityLabel: typeof ariaLabel === "string" ? ariaLabel : void 0,
|
|
232
|
+
accessibilityState,
|
|
233
|
+
accessibilityLiveRegion,
|
|
173
234
|
...nativeRest,
|
|
174
235
|
children
|
|
175
236
|
}
|
package/native/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../foundation/primitives-native/src/Box.tsx","../../../../foundation/primitives-native/src/Text.tsx","../../src/BottomBar.tsx","../../src/BottomBarItem.tsx"],"sourcesContent":["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 from \"react\";\n// @ts-expect-error - this will be resolved at build time\nimport { Box } from \"@xsolla/xui-primitives\";\nimport { useResolvedTheme } from \"@xsolla/xui-core\";\nimport { BottomBarItem } from \"./BottomBarItem\";\nimport type { BottomBarProps } from \"./types\";\n\nconst MAX_ITEMS = 5;\n\nconst getDefaultMaxWidth = (count: number): number | string => {\n if (count <= 3) return 240;\n if (count === 4) return 294;\n return \"100%\";\n};\n\nexport const BottomBar: React.FC<BottomBarProps> = ({\n items,\n activeKey,\n onItemClick,\n linkComponent,\n maxWidth,\n \"aria-label\": ariaLabel = \"Bottom navigation\",\n testID,\n themeMode,\n themeProductContext = \"b2c\",\n}) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n const visibleItems = items.slice(0, MAX_ITEMS);\n\n return (\n <Box\n as=\"nav\"\n role=\"tablist\"\n aria-label={ariaLabel}\n flexDirection=\"row\"\n alignItems=\"center\"\n justifyContent=\"center\"\n width=\"100%\"\n maxWidth={maxWidth ?? getDefaultMaxWidth(visibleItems.length)}\n alignSelf=\"center\"\n height={56}\n padding={4}\n borderRadius={8}\n borderWidth={1}\n borderStyle=\"solid\"\n borderColor={theme.colors.control.segmented.border}\n backgroundColor={theme.colors.control.segmented.bg}\n overflow=\"hidden\"\n testID={testID || \"bottom-bar\"}\n >\n {visibleItems.map((item) => (\n <BottomBarItem\n key={item.key}\n item={item}\n isActive={item.key === activeKey}\n onItemClick={onItemClick}\n linkComponent={linkComponent}\n themeMode={themeMode}\n themeProductContext={themeProductContext}\n />\n ))}\n </Box>\n );\n};\n","import React from \"react\";\n// @ts-expect-error - this will be resolved at build time\nimport { Box, Text } from \"@xsolla/xui-primitives\";\nimport { Badge } from \"@xsolla/xui-badge\";\nimport { useResolvedTheme } from \"@xsolla/xui-core\";\nimport type { BottomBarItemProps } from \"./types\";\n\nconst renderIcon = (icon: React.ReactNode, size: number, color: string) => {\n if (!React.isValidElement(icon)) return icon;\n\n return React.cloneElement(\n icon as React.ReactElement<{ size?: number | string; color?: string }>,\n {\n size,\n color,\n }\n );\n};\n\nexport const BottomBarItem: React.FC<BottomBarItemProps> = ({\n item,\n state = \"default\",\n isActive,\n onItemClick,\n linkComponent: LinkComponent,\n testID,\n themeMode,\n themeProductContext = \"b2c\",\n}) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n const isDisabled = Boolean(item.disabled) || state === \"disabled\";\n const resolvedState = isActive || state === \"active\" ? \"active\" : state;\n const active = resolvedState === \"active\" && !isDisabled;\n const contentColor = active\n ? theme.colors.content.primary\n : theme.colors.content.secondary;\n const backgroundColor = active\n ? theme.colors.control.segmented.bgActive\n : \"transparent\";\n const hoverBackground =\n theme.colors.control.segmented.bgHover || theme.colors.overlay.mono;\n\n const handlePress = () => {\n if (isDisabled) return;\n item.onPress?.();\n onItemClick?.(item);\n };\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if (event.key !== \"Enter\" && event.key !== \" \") return;\n event.preventDefault();\n handlePress();\n };\n\n const content = (\n <Box\n width=\"100%\"\n height=\"100%\"\n minWidth={48}\n flex={1}\n flexDirection=\"column\"\n alignItems=\"center\"\n justifyContent=\"center\"\n gap={2}\n paddingHorizontal={8}\n paddingVertical={4}\n borderRadius={4}\n backgroundColor={backgroundColor}\n role={LinkComponent ? undefined : \"tab\"}\n aria-label={item.accessibilityLabel || item.label}\n aria-current={active ? \"page\" : undefined}\n aria-disabled={isDisabled || undefined}\n tabIndex={isDisabled || LinkComponent ? undefined : 0}\n disabled={isDisabled}\n onPress={!LinkComponent && !isDisabled ? handlePress : undefined}\n onKeyDown={!LinkComponent && !isDisabled ? handleKeyDown : undefined}\n hoverStyle={\n !active && !isDisabled\n ? { backgroundColor: hoverBackground }\n : undefined\n }\n pressStyle={{ backgroundColor: hoverBackground }}\n testID={item.testID || `bottom-bar-item-${item.key}`}\n >\n <Box\n width={56}\n height={24}\n position=\"relative\"\n alignItems=\"center\"\n justifyContent=\"center\"\n flexShrink={0}\n >\n {item.icon && renderIcon(item.icon, 24, contentColor)}\n {item.badge && (\n <Box position=\"absolute\" top={0} right={12} width={8} height={8}>\n <Badge\n size=\"sm\"\n square\n aria-label={`${item.label} has updates`}\n themeMode={themeMode}\n themeProductContext={themeProductContext}\n />\n </Box>\n )}\n </Box>\n <Text\n color={contentColor}\n fontFamily={theme.fonts.body}\n fontSize={10}\n lineHeight={14}\n fontWeight=\"400\"\n textAlign=\"center\"\n numberOfLines={1}\n style={{\n maxWidth: \"100%\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {item.label}\n </Text>\n </Box>\n );\n\n if (!LinkComponent) return content;\n\n return (\n <LinkComponent\n item={item}\n href={item.href}\n isActive={active}\n disabled={isDisabled}\n onPress={handlePress}\n testID={item.testID || `bottom-bar-link-${item.key}`}\n >\n {content}\n </LinkComponent>\n );\n};\n"],"mappings":"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","names":["jsx","useResolvedTheme","jsx","jsx","useResolvedTheme"]}
|
|
1
|
+
{"version":3,"sources":["../../../../foundation/primitives-native/src/Box.tsx","../../../../foundation/primitives-native/src/Text.tsx","../../src/BottomBar.tsx","../../src/BottomBarItem.tsx"],"sourcesContent":["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 from \"react\";\n// @ts-expect-error - this will be resolved at build time\nimport { Box } from \"@xsolla/xui-primitives\";\nimport { useResolvedTheme } from \"@xsolla/xui-core\";\nimport { BottomBarItem } from \"./BottomBarItem\";\nimport type { BottomBarProps } from \"./types\";\n\nconst MAX_ITEMS = 5;\n\nconst getDefaultMaxWidth = (count: number): number | string => {\n if (count <= 3) return 240;\n if (count === 4) return 294;\n return \"100%\";\n};\n\nexport const BottomBar: React.FC<BottomBarProps> = ({\n items,\n activeKey,\n onItemClick,\n linkComponent,\n maxWidth,\n \"aria-label\": ariaLabel = \"Bottom navigation\",\n testID,\n themeMode,\n themeProductContext = \"b2c\",\n}) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n const visibleItems = items.slice(0, MAX_ITEMS);\n\n return (\n <Box\n as=\"nav\"\n role=\"tablist\"\n aria-label={ariaLabel}\n flexDirection=\"row\"\n alignItems=\"center\"\n justifyContent=\"center\"\n width=\"100%\"\n maxWidth={maxWidth ?? getDefaultMaxWidth(visibleItems.length)}\n alignSelf=\"center\"\n height={56}\n padding={4}\n borderRadius={8}\n borderWidth={1}\n borderStyle=\"solid\"\n borderColor={theme.colors.control.segmented.border}\n backgroundColor={theme.colors.control.segmented.bg}\n overflow=\"hidden\"\n testID={testID || \"bottom-bar\"}\n >\n {visibleItems.map((item) => (\n <BottomBarItem\n key={item.key}\n item={item}\n isActive={item.key === activeKey}\n onItemClick={onItemClick}\n linkComponent={linkComponent}\n themeMode={themeMode}\n themeProductContext={themeProductContext}\n />\n ))}\n </Box>\n );\n};\n","import React from \"react\";\n// @ts-expect-error - this will be resolved at build time\nimport { Box, Text } from \"@xsolla/xui-primitives\";\nimport { Badge } from \"@xsolla/xui-badge\";\nimport { useResolvedTheme } from \"@xsolla/xui-core\";\nimport type { BottomBarItemProps } from \"./types\";\n\nconst renderIcon = (icon: React.ReactNode, size: number, color: string) => {\n if (!React.isValidElement(icon)) return icon;\n\n return React.cloneElement(\n icon as React.ReactElement<{ size?: number | string; color?: string }>,\n {\n size,\n color,\n }\n );\n};\n\nexport const BottomBarItem: React.FC<BottomBarItemProps> = ({\n item,\n state = \"default\",\n isActive,\n onItemClick,\n linkComponent: LinkComponent,\n testID,\n themeMode,\n themeProductContext = \"b2c\",\n}) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n const isDisabled = Boolean(item.disabled) || state === \"disabled\";\n const resolvedState = isActive || state === \"active\" ? \"active\" : state;\n const active = resolvedState === \"active\" && !isDisabled;\n const contentColor = active\n ? theme.colors.content.primary\n : theme.colors.content.secondary;\n const backgroundColor = active\n ? theme.colors.control.segmented.bgActive\n : \"transparent\";\n const hoverBackground =\n theme.colors.control.segmented.bgHover || theme.colors.overlay.mono;\n\n const handlePress = () => {\n if (isDisabled) return;\n item.onPress?.();\n onItemClick?.(item);\n };\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if (event.key !== \"Enter\" && event.key !== \" \") return;\n event.preventDefault();\n handlePress();\n };\n\n const content = (\n <Box\n width=\"100%\"\n height=\"100%\"\n minWidth={48}\n flex={1}\n flexDirection=\"column\"\n alignItems=\"center\"\n justifyContent=\"center\"\n gap={2}\n paddingHorizontal={8}\n paddingVertical={4}\n borderRadius={4}\n backgroundColor={backgroundColor}\n role={LinkComponent ? undefined : \"tab\"}\n aria-label={item.accessibilityLabel || item.label}\n aria-current={active ? \"page\" : undefined}\n aria-disabled={isDisabled || undefined}\n tabIndex={isDisabled || LinkComponent ? undefined : 0}\n disabled={isDisabled}\n onPress={!LinkComponent && !isDisabled ? handlePress : undefined}\n onKeyDown={!LinkComponent && !isDisabled ? handleKeyDown : undefined}\n hoverStyle={\n !active && !isDisabled\n ? { backgroundColor: hoverBackground }\n : undefined\n }\n pressStyle={{ backgroundColor: hoverBackground }}\n testID={item.testID || `bottom-bar-item-${item.key}`}\n >\n <Box\n width={56}\n height={24}\n position=\"relative\"\n alignItems=\"center\"\n justifyContent=\"center\"\n flexShrink={0}\n >\n {item.icon && renderIcon(item.icon, 24, contentColor)}\n {item.badge && (\n <Box position=\"absolute\" top={0} right={12} width={8} height={8}>\n <Badge\n size=\"sm\"\n square\n aria-label={`${item.label} has updates`}\n themeMode={themeMode}\n themeProductContext={themeProductContext}\n />\n </Box>\n )}\n </Box>\n <Text\n color={contentColor}\n fontFamily={theme.fonts.body}\n fontSize={10}\n lineHeight={14}\n fontWeight=\"400\"\n textAlign=\"center\"\n numberOfLines={1}\n style={{\n maxWidth: \"100%\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {item.label}\n </Text>\n </Box>\n );\n\n if (!LinkComponent) return content;\n\n return (\n <LinkComponent\n item={item}\n href={item.href}\n isActive={active}\n disabled={isDisabled}\n onPress={handlePress}\n testID={item.testID || `bottom-bar-link-${item.key}`}\n >\n {content}\n </LinkComponent>\n );\n};\n"],"mappings":"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","names":["jsx","useResolvedTheme","jsx","jsx","useResolvedTheme"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xsolla/xui-b2c-bottom-bar",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.200.0",
|
|
4
4
|
"main": "./web/index.js",
|
|
5
5
|
"module": "./web/index.mjs",
|
|
6
6
|
"types": "./web/index.d.ts",
|
|
@@ -13,10 +13,10 @@
|
|
|
13
13
|
"test:coverage": "vitest run --coverage"
|
|
14
14
|
},
|
|
15
15
|
"dependencies": {
|
|
16
|
-
"@xsolla/xui-badge": "0.
|
|
17
|
-
"@xsolla/xui-core": "0.
|
|
18
|
-
"@xsolla/xui-icons": "0.
|
|
19
|
-
"@xsolla/xui-primitives-core": "0.
|
|
16
|
+
"@xsolla/xui-badge": "0.200.0",
|
|
17
|
+
"@xsolla/xui-core": "0.200.0",
|
|
18
|
+
"@xsolla/xui-icons": "0.200.0",
|
|
19
|
+
"@xsolla/xui-primitives-core": "0.200.0"
|
|
20
20
|
},
|
|
21
21
|
"peerDependencies": {
|
|
22
22
|
"react": ">=16.8.0",
|