@xsolla/xui-cell 0.225.0 → 0.226.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/README.md +56 -11
- package/native/index.d.mts +52 -2
- package/native/index.d.ts +52 -2
- package/native/index.js +81 -56
- package/native/index.js.map +1 -1
- package/native/index.mjs +87 -57
- package/native/index.mjs.map +1 -1
- package/package.json +5 -5
- package/web/index.d.mts +52 -2
- package/web/index.d.ts +52 -2
- package/web/index.js +81 -56
- package/web/index.js.map +1 -1
- package/web/index.mjs +87 -57
- package/web/index.mjs.map +1 -1
package/README.md
CHANGED
|
@@ -48,7 +48,21 @@ Inherits `ThemeOverrideProps` (`themeMode`, `themeProductContext`).
|
|
|
48
48
|
|
|
49
49
|
#### Spacing
|
|
50
50
|
|
|
51
|
-
The bounded views (`stroke`, `surface`) pad their content by **8px
|
|
51
|
+
The bounded views (`stroke`, `surface`) pad their content by **8px** (`spacing/100`); `default` is unpadded and instead reserves a 56px minimum height (`control-size/650`). All views lay their slots out in a row with a 12px gap (`spacing/150`).
|
|
52
|
+
|
|
53
|
+
Every default is applied before the consumer's props, so the regular `Box` props override it:
|
|
54
|
+
|
|
55
|
+
| Default | Override with |
|
|
56
|
+
| -------------------------- | --------------------------------------------------------- |
|
|
57
|
+
| 12px gap between slots | `gap` |
|
|
58
|
+
| 56px min height (`default`) | `minHeight` (e.g. `minHeight={0}`) |
|
|
59
|
+
| 8px padding (`stroke`, `surface`) | `padding`, `paddingVertical`, `paddingHorizontal`, `paddingTop`, … |
|
|
60
|
+
|
|
61
|
+
```tsx
|
|
62
|
+
<Cell paddingVertical={18} minHeight={0}>
|
|
63
|
+
<Cell.Text layout="fill-start" title="Reserved keys" titleRight="3" />
|
|
64
|
+
</Cell>
|
|
65
|
+
```
|
|
52
66
|
|
|
53
67
|
#### Hover / active state
|
|
54
68
|
|
|
@@ -128,19 +142,50 @@ Flexible content area that fills the remaining space.
|
|
|
128
142
|
|
|
129
143
|
### `<Cell.Text>`
|
|
130
144
|
|
|
131
|
-
Pre-styled multi-row text block. Each row has independent left and right slots with
|
|
132
|
-
|
|
133
|
-
| Prop
|
|
134
|
-
|
|
|
135
|
-
| `title`
|
|
136
|
-
| `titleRight`
|
|
137
|
-
| `description`
|
|
138
|
-
| `descriptionRight`
|
|
139
|
-
| `caption`
|
|
140
|
-
| `captionRight`
|
|
145
|
+
Pre-styled multi-row text block. Each row has independent left and right slots. String values are styled with body typography tokens resolved for the active product context; a `ReactNode` value is rendered as-is.
|
|
146
|
+
|
|
147
|
+
| Prop | Type | Default | Description |
|
|
148
|
+
| ------------------------- | ---------------------------- | ------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
|
|
149
|
+
| `title` | `ReactNode` | - | Primary text on the title row (left). |
|
|
150
|
+
| `titleRight` | `ReactNode` | - | Secondary text on the title row (right). |
|
|
151
|
+
| `description` | `ReactNode` | - | Description on the second row (left). |
|
|
152
|
+
| `descriptionRight` | `ReactNode` | - | Description on the second row (right). |
|
|
153
|
+
| `caption` | `ReactNode` | - | Caption on the third row (left). Tertiary content colour. |
|
|
154
|
+
| `captionRight` | `ReactNode` | - | Caption on the third row (right). Tertiary content colour. |
|
|
155
|
+
| `layout` | `"equal" \| "fill-start"` | `"equal"` | How each row splits its width. `equal` gives both parts 50%. `fill-start` gives the left part the remaining width and sizes the right part to its content. |
|
|
156
|
+
| `sideGap` | `number` | `12` | Horizontal gap (px) between the left and right parts of each row. The vertical gap between rows is `gap` (default `2`). |
|
|
157
|
+
| `titleVariant` | `CellTextVariant` | `"bodyMdAccent"` | Typography token for a string `title` (16 / 20 / 500 in B2B). |
|
|
158
|
+
| `titleRightVariant` | `CellTextVariant` | `"bodyXsParagraph"` | Typography token for a string `titleRight` (12 / 18 / 400 in B2B). |
|
|
159
|
+
| `descriptionVariant` | `CellTextVariant` | `"bodyXsParagraph"` | Typography token for a string `description`. |
|
|
160
|
+
| `descriptionRightVariant` | `CellTextVariant` | `"bodyXsParagraph"` | Typography token for a string `descriptionRight`. |
|
|
161
|
+
| `captionVariant` | `CellTextVariant` | `"bodyXsParagraph"` | Typography token for a string `caption`. |
|
|
162
|
+
| `captionRightVariant` | `CellTextVariant` | `"bodyXsParagraph"` | Typography token for a string `captionRight`. |
|
|
163
|
+
|
|
164
|
+
`CellTextVariant` is any body token: `bodyLg`, `bodyMd`, `bodySm`, `bodyXs`, `bodyXxs`, each also with an `Accent` (heavier weight) or `Paragraph` (taller line height) suffix — e.g. `bodyMd`, `bodyMdAccent`, `bodyXsParagraph`.
|
|
141
165
|
|
|
142
166
|
Inherits `ThemeOverrideProps` (`themeMode`, `themeProductContext`).
|
|
143
167
|
|
|
168
|
+
#### Label / value rows
|
|
169
|
+
|
|
170
|
+
```tsx
|
|
171
|
+
import * as React from "react";
|
|
172
|
+
import { Cell } from "@xsolla/xui-cell";
|
|
173
|
+
|
|
174
|
+
export default function KeyValueRow() {
|
|
175
|
+
return (
|
|
176
|
+
<Cell paddingVertical={18} minHeight={0}>
|
|
177
|
+
<Cell.Text
|
|
178
|
+
layout="fill-start"
|
|
179
|
+
title="Reserved keys (Not claimed yet)"
|
|
180
|
+
titleRight="3"
|
|
181
|
+
titleVariant="bodyMdAccent"
|
|
182
|
+
titleRightVariant="bodyMd"
|
|
183
|
+
/>
|
|
184
|
+
</Cell>
|
|
185
|
+
);
|
|
186
|
+
}
|
|
187
|
+
```
|
|
188
|
+
|
|
144
189
|
## Anatomy
|
|
145
190
|
|
|
146
191
|
```tsx
|
package/native/index.d.mts
CHANGED
|
@@ -6,7 +6,15 @@ import { ThemeOverrideProps } from '@xsolla/xui-core';
|
|
|
6
6
|
type CellView = "default" | "stroke" | "surface";
|
|
7
7
|
interface CellProps extends BoxProps, ThemeOverrideProps {
|
|
8
8
|
children?: ReactNode;
|
|
9
|
-
/**
|
|
9
|
+
/**
|
|
10
|
+
* Visual variant of the cell container.
|
|
11
|
+
*
|
|
12
|
+
* Spacing defaults come from the spacing / control-size scales and can be
|
|
13
|
+
* overridden with the regular Box props, which are applied after the view
|
|
14
|
+
* defaults: `gap` (default 12, `spacing/150`), `minHeight` (default 56 on
|
|
15
|
+
* `default`, `control-size/650`), `padding` / `paddingVertical` /
|
|
16
|
+
* `paddingHorizontal` (default 8 on `stroke` and `surface`, `spacing/100`).
|
|
17
|
+
*/
|
|
10
18
|
view?: CellView;
|
|
11
19
|
/**
|
|
12
20
|
* @deprecated Use `view="stroke"` instead.
|
|
@@ -34,6 +42,20 @@ interface CellContentProps extends BoxProps {
|
|
|
34
42
|
children?: ReactNode;
|
|
35
43
|
testID?: string;
|
|
36
44
|
}
|
|
45
|
+
/**
|
|
46
|
+
* How `Cell.Text` shares a row's width between its left and right parts.
|
|
47
|
+
*
|
|
48
|
+
* - `"equal"` — both parts get an equal share (50/50). Long left text wraps
|
|
49
|
+
* even when the right value is short. This is the historical behaviour.
|
|
50
|
+
* - `"fill-start"` — the left part takes the remaining width and the right
|
|
51
|
+
* part sizes to its content. Use it for label/value rows.
|
|
52
|
+
*/
|
|
53
|
+
type CellTextLayout = "equal" | "fill-start";
|
|
54
|
+
/**
|
|
55
|
+
* Body typography token used by a `Cell.Text` slot. Resolved for the active
|
|
56
|
+
* product context via `getTypographyVariant` from `@xsolla/xui-core`.
|
|
57
|
+
*/
|
|
58
|
+
type CellTextVariant = "bodyLg" | "bodyLgAccent" | "bodyLgParagraph" | "bodyMd" | "bodyMdAccent" | "bodyMdParagraph" | "bodySm" | "bodySmAccent" | "bodySmParagraph" | "bodyXs" | "bodyXsAccent" | "bodyXsParagraph" | "bodyXxs" | "bodyXxsAccent" | "bodyXxsParagraph";
|
|
37
59
|
interface CellTextProps extends BoxProps, ThemeOverrideProps {
|
|
38
60
|
/** Primary title on the left. */
|
|
39
61
|
title?: ReactNode;
|
|
@@ -47,6 +69,34 @@ interface CellTextProps extends BoxProps, ThemeOverrideProps {
|
|
|
47
69
|
caption?: ReactNode;
|
|
48
70
|
/** Caption text on the right (third row, tertiary color). */
|
|
49
71
|
captionRight?: ReactNode;
|
|
72
|
+
/**
|
|
73
|
+
* How each row splits its width between the left and right parts.
|
|
74
|
+
* @default "equal"
|
|
75
|
+
*/
|
|
76
|
+
layout?: CellTextLayout;
|
|
77
|
+
/**
|
|
78
|
+
* Horizontal gap in px between the left and right parts of each row.
|
|
79
|
+
* The vertical gap between rows is the regular `gap` prop (default 2,
|
|
80
|
+
* `spacing/25`).
|
|
81
|
+
* @default 12
|
|
82
|
+
*/
|
|
83
|
+
sideGap?: number;
|
|
84
|
+
/**
|
|
85
|
+
* Typography token for a string `title`. Applies only to string values;
|
|
86
|
+
* a ReactNode is rendered as-is.
|
|
87
|
+
* @default "bodyMdAccent"
|
|
88
|
+
*/
|
|
89
|
+
titleVariant?: CellTextVariant;
|
|
90
|
+
/** Typography token for a string `titleRight`. @default "bodyXsParagraph" */
|
|
91
|
+
titleRightVariant?: CellTextVariant;
|
|
92
|
+
/** Typography token for a string `description`. @default "bodyXsParagraph" */
|
|
93
|
+
descriptionVariant?: CellTextVariant;
|
|
94
|
+
/** Typography token for a string `descriptionRight`. @default "bodyXsParagraph" */
|
|
95
|
+
descriptionRightVariant?: CellTextVariant;
|
|
96
|
+
/** Typography token for a string `caption`. @default "bodyXsParagraph" */
|
|
97
|
+
captionVariant?: CellTextVariant;
|
|
98
|
+
/** Typography token for a string `captionRight`. @default "bodyXsParagraph" */
|
|
99
|
+
captionRightVariant?: CellTextVariant;
|
|
50
100
|
testID?: string;
|
|
51
101
|
}
|
|
52
102
|
|
|
@@ -56,4 +106,4 @@ declare const Cell: react.ForwardRefExoticComponent<CellProps & react.RefAttribu
|
|
|
56
106
|
Text: react.ForwardRefExoticComponent<CellTextProps & react.RefAttributes<any>>;
|
|
57
107
|
};
|
|
58
108
|
|
|
59
|
-
export { Cell, type CellContentProps, type CellProps, type CellSlotProps, type CellTextProps, type CellView };
|
|
109
|
+
export { Cell, type CellContentProps, type CellProps, type CellSlotProps, type CellTextLayout, type CellTextProps, type CellTextVariant, type CellView };
|
package/native/index.d.ts
CHANGED
|
@@ -6,7 +6,15 @@ import { ThemeOverrideProps } from '@xsolla/xui-core';
|
|
|
6
6
|
type CellView = "default" | "stroke" | "surface";
|
|
7
7
|
interface CellProps extends BoxProps, ThemeOverrideProps {
|
|
8
8
|
children?: ReactNode;
|
|
9
|
-
/**
|
|
9
|
+
/**
|
|
10
|
+
* Visual variant of the cell container.
|
|
11
|
+
*
|
|
12
|
+
* Spacing defaults come from the spacing / control-size scales and can be
|
|
13
|
+
* overridden with the regular Box props, which are applied after the view
|
|
14
|
+
* defaults: `gap` (default 12, `spacing/150`), `minHeight` (default 56 on
|
|
15
|
+
* `default`, `control-size/650`), `padding` / `paddingVertical` /
|
|
16
|
+
* `paddingHorizontal` (default 8 on `stroke` and `surface`, `spacing/100`).
|
|
17
|
+
*/
|
|
10
18
|
view?: CellView;
|
|
11
19
|
/**
|
|
12
20
|
* @deprecated Use `view="stroke"` instead.
|
|
@@ -34,6 +42,20 @@ interface CellContentProps extends BoxProps {
|
|
|
34
42
|
children?: ReactNode;
|
|
35
43
|
testID?: string;
|
|
36
44
|
}
|
|
45
|
+
/**
|
|
46
|
+
* How `Cell.Text` shares a row's width between its left and right parts.
|
|
47
|
+
*
|
|
48
|
+
* - `"equal"` — both parts get an equal share (50/50). Long left text wraps
|
|
49
|
+
* even when the right value is short. This is the historical behaviour.
|
|
50
|
+
* - `"fill-start"` — the left part takes the remaining width and the right
|
|
51
|
+
* part sizes to its content. Use it for label/value rows.
|
|
52
|
+
*/
|
|
53
|
+
type CellTextLayout = "equal" | "fill-start";
|
|
54
|
+
/**
|
|
55
|
+
* Body typography token used by a `Cell.Text` slot. Resolved for the active
|
|
56
|
+
* product context via `getTypographyVariant` from `@xsolla/xui-core`.
|
|
57
|
+
*/
|
|
58
|
+
type CellTextVariant = "bodyLg" | "bodyLgAccent" | "bodyLgParagraph" | "bodyMd" | "bodyMdAccent" | "bodyMdParagraph" | "bodySm" | "bodySmAccent" | "bodySmParagraph" | "bodyXs" | "bodyXsAccent" | "bodyXsParagraph" | "bodyXxs" | "bodyXxsAccent" | "bodyXxsParagraph";
|
|
37
59
|
interface CellTextProps extends BoxProps, ThemeOverrideProps {
|
|
38
60
|
/** Primary title on the left. */
|
|
39
61
|
title?: ReactNode;
|
|
@@ -47,6 +69,34 @@ interface CellTextProps extends BoxProps, ThemeOverrideProps {
|
|
|
47
69
|
caption?: ReactNode;
|
|
48
70
|
/** Caption text on the right (third row, tertiary color). */
|
|
49
71
|
captionRight?: ReactNode;
|
|
72
|
+
/**
|
|
73
|
+
* How each row splits its width between the left and right parts.
|
|
74
|
+
* @default "equal"
|
|
75
|
+
*/
|
|
76
|
+
layout?: CellTextLayout;
|
|
77
|
+
/**
|
|
78
|
+
* Horizontal gap in px between the left and right parts of each row.
|
|
79
|
+
* The vertical gap between rows is the regular `gap` prop (default 2,
|
|
80
|
+
* `spacing/25`).
|
|
81
|
+
* @default 12
|
|
82
|
+
*/
|
|
83
|
+
sideGap?: number;
|
|
84
|
+
/**
|
|
85
|
+
* Typography token for a string `title`. Applies only to string values;
|
|
86
|
+
* a ReactNode is rendered as-is.
|
|
87
|
+
* @default "bodyMdAccent"
|
|
88
|
+
*/
|
|
89
|
+
titleVariant?: CellTextVariant;
|
|
90
|
+
/** Typography token for a string `titleRight`. @default "bodyXsParagraph" */
|
|
91
|
+
titleRightVariant?: CellTextVariant;
|
|
92
|
+
/** Typography token for a string `description`. @default "bodyXsParagraph" */
|
|
93
|
+
descriptionVariant?: CellTextVariant;
|
|
94
|
+
/** Typography token for a string `descriptionRight`. @default "bodyXsParagraph" */
|
|
95
|
+
descriptionRightVariant?: CellTextVariant;
|
|
96
|
+
/** Typography token for a string `caption`. @default "bodyXsParagraph" */
|
|
97
|
+
captionVariant?: CellTextVariant;
|
|
98
|
+
/** Typography token for a string `captionRight`. @default "bodyXsParagraph" */
|
|
99
|
+
captionRightVariant?: CellTextVariant;
|
|
50
100
|
testID?: string;
|
|
51
101
|
}
|
|
52
102
|
|
|
@@ -56,4 +106,4 @@ declare const Cell: react.ForwardRefExoticComponent<CellProps & react.RefAttribu
|
|
|
56
106
|
Text: react.ForwardRefExoticComponent<CellTextProps & react.RefAttributes<any>>;
|
|
57
107
|
};
|
|
58
108
|
|
|
59
|
-
export { Cell, type CellContentProps, type CellProps, type CellSlotProps, type CellTextProps, type CellView };
|
|
109
|
+
export { Cell, type CellContentProps, type CellProps, type CellSlotProps, type CellTextLayout, type CellTextProps, type CellTextVariant, type CellView };
|
package/native/index.js
CHANGED
|
@@ -335,7 +335,10 @@ var Text = ({
|
|
|
335
335
|
// src/Cell.tsx
|
|
336
336
|
var import_xui_core = require("@xsolla/xui-core");
|
|
337
337
|
var import_jsx_runtime3 = require("react/jsx-runtime");
|
|
338
|
-
var CELL_PADDING =
|
|
338
|
+
var CELL_PADDING = import_xui_core.spacingScale["100"];
|
|
339
|
+
var CELL_GAP = import_xui_core.spacingScale["150"];
|
|
340
|
+
var CELL_MIN_HEIGHT = import_xui_core.controlSizeScale["650"];
|
|
341
|
+
var CELL_TEXT_ROW_GAP = import_xui_core.spacingScale["25"];
|
|
339
342
|
var CellRoot = (0, import_react.forwardRef)(
|
|
340
343
|
({
|
|
341
344
|
children,
|
|
@@ -378,7 +381,7 @@ var CellRoot = (0, import_react.forwardRef)(
|
|
|
378
381
|
};
|
|
379
382
|
default:
|
|
380
383
|
return {
|
|
381
|
-
minHeight:
|
|
384
|
+
minHeight: CELL_MIN_HEIGHT,
|
|
382
385
|
hoverStyle: overlayState,
|
|
383
386
|
pressStyle: overlayState
|
|
384
387
|
};
|
|
@@ -393,7 +396,7 @@ var CellRoot = (0, import_react.forwardRef)(
|
|
|
393
396
|
alignItems: "center",
|
|
394
397
|
width: "100%",
|
|
395
398
|
flexDirection: "row",
|
|
396
|
-
gap:
|
|
399
|
+
gap: CELL_GAP,
|
|
397
400
|
onPress: disabled ? void 0 : onPress,
|
|
398
401
|
cursor: disabled ? "not-allowed" : hasPress ? "pointer" : void 0,
|
|
399
402
|
"aria-disabled": ariaDisabled ?? (disabled || void 0),
|
|
@@ -441,36 +444,59 @@ var CellContent = (0, import_react.forwardRef)(
|
|
|
441
444
|
}
|
|
442
445
|
);
|
|
443
446
|
CellContent.displayName = "Cell.Content";
|
|
447
|
+
var resolveTextStyle = (productContext, variant) => {
|
|
448
|
+
const token = (0, import_xui_core.getTypographyVariant)(productContext, variant);
|
|
449
|
+
if (!token) return {};
|
|
450
|
+
const lineHeight = parseFloat(String(token.lineHeight));
|
|
451
|
+
return {
|
|
452
|
+
fontSize: token.fontSize,
|
|
453
|
+
lineHeight: Number.isNaN(lineHeight) ? void 0 : lineHeight,
|
|
454
|
+
fontWeight: String(token.fontWeight)
|
|
455
|
+
};
|
|
456
|
+
};
|
|
444
457
|
var CellTextRow = ({
|
|
445
458
|
left,
|
|
446
459
|
right,
|
|
447
460
|
leftProps,
|
|
448
|
-
rightProps
|
|
461
|
+
rightProps,
|
|
462
|
+
layout,
|
|
463
|
+
sideGap
|
|
449
464
|
}) => {
|
|
450
465
|
if (!left && !right) return null;
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
466
|
+
const leftFlex = { flex: 1, minWidth: 0, minHeight: 1 };
|
|
467
|
+
const rightFlex = layout === "fill-start" ? { flexGrow: 0, flexShrink: 0, flexBasis: "auto", minHeight: 1 } : { flex: 1, minWidth: 0, minHeight: 1 };
|
|
468
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
|
|
469
|
+
Box,
|
|
470
|
+
{
|
|
471
|
+
flexDirection: "row",
|
|
472
|
+
gap: sideGap,
|
|
473
|
+
alignItems: "center",
|
|
474
|
+
width: "100%",
|
|
475
|
+
children: [
|
|
476
|
+
left != null && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
477
|
+
Box,
|
|
478
|
+
{
|
|
479
|
+
flexDirection: "row",
|
|
480
|
+
alignItems: "center",
|
|
481
|
+
gap: CELL_TEXT_ROW_GAP,
|
|
482
|
+
style: leftFlex,
|
|
483
|
+
children: typeof left === "string" ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Text, { ...leftProps, children: left }) : left
|
|
484
|
+
}
|
|
485
|
+
),
|
|
486
|
+
right != null && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
487
|
+
Box,
|
|
488
|
+
{
|
|
489
|
+
flexDirection: "row",
|
|
490
|
+
alignItems: "center",
|
|
491
|
+
justifyContent: "flex-end",
|
|
492
|
+
gap: CELL_TEXT_ROW_GAP,
|
|
493
|
+
style: rightFlex,
|
|
494
|
+
children: typeof right === "string" ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Text, { ...rightProps, children: right }) : right
|
|
495
|
+
}
|
|
496
|
+
)
|
|
497
|
+
]
|
|
498
|
+
}
|
|
499
|
+
);
|
|
474
500
|
};
|
|
475
501
|
var CellText = (0, import_react.forwardRef)(
|
|
476
502
|
({
|
|
@@ -480,14 +506,24 @@ var CellText = (0, import_react.forwardRef)(
|
|
|
480
506
|
descriptionRight,
|
|
481
507
|
caption,
|
|
482
508
|
captionRight,
|
|
509
|
+
layout = "equal",
|
|
510
|
+
sideGap = CELL_GAP,
|
|
511
|
+
titleVariant = "bodyMdAccent",
|
|
512
|
+
titleRightVariant = "bodyXsParagraph",
|
|
513
|
+
descriptionVariant = "bodyXsParagraph",
|
|
514
|
+
descriptionRightVariant = "bodyXsParagraph",
|
|
515
|
+
captionVariant = "bodyXsParagraph",
|
|
516
|
+
captionRightVariant = "bodyXsParagraph",
|
|
483
517
|
testID,
|
|
484
518
|
themeMode,
|
|
485
519
|
themeProductContext,
|
|
486
520
|
...props
|
|
487
521
|
}, ref) => {
|
|
488
522
|
const { theme } = (0, import_xui_core.useResolvedTheme)({ themeMode, themeProductContext });
|
|
523
|
+
const productContext = theme.productContext;
|
|
489
524
|
const hasDescriptions = description != null || descriptionRight != null;
|
|
490
525
|
const hasCaptions = caption != null || captionRight != null;
|
|
526
|
+
const captionColor = theme.colors.content.tertiary;
|
|
491
527
|
return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
|
|
492
528
|
Box,
|
|
493
529
|
{
|
|
@@ -495,7 +531,7 @@ var CellText = (0, import_react.forwardRef)(
|
|
|
495
531
|
ref,
|
|
496
532
|
flexDirection: "column",
|
|
497
533
|
justifyContent: "center",
|
|
498
|
-
gap:
|
|
534
|
+
gap: CELL_TEXT_ROW_GAP,
|
|
499
535
|
...props,
|
|
500
536
|
style: { flex: 1, minWidth: 0, minHeight: 1, ...props.style },
|
|
501
537
|
children: [
|
|
@@ -504,16 +540,10 @@ var CellText = (0, import_react.forwardRef)(
|
|
|
504
540
|
{
|
|
505
541
|
left: title,
|
|
506
542
|
right: titleRight,
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
},
|
|
512
|
-
rightProps: {
|
|
513
|
-
fontWeight: "400",
|
|
514
|
-
fontSize: 12,
|
|
515
|
-
lineHeight: 18
|
|
516
|
-
}
|
|
543
|
+
layout,
|
|
544
|
+
sideGap,
|
|
545
|
+
leftProps: resolveTextStyle(productContext, titleVariant),
|
|
546
|
+
rightProps: resolveTextStyle(productContext, titleRightVariant)
|
|
517
547
|
}
|
|
518
548
|
),
|
|
519
549
|
hasDescriptions && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
@@ -521,16 +551,13 @@ var CellText = (0, import_react.forwardRef)(
|
|
|
521
551
|
{
|
|
522
552
|
left: description,
|
|
523
553
|
right: descriptionRight,
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
fontSize: 12,
|
|
532
|
-
lineHeight: 18
|
|
533
|
-
}
|
|
554
|
+
layout,
|
|
555
|
+
sideGap,
|
|
556
|
+
leftProps: resolveTextStyle(productContext, descriptionVariant),
|
|
557
|
+
rightProps: resolveTextStyle(
|
|
558
|
+
productContext,
|
|
559
|
+
descriptionRightVariant
|
|
560
|
+
)
|
|
534
561
|
}
|
|
535
562
|
),
|
|
536
563
|
hasCaptions && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
@@ -538,17 +565,15 @@ var CellText = (0, import_react.forwardRef)(
|
|
|
538
565
|
{
|
|
539
566
|
left: caption,
|
|
540
567
|
right: captionRight,
|
|
568
|
+
layout,
|
|
569
|
+
sideGap,
|
|
541
570
|
leftProps: {
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
lineHeight: 18,
|
|
545
|
-
color: theme.colors.content.tertiary
|
|
571
|
+
...resolveTextStyle(productContext, captionVariant),
|
|
572
|
+
color: captionColor
|
|
546
573
|
},
|
|
547
574
|
rightProps: {
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
lineHeight: 18,
|
|
551
|
-
color: theme.colors.content.tertiary
|
|
575
|
+
...resolveTextStyle(productContext, captionRightVariant),
|
|
576
|
+
color: captionColor
|
|
552
577
|
}
|
|
553
578
|
}
|
|
554
579
|
)
|
package/native/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/index.tsx","../../src/Cell.tsx","../../../../foundation/primitives-native/src/Box.tsx","../../../../foundation/primitives-native/src/Text.tsx"],"sourcesContent":["export * from \"./Cell\";\nexport * from \"./types\";\n","import { forwardRef, useMemo } from \"react\";\n// @ts-expect-error - this will be resolved at build time\nimport { Box, Text } from \"@xsolla/xui-primitives\";\nimport { useResolvedTheme } from \"@xsolla/xui-core\";\nimport {\n CellContentProps,\n CellProps,\n CellSlotProps,\n CellTextProps,\n CellView,\n} from \"./types\";\n\n/**\n * Figma \"Cell master\" (node 7222:5527) pads every bounded view by 8px.\n * Kept as a constant so the stroke and surface branches cannot drift apart.\n */\nconst CELL_PADDING = 8;\n\nconst CellRoot = forwardRef<any, CellProps>(\n (\n {\n children,\n view: viewProp,\n withBoard,\n disabled,\n onPress,\n style,\n testID,\n themeMode,\n themeProductContext,\n \"aria-disabled\": ariaDisabled,\n ...props\n },\n ref\n ) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n\n const view: CellView = viewProp ?? (withBoard ? \"stroke\" : \"default\");\n\n const viewStyles = useMemo(() => {\n // Figma's Hover/Active state is overlay-mono laid over the resting fill,\n // not a swap to a different surface colour.\n const overlay = theme.colors.overlay.mono;\n\n // A disabled cell is not actionable, so it gets no pointer feedback.\n // Leaving these undefined (rather than `{}`) means Box's `&:hover` and\n // `&:active` blocks emit no declarations at all.\n const overlayState = disabled ? undefined : { backgroundColor: overlay };\n\n // The surface view already paints background-secondary, so its hover has\n // to stack overlay-mono ON TOP of that fill. A hover background-color\n // would replace it instead, so compose both layers with a flat\n // linear-gradient (same technique as Stepper's surface prop).\n const surfaceOverlayState = disabled\n ? undefined\n : {\n background: `linear-gradient(0deg, ${overlay} 0%, ${overlay} 100%), ${theme.colors.background.secondary}`,\n };\n\n switch (view) {\n case \"stroke\":\n return {\n borderRadius: theme.shape.cell.borderRadius,\n borderWidth: theme.shape.cell.borderWidth,\n borderColor: theme.colors.border.secondary,\n padding: CELL_PADDING,\n hoverStyle: overlayState,\n pressStyle: overlayState,\n };\n case \"surface\":\n return {\n backgroundColor: theme.colors.background.secondary,\n borderRadius: theme.shape.cell.borderRadius,\n padding: CELL_PADDING,\n hoverStyle: surfaceOverlayState,\n pressStyle: surfaceOverlayState,\n };\n default:\n return {\n minHeight: 56,\n hoverStyle: overlayState,\n pressStyle: overlayState,\n };\n }\n }, [view, theme, disabled]);\n\n const hasPress = !disabled && onPress != null;\n\n return (\n <Box\n testID={testID}\n ref={ref}\n alignItems=\"center\"\n width=\"100%\"\n flexDirection=\"row\"\n gap={12}\n // `disabled` is deliberately NOT forwarded to Box. Box maps it to\n // `opacity: 0.5` + `pointer-events: none`, which would dim the row and\n // make interactive children inside Cell.Slot (Radio, Button)\n // unclickable. Cell gates only its own affordances and leaves the\n // dimmed look to the consumer.\n onPress={disabled ? undefined : onPress}\n cursor={disabled ? \"not-allowed\" : hasPress ? \"pointer\" : undefined}\n aria-disabled={ariaDisabled ?? (disabled || undefined)}\n {...viewStyles}\n {...props}\n style={{ color: theme.colors.content.primary, ...style }}\n >\n {children}\n </Box>\n );\n }\n);\n\nCellRoot.displayName = \"Cell\";\n\nconst CellSlot = forwardRef<any, CellSlotProps>(\n ({ children, testID, ...props }, ref) => {\n return (\n <Box\n testID={testID}\n ref={ref}\n alignItems=\"center\"\n justifyContent=\"center\"\n flexDirection=\"row\"\n {...props}\n style={{ flexShrink: 0, ...props.style }}\n >\n {children}\n </Box>\n );\n }\n);\n\nCellSlot.displayName = \"Cell.Slot\";\n\nconst CellContent = forwardRef<any, CellContentProps>(\n ({ children, testID, ...props }, ref) => {\n return (\n <Box\n testID={testID}\n ref={ref}\n flexDirection=\"column\"\n justifyContent=\"center\"\n {...props}\n style={{ flex: 1, ...props.style }}\n >\n {children}\n </Box>\n );\n }\n);\n\nCellContent.displayName = \"Cell.Content\";\n\nconst CellTextRow = ({\n left,\n right,\n leftProps,\n rightProps,\n}: {\n left?: React.ReactNode;\n right?: React.ReactNode;\n leftProps?: Record<string, unknown>;\n rightProps?: Record<string, unknown>;\n}) => {\n if (!left && !right) return null;\n return (\n <Box flexDirection=\"row\" gap={12} alignItems=\"center\" width=\"100%\">\n {left != null && (\n <Box\n flexDirection=\"row\"\n alignItems=\"center\"\n gap={2}\n style={{ flex: 1, minWidth: 0, minHeight: 1 }}\n >\n {typeof left === \"string\" ? <Text {...leftProps}>{left}</Text> : left}\n </Box>\n )}\n {right != null && (\n <Box\n flexDirection=\"row\"\n alignItems=\"center\"\n justifyContent=\"flex-end\"\n gap={2}\n style={{ flex: 1, minWidth: 0, minHeight: 1 }}\n >\n {typeof right === \"string\" ? (\n <Text {...rightProps}>{right}</Text>\n ) : (\n right\n )}\n </Box>\n )}\n </Box>\n );\n};\n\nconst CellText = forwardRef<any, CellTextProps>(\n (\n {\n title,\n titleRight,\n description,\n descriptionRight,\n caption,\n captionRight,\n testID,\n themeMode,\n themeProductContext,\n ...props\n },\n ref\n ) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n\n const hasDescriptions = description != null || descriptionRight != null;\n const hasCaptions = caption != null || captionRight != null;\n\n return (\n <Box\n testID={testID}\n ref={ref}\n flexDirection=\"column\"\n justifyContent=\"center\"\n gap={2}\n {...props}\n style={{ flex: 1, minWidth: 0, minHeight: 1, ...props.style }}\n >\n <CellTextRow\n left={title}\n right={titleRight}\n leftProps={{\n fontWeight: \"500\",\n fontSize: 16,\n lineHeight: 20,\n }}\n rightProps={{\n fontWeight: \"400\",\n fontSize: 12,\n lineHeight: 18,\n }}\n />\n {hasDescriptions && (\n <CellTextRow\n left={description}\n right={descriptionRight}\n leftProps={{\n fontWeight: \"400\",\n fontSize: 12,\n lineHeight: 18,\n }}\n rightProps={{\n fontWeight: \"400\",\n fontSize: 12,\n lineHeight: 18,\n }}\n />\n )}\n {hasCaptions && (\n <CellTextRow\n left={caption}\n right={captionRight}\n leftProps={{\n fontWeight: \"400\",\n fontSize: 12,\n lineHeight: 18,\n color: theme.colors.content.tertiary,\n }}\n rightProps={{\n fontWeight: \"400\",\n fontSize: 12,\n lineHeight: 18,\n color: theme.colors.content.tertiary,\n }}\n />\n )}\n </Box>\n );\n }\n);\n\nCellText.displayName = \"Cell.Text\";\n\nexport const Cell = Object.assign(CellRoot, {\n Slot: CellSlot,\n Content: CellContent,\n Text: CellText,\n});\n","import React from \"react\";\nimport {\n View,\n Pressable,\n Image,\n ViewStyle,\n ImageStyle,\n DimensionValue,\n AnimatableNumericValue,\n AccessibilityRole,\n} from \"react-native\";\nimport { BoxProps } from \"@xsolla/xui-primitives-core\";\n\nconst roleToAccessibilityRole: Record<string, AccessibilityRole> = {\n button: \"button\",\n link: \"link\",\n img: \"image\",\n image: \"image\",\n summary: \"summary\",\n switch: \"switch\",\n checkbox: \"checkbox\",\n radio: \"radio\",\n heading: \"header\",\n text: \"text\",\n search: \"search\",\n alert: \"alert\",\n none: \"none\",\n presentation: \"none\",\n progressbar: \"progressbar\",\n scrollbar: \"scrollbar\",\n adjustable: \"adjustable\",\n tab: \"tab\",\n menu: \"menu\",\n menuitem: \"menuitem\",\n list: \"list\",\n timer: \"timer\",\n};\n\n/** RN ViewStyle.gap is typed as number (Yoga gap), not DimensionValue. */\nconst toGapValue = (gap: number | string | undefined): number | undefined => {\n if (gap === undefined) return undefined;\n if (typeof gap === \"number\") return gap;\n const pxMatch = /^(\\d+(?:\\.\\d+)?)px$/.exec(gap);\n if (pxMatch) return Number(pxMatch[1]);\n const asNumber = Number(gap);\n return Number.isFinite(asNumber) ? asNumber : undefined;\n};\n\n/**\n * Yoga has no inline formatting context, so RN's ViewStyle.display only\n * accepts \"flex\" | \"none\". Every inline-ish web value collapses to a plain\n * flex container — the box already fills only its content on native, which is\n * what those callers wanted on web anyway. Returning undefined (rather than\n * \"flex\") leaves RN's own default in place.\n */\nconst toNativeDisplay = (\n display: BoxProps[\"display\"]\n): ViewStyle[\"display\"] => (display === \"none\" ? \"none\" : undefined);\n\nexport const Box: React.FC<BoxProps> = ({\n children,\n onPress,\n onLayout,\n onMoveShouldSetResponder,\n onResponderGrant,\n onResponderMove,\n onResponderRelease,\n onResponderTerminate,\n backgroundColor,\n borderColor,\n borderWidth,\n borderBottomWidth,\n borderBottomColor,\n borderTopWidth,\n borderTopColor,\n borderLeftWidth,\n borderLeftColor,\n borderRightWidth,\n borderRightColor,\n borderRadius,\n borderStyle,\n height,\n padding,\n paddingHorizontal,\n paddingVertical,\n margin,\n marginTop,\n marginBottom,\n marginLeft,\n marginRight,\n display,\n flexDirection,\n flexWrap,\n alignItems,\n justifyContent,\n alignSelf,\n position,\n top,\n bottom,\n left,\n right,\n width,\n minWidth,\n minHeight,\n maxWidth,\n maxHeight,\n flex,\n flexShrink,\n gap,\n overflow,\n opacity,\n zIndex,\n hoverStyle,\n pressStyle,\n style,\n disabled,\n \"data-testid\": dataTestId,\n testID,\n as,\n src,\n alt,\n ...rest\n}) => {\n const getContainerStyle = (pressed?: boolean): ViewStyle => ({\n backgroundColor:\n pressed && pressStyle?.backgroundColor\n ? pressStyle.backgroundColor\n : backgroundColor,\n borderColor,\n borderWidth,\n borderBottomWidth,\n borderBottomColor,\n borderTopWidth,\n borderTopColor,\n borderLeftWidth,\n borderLeftColor,\n borderRightWidth,\n borderRightColor,\n borderRadius: borderRadius as AnimatableNumericValue,\n borderStyle: borderStyle as ViewStyle[\"borderStyle\"],\n overflow,\n opacity: opacity ?? (disabled ? 0.5 : undefined),\n zIndex,\n height: height as DimensionValue,\n width: width as DimensionValue,\n minWidth: minWidth as DimensionValue,\n minHeight: minHeight as DimensionValue,\n maxWidth: maxWidth as DimensionValue,\n maxHeight: maxHeight as DimensionValue,\n padding: padding as DimensionValue,\n paddingHorizontal: paddingHorizontal as DimensionValue,\n paddingVertical: paddingVertical as DimensionValue,\n margin: margin as DimensionValue,\n marginTop: marginTop as DimensionValue,\n marginBottom: marginBottom as DimensionValue,\n marginLeft: marginLeft as DimensionValue,\n marginRight: marginRight as DimensionValue,\n display: toNativeDisplay(display),\n flexDirection,\n flexWrap,\n alignItems,\n justifyContent,\n alignSelf,\n position: position as ViewStyle[\"position\"],\n top: top as DimensionValue,\n bottom: bottom as DimensionValue,\n left: left as DimensionValue,\n right: right as DimensionValue,\n flex,\n flexShrink,\n gap: toGapValue(gap),\n ...(style as ViewStyle),\n });\n\n const finalTestID = dataTestId || testID;\n\n // Map web a11y props; drop the rest of the web-only attributes before\n // spreading onto RN hosts (unknown props warn at runtime).\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const {\n role,\n tabIndex,\n onKeyDown,\n onKeyUp,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": _ariaLabelledBy,\n \"aria-current\": _ariaCurrent,\n \"aria-disabled\": ariaDisabled,\n \"aria-live\": ariaLive,\n \"aria-busy\": ariaBusy,\n className,\n \"data-testid\": _dataTestId,\n cursor: _cursor,\n type: _type,\n ...nativeRest\n } = rest as Record<string, unknown>;\n\n const accessibilityRole =\n (typeof role === \"string\" && roleToAccessibilityRole[role]) ||\n (as === \"button\" ? \"button\" : undefined);\n const isDisabled = Boolean(disabled || ariaDisabled);\n const accessibilityState = {\n disabled: isDisabled || undefined,\n busy: Boolean(ariaBusy) || undefined,\n };\n const accessibilityLiveRegion =\n ariaLive === \"polite\" || ariaLive === \"assertive\" ? ariaLive : undefined;\n\n // Handle as=\"img\" for React Native\n if (as === \"img\" && src) {\n const imageStyle: ImageStyle = {\n width: width as DimensionValue,\n height: height as DimensionValue,\n borderRadius: borderRadius as number,\n position: position as ImageStyle[\"position\"],\n top: top as DimensionValue,\n bottom: bottom as DimensionValue,\n left: left as DimensionValue,\n right: right as DimensionValue,\n ...(style as ImageStyle),\n };\n\n return (\n <Image\n source={{ uri: src }}\n style={imageStyle}\n testID={finalTestID}\n accessibilityLabel={typeof ariaLabel === \"string\" ? ariaLabel : alt}\n resizeMode=\"cover\"\n {...nativeRest}\n />\n );\n }\n\n // Prefer Pressable whenever the node is interactive or explicitly a button,\n // so disabled / aria-disabled controls stay in the a11y tree as buttons.\n if (onPress || as === \"button\") {\n return (\n <Pressable\n onPress={!isDisabled && onPress ? onPress : undefined}\n disabled={isDisabled}\n onLayout={onLayout}\n onMoveShouldSetResponder={onMoveShouldSetResponder}\n onResponderGrant={onResponderGrant}\n onResponderMove={onResponderMove}\n onResponderRelease={onResponderRelease}\n onResponderTerminate={onResponderTerminate}\n style={({ pressed }) => getContainerStyle(pressed)}\n testID={finalTestID}\n accessibilityRole={accessibilityRole}\n accessibilityLabel={\n typeof ariaLabel === \"string\" ? ariaLabel : undefined\n }\n accessibilityState={accessibilityState}\n accessibilityLiveRegion={accessibilityLiveRegion}\n {...nativeRest}\n >\n {children}\n </Pressable>\n );\n }\n\n return (\n <View\n style={getContainerStyle()}\n testID={finalTestID}\n onLayout={onLayout}\n onMoveShouldSetResponder={onMoveShouldSetResponder}\n onResponderGrant={onResponderGrant}\n onResponderMove={onResponderMove}\n onResponderRelease={onResponderRelease}\n onResponderTerminate={onResponderTerminate}\n accessibilityRole={accessibilityRole}\n accessibilityLabel={typeof ariaLabel === \"string\" ? ariaLabel : undefined}\n accessibilityState={accessibilityState}\n accessibilityLiveRegion={accessibilityLiveRegion}\n {...nativeRest}\n >\n {children}\n </View>\n );\n};\n","import React from \"react\";\nimport {\n Text as RNText,\n TextStyle,\n AccessibilityRole,\n StyleSheet,\n} from \"react-native\";\nimport { TextProps } from \"@xsolla/xui-primitives-core\";\n\nconst roleMap: Record<string, AccessibilityRole> = {\n alert: \"alert\",\n heading: \"header\",\n button: \"button\",\n link: \"link\",\n text: \"text\",\n};\n\nconst parseNumericValue = (\n value: string | number | undefined\n): number | undefined => {\n if (value === undefined) return undefined;\n if (typeof value === \"number\") return value;\n const parsed = parseFloat(value);\n return isNaN(parsed) ? undefined : parsed;\n};\n\nexport const Text: React.FC<TextProps> = ({\n children,\n color,\n fontSize,\n fontWeight,\n fontFamily,\n textAlign,\n lineHeight,\n numberOfLines,\n id,\n role,\n testID,\n \"data-testid\": dataTestId,\n style: styleProp,\n ...props\n}) => {\n let resolvedFontFamily = fontFamily\n ? fontFamily.split(\",\")[0].replace(/['\"]/g, \"\").trim()\n : undefined;\n\n if (\n resolvedFontFamily === \"Pilat Wide\" ||\n resolvedFontFamily === \"Pilat Wide Bold\" ||\n resolvedFontFamily === \"Aktiv Grotesk\"\n ) {\n resolvedFontFamily = undefined;\n }\n\n const incomingStyle = StyleSheet.flatten(styleProp) as TextStyle | undefined;\n\n const baseStyle: TextStyle = {\n color: color ?? incomingStyle?.color,\n fontSize: typeof fontSize === \"number\" ? fontSize : undefined,\n fontWeight: fontWeight as TextStyle[\"fontWeight\"],\n fontFamily: resolvedFontFamily,\n textDecorationLine: props.textDecoration as TextStyle[\"textDecorationLine\"],\n textAlign: textAlign ?? incomingStyle?.textAlign,\n lineHeight: parseNumericValue(lineHeight ?? incomingStyle?.lineHeight),\n marginTop: parseNumericValue(\n incomingStyle?.marginTop as number | string | undefined\n ),\n marginBottom: parseNumericValue(\n incomingStyle?.marginBottom as number | string | undefined\n ),\n };\n\n const accessibilityRole = role ? roleMap[role] : undefined;\n\n return (\n <RNText\n style={baseStyle}\n numberOfLines={numberOfLines}\n testID={dataTestId || testID || id}\n accessibilityRole={accessibilityRole}\n >\n {children}\n </RNText>\n );\n};\n"],"mappings":"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","names":["import_react_native","import_jsx_runtime","RNText","import_jsx_runtime"]}
|
|
1
|
+
{"version":3,"sources":["../../src/index.tsx","../../src/Cell.tsx","../../../../foundation/primitives-native/src/Box.tsx","../../../../foundation/primitives-native/src/Text.tsx"],"sourcesContent":["export * from \"./Cell\";\nexport * from \"./types\";\n","import { forwardRef, useMemo } from \"react\";\n// @ts-expect-error - this will be resolved at build time\nimport { Box, Text } from \"@xsolla/xui-primitives\";\nimport {\n controlSizeScale,\n getTypographyVariant,\n spacingScale,\n useResolvedTheme,\n} from \"@xsolla/xui-core\";\nimport {\n CellContentProps,\n CellProps,\n CellSlotProps,\n CellTextLayout,\n CellTextProps,\n CellTextVariant,\n CellView,\n} from \"./types\";\n\n/**\n * Figma \"Cell master\" (node 7222:5527) pads every bounded view by 8px\n * (`spacing/100`). Kept as a constant so the stroke and surface branches\n * cannot drift apart.\n */\nconst CELL_PADDING = spacingScale[\"100\"];\n/** Gap between slots, and between the left/right parts of a text row. */\nconst CELL_GAP = spacingScale[\"150\"];\n/** Minimum row height of the unbounded `default` view (`control-size/650`). */\nconst CELL_MIN_HEIGHT = controlSizeScale[\"650\"];\n/** Vertical gap between the rows of `Cell.Text`. */\nconst CELL_TEXT_ROW_GAP = spacingScale[\"25\"];\n\nconst CellRoot = forwardRef<any, CellProps>(\n (\n {\n children,\n view: viewProp,\n withBoard,\n disabled,\n onPress,\n style,\n testID,\n themeMode,\n themeProductContext,\n \"aria-disabled\": ariaDisabled,\n ...props\n },\n ref\n ) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n\n const view: CellView = viewProp ?? (withBoard ? \"stroke\" : \"default\");\n\n const viewStyles = useMemo(() => {\n // Figma's Hover/Active state is overlay-mono laid over the resting fill,\n // not a swap to a different surface colour.\n const overlay = theme.colors.overlay.mono;\n\n // A disabled cell is not actionable, so it gets no pointer feedback.\n // Leaving these undefined (rather than `{}`) means Box's `&:hover` and\n // `&:active` blocks emit no declarations at all.\n const overlayState = disabled ? undefined : { backgroundColor: overlay };\n\n // The surface view already paints background-secondary, so its hover has\n // to stack overlay-mono ON TOP of that fill. A hover background-color\n // would replace it instead, so compose both layers with a flat\n // linear-gradient (same technique as Stepper's surface prop).\n const surfaceOverlayState = disabled\n ? undefined\n : {\n background: `linear-gradient(0deg, ${overlay} 0%, ${overlay} 100%), ${theme.colors.background.secondary}`,\n };\n\n switch (view) {\n case \"stroke\":\n return {\n borderRadius: theme.shape.cell.borderRadius,\n borderWidth: theme.shape.cell.borderWidth,\n borderColor: theme.colors.border.secondary,\n padding: CELL_PADDING,\n hoverStyle: overlayState,\n pressStyle: overlayState,\n };\n case \"surface\":\n return {\n backgroundColor: theme.colors.background.secondary,\n borderRadius: theme.shape.cell.borderRadius,\n padding: CELL_PADDING,\n hoverStyle: surfaceOverlayState,\n pressStyle: surfaceOverlayState,\n };\n default:\n return {\n minHeight: CELL_MIN_HEIGHT,\n hoverStyle: overlayState,\n pressStyle: overlayState,\n };\n }\n }, [view, theme, disabled]);\n\n const hasPress = !disabled && onPress != null;\n\n return (\n <Box\n testID={testID}\n ref={ref}\n alignItems=\"center\"\n width=\"100%\"\n flexDirection=\"row\"\n gap={CELL_GAP}\n // `disabled` is deliberately NOT forwarded to Box. Box maps it to\n // `opacity: 0.5` + `pointer-events: none`, which would dim the row and\n // make interactive children inside Cell.Slot (Radio, Button)\n // unclickable. Cell gates only its own affordances and leaves the\n // dimmed look to the consumer.\n onPress={disabled ? undefined : onPress}\n cursor={disabled ? \"not-allowed\" : hasPress ? \"pointer\" : undefined}\n aria-disabled={ariaDisabled ?? (disabled || undefined)}\n // View defaults first, consumer props second: `gap`, `minHeight` and\n // the padding props all stay overridable.\n {...viewStyles}\n {...props}\n style={{ color: theme.colors.content.primary, ...style }}\n >\n {children}\n </Box>\n );\n }\n);\n\nCellRoot.displayName = \"Cell\";\n\nconst CellSlot = forwardRef<any, CellSlotProps>(\n ({ children, testID, ...props }, ref) => {\n return (\n <Box\n testID={testID}\n ref={ref}\n alignItems=\"center\"\n justifyContent=\"center\"\n flexDirection=\"row\"\n {...props}\n style={{ flexShrink: 0, ...props.style }}\n >\n {children}\n </Box>\n );\n }\n);\n\nCellSlot.displayName = \"Cell.Slot\";\n\nconst CellContent = forwardRef<any, CellContentProps>(\n ({ children, testID, ...props }, ref) => {\n return (\n <Box\n testID={testID}\n ref={ref}\n flexDirection=\"column\"\n justifyContent=\"center\"\n {...props}\n style={{ flex: 1, ...props.style }}\n >\n {children}\n </Box>\n );\n }\n);\n\nCellContent.displayName = \"Cell.Content\";\n\n/**\n * Turns a typography token into Text props. `lineHeight` is converted to a\n * number so the same value works on web (px) and React Native.\n */\nconst resolveTextStyle = (\n productContext: Parameters<typeof getTypographyVariant>[0],\n variant: CellTextVariant\n): { fontSize?: number; lineHeight?: number; fontWeight?: string } => {\n const token = getTypographyVariant(productContext, variant);\n if (!token) return {};\n const lineHeight = parseFloat(String(token.lineHeight));\n return {\n fontSize: token.fontSize,\n lineHeight: Number.isNaN(lineHeight) ? undefined : lineHeight,\n fontWeight: String(token.fontWeight),\n };\n};\n\nconst CellTextRow = ({\n left,\n right,\n leftProps,\n rightProps,\n layout,\n sideGap,\n}: {\n left?: React.ReactNode;\n right?: React.ReactNode;\n leftProps?: Record<string, unknown>;\n rightProps?: Record<string, unknown>;\n layout: CellTextLayout;\n sideGap: number;\n}) => {\n if (!left && !right) return null;\n\n // \"equal\": both parts share the row 50/50 (historical behaviour).\n // \"fill-start\": the left part takes the remaining width and the right part\n // sizes to its content, so a long label does not wrap next to a short value.\n const leftFlex = { flex: 1, minWidth: 0, minHeight: 1 };\n const rightFlex =\n layout === \"fill-start\"\n ? { flexGrow: 0, flexShrink: 0, flexBasis: \"auto\", minHeight: 1 }\n : { flex: 1, minWidth: 0, minHeight: 1 };\n\n return (\n <Box\n flexDirection=\"row\"\n gap={sideGap}\n alignItems=\"center\"\n width=\"100%\"\n >\n {left != null && (\n <Box\n flexDirection=\"row\"\n alignItems=\"center\"\n gap={CELL_TEXT_ROW_GAP}\n style={leftFlex}\n >\n {typeof left === \"string\" ? <Text {...leftProps}>{left}</Text> : left}\n </Box>\n )}\n {right != null && (\n <Box\n flexDirection=\"row\"\n alignItems=\"center\"\n justifyContent=\"flex-end\"\n gap={CELL_TEXT_ROW_GAP}\n style={rightFlex}\n >\n {typeof right === \"string\" ? (\n <Text {...rightProps}>{right}</Text>\n ) : (\n right\n )}\n </Box>\n )}\n </Box>\n );\n};\n\nconst CellText = forwardRef<any, CellTextProps>(\n (\n {\n title,\n titleRight,\n description,\n descriptionRight,\n caption,\n captionRight,\n layout = \"equal\",\n sideGap = CELL_GAP,\n titleVariant = \"bodyMdAccent\",\n titleRightVariant = \"bodyXsParagraph\",\n descriptionVariant = \"bodyXsParagraph\",\n descriptionRightVariant = \"bodyXsParagraph\",\n captionVariant = \"bodyXsParagraph\",\n captionRightVariant = \"bodyXsParagraph\",\n testID,\n themeMode,\n themeProductContext,\n ...props\n },\n ref\n ) => {\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n const productContext = theme.productContext;\n\n const hasDescriptions = description != null || descriptionRight != null;\n const hasCaptions = caption != null || captionRight != null;\n\n const captionColor = theme.colors.content.tertiary;\n\n return (\n <Box\n testID={testID}\n ref={ref}\n flexDirection=\"column\"\n justifyContent=\"center\"\n gap={CELL_TEXT_ROW_GAP}\n {...props}\n style={{ flex: 1, minWidth: 0, minHeight: 1, ...props.style }}\n >\n <CellTextRow\n left={title}\n right={titleRight}\n layout={layout}\n sideGap={sideGap}\n leftProps={resolveTextStyle(productContext, titleVariant)}\n rightProps={resolveTextStyle(productContext, titleRightVariant)}\n />\n {hasDescriptions && (\n <CellTextRow\n left={description}\n right={descriptionRight}\n layout={layout}\n sideGap={sideGap}\n leftProps={resolveTextStyle(productContext, descriptionVariant)}\n rightProps={resolveTextStyle(\n productContext,\n descriptionRightVariant\n )}\n />\n )}\n {hasCaptions && (\n <CellTextRow\n left={caption}\n right={captionRight}\n layout={layout}\n sideGap={sideGap}\n leftProps={{\n ...resolveTextStyle(productContext, captionVariant),\n color: captionColor,\n }}\n rightProps={{\n ...resolveTextStyle(productContext, captionRightVariant),\n color: captionColor,\n }}\n />\n )}\n </Box>\n );\n }\n);\n\nCellText.displayName = \"Cell.Text\";\n\nexport const Cell = Object.assign(CellRoot, {\n Slot: CellSlot,\n Content: CellContent,\n Text: CellText,\n});\n","import React from \"react\";\nimport {\n View,\n Pressable,\n Image,\n ViewStyle,\n ImageStyle,\n DimensionValue,\n AnimatableNumericValue,\n AccessibilityRole,\n} from \"react-native\";\nimport { BoxProps } from \"@xsolla/xui-primitives-core\";\n\nconst roleToAccessibilityRole: Record<string, AccessibilityRole> = {\n button: \"button\",\n link: \"link\",\n img: \"image\",\n image: \"image\",\n summary: \"summary\",\n switch: \"switch\",\n checkbox: \"checkbox\",\n radio: \"radio\",\n heading: \"header\",\n text: \"text\",\n search: \"search\",\n alert: \"alert\",\n none: \"none\",\n presentation: \"none\",\n progressbar: \"progressbar\",\n scrollbar: \"scrollbar\",\n adjustable: \"adjustable\",\n tab: \"tab\",\n menu: \"menu\",\n menuitem: \"menuitem\",\n list: \"list\",\n timer: \"timer\",\n};\n\n/** RN ViewStyle.gap is typed as number (Yoga gap), not DimensionValue. */\nconst toGapValue = (gap: number | string | undefined): number | undefined => {\n if (gap === undefined) return undefined;\n if (typeof gap === \"number\") return gap;\n const pxMatch = /^(\\d+(?:\\.\\d+)?)px$/.exec(gap);\n if (pxMatch) return Number(pxMatch[1]);\n const asNumber = Number(gap);\n return Number.isFinite(asNumber) ? asNumber : undefined;\n};\n\n/**\n * Yoga has no inline formatting context, so RN's ViewStyle.display only\n * accepts \"flex\" | \"none\". Every inline-ish web value collapses to a plain\n * flex container — the box already fills only its content on native, which is\n * what those callers wanted on web anyway. Returning undefined (rather than\n * \"flex\") leaves RN's own default in place.\n */\nconst toNativeDisplay = (\n display: BoxProps[\"display\"]\n): ViewStyle[\"display\"] => (display === \"none\" ? \"none\" : undefined);\n\nexport const Box: React.FC<BoxProps> = ({\n children,\n onPress,\n onLayout,\n onMoveShouldSetResponder,\n onResponderGrant,\n onResponderMove,\n onResponderRelease,\n onResponderTerminate,\n backgroundColor,\n borderColor,\n borderWidth,\n borderBottomWidth,\n borderBottomColor,\n borderTopWidth,\n borderTopColor,\n borderLeftWidth,\n borderLeftColor,\n borderRightWidth,\n borderRightColor,\n borderRadius,\n borderStyle,\n height,\n padding,\n paddingHorizontal,\n paddingVertical,\n margin,\n marginTop,\n marginBottom,\n marginLeft,\n marginRight,\n display,\n flexDirection,\n flexWrap,\n alignItems,\n justifyContent,\n alignSelf,\n position,\n top,\n bottom,\n left,\n right,\n width,\n minWidth,\n minHeight,\n maxWidth,\n maxHeight,\n flex,\n flexShrink,\n gap,\n overflow,\n opacity,\n zIndex,\n hoverStyle,\n pressStyle,\n style,\n disabled,\n \"data-testid\": dataTestId,\n testID,\n as,\n src,\n alt,\n ...rest\n}) => {\n const getContainerStyle = (pressed?: boolean): ViewStyle => ({\n backgroundColor:\n pressed && pressStyle?.backgroundColor\n ? pressStyle.backgroundColor\n : backgroundColor,\n borderColor,\n borderWidth,\n borderBottomWidth,\n borderBottomColor,\n borderTopWidth,\n borderTopColor,\n borderLeftWidth,\n borderLeftColor,\n borderRightWidth,\n borderRightColor,\n borderRadius: borderRadius as AnimatableNumericValue,\n borderStyle: borderStyle as ViewStyle[\"borderStyle\"],\n overflow,\n opacity: opacity ?? (disabled ? 0.5 : undefined),\n zIndex,\n height: height as DimensionValue,\n width: width as DimensionValue,\n minWidth: minWidth as DimensionValue,\n minHeight: minHeight as DimensionValue,\n maxWidth: maxWidth as DimensionValue,\n maxHeight: maxHeight as DimensionValue,\n padding: padding as DimensionValue,\n paddingHorizontal: paddingHorizontal as DimensionValue,\n paddingVertical: paddingVertical as DimensionValue,\n margin: margin as DimensionValue,\n marginTop: marginTop as DimensionValue,\n marginBottom: marginBottom as DimensionValue,\n marginLeft: marginLeft as DimensionValue,\n marginRight: marginRight as DimensionValue,\n display: toNativeDisplay(display),\n flexDirection,\n flexWrap,\n alignItems,\n justifyContent,\n alignSelf,\n position: position as ViewStyle[\"position\"],\n top: top as DimensionValue,\n bottom: bottom as DimensionValue,\n left: left as DimensionValue,\n right: right as DimensionValue,\n flex,\n flexShrink,\n gap: toGapValue(gap),\n ...(style as ViewStyle),\n });\n\n const finalTestID = dataTestId || testID;\n\n // Map web a11y props; drop the rest of the web-only attributes before\n // spreading onto RN hosts (unknown props warn at runtime).\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const {\n role,\n tabIndex,\n onKeyDown,\n onKeyUp,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": _ariaLabelledBy,\n \"aria-current\": _ariaCurrent,\n \"aria-disabled\": ariaDisabled,\n \"aria-live\": ariaLive,\n \"aria-busy\": ariaBusy,\n className,\n \"data-testid\": _dataTestId,\n cursor: _cursor,\n type: _type,\n ...nativeRest\n } = rest as Record<string, unknown>;\n\n const accessibilityRole =\n (typeof role === \"string\" && roleToAccessibilityRole[role]) ||\n (as === \"button\" ? \"button\" : undefined);\n const isDisabled = Boolean(disabled || ariaDisabled);\n const accessibilityState = {\n disabled: isDisabled || undefined,\n busy: Boolean(ariaBusy) || undefined,\n };\n const accessibilityLiveRegion =\n ariaLive === \"polite\" || ariaLive === \"assertive\" ? ariaLive : undefined;\n\n // Handle as=\"img\" for React Native\n if (as === \"img\" && src) {\n const imageStyle: ImageStyle = {\n width: width as DimensionValue,\n height: height as DimensionValue,\n borderRadius: borderRadius as number,\n position: position as ImageStyle[\"position\"],\n top: top as DimensionValue,\n bottom: bottom as DimensionValue,\n left: left as DimensionValue,\n right: right as DimensionValue,\n ...(style as ImageStyle),\n };\n\n return (\n <Image\n source={{ uri: src }}\n style={imageStyle}\n testID={finalTestID}\n accessibilityLabel={typeof ariaLabel === \"string\" ? ariaLabel : alt}\n resizeMode=\"cover\"\n {...nativeRest}\n />\n );\n }\n\n // Prefer Pressable whenever the node is interactive or explicitly a button,\n // so disabled / aria-disabled controls stay in the a11y tree as buttons.\n if (onPress || as === \"button\") {\n return (\n <Pressable\n onPress={!isDisabled && onPress ? onPress : undefined}\n disabled={isDisabled}\n onLayout={onLayout}\n onMoveShouldSetResponder={onMoveShouldSetResponder}\n onResponderGrant={onResponderGrant}\n onResponderMove={onResponderMove}\n onResponderRelease={onResponderRelease}\n onResponderTerminate={onResponderTerminate}\n style={({ pressed }) => getContainerStyle(pressed)}\n testID={finalTestID}\n accessibilityRole={accessibilityRole}\n accessibilityLabel={\n typeof ariaLabel === \"string\" ? ariaLabel : undefined\n }\n accessibilityState={accessibilityState}\n accessibilityLiveRegion={accessibilityLiveRegion}\n {...nativeRest}\n >\n {children}\n </Pressable>\n );\n }\n\n return (\n <View\n style={getContainerStyle()}\n testID={finalTestID}\n onLayout={onLayout}\n onMoveShouldSetResponder={onMoveShouldSetResponder}\n onResponderGrant={onResponderGrant}\n onResponderMove={onResponderMove}\n onResponderRelease={onResponderRelease}\n onResponderTerminate={onResponderTerminate}\n accessibilityRole={accessibilityRole}\n accessibilityLabel={typeof ariaLabel === \"string\" ? ariaLabel : undefined}\n accessibilityState={accessibilityState}\n accessibilityLiveRegion={accessibilityLiveRegion}\n {...nativeRest}\n >\n {children}\n </View>\n );\n};\n","import React from \"react\";\nimport {\n Text as RNText,\n TextStyle,\n AccessibilityRole,\n StyleSheet,\n} from \"react-native\";\nimport { TextProps } from \"@xsolla/xui-primitives-core\";\n\nconst roleMap: Record<string, AccessibilityRole> = {\n alert: \"alert\",\n heading: \"header\",\n button: \"button\",\n link: \"link\",\n text: \"text\",\n};\n\nconst parseNumericValue = (\n value: string | number | undefined\n): number | undefined => {\n if (value === undefined) return undefined;\n if (typeof value === \"number\") return value;\n const parsed = parseFloat(value);\n return isNaN(parsed) ? undefined : parsed;\n};\n\nexport const Text: React.FC<TextProps> = ({\n children,\n color,\n fontSize,\n fontWeight,\n fontFamily,\n textAlign,\n lineHeight,\n numberOfLines,\n id,\n role,\n testID,\n \"data-testid\": dataTestId,\n style: styleProp,\n ...props\n}) => {\n let resolvedFontFamily = fontFamily\n ? fontFamily.split(\",\")[0].replace(/['\"]/g, \"\").trim()\n : undefined;\n\n if (\n resolvedFontFamily === \"Pilat Wide\" ||\n resolvedFontFamily === \"Pilat Wide Bold\" ||\n resolvedFontFamily === \"Aktiv Grotesk\"\n ) {\n resolvedFontFamily = undefined;\n }\n\n const incomingStyle = StyleSheet.flatten(styleProp) as TextStyle | undefined;\n\n const baseStyle: TextStyle = {\n color: color ?? incomingStyle?.color,\n fontSize: typeof fontSize === \"number\" ? fontSize : undefined,\n fontWeight: fontWeight as TextStyle[\"fontWeight\"],\n fontFamily: resolvedFontFamily,\n textDecorationLine: props.textDecoration as TextStyle[\"textDecorationLine\"],\n textAlign: textAlign ?? incomingStyle?.textAlign,\n lineHeight: parseNumericValue(lineHeight ?? incomingStyle?.lineHeight),\n marginTop: parseNumericValue(\n incomingStyle?.marginTop as number | string | undefined\n ),\n marginBottom: parseNumericValue(\n incomingStyle?.marginBottom as number | string | undefined\n ),\n };\n\n const accessibilityRole = role ? roleMap[role] : undefined;\n\n return (\n <RNText\n style={baseStyle}\n numberOfLines={numberOfLines}\n testID={dataTestId || testID || id}\n accessibilityRole={accessibilityRole}\n >\n {children}\n </RNText>\n );\n};\n"],"mappings":"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","names":["import_react_native","import_jsx_runtime","RNText","import_jsx_runtime"]}
|