@croacroa/react-native-template 2.1.0 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (172) hide show
  1. package/.env.example +5 -0
  2. package/.eslintrc.js +8 -0
  3. package/.github/workflows/ci.yml +187 -187
  4. package/.github/workflows/eas-build.yml +55 -55
  5. package/.github/workflows/eas-update.yml +50 -50
  6. package/.github/workflows/npm-publish.yml +57 -0
  7. package/CHANGELOG.md +195 -106
  8. package/CONTRIBUTING.md +377 -377
  9. package/LICENSE +21 -21
  10. package/README.md +446 -402
  11. package/__tests__/accessibility/components.test.tsx +285 -0
  12. package/__tests__/components/Button.test.tsx +2 -4
  13. package/__tests__/components/__snapshots__/snapshots.test.tsx.snap +512 -0
  14. package/__tests__/components/snapshots.test.tsx +131 -131
  15. package/__tests__/helpers/a11y.ts +54 -0
  16. package/__tests__/hooks/useAnalytics.test.ts +100 -0
  17. package/__tests__/hooks/useAnimations.test.ts +70 -0
  18. package/__tests__/hooks/useAuth.test.tsx +71 -28
  19. package/__tests__/hooks/useMedia.test.ts +318 -0
  20. package/__tests__/hooks/usePayments.test.tsx +307 -0
  21. package/__tests__/hooks/usePermission.test.ts +230 -0
  22. package/__tests__/hooks/useWebSocket.test.ts +329 -0
  23. package/__tests__/integration/auth-api.test.tsx +224 -227
  24. package/__tests__/performance/VirtualizedList.perf.test.tsx +385 -362
  25. package/__tests__/services/api.test.ts +24 -6
  26. package/app/(auth)/home.tsx +11 -9
  27. package/app/(auth)/profile.tsx +8 -6
  28. package/app/(auth)/settings.tsx +11 -9
  29. package/app/(public)/forgot-password.tsx +25 -15
  30. package/app/(public)/login.tsx +48 -12
  31. package/app/(public)/onboarding.tsx +5 -5
  32. package/app/(public)/register.tsx +24 -15
  33. package/app/_layout.tsx +6 -3
  34. package/app.config.ts +27 -2
  35. package/assets/images/.gitkeep +7 -7
  36. package/assets/images/adaptive-icon.png +0 -0
  37. package/assets/images/favicon.png +0 -0
  38. package/assets/images/icon.png +0 -0
  39. package/assets/images/notification-icon.png +0 -0
  40. package/assets/images/splash.png +0 -0
  41. package/components/ErrorBoundary.tsx +73 -28
  42. package/components/auth/SocialLoginButtons.tsx +168 -0
  43. package/components/forms/FormInput.tsx +5 -3
  44. package/components/onboarding/OnboardingScreen.tsx +370 -370
  45. package/components/onboarding/index.ts +2 -2
  46. package/components/providers/AnalyticsProvider.tsx +67 -0
  47. package/components/providers/SuspenseBoundary.tsx +359 -357
  48. package/components/providers/index.ts +24 -21
  49. package/components/ui/AnimatedButton.tsx +1 -9
  50. package/components/ui/AnimatedList.tsx +98 -0
  51. package/components/ui/AnimatedScreen.tsx +89 -0
  52. package/components/ui/Avatar.tsx +319 -316
  53. package/components/ui/Badge.tsx +416 -416
  54. package/components/ui/BottomSheet.tsx +307 -307
  55. package/components/ui/Button.tsx +11 -3
  56. package/components/ui/Checkbox.tsx +261 -261
  57. package/components/ui/FeatureGate.tsx +57 -0
  58. package/components/ui/ForceUpdateScreen.tsx +108 -0
  59. package/components/ui/ImagePickerButton.tsx +180 -0
  60. package/components/ui/Input.stories.tsx +2 -10
  61. package/components/ui/Input.tsx +2 -10
  62. package/components/ui/OptimizedImage.tsx +369 -369
  63. package/components/ui/Paywall.tsx +253 -0
  64. package/components/ui/PermissionGate.tsx +155 -0
  65. package/components/ui/PurchaseButton.tsx +84 -0
  66. package/components/ui/Select.tsx +240 -240
  67. package/components/ui/Skeleton.tsx +3 -1
  68. package/components/ui/Toast.tsx +427 -418
  69. package/components/ui/UploadProgress.tsx +189 -0
  70. package/components/ui/VirtualizedList.tsx +288 -285
  71. package/components/ui/index.ts +28 -30
  72. package/constants/config.ts +135 -97
  73. package/docs/adr/001-state-management.md +79 -79
  74. package/docs/adr/002-styling-approach.md +130 -130
  75. package/docs/adr/003-data-fetching.md +155 -155
  76. package/docs/adr/004-auth-adapter-pattern.md +144 -144
  77. package/docs/adr/README.md +78 -78
  78. package/docs/guides/analytics-posthog.md +121 -0
  79. package/docs/guides/auth-supabase.md +162 -0
  80. package/docs/guides/feature-flags-launchdarkly.md +150 -0
  81. package/docs/guides/payments-revenuecat.md +169 -0
  82. package/docs/plans/2026-02-22-phase6-implementation.md +3222 -0
  83. package/docs/plans/2026-02-22-phase6-template-completion-design.md +196 -0
  84. package/docs/plans/2026-02-23-npm-publish-design.md +31 -0
  85. package/docs/plans/2026-02-23-phase7-polish-documentation-design.md +79 -0
  86. package/docs/plans/2026-02-23-phase8-additional-features-design.md +136 -0
  87. package/eas.json +2 -1
  88. package/hooks/index.ts +70 -40
  89. package/hooks/useAnimatedEntry.ts +204 -0
  90. package/hooks/useApi.ts +5 -4
  91. package/hooks/useAuth.tsx +7 -3
  92. package/hooks/useBiometrics.ts +295 -295
  93. package/hooks/useChannel.ts +111 -0
  94. package/hooks/useDeepLinking.ts +256 -256
  95. package/hooks/useExperiment.ts +36 -0
  96. package/hooks/useFeatureFlag.ts +59 -0
  97. package/hooks/useForceUpdate.ts +91 -0
  98. package/hooks/useImagePicker.ts +281 -375
  99. package/hooks/useInAppReview.ts +64 -0
  100. package/hooks/useMFA.ts +509 -499
  101. package/hooks/useParallax.ts +142 -0
  102. package/hooks/usePerformance.ts +434 -434
  103. package/hooks/usePermission.ts +190 -0
  104. package/hooks/usePresence.ts +129 -0
  105. package/hooks/useProducts.ts +36 -0
  106. package/hooks/usePurchase.ts +103 -0
  107. package/hooks/useRateLimit.ts +70 -0
  108. package/hooks/useSubscription.ts +49 -0
  109. package/hooks/useTrackEvent.ts +52 -0
  110. package/hooks/useTrackScreen.ts +40 -0
  111. package/hooks/useUpdates.ts +358 -358
  112. package/hooks/useUpload.ts +165 -0
  113. package/hooks/useWebSocket.ts +111 -0
  114. package/i18n/index.ts +197 -194
  115. package/i18n/locales/ar.json +170 -101
  116. package/i18n/locales/de.json +170 -101
  117. package/i18n/locales/en.json +170 -101
  118. package/i18n/locales/es.json +170 -101
  119. package/i18n/locales/fr.json +170 -101
  120. package/jest.config.js +1 -1
  121. package/maestro/README.md +113 -113
  122. package/maestro/config.yaml +35 -35
  123. package/maestro/flows/login.yaml +62 -62
  124. package/maestro/flows/mfa-login.yaml +92 -92
  125. package/maestro/flows/mfa-setup.yaml +86 -86
  126. package/maestro/flows/navigation.yaml +68 -68
  127. package/maestro/flows/offline-conflict.yaml +101 -101
  128. package/maestro/flows/offline-sync.yaml +128 -128
  129. package/maestro/flows/offline.yaml +60 -60
  130. package/maestro/flows/register.yaml +94 -94
  131. package/package.json +188 -176
  132. package/scripts/generate-placeholders.js +38 -0
  133. package/services/analytics/adapters/console.ts +50 -0
  134. package/services/analytics/analytics-adapter.ts +94 -0
  135. package/services/analytics/types.ts +73 -0
  136. package/services/analytics.ts +428 -428
  137. package/services/api.ts +419 -340
  138. package/services/auth/social/apple.ts +110 -0
  139. package/services/auth/social/google.ts +159 -0
  140. package/services/auth/social/social-auth.ts +100 -0
  141. package/services/auth/social/types.ts +80 -0
  142. package/services/authAdapter.ts +333 -333
  143. package/services/backgroundSync.ts +652 -626
  144. package/services/feature-flags/adapters/mock.ts +108 -0
  145. package/services/feature-flags/feature-flag-adapter.ts +174 -0
  146. package/services/feature-flags/types.ts +79 -0
  147. package/services/force-update.ts +140 -0
  148. package/services/index.ts +116 -54
  149. package/services/media/compression.ts +91 -0
  150. package/services/media/media-picker.ts +151 -0
  151. package/services/media/media-upload.ts +160 -0
  152. package/services/payments/adapters/mock.ts +159 -0
  153. package/services/payments/payment-adapter.ts +118 -0
  154. package/services/payments/types.ts +131 -0
  155. package/services/permissions/permission-manager.ts +284 -0
  156. package/services/permissions/types.ts +104 -0
  157. package/services/realtime/types.ts +100 -0
  158. package/services/realtime/websocket-manager.ts +441 -0
  159. package/services/security.ts +289 -286
  160. package/services/sentry.ts +4 -4
  161. package/stores/appStore.ts +9 -0
  162. package/stores/notificationStore.ts +3 -1
  163. package/tailwind.config.js +47 -47
  164. package/tsconfig.json +37 -13
  165. package/types/user.ts +1 -1
  166. package/utils/accessibility.ts +446 -446
  167. package/utils/animations/presets.ts +182 -0
  168. package/utils/animations/transitions.ts +62 -0
  169. package/utils/index.ts +63 -52
  170. package/utils/toast.ts +9 -2
  171. package/utils/validation.ts +4 -1
  172. package/utils/withAccessibility.tsx +272 -272
