@xaui/native 0.0.2 → 0.0.4

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.
@@ -0,0 +1,436 @@
1
+ import {
2
+ useXUITheme
3
+ } from "../chunk-DNJWBME5.js";
4
+
5
+ // src/components/checkbox/checkbox.tsx
6
+ import React2, { useEffect as useEffect2, useRef as useRef2, useState } from "react";
7
+ import { Animated as Animated3, Pressable, Text, View } from "react-native";
8
+
9
+ // src/components/checkbox/checkbox-icon.tsx
10
+ import React, { useEffect, useRef } from "react";
11
+ import { Animated as Animated2 } from "react-native";
12
+ import Svg, { Polyline, Line, Path } from "react-native-svg";
13
+
14
+ // src/components/checkbox/checkbox.animation.ts
15
+ import { Animated } from "react-native";
16
+ var runCheckAnimation = (opacity, strokeDashoffset) => {
17
+ Animated.parallel([
18
+ Animated.timing(opacity, {
19
+ toValue: 1,
20
+ duration: 200,
21
+ useNativeDriver: false
22
+ }),
23
+ Animated.timing(strokeDashoffset, {
24
+ toValue: 44,
25
+ duration: 250,
26
+ useNativeDriver: false
27
+ })
28
+ ]).start();
29
+ };
30
+ var runUncheckAnimation = (opacity, strokeDashoffset) => {
31
+ Animated.parallel([
32
+ Animated.timing(opacity, {
33
+ toValue: 0,
34
+ duration: 200,
35
+ useNativeDriver: false
36
+ }),
37
+ Animated.timing(strokeDashoffset, {
38
+ toValue: 66,
39
+ duration: 250,
40
+ useNativeDriver: false
41
+ })
42
+ ]).start();
43
+ };
44
+ var runBackgroundInAnimation = (backgroundScale, backgroundOpacity) => {
45
+ Animated.parallel([
46
+ Animated.timing(backgroundScale, {
47
+ toValue: 1,
48
+ duration: 200,
49
+ useNativeDriver: true
50
+ }),
51
+ Animated.timing(backgroundOpacity, {
52
+ toValue: 1,
53
+ duration: 200,
54
+ useNativeDriver: true
55
+ })
56
+ ]).start();
57
+ };
58
+ var runBackgroundOutAnimation = (backgroundScale, backgroundOpacity) => {
59
+ Animated.parallel([
60
+ Animated.timing(backgroundScale, {
61
+ toValue: 0.5,
62
+ duration: 200,
63
+ useNativeDriver: true
64
+ }),
65
+ Animated.timing(backgroundOpacity, {
66
+ toValue: 0,
67
+ duration: 200,
68
+ useNativeDriver: true
69
+ })
70
+ ]).start();
71
+ };
72
+ var runPressInAnimation = (scale) => {
73
+ Animated.spring(scale, {
74
+ toValue: 0.95,
75
+ useNativeDriver: true
76
+ }).start();
77
+ };
78
+ var runPressOutAnimation = (scale) => {
79
+ Animated.spring(scale, {
80
+ toValue: 1,
81
+ useNativeDriver: true
82
+ }).start();
83
+ };
84
+
85
+ // src/components/checkbox/checkbox-icon.tsx
86
+ var AnimatedSvg = Animated2.createAnimatedComponent(Svg);
87
+ var AnimatedPolyline = Animated2.createAnimatedComponent(Polyline);
88
+ function CheckIcon({
89
+ isChecked,
90
+ color,
91
+ size
92
+ }) {
93
+ const opacity = useRef(new Animated2.Value(0)).current;
94
+ const strokeDashoffset = useRef(new Animated2.Value(66)).current;
95
+ useEffect(() => {
96
+ if (isChecked) {
97
+ runCheckAnimation(opacity, strokeDashoffset);
98
+ } else {
99
+ runUncheckAnimation(opacity, strokeDashoffset);
100
+ }
101
+ }, [isChecked, opacity, strokeDashoffset]);
102
+ return /* @__PURE__ */ React.createElement(
103
+ AnimatedSvg,
104
+ {
105
+ width: size,
106
+ height: size,
107
+ viewBox: "0 0 17 18",
108
+ fill: "none",
109
+ opacity
110
+ },
111
+ /* @__PURE__ */ React.createElement(
112
+ AnimatedPolyline,
113
+ {
114
+ points: "1 9 7 14 15 4",
115
+ stroke: color,
116
+ strokeWidth: 2,
117
+ strokeLinecap: "round",
118
+ strokeLinejoin: "round",
119
+ strokeDasharray: "22",
120
+ strokeDashoffset
121
+ }
122
+ )
123
+ );
124
+ }
125
+ function PlaceholderCheckIcon({ color, size }) {
126
+ return /* @__PURE__ */ React.createElement(Svg, { width: size, height: size, viewBox: "0 0 17 18" }, /* @__PURE__ */ React.createElement(
127
+ Path,
128
+ {
129
+ d: "M 1 9 L 7 14 L 15 4",
130
+ stroke: color,
131
+ strokeWidth: 2,
132
+ strokeLinecap: "round",
133
+ strokeLinejoin: "round",
134
+ fill: "none"
135
+ }
136
+ ));
137
+ }
138
+ function IndeterminateCheckIcon({
139
+ color,
140
+ size
141
+ }) {
142
+ return /* @__PURE__ */ React.createElement(Svg, { width: size, height: size, viewBox: "0 0 24 24" }, /* @__PURE__ */ React.createElement(Line, { x1: "21", y1: "12", x2: "3", y2: "12", stroke: color, strokeWidth: 3 }));
143
+ }
144
+ function CheckboxIcon({ isIndeterminate, variant, ...props }) {
145
+ const BaseIcon = isIndeterminate ? IndeterminateCheckIcon : CheckIcon;
146
+ if (variant === "light" && !props.isChecked && !isIndeterminate) {
147
+ return /* @__PURE__ */ React.createElement(PlaceholderCheckIcon, { size: props.size, color: props.placeholderColor ?? "" });
148
+ }
149
+ return /* @__PURE__ */ React.createElement(BaseIcon, { ...props });
150
+ }
151
+
152
+ // src/components/checkbox/checkbox.hook.ts
153
+ import { useMemo } from "react";
154
+ import { getSafeThemeColor } from "@xaui/core";
155
+ function useSizeStyles(size, variant) {
156
+ const theme = useXUITheme();
157
+ const sizeStyles = useMemo(() => {
158
+ const sizes = {
159
+ xs: {
160
+ checkboxSize: 14,
161
+ fontSize: theme.fontSizes.xs,
162
+ iconSize: variant === "light" ? 10 : 8
163
+ },
164
+ sm: {
165
+ checkboxSize: 18,
166
+ fontSize: theme.fontSizes.sm,
167
+ iconSize: variant === "light" ? 14 : 12
168
+ },
169
+ md: {
170
+ checkboxSize: 22,
171
+ fontSize: theme.fontSizes.md,
172
+ iconSize: variant === "light" ? 18 : 14
173
+ },
174
+ lg: {
175
+ checkboxSize: 26,
176
+ fontSize: theme.fontSizes.lg,
177
+ iconSize: variant === "light" ? 22 : 16
178
+ }
179
+ };
180
+ return sizes[size];
181
+ }, [size, variant, theme]);
182
+ return sizeStyles;
183
+ }
184
+ function useRadiusStyles(radius) {
185
+ const theme = useXUITheme();
186
+ const radiusStyles = useMemo(() => {
187
+ const radii = {
188
+ none: theme.borderRadius.none,
189
+ sm: theme.borderRadius.sm,
190
+ md: theme.borderRadius.md,
191
+ lg: theme.borderRadius.lg,
192
+ full: theme.borderRadius.full
193
+ };
194
+ return { borderRadius: radii[radius] };
195
+ }, [radius, theme]);
196
+ return radiusStyles;
197
+ }
198
+ function useCheckmarkColors(themeColor, variant, isActive) {
199
+ const theme = useXUITheme();
200
+ const safeThemeColor = getSafeThemeColor(themeColor);
201
+ const colorScheme = theme.colors[safeThemeColor];
202
+ const checkmarkColors = useMemo(() => {
203
+ if (variant === "filled") {
204
+ return {
205
+ checked: colorScheme.foreground,
206
+ unchecked: void 0
207
+ };
208
+ }
209
+ if (isActive) {
210
+ return {
211
+ checked: colorScheme.main,
212
+ unchecked: void 0
213
+ };
214
+ }
215
+ if (themeColor !== "default") {
216
+ return {
217
+ checked: colorScheme.foreground,
218
+ unchecked: colorScheme.background
219
+ };
220
+ }
221
+ return {
222
+ checked: theme.colors.foreground,
223
+ unchecked: theme.colors.background
224
+ };
225
+ }, [variant, colorScheme, isActive, themeColor, theme.colors]);
226
+ return checkmarkColors;
227
+ }
228
+ function useVariantStyles(themeColor, variant, isActive) {
229
+ const theme = useXUITheme();
230
+ const safeThemeColor = getSafeThemeColor(themeColor);
231
+ const colorScheme = theme.colors[safeThemeColor];
232
+ const variantStyles = useMemo(() => {
233
+ if (variant === "filled") {
234
+ return {
235
+ backgroundColor: "transparent",
236
+ borderWidth: isActive ? 0 : theme.borderWidth.md,
237
+ borderColor: isActive ? "transparent" : colorScheme.main
238
+ };
239
+ }
240
+ return {
241
+ backgroundColor: "transparent",
242
+ borderWidth: 0,
243
+ borderColor: "transparent"
244
+ };
245
+ }, [variant, isActive, colorScheme, theme]);
246
+ return variantStyles;
247
+ }
248
+ function useContainerStyles(labelAlignment) {
249
+ const containerStyles = useMemo(() => {
250
+ const isJustified = labelAlignment === "justify-left" || labelAlignment === "justify-right";
251
+ return {
252
+ flexDirection: labelAlignment === "left" || labelAlignment === "justify-left" ? "row-reverse" : "row",
253
+ justifyContent: isJustified ? "space-between" : "flex-start"
254
+ };
255
+ }, [labelAlignment]);
256
+ return containerStyles;
257
+ }
258
+
259
+ // src/components/checkbox/checkbox.style.ts
260
+ import { StyleSheet } from "react-native";
261
+ var styles = StyleSheet.create({
262
+ container: {
263
+ flexDirection: "row",
264
+ alignItems: "center",
265
+ gap: 10
266
+ },
267
+ fullWidth: {
268
+ width: "100%"
269
+ },
270
+ checkbox: {
271
+ alignItems: "center",
272
+ justifyContent: "center",
273
+ overflow: "hidden",
274
+ position: "relative"
275
+ },
276
+ background: {
277
+ position: "absolute",
278
+ width: "100%",
279
+ height: "100%"
280
+ },
281
+ checkmarkContainer: {
282
+ alignItems: "center",
283
+ justifyContent: "center",
284
+ zIndex: 10
285
+ },
286
+ label: {
287
+ fontWeight: "400"
288
+ },
289
+ disabled: {
290
+ opacity: 0.5
291
+ },
292
+ disabledText: {
293
+ opacity: 0.7
294
+ }
295
+ });
296
+
297
+ // src/components/checkbox/checkbox.tsx
298
+ import { getSafeThemeColor as getSafeThemeColor2 } from "@xaui/core";
299
+ var Checkbox = ({
300
+ label,
301
+ labelAlignment = "right",
302
+ themeColor = "default",
303
+ variant = "filled",
304
+ size = "md",
305
+ radius = "sm",
306
+ fullWidth = false,
307
+ isChecked: isCheckedProp,
308
+ isIndeterminate = false,
309
+ isDisabled = false,
310
+ labelStyle,
311
+ style,
312
+ onValueChange
313
+ }) => {
314
+ const theme = useXUITheme();
315
+ const colorScheme = theme.colors[getSafeThemeColor2(themeColor)];
316
+ const isControlled = typeof isCheckedProp === "boolean";
317
+ const [internalChecked, setInternalChecked] = useState(isCheckedProp ?? false);
318
+ const isChecked = isControlled ? isCheckedProp : internalChecked;
319
+ const scale = useRef2(new Animated3.Value(1)).current;
320
+ const backgroundScale = useRef2(new Animated3.Value(0.5)).current;
321
+ const backgroundOpacity = useRef2(new Animated3.Value(0)).current;
322
+ const isActive = isChecked || isIndeterminate;
323
+ const sizeStyles = useSizeStyles(size, variant);
324
+ const radiusStyles = useRadiusStyles(radius);
325
+ const checkmarkColors = useCheckmarkColors(themeColor, variant, isActive);
326
+ const variantStyles = useVariantStyles(themeColor, variant, isActive);
327
+ const containerStyles = useContainerStyles(labelAlignment);
328
+ useEffect2(() => {
329
+ if (variant !== "filled") return;
330
+ if (isActive) {
331
+ runBackgroundInAnimation(backgroundScale, backgroundOpacity);
332
+ } else {
333
+ runBackgroundOutAnimation(backgroundScale, backgroundOpacity);
334
+ }
335
+ }, [isActive, variant, backgroundScale, backgroundOpacity]);
336
+ const handlePress = () => {
337
+ if (!isDisabled) {
338
+ const nextValue = isIndeterminate ? true : !isChecked;
339
+ onValueChange?.(nextValue);
340
+ if (!isControlled) {
341
+ setInternalChecked(nextValue);
342
+ }
343
+ }
344
+ };
345
+ const handlePressIn = () => {
346
+ if (!isDisabled) {
347
+ runPressInAnimation(scale);
348
+ }
349
+ };
350
+ const handlePressOut = () => {
351
+ if (!isDisabled) {
352
+ runPressOutAnimation(scale);
353
+ }
354
+ };
355
+ const accessibilityChecked = isIndeterminate ? "mixed" : isChecked;
356
+ return /* @__PURE__ */ React2.createElement(
357
+ Pressable,
358
+ {
359
+ onPress: handlePress,
360
+ onPressIn: handlePressIn,
361
+ onPressOut: handlePressOut,
362
+ disabled: isDisabled,
363
+ accessible: true,
364
+ accessibilityRole: "checkbox",
365
+ accessibilityLabel: label,
366
+ accessibilityState: {
367
+ disabled: isDisabled,
368
+ checked: accessibilityChecked
369
+ },
370
+ style: [
371
+ styles.container,
372
+ containerStyles,
373
+ fullWidth && styles.fullWidth,
374
+ isDisabled && styles.disabled,
375
+ style
376
+ ]
377
+ },
378
+ /* @__PURE__ */ React2.createElement(
379
+ Animated3.View,
380
+ {
381
+ style: [
382
+ styles.checkbox,
383
+ {
384
+ width: sizeStyles.checkboxSize,
385
+ height: sizeStyles.checkboxSize,
386
+ ...radiusStyles,
387
+ ...variantStyles
388
+ },
389
+ {
390
+ transform: [{ scale }]
391
+ }
392
+ ]
393
+ },
394
+ variant === "filled" && /* @__PURE__ */ React2.createElement(
395
+ Animated3.View,
396
+ {
397
+ style: [
398
+ styles.background,
399
+ radiusStyles,
400
+ {
401
+ backgroundColor: colorScheme.main,
402
+ transform: [{ scale: backgroundScale }],
403
+ opacity: backgroundOpacity
404
+ }
405
+ ]
406
+ }
407
+ ),
408
+ /* @__PURE__ */ React2.createElement(View, { style: styles.checkmarkContainer }, /* @__PURE__ */ React2.createElement(
409
+ CheckboxIcon,
410
+ {
411
+ isChecked: isActive,
412
+ isIndeterminate,
413
+ color: checkmarkColors.checked,
414
+ size: sizeStyles.iconSize,
415
+ placeholderColor: checkmarkColors.unchecked,
416
+ variant
417
+ }
418
+ ))
419
+ ),
420
+ label && /* @__PURE__ */ React2.createElement(
421
+ Text,
422
+ {
423
+ style: [
424
+ styles.label,
425
+ { fontSize: sizeStyles.fontSize, color: theme.colors.foreground },
426
+ isDisabled && styles.disabledText,
427
+ labelStyle
428
+ ]
429
+ },
430
+ label
431
+ )
432
+ );
433
+ };
434
+ export {
435
+ Checkbox
436
+ };
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  useXUITheme
3
- } from "./chunk-SHT66VET.js";
3
+ } from "./chunk-DNJWBME5.js";
4
4
 
