dash-ui-kit 1.0.94 → 2.1.0-dev

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 (201) hide show
  1. package/README.md +52 -0
  2. package/dist/react/components/accordion/index.cjs.js +193 -0
  3. package/dist/react/components/accordion/index.cjs.js.map +1 -0
  4. package/dist/react/components/accordion/index.esm.js +169 -0
  5. package/dist/react/components/accordion/index.esm.js.map +1 -0
  6. package/dist/react/components/avatar/index.cjs.js +39 -0
  7. package/dist/react/components/avatar/index.cjs.js.map +1 -0
  8. package/dist/react/components/avatar/index.esm.js +34 -0
  9. package/dist/react/components/avatar/index.esm.js.map +1 -0
  10. package/dist/react/components/badge/index.cjs.js +97 -0
  11. package/dist/react/components/badge/index.cjs.js.map +1 -0
  12. package/dist/react/components/badge/index.d.ts +10 -1
  13. package/dist/react/components/badge/index.esm.js +92 -0
  14. package/dist/react/components/badge/index.esm.js.map +1 -0
  15. package/dist/react/components/bigNumber/index.cjs.js +100 -0
  16. package/dist/react/components/bigNumber/index.cjs.js.map +1 -0
  17. package/dist/react/components/bigNumber/index.esm.js +95 -0
  18. package/dist/react/components/bigNumber/index.esm.js.map +1 -0
  19. package/dist/react/components/button/index.cjs.js +540 -0
  20. package/dist/react/components/button/index.cjs.js.map +1 -0
  21. package/dist/react/components/button/index.d.ts +7 -1
  22. package/dist/react/components/button/index.esm.js +535 -0
  23. package/dist/react/components/button/index.esm.js.map +1 -0
  24. package/dist/react/components/copyButton/index.cjs.js +95 -0
  25. package/dist/react/components/copyButton/index.cjs.js.map +1 -0
  26. package/dist/react/components/copyButton/index.esm.js +71 -0
  27. package/dist/react/components/copyButton/index.esm.js.map +1 -0
  28. package/dist/react/components/dashLogo/index.cjs.js +74 -0
  29. package/dist/react/components/dashLogo/index.cjs.js.map +1 -0
  30. package/dist/react/components/dashLogo/index.esm.js +69 -0
  31. package/dist/react/components/dashLogo/index.esm.js.map +1 -0
  32. package/dist/react/components/dateBlock/index.cjs.js +120 -0
  33. package/dist/react/components/dateBlock/index.cjs.js.map +1 -0
  34. package/dist/react/components/dateBlock/index.esm.js +115 -0
  35. package/dist/react/components/dateBlock/index.esm.js.map +1 -0
  36. package/dist/react/components/dialog/index.cjs.js +292 -0
  37. package/dist/react/components/dialog/index.cjs.js.map +1 -0
  38. package/dist/react/components/dialog/index.esm.js +270 -0
  39. package/dist/react/components/dialog/index.esm.js.map +1 -0
  40. package/dist/react/components/heading/index.cjs.js +65 -0
  41. package/dist/react/components/heading/index.cjs.js.map +1 -0
  42. package/dist/react/components/heading/index.d.ts +4 -1
  43. package/dist/react/components/heading/index.esm.js +63 -0
  44. package/dist/react/components/heading/index.esm.js.map +1 -0
  45. package/dist/react/components/icons/index.cjs.js +1173 -0
  46. package/dist/react/components/icons/index.cjs.js.map +1 -0
  47. package/dist/react/components/icons/index.d.ts +2 -0
  48. package/dist/react/components/icons/index.esm.js +1128 -0
  49. package/dist/react/components/icons/index.esm.js.map +1 -0
  50. package/dist/react/components/identifier/index.cjs.js +286 -0
  51. package/dist/react/components/identifier/index.cjs.js.map +1 -0
  52. package/dist/react/components/identifier/index.esm.js +282 -0
  53. package/dist/react/components/identifier/index.esm.js.map +1 -0
  54. package/dist/react/components/index.cjs.js +101 -0
  55. package/dist/react/components/index.cjs.js.map +1 -0
  56. package/dist/react/components/index.d.ts +1 -1
  57. package/dist/react/components/index.esm.js +29 -0
  58. package/dist/react/components/index.esm.js.map +1 -0
  59. package/dist/react/components/input/index.cjs.js +242 -0
  60. package/dist/react/components/input/index.cjs.js.map +1 -0
  61. package/dist/react/components/input/index.d.ts +4 -0
  62. package/dist/react/components/input/index.esm.js +237 -0
  63. package/dist/react/components/input/index.esm.js.map +1 -0
  64. package/dist/react/components/list/index.cjs.js +49 -0
  65. package/dist/react/components/list/index.cjs.js.map +1 -0
  66. package/dist/react/components/list/index.esm.js +47 -0
  67. package/dist/react/components/list/index.esm.js.map +1 -0
  68. package/dist/react/components/notActive/index.cjs.js +40 -0
  69. package/dist/react/components/notActive/index.cjs.js.map +1 -0
  70. package/dist/react/components/notActive/index.esm.js +38 -0
  71. package/dist/react/components/notActive/index.esm.js.map +1 -0
  72. package/dist/react/components/overlayMenu/index.cjs.js +469 -0
  73. package/dist/react/components/overlayMenu/index.cjs.js.map +1 -0
  74. package/dist/react/components/overlayMenu/index.d.ts +9 -10
  75. package/dist/react/components/overlayMenu/index.esm.js +464 -0
  76. package/dist/react/components/overlayMenu/index.esm.js.map +1 -0
  77. package/dist/react/components/overlaySelect/index.cjs.js +350 -0
  78. package/dist/react/components/overlaySelect/index.cjs.js.map +1 -0
  79. package/dist/react/components/overlaySelect/index.d.ts +4 -0
  80. package/dist/react/components/overlaySelect/index.esm.js +345 -0
  81. package/dist/react/components/overlaySelect/index.esm.js.map +1 -0
  82. package/dist/react/components/progressStepBar/index.cjs.js +54 -0
  83. package/dist/react/components/progressStepBar/index.cjs.js.map +1 -0
  84. package/dist/react/components/progressStepBar/index.d.ts +5 -2
  85. package/dist/react/components/progressStepBar/index.esm.js +52 -0
  86. package/dist/react/components/progressStepBar/index.esm.js.map +1 -0
  87. package/dist/react/components/select/index.cjs.js +241 -0
  88. package/dist/react/components/select/index.cjs.js.map +1 -0
  89. package/dist/react/components/select/index.d.ts +4 -0
  90. package/dist/react/components/select/index.esm.js +217 -0
  91. package/dist/react/components/select/index.esm.js.map +1 -0
  92. package/dist/react/components/switch/index.cjs.js +184 -0
  93. package/dist/react/components/switch/index.cjs.js.map +1 -0
  94. package/dist/react/components/switch/index.esm.js +179 -0
  95. package/dist/react/components/switch/index.esm.js.map +1 -0
  96. package/dist/react/components/tabs/index.cjs.js +178 -0
  97. package/dist/react/components/tabs/index.cjs.js.map +1 -0
  98. package/dist/react/components/tabs/index.esm.js +154 -0
  99. package/dist/react/components/tabs/index.esm.js.map +1 -0
  100. package/dist/react/components/text/index.cjs.js +126 -0
  101. package/dist/react/components/text/index.cjs.js.map +1 -0
  102. package/dist/react/components/text/index.d.ts +5 -0
  103. package/dist/react/components/text/index.esm.js +121 -0
  104. package/dist/react/components/text/index.esm.js.map +1 -0
  105. package/dist/react/components/textarea/index.cjs.js +260 -0
  106. package/dist/react/components/textarea/index.cjs.js.map +1 -0
  107. package/dist/react/components/textarea/index.d.ts +4 -0
  108. package/dist/react/components/textarea/index.esm.js +255 -0
  109. package/dist/react/components/textarea/index.esm.js.map +1 -0
  110. package/dist/react/components/timeDelta/index.cjs.js +93 -0
  111. package/dist/react/components/timeDelta/index.cjs.js.map +1 -0
  112. package/dist/react/components/timeDelta/index.d.ts +1 -1
  113. package/dist/react/components/timeDelta/index.esm.js +88 -0
  114. package/dist/react/components/timeDelta/index.esm.js.map +1 -0
  115. package/dist/react/components/transactionStatusIcon/index.cjs.js +59 -0
  116. package/dist/react/components/transactionStatusIcon/index.cjs.js.map +1 -0
  117. package/dist/react/components/transactionStatusIcon/index.esm.js +54 -0
  118. package/dist/react/components/transactionStatusIcon/index.esm.js.map +1 -0
  119. package/dist/react/components/valueCard/index.cjs.js +181 -0
  120. package/dist/react/components/valueCard/index.cjs.js.map +1 -0
  121. package/dist/react/components/valueCard/index.d.ts +5 -1
  122. package/dist/react/components/valueCard/index.esm.js +176 -0
  123. package/dist/react/components/valueCard/index.esm.js.map +1 -0
  124. package/dist/react/contexts/ThemeContext.cjs.js +79 -0
  125. package/dist/react/contexts/ThemeContext.cjs.js.map +1 -0
  126. package/dist/react/contexts/ThemeContext.esm.js +76 -0
  127. package/dist/react/contexts/ThemeContext.esm.js.map +1 -0
  128. package/dist/react/contexts/index.cjs.js +11 -0
  129. package/dist/react/contexts/index.cjs.js.map +1 -0
  130. package/dist/react/contexts/index.esm.js +4 -0
  131. package/dist/react/contexts/index.esm.js.map +1 -0
  132. package/dist/react/hooks/index.d.ts +1 -0
  133. package/dist/react/hooks/useColorScheme.cjs.js +25 -0
  134. package/dist/react/hooks/useColorScheme.cjs.js.map +1 -0
  135. package/dist/react/hooks/useColorScheme.d.ts +9 -0
  136. package/dist/react/hooks/useColorScheme.esm.js +23 -0
  137. package/dist/react/hooks/useColorScheme.esm.js.map +1 -0
  138. package/dist/react/hooks/useDebounce.cjs.js +83 -0
  139. package/dist/react/hooks/useDebounce.cjs.js.map +1 -0
  140. package/dist/react/hooks/useDebounce.esm.js +78 -0
  141. package/dist/react/hooks/useDebounce.esm.js.map +1 -0
  142. package/dist/react/index.cjs.js +99 -12833
  143. package/dist/react/index.cjs.js.map +1 -1
  144. package/dist/react/index.d.ts +1 -1
  145. package/dist/react/index.esm.js +27 -12747
  146. package/dist/react/index.esm.js.map +1 -1
  147. package/dist/react/shared/utils/datetime.cjs.js +59 -0
  148. package/dist/react/shared/utils/datetime.cjs.js.map +1 -0
  149. package/dist/react/shared/utils/datetime.esm.js +57 -0
  150. package/dist/react/shared/utils/datetime.esm.js.map +1 -0
  151. package/dist/react/utils/copyToClipboard.cjs.js +31 -0
  152. package/dist/react/utils/copyToClipboard.cjs.js.map +1 -0
  153. package/dist/react/utils/copyToClipboard.esm.js +26 -0
  154. package/dist/react/utils/copyToClipboard.esm.js.map +1 -0
  155. package/dist/react/utils/index.d.ts +1 -1
  156. package/dist/react-native/components/avatar/index.d.ts +26 -0
  157. package/dist/react-native/components/avatar/index.web.d.ts +24 -0
  158. package/dist/react-native/components/badge/index.d.ts +63 -0
  159. package/dist/react-native/components/bigNumber/index.d.ts +26 -0
  160. package/dist/react-native/components/button/index.d.ts +45 -0
  161. package/dist/react-native/components/copyButton/index.d.ts +22 -0
  162. package/dist/react-native/components/copyButton/index.web.d.ts +20 -0
  163. package/dist/react-native/components/dashLogo/index.d.ts +30 -0
  164. package/dist/react-native/components/heading/index.d.ts +25 -0
  165. package/dist/react-native/components/icons/index.d.ts +43 -0
  166. package/dist/react-native/components/identifier/index.d.ts +47 -0
  167. package/dist/react-native/components/index.d.ts +15 -0
  168. package/dist/react-native/components/input/index.d.ts +59 -0
  169. package/dist/react-native/components/notActive/index.d.ts +16 -0
  170. package/dist/react-native/components/tabs/index.d.ts +50 -0
  171. package/dist/react-native/components/text/index.d.ts +28 -0
  172. package/dist/react-native/components/transactionStatusIcon/index.d.ts +24 -0
  173. package/dist/react-native/components/valueCard/index.d.ts +47 -0
  174. package/dist/react-native/hooks/index.d.ts +1 -0
  175. package/dist/react-native/hooks/useDebounce.d.ts +43 -0
  176. package/dist/react-native/index.cjs.js +2882 -0
  177. package/dist/react-native/index.cjs.js.map +1 -0
  178. package/dist/react-native/index.d.ts +4 -0
  179. package/dist/react-native/index.esm.js +2833 -0
  180. package/dist/react-native/index.esm.js.map +1 -0
  181. package/dist/react-native/styles/index.d.ts +11 -0
  182. package/dist/react-native/styles/tokens.d.ts +308 -0
  183. package/dist/react-native/styles/utils.d.ts +65 -0
  184. package/dist/react-native/utils/clipboard.d.ts +27 -0
  185. package/dist/react-native/utils/index.d.ts +3 -0
  186. package/dist/react-native/utils/resolveColorScheme.d.ts +1 -0
  187. package/dist/react-native/utils/tw.d.ts +7 -0
  188. package/dist/shared/constants/colors.d.ts +25 -0
  189. package/dist/shared/constants/index.d.ts +2 -0
  190. package/dist/shared/constants/sizes.d.ts +49 -0
  191. package/dist/shared/index.cjs.js +171 -0
  192. package/dist/shared/index.cjs.js.map +1 -0
  193. package/dist/shared/index.d.ts +3 -0
  194. package/dist/shared/index.esm.js +161 -0
  195. package/dist/shared/index.esm.js.map +1 -0
  196. package/dist/shared/types/common.d.ts +33 -0
  197. package/dist/shared/types/index.d.ts +1 -0
  198. package/dist/shared/utils/index.d.ts +1 -0
  199. package/dist/styles.css +1 -1
  200. package/package.json +50 -8
  201. /package/dist/{react → shared}/utils/datetime.d.ts +0 -0