@@ -0,0 +1,512 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`UI Components Snapshots Button renders danger variant correctly 1`] = `
4
+ <View
5
+ accessibilityRole="button"
6
+ accessibilityState={
7
+ {
8
+ "busy": undefined,
9
+ "checked": undefined,
10
+ "disabled": false,
11
+ "expanded": undefined,
12
+ "selected": undefined,
13
+ }
14
+ }
15
+ accessibilityValue={
16
+ {
17
+ "max": undefined,
18
+ "min": undefined,
19
+ "now": undefined,
20
+ "text": undefined,
21
+ }
22
+ }
23
+ accessible={true}
24
+ className="flex-row items-center justify-center rounded-xl bg-red-600 active:bg-red-700 px-4 py-3"
25
+ collapsable={false}
26
+ focusable={true}
27
+ onBlur={[Function]}
28
+ onClick={[Function]}
29
+ onFocus={[Function]}
30
+ onResponderGrant={[Function]}
31
+ onResponderMove={[Function]}
32
+ onResponderRelease={[Function]}
33
+ onResponderTerminate={[Function]}
34
+ onResponderTerminationRequest={[Function]}
35
+ onStartShouldSetResponder={[Function]}
36
+ >
37
+ <Text
38
+ className="font-semibold text-white text-base"
39
+ >
40
+ Danger
41
+ </Text>
42
+ </View>
43
+ `;
44
+
45
+ exports[`UI Components Snapshots Button renders disabled state correctly 1`] = `
46
+ <View
47
+ accessibilityRole="button"
48
+ accessibilityState={
49
+ {
50
+ "busy": undefined,
51
+ "checked": undefined,
52
+ "disabled": true,
53
+ "expanded": undefined,
54
+ "selected": undefined,
55
+ }
56
+ }
57
+ accessibilityValue={
58
+ {
59
+ "max": undefined,
60
+ "min": undefined,
61
+ "now": undefined,
62
+ "text": undefined,
63
+ }
64
+ }
65
+ accessible={true}
66
+ className="flex-row items-center justify-center rounded-xl bg-primary-600 active:bg-primary-700 px-4 py-3 opacity-50"
67
+ collapsable={false}
68
+ focusable={true}
69
+ onBlur={[Function]}
70
+ onClick={[Function]}
71
+ onFocus={[Function]}
72
+ onResponderGrant={[Function]}
73
+ onResponderMove={[Function]}
74
+ onResponderRelease={[Function]}
75
+ onResponderTerminate={[Function]}
76
+ onResponderTerminationRequest={[Function]}
77
+ onStartShouldSetResponder={[Function]}
78
+ >
79
+ <Text
80
+ className="font-semibold text-white text-base"
81
+ >
82
+ Disabled
83
+ </Text>
84
+ </View>
85
+ `;
86
+
87
+ exports[`UI Components Snapshots Button renders ghost variant correctly 1`] = `
88
+ <View
89
+ accessibilityRole="button"
90
+ accessibilityState={
91
+ {
92
+ "busy": undefined,
93
+ "checked": undefined,
94
+ "disabled": false,
95
+ "expanded": undefined,
96
+ "selected": undefined,
97
+ }
98
+ }
99
+ accessibilityValue={
100
+ {
101
+ "max": undefined,
102
+ "min": undefined,
103
+ "now": undefined,
104
+ "text": undefined,
105
+ }
106
+ }
107
+ accessible={true}
108
+ className="flex-row items-center justify-center rounded-xl bg-transparent active:bg-gray-100 dark:active:bg-gray-800 px-4 py-3"
109
+ collapsable={false}
110
+ focusable={true}
111
+ onBlur={[Function]}
112
+ onClick={[Function]}
113
+ onFocus={[Function]}
114
+ onResponderGrant={[Function]}
115
+ onResponderMove={[Function]}
116
+ onResponderRelease={[Function]}
117
+ onResponderTerminate={[Function]}
118
+ onResponderTerminationRequest={[Function]}
119
+ onStartShouldSetResponder={[Function]}
120
+ >
121
+ <Text
122
+ className="font-semibold text-primary-600 dark:text-primary-400 text-base"
123
+ >
124
+ Ghost
125
+ </Text>
126
+ </View>
127
+ `;
128
+
129
+ exports[`UI Components Snapshots Button renders large size correctly 1`] = `
130
+ <View
131
+ accessibilityRole="button"
132
+ accessibilityState={
133
+ {
134
+ "busy": undefined,
135
+ "checked": undefined,
136
+ "disabled": false,
137
+ "expanded": undefined,
138
+ "selected": undefined,
139
+ }
140
+ }
141
+ accessibilityValue={
142
+ {
143
+ "max": undefined,
144
+ "min": undefined,
145
+ "now": undefined,
146
+ "text": undefined,
147
+ }
148
+ }
149
+ accessible={true}
150
+ className="flex-row items-center justify-center rounded-xl bg-primary-600 active:bg-primary-700 px-6 py-4"
151
+ collapsable={false}
152
+ focusable={true}
153
+ onBlur={[Function]}
154
+ onClick={[Function]}
155
+ onFocus={[Function]}
156
+ onResponderGrant={[Function]}
157
+ onResponderMove={[Function]}
158
+ onResponderRelease={[Function]}
159
+ onResponderTerminate={[Function]}
160
+ onResponderTerminationRequest={[Function]}
161
+ onStartShouldSetResponder={[Function]}
162
+ >
163
+ <Text
164
+ className="font-semibold text-white text-lg"
165
+ >
166
+ Large
167
+ </Text>
168
+ </View>
169
+ `;
170
+
171
+ exports[`UI Components Snapshots Button renders loading state correctly 1`] = `
172
+ <View
173
+ accessibilityRole="button"
174
+ accessibilityState={
175
+ {
176
+ "busy": undefined,
177
+ "checked": undefined,
178
+ "disabled": true,
179
+ "expanded": undefined,
180
+ "selected": undefined,
181
+ }
182
+ }
183
+ accessibilityValue={
184
+ {
185
+ "max": undefined,
186
+ "min": undefined,
187
+ "now": undefined,
188
+ "text": undefined,
189
+ }
190
+ }
191
+ accessible={true}
192
+ className="flex-row items-center justify-center rounded-xl bg-primary-600 active:bg-primary-700 px-4 py-3 opacity-50"
193
+ collapsable={false}
194
+ focusable={true}
195
+ onBlur={[Function]}
196
+ onClick={[Function]}
197
+ onFocus={[Function]}
198
+ onResponderGrant={[Function]}
199
+ onResponderMove={[Function]}
200
+ onResponderRelease={[Function]}
201
+ onResponderTerminate={[Function]}
202
+ onResponderTerminationRequest={[Function]}
203
+ onStartShouldSetResponder={[Function]}
204
+ >
205
+ <ActivityIndicator
206
+ color="#ffffff"
207
+ size="small"
208
+ />
209
+ </View>
210
+ `;
211
+
212
+ exports[`UI Components Snapshots Button renders outline variant correctly 1`] = `
213
+ <View
214
+ accessibilityRole="button"
215
+ accessibilityState={
216
+ {
217
+ "busy": undefined,
218
+ "checked": undefined,
219
+ "disabled": false,
220
+ "expanded": undefined,
221
+ "selected": undefined,
222
+ }
223
+ }
224
+ accessibilityValue={
225
+ {
226
+ "max": undefined,
227
+ "min": undefined,
228
+ "now": undefined,
229
+ "text": undefined,
230
+ }
231
+ }
232
+ accessible={true}
233
+ className="flex-row items-center justify-center rounded-xl border-2 border-gray-300 dark:border-gray-600 bg-transparent active:bg-gray-100 dark:active:bg-gray-800 px-4 py-3"
234
+ collapsable={false}
235
+ focusable={true}
236
+ onBlur={[Function]}
237
+ onClick={[Function]}
238
+ onFocus={[Function]}
239
+ onResponderGrant={[Function]}
240
+ onResponderMove={[Function]}
241
+ onResponderRelease={[Function]}
242
+ onResponderTerminate={[Function]}
243
+ onResponderTerminationRequest={[Function]}
244
+ onStartShouldSetResponder={[Function]}
245
+ >
246
+ <Text
247
+ className="font-semibold text-text-light dark:text-text-dark text-base"
248
+ >
249
+ Outline
250
+ </Text>
251
+ </View>
252
+ `;
253
+
254
+ exports[`UI Components Snapshots Button renders primary variant correctly 1`] = `
255
+ <View
256
+ accessibilityRole="button"
257
+ accessibilityState={
258
+ {
259
+ "busy": undefined,
260
+ "checked": undefined,
261
+ "disabled": false,
262
+ "expanded": undefined,
263
+ "selected": undefined,
264
+ }
265
+ }
266
+ accessibilityValue={
267
+ {
268
+ "max": undefined,
269
+ "min": undefined,
270
+ "now": undefined,
271
+ "text": undefined,
272
+ }
273
+ }
274
+ accessible={true}
275
+ className="flex-row items-center justify-center rounded-xl bg-primary-600 active:bg-primary-700 px-4 py-3"
276
+ collapsable={false}
277
+ focusable={true}
278
+ onBlur={[Function]}
279
+ onClick={[Function]}
280
+ onFocus={[Function]}
281
+ onResponderGrant={[Function]}
282
+ onResponderMove={[Function]}
283
+ onResponderRelease={[Function]}
284
+ onResponderTerminate={[Function]}
285
+ onResponderTerminationRequest={[Function]}
286
+ onStartShouldSetResponder={[Function]}
287
+ >
288
+ <Text
289
+ className="font-semibold text-white text-base"
290
+ >
291
+ Primary
292
+ </Text>
293
+ </View>
294
+ `;
295
+
296
+ exports[`UI Components Snapshots Button renders secondary variant correctly 1`] = `
297
+ <View
298
+ accessibilityRole="button"
299
+ accessibilityState={
300
+ {
301
+ "busy": undefined,
302
+ "checked": undefined,
303
+ "disabled": false,
304
+ "expanded": undefined,
305
+ "selected": undefined,
306
+ }
307
+ }
308
+ accessibilityValue={
309
+ {
310
+ "max": undefined,
311
+ "min": undefined,
312
+ "now": undefined,
313
+ "text": undefined,
314
+ }
315
+ }
316
+ accessible={true}
317
+ className="flex-row items-center justify-center rounded-xl bg-gray-200 dark:bg-gray-700 active:bg-gray-300 dark:active:bg-gray-600 px-4 py-3"
318
+ collapsable={false}
319
+ focusable={true}
320
+ onBlur={[Function]}
321
+ onClick={[Function]}
322
+ onFocus={[Function]}
323
+ onResponderGrant={[Function]}
324
+ onResponderMove={[Function]}
325
+ onResponderRelease={[Function]}
326
+ onResponderTerminate={[Function]}
327
+ onResponderTerminationRequest={[Function]}
328
+ onStartShouldSetResponder={[Function]}
329
+ >
330
+ <Text
331
+ className="font-semibold text-text-light dark:text-text-dark text-base"
332
+ >
333
+ Secondary
334
+ </Text>
335
+ </View>
336
+ `;
337
+
338
+ exports[`UI Components Snapshots Button renders small size correctly 1`] = `
339
+ <View
340
+ accessibilityRole="button"
341
+ accessibilityState={
342
+ {
343
+ "busy": undefined,
344
+ "checked": undefined,
345
+ "disabled": false,
346
+ "expanded": undefined,
347
+ "selected": undefined,
348
+ }
349
+ }
350
+ accessibilityValue={
351
+ {
352
+ "max": undefined,
353
+ "min": undefined,
354
+ "now": undefined,
355
+ "text": undefined,
356
+ }
357
+ }
358
+ accessible={true}
359
+ className="flex-row items-center justify-center rounded-xl bg-primary-600 active:bg-primary-700 px-3 py-2"
360
+ collapsable={false}
361
+ focusable={true}
362
+ onBlur={[Function]}
363
+ onClick={[Function]}
364
+ onFocus={[Function]}
365
+ onResponderGrant={[Function]}
366
+ onResponderMove={[Function]}
367
+ onResponderRelease={[Function]}
368
+ onResponderTerminate={[Function]}
369
+ onResponderTerminationRequest={[Function]}
370
+ onStartShouldSetResponder={[Function]}
371
+ >
372
+ <Text
373
+ className="font-semibold text-white text-sm"
374
+ >
375
+ Small
376
+ </Text>
377
+ </View>
378
+ `;
379
+
380
+ exports[`UI Components Snapshots Button renders with custom children correctly 1`] = `
381
+ <View
382
+ accessibilityRole="button"
383
+ accessibilityState={
384
+ {
385
+ "busy": undefined,
386
+ "checked": undefined,
387
+ "disabled": false,
388
+ "expanded": undefined,
389
+ "selected": undefined,
390
+ }
391
+ }
392
+ accessibilityValue={
393
+ {
394
+ "max": undefined,
395
+ "min": undefined,
396
+ "now": undefined,
397
+ "text": undefined,
398
+ }
399
+ }
400
+ accessible={true}
401
+ className="flex-row items-center justify-center rounded-xl bg-primary-600 active:bg-primary-700 px-4 py-3"
402
+ collapsable={false}
403
+ focusable={true}
404
+ onBlur={[Function]}
405
+ onClick={[Function]}
406
+ onFocus={[Function]}
407
+ onResponderGrant={[Function]}
408
+ onResponderMove={[Function]}
409
+ onResponderRelease={[Function]}
410
+ onResponderTerminate={[Function]}
411
+ onResponderTerminationRequest={[Function]}
412
+ onStartShouldSetResponder={[Function]}
413
+ >
414
+ <View>
415
+ <Text>
416
+ Custom Content
417
+ </Text>
418
+ </View>
419
+ </View>
420
+ `;
421
+
422
+ exports[`UI Components Snapshots Card renders complex content correctly 1`] = `
423
+ <View
424
+ className="rounded-xl bg-surface-light shadow-lg dark:bg-surface-dark p-4"
425
+ >
426
+ <Text>
427
+ Title
428
+ </Text>
429
+ <Text>
430
+ Description text here
431
+ </Text>
432
+ <View
433
+ accessibilityRole="button"
434
+ accessibilityState={
435
+ {
436
+ "busy": undefined,
437
+ "checked": undefined,
438
+ "disabled": false,
439
+ "expanded": undefined,
440
+ "selected": undefined,
441
+ }
442
+ }
443
+ accessibilityValue={
444
+ {
445
+ "max": undefined,
446
+ "min": undefined,
447
+ "now": undefined,
448
+ "text": undefined,
449
+ }
450
+ }
451
+ accessible={true}
452
+ className="flex-row items-center justify-center rounded-xl bg-primary-600 active:bg-primary-700 px-4 py-3"
453
+ collapsable={false}
454
+ focusable={true}
455
+ onBlur={[Function]}
456
+ onClick={[Function]}
457
+ onFocus={[Function]}
458
+ onResponderGrant={[Function]}
459
+ onResponderMove={[Function]}
460
+ onResponderRelease={[Function]}
461
+ onResponderTerminate={[Function]}
462
+ onResponderTerminationRequest={[Function]}
463
+ onStartShouldSetResponder={[Function]}
464
+ >
465
+ <Text
466
+ className="font-semibold text-white text-base"
467
+ >
468
+ Action
469
+ </Text>
470
+ </View>
471
+ </View>
472
+ `;
473
+
474
+ exports[`UI Components Snapshots Card renders default variant correctly 1`] = `
475
+ <View
476
+ className="rounded-xl bg-surface-light dark:bg-surface-dark"
477
+ >
478
+ <Text>
479
+ Default Card
480
+ </Text>
481
+ </View>
482
+ `;
483
+
484
+ exports[`UI Components Snapshots Card renders elevated variant correctly 1`] = `
485
+ <View
486
+ className="rounded-xl bg-surface-light shadow-lg dark:bg-surface-dark"
487
+ >
488
+ <Text>
489
+ Elevated Card
490
+ </Text>
491
+ </View>
492
+ `;
493
+
494
+ exports[`UI Components Snapshots Card renders outlined variant correctly 1`] = `
495
+ <View
496
+ className="rounded-xl border-2 border-gray-200 bg-transparent dark:border-gray-700"
497
+ >
498
+ <Text>
499
+ Outlined Card
500
+ </Text>
501
+ </View>
502
+ `;
503
+
504
+ exports[`UI Components Snapshots Card renders with custom className correctly 1`] = `
505
+ <View
506
+ className="rounded-xl bg-surface-light dark:bg-surface-dark p-4 m-2"
507
+ >
508
+ <Text>
509
+ Custom Styled Card
510
+ </Text>
511
+ </View>
512
+ `;