5
5
  // src/components/indicator/indicator.tsx
6
6
  import React3 from "react";
@@ -34,7 +34,7 @@ function XUIProvider({
34
34
  }
35
35
 
36
36
  // src/core/theme-hooks.ts
37
- import { useContext } from "react";
37
+ import { useContext, useMemo } from "react";
38
38
  import { useColorScheme as useColorScheme2 } from "react-native";
39
39
  function useColorMode() {
40
40
  const nativeScheme = useColorScheme2();
@@ -51,10 +51,25 @@ function useXUIColors() {
51
51
  const theme = useXUITheme();
52
52
  return theme.colors;
53
53
  }
54
+ function useBorderRadiusStyles(radius) {
55
+ const theme = useXUITheme();
56
+ const borderRadius = useMemo(() => {
57
+ const radiusMap = {
58
+ none: theme.borderRadius.none,
59
+ sm: theme.borderRadius.sm,
60
+ md: theme.borderRadius.md,
61
+ lg: theme.borderRadius.lg,
62
+ full: theme.borderRadius.full
63
+ };
64
+ return { borderRadius: radiusMap[radius] };
65
+ }, [radius, theme]);
66
+ return borderRadius;
67
+ }
54
68
 
55
69
  export {
56
70
  XUIProvider,
57
71
  useColorMode,
58
72
  useXUITheme,
59
- useXUIColors
73
+ useXUIColors,
74
+ useBorderRadiusStyles
60
75
  };
@@ -3,7 +3,7 @@ import {
3
3
  useColorMode,
4
4
  useXUIColors,
5
5
  useXUITheme
6
- } from "../chunk-SHT66VET.js";
6
+ } from "../chunk-DNJWBME5.js";
7
7
  export {
8
8
  XUIProvider,
9
9
  useColorMode,
@@ -0,0 +1,5 @@
1
+ type ThemeColor = 'primary' | 'secondary' | 'tertiary' | 'danger' | 'warning' | 'success' | 'default';
2
+ type Size = 'xs' | 'sm' | 'md' | 'lg';
3
+ type Radius = 'none' | 'sm' | 'md' | 'lg' | 'full';
4
+
5
+ export type { Radius as R, Size as S, ThemeColor as T };
@@ -0,0 +1,5 @@
1
+ type ThemeColor = 'primary' | 'secondary' | 'tertiary' | 'danger' | 'warning' | 'success' | 'default';
2
+ type Size = 'xs' | 'sm' | 'md' | 'lg';
3
+ type Radius = 'none' | 'sm' | 'md' | 'lg' | 'full';
4
+
5
+ export type { Radius as R, Size as S, ThemeColor as T };
package/dist/index.d.cts CHANGED
@@ -1,3 +1,3 @@
1
1
  export { ActivityIndicator } from './indicator/index.cjs';
2
2
  import 'react';
3
- import './theme-qvIXI4kF.cjs';
3
+ import './index-BOw6tbkc.cjs';
package/dist/index.d.ts CHANGED
@@ -1,3 +1,3 @@
1
1
  export { ActivityIndicator } from './indicator/index.js';
2
2
  import 'react';
3
- import './theme-qvIXI4kF.js';
3
+ import './index-BOw6tbkc.js';
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  ActivityIndicator
3
- } from "./chunk-6ITFLLAM.js";
4
- import "./chunk-SHT66VET.js";
3
+ } from "./chunk-52PIZF2Z.js";
4
+ import "./chunk-DNJWBME5.js";
5
5
  export {
6
6
  ActivityIndicator
7
7
  };
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { T as ThemeColor } from '../theme-qvIXI4kF.cjs';
2
+ import { T as ThemeColor } from '../index-BOw6tbkc.cjs';
3
3
 
