@xsolla/xui-toggletip 0.148.0 → 0.148.2
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 +291 -0
- package/package.json +4 -4
package/README.md
ADDED
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
# Toggletip
|
|
2
|
+
|
|
3
|
+
A cross-platform React toggletip component that shows rich content (title, body, footer) in a popover when the trigger element is clicked.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @xsolla/xui-toggletip
|
|
9
|
+
# or
|
|
10
|
+
yarn add @xsolla/xui-toggletip
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Demo
|
|
14
|
+
|
|
15
|
+
### Basic Toggletip
|
|
16
|
+
|
|
17
|
+
```tsx
|
|
18
|
+
import * as React from 'react';
|
|
19
|
+
import { Toggletip } from '@xsolla/xui-toggletip';
|
|
20
|
+
import { IconButton } from '@xsolla/xui-button';
|
|
21
|
+
import { HelpCircle } from '@xsolla/xui-icons-base';
|
|
22
|
+
|
|
23
|
+
export default function BasicToggletip() {
|
|
24
|
+
return (
|
|
25
|
+
<Toggletip
|
|
26
|
+
title="Help"
|
|
27
|
+
content="Click here to learn more about this feature."
|
|
28
|
+
>
|
|
29
|
+
<IconButton
|
|
30
|
+
icon={<HelpCircle size={20} />}
|
|
31
|
+
variant="secondary"
|
|
32
|
+
tone="mono"
|
|
33
|
+
size="sm"
|
|
34
|
+
aria-label="Help"
|
|
35
|
+
/>
|
|
36
|
+
</Toggletip>
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### With Footer Actions
|
|
42
|
+
|
|
43
|
+
```tsx
|
|
44
|
+
import * as React from 'react';
|
|
45
|
+
import { Toggletip } from '@xsolla/xui-toggletip';
|
|
46
|
+
import { Button } from '@xsolla/xui-button';
|
|
47
|
+
import { Info } from '@xsolla/xui-icons-base';
|
|
48
|
+
|
|
49
|
+
export default function WithFooter() {
|
|
50
|
+
return (
|
|
51
|
+
<Toggletip
|
|
52
|
+
title="Confirmation"
|
|
53
|
+
content="Are you sure you want to proceed with this action?"
|
|
54
|
+
footer={
|
|
55
|
+
<>
|
|
56
|
+
<Button size="sm" variant="secondary">Cancel</Button>
|
|
57
|
+
<Button size="sm">Confirm</Button>
|
|
58
|
+
</>
|
|
59
|
+
}
|
|
60
|
+
>
|
|
61
|
+
<Button size="sm" iconLeft={<Info size={16} />}>
|
|
62
|
+
Details
|
|
63
|
+
</Button>
|
|
64
|
+
</Toggletip>
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### Different Directions
|
|
70
|
+
|
|
71
|
+
```tsx
|
|
72
|
+
import * as React from 'react';
|
|
73
|
+
import { Toggletip } from '@xsolla/xui-toggletip';
|
|
74
|
+
import { Button } from '@xsolla/xui-button';
|
|
75
|
+
|
|
76
|
+
export default function Directions() {
|
|
77
|
+
return (
|
|
78
|
+
<div style={{ display: 'flex', gap: 16, padding: 100 }}>
|
|
79
|
+
<Toggletip direction="top" content="Appears above">
|
|
80
|
+
<Button size="sm">Top</Button>
|
|
81
|
+
</Toggletip>
|
|
82
|
+
<Toggletip direction="bottom" content="Appears below">
|
|
83
|
+
<Button size="sm">Bottom</Button>
|
|
84
|
+
</Toggletip>
|
|
85
|
+
<Toggletip direction="left" content="Appears left">
|
|
86
|
+
<Button size="sm">Left</Button>
|
|
87
|
+
</Toggletip>
|
|
88
|
+
<Toggletip direction="right" content="Appears right">
|
|
89
|
+
<Button size="sm">Right</Button>
|
|
90
|
+
</Toggletip>
|
|
91
|
+
</div>
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
## Anatomy
|
|
97
|
+
|
|
98
|
+
```jsx
|
|
99
|
+
import { Toggletip } from '@xsolla/xui-toggletip';
|
|
100
|
+
|
|
101
|
+
<Toggletip
|
|
102
|
+
title="Title" // Optional header title
|
|
103
|
+
content="Description" // Main content (string or ReactNode)
|
|
104
|
+
footer={<Actions />} // Optional footer actions
|
|
105
|
+
direction="top" // Placement direction
|
|
106
|
+
autoDirection={true} // Auto-adjust if near edges
|
|
107
|
+
offset={12} // Distance from trigger
|
|
108
|
+
width="288px" // Popover width
|
|
109
|
+
>
|
|
110
|
+
<TriggerElement />
|
|
111
|
+
</Toggletip>
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
## Examples
|
|
115
|
+
|
|
116
|
+
### Feature Explanation
|
|
117
|
+
|
|
118
|
+
```tsx
|
|
119
|
+
import * as React from 'react';
|
|
120
|
+
import { Toggletip } from '@xsolla/xui-toggletip';
|
|
121
|
+
import { HelpCircle } from '@xsolla/xui-icons-base';
|
|
122
|
+
|
|
123
|
+
export default function FeatureHelp() {
|
|
124
|
+
return (
|
|
125
|
+
<div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>
|
|
126
|
+
<span>Premium Features</span>
|
|
127
|
+
<Toggletip
|
|
128
|
+
title="Premium Benefits"
|
|
129
|
+
content={
|
|
130
|
+
<ul style={{ margin: 0, paddingLeft: 20 }}>
|
|
131
|
+
<li>Unlimited downloads</li>
|
|
132
|
+
<li>Priority support</li>
|
|
133
|
+
<li>Advanced analytics</li>
|
|
134
|
+
<li>Custom branding</li>
|
|
135
|
+
</ul>
|
|
136
|
+
}
|
|
137
|
+
>
|
|
138
|
+
<HelpCircle size={16} style={{ cursor: 'pointer' }} />
|
|
139
|
+
</Toggletip>
|
|
140
|
+
</div>
|
|
141
|
+
);
|
|
142
|
+
}
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
### Info Popover
|
|
146
|
+
|
|
147
|
+
```tsx
|
|
148
|
+
import * as React from 'react';
|
|
149
|
+
import { Toggletip } from '@xsolla/xui-toggletip';
|
|
150
|
+
import { Button } from '@xsolla/xui-button';
|
|
151
|
+
|
|
152
|
+
export default function InfoPopover() {
|
|
153
|
+
return (
|
|
154
|
+
<Toggletip
|
|
155
|
+
title="Payment Information"
|
|
156
|
+
content="Your payment will be processed securely through our payment provider. You will receive a confirmation email once the transaction is complete."
|
|
157
|
+
footer={
|
|
158
|
+
<Button size="sm" variant="secondary">Learn More</Button>
|
|
159
|
+
}
|
|
160
|
+
direction="bottom"
|
|
161
|
+
width="320px"
|
|
162
|
+
>
|
|
163
|
+
<Button size="sm" variant="secondary">
|
|
164
|
+
Payment Info
|
|
165
|
+
</Button>
|
|
166
|
+
</Toggletip>
|
|
167
|
+
);
|
|
168
|
+
}
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
### Quick Actions
|
|
172
|
+
|
|
173
|
+
```tsx
|
|
174
|
+
import * as React from 'react';
|
|
175
|
+
import { Toggletip } from '@xsolla/xui-toggletip';
|
|
176
|
+
import { Button, IconButton } from '@xsolla/xui-button';
|
|
177
|
+
import { MoreVertical, Edit, Copy, Trash } from '@xsolla/xui-icons-base';
|
|
178
|
+
|
|
179
|
+
export default function QuickActions() {
|
|
180
|
+
return (
|
|
181
|
+
<Toggletip
|
|
182
|
+
content={
|
|
183
|
+
<div style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>
|
|
184
|
+
<Button size="sm" variant="secondary" iconLeft={<Edit size={16} />} fullWidth>
|
|
185
|
+
Edit
|
|
186
|
+
</Button>
|
|
187
|
+
<Button size="sm" variant="secondary" iconLeft={<Copy size={16} />} fullWidth>
|
|
188
|
+
Duplicate
|
|
189
|
+
</Button>
|
|
190
|
+
<Button size="sm" variant="secondary" tone="alert" iconLeft={<Trash size={16} />} fullWidth>
|
|
191
|
+
Delete
|
|
192
|
+
</Button>
|
|
193
|
+
</div>
|
|
194
|
+
}
|
|
195
|
+
direction="bottom-right"
|
|
196
|
+
width="160px"
|
|
197
|
+
>
|
|
198
|
+
<IconButton
|
|
199
|
+
icon={<MoreVertical size={20} />}
|
|
200
|
+
variant="secondary"
|
|
201
|
+
tone="mono"
|
|
202
|
+
size="sm"
|
|
203
|
+
aria-label="More actions"
|
|
204
|
+
/>
|
|
205
|
+
</Toggletip>
|
|
206
|
+
);
|
|
207
|
+
}
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
### Form Field Help
|
|
211
|
+
|
|
212
|
+
```tsx
|
|
213
|
+
import * as React from 'react';
|
|
214
|
+
import { Toggletip } from '@xsolla/xui-toggletip';
|
|
215
|
+
import { Input } from '@xsolla/xui-input';
|
|
216
|
+
import { HelpCircle } from '@xsolla/xui-icons-base';
|
|
217
|
+
|
|
218
|
+
export default function FormFieldHelp() {
|
|
219
|
+
return (
|
|
220
|
+
<div>
|
|
221
|
+
<div style={{ display: 'flex', alignItems: 'center', gap: 4, marginBottom: 4 }}>
|
|
222
|
+
<label>API Key</label>
|
|
223
|
+
<Toggletip
|
|
224
|
+
content="Your API key can be found in the Developer Console under Settings > API Keys. Keep this key secure and never share it publicly."
|
|
225
|
+
direction="right"
|
|
226
|
+
>
|
|
227
|
+
<HelpCircle size={14} style={{ cursor: 'pointer', color: '#666' }} />
|
|
228
|
+
</Toggletip>
|
|
229
|
+
</div>
|
|
230
|
+
<Input placeholder="Enter your API key" />
|
|
231
|
+
</div>
|
|
232
|
+
);
|
|
233
|
+
}
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
## API Reference
|
|
237
|
+
|
|
238
|
+
### Toggletip
|
|
239
|
+
|
|
240
|
+
**ToggletipProps:**
|
|
241
|
+
|
|
242
|
+
| Prop | Type | Default | Description |
|
|
243
|
+
| :--- | :--- | :------ | :---------- |
|
|
244
|
+
| children | `ReactNode` | - | Trigger element. |
|
|
245
|
+
| title | `string` | - | Optional title in header. |
|
|
246
|
+
| content | `ReactNode` | - | Main content (string or element). |
|
|
247
|
+
| footer | `ReactNode` | - | Optional footer (usually buttons). |
|
|
248
|
+
| direction | `ToggletipPlacement` | `"top"` | Placement relative to trigger. |
|
|
249
|
+
| autoDirection | `boolean` | `true` | Auto-adjust placement near edges. |
|
|
250
|
+
| offset | `number` | `12` | Distance from trigger in pixels. |
|
|
251
|
+
| width | `string` | `"288px"` | Popover width. |
|
|
252
|
+
| data-testid | `string` | - | Test identifier. |
|
|
253
|
+
|
|
254
|
+
**ToggletipPlacement:**
|
|
255
|
+
|
|
256
|
+
```typescript
|
|
257
|
+
type ToggletipPlacement =
|
|
258
|
+
| "top"
|
|
259
|
+
| "top-left"
|
|
260
|
+
| "top-right"
|
|
261
|
+
| "bottom"
|
|
262
|
+
| "bottom-left"
|
|
263
|
+
| "bottom-right"
|
|
264
|
+
| "left"
|
|
265
|
+
| "right";
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
## Behavior
|
|
269
|
+
|
|
270
|
+
- Opens on trigger click
|
|
271
|
+
- Closes on clicking outside
|
|
272
|
+
- Closes on Escape key
|
|
273
|
+
- Auto-adjusts position to stay in viewport (when `autoDirection` is true)
|
|
274
|
+
- Shadow and border from theme for visual elevation
|
|
275
|
+
|
|
276
|
+
## Toggletip vs Tooltip
|
|
277
|
+
|
|
278
|
+
| Feature | Toggletip | Tooltip |
|
|
279
|
+
| :------ | :-------- | :------ |
|
|
280
|
+
| Trigger | Click | Hover |
|
|
281
|
+
| Content | Rich (title, body, footer) | Simple text |
|
|
282
|
+
| Interaction | Can contain interactive elements | Non-interactive |
|
|
283
|
+
| Use case | Help text, mini forms, actions | Quick hints |
|
|
284
|
+
|
|
285
|
+
## Accessibility
|
|
286
|
+
|
|
287
|
+
- Click-triggered for keyboard accessibility
|
|
288
|
+
- Escape key closes the popover
|
|
289
|
+
- Focus is managed appropriately
|
|
290
|
+
- Content is accessible to screen readers
|
|
291
|
+
- Use descriptive trigger elements
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xsolla/xui-toggletip",
|
|
3
|
-
"version": "0.148.
|
|
3
|
+
"version": "0.148.2",
|
|
4
4
|
"main": "./web/index.js",
|
|
5
5
|
"module": "./web/index.mjs",
|
|
6
6
|
"types": "./web/index.d.ts",
|
|
@@ -13,9 +13,9 @@
|
|
|
13
13
|
"test:coverage": "vitest run --coverage"
|
|
14
14
|
},
|
|
15
15
|
"dependencies": {
|
|
16
|
-
"@xsolla/xui-button": "0.148.
|
|
17
|
-
"@xsolla/xui-core": "0.148.
|
|
18
|
-
"@xsolla/xui-primitives-core": "0.148.
|
|
16
|
+
"@xsolla/xui-button": "0.148.2",
|
|
17
|
+
"@xsolla/xui-core": "0.148.2",
|
|
18
|
+
"@xsolla/xui-primitives-core": "0.148.2"
|
|
19
19
|
},
|
|
20
20
|
"peerDependencies": {
|
|
21
21
|
"react": ">=16.8.0",
|