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