4
4
  type ActivityIndicatorVariant = 'linear' | 'circular';
5
5
  type ActivityIndicatorProps = {
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { T as ThemeColor } from '../theme-qvIXI4kF.js';
2
+ import { T as ThemeColor } from '../index-BOw6tbkc.js';
3
3
 
4
4
  type ActivityIndicatorVariant = 'linear' | 'circular';
5
5
  type ActivityIndicatorProps = {
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  ActivityIndicator
3
- } from "../chunk-6ITFLLAM.js";
4
- import "../chunk-SHT66VET.js";
3
+ } from "../chunk-52PIZF2Z.js";
4
+ import "../chunk-DNJWBME5.js";
5
5
  export {
6
6
  ActivityIndicator
7
7
  };
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { T as ThemeColor } from '../theme-qvIXI4kF.cjs';
2
+ import { T as ThemeColor } from '../index-BOw6tbkc.cjs';
3
3
 
4
4
  type ProgressVariant = 'linear' | 'circular';
5
5
  type ProgressIndicatorProps = {
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { T as ThemeColor } from '../theme-qvIXI4kF.js';
2
+ import { T as ThemeColor } from '../index-BOw6tbkc.js';
3
3
 
4
4
  type ProgressVariant = 'linear' | 'circular';
5
5
  type ProgressIndicatorProps = {
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  useXUITheme
3
- } from "../chunk-SHT66VET.js";
3
+ } from "../chunk-DNJWBME5.js";
4
4
 
