@flipdish/ui-library 0.41.1 → 0.42.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/dist/components/atoms/Dot/Dot.styles.cjs +1 -0
- package/dist/components/atoms/Dot/Dot.styles.cjs.map +1 -1
- package/dist/components/atoms/Dot/Dot.styles.d.ts +4 -0
- package/dist/components/atoms/Dot/Dot.styles.d.ts.map +1 -1
- package/dist/components/atoms/Dot/Dot.styles.js +1 -0
- package/dist/components/atoms/Dot/Dot.styles.js.map +1 -1
- package/dist/components/molecules/Select/components/MultiSelect.cjs +10 -36
- package/dist/components/molecules/Select/components/MultiSelect.cjs.map +1 -1
- package/dist/components/molecules/Select/components/MultiSelect.d.ts.map +1 -1
- package/dist/components/molecules/Select/components/MultiSelect.js +11 -37
- package/dist/components/molecules/Select/components/MultiSelect.js.map +1 -1
- package/dist/components/molecules/Select/hooks/useMultiSelectSelection.cjs +43 -0
- package/dist/components/molecules/Select/hooks/useMultiSelectSelection.cjs.map +1 -0
- package/dist/components/molecules/Select/hooks/useMultiSelectSelection.d.ts +35 -0
- package/dist/components/molecules/Select/hooks/useMultiSelectSelection.d.ts.map +1 -0
- package/dist/components/molecules/Select/hooks/useMultiSelectSelection.js +41 -0
- package/dist/components/molecules/Select/hooks/useMultiSelectSelection.js.map +1 -0
- package/dist/components/molecules/Select/multiSelect.utils.cjs +34 -0
- package/dist/components/molecules/Select/multiSelect.utils.cjs.map +1 -0
- package/dist/components/molecules/Select/multiSelect.utils.d.ts +23 -0
- package/dist/components/molecules/Select/multiSelect.utils.d.ts.map +1 -0
- package/dist/components/molecules/Select/multiSelect.utils.js +31 -0
- package/dist/components/molecules/Select/multiSelect.utils.js.map +1 -0
- package/dist/components/molecules/Tags/Tags.styles.cjs +66 -0
- package/dist/components/molecules/Tags/Tags.styles.cjs.map +1 -0
- package/dist/components/molecules/Tags/Tags.styles.d.ts +141 -0
- package/dist/components/molecules/Tags/Tags.styles.d.ts.map +1 -0
- package/dist/components/molecules/Tags/Tags.styles.js +64 -0
- package/dist/components/molecules/Tags/Tags.styles.js.map +1 -0
- package/dist/components/molecules/Tags/components/TagCheckbox.cjs +2 -1
- package/dist/components/molecules/Tags/components/TagCheckbox.cjs.map +1 -1
- package/dist/components/molecules/Tags/components/TagCheckbox.d.ts +2 -1
- package/dist/components/molecules/Tags/components/TagCheckbox.d.ts.map +1 -1
- package/dist/components/molecules/Tags/components/TagCheckbox.js +2 -1
- package/dist/components/molecules/Tags/components/TagCheckbox.js.map +1 -1
- package/dist/components/molecules/Tags/components/TagCloseX.cjs +2 -6
- package/dist/components/molecules/Tags/components/TagCloseX.cjs.map +1 -1
- package/dist/components/molecules/Tags/components/TagCloseX.d.ts +2 -1
- package/dist/components/molecules/Tags/components/TagCloseX.d.ts.map +1 -1
- package/dist/components/molecules/Tags/components/TagCloseX.js +2 -6
- package/dist/components/molecules/Tags/components/TagCloseX.js.map +1 -1
- package/dist/components/molecules/Tags/index.cjs +11 -48
- package/dist/components/molecules/Tags/index.cjs.map +1 -1
- package/dist/components/molecules/Tags/index.d.ts +12 -3
- package/dist/components/molecules/Tags/index.d.ts.map +1 -1
- package/dist/components/molecules/Tags/index.js +11 -48
- package/dist/components/molecules/Tags/index.js.map +1 -1
- package/dist/components/organisms/ColorPicker/colorPicker.utils.cjs +45 -0
- package/dist/components/organisms/ColorPicker/colorPicker.utils.cjs.map +1 -1
- package/dist/components/organisms/ColorPicker/colorPicker.utils.d.ts +29 -0
- package/dist/components/organisms/ColorPicker/colorPicker.utils.d.ts.map +1 -1
- package/dist/components/organisms/ColorPicker/colorPicker.utils.js +43 -1
- package/dist/components/organisms/ColorPicker/colorPicker.utils.js.map +1 -1
- package/dist/components/organisms/ColorPicker/hooks/useCssColorField.cjs +38 -0
- package/dist/components/organisms/ColorPicker/hooks/useCssColorField.cjs.map +1 -0
- package/dist/components/organisms/ColorPicker/hooks/useCssColorField.d.ts +28 -0
- package/dist/components/organisms/ColorPicker/hooks/useCssColorField.d.ts.map +1 -0
- package/dist/components/organisms/ColorPicker/hooks/useCssColorField.js +36 -0
- package/dist/components/organisms/ColorPicker/hooks/useCssColorField.js.map +1 -0
- package/dist/components/organisms/ColorPicker/index.cjs +15 -38
- package/dist/components/organisms/ColorPicker/index.cjs.map +1 -1
- package/dist/components/organisms/ColorPicker/index.d.ts.map +1 -1
- package/dist/components/organisms/ColorPicker/index.js +16 -39
- package/dist/components/organisms/ColorPicker/index.js.map +1 -1
- package/dist/native/components/atoms/Dot/Dot.styles.d.ts +4 -0
- package/dist/native/components/atoms/Dot/Dot.styles.d.ts.map +1 -1
- package/dist/native/components/atoms/Dot/Dot.styles.js +1 -0
- package/dist/native/components/atoms/Dot/Dot.styles.js.map +1 -1
- package/dist/native/components/molecules/Tags/Tags.styles.d.ts +141 -0
- package/dist/native/components/molecules/Tags/Tags.styles.d.ts.map +1 -0
- package/dist/native/components/molecules/Tags/Tags.styles.js +92 -0
- package/dist/native/components/molecules/Tags/Tags.styles.js.map +1 -0
- package/dist/native/components/molecules/Tags/index.d.ts +95 -8
- package/dist/native/components/molecules/Tags/index.d.ts.map +1 -0
- package/dist/native/components/molecules/Tags/index.js +98 -0
- package/dist/native/components/molecules/Tags/index.js.map +1 -0
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Dot.styles.d.ts","sourceRoot":"","sources":["../../../../../src/components/atoms/Dot/Dot.styles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,MAAM
|
|
1
|
+
{"version":3,"file":"Dot.styles.d.ts","sourceRoot":"","sources":["../../../../../src/components/atoms/Dot/Dot.styles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyBlB,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG,MAAM,OAAO,MAAM,CAAC,KAAK,CAAC;AAChD,MAAM,MAAM,QAAQ,GAAG,MAAM,OAAO,MAAM,CAAC,MAAM,CAAC;AAElD,eAAO,MAAM,aAAa,EAAiC,QAAQ,EAAE,CAAC"}
|
|
@@ -29,6 +29,7 @@ const styles = {
|
|
|
29
29
|
'fg-primary': { web: 'text-fg-primary', native: 'bg-fg-primary' },
|
|
30
30
|
'fg-quaternary': { web: 'text-fg-quaternary', native: 'bg-fg-quaternary' },
|
|
31
31
|
'fg-success-secondary': { web: 'text-fg-success-secondary', native: 'bg-fg-success-secondary' },
|
|
32
|
+
'fg-warning-secondary': { web: 'text-fg-warning-secondary', native: 'bg-fg-warning-secondary' },
|
|
32
33
|
'border-primary': { web: 'text-border-primary', native: 'bg-border-primary' },
|
|
33
34
|
'utility-neutral-500': { web: 'text-utility-neutral-500', native: 'bg-utility-neutral-500' },
|
|
34
35
|
'utility-brand-500': { web: 'text-utility-brand-500', native: 'bg-utility-brand-500' },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Dot.styles.js","sources":["../../../../../../src/components/atoms/Dot/Dot.styles.ts"],"sourcesContent":[null],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;AAoBG;AACI,MAAM,MAAM,GAAG;AACpB,IAAA,KAAK,EAAE;AACL,QAAA,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE;AAC3B,QAAA,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;AAC3B,KAAA;AACD,IAAA,MAAM,EAAE;QACN,aAAa,EAAE,EAAE,GAAG,EAAE,uBAAuB,EAAE,MAAM,EAAE,gBAAgB,EAAE;QACzE,YAAY,EAAE,EAAE,GAAG,EAAE,iBAAiB,EAAE,MAAM,EAAE,eAAe,EAAE;QACjE,eAAe,EAAE,EAAE,GAAG,EAAE,oBAAoB,EAAE,MAAM,EAAE,kBAAkB,EAAE;QAC1E,sBAAsB,EAAE,EAAE,GAAG,EAAE,2BAA2B,EAAE,MAAM,EAAE,yBAAyB,EAAE;QAC/F,gBAAgB,EAAE,EAAE,GAAG,EAAE,qBAAqB,EAAE,MAAM,EAAE,mBAAmB,EAAE;QAC7E,qBAAqB,EAAE,EAAE,GAAG,EAAE,0BAA0B,EAAE,MAAM,EAAE,wBAAwB,EAAE;QAC5F,mBAAmB,EAAE,EAAE,GAAG,EAAE,wBAAwB,EAAE,MAAM,EAAE,sBAAsB,EAAE;QACtF,iBAAiB,EAAE,EAAE,GAAG,EAAE,sBAAsB,EAAE,MAAM,EAAE,oBAAoB,EAAE;QAChF,oBAAoB,EAAE,EAAE,GAAG,EAAE,yBAAyB,EAAE,MAAM,EAAE,uBAAuB,EAAE;QACzF,mBAAmB,EAAE,EAAE,GAAG,EAAE,wBAAwB,EAAE,MAAM,EAAE,sBAAsB,EAAE;QACtF,mBAAmB,EAAE,EAAE,GAAG,EAAE,wBAAwB,EAAE,MAAM,EAAE,sBAAsB,EAAE;QACtF,iBAAiB,EAAE,EAAE,GAAG,EAAE,sBAAsB,EAAE,MAAM,EAAE,oBAAoB,EAAE;QAChF,kBAAkB,EAAE,EAAE,GAAG,EAAE,uBAAuB,EAAE,MAAM,EAAE,qBAAqB,EAAE;QACnF,oBAAoB,EAAE,EAAE,GAAG,EAAE,yBAAyB,EAAE,MAAM,EAAE,uBAAuB,EAAE;QACzF,oBAAoB,EAAE,EAAE,GAAG,EAAE,yBAAyB,EAAE,MAAM,EAAE,uBAAuB,EAAE;QACzF,kBAAkB,EAAE,EAAE,GAAG,EAAE,uBAAuB,EAAE,MAAM,EAAE,qBAAqB,EAAE;QACnF,oBAAoB,EAAE,EAAE,GAAG,EAAE,yBAAyB,EAAE,MAAM,EAAE,uBAAuB,EAAE;AAC1F,KAAA;;;"}
|
|
1
|
+
{"version":3,"file":"Dot.styles.js","sources":["../../../../../../src/components/atoms/Dot/Dot.styles.ts"],"sourcesContent":[null],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;AAoBG;AACI,MAAM,MAAM,GAAG;AACpB,IAAA,KAAK,EAAE;AACL,QAAA,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE;AAC3B,QAAA,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;AAC3B,KAAA;AACD,IAAA,MAAM,EAAE;QACN,aAAa,EAAE,EAAE,GAAG,EAAE,uBAAuB,EAAE,MAAM,EAAE,gBAAgB,EAAE;QACzE,YAAY,EAAE,EAAE,GAAG,EAAE,iBAAiB,EAAE,MAAM,EAAE,eAAe,EAAE;QACjE,eAAe,EAAE,EAAE,GAAG,EAAE,oBAAoB,EAAE,MAAM,EAAE,kBAAkB,EAAE;QAC1E,sBAAsB,EAAE,EAAE,GAAG,EAAE,2BAA2B,EAAE,MAAM,EAAE,yBAAyB,EAAE;QAC/F,sBAAsB,EAAE,EAAE,GAAG,EAAE,2BAA2B,EAAE,MAAM,EAAE,yBAAyB,EAAE;QAC/F,gBAAgB,EAAE,EAAE,GAAG,EAAE,qBAAqB,EAAE,MAAM,EAAE,mBAAmB,EAAE;QAC7E,qBAAqB,EAAE,EAAE,GAAG,EAAE,0BAA0B,EAAE,MAAM,EAAE,wBAAwB,EAAE;QAC5F,mBAAmB,EAAE,EAAE,GAAG,EAAE,wBAAwB,EAAE,MAAM,EAAE,sBAAsB,EAAE;QACtF,iBAAiB,EAAE,EAAE,GAAG,EAAE,sBAAsB,EAAE,MAAM,EAAE,oBAAoB,EAAE;QAChF,oBAAoB,EAAE,EAAE,GAAG,EAAE,yBAAyB,EAAE,MAAM,EAAE,uBAAuB,EAAE;QACzF,mBAAmB,EAAE,EAAE,GAAG,EAAE,wBAAwB,EAAE,MAAM,EAAE,sBAAsB,EAAE;QACtF,mBAAmB,EAAE,EAAE,GAAG,EAAE,wBAAwB,EAAE,MAAM,EAAE,sBAAsB,EAAE;QACtF,iBAAiB,EAAE,EAAE,GAAG,EAAE,sBAAsB,EAAE,MAAM,EAAE,oBAAoB,EAAE;QAChF,kBAAkB,EAAE,EAAE,GAAG,EAAE,uBAAuB,EAAE,MAAM,EAAE,qBAAqB,EAAE;QACnF,oBAAoB,EAAE,EAAE,GAAG,EAAE,yBAAyB,EAAE,MAAM,EAAE,uBAAuB,EAAE;QACzF,oBAAoB,EAAE,EAAE,GAAG,EAAE,yBAAyB,EAAE,MAAM,EAAE,uBAAuB,EAAE;QACzF,kBAAkB,EAAE,EAAE,GAAG,EAAE,uBAAuB,EAAE,MAAM,EAAE,qBAAqB,EAAE;QACnF,oBAAoB,EAAE,EAAE,GAAG,EAAE,yBAAyB,EAAE,MAAM,EAAE,uBAAuB,EAAE;AAC1F,KAAA;;;"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared `Tags` style config, read by both `index.tsx` and `index.native.tsx`.
|
|
3
|
+
*
|
|
4
|
+
* Complete literal class names only — Tailwind scans source for whole candidates.
|
|
5
|
+
* `native` holds pixel sizes and light-mode hex colours that React Native needs as
|
|
6
|
+
* plain `style` / icon props (no `currentColor`, and `Text` ignores `className` under
|
|
7
|
+
* the current `react-native-css` preview).
|
|
8
|
+
*/
|
|
9
|
+
export declare const styles: {
|
|
10
|
+
sizes: {
|
|
11
|
+
sm: {
|
|
12
|
+
root: {
|
|
13
|
+
base: string;
|
|
14
|
+
withCheckbox: string;
|
|
15
|
+
withAvatar: string;
|
|
16
|
+
withDot: string;
|
|
17
|
+
withCount: string;
|
|
18
|
+
withClose: string;
|
|
19
|
+
};
|
|
20
|
+
content: string;
|
|
21
|
+
count: string;
|
|
22
|
+
};
|
|
23
|
+
md: {
|
|
24
|
+
root: {
|
|
25
|
+
base: string;
|
|
26
|
+
withCheckbox: string;
|
|
27
|
+
withAvatar: string;
|
|
28
|
+
withDot: string;
|
|
29
|
+
withCount: string;
|
|
30
|
+
withClose: string;
|
|
31
|
+
};
|
|
32
|
+
content: string;
|
|
33
|
+
count: string;
|
|
34
|
+
};
|
|
35
|
+
lg: {
|
|
36
|
+
root: {
|
|
37
|
+
base: string;
|
|
38
|
+
withCheckbox: string;
|
|
39
|
+
withAvatar: string;
|
|
40
|
+
withDot: string;
|
|
41
|
+
withCount: string;
|
|
42
|
+
withClose: string;
|
|
43
|
+
};
|
|
44
|
+
content: string;
|
|
45
|
+
count: string;
|
|
46
|
+
};
|
|
47
|
+
};
|
|
48
|
+
/** Shared chrome for every tag root (size-specific padding lives under `sizes`). */
|
|
49
|
+
root: string;
|
|
50
|
+
/** Native root drops web-only focus/transition utilities and uses a border instead of an inset ring. */
|
|
51
|
+
rootNative: string;
|
|
52
|
+
close: {
|
|
53
|
+
sm: {
|
|
54
|
+
root: string;
|
|
55
|
+
icon: string;
|
|
56
|
+
};
|
|
57
|
+
md: {
|
|
58
|
+
root: string;
|
|
59
|
+
icon: string;
|
|
60
|
+
};
|
|
61
|
+
lg: {
|
|
62
|
+
root: string;
|
|
63
|
+
icon: string;
|
|
64
|
+
};
|
|
65
|
+
};
|
|
66
|
+
checkbox: {
|
|
67
|
+
sm: {
|
|
68
|
+
root: string;
|
|
69
|
+
icon: string;
|
|
70
|
+
};
|
|
71
|
+
md: {
|
|
72
|
+
root: string;
|
|
73
|
+
icon: string;
|
|
74
|
+
};
|
|
75
|
+
lg: {
|
|
76
|
+
root: string;
|
|
77
|
+
icon: string;
|
|
78
|
+
};
|
|
79
|
+
};
|
|
80
|
+
avatar: string;
|
|
81
|
+
count: string;
|
|
82
|
+
native: {
|
|
83
|
+
/** `text-secondary` → neutral-700 (light). */
|
|
84
|
+
labelColor: string;
|
|
85
|
+
/** `text-fg-quaternary` → neutral-400 (light) — close icon idle. */
|
|
86
|
+
closeIconColor: string;
|
|
87
|
+
/** `text-fg-quaternary_hover` → neutral-500 (light). */
|
|
88
|
+
closeIconColorPressed: string;
|
|
89
|
+
/** `text-fg-white` — checkbox glyph. */
|
|
90
|
+
checkColor: string;
|
|
91
|
+
labelText: {
|
|
92
|
+
sm: {
|
|
93
|
+
fontSize: number;
|
|
94
|
+
lineHeight: number;
|
|
95
|
+
};
|
|
96
|
+
md: {
|
|
97
|
+
fontSize: number;
|
|
98
|
+
lineHeight: number;
|
|
99
|
+
};
|
|
100
|
+
lg: {
|
|
101
|
+
fontSize: number;
|
|
102
|
+
lineHeight: number;
|
|
103
|
+
};
|
|
104
|
+
};
|
|
105
|
+
countText: {
|
|
106
|
+
sm: {
|
|
107
|
+
fontSize: number;
|
|
108
|
+
lineHeight: number;
|
|
109
|
+
};
|
|
110
|
+
md: {
|
|
111
|
+
fontSize: number;
|
|
112
|
+
lineHeight: number;
|
|
113
|
+
};
|
|
114
|
+
lg: {
|
|
115
|
+
fontSize: number;
|
|
116
|
+
lineHeight: number;
|
|
117
|
+
};
|
|
118
|
+
};
|
|
119
|
+
/** Tailwind `size-N` → `N * 4` px for RN icon components. */
|
|
120
|
+
closeIconSize: {
|
|
121
|
+
readonly sm: 10;
|
|
122
|
+
readonly md: 12;
|
|
123
|
+
readonly lg: 14;
|
|
124
|
+
};
|
|
125
|
+
closeIconStroke: {
|
|
126
|
+
readonly sm: 3.6;
|
|
127
|
+
readonly md: 2.86;
|
|
128
|
+
readonly lg: 3;
|
|
129
|
+
};
|
|
130
|
+
checkIconSize: {
|
|
131
|
+
readonly sm: 10;
|
|
132
|
+
readonly md: 12;
|
|
133
|
+
readonly lg: 14;
|
|
134
|
+
};
|
|
135
|
+
/** Avatar is always `size-4` / icon `size-3` on web. */
|
|
136
|
+
avatarSize: number;
|
|
137
|
+
avatarIconSize: number;
|
|
138
|
+
};
|
|
139
|
+
};
|
|
140
|
+
export type TagSize = keyof typeof styles.sizes;
|
|
141
|
+
//# sourceMappingURL=Tags.styles.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Tags.styles.d.ts","sourceRoot":"","sources":["../../../../../src/components/molecules/Tags/Tags.styles.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAuCjB,oFAAoF;;IAEpF,wGAAwG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAetG,8CAA8C;;QAE9C,oEAAoE;;QAEpE,wDAAwD;;QAExD,wCAAwC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAYxC,6DAA6D;;;;;;;;;;;;;;;;QAI7D,wDAAwD;;;;CAI3D,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG,MAAM,OAAO,MAAM,CAAC,KAAK,CAAC"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared `Tags` style config, read by both `index.tsx` and `index.native.tsx`.
|
|
3
|
+
*
|
|
4
|
+
* Complete literal class names only — Tailwind scans source for whole candidates.
|
|
5
|
+
* `native` holds pixel sizes and light-mode hex colours that React Native needs as
|
|
6
|
+
* plain `style` / icon props (no `currentColor`, and `Text` ignores `className` under
|
|
7
|
+
* the current `react-native-css` preview).
|
|
8
|
+
*/
|
|
9
|
+
const styles = {
|
|
10
|
+
sizes: {
|
|
11
|
+
sm: {
|
|
12
|
+
root: {
|
|
13
|
+
base: 'px-2 py-0.75 text-xs font-medium',
|
|
14
|
+
withCheckbox: 'pl-1.25',
|
|
15
|
+
withAvatar: 'pl-1',
|
|
16
|
+
withDot: 'pl-1.5',
|
|
17
|
+
withCount: 'pr-1',
|
|
18
|
+
withClose: 'pr-1',
|
|
19
|
+
},
|
|
20
|
+
content: 'gap-1',
|
|
21
|
+
count: 'px-1 text-xs font-medium',
|
|
22
|
+
},
|
|
23
|
+
md: {
|
|
24
|
+
root: {
|
|
25
|
+
base: 'px-2.25 py-0.5 text-sm font-medium',
|
|
26
|
+
withCheckbox: 'pl-1',
|
|
27
|
+
withAvatar: 'pl-1.25',
|
|
28
|
+
withDot: 'pl-1.75',
|
|
29
|
+
withCount: 'pr-0.75',
|
|
30
|
+
withClose: 'pr-1',
|
|
31
|
+
},
|
|
32
|
+
content: 'gap-1.25',
|
|
33
|
+
count: 'px-1.25 text-xs font-medium',
|
|
34
|
+
},
|
|
35
|
+
lg: {
|
|
36
|
+
root: {
|
|
37
|
+
base: 'px-2.5 py-1 text-sm font-medium',
|
|
38
|
+
withCheckbox: 'pl-1.25',
|
|
39
|
+
withAvatar: 'pl-1.75',
|
|
40
|
+
withDot: 'pl-2.25',
|
|
41
|
+
withCount: 'pr-1',
|
|
42
|
+
withClose: 'pr-1',
|
|
43
|
+
},
|
|
44
|
+
content: 'gap-1.5',
|
|
45
|
+
count: 'px-1.5 text-sm font-medium',
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
/** Native root drops web-only focus/transition utilities and uses a border instead of an inset ring. */
|
|
49
|
+
rootNative: 'flex flex-row items-center gap-0.75 rounded-md border border-primary bg-primary',
|
|
50
|
+
close: {
|
|
51
|
+
sm: { root: 'p-0.5', icon: 'size-2.5 stroke-[3.6px]' },
|
|
52
|
+
md: { root: 'p-0.5', icon: 'size-3 stroke-[2.86px]' },
|
|
53
|
+
lg: { root: 'p-0.75', icon: 'size-3.5 stroke-3' },
|
|
54
|
+
},
|
|
55
|
+
checkbox: {
|
|
56
|
+
sm: { root: 'size-3.5', icon: 'size-2.5' },
|
|
57
|
+
md: { root: 'size-4', icon: 'size-3' },
|
|
58
|
+
lg: { root: 'size-4.5', icon: 'size-3.5' },
|
|
59
|
+
},
|
|
60
|
+
avatar: 'relative inline-flex size-4 shrink-0 items-center justify-center overflow-hidden rounded-full bg-tertiary',
|
|
61
|
+
count: 'flex items-center justify-center rounded-[3px] bg-tertiary text-center',
|
|
62
|
+
native: {
|
|
63
|
+
/** `text-secondary` → neutral-700 (light). */
|
|
64
|
+
labelColor: '#404040',
|
|
65
|
+
/** `text-fg-quaternary` → neutral-400 (light) — close icon idle. */
|
|
66
|
+
closeIconColor: '#a3a3a3',
|
|
67
|
+
/** `text-fg-quaternary_hover` → neutral-500 (light). */
|
|
68
|
+
closeIconColorPressed: '#737373',
|
|
69
|
+
/** `text-fg-white` — checkbox glyph. */
|
|
70
|
+
checkColor: '#ffffff',
|
|
71
|
+
labelText: {
|
|
72
|
+
sm: { fontSize: 12, lineHeight: 16 },
|
|
73
|
+
md: { fontSize: 14, lineHeight: 20 },
|
|
74
|
+
lg: { fontSize: 14, lineHeight: 20 },
|
|
75
|
+
},
|
|
76
|
+
countText: {
|
|
77
|
+
sm: { fontSize: 12, lineHeight: 16 },
|
|
78
|
+
md: { fontSize: 12, lineHeight: 16 },
|
|
79
|
+
lg: { fontSize: 14, lineHeight: 20 },
|
|
80
|
+
},
|
|
81
|
+
/** Tailwind `size-N` → `N * 4` px for RN icon components. */
|
|
82
|
+
closeIconSize: { sm: 10, md: 12, lg: 14 },
|
|
83
|
+
closeIconStroke: { sm: 3.6, md: 2.86, lg: 3 },
|
|
84
|
+
checkIconSize: { sm: 10, md: 12, lg: 14 },
|
|
85
|
+
/** Avatar is always `size-4` / icon `size-3` on web. */
|
|
86
|
+
avatarSize: 16,
|
|
87
|
+
avatarIconSize: 12,
|
|
88
|
+
},
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
export { styles };
|
|
92
|
+
//# sourceMappingURL=Tags.styles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Tags.styles.js","sources":["../../../../../../src/components/molecules/Tags/Tags.styles.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,99 @@
|
|
|
1
|
+
import { type DotColor } from '@flipdish/ui-library/components/atoms/Dot';
|
|
2
|
+
import { type ReactNode } from 'react';
|
|
3
|
+
import { type TagSize } from './Tags.styles';
|
|
4
|
+
export type { DotColor } from '@flipdish/ui-library/components/atoms/Dot';
|
|
5
|
+
export type { TagSize } from './Tags.styles';
|
|
6
|
+
type SelectionMode = 'none' | 'single' | 'multiple';
|
|
7
|
+
type TagKey = string | number;
|
|
8
|
+
export interface TagItem {
|
|
9
|
+
id: string;
|
|
10
|
+
label: string;
|
|
11
|
+
count?: number;
|
|
12
|
+
avatarSrc?: string;
|
|
13
|
+
avatarContrastBorder?: boolean;
|
|
14
|
+
dot?: boolean;
|
|
15
|
+
/** Semantic fill for the status dot; same tokens as `Dot`'s `color`. Defaults to `fg-success-secondary`. */
|
|
16
|
+
dotColor?: DotColor;
|
|
17
|
+
isDisabled?: boolean;
|
|
18
|
+
onClose?: (id: string) => void;
|
|
19
|
+
}
|
|
20
|
+
export interface TagAvatarProps {
|
|
21
|
+
/** Image URL; when missing or load fails, a user silhouette icon is shown. */
|
|
22
|
+
src?: string;
|
|
23
|
+
/** Accessible name for the image. */
|
|
24
|
+
alt?: string;
|
|
25
|
+
/** Thin dark outline so the avatar stays visible on light surfaces. */
|
|
26
|
+
contrastBorder?: boolean;
|
|
27
|
+
/** Layout classes merged onto the root `View`. */
|
|
28
|
+
className?: string;
|
|
29
|
+
}
|
|
1
30
|
/**
|
|
2
|
-
* `
|
|
31
|
+
* Small round avatar at the start of a native `Tag`. Same fallback behaviour as web;
|
|
32
|
+
* contrast border uses a `border` rather than CSS `outline`.
|
|
3
33
|
*
|
|
4
|
-
*
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
34
|
+
* @summary small round avatar for a tag (React Native)
|
|
35
|
+
*/
|
|
36
|
+
export declare const TagAvatar: ({ src, alt, contrastBorder, className }: TagAvatarProps) => import("react").JSX.Element;
|
|
37
|
+
export interface TagGroupProps {
|
|
38
|
+
/** Accessible name of the group. */
|
|
39
|
+
label: string;
|
|
40
|
+
/** Size of every `Tag` in the group, shared through context. */
|
|
41
|
+
size?: TagSize;
|
|
42
|
+
/** `'none'` display-only; `'single'` one at a time; `'multiple'` any combination. */
|
|
43
|
+
selectionMode?: SelectionMode;
|
|
44
|
+
/** Controlled selected keys. */
|
|
45
|
+
selectedKeys?: Iterable<TagKey>;
|
|
46
|
+
/** Initial selection for uncontrolled usage. */
|
|
47
|
+
defaultSelectedKeys?: Iterable<TagKey>;
|
|
48
|
+
/** Called whenever the selection set changes. */
|
|
49
|
+
onSelectionChange?: (keys: Set<TagKey>) => void;
|
|
50
|
+
/** The `TagList` (and its `Tag` children). */
|
|
51
|
+
children?: ReactNode;
|
|
52
|
+
/** Layout classes merged onto the root `View`. */
|
|
53
|
+
className?: string;
|
|
54
|
+
/**
|
|
55
|
+
* Overrides the derived root `testID` (defaults to `fd-tag-group`).
|
|
56
|
+
* Tags derive their ids from this prefix, so overriding it re-roots every
|
|
57
|
+
* non-overridden `Tag` beneath it.
|
|
58
|
+
*/
|
|
59
|
+
'data-testid'?: string;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* React Native `TagGroup` — display-only, single-select, multi-select and removable
|
|
63
|
+
* tags built from `View` / `Pressable` instead of react-aria. Keyboard Backspace/Delete
|
|
64
|
+
* removal (`onRemove`) and `dotClassName` are web-only; use `onClose` per tag and
|
|
65
|
+
* `dotColor` for status-dot colour.
|
|
66
|
+
*
|
|
67
|
+
* @summary group of tags for filtering, selection or categorisation (React Native)
|
|
68
|
+
*/
|
|
69
|
+
export declare const TagGroup: ({ label, selectionMode, size, selectedKeys: selectedKeysProp, defaultSelectedKeys, onSelectionChange, children, className, "data-testid": dataTestId, }: TagGroupProps) => import("react").JSX.Element;
|
|
70
|
+
export interface TagListProps {
|
|
71
|
+
/** The `Tag` items. */
|
|
72
|
+
children?: ReactNode;
|
|
73
|
+
/** Layout classes — typically `flex flex-row flex-wrap gap-2`. */
|
|
74
|
+
className?: string;
|
|
75
|
+
}
|
|
76
|
+
/** Horizontal wrapping row of tags inside a `TagGroup`. */
|
|
77
|
+
export declare const TagList: ({ children, className }: TagListProps) => import("react").JSX.Element;
|
|
78
|
+
export interface TagProps extends Omit<TagItem, 'label' | 'id'> {
|
|
79
|
+
/** Stable id used for selection, removal and the derived `testID`. */
|
|
80
|
+
id: TagKey;
|
|
81
|
+
/** Tag label — strings are wrapped in `Text`; other nodes render as-is. */
|
|
82
|
+
children?: ReactNode;
|
|
83
|
+
/** Layout classes merged onto the root. */
|
|
84
|
+
className?: string;
|
|
85
|
+
/**
|
|
86
|
+
* Overrides the derived `testID` for this tag (defaults to
|
|
87
|
+
* `<root>--tag-<slug>`, slugified from `id`).
|
|
88
|
+
*/
|
|
89
|
+
'data-testid'?: string;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* React Native `Tag` — optional avatar or status dot, count, selection checkbox and
|
|
93
|
+
* remove button. Selection and close use `Pressable`; label colour is a light-mode hex
|
|
94
|
+
* because `Text` ignores `className` under the current `react-native-css` preview.
|
|
8
95
|
*
|
|
9
|
-
*
|
|
10
|
-
* its `index.tsx` — the build picks it up automatically and this stub disappears.
|
|
96
|
+
* @summary single tag with optional adornments and selection (React Native)
|
|
11
97
|
*/
|
|
12
|
-
export declare const
|
|
98
|
+
export declare const Tag: ({ id, avatarSrc, avatarContrastBorder, dot, dotColor, isDisabled, count, className, children, onClose, "data-testid": dataTestId, }: TagProps) => import("react").JSX.Element;
|
|
99
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/molecules/Tags/index.native.tsx"],"names":[],"mappings":"AACA,OAAO,EAAO,KAAK,QAAQ,EAAE,MAAM,2CAA2C,CAAC;AAG/E,OAAO,EAAiB,KAAK,SAAS,EAAwB,MAAM,OAAO,CAAC;AAE5E,OAAO,EAAU,KAAK,OAAO,EAAE,MAAM,eAAe,CAAC;AAKrD,YAAY,EAAE,QAAQ,EAAE,MAAM,2CAA2C,CAAC;AAC1E,YAAY,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C,KAAK,aAAa,GAAG,MAAM,GAAG,QAAQ,GAAG,UAAU,CAAC;AACpD,KAAK,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAE9B,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,4GAA4G;IAC5G,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;CAChC;AAgBD,MAAM,WAAW,cAAc;IAC7B,8EAA8E;IAC9E,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,qCAAqC;IACrC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,uEAAuE;IACvE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,kDAAkD;IAClD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;GAKG;AACH,eAAO,MAAM,SAAS,GAAI,yCAAgD,cAAc,gCAqBvF,CAAC;AAEF,MAAM,WAAW,aAAa;IAC5B,oCAAoC;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,gEAAgE;IAChE,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,qFAAqF;IACrF,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,gCAAgC;IAChC,YAAY,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAChC,gDAAgD;IAChD,mBAAmB,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IACvC,iDAAiD;IACjD,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC;IAChD,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,kDAAkD;IAClD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAID;;;;;;;GAOG;AACH,eAAO,MAAM,QAAQ,GAAI,yJAUtB,aAAa,gCAgCf,CAAC;AAEF,MAAM,WAAW,YAAY;IAC3B,uBAAuB;IACvB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,kEAAkE;IAClE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,2DAA2D;AAC3D,eAAO,MAAM,OAAO,GAAI,yBAAyB,YAAY,gCAAuF,CAAC;AAErJ,MAAM,WAAW,QAAS,SAAQ,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IAC7D,sEAAsE;IACtE,EAAE,EAAE,MAAM,CAAC;IACX,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAKD;;;;;;GAMG;AACH,eAAO,MAAM,GAAG,GAAI,qIAYjB,QAAQ,gCA6GV,CAAC"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
2
|
+
import { Check, X, User01 } from '@flipdish/ui-icons';
|
|
3
|
+
import { Dot } from '../../atoms/Dot/index.js';
|
|
4
|
+
import { cx } from '../../../utilities/cx/index.js';
|
|
5
|
+
import { useTestIdPrefix, slugifyTestId, useResolvedTestId, TestIdProvider, joinTestId } from '../../../utilities/testIdUtils/index.js';
|
|
6
|
+
import { createContext, useContext, useState } from 'react';
|
|
7
|
+
import { Text, View, Pressable, Image } from 'react-native';
|
|
8
|
+
import { styles } from './Tags.styles.js';
|
|
9
|
+
|
|
10
|
+
/** Grows the close target outward only — a left slop would cover the end of the label. */
|
|
11
|
+
const CLOSE_HIT_SLOP = { top: 8, bottom: 8, right: 8 };
|
|
12
|
+
const TagGroupContext = createContext({
|
|
13
|
+
selectionMode: 'none',
|
|
14
|
+
size: 'sm',
|
|
15
|
+
selectedKeys: new Set(),
|
|
16
|
+
toggle: () => undefined,
|
|
17
|
+
});
|
|
18
|
+
/**
|
|
19
|
+
* Small round avatar at the start of a native `Tag`. Same fallback behaviour as web;
|
|
20
|
+
* contrast border uses a `border` rather than CSS `outline`.
|
|
21
|
+
*
|
|
22
|
+
* @summary small round avatar for a tag (React Native)
|
|
23
|
+
*/
|
|
24
|
+
const TagAvatar = ({ src, alt, contrastBorder = true, className }) => {
|
|
25
|
+
const [isFailed, setIsFailed] = useState(false);
|
|
26
|
+
const size = styles.native.avatarSize;
|
|
27
|
+
return (jsx(View, { className: cx(styles.avatar, contrastBorder && 'border border-black/16', className), style: { width: size, height: size, borderRadius: size / 2 }, children: src && !isFailed ? (jsx(Image, { source: { uri: src }, accessibilityLabel: alt, onError: () => setIsFailed(true), style: { width: size, height: size, borderRadius: size / 2 } })) : (jsx(User01, { size: styles.native.avatarIconSize, color: styles.native.closeIconColor })) }));
|
|
28
|
+
};
|
|
29
|
+
const toKeySet = (keys) => new Set(keys ?? []);
|
|
30
|
+
/**
|
|
31
|
+
* React Native `TagGroup` — display-only, single-select, multi-select and removable
|
|
32
|
+
* tags built from `View` / `Pressable` instead of react-aria. Keyboard Backspace/Delete
|
|
33
|
+
* removal (`onRemove`) and `dotClassName` are web-only; use `onClose` per tag and
|
|
34
|
+
* `dotColor` for status-dot colour.
|
|
35
|
+
*
|
|
36
|
+
* @summary group of tags for filtering, selection or categorisation (React Native)
|
|
37
|
+
*/
|
|
38
|
+
const TagGroup = ({ label, selectionMode = 'none', size = 'sm', selectedKeys: selectedKeysProp, defaultSelectedKeys, onSelectionChange, children, className, 'data-testid': dataTestId, }) => {
|
|
39
|
+
const rootTestId = useResolvedTestId({ testId: dataTestId, segment: 'tag-group', rootName: 'tag-group' });
|
|
40
|
+
const [uncontrolledKeys, setUncontrolledKeys] = useState(() => toKeySet(defaultSelectedKeys));
|
|
41
|
+
const selectedKeys = selectedKeysProp !== undefined ? toKeySet(selectedKeysProp) : uncontrolledKeys;
|
|
42
|
+
const toggle = (id) => {
|
|
43
|
+
if (selectionMode === 'none')
|
|
44
|
+
return;
|
|
45
|
+
const next = new Set(selectedKeys);
|
|
46
|
+
if (selectionMode === 'single') {
|
|
47
|
+
if (next.has(id) && next.size === 1)
|
|
48
|
+
return;
|
|
49
|
+
next.clear();
|
|
50
|
+
next.add(id);
|
|
51
|
+
}
|
|
52
|
+
else if (next.has(id)) {
|
|
53
|
+
next.delete(id);
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
next.add(id);
|
|
57
|
+
}
|
|
58
|
+
if (selectedKeysProp === undefined)
|
|
59
|
+
setUncontrolledKeys(next);
|
|
60
|
+
onSelectionChange?.(next);
|
|
61
|
+
};
|
|
62
|
+
return (jsx(TagGroupContext.Provider, { value: { selectionMode, size, selectedKeys, toggle }, children: jsx(TestIdProvider, { value: rootTestId, children: jsx(View, { testID: rootTestId, accessibilityLabel: label, className: className, children: children }) }) }));
|
|
63
|
+
};
|
|
64
|
+
/** Horizontal wrapping row of tags inside a `TagGroup`. */
|
|
65
|
+
const TagList = ({ children, className }) => jsx(View, { className: cx('flex flex-row flex-wrap gap-2', className), children: children });
|
|
66
|
+
// Check icon is authored at 24px; web's 14px viewBox used stroke 2 → 24/7 for equivalent weight.
|
|
67
|
+
const CHECK_STROKE = 24 / 7;
|
|
68
|
+
/**
|
|
69
|
+
* React Native `Tag` — optional avatar or status dot, count, selection checkbox and
|
|
70
|
+
* remove button. Selection and close use `Pressable`; label colour is a light-mode hex
|
|
71
|
+
* because `Text` ignores `className` under the current `react-native-css` preview.
|
|
72
|
+
*
|
|
73
|
+
* @summary single tag with optional adornments and selection (React Native)
|
|
74
|
+
*/
|
|
75
|
+
const Tag = ({ id, avatarSrc, avatarContrastBorder = true, dot, dotColor = 'fg-success-secondary', isDisabled, count, className, children, onClose, 'data-testid': dataTestId, }) => {
|
|
76
|
+
const context = useContext(TagGroupContext);
|
|
77
|
+
const prefix = useTestIdPrefix();
|
|
78
|
+
const idPart = slugifyTestId(String(id));
|
|
79
|
+
const tagTestId = dataTestId ?? (prefix ? joinTestId(prefix, `tag-${idPart}`) : undefined);
|
|
80
|
+
const closeTestId = tagTestId ? `${tagTestId}-close` : undefined;
|
|
81
|
+
const isSelected = context.selectedKeys.has(id);
|
|
82
|
+
const inSelectionGroup = context.selectionMode !== 'none';
|
|
83
|
+
const sizeStyles = styles.sizes[context.size];
|
|
84
|
+
const [closePressed, setClosePressed] = useState(false);
|
|
85
|
+
const leadingContent = avatarSrc ? (jsx(TagAvatar, { src: avatarSrc, alt: "Avatar", contrastBorder: avatarContrastBorder })) : dot ? (jsx(Dot, { color: dotColor, size: "sm" })) : null;
|
|
86
|
+
const labelNode = typeof children === 'string' || typeof children === 'number' ? (jsx(Text, { style: { color: styles.native.labelColor, fontWeight: '500', ...styles.native.labelText[context.size] }, children: children })) : (children);
|
|
87
|
+
const body = (jsxs(Fragment, { children: [jsxs(View, { className: cx('flex flex-row items-center gap-1', sizeStyles.content), children: [context.selectionMode !== 'none' && (jsx(View, { className: cx('items-center justify-center rounded border border-primary bg-primary', styles.checkbox[context.size].root, isSelected && 'border-brand-solid bg-brand-solid', isDisabled && 'opacity-50', isDisabled && !isSelected && 'bg-tertiary'), children: isSelected ? (jsx(Check, { size: styles.native.checkIconSize[context.size], color: styles.native.checkColor, strokeWidth: CHECK_STROKE })) : null })), leadingContent, labelNode, typeof count === 'number' && (jsx(View, { className: cx(styles.count, sizeStyles.count), children: jsx(Text, { style: { color: styles.native.labelColor, fontWeight: '500', ...styles.native.countText[context.size] }, children: count }) }))] }), onClose && (jsx(Pressable, { testID: closeTestId, accessibilityRole: "button", accessibilityLabel: "Remove this tag", disabled: isDisabled, hitSlop: CLOSE_HIT_SLOP, onPress: () => onClose(String(id)), onPressIn: () => setClosePressed(true), onPressOut: () => setClosePressed(false), className: cx('items-center justify-center rounded-[3px]', styles.close[context.size].root, closePressed && 'bg-primary_hover'), children: jsx(X, { size: styles.native.closeIconSize[context.size], color: closePressed ? styles.native.closeIconColorPressed : styles.native.closeIconColor, strokeWidth: styles.native.closeIconStroke[context.size] }) }))] }));
|
|
88
|
+
const rootClassName = cx(styles.rootNative, sizeStyles.root.base, avatarSrc && sizeStyles.root.withAvatar, onClose && sizeStyles.root.withClose, dot && sizeStyles.root.withDot, typeof count === 'number' && sizeStyles.root.withCount, inSelectionGroup && sizeStyles.root.withCheckbox, className);
|
|
89
|
+
// Keep Pressable (with `disabled`) for any selectable group so a disabled+selected tag
|
|
90
|
+
// still exposes checkbox role and checked state; plain View only when display-only.
|
|
91
|
+
if (inSelectionGroup) {
|
|
92
|
+
return (jsx(Pressable, { testID: tagTestId, disabled: isDisabled, onPress: () => context.toggle(id), accessibilityRole: "checkbox", accessibilityState: { checked: isSelected, disabled: Boolean(isDisabled) }, className: rootClassName, children: body }));
|
|
93
|
+
}
|
|
94
|
+
return (jsx(View, { testID: tagTestId, accessibilityState: { disabled: Boolean(isDisabled) }, className: rootClassName, children: body }));
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
export { Tag, TagAvatar, TagGroup, TagList };
|
|
98
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../../../src/components/molecules/Tags/index.native.tsx"],"sourcesContent":[null],"names":["_jsx","_jsxs","_Fragment","XClose"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flipdish/ui-library",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.42.0",
|
|
4
4
|
"description": "Flipdish Design System — atomic-design component library (Tailwind v4 + UntitledUI + React Aria).",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"imports": {
|
|
@@ -230,7 +230,7 @@
|
|
|
230
230
|
"@storybook/addon-a11y": "^10.5.8",
|
|
231
231
|
"@storybook/addon-docs": "^10.5.8",
|
|
232
232
|
"@storybook/addon-mcp": "^0.7.0",
|
|
233
|
-
"@storybook/addon-vitest": "10.6.
|
|
233
|
+
"@storybook/addon-vitest": "10.6.3",
|
|
234
234
|
"@storybook/react-vite": "^10.5.8",
|
|
235
235
|
"@tailwindcss/vite": "^4.3.1",
|
|
236
236
|
"@testing-library/jest-dom": "^6.9.1",
|