@xsolla/xui-tag 0.118.0 → 0.119.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 +68 -30
- package/native/index.d.mts +5 -6
- package/native/index.d.ts +5 -6
- package/native/index.js +60 -35
- package/native/index.js.flow +4 -6
- package/native/index.js.map +1 -1
- package/native/index.mjs +60 -35
- package/native/index.mjs.map +1 -1
- package/package.json +4 -4
- package/web/index.d.mts +5 -6
- package/web/index.d.ts +5 -6
- package/web/index.js +60 -35
- package/web/index.js.flow +4 -6
- package/web/index.js.map +1 -1
- package/web/index.mjs +60 -35
- package/web/index.mjs.map +1 -1
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Tag
|
|
2
2
|
|
|
3
|
-
A cross-platform React tag component for displaying labels, categories, and removable chips. Supports multiple tones and optional icons.
|
|
3
|
+
A cross-platform React tag component for displaying labels, categories, and removable chips. Supports multiple tones, solid/outlined types, and optional left/right icons.
|
|
4
4
|
|
|
5
5
|
## Installation
|
|
6
6
|
|
|
@@ -39,7 +39,6 @@ export default function TagTones() {
|
|
|
39
39
|
return (
|
|
40
40
|
<div style={{ display: 'flex', gap: 8, flexWrap: 'wrap' }}>
|
|
41
41
|
<Tag tone="primary">Primary</Tag>
|
|
42
|
-
<Tag tone="secondary">Secondary</Tag>
|
|
43
42
|
<Tag tone="brand">Brand</Tag>
|
|
44
43
|
<Tag tone="brandExtra">Brand Extra</Tag>
|
|
45
44
|
<Tag tone="success">Success</Tag>
|
|
@@ -70,7 +69,23 @@ export default function TagSizes() {
|
|
|
70
69
|
}
|
|
71
70
|
```
|
|
72
71
|
|
|
73
|
-
###
|
|
72
|
+
### Solid vs Outlined
|
|
73
|
+
|
|
74
|
+
```tsx
|
|
75
|
+
import * as React from 'react';
|
|
76
|
+
import { Tag } from '@xsolla/xui-tag';
|
|
77
|
+
|
|
78
|
+
export default function TagTypes() {
|
|
79
|
+
return (
|
|
80
|
+
<div style={{ display: 'flex', gap: 8 }}>
|
|
81
|
+
<Tag tone="brand" type="solid">Solid</Tag>
|
|
82
|
+
<Tag tone="brand" type="outlined">Outlined</Tag>
|
|
83
|
+
</div>
|
|
84
|
+
);
|
|
85
|
+
}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### Tag with Icons
|
|
74
89
|
|
|
75
90
|
```tsx
|
|
76
91
|
import * as React from 'react';
|
|
@@ -81,14 +96,26 @@ import { Star, Clock } from '@xsolla/xui-icons-base';
|
|
|
81
96
|
export default function TagWithIcon() {
|
|
82
97
|
return (
|
|
83
98
|
<div style={{ display: 'flex', gap: 8 }}>
|
|
84
|
-
<Tag
|
|
85
|
-
<Tag
|
|
86
|
-
<Tag
|
|
99
|
+
<Tag iconLeft={<Star size={12} />} tone="warning">Featured</Tag>
|
|
100
|
+
<Tag iconLeft={<Check size={12} />} tone="success">Verified</Tag>
|
|
101
|
+
<Tag iconLeft={<Clock size={12} />} iconRight={<Star size={12} />} tone="neutral">Pending</Tag>
|
|
87
102
|
</div>
|
|
88
103
|
);
|
|
89
104
|
}
|
|
90
105
|
```
|
|
91
106
|
|
|
107
|
+
### Icon-Only Tag
|
|
108
|
+
|
|
109
|
+
```tsx
|
|
110
|
+
import * as React from 'react';
|
|
111
|
+
import { Tag } from '@xsolla/xui-tag';
|
|
112
|
+
import { Check } from '@xsolla/xui-icons';
|
|
113
|
+
|
|
114
|
+
export default function IconOnlyTag() {
|
|
115
|
+
return <Tag iconLeft={<Check size={12} />} tone="success" />;
|
|
116
|
+
}
|
|
117
|
+
```
|
|
118
|
+
|
|
92
119
|
### Removable Tag
|
|
93
120
|
|
|
94
121
|
```tsx
|
|
@@ -123,9 +150,11 @@ import { Tag } from '@xsolla/xui-tag';
|
|
|
123
150
|
|
|
124
151
|
<Tag
|
|
125
152
|
size="md" // Size variant
|
|
126
|
-
tone="brand"
|
|
127
|
-
|
|
128
|
-
|
|
153
|
+
tone="brand" // Color tone
|
|
154
|
+
type="solid" // Solid or outlined
|
|
155
|
+
iconLeft={<Icon />} // Optional leading icon
|
|
156
|
+
iconRight={<Icon />} // Optional trailing icon
|
|
157
|
+
onRemove={handleRemove} // Makes tag removable (renders X icon)
|
|
129
158
|
>
|
|
130
159
|
Tag Label
|
|
131
160
|
</Tag>
|
|
@@ -169,22 +198,13 @@ import { CheckCircle, Clock, XCircle } from '@xsolla/xui-icons-base';
|
|
|
169
198
|
export default function StatusTags() {
|
|
170
199
|
return (
|
|
171
200
|
<div style={{ display: 'flex', gap: 8 }}>
|
|
172
|
-
<Tag
|
|
173
|
-
icon={<CheckCircle size={12} />}
|
|
174
|
-
tone="success"
|
|
175
|
-
>
|
|
201
|
+
<Tag iconLeft={<CheckCircle size={12} />} tone="success">
|
|
176
202
|
Completed
|
|
177
203
|
</Tag>
|
|
178
|
-
<Tag
|
|
179
|
-
icon={<Clock size={12} />}
|
|
180
|
-
tone="warning"
|
|
181
|
-
>
|
|
204
|
+
<Tag iconLeft={<Clock size={12} />} tone="warning">
|
|
182
205
|
In Progress
|
|
183
206
|
</Tag>
|
|
184
|
-
<Tag
|
|
185
|
-
icon={<XCircle size={12} />}
|
|
186
|
-
tone="alert"
|
|
187
|
-
>
|
|
207
|
+
<Tag iconLeft={<XCircle size={12} />} tone="alert">
|
|
188
208
|
Failed
|
|
189
209
|
</Tag>
|
|
190
210
|
</div>
|
|
@@ -216,7 +236,7 @@ export default function TagInput() {
|
|
|
216
236
|
{tags.map(tag => (
|
|
217
237
|
<Tag
|
|
218
238
|
key={tag}
|
|
219
|
-
tone="
|
|
239
|
+
tone="primary"
|
|
220
240
|
onRemove={() => setTags(tags.filter(t => t !== tag))}
|
|
221
241
|
>
|
|
222
242
|
{tag}
|
|
@@ -244,18 +264,19 @@ A tag/chip component.
|
|
|
244
264
|
|
|
245
265
|
| Prop | Type | Default | Description |
|
|
246
266
|
| :--- | :--- | :------ | :---------- |
|
|
247
|
-
| children | `ReactNode` | - |
|
|
267
|
+
| children | `ReactNode` | - | Tag content. Optional for icon-only tags. |
|
|
248
268
|
| size | `"xl" \| "lg" \| "md" \| "sm" \| "xs"` | `"md"` | Size of the tag. |
|
|
249
|
-
| tone | `"primary" \| "
|
|
250
|
-
|
|
|
251
|
-
|
|
|
269
|
+
| tone | `"primary" \| "brand" \| "brandExtra" \| "success" \| "warning" \| "alert" \| "neutral"` | `"primary"` | Color tone. |
|
|
270
|
+
| type | `"solid" \| "outlined"` | `"solid"` | Visual type. Solid fills background; outlined uses a border with lighter background. |
|
|
271
|
+
| iconLeft | `ReactNode` | - | Leading icon. |
|
|
272
|
+
| iconRight | `ReactNode` | - | Trailing icon. |
|
|
273
|
+
| onRemove | `() => void` | - | Callback for remove button. Renders an X icon in the trailing position. |
|
|
252
274
|
|
|
253
|
-
**Tone Color Mapping:**
|
|
275
|
+
**Solid Tone Color Mapping:**
|
|
254
276
|
|
|
255
277
|
| Tone | Background | Text |
|
|
256
278
|
| :--- | :--------- | :--- |
|
|
257
279
|
| primary | Background primary | Content primary |
|
|
258
|
-
| secondary | Background secondary | Content primary |
|
|
259
280
|
| brand | Brand primary | On brand |
|
|
260
281
|
| brandExtra | BrandExtra primary | On brandExtra |
|
|
261
282
|
| success | Success primary | On success |
|
|
@@ -263,14 +284,31 @@ A tag/chip component.
|
|
|
263
284
|
| alert | Alert primary | On alert |
|
|
264
285
|
| neutral | Neutral primary | On neutral |
|
|
265
286
|
|
|
287
|
+
**Outlined Tone Color Mapping:**
|
|
288
|
+
|
|
289
|
+
| Tone | Background | Border | Text |
|
|
290
|
+
| :--- | :--------- | :----- | :--- |
|
|
291
|
+
| primary | Background primary | Border secondary | Content primary |
|
|
292
|
+
| brand | Brand secondary | Border brand | Content brand primary |
|
|
293
|
+
| brandExtra | BrandExtra secondary | Border brandExtra | Content brandExtra primary |
|
|
294
|
+
| success | Success secondary | Border success | Content success primary |
|
|
295
|
+
| warning | Warning secondary | Border warning | Content warning primary |
|
|
296
|
+
| alert | Alert secondary | Border alert | Content alert primary |
|
|
297
|
+
| neutral | Neutral secondary | Border neutral | Content neutral primary |
|
|
298
|
+
|
|
266
299
|
## Theming
|
|
267
300
|
|
|
268
301
|
Tag uses the design system theme for colors:
|
|
269
302
|
|
|
270
303
|
```typescript
|
|
271
|
-
//
|
|
304
|
+
// Solid colors (example for "brand" tone)
|
|
272
305
|
theme.colors.background.brand.primary // Background
|
|
273
|
-
theme.colors.content.
|
|
306
|
+
theme.colors.content.on.brand // Text color
|
|
307
|
+
|
|
308
|
+
// Outlined colors (example for "brand" tone)
|
|
309
|
+
theme.colors.background.brand.secondary // Background
|
|
310
|
+
theme.colors.border.brand // Border color
|
|
311
|
+
theme.colors.content.brand.primary // Text color
|
|
274
312
|
```
|
|
275
313
|
|
|
276
314
|
## Accessibility
|
package/native/index.d.mts
CHANGED
|
@@ -2,12 +2,11 @@ import React from 'react';
|
|
|
2
2
|
|
|
3
3
|
interface TagProps {
|
|
4
4
|
size?: "xl" | "lg" | "md" | "sm" | "xs";
|
|
5
|
-
tone?: "primary" | "
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
icon?: React.ReactNode;
|
|
5
|
+
tone?: "primary" | "brand" | "brandExtra" | "success" | "warning" | "alert" | "neutral";
|
|
6
|
+
type?: "solid" | "outlined";
|
|
7
|
+
children?: React.ReactNode;
|
|
8
|
+
iconLeft?: React.ReactNode;
|
|
9
|
+
iconRight?: React.ReactNode;
|
|
11
10
|
onRemove?: () => void;
|
|
12
11
|
}
|
|
13
12
|
declare const Tag: React.FC<TagProps>;
|
package/native/index.d.ts
CHANGED
|
@@ -2,12 +2,11 @@ import React from 'react';
|
|
|
2
2
|
|
|
3
3
|
interface TagProps {
|
|
4
4
|
size?: "xl" | "lg" | "md" | "sm" | "xs";
|
|
5
|
-
tone?: "primary" | "
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
icon?: React.ReactNode;
|
|
5
|
+
tone?: "primary" | "brand" | "brandExtra" | "success" | "warning" | "alert" | "neutral";
|
|
6
|
+
type?: "solid" | "outlined";
|
|
7
|
+
children?: React.ReactNode;
|
|
8
|
+
iconLeft?: React.ReactNode;
|
|
9
|
+
iconRight?: React.ReactNode;
|
|
11
10
|
onRemove?: () => void;
|
|
12
11
|
}
|
|
13
12
|
declare const Tag: React.FC<TagProps>;
|
package/native/index.js
CHANGED
|
@@ -291,33 +291,69 @@ var Icon = ({ children, color, size }) => {
|
|
|
291
291
|
var import_xui_core = require("@xsolla/xui-core");
|
|
292
292
|
var import_xui_icons = require("@xsolla/xui-icons");
|
|
293
293
|
var import_jsx_runtime4 = require("react/jsx-runtime");
|
|
294
|
-
var SELECTABLE_BORDER_RADIUS = 8;
|
|
295
294
|
var Tag = ({
|
|
296
295
|
size = "md",
|
|
297
296
|
tone = "primary",
|
|
298
|
-
|
|
299
|
-
selected = false,
|
|
300
|
-
onPress,
|
|
297
|
+
type = "solid",
|
|
301
298
|
children,
|
|
302
|
-
|
|
299
|
+
iconLeft,
|
|
300
|
+
iconRight,
|
|
303
301
|
onRemove
|
|
304
302
|
}) => {
|
|
305
303
|
const { theme } = (0, import_xui_core.useDesignSystem)();
|
|
306
304
|
const sizeStyles = theme.sizing.tag(size);
|
|
307
305
|
const resolveColors = () => {
|
|
308
|
-
if (
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
306
|
+
if (type === "outlined") {
|
|
307
|
+
switch (tone) {
|
|
308
|
+
case "primary":
|
|
309
|
+
return {
|
|
310
|
+
bg: theme.colors.background.primary,
|
|
311
|
+
text: theme.colors.content.primary,
|
|
312
|
+
border: theme.colors.border.secondary
|
|
313
|
+
};
|
|
314
|
+
case "brand":
|
|
315
|
+
return {
|
|
316
|
+
bg: theme.colors.background.brand.secondary,
|
|
317
|
+
text: theme.colors.content.brand.primary,
|
|
318
|
+
border: theme.colors.border.brand
|
|
319
|
+
};
|
|
320
|
+
case "brandExtra":
|
|
321
|
+
return {
|
|
322
|
+
bg: theme.colors.background.brandExtra.secondary,
|
|
323
|
+
text: theme.colors.content.brandExtra.primary,
|
|
324
|
+
border: theme.colors.border.brandExtra
|
|
325
|
+
};
|
|
326
|
+
case "success":
|
|
327
|
+
return {
|
|
328
|
+
bg: theme.colors.background.success.secondary,
|
|
329
|
+
text: theme.colors.content.success.primary,
|
|
330
|
+
border: theme.colors.border.success
|
|
331
|
+
};
|
|
332
|
+
case "warning":
|
|
333
|
+
return {
|
|
334
|
+
bg: theme.colors.background.warning.secondary,
|
|
335
|
+
text: theme.colors.content.warning.primary,
|
|
336
|
+
border: theme.colors.border.warning
|
|
337
|
+
};
|
|
338
|
+
case "alert":
|
|
339
|
+
return {
|
|
340
|
+
bg: theme.colors.background.alert.secondary,
|
|
341
|
+
text: theme.colors.content.alert.primary,
|
|
342
|
+
border: theme.colors.border.alert
|
|
343
|
+
};
|
|
344
|
+
case "neutral":
|
|
345
|
+
return {
|
|
346
|
+
bg: theme.colors.background.neutral.secondary,
|
|
347
|
+
text: theme.colors.content.neutral.primary,
|
|
348
|
+
border: theme.colors.border.neutral
|
|
349
|
+
};
|
|
350
|
+
default:
|
|
351
|
+
return {
|
|
352
|
+
bg: theme.colors.background.primary,
|
|
353
|
+
text: theme.colors.content.primary,
|
|
354
|
+
border: theme.colors.border.secondary
|
|
355
|
+
};
|
|
315
356
|
}
|
|
316
|
-
return {
|
|
317
|
-
bg: theme.colors.overlay.mono,
|
|
318
|
-
text: theme.colors.content.primary,
|
|
319
|
-
border: theme.colors.border.secondary
|
|
320
|
-
};
|
|
321
357
|
}
|
|
322
358
|
switch (tone) {
|
|
323
359
|
case "primary":
|
|
@@ -326,12 +362,6 @@ var Tag = ({
|
|
|
326
362
|
text: theme.colors.content.primary,
|
|
327
363
|
border: void 0
|
|
328
364
|
};
|
|
329
|
-
case "secondary":
|
|
330
|
-
return {
|
|
331
|
-
bg: theme.colors.background.secondary,
|
|
332
|
-
text: theme.colors.content.primary,
|
|
333
|
-
border: void 0
|
|
334
|
-
};
|
|
335
365
|
case "brand":
|
|
336
366
|
return {
|
|
337
367
|
bg: theme.colors.background.brand.primary,
|
|
@@ -377,34 +407,29 @@ var Tag = ({
|
|
|
377
407
|
}
|
|
378
408
|
};
|
|
379
409
|
const { bg, text, border } = resolveColors();
|
|
380
|
-
const
|
|
381
|
-
const borderRadius = isSelectable ? SELECTABLE_BORDER_RADIUS : sizeStyles.radius;
|
|
410
|
+
const isOutlined = type === "outlined";
|
|
382
411
|
return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
|
|
383
412
|
Box,
|
|
384
413
|
{
|
|
385
|
-
as: isSelectable ? "button" : void 0,
|
|
386
|
-
onPress: isSelectable ? onPress : void 0,
|
|
387
414
|
backgroundColor: bg,
|
|
388
|
-
borderRadius,
|
|
415
|
+
borderRadius: sizeStyles.radius,
|
|
389
416
|
height: sizeStyles.height,
|
|
390
417
|
paddingHorizontal: sizeStyles.padding,
|
|
391
418
|
flexDirection: "row",
|
|
392
419
|
alignItems: "center",
|
|
393
420
|
justifyContent: "center",
|
|
394
421
|
gap: sizeStyles.gap,
|
|
395
|
-
borderWidth:
|
|
422
|
+
borderWidth: isOutlined ? 1 : 0,
|
|
396
423
|
borderColor: border,
|
|
397
|
-
borderStyle:
|
|
398
|
-
cursor: isSelectable ? "pointer" : void 0,
|
|
399
|
-
hoverStyle: isSelectable && !selected ? { backgroundColor: theme.colors.control.brand.tertiary.bgHover } : void 0,
|
|
424
|
+
borderStyle: isOutlined ? "solid" : void 0,
|
|
400
425
|
style: {
|
|
401
426
|
overflow: "hidden",
|
|
402
427
|
textOverflow: "ellipsis",
|
|
403
428
|
whiteSpace: "nowrap"
|
|
404
429
|
},
|
|
405
430
|
children: [
|
|
406
|
-
|
|
407
|
-
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
431
|
+
iconLeft && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Icon, { size: sizeStyles.iconSize, color: text, children: iconLeft }),
|
|
432
|
+
children && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
408
433
|
Text,
|
|
409
434
|
{
|
|
410
435
|
color: text,
|
|
@@ -418,7 +443,7 @@ var Tag = ({
|
|
|
418
443
|
children
|
|
419
444
|
}
|
|
420
445
|
),
|
|
421
|
-
onRemove
|
|
446
|
+
onRemove ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Box, { onPress: onRemove, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_xui_icons.X, { size: sizeStyles.iconSize, color: text }) }) : iconRight && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Icon, { size: sizeStyles.iconSize, color: text, children: iconRight })
|
|
422
447
|
]
|
|
423
448
|
}
|
|
424
449
|
);
|
package/native/index.js.flow
CHANGED
|
@@ -10,18 +10,16 @@ declare interface TagProps {
|
|
|
10
10
|
size?: "xl" | "lg" | "md" | "sm" | "xs";
|
|
11
11
|
tone?:
|
|
12
12
|
| "primary"
|
|
13
|
-
| "secondary"
|
|
14
13
|
| "brand"
|
|
15
14
|
| "brandExtra"
|
|
16
15
|
| "success"
|
|
17
16
|
| "warning"
|
|
18
17
|
| "alert"
|
|
19
18
|
| "neutral";
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
icon?: React.ReactNode;
|
|
19
|
+
type?: "solid" | "outlined";
|
|
20
|
+
children?: React.ReactNode;
|
|
21
|
+
iconLeft?: React.ReactNode;
|
|
22
|
+
iconRight?: React.ReactNode;
|
|
25
23
|
onRemove?: () => void;
|
|
26
24
|
}
|
|
27
25
|
declare var Tag: React.FC<TagProps>;
|
package/native/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/index.tsx","../../../primitives-native/src/Box.tsx","../../../primitives-native/src/Text.tsx","../../../primitives-native/src/Icon.tsx","../../src/Tag.tsx"],"sourcesContent":["export * from \"./Tag\";\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 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 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,\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 React from \"react\";\nimport { View, ViewStyle } from \"react-native\";\nimport { IconProps } from \"@xsolla/xui-primitives-core\";\n\nexport const Icon: React.FC<IconProps> = ({ children, color, size }) => {\n const style: ViewStyle = {\n width: typeof size === \"number\" ? size : undefined,\n height: typeof size === \"number\" ? size : undefined,\n alignItems: \"center\",\n justifyContent: \"center\",\n };\n\n // On native, we try to pass the color down to children (like Text primitives)\n // to mimic the CSS inheritance behavior of the web version.\n const childrenWithProps = React.Children.map(children, (child) => {\n if (React.isValidElement(child)) {\n return React.cloneElement(child, {\n color: child.props.color || color,\n // Also pass size if child seems to be an icon that needs it\n size: child.props.size || size,\n });\n }\n return child;\n });\n\n return <View style={style}>{childrenWithProps}</View>;\n};\n","import React from \"react\";\n// @ts-expect-error - this will be resolved at build time\nimport { Box, Text, Icon } from \"@xsolla/xui-primitives\";\nimport { useDesignSystem } from \"@xsolla/xui-core\";\nimport { X } from \"@xsolla/xui-icons\";\n\nexport interface TagProps {\n size?: \"xl\" | \"lg\" | \"md\" | \"sm\" | \"xs\";\n tone?:\n | \"primary\"\n | \"secondary\"\n | \"brand\"\n | \"brandExtra\"\n | \"success\"\n | \"warning\"\n | \"alert\"\n | \"neutral\";\n variant?: \"default\" | \"selectable\";\n selected?: boolean;\n onPress?: () => void;\n children: React.ReactNode;\n icon?: React.ReactNode;\n onRemove?: () => void;\n}\n\nconst SELECTABLE_BORDER_RADIUS = 8;\n\nexport const Tag: React.FC<TagProps> = ({\n size = \"md\",\n tone = \"primary\",\n variant = \"default\",\n selected = false,\n onPress,\n children,\n icon,\n onRemove,\n}) => {\n const { theme } = useDesignSystem();\n const sizeStyles = theme.sizing.tag(size);\n\n const resolveColors = () => {\n if (variant === \"selectable\") {\n if (selected) {\n return {\n bg: theme.colors.control.brand.secondary.bg,\n text: theme.colors.content.brand.primary,\n border: theme.colors.border.secondary,\n };\n }\n return {\n bg: theme.colors.overlay.mono,\n text: theme.colors.content.primary,\n border: theme.colors.border.secondary,\n };\n }\n\n switch (tone) {\n case \"primary\":\n return {\n bg: theme.colors.background.primary,\n text: theme.colors.content.primary,\n border: undefined,\n };\n case \"secondary\":\n return {\n bg: theme.colors.background.secondary,\n text: theme.colors.content.primary,\n border: undefined,\n };\n case \"brand\":\n return {\n bg: theme.colors.background.brand.primary,\n text: theme.colors.content.on.brand,\n border: undefined,\n };\n case \"brandExtra\":\n return {\n bg: theme.colors.background.brandExtra.primary,\n text: theme.colors.content.on.brandExtra,\n border: undefined,\n };\n case \"success\":\n return {\n bg: theme.colors.background.success.primary,\n text: theme.colors.content.on.success,\n border: undefined,\n };\n case \"warning\":\n return {\n bg: theme.colors.background.warning.primary,\n text: theme.colors.content.on.warning,\n border: undefined,\n };\n case \"alert\":\n return {\n bg: theme.colors.background.alert.primary,\n text: theme.colors.content.on.alert,\n border: undefined,\n };\n case \"neutral\":\n return {\n bg: theme.colors.background.neutral.primary,\n text: theme.colors.content.on.neutral,\n border: undefined,\n };\n default:\n return {\n bg: theme.colors.background.primary,\n text: theme.colors.content.primary,\n border: undefined,\n };\n }\n };\n\n const { bg, text, border } = resolveColors();\n const isSelectable = variant === \"selectable\";\n const borderRadius = isSelectable\n ? SELECTABLE_BORDER_RADIUS\n : sizeStyles.radius;\n\n return (\n <Box\n as={isSelectable ? \"button\" : undefined}\n onPress={isSelectable ? onPress : undefined}\n backgroundColor={bg}\n borderRadius={borderRadius}\n height={sizeStyles.height}\n paddingHorizontal={sizeStyles.padding}\n flexDirection=\"row\"\n alignItems=\"center\"\n justifyContent=\"center\"\n gap={sizeStyles.gap}\n borderWidth={isSelectable ? 1 : 0}\n borderColor={border}\n borderStyle={isSelectable ? \"solid\" : undefined}\n cursor={isSelectable ? \"pointer\" : undefined}\n hoverStyle={\n isSelectable && !selected\n ? { backgroundColor: theme.colors.control.brand.tertiary.bgHover }\n : undefined\n }\n style={{\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {icon && (\n <Icon size={sizeStyles.iconSize} color={text}>\n {icon}\n </Icon>\n )}\n\n <Text\n color={text}\n fontSize={sizeStyles.fontSize}\n fontWeight=\"500\"\n whiteSpace=\"nowrap\"\n style={{\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n }}\n >\n {children}\n </Text>\n\n {onRemove && (\n <Box onPress={onRemove}>\n <X size={sizeStyles.iconSize} color={text} />\n </Box>\n )}\n </Box>\n );\n};\n"],"mappings":"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","names":["import_react_native","import_jsx_runtime","RNText","import_react_native","import_jsx_runtime","React","import_jsx_runtime"]}
|
|
1
|
+
{"version":3,"sources":["../../src/index.tsx","../../../primitives-native/src/Box.tsx","../../../primitives-native/src/Text.tsx","../../../primitives-native/src/Icon.tsx","../../src/Tag.tsx"],"sourcesContent":["export * from \"./Tag\";\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 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 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,\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 React from \"react\";\nimport { View, ViewStyle } from \"react-native\";\nimport { IconProps } from \"@xsolla/xui-primitives-core\";\n\nexport const Icon: React.FC<IconProps> = ({ children, color, size }) => {\n const style: ViewStyle = {\n width: typeof size === \"number\" ? size : undefined,\n height: typeof size === \"number\" ? size : undefined,\n alignItems: \"center\",\n justifyContent: \"center\",\n };\n\n // On native, we try to pass the color down to children (like Text primitives)\n // to mimic the CSS inheritance behavior of the web version.\n const childrenWithProps = React.Children.map(children, (child) => {\n if (React.isValidElement(child)) {\n return React.cloneElement(child, {\n color: child.props.color || color,\n // Also pass size if child seems to be an icon that needs it\n size: child.props.size || size,\n });\n }\n return child;\n });\n\n return <View style={style}>{childrenWithProps}</View>;\n};\n","import React from \"react\";\n// @ts-expect-error - this will be resolved at build time\nimport { Box, Text, Icon } from \"@xsolla/xui-primitives\";\nimport { useDesignSystem } from \"@xsolla/xui-core\";\nimport { X } from \"@xsolla/xui-icons\";\n\nexport interface TagProps {\n size?: \"xl\" | \"lg\" | \"md\" | \"sm\" | \"xs\";\n tone?:\n | \"primary\"\n | \"brand\"\n | \"brandExtra\"\n | \"success\"\n | \"warning\"\n | \"alert\"\n | \"neutral\";\n type?: \"solid\" | \"outlined\";\n children?: React.ReactNode;\n iconLeft?: React.ReactNode;\n iconRight?: React.ReactNode;\n onRemove?: () => void;\n}\n\nexport const Tag: React.FC<TagProps> = ({\n size = \"md\",\n tone = \"primary\",\n type = \"solid\",\n children,\n iconLeft,\n iconRight,\n onRemove,\n}) => {\n const { theme } = useDesignSystem();\n const sizeStyles = theme.sizing.tag(size);\n\n const resolveColors = () => {\n if (type === \"outlined\") {\n switch (tone) {\n case \"primary\":\n return {\n bg: theme.colors.background.primary,\n text: theme.colors.content.primary,\n border: theme.colors.border.secondary,\n };\n case \"brand\":\n return {\n bg: theme.colors.background.brand.secondary,\n text: theme.colors.content.brand.primary,\n border: theme.colors.border.brand,\n };\n case \"brandExtra\":\n return {\n bg: theme.colors.background.brandExtra.secondary,\n text: theme.colors.content.brandExtra.primary,\n border: theme.colors.border.brandExtra,\n };\n case \"success\":\n return {\n bg: theme.colors.background.success.secondary,\n text: theme.colors.content.success.primary,\n border: theme.colors.border.success,\n };\n case \"warning\":\n return {\n bg: theme.colors.background.warning.secondary,\n text: theme.colors.content.warning.primary,\n border: theme.colors.border.warning,\n };\n case \"alert\":\n return {\n bg: theme.colors.background.alert.secondary,\n text: theme.colors.content.alert.primary,\n border: theme.colors.border.alert,\n };\n case \"neutral\":\n return {\n bg: theme.colors.background.neutral.secondary,\n text: theme.colors.content.neutral.primary,\n border: theme.colors.border.neutral,\n };\n default:\n return {\n bg: theme.colors.background.primary,\n text: theme.colors.content.primary,\n border: theme.colors.border.secondary,\n };\n }\n }\n\n switch (tone) {\n case \"primary\":\n return {\n bg: theme.colors.background.primary,\n text: theme.colors.content.primary,\n border: undefined,\n };\n case \"brand\":\n return {\n bg: theme.colors.background.brand.primary,\n text: theme.colors.content.on.brand,\n border: undefined,\n };\n case \"brandExtra\":\n return {\n bg: theme.colors.background.brandExtra.primary,\n text: theme.colors.content.on.brandExtra,\n border: undefined,\n };\n case \"success\":\n return {\n bg: theme.colors.background.success.primary,\n text: theme.colors.content.on.success,\n border: undefined,\n };\n case \"warning\":\n return {\n bg: theme.colors.background.warning.primary,\n text: theme.colors.content.on.warning,\n border: undefined,\n };\n case \"alert\":\n return {\n bg: theme.colors.background.alert.primary,\n text: theme.colors.content.on.alert,\n border: undefined,\n };\n case \"neutral\":\n return {\n bg: theme.colors.background.neutral.primary,\n text: theme.colors.content.on.neutral,\n border: undefined,\n };\n default:\n return {\n bg: theme.colors.background.primary,\n text: theme.colors.content.primary,\n border: undefined,\n };\n }\n };\n\n const { bg, text, border } = resolveColors();\n const isOutlined = type === \"outlined\";\n\n return (\n <Box\n backgroundColor={bg}\n borderRadius={sizeStyles.radius}\n height={sizeStyles.height}\n paddingHorizontal={sizeStyles.padding}\n flexDirection=\"row\"\n alignItems=\"center\"\n justifyContent=\"center\"\n gap={sizeStyles.gap}\n borderWidth={isOutlined ? 1 : 0}\n borderColor={border}\n borderStyle={isOutlined ? \"solid\" : undefined}\n style={{\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {iconLeft && (\n <Icon size={sizeStyles.iconSize} color={text}>\n {iconLeft}\n </Icon>\n )}\n\n {children && (\n <Text\n color={text}\n fontSize={sizeStyles.fontSize}\n fontWeight=\"500\"\n whiteSpace=\"nowrap\"\n style={{\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n }}\n >\n {children}\n </Text>\n )}\n\n {onRemove ? (\n <Box onPress={onRemove}>\n <X size={sizeStyles.iconSize} color={text} />\n </Box>\n ) : (\n iconRight && (\n <Icon size={sizeStyles.iconSize} color={text}>\n {iconRight}\n </Icon>\n )\n )}\n </Box>\n );\n};\n"],"mappings":"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","names":["import_react_native","import_jsx_runtime","RNText","import_react_native","import_jsx_runtime","React","import_jsx_runtime"]}
|
package/native/index.mjs
CHANGED
|
@@ -262,33 +262,69 @@ var Icon = ({ children, color, size }) => {
|
|
|
262
262
|
import { useDesignSystem } from "@xsolla/xui-core";
|
|
263
263
|
import { X } from "@xsolla/xui-icons";
|
|
264
264
|
import { jsx as jsx4, jsxs } from "react/jsx-runtime";
|
|
265
|
-
var SELECTABLE_BORDER_RADIUS = 8;
|
|
266
265
|
var Tag = ({
|
|
267
266
|
size = "md",
|
|
268
267
|
tone = "primary",
|
|
269
|
-
|
|
270
|
-
selected = false,
|
|
271
|
-
onPress,
|
|
268
|
+
type = "solid",
|
|
272
269
|
children,
|
|
273
|
-
|
|
270
|
+
iconLeft,
|
|
271
|
+
iconRight,
|
|
274
272
|
onRemove
|
|
275
273
|
}) => {
|
|
276
274
|
const { theme } = useDesignSystem();
|
|
277
275
|
const sizeStyles = theme.sizing.tag(size);
|
|
278
276
|
const resolveColors = () => {
|
|
279
|
-
if (
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
277
|
+
if (type === "outlined") {
|
|
278
|
+
switch (tone) {
|
|
279
|
+
case "primary":
|
|
280
|
+
return {
|
|
281
|
+
bg: theme.colors.background.primary,
|
|
282
|
+
text: theme.colors.content.primary,
|
|
283
|
+
border: theme.colors.border.secondary
|
|
284
|
+
};
|
|
285
|
+
case "brand":
|
|
286
|
+
return {
|
|
287
|
+
bg: theme.colors.background.brand.secondary,
|
|
288
|
+
text: theme.colors.content.brand.primary,
|
|
289
|
+
border: theme.colors.border.brand
|
|
290
|
+
};
|
|
291
|
+
case "brandExtra":
|
|
292
|
+
return {
|
|
293
|
+
bg: theme.colors.background.brandExtra.secondary,
|
|
294
|
+
text: theme.colors.content.brandExtra.primary,
|
|
295
|
+
border: theme.colors.border.brandExtra
|
|
296
|
+
};
|
|
297
|
+
case "success":
|
|
298
|
+
return {
|
|
299
|
+
bg: theme.colors.background.success.secondary,
|
|
300
|
+
text: theme.colors.content.success.primary,
|
|
301
|
+
border: theme.colors.border.success
|
|
302
|
+
};
|
|
303
|
+
case "warning":
|
|
304
|
+
return {
|
|
305
|
+
bg: theme.colors.background.warning.secondary,
|
|
306
|
+
text: theme.colors.content.warning.primary,
|
|
307
|
+
border: theme.colors.border.warning
|
|
308
|
+
};
|
|
309
|
+
case "alert":
|
|
310
|
+
return {
|
|
311
|
+
bg: theme.colors.background.alert.secondary,
|
|
312
|
+
text: theme.colors.content.alert.primary,
|
|
313
|
+
border: theme.colors.border.alert
|
|
314
|
+
};
|
|
315
|
+
case "neutral":
|
|
316
|
+
return {
|
|
317
|
+
bg: theme.colors.background.neutral.secondary,
|
|
318
|
+
text: theme.colors.content.neutral.primary,
|
|
319
|
+
border: theme.colors.border.neutral
|
|
320
|
+
};
|
|
321
|
+
default:
|
|
322
|
+
return {
|
|
323
|
+
bg: theme.colors.background.primary,
|
|
324
|
+
text: theme.colors.content.primary,
|
|
325
|
+
border: theme.colors.border.secondary
|
|
326
|
+
};
|
|
286
327
|
}
|
|
287
|
-
return {
|
|
288
|
-
bg: theme.colors.overlay.mono,
|
|
289
|
-
text: theme.colors.content.primary,
|
|
290
|
-
border: theme.colors.border.secondary
|
|
291
|
-
};
|
|
292
328
|
}
|
|
293
329
|
switch (tone) {
|
|
294
330
|
case "primary":
|
|
@@ -297,12 +333,6 @@ var Tag = ({
|
|
|
297
333
|
text: theme.colors.content.primary,
|
|
298
334
|
border: void 0
|
|
299
335
|
};
|
|
300
|
-
case "secondary":
|
|
301
|
-
return {
|
|
302
|
-
bg: theme.colors.background.secondary,
|
|
303
|
-
text: theme.colors.content.primary,
|
|
304
|
-
border: void 0
|
|
305
|
-
};
|
|
306
336
|
case "brand":
|
|
307
337
|
return {
|
|
308
338
|
bg: theme.colors.background.brand.primary,
|
|
@@ -348,34 +378,29 @@ var Tag = ({
|
|
|
348
378
|
}
|
|
349
379
|
};
|
|
350
380
|
const { bg, text, border } = resolveColors();
|
|
351
|
-
const
|
|
352
|
-
const borderRadius = isSelectable ? SELECTABLE_BORDER_RADIUS : sizeStyles.radius;
|
|
381
|
+
const isOutlined = type === "outlined";
|
|
353
382
|
return /* @__PURE__ */ jsxs(
|
|
354
383
|
Box,
|
|
355
384
|
{
|
|
356
|
-
as: isSelectable ? "button" : void 0,
|
|
357
|
-
onPress: isSelectable ? onPress : void 0,
|
|
358
385
|
backgroundColor: bg,
|
|
359
|
-
borderRadius,
|
|
386
|
+
borderRadius: sizeStyles.radius,
|
|
360
387
|
height: sizeStyles.height,
|
|
361
388
|
paddingHorizontal: sizeStyles.padding,
|
|
362
389
|
flexDirection: "row",
|
|
363
390
|
alignItems: "center",
|
|
364
391
|
justifyContent: "center",
|
|
365
392
|
gap: sizeStyles.gap,
|
|
366
|
-
borderWidth:
|
|
393
|
+
borderWidth: isOutlined ? 1 : 0,
|
|
367
394
|
borderColor: border,
|
|
368
|
-
borderStyle:
|
|
369
|
-
cursor: isSelectable ? "pointer" : void 0,
|
|
370
|
-
hoverStyle: isSelectable && !selected ? { backgroundColor: theme.colors.control.brand.tertiary.bgHover } : void 0,
|
|
395
|
+
borderStyle: isOutlined ? "solid" : void 0,
|
|
371
396
|
style: {
|
|
372
397
|
overflow: "hidden",
|
|
373
398
|
textOverflow: "ellipsis",
|
|
374
399
|
whiteSpace: "nowrap"
|
|
375
400
|
},
|
|
376
401
|
children: [
|
|
377
|
-
|
|
378
|
-
/* @__PURE__ */ jsx4(
|
|
402
|
+
iconLeft && /* @__PURE__ */ jsx4(Icon, { size: sizeStyles.iconSize, color: text, children: iconLeft }),
|
|
403
|
+
children && /* @__PURE__ */ jsx4(
|
|
379
404
|
Text,
|
|
380
405
|
{
|
|
381
406
|
color: text,
|
|
@@ -389,7 +414,7 @@ var Tag = ({
|
|
|
389
414
|
children
|
|
390
415
|
}
|
|
391
416
|
),
|
|
392
|
-
onRemove
|
|
417
|
+
onRemove ? /* @__PURE__ */ jsx4(Box, { onPress: onRemove, children: /* @__PURE__ */ jsx4(X, { size: sizeStyles.iconSize, color: text }) }) : iconRight && /* @__PURE__ */ jsx4(Icon, { size: sizeStyles.iconSize, color: text, children: iconRight })
|
|
393
418
|
]
|
|
394
419
|
}
|
|
395
420
|
);
|