@thewhileloop/whileui 2.0.0 → 4.0.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.
Files changed (74) hide show
  1. package/README.md +135 -70
  2. package/dist/blocks/commerce/metric-card.d.ts +9 -29
  3. package/dist/blocks/datepicker/date-range-picker-modal.d.ts +1 -1
  4. package/dist/blocks/datepicker/date-range-picker-modal.js +6 -14
  5. package/dist/blocks/datepicker/datepicker-modal.d.ts +1 -1
  6. package/dist/blocks/datepicker/datepicker-modal.js +6 -12
  7. package/dist/blocks/datepicker/index.d.ts +1 -0
  8. package/dist/blocks/datepicker/index.js +1 -0
  9. package/dist/blocks/datepicker/time-picker-modal.d.ts +43 -0
  10. package/dist/blocks/datepicker/time-picker-modal.js +187 -0
  11. package/dist/blocks/layout/smart-input.d.ts +3 -2
  12. package/dist/blocks/layout/smart-input.js +33 -18
  13. package/dist/blocks/media/smart-image.d.ts +39 -98
  14. package/dist/blocks/navigation/drawer-menu.js +88 -72
  15. package/dist/components/alert/alert.d.ts +23 -55
  16. package/dist/components/alert/alert.js +1 -1
  17. package/dist/components/alert-dialog/alert-dialog.js +1 -4
  18. package/dist/components/avatar/avatar.d.ts +18 -45
  19. package/dist/components/avatar/avatar.js +1 -1
  20. package/dist/components/badge/badge.d.ts +84 -212
  21. package/dist/components/button/button.d.ts +69 -188
  22. package/dist/components/card/card.d.ts +29 -73
  23. package/dist/components/card/card.js +1 -1
  24. package/dist/components/container/container.d.ts +24 -96
  25. package/dist/components/data-row/data-row.d.ts +18 -38
  26. package/dist/components/data-row/data-row.js +1 -1
  27. package/dist/components/fab/fab.d.ts +87 -0
  28. package/dist/components/fab/fab.js +59 -0
  29. package/dist/components/fab/index.d.ts +1 -0
  30. package/dist/components/fab/index.js +1 -0
  31. package/dist/components/form-field/form-field.d.ts +31 -87
  32. package/dist/components/form-field/form-field.js +1 -1
  33. package/dist/components/hover-card/hover-card.d.ts +3 -2
  34. package/dist/components/input/input.d.ts +18 -31
  35. package/dist/components/input/input.js +20 -8
  36. package/dist/components/label/label.d.ts +3 -3
  37. package/dist/components/labeled-field/labeled-field.d.ts +3 -2
  38. package/dist/components/numeric-input/numeric-input.d.ts +27 -82
  39. package/dist/components/numeric-input/numeric-input.js +79 -80
  40. package/dist/components/otp-input/otp-input.d.ts +21 -65
  41. package/dist/components/popover/popover.d.ts +4 -3
  42. package/dist/components/pressable/pressable.d.ts +3 -3
  43. package/dist/components/progress/progress.d.ts +15 -39
  44. package/dist/components/row/row.d.ts +63 -163
  45. package/dist/components/segmented-control/segmented-control.d.ts +69 -241
  46. package/dist/components/select/select.d.ts +10 -22
  47. package/dist/components/select/select.js +2 -7
  48. package/dist/components/separator/separator.d.ts +3 -3
  49. package/dist/components/skeleton/skeleton.d.ts +9 -29
  50. package/dist/components/spinner/spinner.d.ts +12 -36
  51. package/dist/components/stack/stack.d.ts +63 -163
  52. package/dist/components/tabs/tabs.d.ts +9 -29
  53. package/dist/components/text/text.d.ts +51 -131
  54. package/dist/components/textarea/textarea.d.ts +15 -39
  55. package/dist/components/textarea/textarea.js +3 -3
  56. package/dist/components/toast/toast.d.ts +12 -36
  57. package/dist/components/toggle/toggle.d.ts +42 -138
  58. package/dist/components/toggle-group/toggle-group.d.ts +42 -138
  59. package/dist/components/tooltip/tooltip.d.ts +3 -2
  60. package/dist/components/view/view.d.ts +3 -3
  61. package/dist/index.d.ts +2 -1
  62. package/dist/index.js +2 -1
  63. package/dist/lib/focus-ring.d.ts +10 -0
  64. package/dist/lib/focus-ring.js +10 -0
  65. package/dist/lib/interaction-tokens.d.ts +24 -1
  66. package/dist/lib/interaction-tokens.js +26 -44
  67. package/dist/lib/motion-policy.js +2 -2
  68. package/dist/lib/ref-types.d.ts +3 -0
  69. package/dist/lib/ref-types.js +1 -0
  70. package/dist/lib/theme-bridge.d.ts +4 -2
  71. package/dist/lib/theme-bridge.js +13 -9
  72. package/dist/lib/theme-presets.d.ts +26 -0
  73. package/dist/lib/theme-presets.js +28 -0
  74. package/package.json +29 -28