@@ -0,0 +1,2882 @@
1
+ 'use strict';
2
+
3
+ var tslib = require('tslib');
4
+ var jsxRuntime = require('react/jsx-runtime');
5
+ var reactNative = require('react-native');
6
+ var classVarianceAuthority = require('class-variance-authority');
7
+ var twrnc = require('twrnc');
8
+ var react = require('react');
9
+ var Svg = require('react-native-svg');
10
+ var minidenticons = require('minidenticons');
11
+
12
+ /**
13
+ * Tailwind utility for React Native using twrnc
14
+ * Converts Tailwind className strings to React Native style objects
15
+ */
16
+ // Inline Tailwind config with Dash brand colors for React Native
17
+ // Colors from src/styles/theme.pcss
18
+ const tailwindConfig = {
19
+ theme: {
20
+ extend: {
21
+ colors: {
22
+ // Dash brand colors - matching Web version
23
+ 'dash-brand': '#4C7EFF',
24
+ // Primary brand color
25
+ 'dash-brand-dim': '#96A7FF',
26
+ // Dimmed brand color
27
+ 'dash-brand-dark': '#4D5895',
28
+ // Dark brand color
29
+ 'dash-brand-darkness': '#13172A',
30
+ // Darkest brand color
31
+ 'dash-mint': '#60F6D2',
32
+ // Mint/teal color
33
+ 'dash-mint-hover': '#4DD4B1',
34
+ // Mint hover state
35
+ 'dash-yellow-light': '#FEF3C7',
36
+ // Light yellow
37
+ 'dash-yellow': '#FDE68A',
38
+ // Yellow
39
+ 'dash-primary-die-subdued': '#0c1c3308',
40
+ // Subdued color with alpha
41
+ 'dash-primary-dark-blue': '#0C1C33',
42
+ // Dark blue
43
+ // State colors
44
+ 'dash-green': '#40BF40',
45
+ 'dash-red': '#CD2E00',
46
+ 'dash-orange': '#F98F12'
47
+ }
48
+ }
49
+ }
50
+ };
51
+ // Create a tailwind instance with React Native compatible colors
52
+ const tw = twrnc.create(tailwindConfig);
53
+ /**
54
+ * Helper to convert className string to React Native style object
55
+ * @param className - Tailwind class names string
56
+ * @returns React Native style object
57
+ */
58
+ const cn = className => tw`${className}`;
59
+
60
+ const textStyles$2 = classVarianceAuthority.cva('', {
61
+ variants: {
62
+ variant: {
63
+ body: 'text-base',
64
+ caption: 'text-sm',
65
+ label: 'text-xs'
66
+ },
67
+ weight: {
68
+ regular: 'font-normal',
69
+ medium: 'font-medium',
70
+ semibold: 'font-semibold',
71
+ bold: 'font-bold'
72
+ },
73
+ color: {
74
+ default: 'text-gray-900 dark:text-gray-100',
75
+ blue: 'text-dash-brand',
76
+ red: 'text-red-700 dark:text-red-400',
77
+ gray: 'text-gray-600 dark:text-gray-400'
78
+ },
79
+ italic: {
80
+ false: '',
81
+ true: 'italic'
82
+ },
83
+ underline: {
84
+ false: '',
85
+ true: 'underline'
86
+ },
87
+ lineThrough: {
88
+ false: '',
89
+ true: 'line-through'
90
+ },
91
+ transform: {
92
+ none: '',
93
+ uppercase: 'uppercase',
94
+ capitalize: 'capitalize'
95
+ },
96
+ opacity: {
97
+ 100: 'opacity-100',
98
+ 80: 'opacity-80',
99
+ 60: 'opacity-60',
100
+ 40: 'opacity-40'
101
+ }
102
+ },
103
+ defaultVariants: {
104
+ variant: 'body',
105
+ weight: 'regular',
106
+ color: 'default',
107
+ italic: false,
108
+ underline: false,
109
+ lineThrough: false,
110
+ transform: 'none',
111
+ opacity: 100
112
+ }
113
+ });
114
+ /**
115
+ * React Native Text component with variants, weights, and styling options.
116
+ * Uses twrnc for Tailwind-like styling converted to React Native styles.
117
+ */
118
+ const Text = _a => {
119
+ var {
120
+ variant,
121
+ weight,
122
+ color,
123
+ italic,
124
+ underline,
125
+ lineThrough,
126
+ transform,
127
+ opacity,
128
+ className = '',
129
+ style,
130
+ children
131
+ } = _a,
132
+ props = tslib.__rest(_a, ["variant", "weight", "color", "italic", "underline", "lineThrough", "transform", "opacity", "className", "style", "children"]);
133
+ const classes = textStyles$2({
134
+ variant,
135
+ weight,
136
+ color,
137
+ italic,
138
+ underline,
139
+ lineThrough,
140
+ transform,
141
+ opacity
142
+ }) + (className ? ` ${className}` : '');
143
+ // Convert Tailwind classes to React Native style object
144
+ const textStyle = [cn(classes), style].filter(Boolean);
145
+ return jsxRuntime.jsx(reactNative.Text, Object.assign({
146
+ style: textStyle
147
+ }, props, {
148
+ children: children
149
+ }));
150
+ };
151
+
152
+ const headingStyles = classVarianceAuthority.cva('font-bold text-gray-900 dark:text-gray-100', {
153
+ variants: {
154
+ level: {
155
+ 1: 'text-4xl',
156
+ 2: 'text-3xl',
157
+ 3: 'text-2xl',
158
+ 4: 'text-xl',
159
+ 5: 'text-lg',
160
+ 6: 'text-base'
161
+ },
162
+ weight: {
163
+ normal: 'font-normal',
164
+ medium: 'font-medium',
165
+ semibold: 'font-semibold',
166
+ bold: 'font-bold',
167
+ extrabold: 'font-extrabold'
168
+ },
169
+ color: {
170
+ default: '',
171
+ black: 'text-black dark:text-white',
172
+ gray: 'text-gray-600 dark:text-gray-300',
173
+ blue: 'text-blue-600 dark:text-blue-400',
174
+ red: 'text-red-600 dark:text-red-400',
175
+ green: 'text-green-600 dark:text-green-400'
176
+ }
177
+ },
178
+ defaultVariants: {
179
+ level: 1,
180
+ weight: 'extrabold',
181
+ color: 'default'
182
+ }
183
+ });
184
+ /**
185
+ * React Native Heading component with semantic levels and customizable styling.
186
+ * Uses twrnc for Tailwind-like styling converted to React Native styles.
187
+ */
188
+ const Heading = _a => {
189
+ var {
190
+ level,
191
+ weight,
192
+ color,
193
+ className = '',
194
+ style,
195
+ children
196
+ } = _a,
197
+ props = tslib.__rest(_a, ["level", "weight", "color", "className", "style", "children"]);
198
+ const classes = headingStyles({
199
+ level,
200
+ weight,
201
+ color
202
+ }) + (className ? ` ${className}` : '');
203
+ // Convert Tailwind classes to React Native style object
204
+ const headingStyle = [cn(classes), style].filter(Boolean);
205
+ return jsxRuntime.jsx(reactNative.Text, Object.assign({
206
+ style: headingStyle
207
+ }, props, {
208
+ children: children
209
+ }));
210
+ };
211
+
212
+ function resolveColorScheme(theme, colorScheme, colorSchemeLight, colorSchemeDark) {
213
+ if (theme === 'light' && colorSchemeLight !== undefined) return colorSchemeLight;
214
+ if (theme === 'dark' && colorSchemeDark !== undefined) return colorSchemeDark;
215
+ return colorScheme;
216
+ }
217
+
218
+ const buttonStyles = classVarianceAuthority.cva('items-center justify-center flex-row min-h-11 transition-colors border border-transparent', {
219
+ variants: {
220
+ variant: {
221
+ solid: '',
222
+ outline: 'border-current bg-transparent',
223
+ ghost: 'bg-transparent border-transparent'
224
+ },
225
+ colorScheme: {
226
+ brand: '',
227
+ mint: '',
228
+ gray: '',
229
+ red: '',
230
+ lightBlue: '',
231
+ lightGray: '',
232
+ white: '',
233
+ halfWhite: '',
234
+ halfBlue: ''
235
+ },
236
+ size: {
237
+ sm: 'px-3 py-2',
238
+ md: 'px-[18px] py-3',
239
+ lg: 'px-6 py-4',
240
+ xl: 'px-[25px] py-5'
241
+ },
242
+ rounded: {
243
+ default: '',
244
+ full: 'rounded-full'
245
+ },
246
+ disabled: {
247
+ false: '',
248
+ true: 'opacity-50'
249
+ }
250
+ },
251
+ compoundVariants: [
252
+ // Border radius per size (when rounded is default)
253
+ {
254
+ size: 'sm',
255
+ rounded: 'default',
256
+ class: 'rounded-[10px]'
257
+ }, {
258
+ size: 'md',
259
+ rounded: 'default',
260
+ class: 'rounded-[14px]'
261
+ }, {
262
+ size: 'lg',
263
+ rounded: 'default',
264
+ class: 'rounded-[14px]'
265
+ }, {
266
+ size: 'xl',
267
+ rounded: 'default',
268
+ class: 'rounded-[16px]'
269
+ },
270
+ // Solid variants - brand
271
+ {
272
+ variant: 'solid',
273
+ colorScheme: 'brand',
274
+ disabled: false,
275
+ class: 'bg-dash-brand'
276
+ }, {
277
+ variant: 'solid',
278
+ colorScheme: 'mint',
279
+ disabled: false,
280
+ class: 'bg-dash-mint'
281
+ }, {
282
+ variant: 'solid',
283
+ colorScheme: 'gray',
284
+ disabled: false,
285
+ class: 'bg-gray-200 dark:bg-gray-600'
286
+ }, {
287
+ variant: 'solid',
288
+ colorScheme: 'red',
289
+ disabled: false,
290
+ class: 'bg-red-200 dark:bg-red-600'
291
+ }, {
292
+ variant: 'solid',
293
+ colorScheme: 'lightBlue',
294
+ disabled: false,
295
+ class: 'bg-dash-brand/10 dark:bg-dash-brand/20'
296
+ }, {
297
+ variant: 'solid',
298
+ colorScheme: 'lightGray',
299
+ disabled: false,
300
+ class: 'bg-gray-100 dark:bg-gray-700/20'
301
+ }, {
302
+ variant: 'solid',
303
+ colorScheme: 'white',
304
+ disabled: false,
305
+ class: 'bg-white'
306
+ }, {
307
+ variant: 'solid',
308
+ colorScheme: 'halfWhite',
309
+ disabled: false,
310
+ class: 'bg-white/15'
311
+ }, {
312
+ variant: 'solid',
313
+ colorScheme: 'halfBlue',
314
+ disabled: false,
315
+ class: 'bg-dash-brand/15'
316
+ },
317
+ // Outline variants
318
+ {
319
+ variant: 'outline',
320
+ colorScheme: 'brand',
321
+ class: 'border-dash-brand'
322
+ }, {
323
+ variant: 'outline',
324
+ colorScheme: 'mint',
325
+ class: 'border-dash-mint'
326
+ }, {
327
+ variant: 'outline',
328
+ colorScheme: 'gray',
329
+ class: 'border-gray-700 dark:border-gray-300'
330
+ }, {
331
+ variant: 'outline',
332
+ colorScheme: 'red',
333
+ class: 'border-red-700 dark:border-red-400'
334
+ }, {
335
+ variant: 'outline',
336
+ colorScheme: 'white',
337
+ class: 'border-white'
338
+ }, {
339
+ variant: 'outline',
340
+ colorScheme: 'halfWhite',
341
+ class: 'border-white/50'
342
+ }, {
343
+ variant: 'outline',
344
+ colorScheme: 'halfBlue',
345
+ class: 'border-dash-brand/50'
346
+ }],
347
+ defaultVariants: {
348
+ variant: 'solid',
349
+ colorScheme: 'brand',
350
+ size: 'md',
351
+ rounded: 'default',
352
+ disabled: false
353
+ }
354
+ });
355
+ const textStyles$1 = classVarianceAuthority.cva('font-medium', {
356
+ variants: {
357
+ variant: {
358
+ solid: '',
359
+ outline: '',
360
+ ghost: ''
361
+ },
362
+ colorScheme: {
363
+ brand: '',
364
+ mint: '',
365
+ gray: '',
366
+ red: '',
367
+ lightBlue: '',
368
+ lightGray: '',
369
+ white: '',
370
+ halfWhite: '',
371
+ halfBlue: ''
372
+ },
373
+ size: {
374
+ sm: 'text-sm',
375
+ // 14px
376
+ md: 'text-base',
377
+ // 16px
378
+ lg: 'text-base',
379
+ // 16px
380
+ xl: 'text-lg' // 18px
381
+ }
382
+ },
383
+ compoundVariants: [
384
+ // Solid text colors
385
+ {
386
+ variant: 'solid',
387
+ colorScheme: 'brand',
388
+ class: 'text-white'
389
+ }, {
390
+ variant: 'solid',
391
+ colorScheme: 'mint',
392
+ class: 'text-black'
393
+ }, {
394
+ variant: 'solid',
395
+ colorScheme: 'gray',
396
+ class: 'text-gray-700 dark:text-gray-100'
397
+ }, {
398
+ variant: 'solid',
399
+ colorScheme: 'red',
400
+ class: 'text-red-700 dark:text-red-100'
401
+ }, {
402
+ variant: 'solid',
403
+ colorScheme: 'lightBlue',
404
+ class: 'text-dash-brand'
405
+ }, {
406
+ variant: 'solid',
407
+ colorScheme: 'lightGray',
408
+ class: 'text-gray-900 dark:text-gray-300'
409
+ }, {
410
+ variant: 'solid',
411
+ colorScheme: 'white',
412
+ class: 'text-dash-brand'
413
+ }, {
414
+ variant: 'solid',
415
+ colorScheme: 'halfWhite',
416
+ class: 'text-white'
417
+ }, {
418
+ variant: 'solid',
419
+ colorScheme: 'halfBlue',
420
+ class: 'text-dash-brand'
421
+ },
422
+ // Outline text colors
423
+ {
424
+ variant: 'outline',
425
+ colorScheme: 'brand',
426
+ class: 'text-dash-brand'
427
+ }, {
428
+ variant: 'outline',
429
+ colorScheme: 'mint',
430
+ class: 'text-dash-mint'
431
+ }, {
432
+ variant: 'outline',
433
+ colorScheme: 'gray',
434
+ class: 'text-gray-700 dark:text-gray-300'
435
+ }, {
436
+ variant: 'outline',
437
+ colorScheme: 'red',
438
+ class: 'text-red-700 dark:text-red-400'
439
+ }, {
440
+ variant: 'outline',
441
+ colorScheme: 'white',
442
+ class: 'text-white'
443
+ }, {
444
+ variant: 'outline',
445
+ colorScheme: 'halfWhite',
446
+ class: 'text-white'
447
+ }, {
448
+ variant: 'outline',
449
+ colorScheme: 'halfBlue',
450
+ class: 'text-dash-brand'
451
+ },
452
+ // Ghost text colors
453
+ {
454
+ variant: 'ghost',
455
+ colorScheme: 'brand',
456
+ class: 'text-dash-brand'
457
+ }],
458
+ defaultVariants: {
459
+ variant: 'solid',
460
+ colorScheme: 'brand',
461
+ size: 'md'
462
+ }
463
+ });
464
+ /**
465
+ * React Native Button component with variants, color schemes, sizes, and loading state.
466
+ * Uses Pressable for touch interactions and twrnc for Tailwind styling.
467
+ */
468
+ const Button = _a => {
469
+ var _b;
470
+ var {
471
+ theme = 'light',
472
+ variant,
473
+ colorScheme,
474
+ colorSchemeLight,
475
+ colorSchemeDark,
476
+ size,
477
+ rounded,
478
+ disabled = false,
479
+ loading = false,
480
+ className = '',
481
+ style,
482
+ textStyle,
483
+ children,
484
+ onPress
485
+ } = _a,
486
+ props = tslib.__rest(_a, ["theme", "variant", "colorScheme", "colorSchemeLight", "colorSchemeDark", "size", "rounded", "disabled", "loading", "className", "style", "textStyle", "children", "onPress"]);
487
+ const isDisabled = disabled || loading;
488
+ const effectiveColorScheme = (_b = resolveColorScheme(theme, colorScheme, colorSchemeLight, colorSchemeDark)) !== null && _b !== void 0 ? _b : 'brand';
489
+ const buttonClasses = buttonStyles({
490
+ variant,
491
+ colorScheme: effectiveColorScheme,
492
+ size,
493
+ rounded,
494
+ disabled: isDisabled
495
+ }) + (className ? ` ${className}` : '');
496
+ const textClasses = textStyles$1({
497
+ variant,
498
+ colorScheme: effectiveColorScheme,
499
+ size
500
+ });
501
+ // Convert Tailwind classes to React Native style objects
502
+ const buttonStyle = [cn(buttonClasses), style].filter(Boolean);
503
+ const textStyleMerged = [cn(textClasses), textStyle].filter(Boolean);
504
+ return jsxRuntime.jsx(reactNative.Pressable, Object.assign({
505
+ style: ({
506
+ pressed
507
+ }) => [...buttonStyle, pressed && !isDisabled && {
508
+ opacity: 0.7
509
+ }],
510
+ disabled: isDisabled,
511
+ onPress: onPress
512
+ }, props, {
513
+ children: loading ? jsxRuntime.jsx(reactNative.ActivityIndicator, {
514
+ size: "small",
515
+ color: variant === 'solid' && effectiveColorScheme === 'brand' ? '#fff' : '#3B82F6'
516
+ }) : typeof children === 'string' ? jsxRuntime.jsx(reactNative.Text, {
517
+ style: textStyleMerged,
518
+ children: children
519
+ }) : children
520
+ }));
521
+ };
522
+
523
+ const ArrowIcon = ({
524
+ color = 'white',
525
+ size = 14,
526
+ onPress
527
+ }) => {
528
+ return jsxRuntime.jsx(Svg, {
529
+ width: size,
530
+ height: size,
531
+ viewBox: '0 0 9 14',
532
+ fill: 'none',
533
+ onPress: onPress,
534
+ color: color,
535
+ children: jsxRuntime.jsx(Svg.Path, {
536
+ d: 'M7.29297 0.292893C7.68349 -0.0976311 8.31651 -0.0976311 8.70703 0.292893C9.09756 0.683418 9.09756 1.31643 8.70703 1.70696L3.41406 6.99992L8.70703 12.2929L8.77539 12.3691C9.09574 12.7618 9.07315 13.3408 8.70703 13.707C8.34092 14.0731 7.76191 14.0957 7.36914 13.7753L7.29297 13.707L0.585938 6.99992L7.29297 0.292893Z',
537
+ fill: color
538
+ })
539
+ });
540
+ };
541
+ const CopyIcon = ({
542
+ color = 'white',
543
+ size = 16,
544
+ onPress
545
+ }) => {
546
+ return jsxRuntime.jsxs(Svg, {
547
+ width: size,
548
+ height: size,
549
+ viewBox: '0 0 16 16',
550
+ fill: 'none',
551
+ onPress: onPress,
552
+ color: color,
553
+ children: [jsxRuntime.jsx(Svg.G, {
554
+ clipPath: 'url(#clip0_3876_6767)',
555
+ children: jsxRuntime.jsx(Svg.G, {
556
+ clipPath: 'url(#clip1_3876_6767)',
557
+ children: jsxRuntime.jsx(Svg.G, {
558
+ clipPath: 'url(#clip2_3876_6767)',
559
+ children: jsxRuntime.jsx(Svg.Path, {
560
+ d: 'M11.4512 10.5645H5.28516V1.75586H9.32335L11.4512 3.88369V10.5645ZM12.332 3.51758L9.68945 0.875H5.28516H4.4043V1.75586V10.5645V11.4453H5.28516H11.4512H12.332V10.5645V3.51758ZM0.880859 4.39844H0V5.2793V14.0879V14.9688H0.880859H7.04688H7.92773V14.0879V12.3262H7.04688V14.0879H0.880859V5.2793H3.52344V4.39844H0.880859Z',
561
+ fill: color
562
+ })
563
+ })
564
+ })
565
+ }), jsxRuntime.jsxs(Svg.Defs, {
566
+ children: [jsxRuntime.jsx(Svg.ClipPath, {
567
+ id: 'clip0_3876_6767',
568
+ children: jsxRuntime.jsx(Svg.Rect, {
569
+ width: '16',
570
+ height: '16',
571
+ fill: 'white'
572
+ })
573
+ }), jsxRuntime.jsx(Svg.ClipPath, {
574
+ id: 'clip1_3876_6767',
575
+ children: jsxRuntime.jsx(Svg.Rect, {
576
+ width: '16',
577
+ height: '14.25',
578
+ fill: 'white',
579
+ transform: 'translate(0 0.875)'
580
+ })
581
+ }), jsxRuntime.jsx(Svg.ClipPath, {
582
+ id: 'clip2_3876_6767',
583
+ children: jsxRuntime.jsx(Svg.Rect, {
584
+ width: '12.332',
585
+ height: '14.0938',
586
+ fill: 'white',
587
+ transform: 'translate(0 0.875)'
588
+ })
589
+ })]
590
+ })]
591
+ });
592
+ };
593
+ const SuccessIcon = ({
594
+ color = '#1CC400',
595
+ size = 18,
596
+ onPress
597
+ }) => jsxRuntime.jsxs(Svg, {
598
+ width: size,
599
+ height: size,
600
+ viewBox: '0 0 18 18',
601
+ fill: 'none',
602
+ onPress: onPress,
603
+ color: color,
604
+ children: [jsxRuntime.jsx(Svg.Circle, {
605
+ cx: '9',
606
+ cy: '9',
607
+ r: '9',
608
+ fill: color,
609
+ fillOpacity: '.2'
610
+ }), jsxRuntime.jsx(Svg.Path, {
611
+ d: 'M5 8.5L8 11.5L13.5 6',
612
+ stroke: color,
613
+ strokeWidth: '2',
614
+ strokeLinecap: 'round'
615
+ })]
616
+ });
617
+ const ErrorIcon = ({
618
+ color = '#F45858',
619
+ size = 18,
620
+ onPress
621
+ }) => jsxRuntime.jsxs(Svg, {
622
+ width: size,
623
+ height: size,
624
+ viewBox: '0 0 18 18',
625
+ fill: 'none',
626
+ onPress: onPress,
627
+ color: color,
628
+ children: [jsxRuntime.jsx(Svg.Rect, {
629
+ width: '18',
630
+ height: '18',
631
+ rx: '4',
632
+ fill: color,
633
+ fillOpacity: '.2'
634
+ }), jsxRuntime.jsx(Svg.Path, {
635
+ d: 'M9.06951 10L9.0695 4.86092',
636
+ stroke: color,
637
+ strokeWidth: '2',
638
+ strokeLinecap: 'round'
639
+ }), jsxRuntime.jsx(Svg.Path, {
640
+ d: 'M9.06951 13L9.06951 13.0102',
641
+ stroke: color,
642
+ strokeWidth: '2',
643
+ strokeLinecap: 'round'
644
+ })]
645
+ });
646
+ const CheckIcon = ({
647
+ color = '#4C7EFF',
648
+ size = 20,
649
+ onPress
650
+ }) => {
651
+ return jsxRuntime.jsxs(Svg, {
652
+ width: size,
653
+ height: size,
654
+ viewBox: '0 0 20 20',
655
+ fill: 'none',
656
+ onPress: onPress,
657
+ children: [jsxRuntime.jsx(Svg.Circle, {
658
+ cx: '10',
659
+ cy: '10',
660
+ r: '10',
661
+ fill: 'rgba(12, 28, 51, 0.05)'
662
+ }), jsxRuntime.jsx(Svg.Path, {
663
+ d: 'M6.33 10L8.83 12.5L13.67 7.67',
664
+ stroke: color,
665
+ strokeWidth: '1.5',
666
+ strokeLinecap: 'round',
667
+ strokeLinejoin: 'round'
668
+ })]
669
+ });
670
+ };
671
+ const CrossIcon = ({
672
+ color = '#0C1C33',
673
+ size = 16,
674
+ onPress
675
+ }) => jsxRuntime.jsx(Svg, {
676
+ width: size,
677
+ height: size * 17 / 16,
678
+ viewBox: '0 0 16 17',
679
+ fill: 'none',
680
+ onPress: onPress,
681
+ color: color,
682
+ children: jsxRuntime.jsx(Svg.Path, {
683
+ d: 'M13.5693 3.40266L13.0973 2.93066L8 8.02866L2.90266 2.93066L2.43066 3.40266L7.52866 8.5L2.43066 13.5973L2.90266 14.0693L8 8.97133L13.0973 14.0693L13.5693 13.5973L8.47133 8.5L13.5693 3.40266Z',
684
+ fill: color
685
+ })
686
+ });
687
+ const PlusIcon = ({
688
+ color = '#4C7EFF',
689
+ size = 17,
690
+ onPress
691
+ }) => jsxRuntime.jsx(Svg, {
692
+ width: size,
693
+ height: size * 16 / 17,
694
+ viewBox: '0 0 17 16',
695
+ fill: 'none',
696
+ onPress: onPress,
697
+ color: color,
698
+ children: jsxRuntime.jsx(Svg.Path, {
699
+ d: 'M15.1667 7.66665H8.83337V1.33331H8.16671V7.66665H1.83337V8.33331H8.16671V14.6666H8.83337V8.33331H15.1667V7.66665Z',
700
+ fill: color
701
+ })
702
+ });
703
+ const ChevronIcon = ({
704
+ color = '#0C1C33',
705
+ size = 12,
706
+ onPress
707
+ }) => jsxRuntime.jsx(Svg, {
708
+ width: size,
709
+ height: size,
710
+ viewBox: '0 0 12 12',
711
+ fill: 'none',
712
+ onPress: onPress,
713
+ color: color,
714
+ children: jsxRuntime.jsx(Svg.Path, {
715
+ d: 'M6 8.9395L1.65149 4.59099L2.18149 4.06049L6 7.879L9.8185 4.06049L10.3485 4.59099L6 8.9395Z',
716
+ fill: color
717
+ })
718
+ });
719
+ const SearchIcon = ({
720
+ color = '#0C1C33',
721
+ size = 16,
722
+ onPress
723
+ }) => jsxRuntime.jsx(Svg, {
724
+ width: size,
725
+ height: size,
726
+ viewBox: '0 0 16 16',
727
+ fill: 'none',
728
+ onPress: onPress,
729
+ color: color,
730
+ children: jsxRuntime.jsx(Svg.Path, {
731
+ d: 'M14.569 14.0977L10.6623 10.191C11.5815 9.14938 12.0591 7.79092 11.9941 6.40327C11.9292 5.01564 11.3267 3.70776 10.3143 2.75659C9.30178 1.80542 7.95892 1.28563 6.56994 1.30729C5.18095 1.32895 3.85492 1.89036 2.87264 2.87264C1.89036 3.85492 1.32895 5.18095 1.30729 6.56994C1.28563 7.95892 1.80542 9.30178 2.75659 10.3143C3.70776 11.3267 5.01564 11.9292 6.40327 11.9941C7.79092 12.0591 9.14938 11.5815 10.191 10.6623L14.0977 14.569L14.569 14.0977ZM6.66665 11.3333C5.74364 11.3333 4.84138 11.0596 4.07396 10.5468C3.30653 10.0341 2.70839 9.30518 2.35518 8.45245C2.00197 7.59978 1.90956 6.66145 2.08962 5.7562C2.26968 4.85095 2.71414 4.01943 3.36678 3.36678C4.01943 2.71414 4.85095 2.26968 5.7562 2.08962C6.66145 1.90956 7.59978 2.00197 8.45245 2.35518C9.30518 2.70839 10.0341 3.30653 10.5468 4.07396C11.0596 4.84138 11.3333 5.74364 11.3333 6.66665C11.3319 7.90385 10.8398 9.09005 9.96492 9.96492C9.09005 10.8398 7.90385 11.3319 6.66665 11.3333Z',
732
+ fill: color
733
+ })
734
+ });
735
+ const InfoCircleIcon = ({
736
+ color = '#4C7EFF',
737
+ size = 19,
738
+ onPress
739
+ }) => jsxRuntime.jsxs(Svg, {
740
+ width: size,
741
+ height: size,
742
+ viewBox: '0 0 19 19',
743
+ fill: 'none',
744
+ onPress: onPress,
745
+ color: color,
746
+ children: [jsxRuntime.jsxs(Svg.G, {
747
+ clipPath: 'url(#clip0_1166_258)',
748
+ children: [jsxRuntime.jsx(Svg.Path, {
749
+ d: 'M9.5 5.5H9.51ZM9.5 8.5V13.5ZM18.5 9.5C18.5 14.4706 14.4706 18.5 9.5 18.5C4.52944 18.5 0.5 14.4706 0.5 9.5C0.5 4.52944 4.52944 0.5 9.5 0.5C14.4706 0.5 18.5 4.52944 18.5 9.5Z',
750
+ fill: color,
751
+ fillOpacity: '0.05'
752
+ }), jsxRuntime.jsx(Svg.Path, {
753
+ d: 'M18 9.5C18 4.80558 14.1945 1 9.5 1C4.80558 1 1 4.80558 1 9.5C1 14.1945 4.80558 18 9.5 18C14.1945 18 18 14.1945 18 9.5ZM9 13.5V8.5C9 8.22386 9.22386 8 9.5 8C9.77614 8 10 8.22386 10 8.5V13.5C10 13.7761 9.77614 14 9.5 14C9.22386 14 9 13.7761 9 13.5ZM9.50977 5C9.78591 5 10.0098 5.22386 10.0098 5.5C10.0098 5.77614 9.78591 6 9.50977 6H9.5C9.22386 6 9 5.77614 9 5.5C9 5.22386 9.22386 5 9.5 5H9.50977ZM19 9.5C19 14.7467 14.7467 19 9.5 19C4.2533 19 0 14.7467 0 9.5C0 4.2533 4.2533 0 9.5 0C14.7467 0 19 4.2533 19 9.5Z',
754
+ fill: color
755
+ })]
756
+ }), jsxRuntime.jsx(Svg.Defs, {
757
+ children: jsxRuntime.jsx(Svg.ClipPath, {
758
+ id: 'clip0_1166_258',
759
+ children: jsxRuntime.jsx(Svg.Rect, {
760
+ width: '19',
761
+ height: '19',
762
+ fill: 'white'
763
+ })
764
+ })
765
+ })]
766
+ });
767
+ const EyeOpenIcon = ({
768
+ color = 'currentColor',
769
+ size = 16,
770
+ onPress
771
+ }) => jsxRuntime.jsx(Svg, {
772
+ width: size,
773
+ height: size * 10 / 16,
774
+ viewBox: '0 0 16 10',
775
+ fill: 'none',
776
+ onPress: onPress,
777
+ color: color,
778
+ children: jsxRuntime.jsx(Svg.Path, {
779
+ d: 'M7.89888 0C6.24409 0.000806406 4.62351 0.471042 3.22533 1.35609C1.82715 2.24114 0.708743 3.50469 0 5C0.708092 6.49578 1.82635 7.75974 3.22468 8.64489C4.623 9.53004 6.24392 9.99999 7.89888 9.99999C9.55378 9.99999 11.1747 9.53004 12.573 8.64489C13.9713 7.75974 15.0896 6.49578 15.7977 5C15.089 3.50469 13.9706 2.24114 12.5724 1.35609C11.1742 0.471042 9.55364 0.000806406 7.89888 0ZM7.89888 8.98344C6.52084 8.97755 5.16914 8.60565 3.98212 7.90571C2.79509 7.20576 1.81538 6.20297 1.14327 5C1.81083 3.7931 2.78951 2.78709 3.97757 2.08654C5.16561 1.38601 6.51964 1.01653 7.89888 1.01653C9.27804 1.01653 10.6321 1.38601 11.8201 2.08654C13.0082 2.78709 13.9868 3.7931 14.6545 5C13.9823 6.20297 13.0026 7.20576 11.8156 7.90571C10.6285 8.60565 9.27689 8.97755 7.89888 8.98344ZM7.89888 2.51693C7.40772 2.51693 6.92767 2.66256 6.51934 2.93541C6.11101 3.20825 5.79274 3.59605 5.60481 4.0498C5.41687 4.50349 5.3677 5.00271 5.46351 5.48439C5.55932 5.96606 5.7958 6.4085 6.14306 6.7558C6.49033 7.10303 6.93275 7.33953 7.41443 7.43535C7.8961 7.53117 8.39533 7.48197 8.84909 7.29406C9.30277 7.10608 9.69059 6.78785 9.96342 6.3795C10.2362 5.97114 10.3819 5.4911 10.3819 5C10.3819 4.34146 10.1203 3.70989 9.65461 3.24421C9.189 2.77854 8.55742 2.51693 7.89888 2.51693ZM7.89888 6.46658C7.60878 6.46658 7.32525 6.38058 7.08407 6.21937C6.8429 6.05822 6.65492 5.82918 6.54392 5.56123C6.43291 5.29322 6.40387 4.99837 6.46045 4.7139C6.51704 4.42942 6.65675 4.16805 6.8618 3.96299C7.06693 3.75786 7.32823 3.61818 7.61271 3.5616C7.89726 3.50501 8.1921 3.53405 8.46011 3.64504C8.72806 3.75603 8.9571 3.94402 9.11825 4.18519C9.27939 4.42637 9.36546 4.7099 9.36546 5C9.36498 5.38884 9.21034 5.76161 8.93542 6.03654C8.66043 6.31146 8.28765 6.4661 7.89888 6.46658Z',
780
+ fill: color
781
+ })
782
+ });
783
+ const EyeClosedIcon = ({
784
+ color = 'currentColor',
785
+ size = 16,
786
+ onPress
787
+ }) => jsxRuntime.jsxs(Svg, {
788
+ width: size,
789
+ height: size,
790
+ viewBox: '0 0 16 16',
791
+ fill: 'none',
792
+ onPress: onPress,
793
+ color: color,
794
+ children: [jsxRuntime.jsx(Svg.Path, {
795
+ d: 'M7.89888 3C6.24409 3.00081 4.62351 3.47104 3.22533 4.35609C1.82715 5.24114 0.708743 6.50469 0 8C0.708092 9.49578 1.82635 10.7597 3.22468 11.6449C4.623 12.53 6.24392 13 7.89888 13C9.55378 13 11.1747 12.53 12.573 11.6449C13.9713 10.7597 15.0896 9.49578 15.7977 8C15.089 6.50469 13.9706 5.24114 12.5724 4.35609C11.1742 3.47104 9.55364 3.00081 7.89888 3ZM7.89888 11.9834C6.52084 11.9776 5.16914 11.6056 3.98212 10.9057C2.79509 10.2058 1.81538 9.20297 1.14327 8C1.81083 6.7931 2.78951 5.78709 3.97757 5.08654C5.16561 4.38601 6.51964 4.01653 7.89888 4.01653C9.27804 4.01653 10.6321 4.38601 11.8201 5.08654C13.0082 5.78709 13.9868 6.7931 14.6545 8C13.9823 9.20297 13.0026 10.2058 11.8156 10.9057C10.6285 11.6056 9.27689 11.9776 7.89888 11.9834Z',
796
+ fill: color
797
+ }), jsxRuntime.jsx(Svg.Line, {
798
+ x1: '1',
799
+ y1: '15',
800
+ x2: '15',
801
+ y2: '1',
802
+ stroke: color,
803
+ strokeWidth: '1.5',
804
+ strokeLinecap: 'round'
805
+ })]
806
+ });
807
+ const AsteriskIcon = ({
808
+ color = '#0C1C33',
809
+ size = 16,
810
+ onPress
811
+ }) => jsxRuntime.jsx(Svg, {
812
+ width: size,
813
+ height: size * 17 / 16,
814
+ viewBox: '0 0 16 17',
815
+ fill: 'none',
816
+ onPress: onPress,
817
+ color: color,
818
+ children: jsxRuntime.jsx(Svg.Path, {
819
+ d: 'M6.38944 0H9.61056L9.24092 8.5H6.75908L6.38944 0ZM6.38944 17L6.75908 8.5H9.24092L9.61056 17H6.38944ZM0 5.50476L1.63696 2.96825L8.60726 7.50159L7.36634 9.47143L0 5.50476ZM16 5.50476L8.63366 9.47143L7.39274 7.50159L14.363 2.96825L16 5.50476ZM16 11.4683L14.363 14.0048L7.39274 9.47143L8.63366 7.50159L16 11.4683ZM0 11.5222L7.36634 7.55556L8.60726 9.5254L1.63696 14.0587L0 11.5222Z',
820
+ fill: color
821
+ })
822
+ });
823
+ const TopRightArrowIcon = ({
824
+ color = '#0C1C33',
825
+ size = 25,
826
+ onPress
827
+ }) => jsxRuntime.jsx(Svg, {
828
+ width: size,
829
+ height: size,
830
+ viewBox: '0 0 25 25',
831
+ fill: 'none',
832
+ onPress: onPress,
833
+ color: color,
834
+ children: jsxRuntime.jsx(Svg.Path, {
835
+ d: 'M21.3388 3.66117L21.3388 21.3388M21.3388 3.66117L3.66116 3.66117M21.3388 3.66117L3.66116 21.3388',
836
+ stroke: color,
837
+ strokeWidth: '2',
838
+ strokeLinecap: 'round',
839
+ strokeLinejoin: 'round'
840
+ })
841
+ });
842
+ const QueuedIcon = ({
843
+ color = '#F4A358',
844
+ size = 18,
845
+ onPress
846
+ }) => jsxRuntime.jsxs(Svg, {
847
+ width: size,
848
+ height: size,
849
+ viewBox: '0 0 18 18',
850
+ fill: 'none',
851
+ onPress: onPress,
852
+ color: color,
853
+ children: [jsxRuntime.jsx(Svg.Rect, {
854
+ width: '18',
855
+ height: '18',
856
+ rx: '4',
857
+ fill: color,
858
+ fillOpacity: '.2'
859
+ }), jsxRuntime.jsx(Svg.Path, {
860
+ d: 'M11.6756 12.6482C11.8311 12.8601 12.1306 12.9075 12.3268 12.7326C13.1311 12.0158 13.6857 11.055 13.9009 9.99071C14.1476 8.77034 13.9301 7.50182 13.2909 6.43333C12.6518 5.36484 11.637 4.57324 10.4451 4.2134C9.25315 3.85356 7.96985 3.95136 6.84622 4.48768C5.72259 5.024 4.83949 5.96024 4.36966 7.11325C3.89983 8.26626 3.87708 9.55308 4.30587 10.722C4.73466 11.8909 5.58412 12.8577 6.6881 13.4334C7.65084 13.9355 8.74673 14.1085 9.80981 13.934C10.0691 13.8914 10.2207 13.6287 10.1537 13.3746C10.0867 13.1205 9.82636 12.9718 9.56614 13.0086C8.7336 13.1262 7.88063 12.982 7.12813 12.5896C6.23429 12.1235 5.5465 11.3406 5.19933 10.3942C4.85216 9.44781 4.87057 8.40592 5.25098 7.47237C5.63138 6.53882 6.3464 5.78078 7.25616 5.34654C8.16592 4.91231 9.20497 4.83312 10.17 5.12447C11.1351 5.41582 11.9567 6.05674 12.4742 6.92186C12.9917 7.78698 13.1678 8.81405 12.9681 9.80215C12.7999 10.634 12.3756 11.3878 11.7605 11.9612C11.5683 12.1404 11.5202 12.4362 11.6756 12.6482Z',
861
+ fill: color
862
+ })]
863
+ });
864
+ const PooledIcon = ({
865
+ color = '#008DE4',
866
+ size = 18,
867
+ onPress
868
+ }) => jsxRuntime.jsxs(Svg, {
869
+ width: size,
870
+ height: size,
871
+ viewBox: '0 0 18 18',
872
+ fill: 'none',
873
+ onPress: onPress,
874
+ color: color,
875
+ children: [jsxRuntime.jsx(Svg.Rect, {
876
+ width: '18',
877
+ height: '18',
878
+ rx: '4',
879
+ fill: color,
880
+ fillOpacity: '.2'
881
+ }), jsxRuntime.jsx(Svg.Path, {
882
+ d: 'M14 7L12.4328 6.01491C11.4484 5.39611 10.1941 5.40565 9.21918 6.03935C8.30752 6.63193 7.14565 6.6816 6.18674 6.16899L4 5',
883
+ stroke: color,
884
+ strokeLinecap: 'round'
885
+ }), jsxRuntime.jsx(Svg.Path, {
886
+ d: 'M14 10L12.4328 9.01491C11.4484 8.39611 10.1941 8.40565 9.21918 9.03935C8.30752 9.63193 7.14565 9.6816 6.18674 9.16899L4 8',
887
+ stroke: color,
888
+ strokeLinecap: 'round'
889
+ }), jsxRuntime.jsx(Svg.Path, {
890
+ d: 'M14 13L12.4328 12.0149C11.4484 11.3961 10.1941 11.4057 9.21918 12.0393C8.30752 12.6319 7.14565 12.6816 6.18674 12.169L4 11',
891
+ stroke: color,
892
+ strokeLinecap: 'round'
893
+ })]
894
+ });
895
+ const BroadcastedIcon = ({
896
+ color = '#008DE4',
897
+ size = 18,
898
+ onPress
899
+ }) => jsxRuntime.jsxs(Svg, {
900
+ width: size,
901
+ height: size,
902
+ viewBox: '0 0 18 18',
903
+ fill: 'none',
904
+ onPress: onPress,
905
+ color: color,
906
+ children: [jsxRuntime.jsx(Svg.Rect, {
907
+ width: '18',
908
+ height: '18',
909
+ rx: '4',
910
+ fill: color,
911
+ fillOpacity: '.2'
912
+ }), jsxRuntime.jsx(Svg.Path, {
913
+ d: 'M4.86093 8.74967L12.5 8.74993M12.5 8.74993L9.5 5.74993M12.5 8.74993L9.5 11.7499',
914
+ stroke: color,
915
+ strokeWidth: '2',
916
+ strokeLinecap: 'round',
917
+ strokeLinejoin: 'round'
918
+ })]
919
+ });
920
+ // Export all icons as a collection
921
+ const Icons = {
922
+ ArrowIcon,
923
+ CopyIcon,
924
+ SuccessIcon,
925
+ ErrorIcon,
926
+ CheckIcon,
927
+ CrossIcon,
928
+ PlusIcon,
929
+ ChevronIcon,
930
+ SearchIcon,
931
+ InfoCircleIcon,
932
+ EyeOpenIcon,
933
+ EyeClosedIcon,
934
+ TopRightArrowIcon,
935
+ QueuedIcon,
936
+ PooledIcon,
937
+ BroadcastedIcon,
938
+ AsteriskIcon
939
+ };
940
+
941
+ const inputStyles = classVarianceAuthority.cva('w-full font-normal text-sm leading-[17px]', {
942
+ variants: {
943
+ colorScheme: {
944
+ default: '',
945
+ brand: '',
946
+ error: '',
947
+ success: '',
948
+ 'light-gray': ''
949
+ },
950
+ size: {
951
+ sm: 'px-3 py-2 rounded-[10px]',
952
+ md: 'px-4 py-3 rounded-[12px]',
953
+ xl: 'px-4 py-[18px] rounded-[14px]'
954
+ },
955
+ variant: {
956
+ outlined: 'border',
957
+ filled: 'border-0'
958
+ },
959
+ disabled: {
960
+ false: '',
961
+ true: 'opacity-60'
962
+ }
963
+ },
964
+ compoundVariants: [
965
+ // Outlined variant colors
966
+ {
967
+ variant: 'outlined',
968
+ colorScheme: 'default',
969
+ class: 'border-[rgba(17,17,17,0.32)] bg-white'
970
+ }, {
971
+ variant: 'outlined',
972
+ colorScheme: 'brand',
973
+ class: 'border-dash-brand/30 bg-white'
974
+ }, {
975
+ variant: 'outlined',
976
+ colorScheme: 'error',
977
+ class: 'border-red-500 bg-white'
978
+ }, {
979
+ variant: 'outlined',
980
+ colorScheme: 'success',
981
+ class: 'border-green-500 bg-white'
982
+ }, {
983
+ variant: 'outlined',
984
+ colorScheme: 'light-gray',
985
+ class: 'border-gray-500/50 bg-white'
986
+ },
987
+ // Filled variant colors
988
+ {
989
+ variant: 'filled',
990
+ colorScheme: 'default',
991
+ class: 'bg-dash-brand/15'
992
+ }, {
993
+ variant: 'filled',
994
+ colorScheme: 'brand',
995
+ class: 'bg-dash-brand/15'
996
+ }, {
997
+ variant: 'filled',
998
+ colorScheme: 'error',
999
+ class: 'bg-red-500/15'
1000
+ }, {
1001
+ variant: 'filled',
1002
+ colorScheme: 'success',
1003
+ class: 'bg-green-500/15'
1004
+ }, {
1005
+ variant: 'filled',
1006
+ colorScheme: 'light-gray',
1007
+ class: 'bg-gray-100'
1008
+ }],
1009
+ defaultVariants: {
1010
+ colorScheme: 'default',
1011
+ size: 'xl',
1012
+ variant: 'outlined',
1013
+ disabled: false
1014
+ }
1015
+ });
1016
+ /**
1017
+ * React Native Input component that adapts to various color schemes, sizes, variants, and states.
1018
+ * For password inputs (secureTextEntry), includes a toggleable eye icon.
1019
+ * Supports prefix text or elements before input content.
1020
+ *
1021
+ * @example
1022
+ * <Input
1023
+ * secureTextEntry
1024
+ * placeholder="Enter password"
1025
+ * colorScheme="brand"
1026
+ * size="xl"
1027
+ * prefix="https://"
1028
+ * />
1029
+ */
1030
+ const Input = _a => {
1031
+ var _b;
1032
+ var {
1033
+ theme = 'light',
1034
+ className = '',
1035
+ colorScheme,
1036
+ colorSchemeLight,
1037
+ colorSchemeDark,
1038
+ size,
1039
+ variant,
1040
+ error = false,
1041
+ success = false,
1042
+ disabled = false,
1043
+ secureTextEntry = false,
1044
+ prefix,
1045
+ prefixStyle,
1046
+ showPasswordToggle = true,
1047
+ style,
1048
+ textStyle
1049
+ } = _a,
1050
+ props = tslib.__rest(_a, ["theme", "className", "colorScheme", "colorSchemeLight", "colorSchemeDark", "size", "variant", "error", "success", "disabled", "secureTextEntry", "prefix", "prefixStyle", "showPasswordToggle", "style", "textStyle"]);
1051
+ const [showPassword, setShowPassword] = react.useState(false);
1052
+ // Determine color scheme based on state
1053
+ const effectiveColorScheme = (_b = resolveColorScheme(theme, colorScheme, colorSchemeLight, colorSchemeDark)) !== null && _b !== void 0 ? _b : 'default';
1054
+ let finalColorScheme = effectiveColorScheme;
1055
+ if (error) finalColorScheme = 'error';else if (success) finalColorScheme = 'success';
1056
+ const classes = inputStyles({
1057
+ colorScheme: finalColorScheme,
1058
+ size,
1059
+ variant,
1060
+ disabled
1061
+ }) + (className ? ` ${className}` : '');
1062
+ const isPassword = secureTextEntry;
1063
+ const shouldShowToggle = isPassword && showPasswordToggle;
1064
+ const hasPrefix = Boolean(prefix);
1065
+ const togglePasswordVisibility = () => {
1066
+ setShowPassword(!showPassword);
1067
+ };
1068
+ // Convert Tailwind classes to React Native style objects
1069
+ const inputStyle = [cn(classes), style].filter(Boolean);
1070
+ const inputTextStyle = [{
1071
+ color: '#111111',
1072
+ fontSize: 14,
1073
+ lineHeight: 17,
1074
+ fontWeight: '300'
1075
+ }, textStyle].filter(Boolean);
1076
+ // Adjust padding for password toggle button and prefix
1077
+ const containerStyle = {};
1078
+ if (shouldShowToggle) containerStyle.paddingRight = 40;
1079
+ if (hasPrefix) containerStyle.paddingLeft = 70; // Extra space for prefix
1080
+ // Default prefix style
1081
+ const defaultPrefixStyle = {
1082
+ color: 'rgba(17, 17, 17, 0.6)',
1083
+ fontSize: 14,
1084
+ lineHeight: 17
1085
+ };
1086
+ // Render prefix element
1087
+ const renderPrefix = () => {
1088
+ if (!hasPrefix) return null;
1089
+ return jsxRuntime.jsx(reactNative.View, {
1090
+ style: {
1091
+ position: 'absolute',
1092
+ left: 16,
1093
+ height: '100%',
1094
+ justifyContent: 'center',
1095
+ zIndex: 10,
1096
+ pointerEvents: 'none'
1097
+ },
1098
+ children: typeof prefix === 'string' ? jsxRuntime.jsx(reactNative.Text, {
1099
+ style: [defaultPrefixStyle, prefixStyle],
1100
+ children: prefix
1101
+ }) : prefix
1102
+ });
1103
+ };
1104
+ if (isPassword || hasPrefix) {
1105
+ return jsxRuntime.jsxs(reactNative.View, {
1106
+ style: {
1107
+ position: 'relative'
1108
+ },
1109
+ children: [renderPrefix(), jsxRuntime.jsx(reactNative.TextInput, Object.assign({
1110
+ style: [inputStyle, containerStyle, inputTextStyle],
1111
+ editable: !disabled,
1112
+ secureTextEntry: isPassword && !showPassword,
1113
+ placeholderTextColor: "rgba(17, 17, 17, 0.6)"
1114
+ }, props)), shouldShowToggle && jsxRuntime.jsx(reactNative.TouchableOpacity, {
1115
+ style: {
1116
+ position: 'absolute',
1117
+ right: 16,
1118
+ height: '100%',
1119
+ justifyContent: 'center',
1120
+ alignItems: 'center',
1121
+ opacity: 0.5
1122
+ },
1123
+ onPress: togglePasswordVisibility,
1124
+ activeOpacity: 0.7,
1125
+ children: showPassword ? jsxRuntime.jsx(EyeClosedIcon, {
1126
+ size: 16,
1127
+ color: '#0C1C33'
1128
+ }) : jsxRuntime.jsx(EyeOpenIcon, {
1129
+ size: 16,
1130
+ color: '#0C1C33'
1131
+ })
1132
+ })]
1133
+ });
1134
+ }
1135
+ // Regular input without prefix or password
1136
+ return jsxRuntime.jsx(reactNative.TextInput, Object.assign({
1137
+ style: [inputStyle, inputTextStyle],
1138
+ editable: !disabled,
1139
+ placeholderTextColor: "rgba(17, 17, 17, 0.6)"
1140
+ }, props));
1141
+ };
1142
+
1143
+ const tabsRootStyles = classVarianceAuthority.cva('flex-col w-full', {
1144
+ variants: {
1145
+ theme: {
1146
+ light: '',
1147
+ dark: ''
1148
+ }
1149
+ },
1150
+ defaultVariants: {
1151
+ theme: 'light'
1152
+ }
1153
+ });
1154
+ const tabsListStyles = classVarianceAuthority.cva('flex-row relative', {
1155
+ variants: {
1156
+ theme: {
1157
+ light: '',
1158
+ dark: ''
1159
+ }
1160
+ },
1161
+ defaultVariants: {
1162
+ theme: 'light'
1163
+ }
1164
+ });
1165
+ const tabsTriggerStyles = classVarianceAuthority.cva(['flex-row items-center justify-center relative', 'font-light transition-all'], {
1166
+ variants: {
1167
+ theme: {
1168
+ light: '',
1169
+ dark: ''
1170
+ },
1171
+ active: {
1172
+ true: '',
1173
+ false: ''
1174
+ },
1175
+ size: {
1176
+ sm: 'text-sm px-0 pr-3 pb-2',
1177
+ lg: 'text-xl px-0 pr-4 pb-3',
1178
+ xl: 'text-2xl px-0 pr-[14px] pb-[10px]'
1179
+ }
1180
+ },
1181
+ compoundVariants: [{
1182
+ theme: 'light',
1183
+ active: true,
1184
+ class: 'text-dash-primary-dark-blue'
1185
+ }, {
1186
+ theme: 'light',
1187
+ active: false,
1188
+ class: 'text-[rgba(12,28,51,0.35)]'
1189
+ }, {
1190
+ theme: 'dark',
1191
+ active: true,
1192
+ class: 'text-white'
1193
+ }, {
1194
+ theme: 'dark',
1195
+ active: false,
1196
+ class: 'text-gray-400'
1197
+ }],
1198
+ defaultVariants: {
1199
+ theme: 'light',
1200
+ active: false,
1201
+ size: 'xl'
1202
+ }
1203
+ });
1204
+ const tabsContentStyles = classVarianceAuthority.cva('', {
1205
+ variants: {
1206
+ theme: {
1207
+ light: '',
1208
+ dark: ''
1209
+ },
1210
+ size: {
1211
+ sm: 'mt-2',
1212
+ lg: 'mt-3',
1213
+ xl: 'mt-4'
1214
+ }
1215
+ },
1216
+ defaultVariants: {
1217
+ theme: 'light',
1218
+ size: 'xl'
1219
+ }
1220
+ });
1221
+ /**
1222
+ * React Native Tabs component with sleek underline style matching Figma design.
1223
+ * Features horizontal scrolling, light/dark theme support, and touch interactions.
1224
+ */
1225
+ const Tabs = ({
1226
+ items,
1227
+ value,
1228
+ defaultValue,
1229
+ onValueChange,
1230
+ size = 'xl',
1231
+ theme = 'light',
1232
+ className = '',
1233
+ listClassName = '',
1234
+ triggerClassName = '',
1235
+ contentClassName = '',
1236
+ style,
1237
+ listStyle,
1238
+ triggerStyle,
1239
+ contentStyle,
1240
+ textStyle
1241
+ }) => {
1242
+ var _a;
1243
+ const [internalValue, setInternalValue] = react.useState(defaultValue || ((_a = items[0]) === null || _a === void 0 ? void 0 : _a.value) || '');
1244
+ // Use controlled value if provided, otherwise use internal state
1245
+ const currentValue = value !== undefined ? value : internalValue;
1246
+ const handleValueChange = newValue => {
1247
+ if (value === undefined) {
1248
+ setInternalValue(newValue);
1249
+ }
1250
+ onValueChange === null || onValueChange === void 0 ? void 0 : onValueChange(newValue);
1251
+ };
1252
+ const rootClasses = tabsRootStyles({
1253
+ theme
1254
+ }) + (className ? ` ${className}` : '');
1255
+ const listClasses = tabsListStyles({
1256
+ theme
1257
+ }) + (listClassName ? ` ${listClassName}` : '');
1258
+ const contentClasses = tabsContentStyles({
1259
+ theme,
1260
+ size
1261
+ }) + (contentClassName ? ` ${contentClassName}` : '');
1262
+ const rootStyle = [cn(rootClasses), style].filter(Boolean);
1263
+ const listStyleCombined = [cn(listClasses), listStyle].filter(Boolean);
1264
+ const contentStyleCombined = [cn(contentClasses), contentStyle].filter(Boolean);
1265
+ // Border color based on theme
1266
+ const borderColor = theme === 'light' ? 'rgba(12, 28, 51, 0.15)' : 'rgba(156, 163, 175, 0.5)';
1267
+ const activeBorderColor = '#4C7EFF';
1268
+ return jsxRuntime.jsxs(reactNative.View, {
1269
+ style: rootStyle,
1270
+ children: [jsxRuntime.jsxs(reactNative.View, {
1271
+ style: {
1272
+ position: 'relative'
1273
+ },
1274
+ children: [jsxRuntime.jsx(reactNative.ScrollView, {
1275
+ horizontal: true,
1276
+ showsHorizontalScrollIndicator: false,
1277
+ style: listStyleCombined,
1278
+ contentContainerStyle: {
1279
+ flexDirection: 'row'
1280
+ },
1281
+ children: items.map(item => {
1282
+ const isActive = currentValue === item.value;
1283
+ const triggerClasses = tabsTriggerStyles({
1284
+ theme,
1285
+ active: isActive,
1286
+ size
1287
+ }) + (triggerClassName ? ` ${triggerClassName}` : '');
1288
+ const triggerStyleCombined = [cn(triggerClasses), triggerStyle].filter(Boolean);
1289
+ // Get text size based on size prop
1290
+ let fontSize = 24; // xl
1291
+ let lineHeight = 33; // xl (1.366)
1292
+ if (size === 'sm') {
1293
+ fontSize = 14;
1294
+ lineHeight = 18; // 1.25
1295
+ } else if (size === 'lg') {
1296
+ fontSize = 20;
1297
+ lineHeight = 26; // 1.3
1298
+ }
1299
+ // Text color based on theme and active state
1300
+ let textColor = 'rgba(12, 28, 51, 0.35)'; // light inactive
1301
+ if (theme === 'light' && isActive) {
1302
+ textColor = '#0C1C33'; // light active
1303
+ } else if (theme === 'dark' && isActive) {
1304
+ textColor = '#FFFFFF'; // dark active
1305
+ } else if (theme === 'dark' && !isActive) {
1306
+ textColor = 'rgba(156, 163, 175, 1)'; // dark inactive
1307
+ }
1308
+ const baseTextStyle = {
1309
+ fontSize,
1310
+ lineHeight,
1311
+ color: textColor,
1312
+ fontWeight: isActive ? '500' : '300'
1313
+ };
1314
+ const finalTextStyle = [baseTextStyle, textStyle].filter(Boolean);
1315
+ return jsxRuntime.jsxs(reactNative.TouchableOpacity, {
1316
+ disabled: item.disabled,
1317
+ onPress: () => !item.disabled && handleValueChange(item.value),
1318
+ activeOpacity: 0.8,
1319
+ style: triggerStyleCombined,
1320
+ children: [jsxRuntime.jsx(reactNative.Text, {
1321
+ style: finalTextStyle,
1322
+ children: item.label
1323
+ }), isActive && jsxRuntime.jsx(reactNative.View, {
1324
+ style: {
1325
+ position: 'absolute',
1326
+ bottom: 0,
1327
+ left: -4,
1328
+ right: size === 'sm' ? 12 : size === 'lg' ? 16 : 14,
1329
+ height: 1,
1330
+ backgroundColor: activeBorderColor,
1331
+ zIndex: 10
1332
+ }
1333
+ })]
1334
+ }, item.value);
1335
+ })
1336
+ }), jsxRuntime.jsx(reactNative.View, {
1337
+ style: {
1338
+ position: 'absolute',
1339
+ bottom: 0,
1340
+ left: 0,
1341
+ right: 0,
1342
+ height: 1,
1343
+ backgroundColor: borderColor
1344
+ }
1345
+ })]
1346
+ }), items.map(item => {
1347
+ if (currentValue !== item.value) return null;
1348
+ return jsxRuntime.jsx(reactNative.View, {
1349
+ style: contentStyleCombined,
1350
+ children: item.content
1351
+ }, item.value);
1352
+ })]
1353
+ });
1354
+ };
1355
+
1356
+ /**
1357
+ * Avatar component that creates unique identicons from usernames
1358
+ * with customizable appearance.
1359
+ *
1360
+ * This is the React Native version that uses SvgXml instead of img tag.
1361
+ */
1362
+ const Avatar = _a => {
1363
+ var {
1364
+ username,
1365
+ className = '',
1366
+ saturation = 50,
1367
+ lightness = 50,
1368
+ width = 40,
1369
+ height = 40,
1370
+ style
1371
+ } = _a,
1372
+ props = tslib.__rest(_a, ["username", "className", "saturation", "lightness", "width", "height", "style"]);
1373
+ // Generate SVG string directly (no data URI needed for SvgXml)
1374
+ const svgString = react.useMemo(() => minidenticons.minidenticon(username, saturation, lightness), [username, saturation, lightness]);
1375
+ const containerClasses = `relative ${className}`.trim();
1376
+ const containerStyle = [cn(containerClasses), style].filter(Boolean);
1377
+ return jsxRuntime.jsx(reactNative.View, Object.assign({
1378
+ style: containerStyle
1379
+ }, props, {
1380
+ children: jsxRuntime.jsx(Svg.SvgXml, {
1381
+ xml: svgString,
1382
+ width: width,
1383
+ height: height
1384
+ })
1385
+ }));
1386
+ };
1387
+
1388
+ // Base badge container styles
1389
+ const badgeStyles = classVarianceAuthority.cva('inline-flex items-center justify-center font-medium', {
1390
+ variants: {
1391
+ size: {
1392
+ xxs: 'px-1 py-1 text-xs rounded-full',
1393
+ xs: 'px-2 py-1 text-xs rounded-full',
1394
+ sm: 'px-[34px] py-[10px] text-xs rounded-full',
1395
+ xl: 'px-9 py-4 text-lg rounded-full'
1396
+ },
1397
+ borderRadius: {
1398
+ default: '',
1399
+ xs: 'rounded-[4px]'
1400
+ },
1401
+ // Color and variant combinations - blue
1402
+ color_variant_blue_default: {
1403
+ true: ''
1404
+ },
1405
+ color_variant_blue_flat: {
1406
+ true: 'bg-[rgba(76,126,255,0.15)]'
1407
+ },
1408
+ color_variant_blue_solid: {
1409
+ true: 'bg-[#4C7EFF]'
1410
+ },
1411
+ color_variant_blue_bordered: {
1412
+ true: 'border border-[#4C7EFF]'
1413
+ },
1414
+ // Color and variant combinations - white
1415
+ color_variant_white_default: {
1416
+ true: ''
1417
+ },
1418
+ color_variant_white_flat: {
1419
+ true: 'bg-[rgba(255,255,255,0.15)]'
1420
+ },
1421
+ color_variant_white_solid: {
1422
+ true: 'bg-white'
1423
+ },
1424
+ color_variant_white_bordered: {
1425
+ true: 'border border-white'
1426
+ },
1427
+ // Color and variant combinations - gray
1428
+ color_variant_gray_default: {
1429
+ true: ''
1430
+ },
1431
+ color_variant_gray_flat: {
1432
+ true: 'bg-[rgba(12,28,51,0.15)]'
1433
+ },
1434
+ color_variant_gray_solid: {
1435
+ true: 'bg-[#0C1C33]'
1436
+ },
1437
+ color_variant_gray_bordered: {
1438
+ true: 'border border-[#0C1C33]'
1439
+ },
1440
+ // Color and variant combinations - light-gray
1441
+ color_variant_lightgray_default: {
1442
+ true: ''
1443
+ },
1444
+ color_variant_lightgray_flat: {
1445
+ true: 'bg-[rgba(12,28,51,0.05)]'
1446
+ },
1447
+ color_variant_lightgray_solid: {
1448
+ true: 'bg-[rgba(12,28,51,0.15)]'
1449
+ },
1450
+ color_variant_lightgray_bordered: {
1451
+ true: 'border border-[#6B7280]'
1452
+ },
1453
+ // Color and variant combinations - turquoise
1454
+ color_variant_turquoise_default: {
1455
+ true: ''
1456
+ },
1457
+ color_variant_turquoise_flat: {
1458
+ true: 'bg-[rgba(96,246,210,0.15)]'
1459
+ },
1460
+ color_variant_turquoise_solid: {
1461
+ true: 'bg-[#60F6D2]'
1462
+ },
1463
+ color_variant_turquoise_bordered: {
1464
+ true: 'border border-[#60F6D2]'
1465
+ },
1466
+ // Color and variant combinations - red
1467
+ color_variant_red_default: {
1468
+ true: ''
1469
+ },
1470
+ color_variant_red_flat: {
1471
+ true: 'bg-[rgba(205,46,0,0.15)]'
1472
+ },
1473
+ color_variant_red_solid: {
1474
+ true: 'bg-[#CD2E00]'
1475
+ },
1476
+ color_variant_red_bordered: {
1477
+ true: 'border border-[#CD2E00]'
1478
+ },
1479
+ // Color and variant combinations - orange
1480
+ color_variant_orange_default: {
1481
+ true: ''
1482
+ },
1483
+ color_variant_orange_flat: {
1484
+ true: 'bg-[rgba(249,143,18,0.15)]'
1485
+ },
1486
+ color_variant_orange_solid: {
1487
+ true: 'bg-[#F98F12]'
1488
+ },
1489
+ color_variant_orange_bordered: {
1490
+ true: 'border border-[#F98F12]'
1491
+ }
1492
+ },
1493
+ defaultVariants: {
1494
+ size: 'sm',
1495
+ borderRadius: 'default'
1496
+ }
1497
+ });
1498
+ // Text color styles
1499
+ const textStyles = classVarianceAuthority.cva('font-medium', {
1500
+ variants: {
1501
+ size: {
1502
+ xxs: 'text-xs',
1503
+ xs: 'text-xs',
1504
+ sm: 'text-xs',
1505
+ xl: 'text-lg'
1506
+ },
1507
+ // Text colors for each color and variant combination
1508
+ color_variant_blue_default: {
1509
+ true: 'text-[#4C7EFF]'
1510
+ },
1511
+ color_variant_blue_flat: {
1512
+ true: 'text-[#4C7EFF]'
1513
+ },
1514
+ color_variant_blue_solid: {
1515
+ true: 'text-white'
1516
+ },
1517
+ color_variant_blue_bordered: {
1518
+ true: 'text-[#4C7EFF]'
1519
+ },
1520
+ color_variant_white_default: {
1521
+ true: 'text-white'
1522
+ },
1523
+ color_variant_white_flat: {
1524
+ true: 'text-white'
1525
+ },
1526
+ color_variant_white_solid: {
1527
+ true: 'text-[#0C1C33]'
1528
+ },
1529
+ color_variant_white_bordered: {
1530
+ true: 'text-white'
1531
+ },
1532
+ color_variant_gray_default: {
1533
+ true: 'text-[#0C1C33]'
1534
+ },
1535
+ color_variant_gray_flat: {
1536
+ true: 'text-[#0C1C33]'
1537
+ },
1538
+ color_variant_gray_solid: {
1539
+ true: 'text-white'
1540
+ },
1541
+ color_variant_gray_bordered: {
1542
+ true: 'text-[#0C1C33]'
1543
+ },
1544
+ color_variant_lightgray_default: {
1545
+ true: 'text-[#6B7280]'
1546
+ },
1547
+ color_variant_lightgray_flat: {
1548
+ true: 'text-[#0C1C33]'
1549
+ },
1550
+ color_variant_lightgray_solid: {
1551
+ true: 'text-[#0C1C33]'
1552
+ },
1553
+ color_variant_lightgray_bordered: {
1554
+ true: 'text-[#6B7280]'
1555
+ },
1556
+ color_variant_turquoise_default: {
1557
+ true: 'text-[#60F6D2]'
1558
+ },
1559
+ color_variant_turquoise_flat: {
1560
+ true: 'text-[#60F6D2]'
1561
+ },
1562
+ color_variant_turquoise_solid: {
1563
+ true: 'text-[#0C1C33]'
1564
+ },
1565
+ color_variant_turquoise_bordered: {
1566
+ true: 'text-[#60F6D2]'
1567
+ },
1568
+ color_variant_red_default: {
1569
+ true: 'text-[#CD2E00]'
1570
+ },
1571
+ color_variant_red_flat: {
1572
+ true: 'text-[#CD2E00]'
1573
+ },
1574
+ color_variant_red_solid: {
1575
+ true: 'text-white'
1576
+ },
1577
+ color_variant_red_bordered: {
1578
+ true: 'text-[#CD2E00]'
1579
+ },
1580
+ color_variant_orange_default: {
1581
+ true: 'text-[#F98F12]'
1582
+ },
1583
+ color_variant_orange_flat: {
1584
+ true: 'text-[#F98F12]'
1585
+ },
1586
+ color_variant_orange_solid: {
1587
+ true: 'text-white'
1588
+ },
1589
+ color_variant_orange_bordered: {
1590
+ true: 'text-[#F98F12]'
1591
+ }
1592
+ },
1593
+ defaultVariants: {
1594
+ size: 'sm'
1595
+ }
1596
+ });
1597
+ // Mapping object for color key normalization (handles dashes)
1598
+ const COLOR_KEY_MAP = {
1599
+ 'blue': 'blue',
1600
+ 'white': 'white',
1601
+ 'gray': 'gray',
1602
+ 'light-gray': 'lightgray',
1603
+ 'turquoise': 'turquoise',
1604
+ 'red': 'red',
1605
+ 'orange': 'orange'
1606
+ };
1607
+ /**
1608
+ * React Native Badge component with multiple variants, colors, sizes, and border radius options.
1609
+ * Uses CVA for variant management and twrnc for Tailwind styling.
1610
+ *
1611
+ * Supports 28 style combinations (7 colors × 4 variants) with 4 sizes and optional custom border radius.
1612
+ */
1613
+ const Badge = _a => {
1614
+ var _b;
1615
+ var {
1616
+ children,
1617
+ theme = 'light',
1618
+ variant = 'default',
1619
+ color,
1620
+ colorLight,
1621
+ colorDark,
1622
+ size = 'sm',
1623
+ borderRadius,
1624
+ className = '',
1625
+ style,
1626
+ textStyle,
1627
+ onPress
1628
+ } = _a,
1629
+ props = tslib.__rest(_a, ["children", "theme", "variant", "color", "colorLight", "colorDark", "size", "borderRadius", "className", "style", "textStyle", "onPress"]);
1630
+ const effectiveColor = (_b = resolveColorScheme(theme, color, colorLight, colorDark)) !== null && _b !== void 0 ? _b : 'blue';
1631
+ // Generate the color_variant key for CVA using explicit mapping
1632
+ const normalizedColor = COLOR_KEY_MAP[effectiveColor] || effectiveColor;
1633
+ const colorVariantKey = `color_variant_${normalizedColor}_${variant}`;
1634
+ // Build the badge container classes with proper typing
1635
+ const badgeVariantProps = {
1636
+ size,
1637
+ borderRadius: borderRadius || 'default',
1638
+ [colorVariantKey]: true
1639
+ };
1640
+ const badgeClasses = badgeStyles(badgeVariantProps);
1641
+ // Build the text classes with proper typing
1642
+ const textVariantProps = {
1643
+ size,
1644
+ [colorVariantKey]: true
1645
+ };
1646
+ const textClasses = textStyles(textVariantProps);
1647
+ // Convert Tailwind classes to React Native style objects
1648
+ const combinedClasses = className ? `${badgeClasses} ${className}` : badgeClasses;
1649
+ const badgeStyleArray = [cn(combinedClasses), style].filter(Boolean);
1650
+ const textStyleMerged = [cn(textClasses), textStyle].filter(Boolean);
1651
+ // Render content (string children wrapped in Text, custom content as-is)
1652
+ const content = typeof children === 'string' ? jsxRuntime.jsx(reactNative.Text, {
1653
+ style: textStyleMerged,
1654
+ children: children
1655
+ }) : children;
1656
+ // If onPress is provided, wrap in Pressable
1657
+ if (onPress) {
1658
+ return jsxRuntime.jsx(reactNative.Pressable, Object.assign({
1659
+ style: ({
1660
+ pressed
1661
+ }) => pressed ? [...badgeStyleArray, {
1662
+ opacity: 0.7
1663
+ }] : badgeStyleArray,
1664
+ onPress: onPress
1665
+ }, props, {
1666
+ children: content
1667
+ }));
1668
+ }
1669
+ // Otherwise, just render as View
1670
+ return jsxRuntime.jsx(reactNative.View, {
1671
+ style: badgeStyleArray,
1672
+ children: content
1673
+ });
1674
+ };
1675
+
1676
+ /**
1677
+ * Groups digits into chunks of three, right to left.
1678
+ * Used for formatting large numbers with thousand separators.
1679
+ */
1680
+ const groupDigits = intPart => {
1681
+ return intPart.split('').reverse().reduce((acc, char, idx) => {
1682
+ if (idx % 3 === 0) acc.unshift('');
1683
+ acc[0] = char + acc[0];
1684
+ return acc;
1685
+ }, []);
1686
+ };
1687
+ /**
1688
+ * Splits a numeric string into groups of three characters for display.
1689
+ * Supports two variants:
1690
+ * - `space`: groups separated by gap
1691
+ * - `comma`: groups separated by commas, with decimal part after `.`
1692
+ * Supports light/dark theme via dark: variants.
1693
+ */
1694
+ const BigNumber = ({
1695
+ children,
1696
+ variant = 'space',
1697
+ className = '',
1698
+ decimalPointSpacing = -2,
1699
+ style,
1700
+ textStyle
1701
+ }) => {
1702
+ const decimalPointStyle = {
1703
+ marginLeft: decimalPointSpacing,
1704
+ marginRight: decimalPointSpacing
1705
+ };
1706
+ if (children === undefined || children === null) return null;
1707
+ const str = children.toString();
1708
+ // Combine base styles with optional className
1709
+ const containerClasses = `flex-row flex-wrap gap-1 ${className || ''}`;
1710
+ const textClasses = 'dark:text-gray-100';
1711
+ const containerStyle = [cn(containerClasses), style].filter(Boolean);
1712
+ const textStyleMerged = [cn(textClasses), textStyle].filter(Boolean);
1713
+ if (variant === 'space') {
1714
+ // Split into integer and decimal parts
1715
+ const [intPart, fracPart] = str.split('.');
1716
+ // group digits every 3, right to left (only for integer part)
1717
+ const groups = groupDigits(intPart);
1718
+ return jsxRuntime.jsxs(reactNative.View, {
1719
+ style: containerStyle,
1720
+ children: [groups.map((grp, i) => jsxRuntime.jsx(reactNative.Text, {
1721
+ style: textStyleMerged,
1722
+ children: grp
1723
+ }, i)), fracPart != null && jsxRuntime.jsxs(jsxRuntime.Fragment, {
1724
+ children: [jsxRuntime.jsx(reactNative.Text, {
1725
+ style: [...textStyleMerged, decimalPointStyle],
1726
+ children: "."
1727
+ }), jsxRuntime.jsx(reactNative.Text, {
1728
+ style: textStyleMerged,
1729
+ children: fracPart
1730
+ })]
1731
+ })]
1732
+ });
1733
+ } else {
1734
+ // comma variant
1735
+ const [intPart, fracPart] = str.split('.');
1736
+ const groups = groupDigits(intPart);
1737
+ return jsxRuntime.jsxs(reactNative.View, {
1738
+ style: containerStyle,
1739
+ children: [groups.map((grp, i) => jsxRuntime.jsxs(reactNative.View, {
1740
+ style: cn('flex-row'),
1741
+ children: [jsxRuntime.jsx(reactNative.Text, {
1742
+ style: textStyleMerged,
1743
+ children: grp
1744
+ }), i < groups.length - 1 && jsxRuntime.jsx(reactNative.Text, {
1745
+ style: textStyleMerged,
1746
+ children: ","
1747
+ })]
1748
+ }, i)), fracPart != null && jsxRuntime.jsxs(jsxRuntime.Fragment, {
1749
+ children: [jsxRuntime.jsx(reactNative.Text, {
1750
+ style: [...textStyleMerged, decimalPointStyle],
1751
+ children: "."
1752
+ }), jsxRuntime.jsx(reactNative.Text, {
1753
+ style: textStyleMerged,
1754
+ children: fracPart
1755
+ })]
1756
+ })]
1757
+ });
1758
+ }
1759
+ };
1760
+
1761
+ /**
1762
+ * Universal Clipboard utility for React Native and Expo
1763
+ *
1764
+ * Supports both:
1765
+ * - @react-native-clipboard/clipboard (React Native)
1766
+ * - expo-clipboard (Expo)
1767
+ *
1768
+ * Automatically detects which one is available and uses it.
1769
+ */
1770
+ let clipboardInstance = null;
1771
+ /**
1772
+ * Get the clipboard instance
1773
+ * Tries to load expo-clipboard first, then falls back to @react-native-clipboard/clipboard
1774
+ */
1775
+ function getClipboard() {
1776
+ if (clipboardInstance) {
1777
+ return clipboardInstance;
1778
+ }
1779
+ try {
1780
+ // Try expo-clipboard first (most common in Expo projects)
1781
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
1782
+ const ExpoClipboard = require('expo-clipboard');
1783
+ if ((ExpoClipboard === null || ExpoClipboard === void 0 ? void 0 : ExpoClipboard.setStringAsync) && (ExpoClipboard === null || ExpoClipboard === void 0 ? void 0 : ExpoClipboard.getStringAsync)) {
1784
+ clipboardInstance = {
1785
+ setString: text => {
1786
+ ExpoClipboard.setStringAsync(text).catch(err => {
1787
+ console.warn('[dash-ui-kit] Failed to copy to clipboard:', err);
1788
+ });
1789
+ },
1790
+ getString: () => ExpoClipboard.getStringAsync()
1791
+ };
1792
+ return clipboardInstance;
1793
+ }
1794
+ } catch (err) {
1795
+ // expo-clipboard not available, continue to try React Native clipboard
1796
+ }
1797
+ try {
1798
+ // Try @react-native-clipboard/clipboard (React Native)
1799
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
1800
+ const RNClipboard = require('@react-native-clipboard/clipboard');
1801
+ if ((RNClipboard === null || RNClipboard === void 0 ? void 0 : RNClipboard.default) || (RNClipboard === null || RNClipboard === void 0 ? void 0 : RNClipboard.Clipboard)) {
1802
+ const clipboard = RNClipboard.default || RNClipboard.Clipboard;
1803
+ clipboardInstance = {
1804
+ setString: text => clipboard.setString(text),
1805
+ getString: () => clipboard.getString()
1806
+ };
1807
+ return clipboardInstance;
1808
+ }
1809
+ } catch (err) {
1810
+ // @react-native-clipboard/clipboard not available
1811
+ }
1812
+ // No clipboard available - return stub
1813
+ console.warn('[dash-ui-kit] No clipboard library found. Please install either:\n' + ' - expo-clipboard (for Expo projects): npx expo install expo-clipboard\n' + ' - @react-native-clipboard/clipboard (for React Native): npm install @react-native-clipboard/clipboard');
1814
+ clipboardInstance = {
1815
+ setString: () => {
1816
+ console.warn('[dash-ui-kit] Clipboard not available');
1817
+ },
1818
+ getString: async () => ''
1819
+ };
1820
+ return clipboardInstance;
1821
+ }
1822
+ /**
1823
+ * Universal Clipboard object
1824
+ * Compatible with both expo-clipboard and @react-native-clipboard/clipboard
1825
+ */
1826
+ const Clipboard = {
1827
+ /**
1828
+ * Set string to clipboard
1829
+ * @param text - Text to copy
1830
+ */
1831
+ setString: text => {
1832
+ const clipboard = getClipboard();
1833
+ clipboard.setString(text);
1834
+ },
1835
+ /**
1836
+ * Get string from clipboard
1837
+ * @returns Promise with clipboard content
1838
+ */
1839
+ getString: () => {
1840
+ const clipboard = getClipboard();
1841
+ return clipboard.getString();
1842
+ }
1843
+ };
1844
+
1845
+ const FEEDBACK_DURATION_MS = 1000;
1846
+ /**
1847
+ * React Native CopyButton component. Copies text to clipboard on press
1848
+ * and shows "Copied!" feedback briefly.
1849
+ */
1850
+ const CopyButton = ({
1851
+ text,
1852
+ onCopy,
1853
+ className = '',
1854
+ style,
1855
+ textStyle,
1856
+ accessibilityLabel = 'Copy to clipboard'
1857
+ }) => {
1858
+ const [copied, setCopied] = react.useState(false);
1859
+ const timeoutRef = react.useRef(null);
1860
+ const handlePress = react.useCallback(() => {
1861
+ Clipboard.setString(text);
1862
+ setCopied(true);
1863
+ onCopy === null || onCopy === void 0 ? void 0 : onCopy(true);
1864
+ if (timeoutRef.current) clearTimeout(timeoutRef.current);
1865
+ timeoutRef.current = setTimeout(() => setCopied(false), FEEDBACK_DURATION_MS);
1866
+ }, [text, onCopy]);
1867
+ react.useEffect(() => {
1868
+ return () => {
1869
+ if (timeoutRef.current) clearTimeout(timeoutRef.current);
1870
+ };
1871
+ }, []);
1872
+ const buttonClasses = `p-0 flex-shrink-0 min-w-0 bg-transparent ${className}`.trim();
1873
+ const buttonStyle = [cn(buttonClasses), style].filter(Boolean);
1874
+ const copiedTextClasses = 'text-xs text-dash-brand font-medium';
1875
+ const copiedTextStyle = [cn(copiedTextClasses), textStyle].filter(Boolean);
1876
+ return jsxRuntime.jsx(reactNative.Pressable, {
1877
+ onPress: handlePress,
1878
+ style: ({
1879
+ pressed
1880
+ }) => [buttonStyle, pressed && {
1881
+ opacity: 0.7
1882
+ }].filter(Boolean),
1883
+ accessibilityLabel: accessibilityLabel,
1884
+ accessibilityRole: "button",
1885
+ children: copied ? jsxRuntime.jsx(reactNative.View, {
1886
+ style: cn('items-center justify-center min-w-4 min-h-4'),
1887
+ children: jsxRuntime.jsx(reactNative.Text, {
1888
+ style: copiedTextStyle,
1889
+ children: "Copied!"
1890
+ })
1891
+ }) : jsxRuntime.jsx(CopyIcon, {
1892
+ color: "#0C1C33",
1893
+ size: 16
1894
+ })
1895
+ });
1896
+ };
1897
+
1898
+ /**
1899
+ * NotActive component for React Native
1900
+ * Shows "n/a" text with theme-aware styling
1901
+ */
1902
+ function NotActive(_a) {
1903
+ var {
1904
+ children,
1905
+ className = '',
1906
+ theme = 'light',
1907
+ style
1908
+ } = _a,
1909
+ props = tslib.__rest(_a, ["children", "className", "theme", "style"]);
1910
+ const themeColor = theme === 'dark' ? 'text-gray-500' : 'text-gray-400';
1911
+ const textClasses = `text-sm ${themeColor} ${className}`.trim();
1912
+ return jsxRuntime.jsx(reactNative.Text, Object.assign({
1913
+ style: [cn(textClasses), style].filter(Boolean)
1914
+ }, props, {
1915
+ children: children !== null && children !== void 0 ? children : 'n/a'
1916
+ }));
1917
+ }
1918
+
1919
+ /** CVA for the root container with light/dark theme */
1920
+ const identifier = classVarianceAuthority.cva('flex flex-row items-center font-dash-grotesque text-sm font-normal', {
1921
+ variants: {
1922
+ theme: {
1923
+ light: 'text-gray-900',
1924
+ dark: 'text-white'
1925
+ },
1926
+ ellipsis: {
1927
+ false: '',
1928
+ true: 'overflow-hidden'
1929
+ },
1930
+ highlight: {
1931
+ default: '',
1932
+ dim: '',
1933
+ highlight: '',
1934
+ first: '',
1935
+ last: '',
1936
+ both: ''
1937
+ }
1938
+ },
1939
+ defaultVariants: {
1940
+ theme: 'light',
1941
+ ellipsis: false,
1942
+ highlight: 'default'
1943
+ }
1944
+ });
1945
+ /** CVA for each symbol text: inherits root color or dims */
1946
+ const symbol = classVarianceAuthority.cva('flex-1', {
1947
+ variants: {
1948
+ dim: {
1949
+ false: '',
1950
+ true: 'opacity-50'
1951
+ }
1952
+ },
1953
+ defaultVariants: {
1954
+ dim: false
1955
+ }
1956
+ });
1957
+ /** Highlight modes configuration */
1958
+ const highlightModes = {
1959
+ default: {
1960
+ first: true,
1961
+ middle: false,
1962
+ last: true
1963
+ },
1964
+ dim: {
1965
+ first: false,
1966
+ middle: false,
1967
+ last: false
1968
+ },
1969
+ highlight: {
1970
+ first: true,
1971
+ middle: true,
1972
+ last: true
1973
+ },
1974
+ first: {
1975
+ first: true,
1976
+ middle: false,
1977
+ last: false
1978
+ },
1979
+ last: {
1980
+ first: false,
1981
+ middle: false,
1982
+ last: true
1983
+ },
1984
+ both: {
1985
+ first: true,
1986
+ middle: false,
1987
+ last: true
1988
+ }
1989
+ };
1990
+ /**
1991
+ * HighlightedID subcomponent
1992
+ * Renders text with highlighting based on mode
1993
+ */
1994
+ const HighlightedID = ({
1995
+ children,
1996
+ mode,
1997
+ theme = 'light',
1998
+ textStyle
1999
+ }) => {
2000
+ if (children == null || children === '') return jsxRuntime.jsx(NotActive, {
2001
+ theme: theme
2002
+ });
2003
+ const text = String(children);
2004
+ const cfg = highlightModes[mode];
2005
+ const count = 5;
2006
+ const minLength = count * 2 + 1; // 11
2007
+ if (text.length < minLength) {
2008
+ const symbolStyle = [cn(symbol({
2009
+ dim: cfg.middle
2010
+ })), textStyle].filter(Boolean);
2011
+ return jsxRuntime.jsx(reactNative.Text, {
2012
+ style: symbolStyle,
2013
+ children: text
2014
+ });
2015
+ }
2016
+ const first = text.slice(0, count);
2017
+ const middle = text.slice(count, text.length - count);
2018
+ const last = text.slice(-5);
2019
+ const firstStyle = [cn(symbol({
2020
+ dim: !cfg.first
2021
+ })), textStyle].filter(Boolean);
2022
+ const middleStyle = [cn(symbol({
2023
+ dim: !cfg.middle
2024
+ })), textStyle].filter(Boolean);
2025
+ const lastStyle = [cn(symbol({
2026
+ dim: !cfg.last
2027
+ })), textStyle].filter(Boolean);
2028
+ return jsxRuntime.jsxs(reactNative.Text, {
2029
+ children: [jsxRuntime.jsx(reactNative.Text, {
2030
+ style: firstStyle,
2031
+ children: first
2032
+ }), jsxRuntime.jsx(reactNative.Text, {
2033
+ style: middleStyle,
2034
+ children: middle
2035
+ }), jsxRuntime.jsx(reactNative.Text, {
2036
+ style: lastStyle,
2037
+ children: last
2038
+ })]
2039
+ });
2040
+ };
2041
+ /**
2042
+ * MiddleEllipsisText subcomponent
2043
+ * Renders text with ellipsis in the middle
2044
+ */
2045
+ const MiddleEllipsisText = ({
2046
+ children,
2047
+ edgeChars,
2048
+ theme = 'light',
2049
+ textStyle
2050
+ }) => {
2051
+ if (children == null || children === '') return jsxRuntime.jsx(NotActive, {
2052
+ theme: theme
2053
+ });
2054
+ const text = String(children);
2055
+ if (text.length <= edgeChars * 2) {
2056
+ const style = textStyle ? [textStyle] : undefined;
2057
+ return jsxRuntime.jsx(reactNative.Text, {
2058
+ style: style,
2059
+ children: text
2060
+ });
2061
+ }
2062
+ const first = text.slice(0, edgeChars);
2063
+ const last = text.slice(-edgeChars);
2064
+ const ellipsisStyle = [cn('opacity-50'), textStyle].filter(Boolean);
2065
+ return jsxRuntime.jsxs(reactNative.Text, {
2066
+ children: [jsxRuntime.jsx(reactNative.Text, {
2067
+ style: textStyle,
2068
+ children: first
2069
+ }), jsxRuntime.jsx(reactNative.Text, {
2070
+ style: ellipsisStyle,
2071
+ children: "\u2026"
2072
+ }), jsxRuntime.jsx(reactNative.Text, {
2073
+ style: textStyle,
2074
+ children: last
2075
+ })]
2076
+ });
2077
+ };
2078
+ /**
2079
+ * Identifier component for React Native
2080
+ * Shows an ID string with optional highlighting, avatar, copy button, and ellipsis modes.
2081
+ *
2082
+ * Features:
2083
+ * - Highlight modes: default, dim, highlight, first, last, both
2084
+ * - Ellipsis modes: standard (tail), middle, maxLines
2085
+ * - Avatar integration
2086
+ * - Copy button integration
2087
+ * - Theme support (light/dark)
2088
+ *
2089
+ * @example
2090
+ * ```tsx
2091
+ * <Identifier highlight="both">0x1234567890abcdef</Identifier>
2092
+ * <Identifier avatar copyButton>alice@example.com</Identifier>
2093
+ * <Identifier middleEllipsis edgeChars={6}>very-long-identifier</Identifier>
2094
+ * <Identifier maxLines={2}>Multi-line\nidentifier\ntext</Identifier>
2095
+ * ```
2096
+ */
2097
+ const Identifier = _a => {
2098
+ var {
2099
+ children,
2100
+ ellipsis = false,
2101
+ highlight = undefined,
2102
+ avatar = false,
2103
+ copyButton = false,
2104
+ maxLines = 0,
2105
+ className = '',
2106
+ middleEllipsis = false,
2107
+ edgeChars = 4,
2108
+ theme = 'light',
2109
+ style,
2110
+ textStyle
2111
+ } = _a,
2112
+ props = tslib.__rest(_a, ["children", "ellipsis", "highlight", "avatar", "copyButton", "maxLines", "className", "middleEllipsis", "edgeChars", "theme", "style", "textStyle"]);
2113
+ const [containerWidth, setContainerWidth] = react.useState(0);
2114
+ // Handle container layout changes
2115
+ const handleLayout = react.useCallback(event => {
2116
+ const {
2117
+ width
2118
+ } = event.nativeEvent.layout;
2119
+ setContainerWidth(width);
2120
+ }, []);
2121
+ const rootClasses = `${identifier({
2122
+ theme: theme,
2123
+ ellipsis,
2124
+ highlight
2125
+ })} ${className}`.trim();
2126
+ // Determine if we should use standard ellipsis with numberOfLines
2127
+ const useStandardEllipsis = ellipsis === true && !middleEllipsis && maxLines === 0;
2128
+ const useMaxLines = maxLines > 0 && !middleEllipsis;
2129
+ // Symbol container classes
2130
+ const symbolContainerClass = ellipsis === true ? 'flex-1 overflow-hidden' : 'flex-1';
2131
+ // Merge text styles
2132
+ const finalTextStyle = [cn('leading-4'), textStyle].filter(Boolean);
2133
+ return jsxRuntime.jsxs(reactNative.View, Object.assign({
2134
+ style: [cn(rootClasses), style].filter(Boolean),
2135
+ onLayout: handleLayout
2136
+ }, props, {
2137
+ children: [avatar && children != null && children !== '' && jsxRuntime.jsx(Avatar, {
2138
+ username: children,
2139
+ className: "mr-2",
2140
+ width: 24,
2141
+ height: 24
2142
+ }), jsxRuntime.jsx(reactNative.View, {
2143
+ style: cn(symbolContainerClass),
2144
+ children: children != null && children !== '' && middleEllipsis ? jsxRuntime.jsx(MiddleEllipsisText, {
2145
+ edgeChars: edgeChars,
2146
+ theme: theme,
2147
+ textStyle: textStyle,
2148
+ children: children
2149
+ }) : children != null && children !== '' && highlight != null ? jsxRuntime.jsx(HighlightedID, {
2150
+ mode: highlight,
2151
+ theme: theme,
2152
+ textStyle: textStyle,
2153
+ children: children
2154
+ }) : children != null && children !== '' ? jsxRuntime.jsx(reactNative.Text, {
2155
+ numberOfLines: useStandardEllipsis ? 1 : useMaxLines ? maxLines : undefined,
2156
+ ellipsizeMode: useStandardEllipsis || useMaxLines ? 'tail' : undefined,
2157
+ style: finalTextStyle,
2158
+ children: children
2159
+ }) : jsxRuntime.jsx(NotActive, {
2160
+ theme: theme
2161
+ })
2162
+ }), copyButton && children != null && children !== '' && jsxRuntime.jsx(CopyButton, {
2163
+ className: "ml-3",
2164
+ text: children
2165
+ })]
2166
+ }));
2167
+ };
2168
+
2169
+ /**
2170
+ * ValueCard CVA - twrnc-compatible classes.
2171
+ * dash-block-sm/md/xl expanded: px-3 py-2 rounded-[10px], px-[18px] py-3 rounded-[14px], px-[25px] py-5 rounded-[16px]
2172
+ * hover: classes omitted (RN uses Pressable opacity for press feedback)
2173
+ */
2174
+ const valueCardStyles = classVarianceAuthority.cva('flex flex-row items-center', {
2175
+ variants: {
2176
+ theme: {
2177
+ light: 'border-gray-200',
2178
+ dark: 'bg-gray-800/50 border-gray-400'
2179
+ },
2180
+ colorScheme: {
2181
+ default: '',
2182
+ transparent: 'bg-transparent',
2183
+ green: 'text-green-500 bg-green-200 border-green-400',
2184
+ lightBlue: 'bg-[rgba(150,167,255,0.1)] border-[rgba(76,126,255,0.2)]',
2185
+ white: 'bg-white',
2186
+ lightGray: 'bg-[#0c1c3308]',
2187
+ yellow: 'bg-dash-yellow-light border-dash-yellow'
2188
+ },
2189
+ size: {
2190
+ xs: 'px-2 py-1 rounded',
2191
+ sm: 'px-3 py-2 rounded-[10px]',
2192
+ md: 'px-[18px] py-3 rounded-[14px]',
2193
+ xl: 'px-[25px] py-5 rounded-[16px]'
2194
+ },
2195
+ clickable: {
2196
+ false: '',
2197
+ true: ''
2198
+ },
2199
+ loading: {
2200
+ false: '',
2201
+ true: 'opacity-70'
2202
+ },
2203
+ border: {
2204
+ false: 'border-0',
2205
+ true: 'border'
2206
+ }
2207
+ },
2208
+ defaultVariants: {
2209
+ theme: 'light',
2210
+ colorScheme: 'default',
2211
+ size: 'md',
2212
+ clickable: false,
2213
+ loading: false,
2214
+ border: true
2215
+ }
2216
+ });
2217
+ /**
2218
+ * React Native ValueCard - card container with theme, color schemes, sizes,
2219
+ * clickability, loading state, and optional border.
2220
+ */
2221
+ const ValueCard = _a => {
2222
+ var _b;
2223
+ var {
2224
+ theme = 'light',
2225
+ colorScheme,
2226
+ colorSchemeLight,
2227
+ colorSchemeDark,
2228
+ size = 'md',
2229
+ clickable = false,
2230
+ loading = false,
2231
+ border = true,
2232
+ className = '',
2233
+ style,
2234
+ children,
2235
+ onPress
2236
+ } = _a,
2237
+ props = tslib.__rest(_a, ["theme", "colorScheme", "colorSchemeLight", "colorSchemeDark", "size", "clickable", "loading", "border", "className", "style", "children", "onPress"]);
2238
+ const isClickable = Boolean(onPress !== null && onPress !== void 0 ? onPress : clickable);
2239
+ const isDisabled = loading;
2240
+ const effectiveColorScheme = (_b = resolveColorScheme(theme, colorScheme, colorSchemeLight, colorSchemeDark)) !== null && _b !== void 0 ? _b : 'default';
2241
+ const classes = valueCardStyles({
2242
+ theme,
2243
+ colorScheme: effectiveColorScheme,
2244
+ size,
2245
+ clickable: isClickable,
2246
+ loading,
2247
+ border
2248
+ });
2249
+ const combinedClasses = className ? `${classes} ${className}` : classes;
2250
+ const containerStyle = [cn(combinedClasses), style].filter(Boolean);
2251
+ const content = loading ? jsxRuntime.jsx(reactNative.ActivityIndicator, {
2252
+ testID: "value-card-loading",
2253
+ size: "small",
2254
+ color: effectiveColorScheme === 'green' ? '#22c55e' : effectiveColorScheme === 'lightBlue' ? '#4C7EFF' : '#6B7280'
2255
+ }) : children;
2256
+ if (isClickable && !isDisabled) {
2257
+ return jsxRuntime.jsx(reactNative.Pressable, Object.assign({
2258
+ style: ({
2259
+ pressed
2260
+ }) => [...containerStyle, pressed && {
2261
+ opacity: 0.9
2262
+ }],
2263
+ onPress: onPress,
2264
+ disabled: isDisabled
2265
+ }, props, {
2266
+ children: content
2267
+ }));
2268
+ }
2269
+ return jsxRuntime.jsx(reactNative.View, Object.assign({
2270
+ style: containerStyle
2271
+ }, props, {
2272
+ children: content
2273
+ }));
2274
+ };
2275
+
2276
+ /**
2277
+ * Dash Logo component for React Native with customizable size and color
2278
+ * Original aspect ratio: 30:25 (1.2:1)
2279
+ *
2280
+ * Color can be set via:
2281
+ * - color prop (default: #4C7EFF)
2282
+ *
2283
+ * Container supports:
2284
+ * - containerPadding: padding around the logo
2285
+ * - containerSize: width/height of the container
2286
+ * - containerClassName: Tailwind classes for the container
2287
+ * - containerStyle: Additional style object for the container
2288
+ */
2289
+ const DashLogo = ({
2290
+ color = '#4C7EFF',
2291
+ size,
2292
+ width,
2293
+ height,
2294
+ className = '',
2295
+ onPress,
2296
+ containerPadding,
2297
+ containerSize,
2298
+ containerClassName = '',
2299
+ containerStyle
2300
+ }) => {
2301
+ const logoWidth = width || size || 30;
2302
+ const logoHeight = height || (size ? size * 25 / 30 : 25);
2303
+ const baseContainerClasses = 'flex justify-center items-center';
2304
+ const containerClasses = containerClassName ? `${baseContainerClasses} ${containerClassName}` : baseContainerClasses;
2305
+ const inlineContainerStyle = Object.assign({
2306
+ padding: containerPadding,
2307
+ width: containerSize,
2308
+ height: containerSize
2309
+ }, containerStyle);
2310
+ const combinedContainerStyle = [cn(containerClasses), inlineContainerStyle].filter(Boolean);
2311
+ const logoElement = jsxRuntime.jsxs(Svg, {
2312
+ width: logoWidth,
2313
+ height: logoHeight,
2314
+ viewBox: '0 0 30 25',
2315
+ fill: 'none',
2316
+ children: [jsxRuntime.jsx(Svg.Path, {
2317
+ d: 'M19.6465 0C29.2466 2.13767e-05 30.9542 5.2464 29.585 12.6006C28.6773 17.5547 26.3845 21.3391 22.5537 23.1084C20.8153 23.9084 19.1848 24.3555 15.3389 24.3555H4.44629L5.33887 19.293H14.9229C20.6921 19.3084 22.2159 16.8009 22.9697 14.6162C23.2467 13.8008 23.9084 11.2619 23.9238 9.76953C23.9699 6.84642 22.5383 5.07715 17.6768 5.07715L7.81543 5.06152L8.72363 0H19.6465Z',
2318
+ fill: color
2319
+ }), jsxRuntime.jsx(Svg.Path, {
2320
+ d: 'M15.2002 9.63184C15.2002 9.63184 15.0775 10.232 14.7236 11.709C14.4621 12.8321 14.0462 14.6934 11.1846 14.6934H0C0.00327153 14.6775 0.12745 14.0734 0.476562 12.6162C0.73811 11.493 1.15435 9.63184 4.01562 9.63184H15.2002Z',
2321
+ fill: color
2322
+ })]
2323
+ });
2324
+ if (onPress) {
2325
+ return jsxRuntime.jsx(reactNative.Pressable, {
2326
+ style: combinedContainerStyle,
2327
+ onPress: onPress,
2328
+ children: logoElement
2329
+ });
2330
+ }
2331
+ return jsxRuntime.jsx(reactNative.View, {
2332
+ style: combinedContainerStyle,
2333
+ children: logoElement
2334
+ });
2335
+ };
2336
+
2337
+ const defaultColors = {
2338
+ light: {
2339
+ SUCCESS: '#1CC400',
2340
+ FAIL: '#F45858',
2341
+ QUEUED: '#F4A358',
2342
+ POOLED: '#008DE4',
2343
+ BROADCASTED: '#008DE4'
2344
+ },
2345
+ dark: {
2346
+ SUCCESS: '#22D32E',
2347
+ FAIL: '#FF6B6B',
2348
+ QUEUED: '#FFB366',
2349
+ POOLED: '#42A5F5',
2350
+ BROADCASTED: '#42A5F5'
2351
+ }
2352
+ };
2353
+ const iconMap = {
2354
+ SUCCESS: SuccessIcon,
2355
+ FAIL: ErrorIcon,
2356
+ QUEUED: QueuedIcon,
2357
+ POOLED: PooledIcon,
2358
+ BROADCASTED: BroadcastedIcon
2359
+ };
2360
+ /**
2361
+ * Renders an icon corresponding to the given `status`.
2362
+ * If `status` is not recognized, returns null.
2363
+ * Colors adapt to light/dark theme unless overridden.
2364
+ */
2365
+ const TransactionStatusIcon = _a => {
2366
+ var {
2367
+ status,
2368
+ color,
2369
+ theme = 'light'
2370
+ } = _a,
2371
+ props = tslib.__rest(_a, ["status", "color", "theme"]);
2372
+ const IconComponent = iconMap[status];
2373
+ if (IconComponent == null) return null;
2374
+ const iconColor = color !== null && color !== void 0 ? color : defaultColors[theme][status];
2375
+ return jsxRuntime.jsx(IconComponent, Object.assign({
2376
+ color: iconColor
2377
+ }, props));
2378
+ };
2379
+
2380
+ /**
2381
+ * Hook for debouncing values with extended functionality
2382
+ * React Native compatible version
2383
+ *
2384
+ * @param value - Value to debounce
2385
+ * @param options - Configuration options
2386
+ * @returns Object with debounced value and control methods
2387
+ */
2388
+ const useDebounce = (value, options) => {
2389
+ // Backward compatibility support - if number is passed, it's delay
2390
+ const config = typeof options === 'number' ? {
2391
+ delay: options
2392
+ } : options;
2393
+ const {
2394
+ delay,
2395
+ callback,
2396
+ immediate = false
2397
+ } = config;
2398
+ const [debouncedValue, setDebouncedValue] = react.useState(value);
2399
+ const [isPending, setIsPending] = react.useState(false);
2400
+ const timeoutRef = react.useRef(null);
2401
+ const isFirstRun = react.useRef(true);
2402
+ const cancel = react.useCallback(() => {
2403
+ if (timeoutRef.current) {
2404
+ clearTimeout(timeoutRef.current);
2405
+ timeoutRef.current = null;
2406
+ setIsPending(false);
2407
+ }
2408
+ }, []);
2409
+ const flush = react.useCallback(() => {
2410
+ cancel();
2411
+ setDebouncedValue(value);
2412
+ callback === null || callback === void 0 ? void 0 : callback(value);
2413
+ setIsPending(false);
2414
+ }, [value, callback, cancel]);
2415
+ react.useEffect(() => {
2416
+ // If immediate === true and this is first run, set value immediately
2417
+ if (immediate && isFirstRun.current) {
2418
+ setDebouncedValue(value);
2419
+ callback === null || callback === void 0 ? void 0 : callback(value);
2420
+ isFirstRun.current = false;
2421
+ return;
2422
+ }
2423
+ isFirstRun.current = false;
2424
+ setIsPending(true);
2425
+ const handler = setTimeout(() => {
2426
+ setDebouncedValue(value);
2427
+ callback === null || callback === void 0 ? void 0 : callback(value);
2428
+ setIsPending(false);
2429
+ timeoutRef.current = null;
2430
+ }, delay);
2431
+ timeoutRef.current = handler;
2432
+ return () => {
2433
+ clearTimeout(handler);
2434
+ setIsPending(false);
2435
+ };
2436
+ }, [value, delay, callback, immediate]);
2437
+ // Cleanup on unmount
2438
+ react.useEffect(() => {
2439
+ return () => {
2440
+ if (timeoutRef.current) {
2441
+ clearTimeout(timeoutRef.current);
2442
+ }
2443
+ };
2444
+ }, []);
2445
+ return {
2446
+ debouncedValue,
2447
+ flush,
2448
+ cancel,
2449
+ isPending
2450
+ };
2451
+ };
2452
+
2453
+ /**
2454
+ * Design tokens for React Native
2455
+ *
2456
+ * These tokens are derived from the web theme (src/styles/theme.pcss)
2457
+ * and optimized for React Native StyleSheet usage.
2458
+ *
2459
+ * @example
2460
+ * ```typescript
2461
+ * import { colors, spacing, typography, borderRadius, shadows } from 'dash-ui-kit/react-native';
2462
+ * import { StyleSheet, Platform } from 'react-native';
2463
+ *
2464
+ * const styles = StyleSheet.create({
2465
+ * container: {
2466
+ * backgroundColor: colors.brand,
2467
+ * padding: spacing[4],
2468
+ * borderRadius: borderRadius.md,
2469
+ * ...Platform.select({
2470
+ * ios: shadows.md.ios,
2471
+ * android: shadows.md.android,
2472
+ * }),
2473
+ * },
2474
+ * title: {
2475
+ * fontSize: typography.fontSize.xl,
2476
+ * fontWeight: typography.fontWeight.semibold,
2477
+ * lineHeight: typography.lineHeight.xl,
2478
+ * },
2479
+ * });
2480
+ * ```
2481
+ */
2482
+ /**
2483
+ * Color palette
2484
+ * Derived from theme.pcss color variables
2485
+ */
2486
+ const colors = {
2487
+ // Brand colors
2488
+ brand: '#4C7EFF',
2489
+ brandDim: '#96A7FF',
2490
+ brandDark: '#4D5895',
2491
+ brandDarkness: '#13172A',
2492
+ // Accent colors
2493
+ mint: '#60F6D2',
2494
+ mintHover: '#4DD4B1',
2495
+ // Yellow variants
2496
+ yellowLight: '#fef3c7',
2497
+ yellow: '#fde68a',
2498
+ // Primary colors
2499
+ primaryDarkBlue: '#0C1C33',
2500
+ primaryDieSubdued: 'rgba(12, 28, 51, 0.03)',
2501
+ // State colors - Green
2502
+ green: '#40BF40',
2503
+ green75: 'rgba(64, 191, 64, 0.75)',
2504
+ green15: 'rgba(64, 191, 64, 0.15)',
2505
+ green5: 'rgba(64, 191, 64, 0.05)',
2506
+ // State colors - Red
2507
+ red: '#CD2E00',
2508
+ red75: 'rgba(205, 46, 0, 0.75)',
2509
+ red15: 'rgba(205, 46, 0, 0.15)',
2510
+ red5: 'rgba(205, 46, 0, 0.05)',
2511
+ // State colors - Orange
2512
+ orange: '#F98F12',
2513
+ orange75: 'rgba(249, 143, 18, 0.75)',
2514
+ orange15: 'rgba(249, 143, 18, 0.15)',
2515
+ orange5: 'rgba(249, 143, 18, 0.05)',
2516
+ // Common colors
2517
+ white: '#FFFFFF',
2518
+ black: '#000000',
2519
+ transparent: 'transparent'
2520
+ };
2521
+ /**
2522
+ * Spacing scale
2523
+ * Based on 4px base unit (Tailwind-compatible)
2524
+ */
2525
+ const spacing = {
2526
+ 0: 0,
2527
+ 1: 4,
2528
+ 2: 8,
2529
+ 3: 12,
2530
+ 4: 16,
2531
+ 5: 20,
2532
+ 6: 24,
2533
+ 7: 28,
2534
+ 8: 32,
2535
+ 9: 36,
2536
+ 10: 40,
2537
+ 11: 44,
2538
+ // 2.75rem from theme
2539
+ 12: 48,
2540
+ 14: 56,
2541
+ 16: 64,
2542
+ 18: 72,
2543
+ 20: 80,
2544
+ 24: 96,
2545
+ 28: 112,
2546
+ 32: 128,
2547
+ 36: 144,
2548
+ 40: 160,
2549
+ 44: 176,
2550
+ 48: 192,
2551
+ 52: 208,
2552
+ 56: 224,
2553
+ 60: 240,
2554
+ 64: 256
2555
+ };
2556
+ /**
2557
+ * Typography scale
2558
+ * Font sizes, weights, and line heights
2559
+ */
2560
+ const typography = {
2561
+ /**
2562
+ * Font size scale
2563
+ */
2564
+ fontSize: {
2565
+ xs: 12,
2566
+ sm: 14,
2567
+ base: 16,
2568
+ lg: 18,
2569
+ xl: 20,
2570
+ '2xl': 24,
2571
+ '3xl': 30,
2572
+ '4xl': 36,
2573
+ '5xl': 48,
2574
+ '6xl': 60,
2575
+ '7xl': 72,
2576
+ '8xl': 96,
2577
+ '9xl': 128
2578
+ },
2579
+ /**
2580
+ * Font weight scale
2581
+ * Values are strings for React Native compatibility
2582
+ */
2583
+ fontWeight: {
2584
+ normal: '400',
2585
+ medium: '500',
2586
+ semibold: '600',
2587
+ bold: '700',
2588
+ extrabold: '800'
2589
+ },
2590
+ /**
2591
+ * Line height scale (in pixels)
2592
+ * Calculated based on common typography ratios
2593
+ */
2594
+ lineHeight: {
2595
+ xs: 16,
2596
+ // 1.33x
2597
+ sm: 20,
2598
+ // 1.43x
2599
+ base: 24,
2600
+ // 1.5x
2601
+ lg: 28,
2602
+ // 1.56x
2603
+ xl: 28,
2604
+ // 1.4x
2605
+ '2xl': 32,
2606
+ // 1.33x
2607
+ '3xl': 36,
2608
+ // 1.2x
2609
+ '4xl': 40,
2610
+ // 1.11x
2611
+ '5xl': 56,
2612
+ // 1.17x
2613
+ '6xl': 72,
2614
+ // 1.2x
2615
+ '7xl': 84,
2616
+ // 1.17x
2617
+ '8xl': 112,
2618
+ // 1.17x
2619
+ '9xl': 144 // 1.13x
2620
+ },
2621
+ /**
2622
+ * Letter spacing (tracking)
2623
+ */
2624
+ letterSpacing: {
2625
+ tighter: -0.8,
2626
+ tight: -0.4,
2627
+ normal: 0,
2628
+ wide: 0.4,
2629
+ wider: 0.8,
2630
+ widest: 1.6
2631
+ }
2632
+ };
2633
+ /**
2634
+ * Border radius scale
2635
+ */
2636
+ const borderRadius = {
2637
+ none: 0,
2638
+ xs: 4,
2639
+ sm: 10,
2640
+ md: 12,
2641
+ lg: 14,
2642
+ xl: 16,
2643
+ '2xl': 20,
2644
+ '3xl': 24,
2645
+ full: 9999
2646
+ };
2647
+ /**
2648
+ * Shadow presets
2649
+ * Platform-specific implementations for iOS and Android
2650
+ *
2651
+ * @example
2652
+ * ```typescript
2653
+ * import { Platform } from 'react-native';
2654
+ *
2655
+ * const shadowStyle = Platform.select({
2656
+ * ios: shadows.md.ios,
2657
+ * android: shadows.md.android,
2658
+ * });
2659
+ * ```
2660
+ */
2661
+ const shadows = {
2662
+ /**
2663
+ * Small shadow - subtle elevation
2664
+ */
2665
+ sm: {
2666
+ ios: {
2667
+ shadowColor: '#000000',
2668
+ shadowOffset: {
2669
+ width: 0,
2670
+ height: 1
2671
+ },
2672
+ shadowOpacity: 0.1,
2673
+ shadowRadius: 2
2674
+ },
2675
+ android: {
2676
+ elevation: 2
2677
+ }
2678
+ },
2679
+ /**
2680
+ * Medium shadow - standard elevation
2681
+ */
2682
+ md: {
2683
+ ios: {
2684
+ shadowColor: '#000000',
2685
+ shadowOffset: {
2686
+ width: 0,
2687
+ height: 2
2688
+ },
2689
+ shadowOpacity: 0.15,
2690
+ shadowRadius: 4
2691
+ },
2692
+ android: {
2693
+ elevation: 4
2694
+ }
2695
+ },
2696
+ /**
2697
+ * Large shadow - prominent elevation
2698
+ */
2699
+ lg: {
2700
+ ios: {
2701
+ shadowColor: '#000000',
2702
+ shadowOffset: {
2703
+ width: 0,
2704
+ height: 4
2705
+ },
2706
+ shadowOpacity: 0.2,
2707
+ shadowRadius: 8
2708
+ },
2709
+ android: {
2710
+ elevation: 8
2711
+ }
2712
+ },
2713
+ /**
2714
+ * Extra large shadow - maximum elevation
2715
+ */
2716
+ xl: {
2717
+ ios: {
2718
+ shadowColor: '#000000',
2719
+ shadowOffset: {
2720
+ width: 0,
2721
+ height: 8
2722
+ },
2723
+ shadowOpacity: 0.25,
2724
+ shadowRadius: 16
2725
+ },
2726
+ android: {
2727
+ elevation: 12
2728
+ }
2729
+ }
2730
+ };
2731
+ /**
2732
+ * Border width scale
2733
+ */
2734
+ const borderWidth = {
2735
+ 0: 0,
2736
+ 1: 1,
2737
+ 2: 2,
2738
+ 4: 4,
2739
+ 8: 8
2740
+ };
2741
+ /**
2742
+ * Opacity scale
2743
+ */
2744
+ const opacity = {
2745
+ 0: 0,
2746
+ 5: 0.05,
2747
+ 10: 0.1,
2748
+ 15: 0.15,
2749
+ 20: 0.2,
2750
+ 25: 0.25,
2751
+ 30: 0.3,
2752
+ 40: 0.4,
2753
+ 50: 0.5,
2754
+ 60: 0.6,
2755
+ 70: 0.7,
2756
+ 75: 0.75,
2757
+ 80: 0.8,
2758
+ 90: 0.9,
2759
+ 95: 0.95,
2760
+ 100: 1
2761
+ };
2762
+ /**
2763
+ * Z-index scale
2764
+ */
2765
+ const zIndex = {
2766
+ 0: 0,
2767
+ 10: 10,
2768
+ 20: 20,
2769
+ 30: 30,
2770
+ 40: 40,
2771
+ 50: 50,
2772
+ auto: 'auto'
2773
+ };
2774
+
2775
+ /**
2776
+ * Utility functions for React Native styles
2777
+ */
2778
+ /**
2779
+ * Creates an rgba color string from hex color and opacity
2780
+ *
2781
+ * @param hexColor - Hex color string (e.g., '#4C7EFF')
2782
+ * @param alpha - Opacity value between 0 and 1
2783
+ * @returns rgba color string
2784
+ *
2785
+ * @example
2786
+ * ```typescript
2787
+ * rgba('#4C7EFF', 0.5) // 'rgba(76, 126, 255, 0.5)'
2788
+ * rgba('#40BF40', 0.15) // 'rgba(64, 191, 64, 0.15)'
2789
+ * ```
2790
+ */
2791
+ function rgba(hexColor, alpha) {
2792
+ const hex = hexColor.replace('#', '');
2793
+ const r = parseInt(hex.substring(0, 2), 16);
2794
+ const g = parseInt(hex.substring(2, 4), 16);
2795
+ const b = parseInt(hex.substring(4, 6), 16);
2796
+ return `rgba(${r}, ${g}, ${b}, ${alpha})`;
2797
+ }
2798
+ /**
2799
+ * Converts hex color to rgba
2800
+ * Alias for rgba() with more explicit naming
2801
+ *
2802
+ * @param hexColor - Hex color string
2803
+ * @param alpha - Opacity value between 0 and 1
2804
+ * @returns rgba color string
2805
+ */
2806
+ function hexToRgba(hexColor, alpha) {
2807
+ return rgba(hexColor, alpha);
2808
+ }
2809
+ /**
2810
+ * Gets platform-specific shadow styles
2811
+ *
2812
+ * @param size - Shadow size: 'sm' | 'md' | 'lg' | 'xl'
2813
+ * @returns Platform-specific shadow styles
2814
+ *
2815
+ * @example
2816
+ * ```typescript
2817
+ * const styles = StyleSheet.create({
2818
+ * card: {
2819
+ * ...getShadow('md'),
2820
+ * },
2821
+ * });
2822
+ * ```
2823
+ */
2824
+ function getShadow(size) {
2825
+ if (reactNative.Platform.OS === 'ios') {
2826
+ return shadows[size].ios;
2827
+ } else if (reactNative.Platform.OS === 'android') {
2828
+ return shadows[size].android;
2829
+ }
2830
+ // Default to iOS shadow style for other platforms
2831
+ return shadows[size].ios;
2832
+ }
2833
+
2834
+ exports.ArrowIcon = ArrowIcon;
2835
+ exports.AsteriskIcon = AsteriskIcon;
2836
+ exports.Avatar = Avatar;
2837
+ exports.Badge = Badge;
2838
+ exports.BigNumber = BigNumber;
2839
+ exports.BroadcastedIcon = BroadcastedIcon;
2840
+ exports.Button = Button;
2841
+ exports.CheckIcon = CheckIcon;
2842
+ exports.ChevronIcon = ChevronIcon;
2843
+ exports.Clipboard = Clipboard;
2844
+ exports.CopyButton = CopyButton;
2845
+ exports.CopyIcon = CopyIcon;
2846
+ exports.CrossIcon = CrossIcon;
2847
+ exports.DashLogo = DashLogo;
2848
+ exports.ErrorIcon = ErrorIcon;
2849
+ exports.EyeClosedIcon = EyeClosedIcon;
2850
+ exports.EyeOpenIcon = EyeOpenIcon;
2851
+ exports.Heading = Heading;
2852
+ exports.Icons = Icons;
2853
+ exports.Identifier = Identifier;
2854
+ exports.InfoCircleIcon = InfoCircleIcon;
2855
+ exports.Input = Input;
2856
+ exports.NotActive = NotActive;
2857
+ exports.PlusIcon = PlusIcon;
2858
+ exports.PooledIcon = PooledIcon;
2859
+ exports.QueuedIcon = QueuedIcon;
2860
+ exports.SearchIcon = SearchIcon;
2861
+ exports.SuccessIcon = SuccessIcon;
2862
+ exports.Tabs = Tabs;
2863
+ exports.Text = Text;
2864
+ exports.TopRightArrowIcon = TopRightArrowIcon;
2865
+ exports.TransactionStatusIcon = TransactionStatusIcon;
2866
+ exports.ValueCard = ValueCard;
2867
+ exports.borderRadius = borderRadius;
2868
+ exports.borderWidth = borderWidth;
2869
+ exports.cn = cn;
2870
+ exports.colors = colors;
2871
+ exports.getShadow = getShadow;
2872
+ exports.hexToRgba = hexToRgba;
2873
+ exports.opacity = opacity;
2874
+ exports.resolveColorScheme = resolveColorScheme;
2875
+ exports.rgba = rgba;
2876
+ exports.shadows = shadows;
2877
+ exports.spacing = spacing;
2878
+ exports.tw = tw;
2879
+ exports.typography = typography;
2880
+ exports.useDebounce = useDebounce;
2881
+ exports.zIndex = zIndex;
2882
+ //# sourceMappingURL=index.cjs.js.map