@xsolla/xui-tooltip 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/README.md +119 -68
- package/native/index.d.mts +2 -0
- package/native/index.d.ts +2 -0
- package/native/index.js +5 -1
- package/native/index.js.map +1 -1
- package/native/index.mjs +5 -1
- package/native/index.mjs.map +1 -1
- package/package.json +4 -4
- package/web/index.d.mts +2 -0
- package/web/index.d.ts +2 -0
- package/web/index.js +6 -1
- package/web/index.js.map +1 -1
- package/web/index.mjs +6 -1
- package/web/index.mjs.map +1 -1
package/README.md
CHANGED
|
@@ -11,15 +11,20 @@ npm install @xsolla/xui-tooltip
|
|
|
11
11
|
## Imports
|
|
12
12
|
|
|
13
13
|
```tsx
|
|
14
|
-
import {
|
|
14
|
+
import {
|
|
15
|
+
Tooltip,
|
|
16
|
+
type TooltipProps,
|
|
17
|
+
type TooltipPlacement,
|
|
18
|
+
type TooltipSize,
|
|
19
|
+
} from "@xsolla/xui-tooltip";
|
|
15
20
|
```
|
|
16
21
|
|
|
17
22
|
## Quick start
|
|
18
23
|
|
|
19
24
|
```tsx
|
|
20
|
-
import * as React from
|
|
21
|
-
import { Tooltip } from
|
|
22
|
-
import { Button } from
|
|
25
|
+
import * as React from "react";
|
|
26
|
+
import { Tooltip } from "@xsolla/xui-tooltip";
|
|
27
|
+
import { Button } from "@xsolla/xui-button";
|
|
23
28
|
|
|
24
29
|
export default function Example() {
|
|
25
30
|
return (
|
|
@@ -34,19 +39,20 @@ export default function Example() {
|
|
|
34
39
|
|
|
35
40
|
### `<Tooltip>`
|
|
36
41
|
|
|
37
|
-
| Prop
|
|
38
|
-
|
|
|
39
|
-
| `content`
|
|
40
|
-
| `children`
|
|
41
|
-
| `size`
|
|
42
|
-
| `placement`
|
|
43
|
-
| `offset`
|
|
44
|
-
| `delayEnter`
|
|
45
|
-
| `delayLeave`
|
|
46
|
-
| `controlledVisible` | `boolean`
|
|
47
|
-
| `style`
|
|
48
|
-
| `className`
|
|
49
|
-
| `data-testid`
|
|
42
|
+
| Prop | Type | Default | Description |
|
|
43
|
+
| ------------------- | ------------------------------ | ------- | ------------------------------------------------------------------------------------------------------------- |
|
|
44
|
+
| `content` | `ReactNode` | — | **Required.** Tooltip content. Strings/numbers render as themed text. |
|
|
45
|
+
| `children` | `ReactNode` | — | **Required.** Trigger element. |
|
|
46
|
+
| `size` | `"sm" \| "md" \| "lg" \| "xl"` | `"md"` | Typography size. |
|
|
47
|
+
| `placement` | `TooltipPlacement` | `"top"` | Position relative to trigger. |
|
|
48
|
+
| `offset` | `number` | `12` | Distance from trigger in pixels. |
|
|
49
|
+
| `delayEnter` | `number` | `0` | Delay before showing (ms). |
|
|
50
|
+
| `delayLeave` | `number` | `0` | Delay before hiding (ms). |
|
|
51
|
+
| `controlledVisible` | `boolean` | — | Externally controlled visibility. Overrides hover/focus state. |
|
|
52
|
+
| `style` | `CSSProperties` | — | Custom styles applied to the tooltip surface (web only). |
|
|
53
|
+
| `className` | `string` | — | Custom class for the trigger wrapper. |
|
|
54
|
+
| `data-testid` | `string` | — | Test identifier. |
|
|
55
|
+
| `testID` | `string` | — | Test ID for testing frameworks. On web this renders as `data-testid`; on React Native it renders as `testID`. |
|
|
50
56
|
|
|
51
57
|
Inherits `ThemeOverrideProps` (`themeMode`, `themeProductContext`).
|
|
52
58
|
|
|
@@ -55,33 +61,56 @@ Inherits `ThemeOverrideProps` (`themeMode`, `themeProductContext`).
|
|
|
55
61
|
### Size typography
|
|
56
62
|
|
|
57
63
|
| Size | Font size | Line height |
|
|
58
|
-
|
|
|
59
|
-
| `sm` | 14px
|
|
60
|
-
| `md` | 16px
|
|
61
|
-
| `lg` | 18px
|
|
62
|
-
| `xl` | 20px
|
|
64
|
+
| ---- | --------- | ----------- |
|
|
65
|
+
| `sm` | 14px | 16px |
|
|
66
|
+
| `md` | 16px | 18px |
|
|
67
|
+
| `lg` | 18px | 20px |
|
|
68
|
+
| `xl` | 20px | 22px |
|
|
63
69
|
|
|
64
70
|
## Examples
|
|
65
71
|
|
|
66
72
|
### Placements
|
|
67
73
|
|
|
68
74
|
```tsx
|
|
69
|
-
import * as React from
|
|
70
|
-
import { Tooltip } from
|
|
71
|
-
import { Button } from
|
|
75
|
+
import * as React from "react";
|
|
76
|
+
import { Tooltip } from "@xsolla/xui-tooltip";
|
|
77
|
+
import { Button } from "@xsolla/xui-button";
|
|
72
78
|
|
|
73
79
|
export default function Placements() {
|
|
74
80
|
return (
|
|
75
|
-
<div
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
81
|
+
<div
|
|
82
|
+
style={{
|
|
83
|
+
display: "grid",
|
|
84
|
+
gridTemplateColumns: "repeat(3, 1fr)",
|
|
85
|
+
gap: 16,
|
|
86
|
+
padding: 48,
|
|
87
|
+
}}
|
|
88
|
+
>
|
|
89
|
+
<Tooltip content="Top left" placement="top-left">
|
|
90
|
+
<Button variant="secondary">Top Left</Button>
|
|
91
|
+
</Tooltip>
|
|
92
|
+
<Tooltip content="Top centre" placement="top">
|
|
93
|
+
<Button variant="secondary">Top</Button>
|
|
94
|
+
</Tooltip>
|
|
95
|
+
<Tooltip content="Top right" placement="top-right">
|
|
96
|
+
<Button variant="secondary">Top Right</Button>
|
|
97
|
+
</Tooltip>
|
|
98
|
+
<Tooltip content="Left" placement="left">
|
|
99
|
+
<Button variant="secondary">Left</Button>
|
|
100
|
+
</Tooltip>
|
|
80
101
|
<div />
|
|
81
|
-
<Tooltip content="Right" placement="right"
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
<Tooltip content="Bottom
|
|
102
|
+
<Tooltip content="Right" placement="right">
|
|
103
|
+
<Button variant="secondary">Right</Button>
|
|
104
|
+
</Tooltip>
|
|
105
|
+
<Tooltip content="Bottom left" placement="bottom-left">
|
|
106
|
+
<Button variant="secondary">Bottom Left</Button>
|
|
107
|
+
</Tooltip>
|
|
108
|
+
<Tooltip content="Bottom centre" placement="bottom">
|
|
109
|
+
<Button variant="secondary">Bottom</Button>
|
|
110
|
+
</Tooltip>
|
|
111
|
+
<Tooltip content="Bottom right" placement="bottom-right">
|
|
112
|
+
<Button variant="secondary">Bottom Right</Button>
|
|
113
|
+
</Tooltip>
|
|
85
114
|
</div>
|
|
86
115
|
);
|
|
87
116
|
}
|
|
@@ -90,17 +119,25 @@ export default function Placements() {
|
|
|
90
119
|
### Sizes
|
|
91
120
|
|
|
92
121
|
```tsx
|
|
93
|
-
import * as React from
|
|
94
|
-
import { Tooltip } from
|
|
95
|
-
import { Button } from
|
|
122
|
+
import * as React from "react";
|
|
123
|
+
import { Tooltip } from "@xsolla/xui-tooltip";
|
|
124
|
+
import { Button } from "@xsolla/xui-button";
|
|
96
125
|
|
|
97
126
|
export default function Sizes() {
|
|
98
127
|
return (
|
|
99
|
-
<div style={{ display:
|
|
100
|
-
<Tooltip content="Small" size="sm"
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
<Tooltip content="
|
|
128
|
+
<div style={{ display: "flex", gap: 16 }}>
|
|
129
|
+
<Tooltip content="Small" size="sm">
|
|
130
|
+
<Button variant="secondary">Small</Button>
|
|
131
|
+
</Tooltip>
|
|
132
|
+
<Tooltip content="Medium" size="md">
|
|
133
|
+
<Button variant="secondary">Medium</Button>
|
|
134
|
+
</Tooltip>
|
|
135
|
+
<Tooltip content="Large" size="lg">
|
|
136
|
+
<Button variant="secondary">Large</Button>
|
|
137
|
+
</Tooltip>
|
|
138
|
+
<Tooltip content="Extra large" size="xl">
|
|
139
|
+
<Button variant="secondary">XL</Button>
|
|
140
|
+
</Tooltip>
|
|
104
141
|
</div>
|
|
105
142
|
);
|
|
106
143
|
}
|
|
@@ -109,16 +146,22 @@ export default function Sizes() {
|
|
|
109
146
|
### With delay
|
|
110
147
|
|
|
111
148
|
```tsx
|
|
112
|
-
import * as React from
|
|
113
|
-
import { Tooltip } from
|
|
114
|
-
import { Button } from
|
|
149
|
+
import * as React from "react";
|
|
150
|
+
import { Tooltip } from "@xsolla/xui-tooltip";
|
|
151
|
+
import { Button } from "@xsolla/xui-button";
|
|
115
152
|
|
|
116
153
|
export default function Delays() {
|
|
117
154
|
return (
|
|
118
|
-
<div style={{ display:
|
|
119
|
-
<Tooltip content="Appears immediately" delayEnter={0}
|
|
120
|
-
|
|
121
|
-
|
|
155
|
+
<div style={{ display: "flex", gap: 16 }}>
|
|
156
|
+
<Tooltip content="Appears immediately" delayEnter={0}>
|
|
157
|
+
<Button variant="secondary">No delay</Button>
|
|
158
|
+
</Tooltip>
|
|
159
|
+
<Tooltip content="Appears after 500ms" delayEnter={500}>
|
|
160
|
+
<Button variant="secondary">500ms enter</Button>
|
|
161
|
+
</Tooltip>
|
|
162
|
+
<Tooltip content="Stays for 500ms" delayLeave={500}>
|
|
163
|
+
<Button variant="secondary">Slow hide</Button>
|
|
164
|
+
</Tooltip>
|
|
122
165
|
</div>
|
|
123
166
|
);
|
|
124
167
|
}
|
|
@@ -127,15 +170,15 @@ export default function Delays() {
|
|
|
127
170
|
### Rich content
|
|
128
171
|
|
|
129
172
|
```tsx
|
|
130
|
-
import * as React from
|
|
131
|
-
import { Tooltip } from
|
|
132
|
-
import { Avatar } from
|
|
173
|
+
import * as React from "react";
|
|
174
|
+
import { Tooltip } from "@xsolla/xui-tooltip";
|
|
175
|
+
import { Avatar } from "@xsolla/xui-avatar";
|
|
133
176
|
|
|
134
177
|
export default function Rich() {
|
|
135
178
|
return (
|
|
136
179
|
<Tooltip
|
|
137
180
|
content={
|
|
138
|
-
<div style={{ textAlign:
|
|
181
|
+
<div style={{ textAlign: "center" }}>
|
|
139
182
|
<strong>John Doe</strong>
|
|
140
183
|
<br />
|
|
141
184
|
<span style={{ opacity: 0.7 }}>Senior Developer</span>
|
|
@@ -151,16 +194,22 @@ export default function Rich() {
|
|
|
151
194
|
### Icons with tooltip
|
|
152
195
|
|
|
153
196
|
```tsx
|
|
154
|
-
import * as React from
|
|
155
|
-
import { Tooltip } from
|
|
156
|
-
import { Edit, TrashCan, MoreHr } from
|
|
197
|
+
import * as React from "react";
|
|
198
|
+
import { Tooltip } from "@xsolla/xui-tooltip";
|
|
199
|
+
import { Edit, TrashCan, MoreHr } from "@xsolla/xui-icons-base";
|
|
157
200
|
|
|
158
201
|
export default function Icons() {
|
|
159
202
|
return (
|
|
160
|
-
<div style={{ display:
|
|
161
|
-
<Tooltip content="Edit item"
|
|
162
|
-
|
|
163
|
-
|
|
203
|
+
<div style={{ display: "flex", gap: 16 }}>
|
|
204
|
+
<Tooltip content="Edit item">
|
|
205
|
+
<Edit style={{ cursor: "pointer" }} />
|
|
206
|
+
</Tooltip>
|
|
207
|
+
<Tooltip content="Delete item">
|
|
208
|
+
<TrashCan style={{ cursor: "pointer" }} />
|
|
209
|
+
</Tooltip>
|
|
210
|
+
<Tooltip content="More options">
|
|
211
|
+
<MoreHr style={{ cursor: "pointer" }} />
|
|
212
|
+
</Tooltip>
|
|
164
213
|
</div>
|
|
165
214
|
);
|
|
166
215
|
}
|
|
@@ -169,18 +218,20 @@ export default function Icons() {
|
|
|
169
218
|
### Controlled visibility
|
|
170
219
|
|
|
171
220
|
```tsx
|
|
172
|
-
import * as React from
|
|
173
|
-
import { Tooltip } from
|
|
174
|
-
import { Button } from
|
|
221
|
+
import * as React from "react";
|
|
222
|
+
import { Tooltip } from "@xsolla/xui-tooltip";
|
|
223
|
+
import { Button } from "@xsolla/xui-button";
|
|
175
224
|
|
|
176
225
|
export default function Controlled() {
|
|
177
226
|
const [visible, setVisible] = React.useState(false);
|
|
178
227
|
return (
|
|
179
|
-
<div style={{ display:
|
|
228
|
+
<div style={{ display: "flex", gap: 16 }}>
|
|
180
229
|
<Tooltip content="I'm controlled" controlledVisible={visible}>
|
|
181
230
|
<Button variant="secondary">Target</Button>
|
|
182
231
|
</Tooltip>
|
|
183
|
-
<Button onPress={() => setVisible((v) => !v)}>
|
|
232
|
+
<Button onPress={() => setVisible((v) => !v)}>
|
|
233
|
+
{visible ? "Hide" : "Show"}
|
|
234
|
+
</Button>
|
|
184
235
|
</div>
|
|
185
236
|
);
|
|
186
237
|
}
|
|
@@ -191,9 +242,9 @@ export default function Controlled() {
|
|
|
191
242
|
`disabled` elements do not emit pointer events; wrap them so the tooltip can still register hover.
|
|
192
243
|
|
|
193
244
|
```tsx
|
|
194
|
-
import * as React from
|
|
195
|
-
import { Tooltip } from
|
|
196
|
-
import { Button } from
|
|
245
|
+
import * as React from "react";
|
|
246
|
+
import { Tooltip } from "@xsolla/xui-tooltip";
|
|
247
|
+
import { Button } from "@xsolla/xui-button";
|
|
197
248
|
|
|
198
249
|
export default function DisabledTrigger() {
|
|
199
250
|
return (
|
package/native/index.d.mts
CHANGED
|
@@ -42,6 +42,8 @@ interface TooltipProps {
|
|
|
42
42
|
style?: any;
|
|
43
43
|
"data-testid"?: string;
|
|
44
44
|
className?: string;
|
|
45
|
+
/** Test ID for testing frameworks */
|
|
46
|
+
testID?: string;
|
|
45
47
|
}
|
|
46
48
|
|
|
47
49
|
declare const Tooltip: React.ForwardRefExoticComponent<TooltipProps & ThemeOverrideProps & React.RefAttributes<any>>;
|
package/native/index.d.ts
CHANGED
|
@@ -42,6 +42,8 @@ interface TooltipProps {
|
|
|
42
42
|
style?: any;
|
|
43
43
|
"data-testid"?: string;
|
|
44
44
|
className?: string;
|
|
45
|
+
/** Test ID for testing frameworks */
|
|
46
|
+
testID?: string;
|
|
45
47
|
}
|
|
46
48
|
|
|
47
49
|
declare const Tooltip: React.ForwardRefExoticComponent<TooltipProps & ThemeOverrideProps & React.RefAttributes<any>>;
|
package/native/index.js
CHANGED
|
@@ -228,6 +228,8 @@ var Text = ({
|
|
|
228
228
|
numberOfLines,
|
|
229
229
|
id,
|
|
230
230
|
role,
|
|
231
|
+
testID,
|
|
232
|
+
"data-testid": dataTestId,
|
|
231
233
|
style: styleProp,
|
|
232
234
|
...props
|
|
233
235
|
}) => {
|
|
@@ -257,7 +259,7 @@ var Text = ({
|
|
|
257
259
|
{
|
|
258
260
|
style: baseStyle,
|
|
259
261
|
numberOfLines,
|
|
260
|
-
testID: id,
|
|
262
|
+
testID: dataTestId || testID || id,
|
|
261
263
|
accessibilityRole,
|
|
262
264
|
children
|
|
263
265
|
}
|
|
@@ -397,6 +399,7 @@ var Tooltip = (0, import_react.forwardRef)(
|
|
|
397
399
|
style,
|
|
398
400
|
"data-testid": dataTestId,
|
|
399
401
|
className,
|
|
402
|
+
testID,
|
|
400
403
|
themeMode,
|
|
401
404
|
themeProductContext
|
|
402
405
|
}, ref) => {
|
|
@@ -491,6 +494,7 @@ var Tooltip = (0, import_react.forwardRef)(
|
|
|
491
494
|
return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
|
|
492
495
|
Box,
|
|
493
496
|
{
|
|
497
|
+
testID,
|
|
494
498
|
ref: triggerRef,
|
|
495
499
|
position: "relative",
|
|
496
500
|
display: "inline-flex",
|
package/native/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/index.tsx","../../src/Tooltip.tsx","../../../../foundation/primitives-native/src/Box.tsx","../../../../foundation/primitives-native/src/Text.tsx","../../src/Portal.native.tsx"],"sourcesContent":["export * from \"./Tooltip\";\nexport * from \"./types\";\n","import React, { forwardRef, useState, useMemo, useEffect, useRef } from \"react\";\n// @ts-expect-error - this will be resolved at build time\nimport { Box, Text } from \"@xsolla/xui-primitives\";\nimport {\n useResolvedTheme,\n useId,\n isNative,\n useModalId,\n type ThemeOverrideProps,\n} from \"@xsolla/xui-core\";\nimport type { TooltipPlacement, TooltipProps, TooltipSize } from \"./types\";\nimport { Portal } from \"./Portal\";\n\nconst getPositionStyles = (\n triggerRect: DOMRect,\n placement: TooltipPlacement,\n offset: number,\n isVisible: boolean\n) => {\n const slideDistance = 8;\n const scale = isVisible ? \"scale(1)\" : \"scale(0.95)\";\n const slideOffset = isVisible ? 0 : -slideDistance;\n\n switch (placement) {\n case \"top\":\n return {\n top: triggerRect.top - offset,\n left: triggerRect.left + triggerRect.width / 2,\n transform: `translateX(-50%) translateY(calc(-100% - ${slideOffset}px)) ${scale}`,\n };\n case \"top-left\":\n return {\n top: triggerRect.top - offset,\n left: triggerRect.right,\n transform: `translateX(-100%) translateY(calc(-100% - ${slideOffset}px)) ${scale}`,\n };\n case \"top-right\":\n return {\n top: triggerRect.top - offset,\n left: triggerRect.left,\n transform: `translateY(calc(-100% - ${slideOffset}px)) ${scale}`,\n };\n case \"bottom\":\n return {\n top: triggerRect.bottom + offset,\n left: triggerRect.left + triggerRect.width / 2,\n transform: `translateX(-50%) translateY(${slideOffset}px) ${scale}`,\n };\n case \"bottom-left\":\n return {\n top: triggerRect.bottom + offset,\n left: triggerRect.right,\n transform: `translateX(-100%) translateY(${slideOffset}px) ${scale}`,\n };\n case \"bottom-right\":\n return {\n top: triggerRect.bottom + offset,\n left: triggerRect.left,\n transform: `translateY(${slideOffset}px) ${scale}`,\n };\n case \"left\":\n return {\n top: triggerRect.top + triggerRect.height / 2,\n left: triggerRect.left - offset,\n transform: `translateX(calc(-100% - ${slideOffset}px)) translateY(-50%) ${scale}`,\n };\n case \"right\":\n return {\n top: triggerRect.top + triggerRect.height / 2,\n left: triggerRect.right + offset,\n transform: `translateX(${slideOffset}px) translateY(-50%) ${scale}`,\n };\n default:\n return {\n top: triggerRect.top - offset,\n left: triggerRect.left,\n transform: `translateY(calc(-100% - ${slideOffset}px)) ${scale}`,\n };\n }\n};\n\nconst getTypoStyles = (size: TooltipSize) => {\n switch (size) {\n case \"sm\":\n return { fontSize: 14, lineHeight: \"16px\" };\n case \"md\":\n return { fontSize: 16, lineHeight: \"18px\" };\n case \"lg\":\n return { fontSize: 18, lineHeight: \"20px\" };\n case \"xl\":\n return { fontSize: 20, lineHeight: \"22px\" };\n default:\n return { fontSize: 16, lineHeight: \"18px\" };\n }\n};\n\nconst getBorderRadius = (size: TooltipSize) => {\n switch (size) {\n case \"sm\":\n return 4;\n case \"md\":\n case \"lg\":\n case \"xl\":\n return 8;\n default:\n return 8;\n }\n};\n\nconst getArrowStyles = (placement: TooltipPlacement) => {\n const ARROW_SIZE = 10;\n const ARROW_HALF = ARROW_SIZE / 2;\n const ARROW_EDGE_OFFSET = 12;\n\n const base: React.CSSProperties = {\n width: ARROW_SIZE,\n height: ARROW_SIZE,\n transform: \"rotate(45deg)\",\n borderRadius: 1,\n };\n\n const placementStyles: Record<TooltipPlacement, React.CSSProperties> = {\n top: { bottom: -ARROW_HALF, left: \"50%\", marginLeft: -ARROW_HALF },\n \"top-left\": { bottom: -ARROW_HALF, right: ARROW_EDGE_OFFSET },\n \"top-right\": { bottom: -ARROW_HALF, left: ARROW_EDGE_OFFSET },\n\n bottom: { top: -ARROW_HALF, left: \"50%\", marginLeft: -ARROW_HALF },\n \"bottom-left\": { top: -ARROW_HALF, right: ARROW_EDGE_OFFSET },\n \"bottom-right\": { top: -ARROW_HALF, left: ARROW_EDGE_OFFSET },\n\n left: { right: -ARROW_HALF, top: \"50%\", marginTop: -ARROW_HALF },\n right: { left: -ARROW_HALF, top: \"50%\", marginTop: -ARROW_HALF },\n };\n\n return { ...base, ...placementStyles[placement] };\n};\n\nexport const Tooltip = forwardRef<any, TooltipProps & ThemeOverrideProps>(\n (\n {\n content,\n children,\n size = \"md\",\n delayEnter = 0,\n delayLeave = 0,\n offset = 12,\n placement = \"top\",\n controlledVisible,\n style,\n \"data-testid\": dataTestId,\n className,\n themeMode,\n themeProductContext,\n },\n ref\n ) => {\n const [isHovered, setIsHovered] = useState(false);\n const [triggerRect, setTriggerRect] = useState<DOMRect | null>(null);\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n const enterTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const leaveTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const rafRef = useRef<number | null>(null);\n const triggerRef = useRef<HTMLDivElement>(null);\n const tooltipId = useId();\n const modalId = useModalId();\n\n const isVisible =\n controlledVisible !== undefined ? controlledVisible : isHovered;\n\n const positionStyles = useMemo(\n () =>\n triggerRect\n ? getPositionStyles(triggerRect, placement, offset, isVisible)\n : { top: 0, left: 0 },\n [triggerRect, placement, offset, isVisible]\n );\n const typoStyles = useMemo(() => getTypoStyles(size), [size]);\n const borderRadius = useMemo(() => getBorderRadius(size), [size]);\n const arrowStyles = useMemo(() => getArrowStyles(placement), [placement]);\n\n // Update trigger position when tooltip becomes visible and on scroll/resize\n useEffect(() => {\n if (!isVisible || isNative) return;\n\n const updatePosition = () => {\n if (triggerRef.current) {\n setTriggerRect(triggerRef.current.getBoundingClientRect());\n }\n };\n\n updatePosition();\n\n window.addEventListener(\"scroll\", updatePosition, true);\n window.addEventListener(\"resize\", updatePosition);\n\n return () => {\n window.removeEventListener(\"scroll\", updatePosition, true);\n window.removeEventListener(\"resize\", updatePosition);\n };\n }, [isVisible]);\n\n const showTooltip = () => {\n if (leaveTimeoutRef.current) {\n clearTimeout(leaveTimeoutRef.current);\n leaveTimeoutRef.current = null;\n }\n\n // Update position before showing to prevent pop-in\n if (triggerRef.current) {\n setTriggerRect(triggerRef.current.getBoundingClientRect());\n\n // Double RAF to ensure position is rendered before showing tooltip\n rafRef.current = requestAnimationFrame(() => {\n rafRef.current = requestAnimationFrame(() => {\n if (delayEnter > 0) {\n enterTimeoutRef.current = setTimeout(() => {\n setIsHovered(true);\n }, delayEnter);\n } else {\n setIsHovered(true);\n }\n });\n });\n }\n };\n\n const hideTooltip = () => {\n if (enterTimeoutRef.current) {\n clearTimeout(enterTimeoutRef.current);\n enterTimeoutRef.current = null;\n }\n\n if (rafRef.current) {\n cancelAnimationFrame(rafRef.current);\n rafRef.current = null;\n }\n\n if (delayLeave > 0) {\n leaveTimeoutRef.current = setTimeout(() => {\n setIsHovered(false);\n }, delayLeave);\n } else {\n setIsHovered(false);\n }\n };\n\n useEffect(() => {\n if (isNative) return;\n\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === \"Escape\" && isVisible) {\n if (enterTimeoutRef.current) {\n clearTimeout(enterTimeoutRef.current);\n enterTimeoutRef.current = null;\n }\n setIsHovered(false);\n }\n };\n\n document.addEventListener(\"keydown\", handleEscape);\n\n return () => {\n document.removeEventListener(\"keydown\", handleEscape);\n if (enterTimeoutRef.current) clearTimeout(enterTimeoutRef.current);\n if (leaveTimeoutRef.current) clearTimeout(leaveTimeoutRef.current);\n if (rafRef.current) cancelAnimationFrame(rafRef.current);\n };\n }, [isVisible]);\n\n return (\n <Box\n ref={triggerRef}\n position=\"relative\"\n display=\"inline-flex\"\n onMouseEnter={showTooltip}\n onMouseLeave={hideTooltip}\n onFocus={showTooltip}\n onBlur={hideTooltip}\n className={className}\n style={{ height: \"fit-content\" }}\n aria-describedby={isVisible ? tooltipId : undefined}\n >\n {children}\n {!isNative && triggerRect && (\n <Portal>\n <Box\n ref={ref}\n data-testid={dataTestId}\n data-modal-id={modalId}\n position=\"fixed\"\n backgroundColor={theme.colors.background.primary}\n borderRadius={borderRadius}\n paddingVertical={8}\n paddingHorizontal={12}\n zIndex={2000}\n id={tooltipId}\n role=\"tooltip\"\n aria-hidden={!isVisible}\n style={{\n ...positionStyles,\n // https://stackoverflow.com/questions/62844007/how-to-apply-tool-tip-arrow-triangle-shadow\n filter:\n \"drop-shadow(0 6px 10px rgba(7, 7, 8, 0.1)) drop-shadow(0 2px 3px rgba(7, 7, 8, 0.2))\",\n WebkitFilter:\n \"drop-shadow(0 6px 10px rgba(7, 7, 8, 0.1)) drop-shadow(0 2px 3px rgba(7, 7, 8, 0.2))\",\n opacity: isVisible ? 1 : 0,\n visibility: isVisible ? \"visible\" : \"hidden\",\n transition:\n \"opacity 150ms cubic-bezier(.4,0,.2,1), transform 150ms cubic-bezier(.4,0,.2,1), visibility 150ms cubic-bezier(.4,0,.2,1)\",\n pointerEvents: \"none\",\n whiteSpace: \"normal\",\n width: \"max-content\",\n overflow: \"visible\",\n willChange: isVisible ? \"transform, opacity\" : \"auto\", // optimize rendering and ensure more stable positioning\n ...style,\n }}\n >\n <Box\n position=\"absolute\"\n backgroundColor={theme.colors.background.primary}\n style={{\n ...arrowStyles,\n backfaceVisibility: \"hidden\",\n WebkitBackfaceVisibility: \"hidden\",\n }}\n />\n <Box\n style={{\n wordWrap: \"break-word\",\n overflowWrap: \"break-word\",\n maxWidth: \"100%\",\n whiteSpace: \"normal\",\n }}\n >\n {typeof content === \"string\" || typeof content === \"number\" ? (\n <Text\n color={theme.colors.content.primary}\n fontSize={typoStyles.fontSize}\n fontWeight=\"400\"\n style={{ lineHeight: typoStyles.lineHeight }}\n >\n {content}\n </Text>\n ) : (\n content\n )}\n </Box>\n </Box>\n </Portal>\n )}\n </Box>\n );\n }\n);\n\nTooltip.displayName = \"Tooltip\";\n","import React from \"react\";\nimport {\n View,\n Pressable,\n Image,\n ViewStyle,\n ImageStyle,\n DimensionValue,\n AnimatableNumericValue,\n} from \"react-native\";\nimport { BoxProps } from \"@xsolla/xui-primitives-core\";\n\nexport const Box: React.FC<BoxProps> = ({\n children,\n onPress,\n onLayout,\n onMoveShouldSetResponder,\n onResponderGrant,\n onResponderMove,\n onResponderRelease,\n onResponderTerminate,\n backgroundColor,\n borderColor,\n borderWidth,\n borderBottomWidth,\n borderBottomColor,\n borderTopWidth,\n borderTopColor,\n borderLeftWidth,\n borderLeftColor,\n borderRightWidth,\n borderRightColor,\n borderRadius,\n borderStyle,\n height,\n padding,\n paddingHorizontal,\n paddingVertical,\n margin,\n marginTop,\n marginBottom,\n marginLeft,\n marginRight,\n flexDirection,\n alignItems,\n justifyContent,\n position,\n top,\n bottom,\n left,\n right,\n width,\n minWidth,\n minHeight,\n maxWidth,\n maxHeight,\n flex,\n overflow,\n zIndex,\n hoverStyle,\n pressStyle,\n style,\n \"data-testid\": dataTestId,\n testID,\n as,\n src,\n alt,\n ...rest\n}) => {\n const getContainerStyle = (pressed?: boolean): ViewStyle => ({\n backgroundColor:\n pressed && pressStyle?.backgroundColor\n ? pressStyle.backgroundColor\n : backgroundColor,\n borderColor,\n borderWidth,\n borderBottomWidth,\n borderBottomColor,\n borderTopWidth,\n borderTopColor,\n borderLeftWidth,\n borderLeftColor,\n borderRightWidth,\n borderRightColor,\n borderRadius: borderRadius as AnimatableNumericValue,\n borderStyle: borderStyle as ViewStyle[\"borderStyle\"],\n overflow,\n zIndex,\n height: height as DimensionValue,\n width: width as DimensionValue,\n minWidth: minWidth as DimensionValue,\n minHeight: minHeight as DimensionValue,\n maxWidth: maxWidth as DimensionValue,\n maxHeight: maxHeight as DimensionValue,\n padding: padding as DimensionValue,\n paddingHorizontal: paddingHorizontal as DimensionValue,\n paddingVertical: paddingVertical as DimensionValue,\n margin: margin as DimensionValue,\n marginTop: marginTop as DimensionValue,\n marginBottom: marginBottom as DimensionValue,\n marginLeft: marginLeft as DimensionValue,\n marginRight: marginRight as DimensionValue,\n flexDirection,\n alignItems,\n justifyContent,\n position: position as ViewStyle[\"position\"],\n top: top as DimensionValue,\n bottom: bottom as DimensionValue,\n left: left as DimensionValue,\n right: right as DimensionValue,\n flex,\n ...(style as ViewStyle),\n });\n\n const finalTestID = dataTestId || testID;\n\n // Destructure and drop web-only props from rest before passing to RN components\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const {\n role,\n tabIndex,\n onKeyDown,\n onKeyUp,\n \"aria-label\": _ariaLabel,\n \"aria-labelledby\": _ariaLabelledBy,\n \"aria-current\": _ariaCurrent,\n \"aria-disabled\": _ariaDisabled,\n \"aria-live\": _ariaLive,\n className,\n \"data-testid\": _dataTestId,\n ...nativeRest\n } = rest as Record<string, unknown>;\n\n // Handle as=\"img\" for React Native\n if (as === \"img\" && src) {\n const imageStyle: ImageStyle = {\n width: width as DimensionValue,\n height: height as DimensionValue,\n borderRadius: borderRadius as number,\n position: position as ImageStyle[\"position\"],\n top: top as DimensionValue,\n bottom: bottom as DimensionValue,\n left: left as DimensionValue,\n right: right as DimensionValue,\n ...(style as ImageStyle),\n };\n\n return (\n <Image\n source={{ uri: src }}\n style={imageStyle}\n testID={finalTestID}\n resizeMode=\"cover\"\n {...nativeRest}\n />\n );\n }\n\n if (onPress) {\n return (\n <Pressable\n onPress={onPress}\n onLayout={onLayout}\n onMoveShouldSetResponder={onMoveShouldSetResponder}\n onResponderGrant={onResponderGrant}\n onResponderMove={onResponderMove}\n onResponderRelease={onResponderRelease}\n onResponderTerminate={onResponderTerminate}\n style={({ pressed }) => getContainerStyle(pressed)}\n testID={finalTestID}\n {...nativeRest}\n >\n {children}\n </Pressable>\n );\n }\n\n return (\n <View\n style={getContainerStyle()}\n testID={finalTestID}\n onLayout={onLayout}\n onMoveShouldSetResponder={onMoveShouldSetResponder}\n onResponderGrant={onResponderGrant}\n onResponderMove={onResponderMove}\n onResponderRelease={onResponderRelease}\n onResponderTerminate={onResponderTerminate}\n {...nativeRest}\n >\n {children}\n </View>\n );\n};\n","import React from \"react\";\nimport {\n Text as RNText,\n TextStyle,\n AccessibilityRole,\n StyleSheet,\n} from \"react-native\";\nimport { TextProps } from \"@xsolla/xui-primitives-core\";\n\nconst roleMap: Record<string, AccessibilityRole> = {\n alert: \"alert\",\n heading: \"header\",\n button: \"button\",\n link: \"link\",\n text: \"text\",\n};\n\nconst parseNumericValue = (\n value: string | number | undefined\n): number | undefined => {\n if (value === undefined) return undefined;\n if (typeof value === \"number\") return value;\n const parsed = parseFloat(value);\n return isNaN(parsed) ? undefined : parsed;\n};\n\nexport const Text: React.FC<TextProps> = ({\n children,\n color,\n fontSize,\n fontWeight,\n fontFamily,\n textAlign,\n lineHeight,\n numberOfLines,\n id,\n role,\n 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={id}\n accessibilityRole={accessibilityRole}\n >\n {children}\n </RNText>\n );\n};\n","import { ReactNode } from \"react\";\n\ninterface PortalProps {\n children: ReactNode;\n}\n\n// Portal not supported on React Native - tooltip content renders inline\nexport const Portal = ({ children }: PortalProps) => {\n return <>{children}</>;\n};\n"],"mappings":"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","names":["import_react_native","import_jsx_runtime","RNText","import_jsx_runtime","import_jsx_runtime"]}
|
|
1
|
+
{"version":3,"sources":["../../src/index.tsx","../../src/Tooltip.tsx","../../../../foundation/primitives-native/src/Box.tsx","../../../../foundation/primitives-native/src/Text.tsx","../../src/Portal.native.tsx"],"sourcesContent":["export * from \"./Tooltip\";\nexport * from \"./types\";\n","import React, { forwardRef, useState, useMemo, useEffect, useRef } from \"react\";\n// @ts-expect-error - this will be resolved at build time\nimport { Box, Text } from \"@xsolla/xui-primitives\";\nimport {\n useResolvedTheme,\n useId,\n isNative,\n useModalId,\n type ThemeOverrideProps,\n} from \"@xsolla/xui-core\";\nimport type { TooltipPlacement, TooltipProps, TooltipSize } from \"./types\";\nimport { Portal } from \"./Portal\";\n\nconst getPositionStyles = (\n triggerRect: DOMRect,\n placement: TooltipPlacement,\n offset: number,\n isVisible: boolean\n) => {\n const slideDistance = 8;\n const scale = isVisible ? \"scale(1)\" : \"scale(0.95)\";\n const slideOffset = isVisible ? 0 : -slideDistance;\n\n switch (placement) {\n case \"top\":\n return {\n top: triggerRect.top - offset,\n left: triggerRect.left + triggerRect.width / 2,\n transform: `translateX(-50%) translateY(calc(-100% - ${slideOffset}px)) ${scale}`,\n };\n case \"top-left\":\n return {\n top: triggerRect.top - offset,\n left: triggerRect.right,\n transform: `translateX(-100%) translateY(calc(-100% - ${slideOffset}px)) ${scale}`,\n };\n case \"top-right\":\n return {\n top: triggerRect.top - offset,\n left: triggerRect.left,\n transform: `translateY(calc(-100% - ${slideOffset}px)) ${scale}`,\n };\n case \"bottom\":\n return {\n top: triggerRect.bottom + offset,\n left: triggerRect.left + triggerRect.width / 2,\n transform: `translateX(-50%) translateY(${slideOffset}px) ${scale}`,\n };\n case \"bottom-left\":\n return {\n top: triggerRect.bottom + offset,\n left: triggerRect.right,\n transform: `translateX(-100%) translateY(${slideOffset}px) ${scale}`,\n };\n case \"bottom-right\":\n return {\n top: triggerRect.bottom + offset,\n left: triggerRect.left,\n transform: `translateY(${slideOffset}px) ${scale}`,\n };\n case \"left\":\n return {\n top: triggerRect.top + triggerRect.height / 2,\n left: triggerRect.left - offset,\n transform: `translateX(calc(-100% - ${slideOffset}px)) translateY(-50%) ${scale}`,\n };\n case \"right\":\n return {\n top: triggerRect.top + triggerRect.height / 2,\n left: triggerRect.right + offset,\n transform: `translateX(${slideOffset}px) translateY(-50%) ${scale}`,\n };\n default:\n return {\n top: triggerRect.top - offset,\n left: triggerRect.left,\n transform: `translateY(calc(-100% - ${slideOffset}px)) ${scale}`,\n };\n }\n};\n\nconst getTypoStyles = (size: TooltipSize) => {\n switch (size) {\n case \"sm\":\n return { fontSize: 14, lineHeight: \"16px\" };\n case \"md\":\n return { fontSize: 16, lineHeight: \"18px\" };\n case \"lg\":\n return { fontSize: 18, lineHeight: \"20px\" };\n case \"xl\":\n return { fontSize: 20, lineHeight: \"22px\" };\n default:\n return { fontSize: 16, lineHeight: \"18px\" };\n }\n};\n\nconst getBorderRadius = (size: TooltipSize) => {\n switch (size) {\n case \"sm\":\n return 4;\n case \"md\":\n case \"lg\":\n case \"xl\":\n return 8;\n default:\n return 8;\n }\n};\n\nconst getArrowStyles = (placement: TooltipPlacement) => {\n const ARROW_SIZE = 10;\n const ARROW_HALF = ARROW_SIZE / 2;\n const ARROW_EDGE_OFFSET = 12;\n\n const base: React.CSSProperties = {\n width: ARROW_SIZE,\n height: ARROW_SIZE,\n transform: \"rotate(45deg)\",\n borderRadius: 1,\n };\n\n const placementStyles: Record<TooltipPlacement, React.CSSProperties> = {\n top: { bottom: -ARROW_HALF, left: \"50%\", marginLeft: -ARROW_HALF },\n \"top-left\": { bottom: -ARROW_HALF, right: ARROW_EDGE_OFFSET },\n \"top-right\": { bottom: -ARROW_HALF, left: ARROW_EDGE_OFFSET },\n\n bottom: { top: -ARROW_HALF, left: \"50%\", marginLeft: -ARROW_HALF },\n \"bottom-left\": { top: -ARROW_HALF, right: ARROW_EDGE_OFFSET },\n \"bottom-right\": { top: -ARROW_HALF, left: ARROW_EDGE_OFFSET },\n\n left: { right: -ARROW_HALF, top: \"50%\", marginTop: -ARROW_HALF },\n right: { left: -ARROW_HALF, top: \"50%\", marginTop: -ARROW_HALF },\n };\n\n return { ...base, ...placementStyles[placement] };\n};\n\nexport const Tooltip = forwardRef<any, TooltipProps & ThemeOverrideProps>(\n (\n {\n content,\n children,\n size = \"md\",\n delayEnter = 0,\n delayLeave = 0,\n offset = 12,\n placement = \"top\",\n controlledVisible,\n style,\n \"data-testid\": dataTestId,\n className,\n testID,\n themeMode,\n themeProductContext,\n },\n ref\n ) => {\n const [isHovered, setIsHovered] = useState(false);\n const [triggerRect, setTriggerRect] = useState<DOMRect | null>(null);\n const { theme } = useResolvedTheme({ themeMode, themeProductContext });\n const enterTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const leaveTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const rafRef = useRef<number | null>(null);\n const triggerRef = useRef<HTMLDivElement>(null);\n const tooltipId = useId();\n const modalId = useModalId();\n\n const isVisible =\n controlledVisible !== undefined ? controlledVisible : isHovered;\n\n const positionStyles = useMemo(\n () =>\n triggerRect\n ? getPositionStyles(triggerRect, placement, offset, isVisible)\n : { top: 0, left: 0 },\n [triggerRect, placement, offset, isVisible]\n );\n const typoStyles = useMemo(() => getTypoStyles(size), [size]);\n const borderRadius = useMemo(() => getBorderRadius(size), [size]);\n const arrowStyles = useMemo(() => getArrowStyles(placement), [placement]);\n\n // Update trigger position when tooltip becomes visible and on scroll/resize\n useEffect(() => {\n if (!isVisible || isNative) return;\n\n const updatePosition = () => {\n if (triggerRef.current) {\n setTriggerRect(triggerRef.current.getBoundingClientRect());\n }\n };\n\n updatePosition();\n\n window.addEventListener(\"scroll\", updatePosition, true);\n window.addEventListener(\"resize\", updatePosition);\n\n return () => {\n window.removeEventListener(\"scroll\", updatePosition, true);\n window.removeEventListener(\"resize\", updatePosition);\n };\n }, [isVisible]);\n\n const showTooltip = () => {\n if (leaveTimeoutRef.current) {\n clearTimeout(leaveTimeoutRef.current);\n leaveTimeoutRef.current = null;\n }\n\n // Update position before showing to prevent pop-in\n if (triggerRef.current) {\n setTriggerRect(triggerRef.current.getBoundingClientRect());\n\n // Double RAF to ensure position is rendered before showing tooltip\n rafRef.current = requestAnimationFrame(() => {\n rafRef.current = requestAnimationFrame(() => {\n if (delayEnter > 0) {\n enterTimeoutRef.current = setTimeout(() => {\n setIsHovered(true);\n }, delayEnter);\n } else {\n setIsHovered(true);\n }\n });\n });\n }\n };\n\n const hideTooltip = () => {\n if (enterTimeoutRef.current) {\n clearTimeout(enterTimeoutRef.current);\n enterTimeoutRef.current = null;\n }\n\n if (rafRef.current) {\n cancelAnimationFrame(rafRef.current);\n rafRef.current = null;\n }\n\n if (delayLeave > 0) {\n leaveTimeoutRef.current = setTimeout(() => {\n setIsHovered(false);\n }, delayLeave);\n } else {\n setIsHovered(false);\n }\n };\n\n useEffect(() => {\n if (isNative) return;\n\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === \"Escape\" && isVisible) {\n if (enterTimeoutRef.current) {\n clearTimeout(enterTimeoutRef.current);\n enterTimeoutRef.current = null;\n }\n setIsHovered(false);\n }\n };\n\n document.addEventListener(\"keydown\", handleEscape);\n\n return () => {\n document.removeEventListener(\"keydown\", handleEscape);\n if (enterTimeoutRef.current) clearTimeout(enterTimeoutRef.current);\n if (leaveTimeoutRef.current) clearTimeout(leaveTimeoutRef.current);\n if (rafRef.current) cancelAnimationFrame(rafRef.current);\n };\n }, [isVisible]);\n\n return (\n <Box\n testID={testID}\n ref={triggerRef}\n position=\"relative\"\n display=\"inline-flex\"\n onMouseEnter={showTooltip}\n onMouseLeave={hideTooltip}\n onFocus={showTooltip}\n onBlur={hideTooltip}\n className={className}\n style={{ height: \"fit-content\" }}\n aria-describedby={isVisible ? tooltipId : undefined}\n >\n {children}\n {!isNative && triggerRect && (\n <Portal>\n <Box\n ref={ref}\n data-testid={dataTestId}\n data-modal-id={modalId}\n position=\"fixed\"\n backgroundColor={theme.colors.background.primary}\n borderRadius={borderRadius}\n paddingVertical={8}\n paddingHorizontal={12}\n zIndex={2000}\n id={tooltipId}\n role=\"tooltip\"\n aria-hidden={!isVisible}\n style={{\n ...positionStyles,\n // https://stackoverflow.com/questions/62844007/how-to-apply-tool-tip-arrow-triangle-shadow\n filter:\n \"drop-shadow(0 6px 10px rgba(7, 7, 8, 0.1)) drop-shadow(0 2px 3px rgba(7, 7, 8, 0.2))\",\n WebkitFilter:\n \"drop-shadow(0 6px 10px rgba(7, 7, 8, 0.1)) drop-shadow(0 2px 3px rgba(7, 7, 8, 0.2))\",\n opacity: isVisible ? 1 : 0,\n visibility: isVisible ? \"visible\" : \"hidden\",\n transition:\n \"opacity 150ms cubic-bezier(.4,0,.2,1), transform 150ms cubic-bezier(.4,0,.2,1), visibility 150ms cubic-bezier(.4,0,.2,1)\",\n pointerEvents: \"none\",\n whiteSpace: \"normal\",\n width: \"max-content\",\n overflow: \"visible\",\n willChange: isVisible ? \"transform, opacity\" : \"auto\", // optimize rendering and ensure more stable positioning\n ...style,\n }}\n >\n <Box\n position=\"absolute\"\n backgroundColor={theme.colors.background.primary}\n style={{\n ...arrowStyles,\n backfaceVisibility: \"hidden\",\n WebkitBackfaceVisibility: \"hidden\",\n }}\n />\n <Box\n style={{\n wordWrap: \"break-word\",\n overflowWrap: \"break-word\",\n maxWidth: \"100%\",\n whiteSpace: \"normal\",\n }}\n >\n {typeof content === \"string\" || typeof content === \"number\" ? (\n <Text\n color={theme.colors.content.primary}\n fontSize={typoStyles.fontSize}\n fontWeight=\"400\"\n style={{ lineHeight: typoStyles.lineHeight }}\n >\n {content}\n </Text>\n ) : (\n content\n )}\n </Box>\n </Box>\n </Portal>\n )}\n </Box>\n );\n }\n);\n\nTooltip.displayName = \"Tooltip\";\n","import React from \"react\";\nimport {\n View,\n Pressable,\n Image,\n ViewStyle,\n ImageStyle,\n DimensionValue,\n AnimatableNumericValue,\n} from \"react-native\";\nimport { BoxProps } from \"@xsolla/xui-primitives-core\";\n\nexport const Box: React.FC<BoxProps> = ({\n children,\n onPress,\n onLayout,\n onMoveShouldSetResponder,\n onResponderGrant,\n onResponderMove,\n onResponderRelease,\n onResponderTerminate,\n backgroundColor,\n borderColor,\n borderWidth,\n borderBottomWidth,\n borderBottomColor,\n borderTopWidth,\n borderTopColor,\n borderLeftWidth,\n borderLeftColor,\n borderRightWidth,\n borderRightColor,\n borderRadius,\n borderStyle,\n height,\n padding,\n paddingHorizontal,\n paddingVertical,\n margin,\n marginTop,\n marginBottom,\n marginLeft,\n marginRight,\n flexDirection,\n alignItems,\n justifyContent,\n position,\n top,\n bottom,\n left,\n right,\n width,\n minWidth,\n minHeight,\n maxWidth,\n maxHeight,\n flex,\n overflow,\n zIndex,\n hoverStyle,\n pressStyle,\n style,\n \"data-testid\": dataTestId,\n testID,\n as,\n src,\n alt,\n ...rest\n}) => {\n const getContainerStyle = (pressed?: boolean): ViewStyle => ({\n backgroundColor:\n pressed && pressStyle?.backgroundColor\n ? pressStyle.backgroundColor\n : backgroundColor,\n borderColor,\n borderWidth,\n borderBottomWidth,\n borderBottomColor,\n borderTopWidth,\n borderTopColor,\n borderLeftWidth,\n borderLeftColor,\n borderRightWidth,\n borderRightColor,\n borderRadius: borderRadius as AnimatableNumericValue,\n borderStyle: borderStyle as ViewStyle[\"borderStyle\"],\n overflow,\n zIndex,\n height: height as DimensionValue,\n width: width as DimensionValue,\n minWidth: minWidth as DimensionValue,\n minHeight: minHeight as DimensionValue,\n maxWidth: maxWidth as DimensionValue,\n maxHeight: maxHeight as DimensionValue,\n padding: padding as DimensionValue,\n paddingHorizontal: paddingHorizontal as DimensionValue,\n paddingVertical: paddingVertical as DimensionValue,\n margin: margin as DimensionValue,\n marginTop: marginTop as DimensionValue,\n marginBottom: marginBottom as DimensionValue,\n marginLeft: marginLeft as DimensionValue,\n marginRight: marginRight as DimensionValue,\n flexDirection,\n alignItems,\n justifyContent,\n position: position as ViewStyle[\"position\"],\n top: top as DimensionValue,\n bottom: bottom as DimensionValue,\n left: left as DimensionValue,\n right: right as DimensionValue,\n flex,\n ...(style as ViewStyle),\n });\n\n const finalTestID = dataTestId || testID;\n\n // Destructure and drop web-only props from rest before passing to RN components\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const {\n role,\n tabIndex,\n onKeyDown,\n onKeyUp,\n \"aria-label\": _ariaLabel,\n \"aria-labelledby\": _ariaLabelledBy,\n \"aria-current\": _ariaCurrent,\n \"aria-disabled\": _ariaDisabled,\n \"aria-live\": _ariaLive,\n className,\n \"data-testid\": _dataTestId,\n ...nativeRest\n } = rest as Record<string, unknown>;\n\n // Handle as=\"img\" for React Native\n if (as === \"img\" && src) {\n const imageStyle: ImageStyle = {\n width: width as DimensionValue,\n height: height as DimensionValue,\n borderRadius: borderRadius as number,\n position: position as ImageStyle[\"position\"],\n top: top as DimensionValue,\n bottom: bottom as DimensionValue,\n left: left as DimensionValue,\n right: right as DimensionValue,\n ...(style as ImageStyle),\n };\n\n return (\n <Image\n source={{ uri: src }}\n style={imageStyle}\n testID={finalTestID}\n resizeMode=\"cover\"\n {...nativeRest}\n />\n );\n }\n\n if (onPress) {\n return (\n <Pressable\n onPress={onPress}\n onLayout={onLayout}\n onMoveShouldSetResponder={onMoveShouldSetResponder}\n onResponderGrant={onResponderGrant}\n onResponderMove={onResponderMove}\n onResponderRelease={onResponderRelease}\n onResponderTerminate={onResponderTerminate}\n style={({ pressed }) => getContainerStyle(pressed)}\n testID={finalTestID}\n {...nativeRest}\n >\n {children}\n </Pressable>\n );\n }\n\n return (\n <View\n style={getContainerStyle()}\n testID={finalTestID}\n onLayout={onLayout}\n onMoveShouldSetResponder={onMoveShouldSetResponder}\n onResponderGrant={onResponderGrant}\n onResponderMove={onResponderMove}\n onResponderRelease={onResponderRelease}\n onResponderTerminate={onResponderTerminate}\n {...nativeRest}\n >\n {children}\n </View>\n );\n};\n","import React from \"react\";\nimport {\n Text as RNText,\n TextStyle,\n AccessibilityRole,\n StyleSheet,\n} from \"react-native\";\nimport { TextProps } from \"@xsolla/xui-primitives-core\";\n\nconst roleMap: Record<string, AccessibilityRole> = {\n alert: \"alert\",\n heading: \"header\",\n button: \"button\",\n link: \"link\",\n text: \"text\",\n};\n\nconst parseNumericValue = (\n value: string | number | undefined\n): number | undefined => {\n if (value === undefined) return undefined;\n if (typeof value === \"number\") return value;\n const parsed = parseFloat(value);\n return isNaN(parsed) ? undefined : parsed;\n};\n\nexport const Text: React.FC<TextProps> = ({\n children,\n color,\n fontSize,\n fontWeight,\n fontFamily,\n textAlign,\n lineHeight,\n numberOfLines,\n id,\n role,\n testID,\n \"data-testid\": dataTestId,\n style: styleProp,\n ...props\n}) => {\n let resolvedFontFamily = fontFamily\n ? fontFamily.split(\",\")[0].replace(/['\"]/g, \"\").trim()\n : undefined;\n\n if (\n resolvedFontFamily === \"Pilat Wide\" ||\n resolvedFontFamily === \"Pilat Wide Bold\" ||\n resolvedFontFamily === \"Aktiv Grotesk\"\n ) {\n resolvedFontFamily = undefined;\n }\n\n const incomingStyle = StyleSheet.flatten(styleProp) as TextStyle | undefined;\n\n const baseStyle: TextStyle = {\n color: color ?? incomingStyle?.color,\n fontSize: typeof fontSize === \"number\" ? fontSize : undefined,\n fontWeight: fontWeight as TextStyle[\"fontWeight\"],\n fontFamily: resolvedFontFamily,\n textDecorationLine: props.textDecoration as TextStyle[\"textDecorationLine\"],\n textAlign: textAlign ?? incomingStyle?.textAlign,\n lineHeight: parseNumericValue(lineHeight ?? incomingStyle?.lineHeight),\n marginTop: parseNumericValue(\n incomingStyle?.marginTop as number | string | undefined\n ),\n marginBottom: parseNumericValue(\n incomingStyle?.marginBottom as number | string | undefined\n ),\n };\n\n const accessibilityRole = role ? roleMap[role] : undefined;\n\n return (\n <RNText\n style={baseStyle}\n numberOfLines={numberOfLines}\n testID={dataTestId || testID || id}\n accessibilityRole={accessibilityRole}\n >\n {children}\n </RNText>\n );\n};\n","import { ReactNode } from \"react\";\n\ninterface PortalProps {\n children: ReactNode;\n}\n\n// Portal not supported on React Native - tooltip content renders inline\nexport const Portal = ({ children }: PortalProps) => {\n return <>{children}</>;\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,mBAAwE;;;ACCxE,0BAQO;AA2ID;AAxIC,IAAM,MAA0B,CAAC;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAM;AACJ,QAAM,oBAAoB,CAAC,aAAkC;AAAA,IAC3D,iBACE,WAAW,YAAY,kBACnB,WAAW,kBACX;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAI;AAAA,EACN;AAEA,QAAM,cAAc,cAAc;AAIlC,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc;AAAA,IACd,mBAAmB;AAAA,IACnB,gBAAgB;AAAA,IAChB,iBAAiB;AAAA,IACjB,aAAa;AAAA,IACb;AAAA,IACA,eAAe;AAAA,IACf,GAAG;AAAA,EACL,IAAI;AAGJ,MAAI,OAAO,SAAS,KAAK;AACvB,UAAM,aAAyB;AAAA,MAC7B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAI;AAAA,IACN;AAEA,WACE;AAAA,MAAC;AAAA;AAAA,QACC,QAAQ,EAAE,KAAK,IAAI;AAAA,QACnB,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,YAAW;AAAA,QACV,GAAG;AAAA;AAAA,IACN;AAAA,EAEJ;AAEA,MAAI,SAAS;AACX,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,OAAO,CAAC,EAAE,QAAQ,MAAM,kBAAkB,OAAO;AAAA,QACjD,QAAQ;AAAA,QACP,GAAG;AAAA,QAEH;AAAA;AAAA,IACH;AAAA,EAEJ;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO,kBAAkB;AAAA,MACzB,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACC,GAAG;AAAA,MAEH;AAAA;AAAA,EACH;AAEJ;;;AC/LA,IAAAA,uBAKO;AAqEH,IAAAC,sBAAA;AAlEJ,IAAM,UAA6C;AAAA,EACjD,OAAO;AAAA,EACP,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,MAAM;AACR;AAEA,IAAM,oBAAoB,CACxB,UACuB;AACvB,MAAI,UAAU,OAAW,QAAO;AAChC,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,QAAM,SAAS,WAAW,KAAK;AAC/B,SAAO,MAAM,MAAM,IAAI,SAAY;AACrC;AAEO,IAAM,OAA4B,CAAC;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf,OAAO;AAAA,EACP,GAAG;AACL,MAAM;AACJ,MAAI,qBAAqB,aACrB,WAAW,MAAM,GAAG,EAAE,CAAC,EAAE,QAAQ,SAAS,EAAE,EAAE,KAAK,IACnD;AAEJ,MACE,uBAAuB,gBACvB,uBAAuB,qBACvB,uBAAuB,iBACvB;AACA,yBAAqB;AAAA,EACvB;AAEA,QAAM,gBAAgB,gCAAW,QAAQ,SAAS;AAElD,QAAM,YAAuB;AAAA,IAC3B,OAAO,SAAS,eAAe;AAAA,IAC/B,UAAU,OAAO,aAAa,WAAW,WAAW;AAAA,IACpD;AAAA,IACA,YAAY;AAAA,IACZ,oBAAoB,MAAM;AAAA,IAC1B,WAAW,aAAa,eAAe;AAAA,IACvC,YAAY,kBAAkB,cAAc,eAAe,UAAU;AAAA,IACrE,WAAW;AAAA,MACT,eAAe;AAAA,IACjB;AAAA,IACA,cAAc;AAAA,MACZ,eAAe;AAAA,IACjB;AAAA,EACF;AAEA,QAAM,oBAAoB,OAAO,QAAQ,IAAI,IAAI;AAEjD,SACE;AAAA,IAAC,qBAAAC;AAAA,IAAA;AAAA,MACC,OAAO;AAAA,MACP;AAAA,MACA,QAAQ,cAAc,UAAU;AAAA,MAChC;AAAA,MAEC;AAAA;AAAA,EACH;AAEJ;;;AFjFA,sBAMO;;;AGDE,IAAAC,sBAAA;AADF,IAAM,SAAS,CAAC,EAAE,SAAS,MAAmB;AACnD,SAAO,6EAAG,UAAS;AACrB;;;AHsRY,IAAAC,sBAAA;AAlRZ,IAAM,oBAAoB,CACxB,aACA,WACA,QACA,cACG;AACH,QAAM,gBAAgB;AACtB,QAAM,QAAQ,YAAY,aAAa;AACvC,QAAM,cAAc,YAAY,IAAI,CAAC;AAErC,UAAQ,WAAW;AAAA,IACjB,KAAK;AACH,aAAO;AAAA,QACL,KAAK,YAAY,MAAM;AAAA,QACvB,MAAM,YAAY,OAAO,YAAY,QAAQ;AAAA,QAC7C,WAAW,4CAA4C,WAAW,QAAQ,KAAK;AAAA,MACjF;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,KAAK,YAAY,MAAM;AAAA,QACvB,MAAM,YAAY;AAAA,QAClB,WAAW,6CAA6C,WAAW,QAAQ,KAAK;AAAA,MAClF;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,KAAK,YAAY,MAAM;AAAA,QACvB,MAAM,YAAY;AAAA,QAClB,WAAW,2BAA2B,WAAW,QAAQ,KAAK;AAAA,MAChE;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,KAAK,YAAY,SAAS;AAAA,QAC1B,MAAM,YAAY,OAAO,YAAY,QAAQ;AAAA,QAC7C,WAAW,+BAA+B,WAAW,OAAO,KAAK;AAAA,MACnE;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,KAAK,YAAY,SAAS;AAAA,QAC1B,MAAM,YAAY;AAAA,QAClB,WAAW,gCAAgC,WAAW,OAAO,KAAK;AAAA,MACpE;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,KAAK,YAAY,SAAS;AAAA,QAC1B,MAAM,YAAY;AAAA,QAClB,WAAW,cAAc,WAAW,OAAO,KAAK;AAAA,MAClD;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,KAAK,YAAY,MAAM,YAAY,SAAS;AAAA,QAC5C,MAAM,YAAY,OAAO;AAAA,QACzB,WAAW,2BAA2B,WAAW,yBAAyB,KAAK;AAAA,MACjF;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,KAAK,YAAY,MAAM,YAAY,SAAS;AAAA,QAC5C,MAAM,YAAY,QAAQ;AAAA,QAC1B,WAAW,cAAc,WAAW,wBAAwB,KAAK;AAAA,MACnE;AAAA,IACF;AACE,aAAO;AAAA,QACL,KAAK,YAAY,MAAM;AAAA,QACvB,MAAM,YAAY;AAAA,QAClB,WAAW,2BAA2B,WAAW,QAAQ,KAAK;AAAA,MAChE;AAAA,EACJ;AACF;AAEA,IAAM,gBAAgB,CAAC,SAAsB;AAC3C,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO,EAAE,UAAU,IAAI,YAAY,OAAO;AAAA,IAC5C,KAAK;AACH,aAAO,EAAE,UAAU,IAAI,YAAY,OAAO;AAAA,IAC5C,KAAK;AACH,aAAO,EAAE,UAAU,IAAI,YAAY,OAAO;AAAA,IAC5C,KAAK;AACH,aAAO,EAAE,UAAU,IAAI,YAAY,OAAO;AAAA,IAC5C;AACE,aAAO,EAAE,UAAU,IAAI,YAAY,OAAO;AAAA,EAC9C;AACF;AAEA,IAAM,kBAAkB,CAAC,SAAsB;AAC7C,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,IAAM,iBAAiB,CAAC,cAAgC;AACtD,QAAM,aAAa;AACnB,QAAM,aAAa,aAAa;AAChC,QAAM,oBAAoB;AAE1B,QAAM,OAA4B;AAAA,IAChC,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,cAAc;AAAA,EAChB;AAEA,QAAM,kBAAiE;AAAA,IACrE,KAAK,EAAE,QAAQ,CAAC,YAAY,MAAM,OAAO,YAAY,CAAC,WAAW;AAAA,IACjE,YAAY,EAAE,QAAQ,CAAC,YAAY,OAAO,kBAAkB;AAAA,IAC5D,aAAa,EAAE,QAAQ,CAAC,YAAY,MAAM,kBAAkB;AAAA,IAE5D,QAAQ,EAAE,KAAK,CAAC,YAAY,MAAM,OAAO,YAAY,CAAC,WAAW;AAAA,IACjE,eAAe,EAAE,KAAK,CAAC,YAAY,OAAO,kBAAkB;AAAA,IAC5D,gBAAgB,EAAE,KAAK,CAAC,YAAY,MAAM,kBAAkB;AAAA,IAE5D,MAAM,EAAE,OAAO,CAAC,YAAY,KAAK,OAAO,WAAW,CAAC,WAAW;AAAA,IAC/D,OAAO,EAAE,MAAM,CAAC,YAAY,KAAK,OAAO,WAAW,CAAC,WAAW;AAAA,EACjE;AAEA,SAAO,EAAE,GAAG,MAAM,GAAG,gBAAgB,SAAS,EAAE;AAClD;AAEO,IAAM,cAAU;AAAA,EACrB,CACE;AAAA,IACE;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP,aAAa;AAAA,IACb,aAAa;AAAA,IACb,SAAS;AAAA,IACT,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,IACA,eAAe;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GACA,QACG;AACH,UAAM,CAAC,WAAW,YAAY,QAAI,uBAAS,KAAK;AAChD,UAAM,CAAC,aAAa,cAAc,QAAI,uBAAyB,IAAI;AACnE,UAAM,EAAE,MAAM,QAAI,kCAAiB,EAAE,WAAW,oBAAoB,CAAC;AACrE,UAAM,sBAAkB,qBAA6C,IAAI;AACzE,UAAM,sBAAkB,qBAA6C,IAAI;AACzE,UAAM,aAAS,qBAAsB,IAAI;AACzC,UAAM,iBAAa,qBAAuB,IAAI;AAC9C,UAAM,gBAAY,uBAAM;AACxB,UAAM,cAAU,4BAAW;AAE3B,UAAM,YACJ,sBAAsB,SAAY,oBAAoB;AAExD,UAAM,qBAAiB;AAAA,MACrB,MACE,cACI,kBAAkB,aAAa,WAAW,QAAQ,SAAS,IAC3D,EAAE,KAAK,GAAG,MAAM,EAAE;AAAA,MACxB,CAAC,aAAa,WAAW,QAAQ,SAAS;AAAA,IAC5C;AACA,UAAM,iBAAa,sBAAQ,MAAM,cAAc,IAAI,GAAG,CAAC,IAAI,CAAC;AAC5D,UAAM,mBAAe,sBAAQ,MAAM,gBAAgB,IAAI,GAAG,CAAC,IAAI,CAAC;AAChE,UAAM,kBAAc,sBAAQ,MAAM,eAAe,SAAS,GAAG,CAAC,SAAS,CAAC;AAGxE,gCAAU,MAAM;AACd,UAAI,CAAC,aAAa,yBAAU;AAE5B,YAAM,iBAAiB,MAAM;AAC3B,YAAI,WAAW,SAAS;AACtB,yBAAe,WAAW,QAAQ,sBAAsB,CAAC;AAAA,QAC3D;AAAA,MACF;AAEA,qBAAe;AAEf,aAAO,iBAAiB,UAAU,gBAAgB,IAAI;AACtD,aAAO,iBAAiB,UAAU,cAAc;AAEhD,aAAO,MAAM;AACX,eAAO,oBAAoB,UAAU,gBAAgB,IAAI;AACzD,eAAO,oBAAoB,UAAU,cAAc;AAAA,MACrD;AAAA,IACF,GAAG,CAAC,SAAS,CAAC;AAEd,UAAM,cAAc,MAAM;AACxB,UAAI,gBAAgB,SAAS;AAC3B,qBAAa,gBAAgB,OAAO;AACpC,wBAAgB,UAAU;AAAA,MAC5B;AAGA,UAAI,WAAW,SAAS;AACtB,uBAAe,WAAW,QAAQ,sBAAsB,CAAC;AAGzD,eAAO,UAAU,sBAAsB,MAAM;AAC3C,iBAAO,UAAU,sBAAsB,MAAM;AAC3C,gBAAI,aAAa,GAAG;AAClB,8BAAgB,UAAU,WAAW,MAAM;AACzC,6BAAa,IAAI;AAAA,cACnB,GAAG,UAAU;AAAA,YACf,OAAO;AACL,2BAAa,IAAI;AAAA,YACnB;AAAA,UACF,CAAC;AAAA,QACH,CAAC;AAAA,MACH;AAAA,IACF;AAEA,UAAM,cAAc,MAAM;AACxB,UAAI,gBAAgB,SAAS;AAC3B,qBAAa,gBAAgB,OAAO;AACpC,wBAAgB,UAAU;AAAA,MAC5B;AAEA,UAAI,OAAO,SAAS;AAClB,6BAAqB,OAAO,OAAO;AACnC,eAAO,UAAU;AAAA,MACnB;AAEA,UAAI,aAAa,GAAG;AAClB,wBAAgB,UAAU,WAAW,MAAM;AACzC,uBAAa,KAAK;AAAA,QACpB,GAAG,UAAU;AAAA,MACf,OAAO;AACL,qBAAa,KAAK;AAAA,MACpB;AAAA,IACF;AAEA,gCAAU,MAAM;AACd,UAAI,yBAAU;AAEd,YAAM,eAAe,CAAC,UAAyB;AAC7C,YAAI,MAAM,QAAQ,YAAY,WAAW;AACvC,cAAI,gBAAgB,SAAS;AAC3B,yBAAa,gBAAgB,OAAO;AACpC,4BAAgB,UAAU;AAAA,UAC5B;AACA,uBAAa,KAAK;AAAA,QACpB;AAAA,MACF;AAEA,eAAS,iBAAiB,WAAW,YAAY;AAEjD,aAAO,MAAM;AACX,iBAAS,oBAAoB,WAAW,YAAY;AACpD,YAAI,gBAAgB,QAAS,cAAa,gBAAgB,OAAO;AACjE,YAAI,gBAAgB,QAAS,cAAa,gBAAgB,OAAO;AACjE,YAAI,OAAO,QAAS,sBAAqB,OAAO,OAAO;AAAA,MACzD;AAAA,IACF,GAAG,CAAC,SAAS,CAAC;AAEd,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,KAAK;AAAA,QACL,UAAS;AAAA,QACT,SAAQ;AAAA,QACR,cAAc;AAAA,QACd,cAAc;AAAA,QACd,SAAS;AAAA,QACT,QAAQ;AAAA,QACR;AAAA,QACA,OAAO,EAAE,QAAQ,cAAc;AAAA,QAC/B,oBAAkB,YAAY,YAAY;AAAA,QAEzC;AAAA;AAAA,UACA,CAAC,4BAAY,eACZ,6CAAC,UACC;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA,eAAa;AAAA,cACb,iBAAe;AAAA,cACf,UAAS;AAAA,cACT,iBAAiB,MAAM,OAAO,WAAW;AAAA,cACzC;AAAA,cACA,iBAAiB;AAAA,cACjB,mBAAmB;AAAA,cACnB,QAAQ;AAAA,cACR,IAAI;AAAA,cACJ,MAAK;AAAA,cACL,eAAa,CAAC;AAAA,cACd,OAAO;AAAA,gBACL,GAAG;AAAA;AAAA,gBAEH,QACE;AAAA,gBACF,cACE;AAAA,gBACF,SAAS,YAAY,IAAI;AAAA,gBACzB,YAAY,YAAY,YAAY;AAAA,gBACpC,YACE;AAAA,gBACF,eAAe;AAAA,gBACf,YAAY;AAAA,gBACZ,OAAO;AAAA,gBACP,UAAU;AAAA,gBACV,YAAY,YAAY,uBAAuB;AAAA;AAAA,gBAC/C,GAAG;AAAA,cACL;AAAA,cAEA;AAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,UAAS;AAAA,oBACT,iBAAiB,MAAM,OAAO,WAAW;AAAA,oBACzC,OAAO;AAAA,sBACL,GAAG;AAAA,sBACH,oBAAoB;AAAA,sBACpB,0BAA0B;AAAA,oBAC5B;AAAA;AAAA,gBACF;AAAA,gBACA;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO;AAAA,sBACL,UAAU;AAAA,sBACV,cAAc;AAAA,sBACd,UAAU;AAAA,sBACV,YAAY;AAAA,oBACd;AAAA,oBAEC,iBAAO,YAAY,YAAY,OAAO,YAAY,WACjD;AAAA,sBAAC;AAAA;AAAA,wBACC,OAAO,MAAM,OAAO,QAAQ;AAAA,wBAC5B,UAAU,WAAW;AAAA,wBACrB,YAAW;AAAA,wBACX,OAAO,EAAE,YAAY,WAAW,WAAW;AAAA,wBAE1C;AAAA;AAAA,oBACH,IAEA;AAAA;AAAA,gBAEJ;AAAA;AAAA;AAAA,UACF,GACF;AAAA;AAAA;AAAA,IAEJ;AAAA,EAEJ;AACF;AAEA,QAAQ,cAAc;","names":["import_react_native","import_jsx_runtime","RNText","import_jsx_runtime","import_jsx_runtime"]}
|
package/native/index.mjs
CHANGED
|
@@ -209,6 +209,8 @@ var Text = ({
|
|
|
209
209
|
numberOfLines,
|
|
210
210
|
id,
|
|
211
211
|
role,
|
|
212
|
+
testID,
|
|
213
|
+
"data-testid": dataTestId,
|
|
212
214
|
style: styleProp,
|
|
213
215
|
...props
|
|
214
216
|
}) => {
|
|
@@ -238,7 +240,7 @@ var Text = ({
|
|
|
238
240
|
{
|
|
239
241
|
style: baseStyle,
|
|
240
242
|
numberOfLines,
|
|
241
|
-
testID: id,
|
|
243
|
+
testID: dataTestId || testID || id,
|
|
242
244
|
accessibilityRole,
|
|
243
245
|
children
|
|
244
246
|
}
|
|
@@ -383,6 +385,7 @@ var Tooltip = forwardRef(
|
|
|
383
385
|
style,
|
|
384
386
|
"data-testid": dataTestId,
|
|
385
387
|
className,
|
|
388
|
+
testID,
|
|
386
389
|
themeMode,
|
|
387
390
|
themeProductContext
|
|
388
391
|
}, ref) => {
|
|
@@ -477,6 +480,7 @@ var Tooltip = forwardRef(
|
|
|
477
480
|
return /* @__PURE__ */ jsxs(
|
|
478
481
|
Box,
|
|
479
482
|
{
|
|
483
|
+
testID,
|
|
480
484
|
ref: triggerRef,
|
|
481
485
|
position: "relative",
|
|
482
486
|
display: "inline-flex",
|