@expokit/cli 0.0.0-stage → 0.3.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 (312) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +46 -2
  3. package/bin/expo-kit.js +1266 -0
  4. package/bin/lib.mjs +343 -0
  5. package/bin/mcp.mjs +345 -0
  6. package/package.json +49 -4
  7. package/registry/_docs/accordion.json +115 -0
  8. package/registry/_docs/action-sheet.json +138 -0
  9. package/registry/_docs/alert.json +155 -0
  10. package/registry/_docs/avatar.json +227 -0
  11. package/registry/_docs/badge.json +148 -0
  12. package/registry/_docs/bottom-nav.json +143 -0
  13. package/registry/_docs/bottom-sheet.json +186 -0
  14. package/registry/_docs/bullet.json +27 -0
  15. package/registry/_docs/button-3d.json +138 -0
  16. package/registry/_docs/button.json +131 -0
  17. package/registry/_docs/calendar.json +198 -0
  18. package/registry/_docs/card-stack.json +124 -0
  19. package/registry/_docs/card.json +131 -0
  20. package/registry/_docs/carousel.json +122 -0
  21. package/registry/_docs/chat.json +184 -0
  22. package/registry/_docs/checkbox.json +109 -0
  23. package/registry/_docs/checkout.json +105 -0
  24. package/registry/_docs/chip-group.json +132 -0
  25. package/registry/_docs/color-swatch.json +82 -0
  26. package/registry/_docs/confetti.json +102 -0
  27. package/registry/_docs/coupon.json +192 -0
  28. package/registry/_docs/cube-pager.json +100 -0
  29. package/registry/_docs/dashboard.json +123 -0
  30. package/registry/_docs/date-picker.json +269 -0
  31. package/registry/_docs/dialog.json +186 -0
  32. package/registry/_docs/drawer.json +199 -0
  33. package/registry/_docs/fab.json +144 -0
  34. package/registry/_docs/flip-card.json +127 -0
  35. package/registry/_docs/floating-input.json +211 -0
  36. package/registry/_docs/gift-card.json +124 -0
  37. package/registry/_docs/glass-button.json +142 -0
  38. package/registry/_docs/glass-nav-bar.json +102 -0
  39. package/registry/_docs/glass-search-bar.json +114 -0
  40. package/registry/_docs/glass-segmented.json +94 -0
  41. package/registry/_docs/glass-sheet.json +136 -0
  42. package/registry/_docs/glass-tab-bar.json +100 -0
  43. package/registry/_docs/glass.json +94 -0
  44. package/registry/_docs/inbox.json +75 -0
  45. package/registry/_docs/isometric-bar.json +75 -0
  46. package/registry/_docs/kit.json +14 -0
  47. package/registry/_docs/kpi-card.json +14 -0
  48. package/registry/_docs/like-button.json +92 -0
  49. package/registry/_docs/liquidglass-tab.json +30 -0
  50. package/registry/_docs/list-item.json +216 -0
  51. package/registry/_docs/loyalty-card.json +124 -0
  52. package/registry/_docs/morph-button.json +128 -0
  53. package/registry/_docs/number-ticker.json +112 -0
  54. package/registry/_docs/offers.json +81 -0
  55. package/registry/_docs/onboarding.json +69 -0
  56. package/registry/_docs/otp-input.json +158 -0
  57. package/registry/_docs/pagination-dots.json +108 -0
  58. package/registry/_docs/parallax-layers.json +104 -0
  59. package/registry/_docs/parallax-scroll.json +210 -0
  60. package/registry/_docs/password-input.json +112 -0
  61. package/registry/_docs/payment-card.json +169 -0
  62. package/registry/_docs/pixel-bar.json +69 -0
  63. package/registry/_docs/polar-area.json +81 -0
  64. package/registry/_docs/profile.json +87 -0
  65. package/registry/_docs/progress-steps.json +116 -0
  66. package/registry/_docs/progress.json +152 -0
  67. package/registry/_docs/radio-group.json +112 -0
  68. package/registry/_docs/rating.json +114 -0
  69. package/registry/_docs/ring-carousel.json +122 -0
  70. package/registry/_docs/scratch-card.json +110 -0
  71. package/registry/_docs/search-bar.json +160 -0
  72. package/registry/_docs/search-results.json +123 -0
  73. package/registry/_docs/segmented-control.json +123 -0
  74. package/registry/_docs/select.json +277 -0
  75. package/registry/_docs/settings.json +75 -0
  76. package/registry/_docs/shimmer-button.json +98 -0
  77. package/registry/_docs/sign-in.json +201 -0
  78. package/registry/_docs/skeleton.json +162 -0
  79. package/registry/_docs/slide-to-confirm.json +108 -0
  80. package/registry/_docs/slider.json +177 -0
  81. package/registry/_docs/spin-wheel.json +138 -0
  82. package/registry/_docs/spinner.json +121 -0
  83. package/registry/_docs/stateful-button.json +184 -0
  84. package/registry/_docs/stepper.json +184 -0
  85. package/registry/_docs/swipe-deck.json +118 -0
  86. package/registry/_docs/swipeable-row.json +95 -0
  87. package/registry/_docs/switch.json +124 -0
  88. package/registry/_docs/tabs.json +129 -0
  89. package/registry/_docs/tag-input.json +148 -0
  90. package/registry/_docs/text-animation.json +141 -0
  91. package/registry/_docs/textarea.json +191 -0
  92. package/registry/_docs/ticket-card.json +194 -0
  93. package/registry/_docs/ticket-shape.json +14 -0
  94. package/registry/_docs/tilt-card.json +157 -0
  95. package/registry/_docs/time-picker.json +269 -0
  96. package/registry/_docs/timeline-chart.json +33 -0
  97. package/registry/_docs/timeline.json +172 -0
  98. package/registry/_docs/toast.json +185 -0
  99. package/registry/_docs/treemap.json +33 -0
  100. package/registry/_docs/waterfall.json +39 -0
  101. package/registry/_docs/wheel-list.json +122 -0
  102. package/registry/accordion/files/src/components/ui/accordion.tsx +233 -0
  103. package/registry/accordion/files/src/lib/kit.tsx +219 -0
  104. package/registry/accordion.json +17 -0
  105. package/registry/action-sheet/files/src/components/ui/action-sheet.tsx +580 -0
  106. package/registry/action-sheet/files/src/lib/kit.tsx +219 -0
  107. package/registry/action-sheet.json +18 -0
  108. package/registry/alert/files/src/components/ui/alert.tsx +654 -0
  109. package/registry/alert/files/src/components/ui/button.tsx +274 -0
  110. package/registry/alert/files/src/lib/kit.tsx +219 -0
  111. package/registry/alert.json +20 -0
  112. package/registry/avatar/files/src/components/ui/avatar.tsx +790 -0
  113. package/registry/avatar/files/src/lib/kit.tsx +219 -0
  114. package/registry/avatar.json +18 -0
  115. package/registry/badge/files/src/components/ui/badge.tsx +626 -0
  116. package/registry/badge/files/src/lib/kit.tsx +219 -0
  117. package/registry/badge.json +17 -0
  118. package/registry/bottom-nav/files/src/components/ui/bottom-nav.tsx +1050 -0
  119. package/registry/bottom-nav/files/src/lib/kit.tsx +219 -0
  120. package/registry/bottom-nav.json +18 -0
  121. package/registry/bottom-sheet/files/src/components/ui/bottom-sheet.tsx +585 -0
  122. package/registry/bottom-sheet/files/src/lib/kit.tsx +219 -0
  123. package/registry/bottom-sheet.json +17 -0
  124. package/registry/bullet.json +14 -0
  125. package/registry/button/files/src/components/ui/button.tsx +274 -0
  126. package/registry/button/files/src/lib/kit.tsx +219 -0
  127. package/registry/button-3d/files/src/components/ui/button-3d.tsx +212 -0
  128. package/registry/button-3d/files/src/lib/kit.tsx +219 -0
  129. package/registry/button-3d.json +18 -0
  130. package/registry/button.json +18 -0
  131. package/registry/calendar/files/src/components/ui/calendar.tsx +822 -0
  132. package/registry/calendar/files/src/lib/kit.tsx +219 -0
  133. package/registry/calendar.json +17 -0
  134. package/registry/card/files/src/components/ui/card.tsx +300 -0
  135. package/registry/card/files/src/lib/kit.tsx +219 -0
  136. package/registry/card-stack.json +15 -0
  137. package/registry/card.json +17 -0
  138. package/registry/carousel.json +15 -0
  139. package/registry/chat.json +18 -0
  140. package/registry/checkbox/files/src/components/ui/checkbox.tsx +150 -0
  141. package/registry/checkbox/files/src/lib/kit.tsx +219 -0
  142. package/registry/checkbox.json +17 -0
  143. package/registry/checkout.json +26 -0
  144. package/registry/chip-group/files/src/components/ui/chip-group.tsx +269 -0
  145. package/registry/chip-group/files/src/lib/kit.tsx +219 -0
  146. package/registry/chip-group.json +17 -0
  147. package/registry/color-swatch.json +17 -0
  148. package/registry/confetti/files/src/components/ui/confetti.tsx +222 -0
  149. package/registry/confetti/files/src/lib/kit.tsx +219 -0
  150. package/registry/confetti.json +15 -0
  151. package/registry/coupon/files/src/components/ui/coupon.tsx +698 -0
  152. package/registry/coupon/files/src/components/ui/flip-card.tsx +205 -0
  153. package/registry/coupon/files/src/components/ui/tilt-card.tsx +635 -0
  154. package/registry/coupon/files/src/lib/kit.tsx +219 -0
  155. package/registry/coupon/files/src/lib/ticket-shape.tsx +543 -0
  156. package/registry/coupon.json +23 -0
  157. package/registry/cube-pager.json +15 -0
  158. package/registry/dashboard.json +32 -0
  159. package/registry/date-picker/files/src/components/ui/calendar.tsx +822 -0
  160. package/registry/date-picker/files/src/components/ui/date-picker.tsx +796 -0
  161. package/registry/date-picker/files/src/lib/kit.tsx +219 -0
  162. package/registry/date-picker.json +19 -0
  163. package/registry/dialog/files/src/components/ui/dialog.tsx +759 -0
  164. package/registry/dialog/files/src/lib/kit.tsx +219 -0
  165. package/registry/dialog.json +18 -0
  166. package/registry/drawer/files/src/components/ui/drawer.tsx +1135 -0
  167. package/registry/drawer/files/src/lib/kit.tsx +219 -0
  168. package/registry/drawer.json +18 -0
  169. package/registry/fab.json +18 -0
  170. package/registry/flip-card/files/src/components/ui/flip-card.tsx +205 -0
  171. package/registry/flip-card/files/src/lib/kit.tsx +219 -0
  172. package/registry/flip-card.json +15 -0
  173. package/registry/floating-input/files/src/components/ui/floating-input.tsx +528 -0
  174. package/registry/floating-input/files/src/lib/kit.tsx +219 -0
  175. package/registry/floating-input.json +17 -0
  176. package/registry/gift-card.json +21 -0
  177. package/registry/glass-button.json +22 -0
  178. package/registry/glass-nav-bar.json +21 -0
  179. package/registry/glass-search-bar.json +21 -0
  180. package/registry/glass-segmented.json +22 -0
  181. package/registry/glass-sheet.json +22 -0
  182. package/registry/glass-tab-bar.json +22 -0
  183. package/registry/glass.json +19 -0
  184. package/registry/inbox.json +30 -0
  185. package/registry/isometric-bar.json +14 -0
  186. package/registry/kit/files/src/lib/kit.tsx +219 -0
  187. package/registry/kit.json +11 -0
  188. package/registry/kpi-card/files/src/components/charts/kpi-card.tsx +45 -0
  189. package/registry/kpi-card.json +14 -0
  190. package/registry/like-button.json +18 -0
  191. package/registry/liquidglass-tab/files/src/app/(tabs)/_layout.tsx +97 -0
  192. package/registry/liquidglass-tab/files/src/app/(tabs)/alerts.tsx +5 -0
  193. package/registry/liquidglass-tab/files/src/app/(tabs)/explore.tsx +5 -0
  194. package/registry/liquidglass-tab/files/src/app/(tabs)/index.tsx +5 -0
  195. package/registry/liquidglass-tab/files/src/app/(tabs)/profile.tsx +5 -0
  196. package/registry/liquidglass-tab/files/src/app/_layout.tsx +33 -0
  197. package/registry/liquidglass-tab/files/src/components/GlassTabBar.tsx +259 -0
  198. package/registry/liquidglass-tab/files/src/components/TabScreen.tsx +122 -0
  199. package/registry/liquidglass-tab/files/src/lib/tab-bar.ts +61 -0
  200. package/registry/liquidglass-tab/files/src/lib/tab-icons.ts +130 -0
  201. package/registry/liquidglass-tab/files/src/lib/tabs.ts +108 -0
  202. package/registry/liquidglass-tab.json +23 -0
  203. package/registry/list-item/files/src/components/ui/list-item.tsx +508 -0
  204. package/registry/list-item/files/src/lib/kit.tsx +219 -0
  205. package/registry/list-item.json +17 -0
  206. package/registry/loyalty-card.json +23 -0
  207. package/registry/morph-button.json +18 -0
  208. package/registry/number-ticker.json +15 -0
  209. package/registry/offers.json +24 -0
  210. package/registry/onboarding.json +17 -0
  211. package/registry/otp-input/files/src/components/ui/otp-input.tsx +380 -0
  212. package/registry/otp-input/files/src/lib/kit.tsx +219 -0
  213. package/registry/otp-input.json +17 -0
  214. package/registry/pagination-dots/files/src/components/ui/pagination-dots.tsx +262 -0
  215. package/registry/pagination-dots/files/src/lib/kit.tsx +219 -0
  216. package/registry/pagination-dots.json +15 -0
  217. package/registry/parallax-layers.json +15 -0
  218. package/registry/parallax-scroll.json +17 -0
  219. package/registry/password-input/files/src/components/ui/floating-input.tsx +528 -0
  220. package/registry/password-input/files/src/components/ui/password-input.tsx +271 -0
  221. package/registry/password-input/files/src/lib/kit.tsx +219 -0
  222. package/registry/password-input.json +19 -0
  223. package/registry/payment-card/files/src/components/ui/flip-card.tsx +205 -0
  224. package/registry/payment-card/files/src/components/ui/payment-card.tsx +385 -0
  225. package/registry/payment-card/files/src/components/ui/tilt-card.tsx +635 -0
  226. package/registry/payment-card/files/src/lib/kit.tsx +219 -0
  227. package/registry/payment-card.json +21 -0
  228. package/registry/pixel-bar.json +14 -0
  229. package/registry/polar-area.json +14 -0
  230. package/registry/profile.json +17 -0
  231. package/registry/progress/files/src/components/ui/progress.tsx +883 -0
  232. package/registry/progress/files/src/lib/kit.tsx +219 -0
  233. package/registry/progress-steps/files/src/components/ui/progress-steps.tsx +559 -0
  234. package/registry/progress-steps/files/src/lib/kit.tsx +219 -0
  235. package/registry/progress-steps.json +18 -0
  236. package/registry/progress.json +17 -0
  237. package/registry/radio-group/files/src/components/ui/radio-group.tsx +327 -0
  238. package/registry/radio-group/files/src/lib/kit.tsx +219 -0
  239. package/registry/radio-group.json +18 -0
  240. package/registry/rating.json +18 -0
  241. package/registry/ring-carousel.json +15 -0
  242. package/registry/scratch-card.json +18 -0
  243. package/registry/search-bar/files/src/components/ui/search-bar.tsx +530 -0
  244. package/registry/search-bar/files/src/lib/kit.tsx +219 -0
  245. package/registry/search-bar.json +17 -0
  246. package/registry/search-results.json +30 -0
  247. package/registry/segmented-control/files/src/components/ui/segmented-control.tsx +341 -0
  248. package/registry/segmented-control/files/src/lib/kit.tsx +219 -0
  249. package/registry/segmented-control.json +18 -0
  250. package/registry/select/files/src/components/ui/select.tsx +1398 -0
  251. package/registry/select/files/src/lib/kit.tsx +219 -0
  252. package/registry/select.json +17 -0
  253. package/registry/settings.json +26 -0
  254. package/registry/shimmer-button.json +17 -0
  255. package/registry/sign-in.json +26 -0
  256. package/registry/skeleton/files/src/components/ui/skeleton.tsx +799 -0
  257. package/registry/skeleton/files/src/lib/kit.tsx +219 -0
  258. package/registry/skeleton.json +17 -0
  259. package/registry/slide-to-confirm.json +18 -0
  260. package/registry/slider/files/src/components/ui/slider.tsx +716 -0
  261. package/registry/slider/files/src/lib/kit.tsx +219 -0
  262. package/registry/slider.json +17 -0
  263. package/registry/spin-wheel.json +18 -0
  264. package/registry/spinner/files/src/components/ui/spinner.tsx +748 -0
  265. package/registry/spinner/files/src/lib/kit.tsx +219 -0
  266. package/registry/spinner.json +17 -0
  267. package/registry/stateful-button/files/src/components/ui/stateful-button.tsx +532 -0
  268. package/registry/stateful-button/files/src/lib/kit.tsx +219 -0
  269. package/registry/stateful-button.json +18 -0
  270. package/registry/stepper/files/src/components/ui/stepper.tsx +646 -0
  271. package/registry/stepper/files/src/lib/kit.tsx +219 -0
  272. package/registry/stepper.json +17 -0
  273. package/registry/swipe-deck.json +15 -0
  274. package/registry/swipeable-row.json +15 -0
  275. package/registry/switch/files/src/components/ui/switch.tsx +344 -0
  276. package/registry/switch/files/src/lib/kit.tsx +219 -0
  277. package/registry/switch.json +18 -0
  278. package/registry/tabs/files/src/components/ui/tabs.tsx +539 -0
  279. package/registry/tabs/files/src/lib/kit.tsx +219 -0
  280. package/registry/tabs.json +17 -0
  281. package/registry/tag-input/files/src/components/ui/tag-input.tsx +720 -0
  282. package/registry/tag-input/files/src/lib/kit.tsx +219 -0
  283. package/registry/tag-input.json +17 -0
  284. package/registry/text-animation/files/src/components/ui/text-animation.tsx +650 -0
  285. package/registry/text-animation/files/src/lib/kit.tsx +219 -0
  286. package/registry/text-animation.json +15 -0
  287. package/registry/textarea/files/src/components/ui/textarea.tsx +553 -0
  288. package/registry/textarea/files/src/lib/kit.tsx +219 -0
  289. package/registry/textarea.json +17 -0
  290. package/registry/ticket-card.json +24 -0
  291. package/registry/ticket-shape/files/src/lib/kit.tsx +219 -0
  292. package/registry/ticket-shape/files/src/lib/ticket-shape.tsx +543 -0
  293. package/registry/ticket-shape.json +17 -0
  294. package/registry/tilt-card/files/src/components/ui/tilt-card.tsx +635 -0
  295. package/registry/tilt-card/files/src/lib/kit.tsx +219 -0
  296. package/registry/tilt-card.json +17 -0
  297. package/registry/time-picker/files/src/components/ui/time-picker.tsx +1159 -0
  298. package/registry/time-picker/files/src/lib/kit.tsx +219 -0
  299. package/registry/time-picker.json +17 -0
  300. package/registry/timeline/files/src/components/ui/avatar.tsx +790 -0
  301. package/registry/timeline/files/src/components/ui/timeline.tsx +1059 -0
  302. package/registry/timeline/files/src/lib/kit.tsx +219 -0
  303. package/registry/timeline-chart.json +14 -0
  304. package/registry/timeline.json +20 -0
  305. package/registry/toast/files/src/components/ui/button.tsx +274 -0
  306. package/registry/toast/files/src/components/ui/toast.tsx +1284 -0
  307. package/registry/toast/files/src/lib/kit.tsx +219 -0
  308. package/registry/toast.json +20 -0
  309. package/registry/treemap.json +14 -0
  310. package/registry/waterfall.json +14 -0
  311. package/registry/wheel-list.json +17 -0
  312. package/schema/components.schema.json +13 -0
