@xsolla/xui-table 0.158.0 → 0.159.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/native/index.d.mts +14 -0
- package/native/index.d.ts +14 -0
- package/native/index.js +8 -2
- package/native/index.js.map +1 -1
- package/native/index.mjs +8 -2
- package/native/index.mjs.map +1 -1
- package/package.json +4 -4
- package/web/index.d.mts +14 -0
- package/web/index.d.ts +14 -0
- package/web/index.js +11 -3
- package/web/index.js.map +1 -1
- package/web/index.mjs +11 -3
- package/web/index.mjs.map +1 -1
package/web/index.d.mts
CHANGED
|
@@ -39,12 +39,18 @@ type TableCellPosition = "default" | "left" | "right";
|
|
|
39
39
|
*/
|
|
40
40
|
interface TableProps extends ThemeOverrideProps {
|
|
41
41
|
children?: ReactNode;
|
|
42
|
+
/** Test ID for testing frameworks */
|
|
43
|
+
testID?: string;
|
|
42
44
|
}
|
|
43
45
|
interface TableCaptionProps extends BoxProps, ThemeOverrideProps {
|
|
44
46
|
children?: ReactNode;
|
|
47
|
+
/** Test ID for testing frameworks */
|
|
48
|
+
testID?: string;
|
|
45
49
|
}
|
|
46
50
|
interface TableHeaderProps extends BoxProps, ThemeOverrideProps {
|
|
47
51
|
children?: ReactNode;
|
|
52
|
+
/** Test ID for testing frameworks */
|
|
53
|
+
testID?: string;
|
|
48
54
|
}
|
|
49
55
|
interface TableBodyProps extends BoxProps, ThemeOverrideProps {
|
|
50
56
|
children?: ReactNode;
|
|
@@ -64,9 +70,13 @@ interface TableBodyProps extends BoxProps, ThemeOverrideProps {
|
|
|
64
70
|
* empty-state to fill it.
|
|
65
71
|
*/
|
|
66
72
|
minRows?: number;
|
|
73
|
+
/** Test ID for testing frameworks */
|
|
74
|
+
testID?: string;
|
|
67
75
|
}
|
|
68
76
|
interface TableFooterProps extends BoxProps {
|
|
69
77
|
children?: ReactNode;
|
|
78
|
+
/** Test ID for testing frameworks */
|
|
79
|
+
testID?: string;
|
|
70
80
|
}
|
|
71
81
|
interface TableRowProps extends BoxProps, ThemeOverrideProps {
|
|
72
82
|
children?: ReactNode;
|
|
@@ -111,12 +121,16 @@ interface TableCellProps extends Omit<BoxProps, "position">, ThemeOverrideProps
|
|
|
111
121
|
* Falls back to always-visible on touch devices.
|
|
112
122
|
*/
|
|
113
123
|
revealOnHover?: boolean;
|
|
124
|
+
/** Test ID for testing frameworks */
|
|
125
|
+
testID?: string;
|
|
114
126
|
}
|
|
115
127
|
interface TableHeadProps extends TableCellProps {
|
|
116
128
|
/** Sort direction. */
|
|
117
129
|
sort?: "ascending" | "descending" | "none";
|
|
118
130
|
/** Click to toggle sort. */
|
|
119
131
|
onSortToggle?: () => void;
|
|
132
|
+
/** Test ID for testing frameworks */
|
|
133
|
+
testID?: string;
|
|
120
134
|
}
|
|
121
135
|
|
|
122
136
|
declare const Table: React__default.ForwardRefExoticComponent<TableProps & React__default.RefAttributes<any>> & {
|
package/web/index.d.ts
CHANGED
|
@@ -39,12 +39,18 @@ type TableCellPosition = "default" | "left" | "right";
|
|
|
39
39
|
*/
|
|
40
40
|
interface TableProps extends ThemeOverrideProps {
|
|
41
41
|
children?: ReactNode;
|
|
42
|
+
/** Test ID for testing frameworks */
|
|
43
|
+
testID?: string;
|
|
42
44
|
}
|
|
43
45
|
interface TableCaptionProps extends BoxProps, ThemeOverrideProps {
|
|
44
46
|
children?: ReactNode;
|
|
47
|
+
/** Test ID for testing frameworks */
|
|
48
|
+
testID?: string;
|
|
45
49
|
}
|
|
46
50
|
interface TableHeaderProps extends BoxProps, ThemeOverrideProps {
|
|
47
51
|
children?: ReactNode;
|
|
52
|
+
/** Test ID for testing frameworks */
|
|
53
|
+
testID?: string;
|
|
48
54
|
}
|
|
49
55
|
interface TableBodyProps extends BoxProps, ThemeOverrideProps {
|
|
50
56
|
children?: ReactNode;
|
|
@@ -64,9 +70,13 @@ interface TableBodyProps extends BoxProps, ThemeOverrideProps {
|
|
|
64
70
|
* empty-state to fill it.
|
|
65
71
|
*/
|
|
66
72
|
minRows?: number;
|
|
73
|
+
/** Test ID for testing frameworks */
|
|
74
|
+
testID?: string;
|
|
67
75
|
}
|
|
68
76
|
interface TableFooterProps extends BoxProps {
|
|
69
77
|
children?: ReactNode;
|
|
78
|
+
/** Test ID for testing frameworks */
|
|
79
|
+
testID?: string;
|
|
70
80
|
}
|
|
71
81
|
interface TableRowProps extends BoxProps, ThemeOverrideProps {
|
|
72
82
|
children?: ReactNode;
|
|
@@ -111,12 +121,16 @@ interface TableCellProps extends Omit<BoxProps, "position">, ThemeOverrideProps
|
|
|
111
121
|
* Falls back to always-visible on touch devices.
|
|
112
122
|
*/
|
|
113
123
|
revealOnHover?: boolean;
|
|
124
|
+
/** Test ID for testing frameworks */
|
|
125
|
+
testID?: string;
|
|
114
126
|
}
|
|
115
127
|
interface TableHeadProps extends TableCellProps {
|
|
116
128
|
/** Sort direction. */
|
|
117
129
|
sort?: "ascending" | "descending" | "none";
|
|
118
130
|
/** Click to toggle sort. */
|
|
119
131
|
onSortToggle?: () => void;
|
|
132
|
+
/** Test ID for testing frameworks */
|
|
133
|
+
testID?: string;
|
|
120
134
|
}
|
|
121
135
|
|
|
122
136
|
declare const Table: React__default.ForwardRefExoticComponent<TableProps & React__default.RefAttributes<any>> & {
|
package/web/index.js
CHANGED
|
@@ -249,7 +249,8 @@ var Box = import_react2.default.forwardRef(
|
|
|
249
249
|
top: typeof props.top === "number" ? `${props.top}px` : props.top,
|
|
250
250
|
left: typeof props.left === "number" ? `${props.left}px` : props.left,
|
|
251
251
|
right: typeof props.right === "number" ? `${props.right}px` : props.right,
|
|
252
|
-
bottom: typeof props.bottom === "number" ? `${props.bottom}px` : props.bottom
|
|
252
|
+
bottom: typeof props.bottom === "number" ? `${props.bottom}px` : props.bottom,
|
|
253
|
+
...props.style
|
|
253
254
|
}
|
|
254
255
|
}
|
|
255
256
|
);
|
|
@@ -306,6 +307,8 @@ var Text = ({
|
|
|
306
307
|
className,
|
|
307
308
|
id,
|
|
308
309
|
role,
|
|
310
|
+
testID,
|
|
311
|
+
"data-testid": dataTestId,
|
|
309
312
|
numberOfLines: _numberOfLines,
|
|
310
313
|
...props
|
|
311
314
|
}) => {
|
|
@@ -316,7 +319,8 @@ var Text = ({
|
|
|
316
319
|
style,
|
|
317
320
|
className,
|
|
318
321
|
id,
|
|
319
|
-
role
|
|
322
|
+
role,
|
|
323
|
+
"data-testid": dataTestId || testID
|
|
320
324
|
}
|
|
321
325
|
);
|
|
322
326
|
};
|
|
@@ -352,13 +356,14 @@ var Divider = ({ color }) => /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
|
352
356
|
}
|
|
353
357
|
);
|
|
354
358
|
var TableRoot = (0, import_react3.forwardRef)(
|
|
355
|
-
({ children, themeMode, themeProductContext }, ref) => {
|
|
359
|
+
({ children, testID, themeMode, themeProductContext }, ref) => {
|
|
356
360
|
const { theme } = (0, import_xui_core.useResolvedTheme)({ themeMode, themeProductContext });
|
|
357
361
|
const sizing = theme.sizing.table;
|
|
358
362
|
return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
359
363
|
Box,
|
|
360
364
|
{
|
|
361
365
|
ref,
|
|
366
|
+
testID,
|
|
362
367
|
flexDirection: "column",
|
|
363
368
|
alignItems: "stretch",
|
|
364
369
|
gap: sizing.containerGap,
|
|
@@ -503,6 +508,7 @@ var TableRow = (0, import_react3.forwardRef)(
|
|
|
503
508
|
selected,
|
|
504
509
|
hideDivider: hideDividerProp,
|
|
505
510
|
onPress,
|
|
511
|
+
testID,
|
|
506
512
|
themeMode,
|
|
507
513
|
themeProductContext,
|
|
508
514
|
style,
|
|
@@ -631,6 +637,7 @@ var TableCell = (0, import_react3.forwardRef)(
|
|
|
631
637
|
width,
|
|
632
638
|
grow,
|
|
633
639
|
revealOnHover,
|
|
640
|
+
testID,
|
|
634
641
|
themeMode,
|
|
635
642
|
themeProductContext,
|
|
636
643
|
style,
|
|
@@ -700,6 +707,7 @@ var TableHead = (0, import_react3.forwardRef)(
|
|
|
700
707
|
grow,
|
|
701
708
|
sort,
|
|
702
709
|
onSortToggle,
|
|
710
|
+
testID,
|
|
703
711
|
themeMode,
|
|
704
712
|
themeProductContext,
|
|
705
713
|
style,
|
package/web/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/index.tsx","../../src/Table.tsx","../../../../foundation/primitives-web/src/Box.tsx","../../../../foundation/primitives-web/src/filterDOMProps.ts","../../../../../node_modules/@emotion/memoize/dist/memoize.esm.js","../../../../../node_modules/@emotion/is-prop-valid/dist/is-prop-valid.esm.js","../../../../foundation/primitives-web/src/Text.tsx"],"sourcesContent":["export * from \"./Table\";\nexport * from \"./types\";\n","import React, {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n type ReactNode,\n} from \"react\";\n// @ts-expect-error - this will be resolved at build time\nimport { Box, Text } from \"@xsolla/xui-primitives\";\nimport { useResolvedTheme, isNative } from \"@xsolla/xui-core\";\nimport { Sort } from \"@xsolla/xui-icons-base\";\nimport {\n TableBodyProps,\n TableCaptionProps,\n TableCellProps,\n TableFooterProps,\n TableHeaderProps,\n TableHeadProps,\n TableProps,\n TableRowProps,\n} from \"./types\";\n\n/**\n * Tracks which rowgroup the current <Table.Row> sits inside, so the row can\n * pick the right sizing (header rows are slightly taller / styled\n * differently per `theme.sizing.table`).\n */\ntype RowGroup = \"header\" | \"body\";\nconst TableRowGroupContext = createContext<RowGroup>(\"body\");\n\n/**\n * Tracks whether the parent <Table.Row> is hovered or has focus inside it.\n * Cells that opt into `revealOnHover` read this to decide whether to show\n * their content. Defaults to `true` so cells used outside a row (e.g. inside\n * <Table.Header>) are always visible.\n */\nconst RowRevealContext = createContext<{ revealed: boolean }>({\n revealed: true,\n});\n\n/**\n * Detects whether the device is hover-capable (desktop) vs touch-only (mobile).\n * On touch-only devices we always reveal action cells so they can be tapped —\n * matching the Figma spec (\"Right cell actions ... always visible on touch\n * devices\"). SSR-safe: returns `true` until mounted, which means actions stay\n * revealed on the server (no flash-of-hidden-actions on first paint).\n *\n * Table is web-only for now — on native this hook short-circuits and never\n * runs the media query.\n */\nconst useHoverCapable = (): boolean => {\n const [hoverCapable, setHoverCapable] = useState(true);\n useEffect(() => {\n if (isNative) return;\n if (typeof window === \"undefined\" || !window.matchMedia) return;\n const mq = window.matchMedia(\"(hover: hover)\");\n setHoverCapable(mq.matches);\n const onChange = (e: MediaQueryListEvent) => setHoverCapable(e.matches);\n mq.addEventListener?.(\"change\", onChange);\n return () => mq.removeEventListener?.(\"change\", onChange);\n }, []);\n return hoverCapable;\n};\n\nconst Divider: React.FC<{ color: string }> = ({ color }) => (\n <Box\n width=\"100%\"\n height={1}\n backgroundColor={color}\n style={{ flexShrink: 0 }}\n />\n);\n\nconst TableRoot = forwardRef<any, TableProps>(\n ({ children, themeMode, themeProductContext }, ref) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n const sizing = theme.sizing.table;\n\n return (\n <Box\n ref={ref}\n flexDirection=\"column\"\n alignItems=\"stretch\"\n gap={sizing.containerGap}\n paddingVertical={sizing.containerPaddingVertical}\n backgroundColor={theme.colors.background.primary}\n borderRadius={sizing.containerRadius}\n width=\"100%\"\n role=\"table\"\n style={{\n color: theme.colors.content.primary,\n overflow: \"clip\",\n }}\n >\n {children}\n </Box>\n );\n }\n);\n\nTableRoot.displayName = \"Table\";\n\nconst TableCaption = forwardRef<any, TableCaptionProps>(\n ({ children, themeMode, themeProductContext, style, ...props }, ref) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n const sizing = theme.sizing.table;\n\n return (\n <Box\n ref={ref}\n flexDirection=\"row\"\n alignItems=\"center\"\n paddingHorizontal={sizing.headerRowPaddingHorizontal}\n width=\"100%\"\n // <caption> isn't a valid ARIA role; consumers can pass role=\"region\"\n // + aria-label via ...props if they want it announced.\n {...props}\n style={style}\n >\n {typeof children === \"string\" || typeof children === \"number\" ? (\n <Text\n fontSize={sizing.captionFontSize}\n lineHeight={sizing.captionLineHeight}\n color={theme.colors.content.secondary}\n >\n {children}\n </Text>\n ) : (\n children\n )}\n </Box>\n );\n }\n);\n\nTableCaption.displayName = \"Table.Caption\";\n\nconst TableHeader = forwardRef<any, TableHeaderProps>(\n ({ children, themeMode, themeProductContext, style, ...props }, ref) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n\n return (\n <TableRowGroupContext.Provider value=\"header\">\n <Box\n ref={ref}\n flexDirection=\"column\"\n alignItems=\"stretch\"\n width=\"100%\"\n role=\"rowgroup\"\n {...props}\n style={{\n position: \"sticky\",\n top: 0,\n zIndex: 1,\n backgroundColor: theme.colors.background.primary,\n ...style,\n }}\n >\n {children}\n <Divider color={theme.colors.border.secondary} />\n </Box>\n </TableRowGroupContext.Provider>\n );\n }\n);\n\nTableHeader.displayName = \"Table.Header\";\n\nconst TableBody = forwardRef<any, TableBodyProps>(\n (\n { children, style, minRows, themeMode, themeProductContext, ...props },\n ref\n ) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n const sizing = theme.sizing.table;\n\n // Each row paints a 1px divider after it (rendered as a sibling Box\n // inside Table.Row), except the very last row in the body which\n // hides its divider. So a fully filled body of N rows is\n // `N × rowHeight + (N - 1) × 1px`.\n const DIVIDER_HEIGHT = 1;\n const computedMinHeight = minRows\n ? minRows * sizing.rowHeight + (minRows - 1) * DIVIDER_HEIGHT\n : undefined;\n\n // Decide whether to auto-pad with placeholder slots. We only pad\n // when every direct child is a <Table.Row>; consumers using a\n // single non-row block (e.g. a custom \"no results\" panel) get just\n // the reserved min-height so they can stretch their content to fill.\n let renderedChildren: ReactNode = children;\n if (minRows) {\n const childArray = React.Children.toArray(children);\n const hasOnlyRowChildren =\n childArray.length > 0 &&\n childArray.every((c) => React.isValidElement(c) && c.type === TableRow);\n const realRowCount = hasOnlyRowChildren ? childArray.length : 0;\n const placeholderCount = hasOnlyRowChildren\n ? Math.max(0, minRows - realRowCount)\n : 0;\n\n if (placeholderCount > 0) {\n // Override the last real row's `hideDivider` so the body always\n // ends with a divider-less slot — matching how a full page hides\n // the last row's divider.\n const patchedRows = childArray.map((child, i) => {\n if (!React.isValidElement(child)) return child;\n const isLastRealRow = i === realRowCount - 1;\n return React.cloneElement(child, {\n hideDivider: isLastRealRow\n ? false\n : (child.props as any).hideDivider,\n } as any);\n });\n\n const placeholders = Array.from({ length: placeholderCount }).map(\n (_, i) => {\n const isLast = i === placeholderCount - 1;\n return (\n <Box\n key={`__table-body-placeholder-${i}`}\n aria-hidden\n style={{\n height: isLast\n ? sizing.rowHeight\n : sizing.rowHeight + DIVIDER_HEIGHT,\n flexShrink: 0,\n }}\n />\n );\n }\n );\n\n renderedChildren = (\n <>\n {patchedRows}\n {placeholders}\n </>\n );\n }\n }\n\n return (\n <TableRowGroupContext.Provider value=\"body\">\n <Box\n ref={ref}\n flexDirection=\"column\"\n alignItems=\"stretch\"\n width=\"100%\"\n role=\"rowgroup\"\n {...props}\n style={{\n ...(computedMinHeight !== undefined && {\n minHeight: computedMinHeight,\n }),\n ...style,\n }}\n >\n {renderedChildren}\n </Box>\n </TableRowGroupContext.Provider>\n );\n }\n);\n\nTableBody.displayName = \"Table.Body\";\n\nconst TableRow = forwardRef<any, TableRowProps>(\n (\n {\n children,\n hoverable: hoverableProp,\n selected,\n hideDivider: hideDividerProp,\n onPress,\n themeMode,\n themeProductContext,\n style,\n onMouseEnter,\n onMouseLeave,\n onFocus,\n onBlur,\n onKeyDown,\n ...props\n },\n ref\n ) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n const sizing = theme.sizing.table;\n const rowGroup = useContext(TableRowGroupContext);\n const hoverCapable = useHoverCapable();\n\n const isHeaderRow = rowGroup === \"header\";\n\n // Header rows are not hoverable by default and don't render a divider\n // (Header already paints its own top/bottom dividers).\n const hoverable = hoverableProp ?? !isHeaderRow;\n const hideDivider = hideDividerProp ?? isHeaderRow;\n\n // Track hover + focus-within so descendant <Table.Cell revealOnHover>\n // cells can decide whether to show themselves. Single re-render per\n // hover/focus change, scoped to this row only.\n const [hovered, setHovered] = useState(false);\n const [focusedWithin, setFocusedWithin] = useState(false);\n\n // On touch-only devices the reveal logic short-circuits to \"always\n // visible\" — matches the Figma spec.\n const revealed = hoverCapable ? hovered || focusedWithin : true;\n\n const handleMouseEnter = useCallback(\n (e: React.MouseEvent<HTMLElement>) => {\n setHovered(true);\n onMouseEnter?.(e);\n },\n [onMouseEnter]\n );\n const handleMouseLeave = useCallback(\n (e: React.MouseEvent<HTMLElement>) => {\n setHovered(false);\n onMouseLeave?.(e);\n },\n [onMouseLeave]\n );\n const handleFocus = useCallback(\n (e: React.FocusEvent<HTMLElement>) => {\n setFocusedWithin(true);\n onFocus?.(e);\n },\n [onFocus]\n );\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLElement>) => {\n // When focus moves between two children of this row the blur fires\n // here but the row is still focus-within — keep the state truthy.\n if (\n e.relatedTarget instanceof Node &&\n e.currentTarget.contains(e.relatedTarget)\n ) {\n onBlur?.(e);\n return;\n }\n setFocusedWithin(false);\n onBlur?.(e);\n },\n [onBlur]\n );\n\n // Rows opt into keyboard activation only when they are interactive\n // (i.e. consumer passed `onPress`). Enter/Space mirror native button\n // behavior; Space is preventDefault'd so the page doesn't scroll.\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<Element>) => {\n onKeyDown?.(e);\n if (!onPress || e.defaultPrevented) return;\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onPress();\n }\n },\n [onKeyDown, onPress]\n );\n\n const baseBg = selected\n ? theme.colors.background.secondary\n : theme.colors.background.primary;\n\n const rowHeight = isHeaderRow ? sizing.headerRowHeight : sizing.rowHeight;\n const rowPaddingHorizontal = isHeaderRow\n ? sizing.headerRowPaddingHorizontal\n : sizing.rowPaddingHorizontal;\n\n const ctxValue = useMemo(() => ({ revealed }), [revealed]);\n\n return (\n <RowRevealContext.Provider value={ctxValue}>\n <Box\n ref={ref}\n flexDirection=\"row\"\n alignItems=\"center\"\n height={rowHeight}\n paddingHorizontal={rowPaddingHorizontal}\n width=\"100%\"\n gap={sizing.cellGap}\n backgroundColor={baseBg}\n cursor={onPress ? \"pointer\" : undefined}\n hoverStyle={\n hoverable\n ? { backgroundColor: theme.colors.background.secondary }\n : undefined\n }\n onPress={onPress}\n role=\"row\"\n tabIndex={onPress ? 0 : undefined}\n aria-selected={selected || undefined}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n onFocus={handleFocus}\n onBlur={handleBlur}\n {...props}\n onKeyDown={handleKeyDown}\n style={style}\n >\n {children}\n </Box>\n {!hideDivider && <Divider color={theme.colors.border.secondary} />}\n </RowRevealContext.Provider>\n );\n }\n);\n\nTableRow.displayName = \"Table.Row\";\n\nconst positionToFlex = (position: TableCellProps[\"position\"]) => {\n switch (position) {\n case \"left\":\n return { flexShrink: 0 };\n case \"right\":\n return { flexShrink: 0, marginLeft: \"auto\" };\n default:\n return {};\n }\n};\n\nconst alignToJustify = (align: TableCellProps[\"align\"]) => {\n switch (align) {\n case \"right\":\n return \"flex-end\" as const;\n case \"center\":\n return \"center\" as const;\n default:\n return \"flex-start\" as const;\n }\n};\n\nconst TableCell = forwardRef<any, TableCellProps>(\n (\n {\n children,\n align = \"left\",\n position = \"default\",\n width,\n grow,\n revealOnHover,\n themeMode,\n themeProductContext,\n style,\n ...props\n },\n ref\n ) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n const sizing = theme.sizing.table;\n const { revealed } = useContext(RowRevealContext);\n\n const positionStyle = useMemo(() => positionToFlex(position), [position]);\n\n // Per Figma spec: hide via opacity + pointer-events (NOT visibility) so\n // keyboard Tab still focuses the descendants. Focusing a descendant flips\n // `revealed` to true via RowRevealContext, restoring pointer-events.\n const revealStyle: React.CSSProperties =\n revealOnHover && !revealed\n ? { opacity: 0, pointerEvents: \"none\" }\n : revealOnHover\n ? { opacity: 1, transition: \"opacity 0.15s ease\" }\n : {};\n\n return (\n <Box\n ref={ref}\n flexDirection=\"row\"\n alignItems=\"center\"\n justifyContent={alignToJustify(align)}\n gap={8}\n height=\"100%\"\n width={width}\n role=\"cell\"\n {...props}\n style={{\n flex: width != null ? \"0 0 auto\" : (grow ?? 1),\n minWidth: 0,\n ...positionStyle,\n ...revealStyle,\n ...style,\n }}\n >\n {typeof children === \"string\" || typeof children === \"number\" ? (\n <Text\n fontSize={sizing.cellFontSize}\n lineHeight={sizing.cellLineHeight}\n color={theme.colors.content.primary}\n // truncation\n style={{\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n maxWidth: \"100%\",\n }}\n >\n {children}\n </Text>\n ) : (\n children\n )}\n </Box>\n );\n }\n);\n\nTableCell.displayName = \"Table.Cell\";\n\n/**\n * Sort indicator. Uses the `Sort` line icon from `@xsolla/xui-icons-base`\n * (matches the Figma spec — a stacked up/down chevron). The icon is the\n * same in all three states; opacity differentiates \"sortable but not\n * active\" (`none`, 40%) from \"active sort\" (`ascending` / `descending`,\n * 100%). Direction is communicated to assistive tech via `aria-sort` on\n * the parent <Table.Head>.\n */\nconst SortIcon: React.FC<{\n direction: \"ascending\" | \"descending\" | \"none\";\n color: string;\n size: number;\n}> = ({ direction, color, size }) => (\n <Box\n style={{\n flexShrink: 0,\n opacity: direction === \"none\" ? 0.4 : 1,\n transition: \"opacity 0.15s ease\",\n }}\n >\n <Sort variant=\"line\" size={size} color={color} aria-hidden />\n </Box>\n);\n\nconst TableHead = forwardRef<any, TableHeadProps>(\n (\n {\n children,\n align = \"left\",\n position = \"default\",\n width,\n grow,\n sort,\n onSortToggle,\n themeMode,\n themeProductContext,\n style,\n ...props\n },\n ref\n ) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n const sizing = theme.sizing.table;\n\n const positionStyle = useMemo(() => positionToFlex(position), [position]);\n const sortable = sort != null;\n\n const ariaSort: \"ascending\" | \"descending\" | \"none\" | undefined = sortable\n ? sort\n : undefined;\n\n return (\n <Box\n ref={ref}\n flexDirection=\"row\"\n alignItems=\"center\"\n justifyContent={alignToJustify(align)}\n gap={sizing.headerCellGap}\n height=\"100%\"\n width={width}\n role=\"columnheader\"\n aria-sort={ariaSort}\n cursor={sortable ? \"pointer\" : undefined}\n onPress={sortable ? onSortToggle : undefined}\n {...props}\n style={{\n flex: width != null ? \"0 0 auto\" : (grow ?? 1),\n minWidth: 0,\n ...positionStyle,\n ...style,\n }}\n >\n {sortable && (\n <SortIcon\n direction={sort}\n color={theme.colors.content.secondary}\n size={sizing.headerCellFontSize + 2}\n />\n )}\n {typeof children === \"string\" || typeof children === \"number\" ? (\n <Text\n fontSize={sizing.headerCellFontSize}\n lineHeight={sizing.headerCellLineHeight}\n color={theme.colors.content.secondary}\n fontWeight=\"500\"\n style={{\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {children}\n </Text>\n ) : (\n children\n )}\n </Box>\n );\n }\n);\n\nTableHead.displayName = \"Table.Head\";\n\nconst TableFooter = forwardRef<any, TableFooterProps>(\n ({ children, style, ...props }, ref) => {\n const { theme } = useResolvedTheme();\n const sizing = theme.sizing.table;\n\n return (\n <Box\n ref={ref}\n flexDirection=\"row\"\n alignItems=\"center\"\n justifyContent=\"center\"\n gap={sizing.paginationGap}\n paddingHorizontal={sizing.paginationPaddingHorizontal}\n width=\"100%\"\n {...props}\n style={style}\n >\n {children}\n </Box>\n );\n }\n);\n\nTableFooter.displayName = \"Table.Footer\";\n\nexport const Table = Object.assign(TableRoot, {\n Caption: TableCaption,\n Header: TableHeader,\n Body: TableBody,\n Footer: TableFooter,\n Row: TableRow,\n Head: TableHead,\n Cell: TableCell,\n});\n","import React from \"react\";\nimport styled from \"styled-components\";\nimport type { BoxProps } from \"@xsolla/xui-primitives-core\";\nimport { createFilteredElement } from \"./filterDOMProps\";\n\nconst FilteredDiv = createFilteredElement(\"div\");\n\nconst StyledBox = styled(FilteredDiv)<BoxProps>`\n display: flex;\n box-sizing: border-box;\n background-color: ${(props) => props.backgroundColor || \"transparent\"};\n border-color: ${(props) => props.borderColor || \"transparent\"};\n border-width: ${(props) =>\n typeof props.borderWidth === \"number\"\n ? `${props.borderWidth}px`\n : props.borderWidth || 0};\n\n ${(props) =>\n props.borderBottomWidth !== undefined &&\n `\n border-bottom-width: ${typeof props.borderBottomWidth === \"number\" ? `${props.borderBottomWidth}px` : props.borderBottomWidth};\n border-bottom-color: ${props.borderBottomColor || props.borderColor || \"transparent\"};\n border-bottom-style: solid;\n `}\n ${(props) =>\n props.borderTopWidth !== undefined &&\n `\n border-top-width: ${typeof props.borderTopWidth === \"number\" ? `${props.borderTopWidth}px` : props.borderTopWidth};\n border-top-color: ${props.borderTopColor || props.borderColor || \"transparent\"};\n border-top-style: solid;\n `}\n ${(props) =>\n props.borderLeftWidth !== undefined &&\n `\n border-left-width: ${typeof props.borderLeftWidth === \"number\" ? `${props.borderLeftWidth}px` : props.borderLeftWidth};\n border-left-color: ${props.borderLeftColor || props.borderColor || \"transparent\"};\n border-left-style: solid;\n `}\n ${(props) =>\n props.borderRightWidth !== undefined &&\n `\n border-right-width: ${typeof props.borderRightWidth === \"number\" ? `${props.borderRightWidth}px` : props.borderRightWidth};\n border-right-color: ${props.borderRightColor || props.borderColor || \"transparent\"};\n border-right-style: solid;\n `}\n\n border-style: ${(props) =>\n props.borderStyle ||\n (props.borderWidth ||\n props.borderBottomWidth ||\n props.borderTopWidth ||\n props.borderLeftWidth ||\n props.borderRightWidth\n ? \"solid\"\n : \"none\")};\n border-radius: ${(props) =>\n typeof props.borderRadius === \"number\"\n ? `${props.borderRadius}px`\n : props.borderRadius || 0};\n height: ${(props) =>\n typeof props.height === \"number\"\n ? `${props.height}px`\n : props.height || \"auto\"};\n width: ${(props) =>\n typeof props.width === \"number\"\n ? `${props.width}px`\n : props.width || \"auto\"};\n min-width: ${(props) =>\n typeof props.minWidth === \"number\"\n ? `${props.minWidth}px`\n : props.minWidth || \"auto\"};\n min-height: ${(props) =>\n typeof props.minHeight === \"number\"\n ? `${props.minHeight}px`\n : props.minHeight || \"auto\"};\n max-width: ${(props) =>\n typeof props.maxWidth === \"number\"\n ? `${props.maxWidth}px`\n : props.maxWidth || \"none\"};\n max-height: ${(props) =>\n typeof props.maxHeight === \"number\"\n ? `${props.maxHeight}px`\n : props.maxHeight || \"none\"};\n\n padding: ${(props) =>\n typeof props.padding === \"number\"\n ? `${props.padding}px`\n : props.padding || 0};\n ${(props) =>\n props.paddingHorizontal &&\n `\n padding-left: ${typeof props.paddingHorizontal === \"number\" ? `${props.paddingHorizontal}px` : props.paddingHorizontal};\n padding-right: ${typeof props.paddingHorizontal === \"number\" ? `${props.paddingHorizontal}px` : props.paddingHorizontal};\n `}\n ${(props) =>\n props.paddingVertical &&\n `\n padding-top: ${typeof props.paddingVertical === \"number\" ? `${props.paddingVertical}px` : props.paddingVertical};\n padding-bottom: ${typeof props.paddingVertical === \"number\" ? `${props.paddingVertical}px` : props.paddingVertical};\n `}\n ${(props) =>\n props.paddingTop !== undefined &&\n `padding-top: ${typeof props.paddingTop === \"number\" ? `${props.paddingTop}px` : props.paddingTop};`}\n ${(props) =>\n props.paddingBottom !== undefined &&\n `padding-bottom: ${typeof props.paddingBottom === \"number\" ? `${props.paddingBottom}px` : props.paddingBottom};`}\n ${(props) =>\n props.paddingLeft !== undefined &&\n `padding-left: ${typeof props.paddingLeft === \"number\" ? `${props.paddingLeft}px` : props.paddingLeft};`}\n ${(props) =>\n props.paddingRight !== undefined &&\n `padding-right: ${typeof props.paddingRight === \"number\" ? `${props.paddingRight}px` : props.paddingRight};`}\n\n margin: ${(props) =>\n typeof props.margin === \"number\" ? `${props.margin}px` : props.margin || 0};\n ${(props) =>\n props.marginTop !== undefined &&\n `margin-top: ${typeof props.marginTop === \"number\" ? `${props.marginTop}px` : props.marginTop};`}\n ${(props) =>\n props.marginBottom !== undefined &&\n `margin-bottom: ${typeof props.marginBottom === \"number\" ? `${props.marginBottom}px` : props.marginBottom};`}\n ${(props) =>\n props.marginLeft !== undefined &&\n `margin-left: ${typeof props.marginLeft === \"number\" ? `${props.marginLeft}px` : props.marginLeft};`}\n ${(props) =>\n props.marginRight !== undefined &&\n `margin-right: ${typeof props.marginRight === \"number\" ? `${props.marginRight}px` : props.marginRight};`}\n\n flex-direction: ${(props) => props.flexDirection || \"column\"};\n flex-wrap: ${(props) => props.flexWrap || \"nowrap\"};\n align-items: ${(props) => props.alignItems || \"stretch\"};\n justify-content: ${(props) => props.justifyContent || \"flex-start\"};\n cursor: ${(props) =>\n props.cursor\n ? props.cursor\n : props.onClick || props.onPress\n ? \"pointer\"\n : \"inherit\"};\n position: ${(props) => props.position || \"static\"};\n top: ${(props) =>\n typeof props.top === \"number\" ? `${props.top}px` : props.top};\n bottom: ${(props) =>\n typeof props.bottom === \"number\" ? `${props.bottom}px` : props.bottom};\n left: ${(props) =>\n typeof props.left === \"number\" ? `${props.left}px` : props.left};\n right: ${(props) =>\n typeof props.right === \"number\" ? `${props.right}px` : props.right};\n flex: ${(props) => props.flex};\n flex-shrink: ${(props) => props.flexShrink ?? 1};\n gap: ${(props) =>\n typeof props.gap === \"number\" ? `${props.gap}px` : props.gap || 0};\n align-self: ${(props) => props.alignSelf || \"auto\"};\n overflow: ${(props) => props.overflow || \"visible\"};\n overflow-x: ${(props) => props.overflowX || \"visible\"};\n overflow-y: ${(props) => props.overflowY || \"visible\"};\n z-index: ${(props) => props.zIndex};\n opacity: ${(props) => (props.disabled ? 0.5 : 1)};\n pointer-events: ${(props) => (props.disabled ? \"none\" : \"auto\")};\n\n &:hover {\n ${(props) =>\n props.hoverStyle?.backgroundColor &&\n `background-color: ${props.hoverStyle.backgroundColor};`}\n ${(props) =>\n props.hoverStyle?.borderColor &&\n `border-color: ${props.hoverStyle.borderColor};`}\n }\n\n &:active {\n ${(props) =>\n props.pressStyle?.backgroundColor &&\n `background-color: ${props.pressStyle.backgroundColor};`}\n }\n`;\n\nexport const Box = React.forwardRef<\n HTMLDivElement | HTMLButtonElement,\n BoxProps\n>(\n (\n {\n children,\n onPress,\n onKeyDown,\n onKeyUp,\n role,\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 \"aria-describedby\": ariaDescribedBy,\n \"aria-expanded\": ariaExpanded,\n \"aria-haspopup\": ariaHasPopup,\n \"aria-pressed\": ariaPressed,\n \"aria-controls\": ariaControls,\n tabIndex,\n as,\n src,\n alt,\n onError,\n onLoad,\n type,\n disabled,\n id,\n testID,\n \"data-testid\": dataTestId,\n ...props\n },\n ref\n ) => {\n // Handle as=\"img\" for rendering images with proper border-radius\n if (as === \"img\" && src) {\n return (\n <img\n src={src}\n alt={alt || \"\"}\n onError={onError}\n onLoad={onLoad}\n style={{\n display: \"block\",\n objectFit: \"cover\",\n width:\n typeof props.width === \"number\"\n ? `${props.width}px`\n : props.width,\n height:\n typeof props.height === \"number\"\n ? `${props.height}px`\n : props.height,\n borderRadius:\n typeof props.borderRadius === \"number\"\n ? `${props.borderRadius}px`\n : props.borderRadius,\n position: props.position,\n top: typeof props.top === \"number\" ? `${props.top}px` : props.top,\n left:\n typeof props.left === \"number\" ? `${props.left}px` : props.left,\n right:\n typeof props.right === \"number\"\n ? `${props.right}px`\n : props.right,\n bottom:\n typeof props.bottom === \"number\"\n ? `${props.bottom}px`\n : props.bottom,\n }}\n />\n );\n }\n\n return (\n <StyledBox\n ref={ref}\n elementType={as}\n id={id}\n type={as === \"button\" ? type || \"button\" : undefined}\n disabled={as === \"button\" ? disabled : undefined}\n onClick={onPress}\n onKeyDown={onKeyDown}\n onKeyUp={onKeyUp}\n role={role}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n aria-current={ariaCurrent}\n aria-disabled={ariaDisabled}\n aria-busy={ariaBusy}\n aria-describedby={ariaDescribedBy}\n aria-expanded={ariaExpanded}\n aria-haspopup={ariaHasPopup}\n aria-pressed={ariaPressed}\n aria-controls={ariaControls}\n aria-live={ariaLive}\n tabIndex={tabIndex !== undefined ? tabIndex : undefined}\n data-testid={dataTestId || testID}\n {...props}\n >\n {children}\n </StyledBox>\n );\n }\n);\n\nBox.displayName = \"Box\";\n","import React from \"react\";\nimport isPropValid from \"@emotion/is-prop-valid\";\n\n// Props that @emotion/is-prop-valid incorrectly treats as valid HTML.\n// These are React Native or component-specific props that match\n// valid HTML patterns (on* event handlers, SVG attributes).\nexport const ADDITIONAL_BLOCKED_PROPS = new Set([\n // RN-only event handlers (pass isPropValid's on* pattern)\n \"onPress\",\n \"onChangeText\",\n \"onLayout\",\n \"onMoveShouldSetResponder\",\n \"onResponderGrant\",\n \"onResponderMove\",\n \"onResponderRelease\",\n \"onResponderTerminate\",\n // SVG attributes that pass isPropValid\n \"strokeWidth\",\n // CSS properties that pass isPropValid but are used as component props\n \"overflow\",\n \"cursor\",\n \"fontSize\",\n \"fontWeight\",\n \"fontFamily\",\n \"textDecoration\",\n]);\n\nfunction shouldForwardProp(key: string): boolean {\n if (ADDITIONAL_BLOCKED_PROPS.has(key)) return false;\n return isPropValid(key);\n}\n\n/**\n * Creates a React component that renders the given HTML tag\n * but filters out non-HTML props before they reach the DOM.\n *\n * Uses @emotion/is-prop-valid (same library styled-components v4\n * uses internally) to automatically block invalid HTML attributes,\n * plus a small blocklist for false positives (RN on* handlers, SVG attrs).\n *\n * Usage: `const FilteredDiv = createFilteredElement(\"div\");`\n * Then: `const StyledBox = styled(FilteredDiv)<BoxProps>\\`...\\`;`\n *\n * styled-components can still read ALL props for CSS interpolation,\n * but only valid HTML attributes are forwarded to the DOM element.\n */\nexport function createFilteredElement(defaultTag: string) {\n const Component = React.forwardRef<HTMLElement, Record<string, unknown>>(\n ({ children, elementType, ...props }, ref) => {\n const Tag = (elementType as string) || defaultTag;\n const htmlProps: Record<string, unknown> = {};\n for (const key of Object.keys(props)) {\n if (shouldForwardProp(key)) {\n htmlProps[key] = props[key];\n }\n }\n return React.createElement(\n Tag,\n { ref, ...htmlProps },\n children as React.ReactNode\n );\n }\n );\n Component.displayName = `Filtered(${defaultTag})`;\n return Component;\n}\n","function memoize(fn) {\n var cache = {};\n return function (arg) {\n if (cache[arg] === undefined) cache[arg] = fn(arg);\n return cache[arg];\n };\n}\n\nexport default memoize;\n","import memoize from '@emotion/memoize';\n\nvar reactPropsRegex = /^((children|dangerouslySetInnerHTML|key|ref|autoFocus|defaultValue|defaultChecked|innerHTML|suppressContentEditableWarning|suppressHydrationWarning|valueLink|accept|acceptCharset|accessKey|action|allow|allowUserMedia|allowPaymentRequest|allowFullScreen|allowTransparency|alt|async|autoComplete|autoPlay|capture|cellPadding|cellSpacing|challenge|charSet|checked|cite|classID|className|cols|colSpan|content|contentEditable|contextMenu|controls|controlsList|coords|crossOrigin|data|dateTime|decoding|default|defer|dir|disabled|disablePictureInPicture|download|draggable|encType|form|formAction|formEncType|formMethod|formNoValidate|formTarget|frameBorder|headers|height|hidden|high|href|hrefLang|htmlFor|httpEquiv|id|inputMode|integrity|is|keyParams|keyType|kind|label|lang|list|loading|loop|low|marginHeight|marginWidth|max|maxLength|media|mediaGroup|method|min|minLength|multiple|muted|name|nonce|noValidate|open|optimum|pattern|placeholder|playsInline|poster|preload|profile|radioGroup|readOnly|referrerPolicy|rel|required|reversed|role|rows|rowSpan|sandbox|scope|scoped|scrolling|seamless|selected|shape|size|sizes|slot|span|spellCheck|src|srcDoc|srcLang|srcSet|start|step|style|summary|tabIndex|target|title|type|useMap|value|width|wmode|wrap|about|datatype|inlist|prefix|property|resource|typeof|vocab|autoCapitalize|autoCorrect|autoSave|color|inert|itemProp|itemScope|itemType|itemID|itemRef|on|results|security|unselectable|accentHeight|accumulate|additive|alignmentBaseline|allowReorder|alphabetic|amplitude|arabicForm|ascent|attributeName|attributeType|autoReverse|azimuth|baseFrequency|baselineShift|baseProfile|bbox|begin|bias|by|calcMode|capHeight|clip|clipPathUnits|clipPath|clipRule|colorInterpolation|colorInterpolationFilters|colorProfile|colorRendering|contentScriptType|contentStyleType|cursor|cx|cy|d|decelerate|descent|diffuseConstant|direction|display|divisor|dominantBaseline|dur|dx|dy|edgeMode|elevation|enableBackground|end|exponent|externalResourcesRequired|fill|fillOpacity|fillRule|filter|filterRes|filterUnits|floodColor|floodOpacity|focusable|fontFamily|fontSize|fontSizeAdjust|fontStretch|fontStyle|fontVariant|fontWeight|format|from|fr|fx|fy|g1|g2|glyphName|glyphOrientationHorizontal|glyphOrientationVertical|glyphRef|gradientTransform|gradientUnits|hanging|horizAdvX|horizOriginX|ideographic|imageRendering|in|in2|intercept|k|k1|k2|k3|k4|kernelMatrix|kernelUnitLength|kerning|keyPoints|keySplines|keyTimes|lengthAdjust|letterSpacing|lightingColor|limitingConeAngle|local|markerEnd|markerMid|markerStart|markerHeight|markerUnits|markerWidth|mask|maskContentUnits|maskUnits|mathematical|mode|numOctaves|offset|opacity|operator|order|orient|orientation|origin|overflow|overlinePosition|overlineThickness|panose1|paintOrder|pathLength|patternContentUnits|patternTransform|patternUnits|pointerEvents|points|pointsAtX|pointsAtY|pointsAtZ|preserveAlpha|preserveAspectRatio|primitiveUnits|r|radius|refX|refY|renderingIntent|repeatCount|repeatDur|requiredExtensions|requiredFeatures|restart|result|rotate|rx|ry|scale|seed|shapeRendering|slope|spacing|specularConstant|specularExponent|speed|spreadMethod|startOffset|stdDeviation|stemh|stemv|stitchTiles|stopColor|stopOpacity|strikethroughPosition|strikethroughThickness|string|stroke|strokeDasharray|strokeDashoffset|strokeLinecap|strokeLinejoin|strokeMiterlimit|strokeOpacity|strokeWidth|surfaceScale|systemLanguage|tableValues|targetX|targetY|textAnchor|textDecoration|textRendering|textLength|to|transform|u1|u2|underlinePosition|underlineThickness|unicode|unicodeBidi|unicodeRange|unitsPerEm|vAlphabetic|vHanging|vIdeographic|vMathematical|values|vectorEffect|version|vertAdvY|vertOriginX|vertOriginY|viewBox|viewTarget|visibility|widths|wordSpacing|writingMode|x|xHeight|x1|x2|xChannelSelector|xlinkActuate|xlinkArcrole|xlinkHref|xlinkRole|xlinkShow|xlinkTitle|xlinkType|xmlBase|xmlns|xmlnsXlink|xmlLang|xmlSpace|y|y1|y2|yChannelSelector|z|zoomAndPan|for|class|autofocus)|(([Dd][Aa][Tt][Aa]|[Aa][Rr][Ii][Aa]|x)-.*))$/; // https://esbench.com/bench/5bfee68a4cd7e6009ef61d23\n\nvar index = memoize(function (prop) {\n return reactPropsRegex.test(prop) || prop.charCodeAt(0) === 111\n /* o */\n && prop.charCodeAt(1) === 110\n /* n */\n && prop.charCodeAt(2) < 91;\n}\n/* Z+1 */\n);\n\nexport default index;\n","import React from \"react\";\nimport styled from \"styled-components\";\nimport { TextProps } from \"@xsolla/xui-primitives-core\";\nimport { createFilteredElement } from \"./filterDOMProps\";\n\nconst FilteredSpan = createFilteredElement(\"span\");\n\nconst StyledText = styled(FilteredSpan)<TextProps>`\n color: ${(props) => props.color || \"inherit\"};\n font-size: ${(props) =>\n typeof props.fontSize === \"number\"\n ? `${props.fontSize}px`\n : props.fontSize || \"inherit\"};\n font-weight: ${(props) => props.fontWeight || \"normal\"};\n font-family: ${(props) =>\n props.fontFamily ||\n '\"Aktiv Grotesk\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif'};\n line-height: ${(props) =>\n typeof props.lineHeight === \"number\"\n ? `${props.lineHeight}px`\n : props.lineHeight || \"inherit\"};\n white-space: ${(props) => props.whiteSpace || \"normal\"};\n text-align: ${(props) => props.textAlign || \"inherit\"};\n text-decoration: ${(props) => props.textDecoration || \"none\"};\n`;\n\nexport const Text: React.FC<TextProps> = ({\n style,\n className,\n id,\n role,\n numberOfLines: _numberOfLines,\n ...props\n}) => {\n return (\n <StyledText\n {...props}\n style={style}\n className={className}\n id={id}\n role={role}\n />\n );\n};\n"],"mappings":"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","names":["import_react","import_react","React","styled","React","import_styled_components","import_jsx_runtime","styled","import_jsx_runtime","React"]}
|
|
1
|
+
{"version":3,"sources":["../../src/index.tsx","../../src/Table.tsx","../../../../foundation/primitives-web/src/Box.tsx","../../../../foundation/primitives-web/src/filterDOMProps.ts","../../../../../node_modules/@emotion/memoize/dist/memoize.esm.js","../../../../../node_modules/@emotion/is-prop-valid/dist/is-prop-valid.esm.js","../../../../foundation/primitives-web/src/Text.tsx"],"sourcesContent":["export * from \"./Table\";\nexport * from \"./types\";\n","import React, {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n type ReactNode,\n} from \"react\";\n// @ts-expect-error - this will be resolved at build time\nimport { Box, Text } from \"@xsolla/xui-primitives\";\nimport { useResolvedTheme, isNative } from \"@xsolla/xui-core\";\nimport { Sort } from \"@xsolla/xui-icons-base\";\nimport {\n TableBodyProps,\n TableCaptionProps,\n TableCellProps,\n TableFooterProps,\n TableHeaderProps,\n TableHeadProps,\n TableProps,\n TableRowProps,\n} from \"./types\";\n\n/**\n * Tracks which rowgroup the current <Table.Row> sits inside, so the row can\n * pick the right sizing (header rows are slightly taller / styled\n * differently per `theme.sizing.table`).\n */\ntype RowGroup = \"header\" | \"body\";\nconst TableRowGroupContext = createContext<RowGroup>(\"body\");\n\n/**\n * Tracks whether the parent <Table.Row> is hovered or has focus inside it.\n * Cells that opt into `revealOnHover` read this to decide whether to show\n * their content. Defaults to `true` so cells used outside a row (e.g. inside\n * <Table.Header>) are always visible.\n */\nconst RowRevealContext = createContext<{ revealed: boolean }>({\n revealed: true,\n});\n\n/**\n * Detects whether the device is hover-capable (desktop) vs touch-only (mobile).\n * On touch-only devices we always reveal action cells so they can be tapped —\n * matching the Figma spec (\"Right cell actions ... always visible on touch\n * devices\"). SSR-safe: returns `true` until mounted, which means actions stay\n * revealed on the server (no flash-of-hidden-actions on first paint).\n *\n * Table is web-only for now — on native this hook short-circuits and never\n * runs the media query.\n */\nconst useHoverCapable = (): boolean => {\n const [hoverCapable, setHoverCapable] = useState(true);\n useEffect(() => {\n if (isNative) return;\n if (typeof window === \"undefined\" || !window.matchMedia) return;\n const mq = window.matchMedia(\"(hover: hover)\");\n setHoverCapable(mq.matches);\n const onChange = (e: MediaQueryListEvent) => setHoverCapable(e.matches);\n mq.addEventListener?.(\"change\", onChange);\n return () => mq.removeEventListener?.(\"change\", onChange);\n }, []);\n return hoverCapable;\n};\n\nconst Divider: React.FC<{ color: string }> = ({ color }) => (\n <Box\n width=\"100%\"\n height={1}\n backgroundColor={color}\n style={{ flexShrink: 0 }}\n />\n);\n\nconst TableRoot = forwardRef<any, TableProps>(\n ({ children, testID, themeMode, themeProductContext }, ref) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n const sizing = theme.sizing.table;\n\n return (\n <Box\n ref={ref}\n testID={testID}\n flexDirection=\"column\"\n alignItems=\"stretch\"\n gap={sizing.containerGap}\n paddingVertical={sizing.containerPaddingVertical}\n backgroundColor={theme.colors.background.primary}\n borderRadius={sizing.containerRadius}\n width=\"100%\"\n role=\"table\"\n style={{\n color: theme.colors.content.primary,\n overflow: \"clip\",\n }}\n >\n {children}\n </Box>\n );\n }\n);\n\nTableRoot.displayName = \"Table\";\n\nconst TableCaption = forwardRef<any, TableCaptionProps>(\n ({ children, themeMode, themeProductContext, style, ...props }, ref) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n const sizing = theme.sizing.table;\n\n return (\n <Box\n ref={ref}\n flexDirection=\"row\"\n alignItems=\"center\"\n paddingHorizontal={sizing.headerRowPaddingHorizontal}\n width=\"100%\"\n // <caption> isn't a valid ARIA role; consumers can pass role=\"region\"\n // + aria-label via ...props if they want it announced.\n {...props}\n style={style}\n >\n {typeof children === \"string\" || typeof children === \"number\" ? (\n <Text\n fontSize={sizing.captionFontSize}\n lineHeight={sizing.captionLineHeight}\n color={theme.colors.content.secondary}\n >\n {children}\n </Text>\n ) : (\n children\n )}\n </Box>\n );\n }\n);\n\nTableCaption.displayName = \"Table.Caption\";\n\nconst TableHeader = forwardRef<any, TableHeaderProps>(\n ({ children, themeMode, themeProductContext, style, ...props }, ref) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n\n return (\n <TableRowGroupContext.Provider value=\"header\">\n <Box\n ref={ref}\n flexDirection=\"column\"\n alignItems=\"stretch\"\n width=\"100%\"\n role=\"rowgroup\"\n {...props}\n style={{\n position: \"sticky\",\n top: 0,\n zIndex: 1,\n backgroundColor: theme.colors.background.primary,\n ...style,\n }}\n >\n {children}\n <Divider color={theme.colors.border.secondary} />\n </Box>\n </TableRowGroupContext.Provider>\n );\n }\n);\n\nTableHeader.displayName = \"Table.Header\";\n\nconst TableBody = forwardRef<any, TableBodyProps>(\n (\n { children, style, minRows, themeMode, themeProductContext, ...props },\n ref\n ) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n const sizing = theme.sizing.table;\n\n // Each row paints a 1px divider after it (rendered as a sibling Box\n // inside Table.Row), except the very last row in the body which\n // hides its divider. So a fully filled body of N rows is\n // `N × rowHeight + (N - 1) × 1px`.\n const DIVIDER_HEIGHT = 1;\n const computedMinHeight = minRows\n ? minRows * sizing.rowHeight + (minRows - 1) * DIVIDER_HEIGHT\n : undefined;\n\n // Decide whether to auto-pad with placeholder slots. We only pad\n // when every direct child is a <Table.Row>; consumers using a\n // single non-row block (e.g. a custom \"no results\" panel) get just\n // the reserved min-height so they can stretch their content to fill.\n let renderedChildren: ReactNode = children;\n if (minRows) {\n const childArray = React.Children.toArray(children);\n const hasOnlyRowChildren =\n childArray.length > 0 &&\n childArray.every((c) => React.isValidElement(c) && c.type === TableRow);\n const realRowCount = hasOnlyRowChildren ? childArray.length : 0;\n const placeholderCount = hasOnlyRowChildren\n ? Math.max(0, minRows - realRowCount)\n : 0;\n\n if (placeholderCount > 0) {\n // Override the last real row's `hideDivider` so the body always\n // ends with a divider-less slot — matching how a full page hides\n // the last row's divider.\n const patchedRows = childArray.map((child, i) => {\n if (!React.isValidElement(child)) return child;\n const isLastRealRow = i === realRowCount - 1;\n return React.cloneElement(child, {\n hideDivider: isLastRealRow\n ? false\n : (child.props as any).hideDivider,\n } as any);\n });\n\n const placeholders = Array.from({ length: placeholderCount }).map(\n (_, i) => {\n const isLast = i === placeholderCount - 1;\n return (\n <Box\n key={`__table-body-placeholder-${i}`}\n aria-hidden\n style={{\n height: isLast\n ? sizing.rowHeight\n : sizing.rowHeight + DIVIDER_HEIGHT,\n flexShrink: 0,\n }}\n />\n );\n }\n );\n\n renderedChildren = (\n <>\n {patchedRows}\n {placeholders}\n </>\n );\n }\n }\n\n return (\n <TableRowGroupContext.Provider value=\"body\">\n <Box\n ref={ref}\n flexDirection=\"column\"\n alignItems=\"stretch\"\n width=\"100%\"\n role=\"rowgroup\"\n {...props}\n style={{\n ...(computedMinHeight !== undefined && {\n minHeight: computedMinHeight,\n }),\n ...style,\n }}\n >\n {renderedChildren}\n </Box>\n </TableRowGroupContext.Provider>\n );\n }\n);\n\nTableBody.displayName = \"Table.Body\";\n\nconst TableRow = forwardRef<any, TableRowProps>(\n (\n {\n children,\n hoverable: hoverableProp,\n selected,\n hideDivider: hideDividerProp,\n onPress,\n testID,\n themeMode,\n themeProductContext,\n style,\n onMouseEnter,\n onMouseLeave,\n onFocus,\n onBlur,\n onKeyDown,\n ...props\n },\n ref\n ) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n const sizing = theme.sizing.table;\n const rowGroup = useContext(TableRowGroupContext);\n const hoverCapable = useHoverCapable();\n\n const isHeaderRow = rowGroup === \"header\";\n\n // Header rows are not hoverable by default and don't render a divider\n // (Header already paints its own top/bottom dividers).\n const hoverable = hoverableProp ?? !isHeaderRow;\n const hideDivider = hideDividerProp ?? isHeaderRow;\n\n // Track hover + focus-within so descendant <Table.Cell revealOnHover>\n // cells can decide whether to show themselves. Single re-render per\n // hover/focus change, scoped to this row only.\n const [hovered, setHovered] = useState(false);\n const [focusedWithin, setFocusedWithin] = useState(false);\n\n // On touch-only devices the reveal logic short-circuits to \"always\n // visible\" — matches the Figma spec.\n const revealed = hoverCapable ? hovered || focusedWithin : true;\n\n const handleMouseEnter = useCallback(\n (e: React.MouseEvent<HTMLElement>) => {\n setHovered(true);\n onMouseEnter?.(e);\n },\n [onMouseEnter]\n );\n const handleMouseLeave = useCallback(\n (e: React.MouseEvent<HTMLElement>) => {\n setHovered(false);\n onMouseLeave?.(e);\n },\n [onMouseLeave]\n );\n const handleFocus = useCallback(\n (e: React.FocusEvent<HTMLElement>) => {\n setFocusedWithin(true);\n onFocus?.(e);\n },\n [onFocus]\n );\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLElement>) => {\n // When focus moves between two children of this row the blur fires\n // here but the row is still focus-within — keep the state truthy.\n if (\n e.relatedTarget instanceof Node &&\n e.currentTarget.contains(e.relatedTarget)\n ) {\n onBlur?.(e);\n return;\n }\n setFocusedWithin(false);\n onBlur?.(e);\n },\n [onBlur]\n );\n\n // Rows opt into keyboard activation only when they are interactive\n // (i.e. consumer passed `onPress`). Enter/Space mirror native button\n // behavior; Space is preventDefault'd so the page doesn't scroll.\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<Element>) => {\n onKeyDown?.(e);\n if (!onPress || e.defaultPrevented) return;\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onPress();\n }\n },\n [onKeyDown, onPress]\n );\n\n const baseBg = selected\n ? theme.colors.background.secondary\n : theme.colors.background.primary;\n\n const rowHeight = isHeaderRow ? sizing.headerRowHeight : sizing.rowHeight;\n const rowPaddingHorizontal = isHeaderRow\n ? sizing.headerRowPaddingHorizontal\n : sizing.rowPaddingHorizontal;\n\n const ctxValue = useMemo(() => ({ revealed }), [revealed]);\n\n return (\n <RowRevealContext.Provider value={ctxValue}>\n <Box\n ref={ref}\n flexDirection=\"row\"\n alignItems=\"center\"\n height={rowHeight}\n paddingHorizontal={rowPaddingHorizontal}\n width=\"100%\"\n gap={sizing.cellGap}\n backgroundColor={baseBg}\n cursor={onPress ? \"pointer\" : undefined}\n hoverStyle={\n hoverable\n ? { backgroundColor: theme.colors.background.secondary }\n : undefined\n }\n onPress={onPress}\n role=\"row\"\n tabIndex={onPress ? 0 : undefined}\n aria-selected={selected || undefined}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n onFocus={handleFocus}\n onBlur={handleBlur}\n {...props}\n onKeyDown={handleKeyDown}\n style={style}\n >\n {children}\n </Box>\n {!hideDivider && <Divider color={theme.colors.border.secondary} />}\n </RowRevealContext.Provider>\n );\n }\n);\n\nTableRow.displayName = \"Table.Row\";\n\nconst positionToFlex = (position: TableCellProps[\"position\"]) => {\n switch (position) {\n case \"left\":\n return { flexShrink: 0 };\n case \"right\":\n return { flexShrink: 0, marginLeft: \"auto\" };\n default:\n return {};\n }\n};\n\nconst alignToJustify = (align: TableCellProps[\"align\"]) => {\n switch (align) {\n case \"right\":\n return \"flex-end\" as const;\n case \"center\":\n return \"center\" as const;\n default:\n return \"flex-start\" as const;\n }\n};\n\nconst TableCell = forwardRef<any, TableCellProps>(\n (\n {\n children,\n align = \"left\",\n position = \"default\",\n width,\n grow,\n revealOnHover,\n testID,\n themeMode,\n themeProductContext,\n style,\n ...props\n },\n ref\n ) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n const sizing = theme.sizing.table;\n const { revealed } = useContext(RowRevealContext);\n\n const positionStyle = useMemo(() => positionToFlex(position), [position]);\n\n // Per Figma spec: hide via opacity + pointer-events (NOT visibility) so\n // keyboard Tab still focuses the descendants. Focusing a descendant flips\n // `revealed` to true via RowRevealContext, restoring pointer-events.\n const revealStyle: React.CSSProperties =\n revealOnHover && !revealed\n ? { opacity: 0, pointerEvents: \"none\" }\n : revealOnHover\n ? { opacity: 1, transition: \"opacity 0.15s ease\" }\n : {};\n\n return (\n <Box\n ref={ref}\n flexDirection=\"row\"\n alignItems=\"center\"\n justifyContent={alignToJustify(align)}\n gap={8}\n height=\"100%\"\n width={width}\n role=\"cell\"\n {...props}\n style={{\n flex: width != null ? \"0 0 auto\" : (grow ?? 1),\n minWidth: 0,\n ...positionStyle,\n ...revealStyle,\n ...style,\n }}\n >\n {typeof children === \"string\" || typeof children === \"number\" ? (\n <Text\n fontSize={sizing.cellFontSize}\n lineHeight={sizing.cellLineHeight}\n color={theme.colors.content.primary}\n // truncation\n style={{\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n maxWidth: \"100%\",\n }}\n >\n {children}\n </Text>\n ) : (\n children\n )}\n </Box>\n );\n }\n);\n\nTableCell.displayName = \"Table.Cell\";\n\n/**\n * Sort indicator. Uses the `Sort` line icon from `@xsolla/xui-icons-base`\n * (matches the Figma spec — a stacked up/down chevron). The icon is the\n * same in all three states; opacity differentiates \"sortable but not\n * active\" (`none`, 40%) from \"active sort\" (`ascending` / `descending`,\n * 100%). Direction is communicated to assistive tech via `aria-sort` on\n * the parent <Table.Head>.\n */\nconst SortIcon: React.FC<{\n direction: \"ascending\" | \"descending\" | \"none\";\n color: string;\n size: number;\n}> = ({ direction, color, size }) => (\n <Box\n style={{\n flexShrink: 0,\n opacity: direction === \"none\" ? 0.4 : 1,\n transition: \"opacity 0.15s ease\",\n }}\n >\n <Sort variant=\"line\" size={size} color={color} aria-hidden />\n </Box>\n);\n\nconst TableHead = forwardRef<any, TableHeadProps>(\n (\n {\n children,\n align = \"left\",\n position = \"default\",\n width,\n grow,\n sort,\n onSortToggle,\n testID,\n themeMode,\n themeProductContext,\n style,\n ...props\n },\n ref\n ) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n const sizing = theme.sizing.table;\n\n const positionStyle = useMemo(() => positionToFlex(position), [position]);\n const sortable = sort != null;\n\n const ariaSort: \"ascending\" | \"descending\" | \"none\" | undefined = sortable\n ? sort\n : undefined;\n\n return (\n <Box\n ref={ref}\n flexDirection=\"row\"\n alignItems=\"center\"\n justifyContent={alignToJustify(align)}\n gap={sizing.headerCellGap}\n height=\"100%\"\n width={width}\n role=\"columnheader\"\n aria-sort={ariaSort}\n cursor={sortable ? \"pointer\" : undefined}\n onPress={sortable ? onSortToggle : undefined}\n {...props}\n style={{\n flex: width != null ? \"0 0 auto\" : (grow ?? 1),\n minWidth: 0,\n ...positionStyle,\n ...style,\n }}\n >\n {sortable && (\n <SortIcon\n direction={sort}\n color={theme.colors.content.secondary}\n size={sizing.headerCellFontSize + 2}\n />\n )}\n {typeof children === \"string\" || typeof children === \"number\" ? (\n <Text\n fontSize={sizing.headerCellFontSize}\n lineHeight={sizing.headerCellLineHeight}\n color={theme.colors.content.secondary}\n fontWeight=\"500\"\n style={{\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {children}\n </Text>\n ) : (\n children\n )}\n </Box>\n );\n }\n);\n\nTableHead.displayName = \"Table.Head\";\n\nconst TableFooter = forwardRef<any, TableFooterProps>(\n ({ children, style, ...props }, ref) => {\n const { theme } = useResolvedTheme();\n const sizing = theme.sizing.table;\n\n return (\n <Box\n ref={ref}\n flexDirection=\"row\"\n alignItems=\"center\"\n justifyContent=\"center\"\n gap={sizing.paginationGap}\n paddingHorizontal={sizing.paginationPaddingHorizontal}\n width=\"100%\"\n {...props}\n style={style}\n >\n {children}\n </Box>\n );\n }\n);\n\nTableFooter.displayName = \"Table.Footer\";\n\nexport const Table = Object.assign(TableRoot, {\n Caption: TableCaption,\n Header: TableHeader,\n Body: TableBody,\n Footer: TableFooter,\n Row: TableRow,\n Head: TableHead,\n Cell: TableCell,\n});\n","import React from \"react\";\nimport styled from \"styled-components\";\nimport type { BoxProps } from \"@xsolla/xui-primitives-core\";\nimport { createFilteredElement } from \"./filterDOMProps\";\n\nconst FilteredDiv = createFilteredElement(\"div\");\n\nconst StyledBox = styled(FilteredDiv)<BoxProps>`\n display: flex;\n box-sizing: border-box;\n background-color: ${(props) => props.backgroundColor || \"transparent\"};\n border-color: ${(props) => props.borderColor || \"transparent\"};\n border-width: ${(props) =>\n typeof props.borderWidth === \"number\"\n ? `${props.borderWidth}px`\n : props.borderWidth || 0};\n\n ${(props) =>\n props.borderBottomWidth !== undefined &&\n `\n border-bottom-width: ${typeof props.borderBottomWidth === \"number\" ? `${props.borderBottomWidth}px` : props.borderBottomWidth};\n border-bottom-color: ${props.borderBottomColor || props.borderColor || \"transparent\"};\n border-bottom-style: solid;\n `}\n ${(props) =>\n props.borderTopWidth !== undefined &&\n `\n border-top-width: ${typeof props.borderTopWidth === \"number\" ? `${props.borderTopWidth}px` : props.borderTopWidth};\n border-top-color: ${props.borderTopColor || props.borderColor || \"transparent\"};\n border-top-style: solid;\n `}\n ${(props) =>\n props.borderLeftWidth !== undefined &&\n `\n border-left-width: ${typeof props.borderLeftWidth === \"number\" ? `${props.borderLeftWidth}px` : props.borderLeftWidth};\n border-left-color: ${props.borderLeftColor || props.borderColor || \"transparent\"};\n border-left-style: solid;\n `}\n ${(props) =>\n props.borderRightWidth !== undefined &&\n `\n border-right-width: ${typeof props.borderRightWidth === \"number\" ? `${props.borderRightWidth}px` : props.borderRightWidth};\n border-right-color: ${props.borderRightColor || props.borderColor || \"transparent\"};\n border-right-style: solid;\n `}\n\n border-style: ${(props) =>\n props.borderStyle ||\n (props.borderWidth ||\n props.borderBottomWidth ||\n props.borderTopWidth ||\n props.borderLeftWidth ||\n props.borderRightWidth\n ? \"solid\"\n : \"none\")};\n border-radius: ${(props) =>\n typeof props.borderRadius === \"number\"\n ? `${props.borderRadius}px`\n : props.borderRadius || 0};\n height: ${(props) =>\n typeof props.height === \"number\"\n ? `${props.height}px`\n : props.height || \"auto\"};\n width: ${(props) =>\n typeof props.width === \"number\"\n ? `${props.width}px`\n : props.width || \"auto\"};\n min-width: ${(props) =>\n typeof props.minWidth === \"number\"\n ? `${props.minWidth}px`\n : props.minWidth || \"auto\"};\n min-height: ${(props) =>\n typeof props.minHeight === \"number\"\n ? `${props.minHeight}px`\n : props.minHeight || \"auto\"};\n max-width: ${(props) =>\n typeof props.maxWidth === \"number\"\n ? `${props.maxWidth}px`\n : props.maxWidth || \"none\"};\n max-height: ${(props) =>\n typeof props.maxHeight === \"number\"\n ? `${props.maxHeight}px`\n : props.maxHeight || \"none\"};\n\n padding: ${(props) =>\n typeof props.padding === \"number\"\n ? `${props.padding}px`\n : props.padding || 0};\n ${(props) =>\n props.paddingHorizontal &&\n `\n padding-left: ${typeof props.paddingHorizontal === \"number\" ? `${props.paddingHorizontal}px` : props.paddingHorizontal};\n padding-right: ${typeof props.paddingHorizontal === \"number\" ? `${props.paddingHorizontal}px` : props.paddingHorizontal};\n `}\n ${(props) =>\n props.paddingVertical &&\n `\n padding-top: ${typeof props.paddingVertical === \"number\" ? `${props.paddingVertical}px` : props.paddingVertical};\n padding-bottom: ${typeof props.paddingVertical === \"number\" ? `${props.paddingVertical}px` : props.paddingVertical};\n `}\n ${(props) =>\n props.paddingTop !== undefined &&\n `padding-top: ${typeof props.paddingTop === \"number\" ? `${props.paddingTop}px` : props.paddingTop};`}\n ${(props) =>\n props.paddingBottom !== undefined &&\n `padding-bottom: ${typeof props.paddingBottom === \"number\" ? `${props.paddingBottom}px` : props.paddingBottom};`}\n ${(props) =>\n props.paddingLeft !== undefined &&\n `padding-left: ${typeof props.paddingLeft === \"number\" ? `${props.paddingLeft}px` : props.paddingLeft};`}\n ${(props) =>\n props.paddingRight !== undefined &&\n `padding-right: ${typeof props.paddingRight === \"number\" ? `${props.paddingRight}px` : props.paddingRight};`}\n\n margin: ${(props) =>\n typeof props.margin === \"number\" ? `${props.margin}px` : props.margin || 0};\n ${(props) =>\n props.marginTop !== undefined &&\n `margin-top: ${typeof props.marginTop === \"number\" ? `${props.marginTop}px` : props.marginTop};`}\n ${(props) =>\n props.marginBottom !== undefined &&\n `margin-bottom: ${typeof props.marginBottom === \"number\" ? `${props.marginBottom}px` : props.marginBottom};`}\n ${(props) =>\n props.marginLeft !== undefined &&\n `margin-left: ${typeof props.marginLeft === \"number\" ? `${props.marginLeft}px` : props.marginLeft};`}\n ${(props) =>\n props.marginRight !== undefined &&\n `margin-right: ${typeof props.marginRight === \"number\" ? `${props.marginRight}px` : props.marginRight};`}\n\n flex-direction: ${(props) => props.flexDirection || \"column\"};\n flex-wrap: ${(props) => props.flexWrap || \"nowrap\"};\n align-items: ${(props) => props.alignItems || \"stretch\"};\n justify-content: ${(props) => props.justifyContent || \"flex-start\"};\n cursor: ${(props) =>\n props.cursor\n ? props.cursor\n : props.onClick || props.onPress\n ? \"pointer\"\n : \"inherit\"};\n position: ${(props) => props.position || \"static\"};\n top: ${(props) =>\n typeof props.top === \"number\" ? `${props.top}px` : props.top};\n bottom: ${(props) =>\n typeof props.bottom === \"number\" ? `${props.bottom}px` : props.bottom};\n left: ${(props) =>\n typeof props.left === \"number\" ? `${props.left}px` : props.left};\n right: ${(props) =>\n typeof props.right === \"number\" ? `${props.right}px` : props.right};\n flex: ${(props) => props.flex};\n flex-shrink: ${(props) => props.flexShrink ?? 1};\n gap: ${(props) =>\n typeof props.gap === \"number\" ? `${props.gap}px` : props.gap || 0};\n align-self: ${(props) => props.alignSelf || \"auto\"};\n overflow: ${(props) => props.overflow || \"visible\"};\n overflow-x: ${(props) => props.overflowX || \"visible\"};\n overflow-y: ${(props) => props.overflowY || \"visible\"};\n z-index: ${(props) => props.zIndex};\n opacity: ${(props) => (props.disabled ? 0.5 : 1)};\n pointer-events: ${(props) => (props.disabled ? \"none\" : \"auto\")};\n\n &:hover {\n ${(props) =>\n props.hoverStyle?.backgroundColor &&\n `background-color: ${props.hoverStyle.backgroundColor};`}\n ${(props) =>\n props.hoverStyle?.borderColor &&\n `border-color: ${props.hoverStyle.borderColor};`}\n }\n\n &:active {\n ${(props) =>\n props.pressStyle?.backgroundColor &&\n `background-color: ${props.pressStyle.backgroundColor};`}\n }\n`;\n\nexport const Box = React.forwardRef<\n HTMLDivElement | HTMLButtonElement,\n BoxProps\n>(\n (\n {\n children,\n onPress,\n onKeyDown,\n onKeyUp,\n role,\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 \"aria-describedby\": ariaDescribedBy,\n \"aria-expanded\": ariaExpanded,\n \"aria-haspopup\": ariaHasPopup,\n \"aria-pressed\": ariaPressed,\n \"aria-controls\": ariaControls,\n tabIndex,\n as,\n src,\n alt,\n onError,\n onLoad,\n type,\n disabled,\n id,\n testID,\n \"data-testid\": dataTestId,\n ...props\n },\n ref\n ) => {\n // Handle as=\"img\" for rendering images with proper border-radius\n if (as === \"img\" && src) {\n return (\n <img\n src={src}\n alt={alt || \"\"}\n onError={onError}\n onLoad={onLoad}\n style={{\n display: \"block\",\n objectFit: \"cover\",\n width:\n typeof props.width === \"number\"\n ? `${props.width}px`\n : props.width,\n height:\n typeof props.height === \"number\"\n ? `${props.height}px`\n : props.height,\n borderRadius:\n typeof props.borderRadius === \"number\"\n ? `${props.borderRadius}px`\n : props.borderRadius,\n position: props.position,\n top: typeof props.top === \"number\" ? `${props.top}px` : props.top,\n left:\n typeof props.left === \"number\" ? `${props.left}px` : props.left,\n right:\n typeof props.right === \"number\"\n ? `${props.right}px`\n : props.right,\n bottom:\n typeof props.bottom === \"number\"\n ? `${props.bottom}px`\n : props.bottom,\n ...props.style,\n }}\n />\n );\n }\n\n return (\n <StyledBox\n ref={ref}\n elementType={as}\n id={id}\n type={as === \"button\" ? type || \"button\" : undefined}\n disabled={as === \"button\" ? disabled : undefined}\n onClick={onPress}\n onKeyDown={onKeyDown}\n onKeyUp={onKeyUp}\n role={role}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n aria-current={ariaCurrent}\n aria-disabled={ariaDisabled}\n aria-busy={ariaBusy}\n aria-describedby={ariaDescribedBy}\n aria-expanded={ariaExpanded}\n aria-haspopup={ariaHasPopup}\n aria-pressed={ariaPressed}\n aria-controls={ariaControls}\n aria-live={ariaLive}\n tabIndex={tabIndex !== undefined ? tabIndex : undefined}\n data-testid={dataTestId || testID}\n {...props}\n >\n {children}\n </StyledBox>\n );\n }\n);\n\nBox.displayName = \"Box\";\n","import React from \"react\";\nimport isPropValid from \"@emotion/is-prop-valid\";\n\n// Props that @emotion/is-prop-valid incorrectly treats as valid HTML.\n// These are React Native or component-specific props that match\n// valid HTML patterns (on* event handlers, SVG attributes).\nexport const ADDITIONAL_BLOCKED_PROPS = new Set([\n // RN-only event handlers (pass isPropValid's on* pattern)\n \"onPress\",\n \"onChangeText\",\n \"onLayout\",\n \"onMoveShouldSetResponder\",\n \"onResponderGrant\",\n \"onResponderMove\",\n \"onResponderRelease\",\n \"onResponderTerminate\",\n // SVG attributes that pass isPropValid\n \"strokeWidth\",\n // CSS properties that pass isPropValid but are used as component props\n \"overflow\",\n \"cursor\",\n \"fontSize\",\n \"fontWeight\",\n \"fontFamily\",\n \"textDecoration\",\n]);\n\nfunction shouldForwardProp(key: string): boolean {\n if (ADDITIONAL_BLOCKED_PROPS.has(key)) return false;\n return isPropValid(key);\n}\n\n/**\n * Creates a React component that renders the given HTML tag\n * but filters out non-HTML props before they reach the DOM.\n *\n * Uses @emotion/is-prop-valid (same library styled-components v4\n * uses internally) to automatically block invalid HTML attributes,\n * plus a small blocklist for false positives (RN on* handlers, SVG attrs).\n *\n * Usage: `const FilteredDiv = createFilteredElement(\"div\");`\n * Then: `const StyledBox = styled(FilteredDiv)<BoxProps>\\`...\\`;`\n *\n * styled-components can still read ALL props for CSS interpolation,\n * but only valid HTML attributes are forwarded to the DOM element.\n */\nexport function createFilteredElement(defaultTag: string) {\n const Component = React.forwardRef<HTMLElement, Record<string, unknown>>(\n ({ children, elementType, ...props }, ref) => {\n const Tag = (elementType as string) || defaultTag;\n const htmlProps: Record<string, unknown> = {};\n for (const key of Object.keys(props)) {\n if (shouldForwardProp(key)) {\n htmlProps[key] = props[key];\n }\n }\n return React.createElement(\n Tag,\n { ref, ...htmlProps },\n children as React.ReactNode\n );\n }\n );\n Component.displayName = `Filtered(${defaultTag})`;\n return Component;\n}\n","function memoize(fn) {\n var cache = {};\n return function (arg) {\n if (cache[arg] === undefined) cache[arg] = fn(arg);\n return cache[arg];\n };\n}\n\nexport default memoize;\n","import memoize from '@emotion/memoize';\n\nvar reactPropsRegex = /^((children|dangerouslySetInnerHTML|key|ref|autoFocus|defaultValue|defaultChecked|innerHTML|suppressContentEditableWarning|suppressHydrationWarning|valueLink|accept|acceptCharset|accessKey|action|allow|allowUserMedia|allowPaymentRequest|allowFullScreen|allowTransparency|alt|async|autoComplete|autoPlay|capture|cellPadding|cellSpacing|challenge|charSet|checked|cite|classID|className|cols|colSpan|content|contentEditable|contextMenu|controls|controlsList|coords|crossOrigin|data|dateTime|decoding|default|defer|dir|disabled|disablePictureInPicture|download|draggable|encType|form|formAction|formEncType|formMethod|formNoValidate|formTarget|frameBorder|headers|height|hidden|high|href|hrefLang|htmlFor|httpEquiv|id|inputMode|integrity|is|keyParams|keyType|kind|label|lang|list|loading|loop|low|marginHeight|marginWidth|max|maxLength|media|mediaGroup|method|min|minLength|multiple|muted|name|nonce|noValidate|open|optimum|pattern|placeholder|playsInline|poster|preload|profile|radioGroup|readOnly|referrerPolicy|rel|required|reversed|role|rows|rowSpan|sandbox|scope|scoped|scrolling|seamless|selected|shape|size|sizes|slot|span|spellCheck|src|srcDoc|srcLang|srcSet|start|step|style|summary|tabIndex|target|title|type|useMap|value|width|wmode|wrap|about|datatype|inlist|prefix|property|resource|typeof|vocab|autoCapitalize|autoCorrect|autoSave|color|inert|itemProp|itemScope|itemType|itemID|itemRef|on|results|security|unselectable|accentHeight|accumulate|additive|alignmentBaseline|allowReorder|alphabetic|amplitude|arabicForm|ascent|attributeName|attributeType|autoReverse|azimuth|baseFrequency|baselineShift|baseProfile|bbox|begin|bias|by|calcMode|capHeight|clip|clipPathUnits|clipPath|clipRule|colorInterpolation|colorInterpolationFilters|colorProfile|colorRendering|contentScriptType|contentStyleType|cursor|cx|cy|d|decelerate|descent|diffuseConstant|direction|display|divisor|dominantBaseline|dur|dx|dy|edgeMode|elevation|enableBackground|end|exponent|externalResourcesRequired|fill|fillOpacity|fillRule|filter|filterRes|filterUnits|floodColor|floodOpacity|focusable|fontFamily|fontSize|fontSizeAdjust|fontStretch|fontStyle|fontVariant|fontWeight|format|from|fr|fx|fy|g1|g2|glyphName|glyphOrientationHorizontal|glyphOrientationVertical|glyphRef|gradientTransform|gradientUnits|hanging|horizAdvX|horizOriginX|ideographic|imageRendering|in|in2|intercept|k|k1|k2|k3|k4|kernelMatrix|kernelUnitLength|kerning|keyPoints|keySplines|keyTimes|lengthAdjust|letterSpacing|lightingColor|limitingConeAngle|local|markerEnd|markerMid|markerStart|markerHeight|markerUnits|markerWidth|mask|maskContentUnits|maskUnits|mathematical|mode|numOctaves|offset|opacity|operator|order|orient|orientation|origin|overflow|overlinePosition|overlineThickness|panose1|paintOrder|pathLength|patternContentUnits|patternTransform|patternUnits|pointerEvents|points|pointsAtX|pointsAtY|pointsAtZ|preserveAlpha|preserveAspectRatio|primitiveUnits|r|radius|refX|refY|renderingIntent|repeatCount|repeatDur|requiredExtensions|requiredFeatures|restart|result|rotate|rx|ry|scale|seed|shapeRendering|slope|spacing|specularConstant|specularExponent|speed|spreadMethod|startOffset|stdDeviation|stemh|stemv|stitchTiles|stopColor|stopOpacity|strikethroughPosition|strikethroughThickness|string|stroke|strokeDasharray|strokeDashoffset|strokeLinecap|strokeLinejoin|strokeMiterlimit|strokeOpacity|strokeWidth|surfaceScale|systemLanguage|tableValues|targetX|targetY|textAnchor|textDecoration|textRendering|textLength|to|transform|u1|u2|underlinePosition|underlineThickness|unicode|unicodeBidi|unicodeRange|unitsPerEm|vAlphabetic|vHanging|vIdeographic|vMathematical|values|vectorEffect|version|vertAdvY|vertOriginX|vertOriginY|viewBox|viewTarget|visibility|widths|wordSpacing|writingMode|x|xHeight|x1|x2|xChannelSelector|xlinkActuate|xlinkArcrole|xlinkHref|xlinkRole|xlinkShow|xlinkTitle|xlinkType|xmlBase|xmlns|xmlnsXlink|xmlLang|xmlSpace|y|y1|y2|yChannelSelector|z|zoomAndPan|for|class|autofocus)|(([Dd][Aa][Tt][Aa]|[Aa][Rr][Ii][Aa]|x)-.*))$/; // https://esbench.com/bench/5bfee68a4cd7e6009ef61d23\n\nvar index = memoize(function (prop) {\n return reactPropsRegex.test(prop) || prop.charCodeAt(0) === 111\n /* o */\n && prop.charCodeAt(1) === 110\n /* n */\n && prop.charCodeAt(2) < 91;\n}\n/* Z+1 */\n);\n\nexport default index;\n","import React from \"react\";\nimport styled from \"styled-components\";\nimport { TextProps } from \"@xsolla/xui-primitives-core\";\nimport { createFilteredElement } from \"./filterDOMProps\";\n\nconst FilteredSpan = createFilteredElement(\"span\");\n\nconst StyledText = styled(FilteredSpan)<TextProps>`\n color: ${(props) => props.color || \"inherit\"};\n font-size: ${(props) =>\n typeof props.fontSize === \"number\"\n ? `${props.fontSize}px`\n : props.fontSize || \"inherit\"};\n font-weight: ${(props) => props.fontWeight || \"normal\"};\n font-family: ${(props) =>\n props.fontFamily ||\n '\"Aktiv Grotesk\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif'};\n line-height: ${(props) =>\n typeof props.lineHeight === \"number\"\n ? `${props.lineHeight}px`\n : props.lineHeight || \"inherit\"};\n white-space: ${(props) => props.whiteSpace || \"normal\"};\n text-align: ${(props) => props.textAlign || \"inherit\"};\n text-decoration: ${(props) => props.textDecoration || \"none\"};\n`;\n\nexport const Text: React.FC<TextProps> = ({\n style,\n className,\n id,\n role,\n testID,\n \"data-testid\": dataTestId,\n numberOfLines: _numberOfLines,\n ...props\n}) => {\n return (\n <StyledText\n {...props}\n style={style}\n className={className}\n id={id}\n role={role}\n data-testid={dataTestId || testID}\n />\n );\n};\n"],"mappings":"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","names":["import_react","import_react","React","styled","React","import_styled_components","import_jsx_runtime","styled","import_jsx_runtime","React"]}
|
package/web/index.mjs
CHANGED
|
@@ -221,7 +221,8 @@ var Box = React2.forwardRef(
|
|
|
221
221
|
top: typeof props.top === "number" ? `${props.top}px` : props.top,
|
|
222
222
|
left: typeof props.left === "number" ? `${props.left}px` : props.left,
|
|
223
223
|
right: typeof props.right === "number" ? `${props.right}px` : props.right,
|
|
224
|
-
bottom: typeof props.bottom === "number" ? `${props.bottom}px` : props.bottom
|
|
224
|
+
bottom: typeof props.bottom === "number" ? `${props.bottom}px` : props.bottom,
|
|
225
|
+
...props.style
|
|
225
226
|
}
|
|
226
227
|
}
|
|
227
228
|
);
|
|
@@ -278,6 +279,8 @@ var Text = ({
|
|
|
278
279
|
className,
|
|
279
280
|
id,
|
|
280
281
|
role,
|
|
282
|
+
testID,
|
|
283
|
+
"data-testid": dataTestId,
|
|
281
284
|
numberOfLines: _numberOfLines,
|
|
282
285
|
...props
|
|
283
286
|
}) => {
|
|
@@ -288,7 +291,8 @@ var Text = ({
|
|
|
288
291
|
style,
|
|
289
292
|
className,
|
|
290
293
|
id,
|
|
291
|
-
role
|
|
294
|
+
role,
|
|
295
|
+
"data-testid": dataTestId || testID
|
|
292
296
|
}
|
|
293
297
|
);
|
|
294
298
|
};
|
|
@@ -324,13 +328,14 @@ var Divider = ({ color }) => /* @__PURE__ */ jsx3(
|
|
|
324
328
|
}
|
|
325
329
|
);
|
|
326
330
|
var TableRoot = forwardRef(
|
|
327
|
-
({ children, themeMode, themeProductContext }, ref) => {
|
|
331
|
+
({ children, testID, themeMode, themeProductContext }, ref) => {
|
|
328
332
|
const { theme } = useResolvedTheme({ themeMode, themeProductContext });
|
|
329
333
|
const sizing = theme.sizing.table;
|
|
330
334
|
return /* @__PURE__ */ jsx3(
|
|
331
335
|
Box,
|
|
332
336
|
{
|
|
333
337
|
ref,
|
|
338
|
+
testID,
|
|
334
339
|
flexDirection: "column",
|
|
335
340
|
alignItems: "stretch",
|
|
336
341
|
gap: sizing.containerGap,
|
|
@@ -475,6 +480,7 @@ var TableRow = forwardRef(
|
|
|
475
480
|
selected,
|
|
476
481
|
hideDivider: hideDividerProp,
|
|
477
482
|
onPress,
|
|
483
|
+
testID,
|
|
478
484
|
themeMode,
|
|
479
485
|
themeProductContext,
|
|
480
486
|
style,
|
|
@@ -603,6 +609,7 @@ var TableCell = forwardRef(
|
|
|
603
609
|
width,
|
|
604
610
|
grow,
|
|
605
611
|
revealOnHover,
|
|
612
|
+
testID,
|
|
606
613
|
themeMode,
|
|
607
614
|
themeProductContext,
|
|
608
615
|
style,
|
|
@@ -672,6 +679,7 @@ var TableHead = forwardRef(
|
|
|
672
679
|
grow,
|
|
673
680
|
sort,
|
|
674
681
|
onSortToggle,
|
|
682
|
+
testID,
|
|
675
683
|
themeMode,
|
|
676
684
|
themeProductContext,
|
|
677
685
|
style,
|