@xsolla/xui-b2b-itemer-group 0.199.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 CHANGED
@@ -42,6 +42,38 @@ var import_react2 = __toESM(require("react"));
42
42
  // ../../foundation/primitives-native/src/Box.tsx
43
43
  var import_react_native = require("react-native");
44
44
  var import_jsx_runtime = require("react/jsx-runtime");
45
+ var roleToAccessibilityRole = {
46
+ button: "button",
47
+ link: "link",
48
+ img: "image",
49
+ image: "image",
50
+ summary: "summary",
51
+ switch: "switch",
52
+ checkbox: "checkbox",
53
+ radio: "radio",
54
+ heading: "header",
55
+ text: "text",
56
+ search: "search",
57
+ alert: "alert",
58
+ none: "none",
59
+ presentation: "none",
60
+ progressbar: "progressbar",
61
+ scrollbar: "scrollbar",
62
+ adjustable: "adjustable",
63
+ tab: "tab",
64
+ menu: "menu",
65
+ menuitem: "menuitem",
66
+ list: "list",
67
+ timer: "timer"
68
+ };
69
+ var toGapValue = (gap) => {
70
+ if (gap === void 0) return void 0;
71
+ if (typeof gap === "number") return gap;
72
+ const pxMatch = /^(\d+(?:\.\d+)?)px$/.exec(gap);
73
+ if (pxMatch) return Number(pxMatch[1]);
74
+ const asNumber = Number(gap);
75
+ return Number.isFinite(asNumber) ? asNumber : void 0;
76
+ };
45
77
  var Box = ({
46
78
  children,
47
79
  onPress,
@@ -74,8 +106,10 @@ var Box = ({
74
106
  marginLeft,
75
107
  marginRight,
76
108
  flexDirection,
109
+ flexWrap,
77
110
  alignItems,
78
111
  justifyContent,
112
+ alignSelf,
79
113
  position,
80
114
  top,
81
115
  bottom,
@@ -87,11 +121,14 @@ var Box = ({
87
121
  maxWidth,
88
122
  maxHeight,
89
123
  flex,
124
+ flexShrink,
125
+ gap,
90
126
  overflow,
91
127
  zIndex,
92
128
  hoverStyle,
93
129
  pressStyle,
94
130
  style,
131
+ disabled,
95
132
  "data-testid": dataTestId,
96
133
  testID,
97
134
  as,
@@ -130,14 +167,18 @@ var Box = ({
130
167
  marginLeft,
131
168
  marginRight,
132
169
  flexDirection,
170
+ flexWrap,
133
171
  alignItems,
134
172
  justifyContent,
173
+ alignSelf,
135
174
  position,
136
175
  top,
137
176
  bottom,
138
177
  left,
139
178
  right,
140
179
  flex,
180
+ flexShrink,
181
+ gap: toGapValue(gap),
141
182
  ...style
142
183
  });
143
184
  const finalTestID = dataTestId || testID;
@@ -146,15 +187,25 @@ var Box = ({
146
187
  tabIndex,
147
188
  onKeyDown,
148
189
  onKeyUp,
149
- "aria-label": _ariaLabel,
190
+ "aria-label": ariaLabel,
150
191
  "aria-labelledby": _ariaLabelledBy,
151
192
  "aria-current": _ariaCurrent,
152
- "aria-disabled": _ariaDisabled,
153
- "aria-live": _ariaLive,
193
+ "aria-disabled": ariaDisabled,
194
+ "aria-live": ariaLive,
195
+ "aria-busy": ariaBusy,
154
196
  className,
155
197
  "data-testid": _dataTestId,
198
+ cursor: _cursor,
199
+ type: _type,
156
200
  ...nativeRest
157
201
  } = rest;
202
+ const accessibilityRole = typeof role === "string" && roleToAccessibilityRole[role] || (as === "button" ? "button" : void 0);
203
+ const isDisabled = Boolean(disabled || ariaDisabled);
204
+ const accessibilityState = {
205
+ disabled: isDisabled || void 0,
206
+ busy: Boolean(ariaBusy) || void 0
207
+ };
208
+ const accessibilityLiveRegion = ariaLive === "polite" || ariaLive === "assertive" ? ariaLive : void 0;
158
209
  if (as === "img" && src) {
159
210
  const imageStyle = {
160
211
  width,
@@ -173,16 +224,18 @@ var Box = ({
173
224
  source: { uri: src },
174
225
  style: imageStyle,
175
226
  testID: finalTestID,
227
+ accessibilityLabel: typeof ariaLabel === "string" ? ariaLabel : alt,
176
228
  resizeMode: "cover",
177
229
  ...nativeRest
178
230
  }
179
231
  );
180
232
  }
181
- if (onPress) {
233
+ if (onPress || as === "button") {
182
234
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
183
235
  import_react_native.Pressable,
184
236
  {
185
- onPress,
237
+ onPress: !isDisabled && onPress ? onPress : void 0,
238
+ disabled: isDisabled,
186
239
  onLayout,
187
240
  onMoveShouldSetResponder,
188
241
  onResponderGrant,
@@ -191,6 +244,10 @@ var Box = ({
191
244
  onResponderTerminate,
192
245
  style: ({ pressed }) => getContainerStyle(pressed),
193
246
  testID: finalTestID,
247
+ accessibilityRole,
248
+ accessibilityLabel: typeof ariaLabel === "string" ? ariaLabel : void 0,
249
+ accessibilityState,
250
+ accessibilityLiveRegion,
194
251
  ...nativeRest,
195
252
  children
196
253
  }
@@ -207,6 +264,10 @@ var Box = ({
207
264
  onResponderMove,
208
265
  onResponderRelease,
209
266
  onResponderTerminate,
267
+ accessibilityRole,
268
+ accessibilityLabel: typeof ariaLabel === "string" ? ariaLabel : void 0,
269
+ accessibilityState,
270
+ accessibilityLiveRegion,
210
271
  ...nativeRest,
211
272
  children
212
273
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.tsx","../../src/ItemerGroup.tsx","../../../../foundation/primitives-native/src/Box.tsx","../../src/ItemerGroupContext.tsx","../../src/ItemerGroupRow.tsx"],"sourcesContent":["export { ItemerGroup } from \"./ItemerGroup\";\nexport { ItemerGroupRow } from \"./ItemerGroupRow\";\nexport { ItemerGroupContext } from \"./ItemerGroupContext\";\nexport type {\n ItemerGroupProps,\n ItemerGroupRowProps,\n ItemerGroupRemoveIcon,\n ItemerGroupContentType,\n} from \"./types\";\n","import React, { useMemo } 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 { Button } from \"@xsolla/xui-button\";\nimport { Typography } from \"@xsolla/xui-typography\";\nimport { Plus, Minus, Remove } from \"@xsolla/xui-icons-base\";\nimport { ItemerGroupContext } from \"./ItemerGroupContext\";\nimport type { ItemerGroupContentType, ItemerGroupProps } from \"./types\";\n\n// Size of the IconButton size=\"sm\" — used to reserve matching space in the label row\nconst REMOVE_BUTTON_SIZE = 40;\n\nconst defaultRemoveIconByContentType = (contentType: ItemerGroupContentType) =>\n contentType === \"select\" ? Minus : Remove;\n\nexport const ItemerGroup: React.FC<ItemerGroupProps> = ({\n label,\n children,\n draggable = false,\n contentType = \"input\",\n removeIcon,\n onAdd,\n addButtonLabel = \"Add line\",\n showAddButton,\n className,\n testID,\n themeMode,\n themeProductContext,\n}) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n const shouldShowAddButton = showAddButton ?? Boolean(onAdd);\n const rowCount = React.Children.toArray(children).length;\n const resolvedRemoveIcon =\n removeIcon ?? defaultRemoveIconByContentType(contentType);\n const contextValue = useMemo(\n () => ({ draggable, rowCount, removeIcon: resolvedRemoveIcon }),\n [draggable, rowCount, resolvedRemoveIcon]\n );\n\n const showDragSpacer = draggable && rowCount > 1;\n\n const renderLabel = () => {\n if (!label) return null;\n\n return (\n <Box flexDirection=\"row\" alignItems=\"center\" gap={8}>\n {showDragSpacer && <Box width={28} flexShrink={0} />}\n {Array.isArray(label) ? (\n <>\n <Box flex={1} flexDirection=\"row\" alignItems=\"flex-start\" gap={4}>\n {label.map((l, i) => (\n <Box flex={1} key={i}>\n <Typography\n variant=\"bodyXs\"\n color={theme.colors.content.secondary}\n >\n {l}\n </Typography>\n </Box>\n ))}\n </Box>\n <Box width={REMOVE_BUTTON_SIZE} flexShrink={0} />\n </>\n ) : (\n <Typography variant=\"bodyXs\" color={theme.colors.content.secondary}>\n {label}\n </Typography>\n )}\n </Box>\n );\n };\n\n return (\n <ItemerGroupContext.Provider value={contextValue}>\n <Box flexDirection=\"column\" gap={8} testID={testID} className={className}>\n <Box flexDirection=\"column\" gap={4}>\n {renderLabel()}\n {children}\n </Box>\n {shouldShowAddButton && (\n <Box flexDirection=\"row\" alignItems=\"center\" gap={8}>\n {showDragSpacer && <Box width={28} flexShrink={0} />}\n <Button\n variant=\"secondary\"\n tone=\"brand\"\n size=\"sm\"\n iconRight={<Plus size={16} />}\n onPress={onAdd}\n >\n {addButtonLabel}\n </Button>\n </Box>\n )}\n </Box>\n </ItemerGroupContext.Provider>\n );\n};\n\nItemerGroup.displayName = \"ItemerGroup\";\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 { createContext, useContext } from \"react\";\nimport { Remove } from \"@xsolla/xui-icons-base\";\nimport type { ItemerGroupRemoveIcon } from \"./types\";\n\ninterface ItemerGroupContextValue {\n draggable: boolean;\n rowCount: number;\n removeIcon: ItemerGroupRemoveIcon;\n}\n\nexport const ItemerGroupContext = createContext<ItemerGroupContextValue>({\n draggable: false,\n rowCount: 0,\n removeIcon: Remove,\n});\n\nexport const useItemerGroupContext = () => useContext(ItemerGroupContext);\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 { IconButton } from \"@xsolla/xui-button\";\nimport { Drag, Plus } from \"@xsolla/xui-icons-base\";\nimport { useItemerGroupContext } from \"./ItemerGroupContext\";\nimport type { ItemerGroupRowProps } from \"./types\";\n\nconst REMOVE_ICON_SIZE = 20;\n\nexport const ItemerGroupRow: React.FC<ItemerGroupRowProps> = ({\n children,\n onRemove,\n onAdd,\n className,\n}) => {\n const { theme } = useResolvedTheme({});\n const {\n draggable,\n rowCount,\n removeIcon: RemoveIcon,\n } = useItemerGroupContext();\n\n return (\n <Box flexDirection=\"row\" alignItems=\"center\" gap={8} className={className}>\n {draggable && rowCount > 1 && (\n <Box\n data-drag-handle=\"true\"\n width={28}\n height={28}\n alignItems=\"center\"\n justifyContent=\"center\"\n flexShrink={0}\n style={{ cursor: \"grab\" }}\n >\n <Drag size={20} color={theme.colors.content.tertiary} />\n </Box>\n )}\n <Box\n flex={1}\n flexDirection=\"row\"\n alignItems=\"flex-start\"\n gap={4}\n minWidth={0}\n >\n {children}\n {onAdd && (\n <IconButton\n aria-label=\"Add row\"\n variant=\"secondary\"\n tone=\"mono\"\n size=\"sm\"\n onPress={onAdd}\n icon={<Plus size={20} />}\n />\n )}\n {onRemove && (\n <IconButton\n aria-label=\"Remove row\"\n variant=\"secondary\"\n tone=\"mono\"\n size=\"sm\"\n onPress={onRemove}\n icon={<RemoveIcon size={REMOVE_ICON_SIZE} />}\n />\n )}\n </Box>\n </Box>\n );\n};\n\nItemerGroupRow.displayName = \"ItemerGroupRow\";\n"],"mappings":"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","names":["import_react","import_xui_icons_base","import_jsx_runtime","React","import_xui_core","import_xui_button","import_xui_icons_base","import_jsx_runtime"]}
1
+ {"version":3,"sources":["../../src/index.tsx","../../src/ItemerGroup.tsx","../../../../foundation/primitives-native/src/Box.tsx","../../src/ItemerGroupContext.tsx","../../src/ItemerGroupRow.tsx"],"sourcesContent":["export { ItemerGroup } from \"./ItemerGroup\";\nexport { ItemerGroupRow } from \"./ItemerGroupRow\";\nexport { ItemerGroupContext } from \"./ItemerGroupContext\";\nexport type {\n ItemerGroupProps,\n ItemerGroupRowProps,\n ItemerGroupRemoveIcon,\n ItemerGroupContentType,\n} from \"./types\";\n","import React, { useMemo } 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 { Button } from \"@xsolla/xui-button\";\nimport { Typography } from \"@xsolla/xui-typography\";\nimport { Plus, Minus, Remove } from \"@xsolla/xui-icons-base\";\nimport { ItemerGroupContext } from \"./ItemerGroupContext\";\nimport type { ItemerGroupContentType, ItemerGroupProps } from \"./types\";\n\n// Size of the IconButton size=\"sm\" — used to reserve matching space in the label row\nconst REMOVE_BUTTON_SIZE = 40;\n\nconst defaultRemoveIconByContentType = (contentType: ItemerGroupContentType) =>\n contentType === \"select\" ? Minus : Remove;\n\nexport const ItemerGroup: React.FC<ItemerGroupProps> = ({\n label,\n children,\n draggable = false,\n contentType = \"input\",\n removeIcon,\n onAdd,\n addButtonLabel = \"Add line\",\n showAddButton,\n className,\n testID,\n themeMode,\n themeProductContext,\n}) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n const shouldShowAddButton = showAddButton ?? Boolean(onAdd);\n const rowCount = React.Children.toArray(children).length;\n const resolvedRemoveIcon =\n removeIcon ?? defaultRemoveIconByContentType(contentType);\n const contextValue = useMemo(\n () => ({ draggable, rowCount, removeIcon: resolvedRemoveIcon }),\n [draggable, rowCount, resolvedRemoveIcon]\n );\n\n const showDragSpacer = draggable && rowCount > 1;\n\n const renderLabel = () => {\n if (!label) return null;\n\n return (\n <Box flexDirection=\"row\" alignItems=\"center\" gap={8}>\n {showDragSpacer && <Box width={28} flexShrink={0} />}\n {Array.isArray(label) ? (\n <>\n <Box flex={1} flexDirection=\"row\" alignItems=\"flex-start\" gap={4}>\n {label.map((l, i) => (\n <Box flex={1} key={i}>\n <Typography\n variant=\"bodyXs\"\n color={theme.colors.content.secondary}\n >\n {l}\n </Typography>\n </Box>\n ))}\n </Box>\n <Box width={REMOVE_BUTTON_SIZE} flexShrink={0} />\n </>\n ) : (\n <Typography variant=\"bodyXs\" color={theme.colors.content.secondary}>\n {label}\n </Typography>\n )}\n </Box>\n );\n };\n\n return (\n <ItemerGroupContext.Provider value={contextValue}>\n <Box flexDirection=\"column\" gap={8} testID={testID} className={className}>\n <Box flexDirection=\"column\" gap={4}>\n {renderLabel()}\n {children}\n </Box>\n {shouldShowAddButton && (\n <Box flexDirection=\"row\" alignItems=\"center\" gap={8}>\n {showDragSpacer && <Box width={28} flexShrink={0} />}\n <Button\n variant=\"secondary\"\n tone=\"brand\"\n size=\"sm\"\n iconRight={<Plus size={16} />}\n onPress={onAdd}\n >\n {addButtonLabel}\n </Button>\n </Box>\n )}\n </Box>\n </ItemerGroupContext.Provider>\n );\n};\n\nItemerGroup.displayName = \"ItemerGroup\";\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 { createContext, useContext } from \"react\";\nimport { Remove } from \"@xsolla/xui-icons-base\";\nimport type { ItemerGroupRemoveIcon } from \"./types\";\n\ninterface ItemerGroupContextValue {\n draggable: boolean;\n rowCount: number;\n removeIcon: ItemerGroupRemoveIcon;\n}\n\nexport const ItemerGroupContext = createContext<ItemerGroupContextValue>({\n draggable: false,\n rowCount: 0,\n removeIcon: Remove,\n});\n\nexport const useItemerGroupContext = () => useContext(ItemerGroupContext);\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 { IconButton } from \"@xsolla/xui-button\";\nimport { Drag, Plus } from \"@xsolla/xui-icons-base\";\nimport { useItemerGroupContext } from \"./ItemerGroupContext\";\nimport type { ItemerGroupRowProps } from \"./types\";\n\nconst REMOVE_ICON_SIZE = 20;\n\nexport const ItemerGroupRow: React.FC<ItemerGroupRowProps> = ({\n children,\n onRemove,\n onAdd,\n className,\n}) => {\n const { theme } = useResolvedTheme({});\n const {\n draggable,\n rowCount,\n removeIcon: RemoveIcon,\n } = useItemerGroupContext();\n\n return (\n <Box flexDirection=\"row\" alignItems=\"center\" gap={8} className={className}>\n {draggable && rowCount > 1 && (\n <Box\n data-drag-handle=\"true\"\n width={28}\n height={28}\n alignItems=\"center\"\n justifyContent=\"center\"\n flexShrink={0}\n style={{ cursor: \"grab\" }}\n >\n <Drag size={20} color={theme.colors.content.tertiary} />\n </Box>\n )}\n <Box\n flex={1}\n flexDirection=\"row\"\n alignItems=\"flex-start\"\n gap={4}\n minWidth={0}\n >\n {children}\n {onAdd && (\n <IconButton\n aria-label=\"Add row\"\n variant=\"secondary\"\n tone=\"mono\"\n size=\"sm\"\n onPress={onAdd}\n icon={<Plus size={20} />}\n />\n )}\n {onRemove && (\n <IconButton\n aria-label=\"Remove row\"\n variant=\"secondary\"\n tone=\"mono\"\n size=\"sm\"\n onPress={onRemove}\n icon={<RemoveIcon size={REMOVE_ICON_SIZE} />}\n />\n )}\n </Box>\n </Box>\n );\n};\n\nItemerGroupRow.displayName = \"ItemerGroupRow\";\n"],"mappings":"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","names":["import_react","import_xui_icons_base","import_jsx_runtime","React","import_xui_core","import_xui_button","import_xui_icons_base","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/ItemerGroup.tsx","../../../../foundation/primitives-native/src/Box.tsx","../../src/ItemerGroupContext.tsx","../../src/ItemerGroupRow.tsx"],"sourcesContent":["import React, { useMemo } 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 { Button } from \"@xsolla/xui-button\";\nimport { Typography } from \"@xsolla/xui-typography\";\nimport { Plus, Minus, Remove } from \"@xsolla/xui-icons-base\";\nimport { ItemerGroupContext } from \"./ItemerGroupContext\";\nimport type { ItemerGroupContentType, ItemerGroupProps } from \"./types\";\n\n// Size of the IconButton size=\"sm\" — used to reserve matching space in the label row\nconst REMOVE_BUTTON_SIZE = 40;\n\nconst defaultRemoveIconByContentType = (contentType: ItemerGroupContentType) =>\n contentType === \"select\" ? Minus : Remove;\n\nexport const ItemerGroup: React.FC<ItemerGroupProps> = ({\n label,\n children,\n draggable = false,\n contentType = \"input\",\n removeIcon,\n onAdd,\n addButtonLabel = \"Add line\",\n showAddButton,\n className,\n testID,\n themeMode,\n themeProductContext,\n}) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n const shouldShowAddButton = showAddButton ?? Boolean(onAdd);\n const rowCount = React.Children.toArray(children).length;\n const resolvedRemoveIcon =\n removeIcon ?? defaultRemoveIconByContentType(contentType);\n const contextValue = useMemo(\n () => ({ draggable, rowCount, removeIcon: resolvedRemoveIcon }),\n [draggable, rowCount, resolvedRemoveIcon]\n );\n\n const showDragSpacer = draggable && rowCount > 1;\n\n const renderLabel = () => {\n if (!label) return null;\n\n return (\n <Box flexDirection=\"row\" alignItems=\"center\" gap={8}>\n {showDragSpacer && <Box width={28} flexShrink={0} />}\n {Array.isArray(label) ? (\n <>\n <Box flex={1} flexDirection=\"row\" alignItems=\"flex-start\" gap={4}>\n {label.map((l, i) => (\n <Box flex={1} key={i}>\n <Typography\n variant=\"bodyXs\"\n color={theme.colors.content.secondary}\n >\n {l}\n </Typography>\n </Box>\n ))}\n </Box>\n <Box width={REMOVE_BUTTON_SIZE} flexShrink={0} />\n </>\n ) : (\n <Typography variant=\"bodyXs\" color={theme.colors.content.secondary}>\n {label}\n </Typography>\n )}\n </Box>\n );\n };\n\n return (\n <ItemerGroupContext.Provider value={contextValue}>\n <Box flexDirection=\"column\" gap={8} testID={testID} className={className}>\n <Box flexDirection=\"column\" gap={4}>\n {renderLabel()}\n {children}\n </Box>\n {shouldShowAddButton && (\n <Box flexDirection=\"row\" alignItems=\"center\" gap={8}>\n {showDragSpacer && <Box width={28} flexShrink={0} />}\n <Button\n variant=\"secondary\"\n tone=\"brand\"\n size=\"sm\"\n iconRight={<Plus size={16} />}\n onPress={onAdd}\n >\n {addButtonLabel}\n </Button>\n </Box>\n )}\n </Box>\n </ItemerGroupContext.Provider>\n );\n};\n\nItemerGroup.displayName = \"ItemerGroup\";\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 { createContext, useContext } from \"react\";\nimport { Remove } from \"@xsolla/xui-icons-base\";\nimport type { ItemerGroupRemoveIcon } from \"./types\";\n\ninterface ItemerGroupContextValue {\n draggable: boolean;\n rowCount: number;\n removeIcon: ItemerGroupRemoveIcon;\n}\n\nexport const ItemerGroupContext = createContext<ItemerGroupContextValue>({\n draggable: false,\n rowCount: 0,\n removeIcon: Remove,\n});\n\nexport const useItemerGroupContext = () => useContext(ItemerGroupContext);\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 { IconButton } from \"@xsolla/xui-button\";\nimport { Drag, Plus } from \"@xsolla/xui-icons-base\";\nimport { useItemerGroupContext } from \"./ItemerGroupContext\";\nimport type { ItemerGroupRowProps } from \"./types\";\n\nconst REMOVE_ICON_SIZE = 20;\n\nexport const ItemerGroupRow: React.FC<ItemerGroupRowProps> = ({\n children,\n onRemove,\n onAdd,\n className,\n}) => {\n const { theme } = useResolvedTheme({});\n const {\n draggable,\n rowCount,\n removeIcon: RemoveIcon,\n } = useItemerGroupContext();\n\n return (\n <Box flexDirection=\"row\" alignItems=\"center\" gap={8} className={className}>\n {draggable && rowCount > 1 && (\n <Box\n data-drag-handle=\"true\"\n width={28}\n height={28}\n alignItems=\"center\"\n justifyContent=\"center\"\n flexShrink={0}\n style={{ cursor: \"grab\" }}\n >\n <Drag size={20} color={theme.colors.content.tertiary} />\n </Box>\n )}\n <Box\n flex={1}\n flexDirection=\"row\"\n alignItems=\"flex-start\"\n gap={4}\n minWidth={0}\n >\n {children}\n {onAdd && (\n <IconButton\n aria-label=\"Add row\"\n variant=\"secondary\"\n tone=\"mono\"\n size=\"sm\"\n onPress={onAdd}\n icon={<Plus size={20} />}\n />\n )}\n {onRemove && (\n <IconButton\n aria-label=\"Remove row\"\n variant=\"secondary\"\n tone=\"mono\"\n size=\"sm\"\n onPress={onRemove}\n icon={<RemoveIcon size={REMOVE_ICON_SIZE} />}\n />\n )}\n </Box>\n </Box>\n );\n};\n\nItemerGroupRow.displayName = \"ItemerGroupRow\";\n"],"mappings":"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","names":["Remove","jsx","Remove","useResolvedTheme","Plus","jsx","jsxs","useResolvedTheme","Plus"]}
1
+ {"version":3,"sources":["../../src/ItemerGroup.tsx","../../../../foundation/primitives-native/src/Box.tsx","../../src/ItemerGroupContext.tsx","../../src/ItemerGroupRow.tsx"],"sourcesContent":["import React, { useMemo } 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 { Button } from \"@xsolla/xui-button\";\nimport { Typography } from \"@xsolla/xui-typography\";\nimport { Plus, Minus, Remove } from \"@xsolla/xui-icons-base\";\nimport { ItemerGroupContext } from \"./ItemerGroupContext\";\nimport type { ItemerGroupContentType, ItemerGroupProps } from \"./types\";\n\n// Size of the IconButton size=\"sm\" — used to reserve matching space in the label row\nconst REMOVE_BUTTON_SIZE = 40;\n\nconst defaultRemoveIconByContentType = (contentType: ItemerGroupContentType) =>\n contentType === \"select\" ? Minus : Remove;\n\nexport const ItemerGroup: React.FC<ItemerGroupProps> = ({\n label,\n children,\n draggable = false,\n contentType = \"input\",\n removeIcon,\n onAdd,\n addButtonLabel = \"Add line\",\n showAddButton,\n className,\n testID,\n themeMode,\n themeProductContext,\n}) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n const shouldShowAddButton = showAddButton ?? Boolean(onAdd);\n const rowCount = React.Children.toArray(children).length;\n const resolvedRemoveIcon =\n removeIcon ?? defaultRemoveIconByContentType(contentType);\n const contextValue = useMemo(\n () => ({ draggable, rowCount, removeIcon: resolvedRemoveIcon }),\n [draggable, rowCount, resolvedRemoveIcon]\n );\n\n const showDragSpacer = draggable && rowCount > 1;\n\n const renderLabel = () => {\n if (!label) return null;\n\n return (\n <Box flexDirection=\"row\" alignItems=\"center\" gap={8}>\n {showDragSpacer && <Box width={28} flexShrink={0} />}\n {Array.isArray(label) ? (\n <>\n <Box flex={1} flexDirection=\"row\" alignItems=\"flex-start\" gap={4}>\n {label.map((l, i) => (\n <Box flex={1} key={i}>\n <Typography\n variant=\"bodyXs\"\n color={theme.colors.content.secondary}\n >\n {l}\n </Typography>\n </Box>\n ))}\n </Box>\n <Box width={REMOVE_BUTTON_SIZE} flexShrink={0} />\n </>\n ) : (\n <Typography variant=\"bodyXs\" color={theme.colors.content.secondary}>\n {label}\n </Typography>\n )}\n </Box>\n );\n };\n\n return (\n <ItemerGroupContext.Provider value={contextValue}>\n <Box flexDirection=\"column\" gap={8} testID={testID} className={className}>\n <Box flexDirection=\"column\" gap={4}>\n {renderLabel()}\n {children}\n </Box>\n {shouldShowAddButton && (\n <Box flexDirection=\"row\" alignItems=\"center\" gap={8}>\n {showDragSpacer && <Box width={28} flexShrink={0} />}\n <Button\n variant=\"secondary\"\n tone=\"brand\"\n size=\"sm\"\n iconRight={<Plus size={16} />}\n onPress={onAdd}\n >\n {addButtonLabel}\n </Button>\n </Box>\n )}\n </Box>\n </ItemerGroupContext.Provider>\n );\n};\n\nItemerGroup.displayName = \"ItemerGroup\";\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 { createContext, useContext } from \"react\";\nimport { Remove } from \"@xsolla/xui-icons-base\";\nimport type { ItemerGroupRemoveIcon } from \"./types\";\n\ninterface ItemerGroupContextValue {\n draggable: boolean;\n rowCount: number;\n removeIcon: ItemerGroupRemoveIcon;\n}\n\nexport const ItemerGroupContext = createContext<ItemerGroupContextValue>({\n draggable: false,\n rowCount: 0,\n removeIcon: Remove,\n});\n\nexport const useItemerGroupContext = () => useContext(ItemerGroupContext);\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 { IconButton } from \"@xsolla/xui-button\";\nimport { Drag, Plus } from \"@xsolla/xui-icons-base\";\nimport { useItemerGroupContext } from \"./ItemerGroupContext\";\nimport type { ItemerGroupRowProps } from \"./types\";\n\nconst REMOVE_ICON_SIZE = 20;\n\nexport const ItemerGroupRow: React.FC<ItemerGroupRowProps> = ({\n children,\n onRemove,\n onAdd,\n className,\n}) => {\n const { theme } = useResolvedTheme({});\n const {\n draggable,\n rowCount,\n removeIcon: RemoveIcon,\n } = useItemerGroupContext();\n\n return (\n <Box flexDirection=\"row\" alignItems=\"center\" gap={8} className={className}>\n {draggable && rowCount > 1 && (\n <Box\n data-drag-handle=\"true\"\n width={28}\n height={28}\n alignItems=\"center\"\n justifyContent=\"center\"\n flexShrink={0}\n style={{ cursor: \"grab\" }}\n >\n <Drag size={20} color={theme.colors.content.tertiary} />\n </Box>\n )}\n <Box\n flex={1}\n flexDirection=\"row\"\n alignItems=\"flex-start\"\n gap={4}\n minWidth={0}\n >\n {children}\n {onAdd && (\n <IconButton\n aria-label=\"Add row\"\n variant=\"secondary\"\n tone=\"mono\"\n size=\"sm\"\n onPress={onAdd}\n icon={<Plus size={20} />}\n />\n )}\n {onRemove && (\n <IconButton\n aria-label=\"Remove row\"\n variant=\"secondary\"\n tone=\"mono\"\n size=\"sm\"\n onPress={onRemove}\n icon={<RemoveIcon size={REMOVE_ICON_SIZE} />}\n />\n )}\n </Box>\n </Box>\n );\n};\n\nItemerGroupRow.displayName = \"ItemerGroupRow\";\n"],"mappings":"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","names":["Remove","jsx","Remove","useResolvedTheme","Plus","jsx","jsxs","useResolvedTheme","Plus"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xsolla/xui-b2b-itemer-group",
3
- "version": "0.199.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,11 +13,11 @@
13
13
  "test:coverage": "vitest run --coverage"
14
14
  },
15
15
  "dependencies": {
16
- "@xsolla/xui-button": "0.199.0",
17
- "@xsolla/xui-core": "0.199.0",
18
- "@xsolla/xui-icons-base": "0.199.0",
19
- "@xsolla/xui-primitives-core": "0.199.0",
20
- "@xsolla/xui-typography": "0.199.0"
16
+ "@xsolla/xui-button": "0.200.0",
17
+ "@xsolla/xui-core": "0.200.0",
18
+ "@xsolla/xui-icons-base": "0.200.0",
19
+ "@xsolla/xui-primitives-core": "0.200.0",
20
+ "@xsolla/xui-typography": "0.200.0"
21
21
  },
22
22
  "peerDependencies": {
23
23
  "react": ">=16.8.0",