@xsolla/xui-button 0.133.0 → 0.134.0-pr226.1776269216

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xsolla/xui-button",
3
- "version": "0.133.0",
3
+ "version": "0.134.0-pr226.1776269216",
4
4
  "main": "./web/index.js",
5
5
  "module": "./web/index.mjs",
6
6
  "types": "./web/index.d.ts",
@@ -13,9 +13,9 @@
13
13
  "test:coverage": "vitest run --coverage"
14
14
  },
15
15
  "dependencies": {
16
- "@xsolla/xui-core": "0.133.0",
17
- "@xsolla/xui-icons": "0.133.0",
18
- "@xsolla/xui-primitives-core": "0.133.0"
16
+ "@xsolla/xui-core": "0.134.0-pr226.1776269216",
17
+ "@xsolla/xui-icons": "0.134.0-pr226.1776269216",
18
+ "@xsolla/xui-primitives-core": "0.134.0-pr226.1776269216"
19
19
  },
20
20
  "peerDependencies": {
21
21
  "react": ">=16.8.0",
package/web/index.js CHANGED
@@ -39,13 +39,120 @@ __export(index_exports, {
39
39
  module.exports = __toCommonJS(index_exports);
40
40
 
41
41
  // src/Button.tsx
42
- var import_react2 = __toESM(require("react"));
42
+ var import_react3 = __toESM(require("react"));
43
43
 
44
44
  // ../primitives-web/src/Box.tsx
45
- var import_react = __toESM(require("react"));
45
+ var import_react2 = __toESM(require("react"));
46
46
  var import_styled_components = __toESM(require("styled-components"));
47
+
48
+ // ../primitives-web/src/filterDOMProps.ts
49
+ var import_react = __toESM(require("react"));
50
+ var NON_HTML_PROPS = /* @__PURE__ */ new Set([
51
+ // BoxProps — layout & styling
52
+ "backgroundColor",
53
+ "borderColor",
54
+ "borderWidth",
55
+ "borderBottomWidth",
56
+ "borderBottomColor",
57
+ "borderTopWidth",
58
+ "borderTopColor",
59
+ "borderLeftWidth",
60
+ "borderLeftColor",
61
+ "borderRightWidth",
62
+ "borderRightColor",
63
+ "borderRadius",
64
+ "borderStyle",
65
+ "flexDirection",
66
+ "flexWrap",
67
+ "alignItems",
68
+ "justifyContent",
69
+ "alignSelf",
70
+ "flex",
71
+ "flexShrink",
72
+ "gap",
73
+ "position",
74
+ "top",
75
+ "bottom",
76
+ "left",
77
+ "right",
78
+ "outline",
79
+ "overflow",
80
+ "overflowX",
81
+ "overflowY",
82
+ "zIndex",
83
+ "cursor",
84
+ "padding",
85
+ "paddingHorizontal",
86
+ "paddingVertical",
87
+ "paddingTop",
88
+ "paddingBottom",
89
+ "paddingLeft",
90
+ "paddingRight",
91
+ "margin",
92
+ "marginTop",
93
+ "marginBottom",
94
+ "marginLeft",
95
+ "marginRight",
96
+ "minWidth",
97
+ "minHeight",
98
+ "maxWidth",
99
+ "maxHeight",
100
+ "hoverStyle",
101
+ "pressStyle",
102
+ "focusStyle",
103
+ "outlineColor",
104
+ "outlineWidth",
105
+ "outlineOffset",
106
+ "outlineStyle",
107
+ // BoxProps — RN-only
108
+ "onPress",
109
+ "onLayout",
110
+ "onMoveShouldSetResponder",
111
+ "onResponderGrant",
112
+ "onResponderMove",
113
+ "onResponderRelease",
114
+ "onResponderTerminate",
115
+ "testID",
116
+ // Box — custom element type
117
+ "elementType",
118
+ // TextProps
119
+ "fontSize",
120
+ "fontWeight",
121
+ "fontFamily",
122
+ "lineHeight",
123
+ "whiteSpace",
124
+ "textAlign",
125
+ "textDecoration",
126
+ "numberOfLines",
127
+ "letterSpacing",
128
+ "textTransform",
129
+ // SpinnerProps
130
+ "strokeWidth",
131
+ // DividerProps
132
+ "vertical",
133
+ "dashStroke"
134
+ ]);
135
+ function createFilteredElement(defaultTag) {
136
+ const Component = import_react.default.forwardRef(
137
+ ({ children, elementType, ...props }, ref) => {
138
+ const Tag = elementType || defaultTag;
139
+ const htmlProps = {};
140
+ for (const key of Object.keys(props)) {
141
+ if (!NON_HTML_PROPS.has(key)) {
142
+ htmlProps[key] = props[key];
143
+ }
144
+ }
145
+ return import_react.default.createElement(Tag, { ref, ...htmlProps }, children);
146
+ }
147
+ );
148
+ Component.displayName = `Filtered(${defaultTag})`;
149
+ return Component;
150
+ }
151
+
152
+ // ../primitives-web/src/Box.tsx
47
153
  var import_jsx_runtime = require("react/jsx-runtime");
48
- var StyledBox = import_styled_components.default.div`
154
+ var FilteredDiv = createFilteredElement("div");
155
+ var StyledBox = (0, import_styled_components.default)(FilteredDiv)`
49
156
  display: flex;
50
157
  box-sizing: border-box;
51
158
  background-color: ${(props) => props.backgroundColor || "transparent"};
@@ -132,7 +239,7 @@ var StyledBox = import_styled_components.default.div`
132
239
  ${(props) => props.pressStyle?.backgroundColor && `background-color: ${props.pressStyle.backgroundColor};`}
133
240
  }
134
241
  `;
135
- var Box = import_react.default.forwardRef(
242
+ var Box = import_react2.default.forwardRef(
136
243
  ({
137
244
  children,
138
245
  onPress,
@@ -157,6 +264,8 @@ var Box = import_react.default.forwardRef(
157
264
  type,
158
265
  disabled,
159
266
  id,
267
+ testID,
268
+ "data-testid": dataTestId,
160
269
  ...props
161
270
  }, ref) => {
162
271
  if (as === "img" && src) {
@@ -184,7 +293,7 @@ var Box = import_react.default.forwardRef(
184
293
  StyledBox,
185
294
  {
186
295
  ref,
187
- as,
296
+ elementType: as,
188
297
  id,
189
298
  type: as === "button" ? type || "button" : void 0,
190
299
  disabled: as === "button" ? disabled : void 0,
@@ -204,6 +313,7 @@ var Box = import_react.default.forwardRef(
204
313
  "aria-controls": ariaControls,
205
314
  "aria-live": ariaLive,
206
315
  tabIndex: tabIndex !== void 0 ? tabIndex : void 0,
316
+ "data-testid": dataTestId || testID,
207
317
  ...props,
208
318
  children
209
319
  }
@@ -215,7 +325,8 @@ Box.displayName = "Box";
215
325
  // ../primitives-web/src/Text.tsx
216
326
  var import_styled_components2 = __toESM(require("styled-components"));
217
327
  var import_jsx_runtime2 = require("react/jsx-runtime");
218
- var StyledText = import_styled_components2.default.span`
328
+ var FilteredSpan = createFilteredElement("span");
329
+ var StyledText = (0, import_styled_components2.default)(FilteredSpan)`
219
330
  color: ${(props) => props.color || "inherit"};
220
331
  font-size: ${(props) => typeof props.fontSize === "number" ? `${props.fontSize}px` : props.fontSize || "inherit"};
221
332
  font-weight: ${(props) => props.fontWeight || "normal"};
@@ -256,7 +367,8 @@ var rotate = import_styled_components3.keyframes`
256
367
  transform: rotate(360deg);
257
368
  }
258
369
  `;
259
- var StyledSpinner = import_styled_components3.default.div`
370
+ var FilteredDiv2 = createFilteredElement("div");
371
+ var StyledSpinner = (0, import_styled_components3.default)(FilteredDiv2)`
260
372
  width: ${(props) => typeof props.size === "number" ? `${props.size}px` : props.size || "24px"};
261
373
  height: ${(props) => typeof props.size === "number" ? `${props.size}px` : props.size || "24px"};
262
374
  border: ${(props) => props.strokeWidth || 2}px solid
@@ -292,7 +404,8 @@ Spinner.displayName = "Spinner";
292
404
  // ../primitives-web/src/Icon.tsx
293
405
  var import_styled_components4 = __toESM(require("styled-components"));
294
406
  var import_jsx_runtime4 = require("react/jsx-runtime");
295
- var StyledIcon = import_styled_components4.default.div`
407
+ var FilteredDiv3 = createFilteredElement("div");
408
+ var StyledIcon = (0, import_styled_components4.default)(FilteredDiv3)`
296
409
  display: flex;
297
410
  align-items: center;
298
411
  justify-content: center;
@@ -315,10 +428,10 @@ var Icon = ({ children, ...props }) => {
315
428
  var import_xui_core = require("@xsolla/xui-core");
316
429
  var import_jsx_runtime5 = require("react/jsx-runtime");
317
430
  var cloneIconWithDefaults = (icon, defaultSize, defaultColor) => {
318
- if (!import_react2.default.isValidElement(icon)) return icon;
431
+ if (!import_react3.default.isValidElement(icon)) return icon;
319
432
  const iconElement = icon;
320
433
  const existingProps = iconElement.props || {};
321
- return import_react2.default.cloneElement(iconElement, {
434
+ return import_react3.default.cloneElement(iconElement, {
322
435
  ...existingProps,
323
436
  // Preserve existing props (including accessibility attributes)
324
437
  size: existingProps.size ?? defaultSize,
@@ -353,7 +466,7 @@ var Button = ({
353
466
  themeProductContext
354
467
  }) => {
355
468
  const { theme } = (0, import_xui_core.useResolvedTheme)({ themeMode, themeProductContext });
356
- const [isKeyboardPressed, setIsKeyboardPressed] = (0, import_react2.useState)(false);
469
+ const [isKeyboardPressed, setIsKeyboardPressed] = (0, import_react3.useState)(false);
357
470
  const isDisabled = disabled || loading;
358
471
  const sizeStyles = theme.sizing.button(size);
359
472
  const controlTone = theme?.colors?.control?.[tone];
@@ -545,14 +658,14 @@ var Button = ({
545
658
  Button.displayName = "Button";
546
659
 
547
660
  // src/IconButton.tsx
548
- var import_react3 = __toESM(require("react"));
661
+ var import_react4 = __toESM(require("react"));
549
662
  var import_xui_core2 = require("@xsolla/xui-core");
550
663
  var import_jsx_runtime6 = require("react/jsx-runtime");
551
664
  var cloneIconWithDefaults2 = (icon, defaultSize, defaultColor) => {
552
- if (!import_react3.default.isValidElement(icon)) return icon;
665
+ if (!import_react4.default.isValidElement(icon)) return icon;
553
666
  const iconElement = icon;
554
667
  const existingProps = iconElement.props || {};
555
- return import_react3.default.cloneElement(iconElement, {
668
+ return import_react4.default.cloneElement(iconElement, {
556
669
  ...existingProps,
557
670
  // Preserve existing props (including accessibility attributes)
558
671
  size: existingProps.size ?? defaultSize,
@@ -581,7 +694,7 @@ var IconButton = ({
581
694
  hoverBackground
582
695
  }) => {
583
696
  const { theme } = (0, import_xui_core2.useResolvedTheme)({ themeMode, themeProductContext });
584
- const [isKeyboardPressed, setIsKeyboardPressed] = (0, import_react3.useState)(false);
697
+ const [isKeyboardPressed, setIsKeyboardPressed] = (0, import_react4.useState)(false);
585
698
  const isDisabled = disabled || loading;
586
699
  const sizeStyles = theme.sizing.button(size);
587
700
  const controlTone = theme?.colors?.control?.[tone];
@@ -716,7 +829,7 @@ var IconButton = ({
716
829
  IconButton.displayName = "IconButton";
717
830
 
718
831
  // src/FlexButton.tsx
719
- var import_react4 = require("react");
832
+ var import_react5 = require("react");
720
833
  var import_xui_core3 = require("@xsolla/xui-core");
721
834
  var import_jsx_runtime7 = require("react/jsx-runtime");
722
835
  var ICON_SIZES = {
@@ -780,9 +893,9 @@ var FlexButton = ({
780
893
  ...buttonProps
781
894
  }) => {
782
895
  const { theme } = (0, import_xui_core3.useResolvedTheme)({ themeMode, themeProductContext });
783
- const [state, setState] = (0, import_react4.useState)("default");
784
- const [isFocused, setIsFocused] = (0, import_react4.useState)(false);
785
- const isMouseOverRef = (0, import_react4.useRef)(false);
896
+ const [state, setState] = (0, import_react5.useState)("default");
897
+ const [isFocused, setIsFocused] = (0, import_react5.useState)(false);
898
+ const isMouseOverRef = (0, import_react5.useRef)(false);
786
899
  const isDisabled = disabled || loading;
787
900
  const getVariantColors = (currentState) => {
788
901
  if (isDisabled) {
@@ -1053,14 +1166,14 @@ var FlexButton = ({
1053
1166
  FlexButton.displayName = "FlexButton";
1054
1167
 
1055
1168
  // src/AppButton.tsx
1056
- var import_react5 = __toESM(require("react"));
1169
+ var import_react6 = __toESM(require("react"));
1057
1170
  var import_xui_core4 = require("@xsolla/xui-core");
1058
1171
  var import_jsx_runtime8 = require("react/jsx-runtime");
1059
1172
  var cloneIconWithDefaults3 = (icon, defaultSize, defaultColor) => {
1060
- if (!import_react5.default.isValidElement(icon)) return icon;
1173
+ if (!import_react6.default.isValidElement(icon)) return icon;
1061
1174
  const iconElement = icon;
1062
1175
  const existingProps = iconElement.props || {};
1063
- return import_react5.default.cloneElement(iconElement, {
1176
+ return import_react6.default.cloneElement(iconElement, {
1064
1177
  ...existingProps,
1065
1178
  size: existingProps.size ?? defaultSize,
1066
1179
  color: existingProps.color ?? defaultColor
@@ -1092,7 +1205,7 @@ var AppButton = ({
1092
1205
  themeProductContext
1093
1206
  }) => {
1094
1207
  const { theme } = (0, import_xui_core4.useResolvedTheme)({ themeMode, themeProductContext });
1095
- const [isKeyboardPressed, setIsKeyboardPressed] = (0, import_react5.useState)(false);
1208
+ const [isKeyboardPressed, setIsKeyboardPressed] = (0, import_react6.useState)(false);
1096
1209
  const isDisabled = disabled || loading;
1097
1210
  const sizeStyles = theme.sizing.button(size);
1098
1211
  const tokens = theme?.colors?.control?.appButton || {
@@ -1276,7 +1389,7 @@ var AppButton = ({
1276
1389
  AppButton.displayName = "AppButton";
1277
1390
 
1278
1391
  // src/ButtonGroup.tsx
1279
- var import_react6 = __toESM(require("react"));
1392
+ var import_react7 = __toESM(require("react"));
1280
1393
  var import_xui_core5 = require("@xsolla/xui-core");
1281
1394
  var import_jsx_runtime9 = require("react/jsx-runtime");
1282
1395
  var ButtonGroup = ({
@@ -1297,8 +1410,8 @@ var ButtonGroup = ({
1297
1410
  const { theme } = (0, import_xui_core5.useResolvedTheme)({ themeMode, themeProductContext });
1298
1411
  const flattenChildren = (children2) => {
1299
1412
  const result = [];
1300
- import_react6.default.Children.forEach(children2, (child) => {
1301
- if (import_react6.default.isValidElement(child) && child.type === import_react6.default.Fragment) {
1413
+ import_react7.default.Children.forEach(children2, (child) => {
1414
+ if (import_react7.default.isValidElement(child) && child.type === import_react7.default.Fragment) {
1302
1415
  result.push(...flattenChildren(child.props.children));
1303
1416
  } else if (child !== null && child !== void 0) {
1304
1417
  result.push(child);
@@ -1334,8 +1447,8 @@ var ButtonGroup = ({
1334
1447
  const processChildren = (childrenToProcess) => {
1335
1448
  if (orientation === "vertical") {
1336
1449
  return childrenToProcess.map((child, index) => {
1337
- if (import_react6.default.isValidElement(child)) {
1338
- return import_react6.default.cloneElement(child, {
1450
+ if (import_react7.default.isValidElement(child)) {
1451
+ return import_react7.default.cloneElement(child, {
1339
1452
  ...child.props,
1340
1453
  fullWidth: true,
1341
1454
  key: child.key ?? index