@@ -0,0 +1,102 @@
1
+ {
2
+ "name": "confetti",
3
+ "category": "Coupons",
4
+ "aliases": [],
5
+ "exportName": "Confetti",
6
+ "files": [
7
+ "src/components/ui/confetti.tsx"
8
+ ],
9
+ "summary": "Confetti that flies on real arcs with gravity and drag, then flutters as it falls.",
10
+ "props": [
11
+ [
12
+ "count",
13
+ "number",
14
+ "80",
15
+ "Pieces per burst (max 160)."
16
+ ],
17
+ [
18
+ "colors",
19
+ "string[]",
20
+ "vivid mix",
21
+ "Piece colours."
22
+ ],
23
+ [
24
+ "origin",
25
+ "\"top\" | \"center\" | \"bottom\"",
26
+ "\"bottom\"",
27
+ "Rain from the top, pop outward, or two cannons from the bottom corners."
28
+ ],
29
+ [
30
+ "duration",
31
+ "number",
32
+ "2600",
33
+ "How long a burst lasts, in ms."
34
+ ],
35
+ [
36
+ "trigger",
37
+ "unknown",
38
+ "—",
39
+ "Fire a burst whenever this value changes — no ref needed."
40
+ ],
41
+ [
42
+ "autoplay",
43
+ "boolean",
44
+ "false",
45
+ "Fire once on mount."
46
+ ],
47
+ [
48
+ "onDone",
49
+ "() => void",
50
+ "—",
51
+ "A burst finished."
52
+ ],
53
+ [
54
+ "ref.burst(options?)",
55
+ "{ origin?, x?, y?, count?, colors? }",
56
+ "—",
57
+ "Fire a burst (they can overlap); x / y place a center burst."
58
+ ],
59
+ [
60
+ "style",
61
+ "StyleProp<ViewStyle>",
62
+ "fills its parent",
63
+ "The overlay never takes touches."
64
+ ]
65
+ ],
66
+ "behavior": [
67
+ [
68
+ "Motion",
69
+ "Each burst launches pieces with velocity, gravity and air drag, all moved by one native-driven animation. Bursts can overlap."
70
+ ],
71
+ [
72
+ "Touch",
73
+ "The overlay fills its parent and never takes touches."
74
+ ],
75
+ [
76
+ "Reduced motion",
77
+ "Bursts launch a quarter of the pieces."
78
+ ],
79
+ [
80
+ "Screen readers",
81
+ "The overlay is hidden from assistive tech."
82
+ ]
83
+ ],
84
+ "usage": "import { useState } from 'react';\nimport { Confetti } from '@/components/ui/confetti';\n\nconst [orders, setOrders] = useState(0);\n<Confetti trigger={orders} origin=\"bottom\" />",
85
+ "examples": [
86
+ {
87
+ "name": "Celebrate",
88
+ "title": "Celebrate",
89
+ "code": "import React, { useRef, useState } from 'react';\nimport { Pressable, Text, View } from 'react-native';\nimport { Confetti, type ConfettiHandle } from '@/components/ui/confetti';\nimport { useKit } from '@/lib/kit';\n\nexport default function Celebrate() {\n const { colors, radius } = useKit();\n const confetti = useRef<ConfettiHandle>(null);\n return (\n <View style={{ height: 420, borderRadius: radius.xl, backgroundColor: colors.muted, overflow: 'hidden', alignItems: 'center', justifyContent: 'center', gap: 10, padding: 24 }}>\n <Text style={{ fontSize: 44 }}>🎉</Text>\n <Text style={{ color: colors.foreground, fontSize: 24, fontWeight: '800', letterSpacing: -0.5 }}>Order placed!</Text>\n <Text style={{ color: colors.mutedForeground, fontSize: 14, textAlign: 'center' }}>You saved ₹240 with coupon GLOW50. Arriving Thursday.</Text>\n <Pressable\n onPress={() => confetti.current?.burst()}\n accessibilityRole=\"button\"\n style={{ marginTop: 12, paddingHorizontal: 22, paddingVertical: 13, borderRadius: 999, backgroundColor: colors.primary }}\n >\n <Text style={{ color: colors.primaryForeground, fontSize: 15, fontWeight: '700' }}>Celebrate again</Text>\n </Pressable>\n <Confetti ref={confetti} autoplay />\n </View>\n );\n}\n"
90
+ },
91
+ {
92
+ "name": "Rain",
93
+ "title": "Rain",
94
+ "code": "import React, { useRef, useState } from 'react';\nimport { Pressable, Text, View } from 'react-native';\nimport { Confetti, type ConfettiHandle } from '@/components/ui/confetti';\nimport { useKit } from '@/lib/kit';\n\nexport default function Rain() {\n const { colors, radius } = useKit();\n const [shower, setShower] = useState(0);\n return (\n <View style={{ height: 360, borderRadius: radius.xl, backgroundColor: colors.muted, overflow: 'hidden', alignItems: 'center', justifyContent: 'center' }}>\n <Pressable onPress={() => setShower((n) => n + 1)} accessibilityRole=\"button\" style={{ paddingHorizontal: 22, paddingVertical: 13, borderRadius: 999, borderWidth: 1.5, borderColor: colors.foreground }}>\n <Text style={{ color: colors.foreground, fontSize: 15, fontWeight: '700' }}>Make it rain</Text>\n </Pressable>\n <Confetti origin=\"top\" count={120} trigger={shower} colors={['#ffd23f', '#ffb000', '#fff3b0', '#ffffff']} />\n </View>\n );\n}\n"
95
+ },
96
+ {
97
+ "name": "TapToPop",
98
+ "title": "Tap To Pop",
99
+ "code": "import React, { useRef, useState } from 'react';\nimport { Pressable, Text, View } from 'react-native';\nimport { Confetti, type ConfettiHandle } from '@/components/ui/confetti';\nimport { useKit } from '@/lib/kit';\n\nexport default function TapToPop() {\n const { colors, radius } = useKit();\n const confetti = useRef<ConfettiHandle>(null);\n return (\n <Pressable\n onPress={(e) => confetti.current?.burst({ origin: 'center', x: e.nativeEvent.locationX, y: e.nativeEvent.locationY, count: 50 })}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Tap to pop confetti\"\n style={{ height: 360, borderRadius: radius.xl, backgroundColor: colors.muted, overflow: 'hidden', alignItems: 'center', justifyContent: 'center' }}\n >\n {/* Not touchable, so locationX/Y are always relative to the panel. */}\n <View pointerEvents=\"none\">\n <Text style={{ color: colors.mutedForeground, fontSize: 15, fontWeight: '600' }}>Tap anywhere</Text>\n </View>\n <Confetti ref={confetti} />\n </Pressable>\n );\n}\n"
100
+ }
101
+ ]
102
+ }
@@ -0,0 +1,192 @@
1
+ {
2
+ "name": "coupon",
3
+ "category": "Coupons",
4
+ "aliases": [],
5
+ "exportName": "Coupon",
6
+ "files": [
7
+ "src/components/ui/coupon.tsx"
8
+ ],
9
+ "summary": "A perforated coupon with a copyable code that can tilt in 3D and flip to its terms.",
10
+ "props": [
11
+ [
12
+ "value",
13
+ "string",
14
+ "—",
15
+ "The headline: \"50%\", \"₹200\", \"FREE\", \"BOGO\"."
16
+ ],
17
+ [
18
+ "unit / prefix",
19
+ "string",
20
+ "—",
21
+ "Under / above the value: \"OFF\", \"FLAT\", \"UP TO\"."
22
+ ],
23
+ [
24
+ "title / description",
25
+ "string",
26
+ "—",
27
+ "What the offer is and its conditions."
28
+ ],
29
+ [
30
+ "code",
31
+ "string",
32
+ "—",
33
+ "Promo code in a dashed chip — tap to copy when onCopy is set."
34
+ ],
35
+ [
36
+ "brand / logo",
37
+ "string / ReactNode",
38
+ "—",
39
+ "Who it's from."
40
+ ],
41
+ [
42
+ "expires",
43
+ "string",
44
+ "—",
45
+ "Expiry line (\"Valid till 31 Dec\")."
46
+ ],
47
+ [
48
+ "expiresAt",
49
+ "Date | number",
50
+ "—",
51
+ "Live countdown (\"Ends in 05:42:10\"); turns expired when it passes."
52
+ ],
53
+ [
54
+ "terms",
55
+ "string[]",
56
+ "—",
57
+ "Shown on the back — the T&C link turns the coupon over."
58
+ ],
59
+ [
60
+ "status",
61
+ "\"available\" | \"applied\" | \"used\" | \"expired\" | \"locked\"",
62
+ "\"available\"",
63
+ "Applied shows a green ring; used / expired dim with a stamp; locked goes grey."
64
+ ],
65
+ [
66
+ "lockedHint",
67
+ "string",
68
+ "—",
69
+ "Why it's locked (\"Add ₹120 more to unlock\")."
70
+ ],
71
+ [
72
+ "theme",
73
+ "\"sunset\" | \"candy\" | \"ocean\" | \"lime\" | \"gold\" | \"fire\" | \"neon\" | \"ink\" | \"paper\" | \"holo\" | CouponTheme",
74
+ "\"sunset\"",
75
+ "Preset, or { fill, ink, accent?, body?, bodyInk?, pattern? } — fill can be a gradient."
76
+ ],
77
+ [
78
+ "pattern",
79
+ "\"none\" | \"dots\" | \"stripes\" | \"grid\" | \"waves\" | \"sunburst\" | \"confetti\"",
80
+ "theme's",
81
+ "Texture on the value panel."
82
+ ],
83
+ [
84
+ "layout",
85
+ "\"horizontal\" | \"vertical\"",
86
+ "\"horizontal\"",
87
+ "Value panel on the left, or on top."
88
+ ],
89
+ [
90
+ "variant",
91
+ "\"ticket\" | \"stamp\" | \"receipt\" | \"scallop\" | \"cutout\"",
92
+ "\"ticket\"",
93
+ "Outline: notches, perforations, torn zigzag ends, wavy edges, or a dashed cut-here line."
94
+ ],
95
+ [
96
+ "size",
97
+ "\"sm\" | \"md\" | \"lg\"",
98
+ "\"md\"",
99
+ "Compact for long lists, large for a hero."
100
+ ],
101
+ [
102
+ "shine",
103
+ "boolean",
104
+ "false",
105
+ "A light sweep across the value panel every few seconds."
106
+ ],
107
+ [
108
+ "tilt / holo / idle",
109
+ "boolean",
110
+ "false",
111
+ "3D tilt toward the finger; rainbow foil sheen; slow sway at rest."
112
+ ],
113
+ [
114
+ "onCopy",
115
+ "(code) => void",
116
+ "—",
117
+ "Called from the code chip — wire it to expo-clipboard."
118
+ ],
119
+ [
120
+ "onApply",
121
+ "() => void",
122
+ "—",
123
+ "Shows the Apply button."
124
+ ],
125
+ [
126
+ "onPress",
127
+ "() => void",
128
+ "—",
129
+ "Tap on the coupon itself (open details, select it)."
130
+ ],
131
+ [
132
+ "flipped / defaultFlipped / onFlip",
133
+ "boolean / boolean / (flipped) => void",
134
+ "— / false / —",
135
+ "Controlled or uncontrolled side."
136
+ ],
137
+ [
138
+ "labels",
139
+ "{ copy?, copied?, apply?, applied?, used?, expired?, locked?, endsIn?, terms?, termsTitle?, back? }",
140
+ "English",
141
+ "Every built-in string, for translation."
142
+ ],
143
+ [
144
+ "style",
145
+ "StyleProp<ViewStyle>",
146
+ "—",
147
+ "Width, margins."
148
+ ]
149
+ ],
150
+ "behavior": [
151
+ [
152
+ "Touch",
153
+ "Tapping the code chip calls onCopy and flips its icon to a check. The T&C link turns the coupon over to its terms."
154
+ ],
155
+ [
156
+ "Motion",
157
+ "With tilt it leans toward your finger with a moving reflection, holo adds a rainbow sheen, and shine sweeps light across the value panel."
158
+ ],
159
+ [
160
+ "Screen readers",
161
+ "The code chip is a button that reads the copy label and the code. Apply is a button with disabled and selected state."
162
+ ]
163
+ ],
164
+ "usage": "import { Coupon } from '@/components/ui/coupon';\n\n<Coupon\n value=\"50%\"\n unit=\"Off\"\n title=\"Your first order, on us\"\n code=\"GLOW50\"\n onApply={applyCoupon}\n/>",
165
+ "examples": [
166
+ {
167
+ "name": "Hero",
168
+ "title": "Hero",
169
+ "code": "import React, { useRef, useState } from 'react';\nimport { Image, Pressable, Text, View } from 'react-native';\nimport { Confetti, type ConfettiHandle } from '@/components/ui/confetti';\nimport { Coupon } from '@/components/ui/coupon';\nimport { useKit } from '@/lib/kit';\n\nconst logo = (id: number) => <Image alt=\"\" source={{ uri: `https://picsum.photos/id/${id}/64/64` }} style={{ width: 18, height: 18, borderRadius: 5 }} />;\n\nexport default function Hero() {\n const { colors } = useKit();\n const [applied, setApplied] = useState(false);\n const confetti = useRef<ConfettiHandle>(null);\n return (\n <View style={{ gap: 14, paddingVertical: 8 }}>\n <View>\n <Text style={{ color: colors.foreground, fontSize: 22, fontWeight: '800', letterSpacing: -0.5 }}>Just for you</Text>\n <Text style={{ color: colors.mutedForeground, fontSize: 13 }}>Tilt the coupon · tap T&C to flip it</Text>\n </View>\n <Coupon\n tilt\n holo\n idle\n shine\n theme=\"candy\"\n size=\"lg\"\n brand=\"Glow Beauty\"\n logo={logo(64)}\n prefix=\"Flat\"\n value=\"50%\"\n unit=\"Off\"\n title=\"Your first order, on us\"\n description=\"Up to ₹300 off on skincare & makeup\"\n code=\"GLOW50\"\n expires=\"Valid till 31 Dec\"\n terms={['Min. order ₹699', 'Once per account', 'Not valid on gift cards', 'Can’t be combined with other offers']}\n status={applied ? 'applied' : 'available'}\n onCopy={() => {}}\n onApply={() => {\n setApplied(true);\n confetti.current?.burst();\n }}\n />\n {applied ? (\n <Pressable onPress={() => setApplied(false)} accessibilityRole=\"button\" style={{ alignSelf: 'center', padding: 8 }}>\n <Text style={{ color: colors.mutedForeground, fontSize: 13, fontWeight: '600' }}>Remove coupon</Text>\n </Pressable>\n ) : null}\n <Confetti ref={confetti} />\n </View>\n );\n}\n"
170
+ },
171
+ {
172
+ "name": "OffersList",
173
+ "title": "Offers List",
174
+ "code": "import React, { useRef, useState } from 'react';\nimport { Image, Pressable, Text, View } from 'react-native';\nimport { Coupon } from '@/components/ui/coupon';\nimport { useKit } from '@/lib/kit';\n\nconst logo = (id: number) => <Image alt=\"\" source={{ uri: `https://picsum.photos/id/${id}/64/64` }} style={{ width: 18, height: 18, borderRadius: 5 }} />;\n\nexport default function OffersList() {\n const { colors } = useKit();\n const [applied, setApplied] = useState<string | null>('SWIGGY60');\n const [soon] = useState(() => Date.now() + 2 * 3600_000 + 14 * 60_000);\n return (\n <View style={{ gap: 14 }}>\n <Text style={{ color: colors.foreground, fontSize: 18, fontWeight: '800' }}>Offers for you</Text>\n <Coupon\n theme=\"fire\"\n brand=\"Swiggy\"\n logo={logo(292)}\n value=\"60%\"\n unit=\"Off\"\n title=\"Up to ₹120 on your next meal\"\n code=\"SWIGGY60\"\n expiresAt={soon}\n status={applied === 'SWIGGY60' ? 'applied' : 'available'}\n onCopy={() => {}}\n onApply={() => setApplied('SWIGGY60')}\n />\n <Coupon\n theme=\"ocean\"\n variant=\"stamp\"\n brand=\"HDFC Bank\"\n prefix=\"Instant\"\n value=\"₹250\"\n unit=\"Off\"\n title=\"On HDFC credit cards\"\n description=\"Orders above ₹1,500\"\n code=\"HDFC250\"\n status={applied === 'HDFC250' ? 'applied' : 'available'}\n onCopy={() => {}}\n onApply={() => setApplied('HDFC250')}\n />\n <Coupon\n theme=\"lime\"\n variant=\"receipt\"\n brand=\"BigBasket\"\n value=\"FREE\"\n unit=\"Delivery\"\n title=\"Free delivery on groceries\"\n code=\"FREEDEL\"\n status=\"locked\"\n lockedHint=\"Add ₹120 more to unlock\"\n onApply={() => {}}\n />\n <Coupon theme=\"ink\" variant=\"scallop\" brand=\"Myntra\" value=\"BOGO\" unit=\"Deal\" title=\"Buy 1 get 1 on tees\" code=\"BOGOTEE\" status=\"expired\" onApply={() => {}} />\n </View>\n );\n}\n"
175
+ },
176
+ {
177
+ "name": "Shapes",
178
+ "title": "Shapes",
179
+ "code": "import { Image, Pressable, Text, View } from 'react-native';\nimport { Coupon } from '@/components/ui/coupon';\n\nexport default function Shapes() {\n return (\n <View style={{ gap: 14 }}>\n <Coupon size=\"sm\" theme=\"sunset\" variant=\"ticket\" value=\"30%\" unit=\"Off\" title=\"Ticket — classic notches\" code=\"TICKET30\" onCopy={() => {}} />\n <Coupon size=\"sm\" theme=\"ocean\" variant=\"stamp\" value=\"₹99\" unit=\"Off\" title=\"Stamp — perforated edges\" code=\"STAMP99\" onCopy={() => {}} />\n <Coupon size=\"sm\" theme=\"gold\" variant=\"receipt\" value=\"2X\" unit=\"Points\" title=\"Receipt — torn zigzag ends\" code=\"RECEIPT2X\" onCopy={() => {}} />\n <Coupon size=\"sm\" theme=\"candy\" variant=\"scallop\" value=\"FREE\" unit=\"Gift\" title=\"Scallop — wavy edges\" code=\"SCALLOP\" onCopy={() => {}} />\n <Coupon size=\"sm\" theme=\"paper\" variant=\"cutout\" value=\"25%\" unit=\"Off\" title=\"Cut-out — clip along the line\" code=\"CLIPME25\" onCopy={() => {}} />\n </View>\n );\n}\n"
180
+ },
181
+ {
182
+ "name": "Grid",
183
+ "title": "Grid",
184
+ "code": "import { Image, Pressable, Text, View } from 'react-native';\nimport { Coupon } from '@/components/ui/coupon';\n\nexport default function Grid() {\n const offers = [\n { theme: 'neon' as const, brand: 'Paytm', value: '₹100', unit: 'Cashback', title: 'On UPI payments', code: 'PAYTM100' },\n { theme: 'gold' as const, brand: 'Amex', value: '10%', unit: 'Off', title: 'Weekend dining', code: 'AMEX10' },\n { theme: 'sunset' as const, brand: 'Zomato', value: '₹75', unit: 'Off', title: 'Orders above ₹299', code: 'ZOMATO75' },\n { theme: 'holo' as const, brand: 'Nykaa', value: '3X', unit: 'Points', title: 'This weekend only', code: 'NYKAA3X' },\n ];\n return (\n <View style={{ flexDirection: 'row', flexWrap: 'wrap', gap: 12 }}>\n {offers.map((o) => (\n <Coupon key={o.code} {...o} layout=\"vertical\" size=\"sm\" variant={o.theme === 'gold' ? 'stamp' : 'ticket'} onCopy={() => {}} style={{ width: '47%', flexGrow: 1 }} />\n ))}\n </View>\n );\n}\n"
185
+ },
186
+ {
187
+ "name": "FlashSale",
188
+ "title": "Flash Sale",
189
+ "code": "import React, { useRef, useState } from 'react';\nimport { Image, Pressable, Text, View } from 'react-native';\nimport { Coupon } from '@/components/ui/coupon';\nimport { useKit } from '@/lib/kit';\n\nexport default function FlashSale() {\n const { colors } = useKit();\n const [ends, setEnds] = useState(() => Date.now() + 47_000);\n return (\n <View style={{ gap: 14 }}>\n <Coupon\n theme=\"sunset\"\n layout=\"vertical\"\n size=\"lg\"\n shine\n brand=\"Flash sale\"\n prefix=\"Extra\"\n value=\"70%\"\n unit=\"Off\"\n title=\"Sneakers · next 47 seconds\"\n description=\"Ends when the timer does — no extensions\"\n code=\"FLASH70\"\n expiresAt={ends}\n onCopy={() => {}}\n onApply={() => {}}\n />\n <Pressable onPress={() => setEnds(Date.now() + 47_000)} accessibilityRole=\"button\" style={{ alignSelf: 'center', padding: 8 }}>\n <Text style={{ color: colors.mutedForeground, fontSize: 13, fontWeight: '600' }}>Restart timer</Text>\n </Pressable>\n </View>\n );\n}\n"
190
+ }
191
+ ]
192
+ }
@@ -0,0 +1,100 @@
1
+ {
2
+ "name": "cube-pager",
3
+ "category": "3D",
4
+ "aliases": [],
5
+ "exportName": "CubePager",
6
+ "files": [
7
+ "src/components/ui/cube-pager.tsx"
8
+ ],
9
+ "summary": "Swipeable pages that turn like the faces of a cube, with flick momentum.",
10
+ "props": [
11
+ [
12
+ "children",
13
+ "ReactNode",
14
+ "—",
15
+ "One child per page."
16
+ ],
17
+ [
18
+ "height",
19
+ "number",
20
+ "260",
21
+ "Page height."
22
+ ],
23
+ [
24
+ "effect",
25
+ "\"cube\" | \"inside\" | \"flip\"",
26
+ "\"cube\"",
27
+ "Outside of a cube, its inner walls, or each page spinning in place."
28
+ ],
29
+ [
30
+ "index",
31
+ "number",
32
+ "—",
33
+ "Controlled page."
34
+ ],
35
+ [
36
+ "defaultIndex",
37
+ "number",
38
+ "0",
39
+ "Uncontrolled initial page."
40
+ ],
41
+ [
42
+ "onIndexChange",
43
+ "(index: number) => void",
44
+ "—",
45
+ "Fires when the page changes."
46
+ ],
47
+ [
48
+ "pagination",
49
+ "boolean",
50
+ "true",
51
+ "Dots under the pager."
52
+ ],
53
+ [
54
+ "shade",
55
+ "boolean",
56
+ "true",
57
+ "Darken faces as they turn away."
58
+ ],
59
+ [
60
+ "accent",
61
+ "string",
62
+ "theme foreground",
63
+ "Active dot colour."
64
+ ],
65
+ [
66
+ "radius",
67
+ "number",
68
+ "20",
69
+ "Corner radius of the pages."
70
+ ],
71
+ [
72
+ "disabled",
73
+ "boolean",
74
+ "false",
75
+ "Turn swiping off (dots and a controlled index still work)."
76
+ ],
77
+ [
78
+ "style",
79
+ "StyleProp<ViewStyle>",
80
+ "—",
81
+ "Style for the root view."
82
+ ]
83
+ ],
84
+ "behavior": [
85
+ [
86
+ "Touch",
87
+ "Pages follow your finger. A quick flick or a drag past 35% turns the page, and the first and last pages rubber-band."
88
+ ],
89
+ [
90
+ "Motion",
91
+ "Pages rotate around their shared edge in 3D (cube, inside or flip) and darken as they turn away when shade is on."
92
+ ],
93
+ [
94
+ "Screen readers",
95
+ "The pager is adjustable with a \"2 / 5\" value and increment and decrement actions. Off-screen pages are hidden and dots are buttons."
96
+ ]
97
+ ],
98
+ "usage": null,
99
+ "examples": []
100
+ }
@@ -0,0 +1,123 @@
1
+ {
2
+ "name": "dashboard",
3
+ "category": "Blocks",
4
+ "aliases": [],
5
+ "exportName": "Dashboard",
6
+ "files": [
7
+ "src/components/blocks/dashboard.tsx"
8
+ ],
9
+ "summary": null,
10
+ "props": [
11
+ [
12
+ "data",
13
+ "{ userName?, avatar?, periods: Record<'day' | 'week' | 'month', { revenue, delta, series, labels?, kpis }>, transactions }",
14
+ "sample merchant",
15
+ "Everything the screen shows. KPIs: { id, label, value, format?: 'money' | 'count' | 'percent', delta?, trend?, invert? }. Transactions: { id, title, subtitle?, amount (signed), category?, pending? }."
16
+ ],
17
+ [
18
+ "currency",
19
+ "string",
20
+ "'₹'",
21
+ "Symbol placed before money values."
22
+ ],
23
+ [
24
+ "formatMoney",
25
+ "(value: number) => string",
26
+ "—",
27
+ "Custom money formatter (overrides currency), e.g. Intl.NumberFormat or en-IN grouping."
28
+ ],
29
+ [
30
+ "title",
31
+ "string",
32
+ "'Overview'",
33
+ "Large title."
34
+ ],
35
+ [
36
+ "defaultPeriod / period",
37
+ "'day' | 'week' | 'month'",
38
+ "'week'",
39
+ "Uncontrolled initial period, or controlled period."
40
+ ],
41
+ [
42
+ "onPeriodChange",
43
+ "(period) => void",
44
+ "—",
45
+ "Segmented control changed."
46
+ ],
47
+ [
48
+ "loading",
49
+ "boolean",
50
+ "false",
51
+ "Shows skeleton placeholders for the chart, KPIs, actions and transactions."
52
+ ],
53
+ [
54
+ "onRefresh",
55
+ "() => void | Promise",
56
+ "—",
57
+ "Enables pull-to-refresh; a returned promise keeps the spinner until it settles."
58
+ ],
59
+ [
60
+ "refreshing",
61
+ "boolean",
62
+ "—",
63
+ "Controlled refreshing flag."
64
+ ],
65
+ [
66
+ "quickActions",
67
+ "{ id, label, icon: 'send' | 'request' | 'topup' | 'cards' | 'more' }[]",
68
+ "Send · Request · Top up · Cards",
69
+ "Round shortcut buttons under the KPIs."
70
+ ],
71
+ [
72
+ "onQuickAction",
73
+ "(action) => void",
74
+ "—",
75
+ "A quick action was tapped."
76
+ ],
77
+ [
78
+ "onSelectTransaction",
79
+ "(transaction) => void",
80
+ "—",
81
+ "Makes transaction rows pressable."
82
+ ],
83
+ [
84
+ "onSeeAllTransactions",
85
+ "() => void",
86
+ "—",
87
+ "Shows a “See all” link beside the section heading."
88
+ ],
89
+ [
90
+ "onSelectKpi",
91
+ "(kpi) => void",
92
+ "—",
93
+ "Makes KPI tiles pressable."
94
+ ],
95
+ [
96
+ "onPressAvatar / onPressNotifications",
97
+ "() => void",
98
+ "—",
99
+ "Header avatar and bell."
100
+ ],
101
+ [
102
+ "notificationBadge",
103
+ "boolean | number",
104
+ "—",
105
+ "Red dot on the bell."
106
+ ],
107
+ [
108
+ "accent",
109
+ "string",
110
+ "theme accent",
111
+ "Chart, quick action and refresh colour."
112
+ ],
113
+ [
114
+ "style",
115
+ "StyleProp<ViewStyle>",
116
+ "—",
117
+ "Root style."
118
+ ]
119
+ ],
120
+ "behavior": [],
121
+ "usage": null,
122
+ "examples": []
123
+ }