@@ -2,308 +2,136 @@ import React from 'react';
2
2
  import { type PressableProps, type TextProps, type ViewProps } from 'react-native';
3
3
  declare const segmentedControlVariants: import("tailwind-variants").TVReturnType<{
4
4
  variant: {
5
- default: string;
6
- pill: string;
5
+ default: "";
6
+ pill: "";
7
7
  };
8
8
  wrap: {
9
- true: string;
10
- false: string;
9
+ true: "flex-wrap justify-center gap-1";
10
+ false: "flex-nowrap gap-1";
11
11
  };
12
12
  size: {
13
- default: string;
14
- compact: string;
13
+ default: "";
14
+ compact: "";
15
15
  };
16
- }, undefined, "w-full flex-row items-center", import("tailwind-variants/dist/config.js").TVConfig<{
16
+ }, undefined, "w-full flex-row items-center", {
17
17
  variant: {
18
- default: string;
19
- pill: string;
18
+ default: "";
19
+ pill: "";
20
20
  };
21
21
  wrap: {
22
- true: string;
23
- false: string;
22
+ true: "flex-wrap justify-center gap-1";
23
+ false: "flex-nowrap gap-1";
24
24
  };
25
25
  size: {
26
- default: string;
27
- compact: string;
26
+ default: "";
27
+ compact: "";
28
28
  };
29
- }, {
29
+ }, undefined, import("tailwind-variants").TVReturnTypeLike<{
30
30
  variant: {
31
- default: string;
32
- pill: string;
31
+ default: "";
32
+ pill: "";
33
33
  };
34
34
  wrap: {
35
- true: string;
36
- false: string;
35
+ true: "flex-wrap justify-center gap-1";
36
+ false: "flex-nowrap gap-1";
37
37
  };
38
38
  size: {
39
- default: string;
40
- compact: string;
39
+ default: "";
40
+ compact: "";
41
41
  };
42
- }>, {
43
- variant: {
44
- default: string;
45
- pill: string;
46
- };
47
- wrap: {
48
- true: string;
49
- false: string;
50
- };
51
- size: {
52
- default: string;
53
- compact: string;
54
- };
55
- }, undefined, import("tailwind-variants").TVReturnType<{
56
- variant: {
57
- default: string;
58
- pill: string;
59
- };
60
- wrap: {
61
- true: string;
62
- false: string;
63
- };
64
- size: {
65
- default: string;
66
- compact: string;
67
- };
68
- }, undefined, "w-full flex-row items-center", import("tailwind-variants/dist/config.js").TVConfig<{
69
- variant: {
70
- default: string;
71
- pill: string;
72
- };
73
- wrap: {
74
- true: string;
75
- false: string;
76
- };
77
- size: {
78
- default: string;
79
- compact: string;
80
- };
81
- }, {
82
- variant: {
83
- default: string;
84
- pill: string;
85
- };
86
- wrap: {
87
- true: string;
88
- false: string;
89
- };
90
- size: {
91
- default: string;
92
- compact: string;
93
- };
94
- }>, unknown, unknown, undefined>>;
42
+ }, undefined>>;
95
43
  declare const segmentedControlItemVariants: import("tailwind-variants").TVReturnType<{
96
44
  variant: {
97
- default: string;
98
- pill: string;
99
- };
100
- selected: {
101
- true: string;
102
- false: string;
103
- };
104
- size: {
105
- default: string;
106
- compact: string;
107
- };
108
- disabled: {
109
- true: string;
110
- false: string;
111
- };
112
- wrap: {
113
- true: string;
114
- false: string;
115
- };
116
- }, undefined, "min-w-0 flex-row items-center justify-center", import("tailwind-variants/dist/config.js").TVConfig<{
117
- variant: {
118
- default: string;
119
- pill: string;
120
- };
121
- selected: {
122
- true: string;
123
- false: string;
124
- };
125
- size: {
126
- default: string;
127
- compact: string;
128
- };
129
- disabled: {
130
- true: string;
131
- false: string;
132
- };
133
- wrap: {
134
- true: string;
135
- false: string;
136
- };
137
- }, {
138
- variant: {
139
- default: string;
140
- pill: string;
141
- };
142
- selected: {
143
- true: string;
144
- false: string;
145
- };
146
- size: {
147
- default: string;
148
- compact: string;
149
- };
150
- disabled: {
151
- true: string;
152
- false: string;
153
- };
154
- wrap: {
155
- true: string;
156
- false: string;
157
- };
158
- }>, {
159
- variant: {
160
- default: string;
161
- pill: string;
162
- };
163
- selected: {
164
- true: string;
165
- false: string;
166
- };
167
- size: {
168
- default: string;
169
- compact: string;
170
- };
171
- disabled: {
172
- true: string;
173
- false: string;
174
- };
175
- wrap: {
176
- true: string;
177
- false: string;
178
- };
179
- }, undefined, import("tailwind-variants").TVReturnType<{
180
- variant: {
181
- default: string;
182
- pill: string;
45
+ default: "";
46
+ pill: "";
183
47
  };
184
48
  selected: {
185
- true: string;
186
- false: string;
49
+ true: "";
50
+ false: "";
187
51
  };
188
52
  size: {
189
- default: string;
190
- compact: string;
53
+ default: "";
54
+ compact: "";
191
55
  };
192
56
  disabled: {
193
- true: string;
194
- false: string;
57
+ true: "";
58
+ false: "";
195
59
  };
196
60
  wrap: {
197
- true: string;
198
- false: string;
61
+ true: "grow-0";
62
+ false: "flex-1";
199
63
  };
200
- }, undefined, "min-w-0 flex-row items-center justify-center", import("tailwind-variants/dist/config.js").TVConfig<{
64
+ }, undefined, "min-w-0 flex-row items-center justify-center", {
201
65
  variant: {
202
- default: string;
203
- pill: string;
66
+ default: "";
67
+ pill: "";
204
68
  };
205
69
  selected: {
206
- true: string;
207
- false: string;
70
+ true: "";
71
+ false: "";
208
72
  };
209
73
  size: {
210
- default: string;
211
- compact: string;
74
+ default: "";
75
+ compact: "";
212
76
  };
213
77
  disabled: {
214
- true: string;
215
- false: string;
78
+ true: "";
79
+ false: "";
216
80
  };
217
81
  wrap: {
218
- true: string;
219
- false: string;
82
+ true: "grow-0";
83
+ false: "flex-1";
220
84
  };
221
- }, {
85
+ }, undefined, import("tailwind-variants").TVReturnTypeLike<{
222
86
  variant: {
223
- default: string;
224
- pill: string;
87
+ default: "";
88
+ pill: "";
225
89
  };
226
90
  selected: {
227
- true: string;
228
- false: string;
91
+ true: "";
92
+ false: "";
229
93
  };
230
94
  size: {
231
- default: string;
232
- compact: string;
95
+ default: "";
96
+ compact: "";
233
97
  };
234
98
  disabled: {
235
- true: string;
236
- false: string;
99
+ true: "";
100
+ false: "";
237
101
  };
238
102
  wrap: {
239
- true: string;
240
- false: string;
103
+ true: "grow-0";
104
+ false: "flex-1";
241
105
  };
242
- }>, unknown, unknown, undefined>>;
106
+ }, undefined>>;
243
107
  declare const segmentedControlItemTextVariants: import("tailwind-variants").TVReturnType<{
244
108
  selected: {
245
- true: string;
246
- false: string;
247
- };
248
- size: {
249
- default: string;
250
- compact: string;
251
- };
252
- }, undefined, "font-medium", import("tailwind-variants/dist/config.js").TVConfig<{
253
- selected: {
254
- true: string;
255
- false: string;
256
- };
257
- size: {
258
- default: string;
259
- compact: string;
260
- };
261
- }, {
262
- selected: {
263
- true: string;
264
- false: string;
265
- };
266
- size: {
267
- default: string;
268
- compact: string;
269
- };
270
- }>, {
271
- selected: {
272
- true: string;
273
- false: string;
274
- };
275
- size: {
276
- default: string;
277
- compact: string;
278
- };
279
- }, undefined, import("tailwind-variants").TVReturnType<{
280
- selected: {
281
- true: string;
282
- false: string;
109
+ true: "text-foreground";
110
+ false: "text-muted-foreground";
283
111
  };
284
112
  size: {
285
- default: string;
286
- compact: string;
113
+ default: "";
114
+ compact: "";
287
115
  };
288
- }, undefined, "font-medium", import("tailwind-variants/dist/config.js").TVConfig<{
116
+ }, undefined, "font-medium", {
289
117
  selected: {
290
- true: string;
291
- false: string;
118
+ true: "text-foreground";
119
+ false: "text-muted-foreground";
292
120
  };
293
121
  size: {
294
- default: string;
295
- compact: string;
122
+ default: "";
123
+ compact: "";
296
124
  };
297
- }, {
125
+ }, undefined, import("tailwind-variants").TVReturnTypeLike<{
298
126
  selected: {
299
- true: string;
300
- false: string;
127
+ true: "text-foreground";
128
+ false: "text-muted-foreground";
301
129
  };
302
130
  size: {
303
- default: string;
304
- compact: string;
131
+ default: "";
132
+ compact: "";
305
133
  };
306
- }>, unknown, unknown, undefined>>;
134
+ }, undefined>>;
307
135
  export interface SegmentedControlProps extends ViewProps {
308
136
  value?: string;
309
137
  defaultValue?: string;
@@ -1,7 +1,8 @@
1
1
  import * as React from 'react';
2
- import { ScrollView, View, type StyleProp, type ViewStyle } from 'react-native';
2
+ import { ScrollView, type StyleProp, type ViewStyle } from 'react-native';
3
3
  import * as SelectPrimitive from '@rn-primitives/select';
4
4
  import { type FrostedSurfaceProps } from '../../lib/frosted-surface';
5
+ import type { ForwardRefComponent } from '../../lib/ref-types';
5
6
  export type SelectOption = SelectPrimitive.Option;
6
7
  export type SelectTriggerRef = SelectPrimitive.TriggerRef;
7
8
  export interface SelectProps {
@@ -55,31 +56,18 @@ export interface SelectLabelProps extends React.ComponentPropsWithoutRef<typeof
55
56
  export interface SelectSeparatorProps extends React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator> {
56
57
  className?: string;
57
58
  }
58
- declare const Select: React.ForwardRefExoticComponent<import("react-native").ViewProps & {
59
- asChild?: boolean;
60
- } & {
61
- value?: import("@rn-primitives/select").Option;
62
- defaultValue?: import("@rn-primitives/select").Option;
63
- onValueChange?: (option: import("@rn-primitives/select").Option) => void;
64
- onOpenChange?: (open: boolean) => void;
65
- disabled?: boolean;
66
- dir?: "ltr" | "rtl";
67
- name?: string;
68
- required?: boolean;
69
- } & React.RefAttributes<View>>;
70
- declare const SelectGroup: React.ForwardRefExoticComponent<import("react-native").ViewProps & {
71
- asChild?: boolean;
72
- } & React.RefAttributes<View>>;
73
- declare const SelectTrigger: React.ForwardRefExoticComponent<SelectTriggerProps & React.RefAttributes<SelectPrimitive.TriggerRef>>;
74
- declare function SelectValue({ className, placeholder, ...props }: SelectValueProps & React.RefAttributes<SelectPrimitive.ValueRef>): React.JSX.Element;
75
- declare const SelectContent: React.ForwardRefExoticComponent<SelectContentProps & React.RefAttributes<View>>;
76
- declare const SelectItem: React.ForwardRefExoticComponent<SelectItemProps & React.RefAttributes<View>>;
59
+ declare const Select: typeof SelectPrimitive.Root;
60
+ declare const SelectGroup: typeof SelectPrimitive.Group;
61
+ declare const SelectTrigger: ForwardRefComponent<SelectTriggerRef, SelectTriggerProps>;
62
+ declare function SelectValue({ className, placeholder }: SelectValueProps): React.JSX.Element;
63
+ declare const SelectContent: ForwardRefComponent<SelectPrimitive.ContentRef, SelectContentProps>;
64
+ declare const SelectItem: ForwardRefComponent<SelectPrimitive.ItemRef, SelectItemProps>;
77
65
  declare function SelectItemIcon({ className, children }: SelectItemIconProps): React.JSX.Element;
78
66
  declare namespace SelectItemIcon {
79
67
  var displayName: string;
80
68
  }
81
- declare const SelectLabel: React.ForwardRefExoticComponent<SelectLabelProps & React.RefAttributes<import("react-native").Text>>;
82
- declare const SelectSeparator: React.ForwardRefExoticComponent<SelectSeparatorProps & React.RefAttributes<View>>;
69
+ declare const SelectLabel: ForwardRefComponent<SelectPrimitive.LabelRef, SelectLabelProps>;
70
+ declare const SelectSeparator: ForwardRefComponent<SelectPrimitive.SeparatorRef, SelectSeparatorProps>;
83
71
  /**
84
72
  * @platform Native only
85
73
  * Returns the children on web
@@ -19,11 +19,6 @@ const SelectTrigger = React.forwardRef(({ className, children, style: styleProp,
19
19
  const interaction = useInteractionTokens();
20
20
  const visual = useVisualTokens();
21
21
  return (_jsxs(SelectPrimitive.Trigger, { ref: ref, className: cn('border-border bg-muted flex w-full flex-row items-center justify-between gap-2 shadow-sm active:bg-state-pressed', focusRing, props.disabled && '', className),
22
- // Pass an array unless the caller actually gave a callback. On web this primitive
23
- // is wrapped in a Slot that merges `style` by object spread, which turns a
24
- // function into `{}` and silently drops every style — the trigger rendered 24px
25
- // tall with no padding, border or radius. A callback is still honoured on native,
26
- // where dropping it was the original bug.
27
22
  // Flattened, not an array. On web this primitive is merged through a Slot that
28
23
  // spreads `style`, and spreading an array yields { 0: …, 1: … } — numeric keys
29
24
  // that reach the DOM as indexed style properties and throw. The Select rendered
@@ -35,7 +30,7 @@ const SelectTrigger = React.forwardRef(({ className, children, style: styleProp,
35
30
  ]), ...props, children: [_jsx(_Fragment, { children: children }), _jsx(View, { className: "border-muted-foreground h-2 w-2 rotate-45 border-b-2 border-r-2" })] }));
36
31
  });
37
32
  SelectTrigger.displayName = 'SelectTrigger';
38
- function SelectValue({ className, placeholder = 'Select...', ...props }) {
33
+ function SelectValue({ className, placeholder = 'Select...' }) {
39
34
  const { value } = SelectPrimitive.useRootContext();
40
35
  const visual = useVisualTokens();
41
36
  // The colour is set on a wrapper and inherited, rather than on the primitive itself.
@@ -44,7 +39,7 @@ function SelectValue({ className, placeholder = 'Select...', ...props }) {
44
39
  // user-agent default black — 1.2:1 on a dark surface. Rendering the label ourselves
45
40
  // instead would fix the colour and lose the value: Radix owns the selection on web,
46
41
  // and `useRootContext().value` is not populated there.
47
- return (_jsx(Text, { className: cn('text-foreground', !value && 'text-muted-foreground', className), style: typographyStyle(visual, 'body'), numberOfLines: 1, children: _jsx(SelectPrimitive.Value, { placeholder: placeholder, ...props }) }));
42
+ return (_jsx(Text, { className: cn('text-foreground', !value && 'text-muted-foreground', className), style: typographyStyle(visual, 'body'), numberOfLines: 1, children: _jsx(SelectPrimitive.Value, { placeholder: placeholder }) }));
48
43
  }
49
44
  const SelectContent = React.forwardRef(({ className, children, portalHost, position = 'popper', insets, style: styleProp, frosted = false, blurIntensity, blurTintToken, ...props }, ref) => {
50
45
  const frostedSurface = useFrostedSurface({
@@ -1,7 +1,7 @@
1
- import React from 'react';
2
- import { View, type ViewProps } from 'react-native';
1
+ import { type ViewInstance, type ViewProps } from 'react-native';
2
+ import type { ForwardRefComponent } from '../../lib/ref-types';
3
3
  export interface SeparatorProps extends ViewProps {
4
4
  orientation?: 'horizontal' | 'vertical';
5
5
  }
6
- declare const Separator: React.ForwardRefExoticComponent<SeparatorProps & React.RefAttributes<View>>;
6
+ declare const Separator: ForwardRefComponent<ViewInstance, SeparatorProps>;
7
7
  export { Separator };
@@ -2,40 +2,20 @@ import { type ViewProps } from 'react-native';
2
2
  import { type VariantProps } from '../../lib/tv';
3
3
  declare const skeletonVariants: import("tailwind-variants").TVReturnType<{
4
4
  variant: {
5
- pulse: string;
6
- shimmer: string;
5
+ pulse: "";
6
+ shimmer: "";
7
7
  };
8
- }, undefined, "bg-muted", import("tailwind-variants/dist/config.js").TVConfig<{
8
+ }, undefined, "bg-muted", {
9
9
  variant: {
10
- pulse: string;
11
- shimmer: string;
10
+ pulse: "";
11
+ shimmer: "";
12
12
  };
13
- }, {
13
+ }, undefined, import("tailwind-variants").TVReturnTypeLike<{
14
14
  variant: {
15
- pulse: string;
16
- shimmer: string;
15
+ pulse: "";
16
+ shimmer: "";
17
17
  };
18
- }>, {
19
- variant: {
20
- pulse: string;
21
- shimmer: string;
22
- };
23
- }, undefined, import("tailwind-variants").TVReturnType<{
24
- variant: {
25
- pulse: string;
26
- shimmer: string;
27
- };
28
- }, undefined, "bg-muted", import("tailwind-variants/dist/config.js").TVConfig<{
29
- variant: {
30
- pulse: string;
31
- shimmer: string;
32
- };
33
- }, {
34
- variant: {
35
- pulse: string;
36
- shimmer: string;
37
- };
38
- }>, unknown, unknown, undefined>>;
18
+ }, undefined>>;
39
19
  export interface SkeletonProps extends ViewProps, VariantProps<typeof skeletonVariants> {
40
20
  className?: string;
41
21
  }
@@ -2,47 +2,23 @@ import { type ActivityIndicatorProps } from 'react-native';
2
2
  import { type VariantProps } from '../../lib/tv';
3
3
  declare const spinnerVariants: import("tailwind-variants").TVReturnType<{
4
4
  size: {
5
- sm: string;
6
- default: string;
7
- lg: string;
5
+ sm: "";
6
+ default: "";
7
+ lg: "";
8
8
  };
9
- }, undefined, "", import("tailwind-variants/dist/config.js").TVConfig<{
9
+ }, undefined, "", {
10
10
  size: {
11
- sm: string;
12
- default: string;
13
- lg: string;
11
+ sm: "";
12
+ default: "";
13
+ lg: "";
14
14
  };
15
- }, {
15
+ }, undefined, import("tailwind-variants").TVReturnTypeLike<{
16
16
  size: {
17
- sm: string;
18
- default: string;
19
- lg: string;
17
+ sm: "";
18
+ default: "";
19
+ lg: "";
20
20
  };
21
- }>, {
22
- size: {
23
- sm: string;
24
- default: string;
25
- lg: string;
26
- };
27
- }, undefined, import("tailwind-variants").TVReturnType<{
28
- size: {
29
- sm: string;
30
- default: string;
31
- lg: string;
32
- };
33
- }, undefined, "", import("tailwind-variants/dist/config.js").TVConfig<{
34
- size: {
35
- sm: string;
36
- default: string;
37
- lg: string;
38
- };
39
- }, {
40
- size: {
41
- sm: string;
42
- default: string;
43
- lg: string;
44
- };
45
- }>, unknown, unknown, undefined>>;
21
+ }, undefined>>;
46
22
  export interface SpinnerProps extends Omit<ActivityIndicatorProps, 'size'>, VariantProps<typeof spinnerVariants> {
47
23
  className?: string;
48
24
  }