5
5
  // src/components/progress/progress.tsx
6
6
  import React3 from "react";
package/package.json CHANGED
@@ -1,12 +1,16 @@
1
1
  {
2
2
  "name": "@xaui/native",
3
- "version": "0.0.2",
4
- "description": "Mobile UI components for XUI",
3
+ "version": "0.0.4",
4
+ "description": "Flutter-inspired React Native UI components with native animations powered by React Native Reanimated",
5
5
  "keywords": [
6
6
  "react-native",
7
7
  "mobile",
8
+ "native",
8
9
  "ui",
9
10
  "components",
11
+ "flutter",
12
+ "reanimated",
13
+ "animations",
10
14
  "xaui"
11
15
  ],
12
16
  "type": "module",
@@ -28,6 +32,11 @@
28
32
  "import": "./dist/button/index.js",
29
33
  "require": "./dist/button/index.js"
30
34
  },
35
+ "./checkbox": {
36
+ "types": "./dist/checkbox/index.d.ts",
37
+ "import": "./dist/checkbox/index.js",
38
+ "require": "./dist/checkbox/index.js"
39
+ },
31
40
  "./progress": {
32
41
  "types": "./dist/progress/index.d.ts",
33
42
  "import": "./dist/progress/index.js",
@@ -46,17 +55,10 @@
46
55
  "repository": {
47
56
  "type": "git",
48
57
  "url": "git+https://github.com/rygrams/xaui.git",
49
- "directory": "packages/mobile"
50
- },
51
- "scripts": {
52
- "build": "tsup --config tsup.config.ts",
53
- "dev": "tsup --config tsup.config.ts --watch",
54
- "test": "vitest",
55
- "lint": "eslint src/",
56
- "type-check": "tsc --noEmit"
58
+ "directory": "packages/native"
57
59
  },
58
60
  "dependencies": {
59
- "@xaui/core": "workspace:*"
61
+ "@xaui/core": "0.1.6"
60
62
  },
61
63
  "peerDependencies": {
62
64
  "react": "^18.0.0 || ^19.0.0",
@@ -76,5 +78,12 @@
76
78
  },
77
79
  "publishConfig": {
78
80
  "access": "public"
81
+ },
82
+ "scripts": {
83
+ "build": "tsup --config tsup.config.ts",
84
+ "dev": "tsup --config tsup.config.ts --watch",
85
+ "test": "vitest",
86
+ "lint": "eslint src/",
87
+ "type-check": "tsc --noEmit"
79
88
  }
80
- }
89
+ }
@@ -1,3 +0,0 @@
1
- type ThemeColor = 'primary' | 'secondary' | 'tertiary' | 'danger' | 'warning' | 'success' | 'default';
2
-
3
- export type { ThemeColor as T };
@@ -1,3 +0,0 @@
1
- type ThemeColor = 'primary' | 'secondary' | 'tertiary' | 'danger' | 'warning' | 'success' | 'default';
2
-
3
- export type { ThemeColor as T };