@expokit/cli 0.0.0-stage → 0.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 (302) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +32 -2
  3. package/bin/expo-kit.js +1204 -0
  4. package/bin/lib.mjs +343 -0
  5. package/bin/mcp.mjs +338 -0
  6. package/package.json +44 -4
  7. package/registry/_docs/accordion.json +99 -0
  8. package/registry/_docs/action-sheet.json +110 -0
  9. package/registry/_docs/alert.json +127 -0
  10. package/registry/_docs/avatar.json +203 -0
  11. package/registry/_docs/badge.json +117 -0
  12. package/registry/_docs/bottom-nav.json +119 -0
  13. package/registry/_docs/bottom-sheet.json +158 -0
  14. package/registry/_docs/bullet.json +24 -0
  15. package/registry/_docs/button-3d.json +122 -0
  16. package/registry/_docs/button.json +115 -0
  17. package/registry/_docs/calendar.json +182 -0
  18. package/registry/_docs/card-stack.json +108 -0
  19. package/registry/_docs/card.json +111 -0
  20. package/registry/_docs/carousel.json +102 -0
  21. package/registry/_docs/checkbox.json +93 -0
  22. package/registry/_docs/checkout.json +102 -0
  23. package/registry/_docs/chip-group.json +116 -0
  24. package/registry/_docs/color-swatch.json +66 -0
  25. package/registry/_docs/confetti.json +82 -0
  26. package/registry/_docs/coupon.json +176 -0
  27. package/registry/_docs/cube-pager.json +84 -0
  28. package/registry/_docs/dashboard.json +120 -0
  29. package/registry/_docs/date-picker.json +249 -0
  30. package/registry/_docs/dialog.json +162 -0
  31. package/registry/_docs/drawer.json +171 -0
  32. package/registry/_docs/fab.json +120 -0
  33. package/registry/_docs/flip-card.json +111 -0
  34. package/registry/_docs/floating-input.json +191 -0
  35. package/registry/_docs/gift-card.json +108 -0
  36. package/registry/_docs/glass-button.json +118 -0
  37. package/registry/_docs/glass-nav-bar.json +78 -0
  38. package/registry/_docs/glass-search-bar.json +90 -0
  39. package/registry/_docs/glass-segmented.json +66 -0
  40. package/registry/_docs/glass-sheet.json +108 -0
  41. package/registry/_docs/glass-tab-bar.json +76 -0
  42. package/registry/_docs/glass.json +78 -0
  43. package/registry/_docs/inbox.json +72 -0
  44. package/registry/_docs/isometric-bar.json +72 -0
  45. package/registry/_docs/kit.json +11 -0
  46. package/registry/_docs/kpi-card.json +11 -0
  47. package/registry/_docs/like-button.json +72 -0
  48. package/registry/_docs/liquidglass-tab.json +27 -0
  49. package/registry/_docs/list-item.json +200 -0
  50. package/registry/_docs/loyalty-card.json +108 -0
  51. package/registry/_docs/morph-button.json +108 -0
  52. package/registry/_docs/number-ticker.json +96 -0
  53. package/registry/_docs/offers.json +78 -0
  54. package/registry/_docs/onboarding.json +66 -0
  55. package/registry/_docs/otp-input.json +134 -0
  56. package/registry/_docs/pagination-dots.json +88 -0
  57. package/registry/_docs/parallax-layers.json +84 -0
  58. package/registry/_docs/parallax-scroll.json +186 -0
  59. package/registry/_docs/password-input.json +92 -0
  60. package/registry/_docs/payment-card.json +153 -0
  61. package/registry/_docs/pixel-bar.json +66 -0
  62. package/registry/_docs/polar-area.json +78 -0
  63. package/registry/_docs/profile.json +84 -0
  64. package/registry/_docs/progress-steps.json +92 -0
  65. package/registry/_docs/progress.json +132 -0
  66. package/registry/_docs/radio-group.json +92 -0
  67. package/registry/_docs/rating.json +90 -0
  68. package/registry/_docs/ring-carousel.json +102 -0
  69. package/registry/_docs/scratch-card.json +90 -0
  70. package/registry/_docs/search-bar.json +140 -0
  71. package/registry/_docs/search-results.json +120 -0
  72. package/registry/_docs/segmented-control.json +103 -0
  73. package/registry/_docs/select.json +252 -0
  74. package/registry/_docs/settings.json +72 -0
  75. package/registry/_docs/shimmer-button.json +78 -0
  76. package/registry/_docs/sign-in.json +198 -0
  77. package/registry/_docs/skeleton.json +142 -0
  78. package/registry/_docs/slide-to-confirm.json +84 -0
  79. package/registry/_docs/slider.json +157 -0
  80. package/registry/_docs/spin-wheel.json +114 -0
  81. package/registry/_docs/spinner.json +91 -0
  82. package/registry/_docs/stepper.json +168 -0
  83. package/registry/_docs/swipe-deck.json +102 -0
  84. package/registry/_docs/swipeable-row.json +72 -0
  85. package/registry/_docs/switch.json +104 -0
  86. package/registry/_docs/tabs.json +105 -0
  87. package/registry/_docs/tag-input.json +128 -0
  88. package/registry/_docs/textarea.json +175 -0
  89. package/registry/_docs/ticket-card.json +174 -0
  90. package/registry/_docs/ticket-shape.json +11 -0
  91. package/registry/_docs/tilt-card.json +141 -0
  92. package/registry/_docs/time-picker.json +253 -0
  93. package/registry/_docs/timeline-chart.json +30 -0
  94. package/registry/_docs/timeline.json +156 -0
  95. package/registry/_docs/toast.json +161 -0
  96. package/registry/_docs/treemap.json +30 -0
  97. package/registry/_docs/waterfall.json +36 -0
  98. package/registry/_docs/wheel-list.json +102 -0
  99. package/registry/accordion/files/src/components/ui/accordion.tsx +233 -0
  100. package/registry/accordion/files/src/lib/kit.tsx +219 -0
  101. package/registry/accordion.json +17 -0
  102. package/registry/action-sheet/files/src/components/ui/action-sheet.tsx +580 -0
  103. package/registry/action-sheet/files/src/lib/kit.tsx +219 -0
  104. package/registry/action-sheet.json +18 -0
  105. package/registry/alert/files/src/components/ui/alert.tsx +654 -0
  106. package/registry/alert/files/src/components/ui/button.tsx +274 -0
  107. package/registry/alert/files/src/lib/kit.tsx +219 -0
  108. package/registry/alert.json +20 -0
  109. package/registry/avatar/files/src/components/ui/avatar.tsx +790 -0
  110. package/registry/avatar/files/src/lib/kit.tsx +219 -0
  111. package/registry/avatar.json +18 -0
  112. package/registry/badge/files/src/components/ui/badge.tsx +316 -0
  113. package/registry/badge/files/src/lib/kit.tsx +219 -0
  114. package/registry/badge.json +17 -0
  115. package/registry/bottom-nav/files/src/components/ui/bottom-nav.tsx +1050 -0
  116. package/registry/bottom-nav/files/src/lib/kit.tsx +219 -0
  117. package/registry/bottom-nav.json +18 -0
  118. package/registry/bottom-sheet/files/src/components/ui/bottom-sheet.tsx +585 -0
  119. package/registry/bottom-sheet/files/src/lib/kit.tsx +219 -0
  120. package/registry/bottom-sheet.json +17 -0
  121. package/registry/bullet.json +14 -0
  122. package/registry/button/files/src/components/ui/button.tsx +274 -0
  123. package/registry/button/files/src/lib/kit.tsx +219 -0
  124. package/registry/button-3d/files/src/components/ui/button-3d.tsx +212 -0
  125. package/registry/button-3d/files/src/lib/kit.tsx +219 -0
  126. package/registry/button-3d.json +18 -0
  127. package/registry/button.json +18 -0
  128. package/registry/calendar/files/src/components/ui/calendar.tsx +822 -0
  129. package/registry/calendar/files/src/lib/kit.tsx +219 -0
  130. package/registry/calendar.json +17 -0
  131. package/registry/card/files/src/components/ui/card.tsx +300 -0
  132. package/registry/card/files/src/lib/kit.tsx +219 -0
  133. package/registry/card-stack.json +15 -0
  134. package/registry/card.json +17 -0
  135. package/registry/carousel.json +15 -0
  136. package/registry/checkbox/files/src/components/ui/checkbox.tsx +150 -0
  137. package/registry/checkbox/files/src/lib/kit.tsx +219 -0
  138. package/registry/checkbox.json +17 -0
  139. package/registry/checkout.json +26 -0
  140. package/registry/chip-group/files/src/components/ui/chip-group.tsx +269 -0
  141. package/registry/chip-group/files/src/lib/kit.tsx +219 -0
  142. package/registry/chip-group.json +17 -0
  143. package/registry/color-swatch.json +17 -0
  144. package/registry/confetti/files/src/components/ui/confetti.tsx +222 -0
  145. package/registry/confetti/files/src/lib/kit.tsx +219 -0
  146. package/registry/confetti.json +15 -0
  147. package/registry/coupon/files/src/components/ui/coupon.tsx +698 -0
  148. package/registry/coupon/files/src/components/ui/flip-card.tsx +205 -0
  149. package/registry/coupon/files/src/components/ui/tilt-card.tsx +635 -0
  150. package/registry/coupon/files/src/lib/kit.tsx +219 -0
  151. package/registry/coupon/files/src/lib/ticket-shape.tsx +543 -0
  152. package/registry/coupon.json +23 -0
  153. package/registry/cube-pager.json +15 -0
  154. package/registry/dashboard.json +32 -0
  155. package/registry/date-picker/files/src/components/ui/calendar.tsx +822 -0
  156. package/registry/date-picker/files/src/components/ui/date-picker.tsx +796 -0
  157. package/registry/date-picker/files/src/lib/kit.tsx +219 -0
  158. package/registry/date-picker.json +19 -0
  159. package/registry/dialog/files/src/components/ui/dialog.tsx +759 -0
  160. package/registry/dialog/files/src/lib/kit.tsx +219 -0
  161. package/registry/dialog.json +18 -0
  162. package/registry/drawer/files/src/components/ui/drawer.tsx +1135 -0
  163. package/registry/drawer/files/src/lib/kit.tsx +219 -0
  164. package/registry/drawer.json +18 -0
  165. package/registry/fab.json +18 -0
  166. package/registry/flip-card/files/src/components/ui/flip-card.tsx +205 -0
  167. package/registry/flip-card/files/src/lib/kit.tsx +219 -0
  168. package/registry/flip-card.json +15 -0
  169. package/registry/floating-input/files/src/components/ui/floating-input.tsx +528 -0
  170. package/registry/floating-input/files/src/lib/kit.tsx +219 -0
  171. package/registry/floating-input.json +17 -0
  172. package/registry/gift-card.json +21 -0
  173. package/registry/glass-button.json +22 -0
  174. package/registry/glass-nav-bar.json +21 -0
  175. package/registry/glass-search-bar.json +21 -0
  176. package/registry/glass-segmented.json +22 -0
  177. package/registry/glass-sheet.json +22 -0
  178. package/registry/glass-tab-bar.json +22 -0
  179. package/registry/glass.json +19 -0
  180. package/registry/inbox.json +30 -0
  181. package/registry/isometric-bar.json +14 -0
  182. package/registry/kit/files/src/lib/kit.tsx +219 -0
  183. package/registry/kit.json +11 -0
  184. package/registry/kpi-card/files/src/components/charts/kpi-card.tsx +45 -0
  185. package/registry/kpi-card.json +14 -0
  186. package/registry/like-button.json +18 -0
  187. package/registry/liquidglass-tab/files/src/app/(tabs)/_layout.tsx +97 -0
  188. package/registry/liquidglass-tab/files/src/app/(tabs)/alerts.tsx +5 -0
  189. package/registry/liquidglass-tab/files/src/app/(tabs)/explore.tsx +5 -0
  190. package/registry/liquidglass-tab/files/src/app/(tabs)/index.tsx +5 -0
  191. package/registry/liquidglass-tab/files/src/app/(tabs)/profile.tsx +5 -0
  192. package/registry/liquidglass-tab/files/src/app/_layout.tsx +33 -0
  193. package/registry/liquidglass-tab/files/src/components/GlassTabBar.tsx +259 -0
  194. package/registry/liquidglass-tab/files/src/components/TabScreen.tsx +122 -0
  195. package/registry/liquidglass-tab/files/src/lib/tab-bar.ts +61 -0
  196. package/registry/liquidglass-tab/files/src/lib/tab-icons.ts +130 -0
  197. package/registry/liquidglass-tab/files/src/lib/tabs.ts +108 -0
  198. package/registry/liquidglass-tab.json +23 -0
  199. package/registry/list-item/files/src/components/ui/list-item.tsx +508 -0
  200. package/registry/list-item/files/src/lib/kit.tsx +219 -0
  201. package/registry/list-item.json +17 -0
  202. package/registry/loyalty-card.json +23 -0
  203. package/registry/morph-button.json +18 -0
  204. package/registry/number-ticker.json +15 -0
  205. package/registry/offers.json +24 -0
  206. package/registry/onboarding.json +17 -0
  207. package/registry/otp-input/files/src/components/ui/otp-input.tsx +380 -0
  208. package/registry/otp-input/files/src/lib/kit.tsx +219 -0
  209. package/registry/otp-input.json +17 -0
  210. package/registry/pagination-dots/files/src/components/ui/pagination-dots.tsx +262 -0
  211. package/registry/pagination-dots/files/src/lib/kit.tsx +219 -0
  212. package/registry/pagination-dots.json +15 -0
  213. package/registry/parallax-layers.json +15 -0
  214. package/registry/parallax-scroll.json +17 -0
  215. package/registry/password-input/files/src/components/ui/floating-input.tsx +528 -0
  216. package/registry/password-input/files/src/components/ui/password-input.tsx +271 -0
  217. package/registry/password-input/files/src/lib/kit.tsx +219 -0
  218. package/registry/password-input.json +19 -0
  219. package/registry/payment-card/files/src/components/ui/flip-card.tsx +205 -0
  220. package/registry/payment-card/files/src/components/ui/payment-card.tsx +385 -0
  221. package/registry/payment-card/files/src/components/ui/tilt-card.tsx +635 -0
  222. package/registry/payment-card/files/src/lib/kit.tsx +219 -0
  223. package/registry/payment-card.json +21 -0
  224. package/registry/pixel-bar.json +14 -0
  225. package/registry/polar-area.json +14 -0
  226. package/registry/profile.json +17 -0
  227. package/registry/progress/files/src/components/ui/progress.tsx +883 -0
  228. package/registry/progress/files/src/lib/kit.tsx +219 -0
  229. package/registry/progress-steps/files/src/components/ui/progress-steps.tsx +559 -0
  230. package/registry/progress-steps/files/src/lib/kit.tsx +219 -0
  231. package/registry/progress-steps.json +18 -0
  232. package/registry/progress.json +17 -0
  233. package/registry/radio-group/files/src/components/ui/radio-group.tsx +327 -0
  234. package/registry/radio-group/files/src/lib/kit.tsx +219 -0
  235. package/registry/radio-group.json +18 -0
  236. package/registry/rating.json +18 -0
  237. package/registry/ring-carousel.json +15 -0
  238. package/registry/scratch-card.json +18 -0
  239. package/registry/search-bar/files/src/components/ui/search-bar.tsx +530 -0
  240. package/registry/search-bar/files/src/lib/kit.tsx +219 -0
  241. package/registry/search-bar.json +17 -0
  242. package/registry/search-results.json +30 -0
  243. package/registry/segmented-control/files/src/components/ui/segmented-control.tsx +341 -0
  244. package/registry/segmented-control/files/src/lib/kit.tsx +219 -0
  245. package/registry/segmented-control.json +18 -0
  246. package/registry/select/files/src/components/ui/select.tsx +1398 -0
  247. package/registry/select/files/src/lib/kit.tsx +219 -0
  248. package/registry/select.json +17 -0
  249. package/registry/settings.json +26 -0
  250. package/registry/shimmer-button.json +17 -0
  251. package/registry/sign-in.json +26 -0
  252. package/registry/skeleton/files/src/components/ui/skeleton.tsx +799 -0
  253. package/registry/skeleton/files/src/lib/kit.tsx +219 -0
  254. package/registry/skeleton.json +17 -0
  255. package/registry/slide-to-confirm.json +18 -0
  256. package/registry/slider/files/src/components/ui/slider.tsx +716 -0
  257. package/registry/slider/files/src/lib/kit.tsx +219 -0
  258. package/registry/slider.json +17 -0
  259. package/registry/spin-wheel.json +18 -0
  260. package/registry/spinner/files/src/components/ui/spinner.tsx +335 -0
  261. package/registry/spinner/files/src/lib/kit.tsx +219 -0
  262. package/registry/spinner.json +17 -0
  263. package/registry/stepper/files/src/components/ui/stepper.tsx +646 -0
  264. package/registry/stepper/files/src/lib/kit.tsx +219 -0
  265. package/registry/stepper.json +17 -0
  266. package/registry/swipe-deck.json +15 -0
  267. package/registry/swipeable-row.json +15 -0
  268. package/registry/switch/files/src/components/ui/switch.tsx +344 -0
  269. package/registry/switch/files/src/lib/kit.tsx +219 -0
  270. package/registry/switch.json +18 -0
  271. package/registry/tabs/files/src/components/ui/tabs.tsx +539 -0
  272. package/registry/tabs/files/src/lib/kit.tsx +219 -0
  273. package/registry/tabs.json +17 -0
  274. package/registry/tag-input/files/src/components/ui/tag-input.tsx +720 -0
  275. package/registry/tag-input/files/src/lib/kit.tsx +219 -0
  276. package/registry/tag-input.json +17 -0
  277. package/registry/textarea/files/src/components/ui/textarea.tsx +553 -0
  278. package/registry/textarea/files/src/lib/kit.tsx +219 -0
  279. package/registry/textarea.json +17 -0
  280. package/registry/ticket-card.json +24 -0
  281. package/registry/ticket-shape/files/src/lib/kit.tsx +219 -0
  282. package/registry/ticket-shape/files/src/lib/ticket-shape.tsx +543 -0
  283. package/registry/ticket-shape.json +17 -0
  284. package/registry/tilt-card/files/src/components/ui/tilt-card.tsx +635 -0
  285. package/registry/tilt-card/files/src/lib/kit.tsx +219 -0
  286. package/registry/tilt-card.json +17 -0
  287. package/registry/time-picker/files/src/components/ui/time-picker.tsx +1159 -0
  288. package/registry/time-picker/files/src/lib/kit.tsx +219 -0
  289. package/registry/time-picker.json +17 -0
  290. package/registry/timeline/files/src/components/ui/avatar.tsx +790 -0
  291. package/registry/timeline/files/src/components/ui/timeline.tsx +1059 -0
  292. package/registry/timeline/files/src/lib/kit.tsx +219 -0
  293. package/registry/timeline-chart.json +14 -0
  294. package/registry/timeline.json +20 -0
  295. package/registry/toast/files/src/components/ui/button.tsx +274 -0
  296. package/registry/toast/files/src/components/ui/toast.tsx +1284 -0
  297. package/registry/toast/files/src/lib/kit.tsx +219 -0
  298. package/registry/toast.json +20 -0
  299. package/registry/treemap.json +14 -0
  300. package/registry/waterfall.json +14 -0
  301. package/registry/wheel-list.json +17 -0
  302. package/schema/components.schema.json +13 -0
@@ -0,0 +1,92 @@
1
+ {
2
+ "name": "radio-group",
3
+ "category": "Selection",
4
+ "aliases": [],
5
+ "exportName": "RadioGroup",
6
+ "files": [
7
+ "src/components/ui/radio-group.tsx"
8
+ ],
9
+ "props": [
10
+ [
11
+ "options",
12
+ "{ value, label, description?, icon?, hint?, disabled? }[]",
13
+ "—",
14
+ "The choices. `hint` is trailing text such as a price."
15
+ ],
16
+ [
17
+ "value / onValueChange",
18
+ "string",
19
+ "—",
20
+ "Controlled selection (or use defaultValue)."
21
+ ],
22
+ [
23
+ "defaultValue",
24
+ "string",
25
+ "—",
26
+ "Initial selection when uncontrolled."
27
+ ],
28
+ [
29
+ "variant",
30
+ "\"default\" | \"card\" | \"segmented-list\"",
31
+ "\"default\"",
32
+ "Radio dots, selectable cards or a grouped list with ticks."
33
+ ],
34
+ [
35
+ "direction",
36
+ "\"vertical\" | \"horizontal\"",
37
+ "\"vertical\"",
38
+ "Stack or lay out side by side (cards share the width)."
39
+ ],
40
+ [
41
+ "accent",
42
+ "string",
43
+ "theme accent",
44
+ "Selected colour."
45
+ ],
46
+ [
47
+ "haptics",
48
+ "boolean",
49
+ "true",
50
+ "Selection tick on change."
51
+ ],
52
+ [
53
+ "disabled",
54
+ "boolean",
55
+ "false",
56
+ "Disable the whole group (or per option)."
57
+ ],
58
+ [
59
+ "style",
60
+ "StyleProp<ViewStyle>",
61
+ "—",
62
+ "Style for the group container (the bordered card in the segmented-list variant)."
63
+ ]
64
+ ],
65
+ "examples": [
66
+ {
67
+ "name": "Default",
68
+ "title": "Default",
69
+ "code": "import { RadioGroup } from '@/components/ui/radio-group';\n\nexport default function Default() {\n return (\n <RadioGroup\n defaultValue=\"standard\"\n options={[\n { value: 'standard', label: 'Standard shipping', description: '4–6 business days · Free' },\n { value: 'express', label: 'Express', description: '1–2 business days · ₹99' },\n { value: 'pickup', label: 'Pick up in store', description: 'Ready in 2 hours' },\n ]}\n />\n );\n}\n"
70
+ },
71
+ {
72
+ "name": "Horizontal",
73
+ "title": "Horizontal",
74
+ "code": "import React, { useState } from 'react';\nimport { RadioGroup } from '@/components/ui/radio-group';\n\nexport default function Horizontal() {\n const [size, setSize] = useState('m');\n return (\n <RadioGroup\n direction=\"horizontal\"\n value={size}\n onValueChange={setSize}\n accessibilityLabel=\"Cup size\"\n options={[\n { value: 's', label: 'Small' },\n { value: 'm', label: 'Medium' },\n { value: 'l', label: 'Large' },\n ]}\n />\n );\n}\n"
75
+ },
76
+ {
77
+ "name": "Cards",
78
+ "title": "Cards",
79
+ "code": "import { RadioGroup } from '@/components/ui/radio-group';\n\nexport default function Cards() {\n return (\n <RadioGroup\n variant=\"card\"\n defaultValue=\"pro\"\n options={[\n { value: 'starter', label: 'Starter', description: 'For side projects', hint: '₹0' },\n { value: 'pro', label: 'Pro', description: 'Unlimited projects, priority support', hint: '₹499/mo' },\n { value: 'team', label: 'Team', description: 'Shared workspaces and SSO', hint: '₹1,499/mo' },\n ]}\n />\n );\n}\n"
80
+ },
81
+ {
82
+ "name": "CardsHorizontal",
83
+ "title": "Cards Horizontal",
84
+ "code": "import { Text } from 'react-native';\nimport { RadioGroup } from '@/components/ui/radio-group';\n\nexport default function CardsHorizontal() {\n return (\n <RadioGroup\n variant=\"card\"\n direction=\"horizontal\"\n defaultValue=\"card\"\n options={[\n { value: 'card', label: 'Card', description: 'Visa ·· 4242', icon: <Text style={{ fontSize: 20 }}>💳</Text> },\n { value: 'wallet', label: 'Wallet', description: 'Apple Pay', icon: <Text style={{ fontSize: 20 }}>📱</Text> },\n ]}\n />\n );\n}\n"
85
+ },
86
+ {
87
+ "name": "GroupedList",
88
+ "title": "Grouped List",
89
+ "code": "import { RadioGroup } from '@/components/ui/radio-group';\n\nexport default function GroupedList() {\n return (\n <RadioGroup\n variant=\"segmented-list\"\n defaultValue=\"system\"\n accessibilityLabel=\"Appearance\"\n options={[\n { value: 'light', label: 'Light' },\n { value: 'dark', label: 'Dark' },\n { value: 'system', label: 'Automatic', description: 'Follows your device settings' },\n ]}\n />\n );\n}\n"
90
+ }
91
+ ]
92
+ }
@@ -0,0 +1,90 @@
1
+ {
2
+ "name": "rating",
3
+ "category": "Selection",
4
+ "aliases": [],
5
+ "exportName": "Rating",
6
+ "files": [
7
+ "src/components/ui/rating.tsx"
8
+ ],
9
+ "props": [
10
+ [
11
+ "value / onValueChange",
12
+ "number",
13
+ "—",
14
+ "Controlled value (or use defaultValue)."
15
+ ],
16
+ [
17
+ "defaultValue",
18
+ "number",
19
+ "0",
20
+ "Initial value when uncontrolled."
21
+ ],
22
+ [
23
+ "max",
24
+ "number",
25
+ "5",
26
+ "Number of icons."
27
+ ],
28
+ [
29
+ "allowHalf",
30
+ "boolean",
31
+ "false",
32
+ "Half-icon precision when tapping or dragging."
33
+ ],
34
+ [
35
+ "readOnly",
36
+ "boolean",
37
+ "false",
38
+ "Display only; fractional values (4.3) fill partially."
39
+ ],
40
+ [
41
+ "clearable",
42
+ "boolean",
43
+ "false",
44
+ "Tap the current value again to reset to 0."
45
+ ],
46
+ [
47
+ "icon",
48
+ "\"star\" | \"heart\"",
49
+ "\"star\"",
50
+ "Star or heart icons; heart switches the default fill to danger."
51
+ ],
52
+ [
53
+ "size",
54
+ "\"sm\" | \"md\" | \"lg\" | number",
55
+ "\"md\"",
56
+ "18 / 28 / 40pt, or any number."
57
+ ],
58
+ [
59
+ "accent",
60
+ "string",
61
+ "warning / danger",
62
+ "Fill colour."
63
+ ],
64
+ [
65
+ "gap",
66
+ "number",
67
+ "20% of size",
68
+ "Space between icons."
69
+ ],
70
+ [
71
+ "haptics",
72
+ "boolean",
73
+ "true",
74
+ "Selection tick for every step while tapping or dragging."
75
+ ],
76
+ [
77
+ "disabled",
78
+ "boolean",
79
+ "false",
80
+ "Dims and blocks input."
81
+ ],
82
+ [
83
+ "style",
84
+ "StyleProp<ViewStyle>",
85
+ "—",
86
+ "Style for the row of icons."
87
+ ]
88
+ ],
89
+ "examples": []
90
+ }
@@ -0,0 +1,102 @@
1
+ {
2
+ "name": "ring-carousel",
3
+ "category": "3D",
4
+ "aliases": [],
5
+ "exportName": "RingCarousel",
6
+ "files": [
7
+ "src/components/ui/ring-carousel.tsx"
8
+ ],
9
+ "props": [
10
+ [
11
+ "data",
12
+ "T[]",
13
+ "—",
14
+ "Items, one card each."
15
+ ],
16
+ [
17
+ "renderItem",
18
+ "({ item, index, active }) => ReactNode",
19
+ "—",
20
+ "Render a card. `active` is true for the card facing you."
21
+ ],
22
+ [
23
+ "keyExtractor",
24
+ "(item: T, index: number) => string",
25
+ "index",
26
+ "React key for each card."
27
+ ],
28
+ [
29
+ "itemWidth",
30
+ "number",
31
+ "170",
32
+ "Card width."
33
+ ],
34
+ [
35
+ "itemHeight",
36
+ "number",
37
+ "230",
38
+ "Card height."
39
+ ],
40
+ [
41
+ "spacing",
42
+ "number",
43
+ "360 / count (≤ 45)",
44
+ "Degrees between neighbours."
45
+ ],
46
+ [
47
+ "autoplay",
48
+ "boolean | number",
49
+ "false",
50
+ "Turn every 3s (or N ms); pauses while touched."
51
+ ],
52
+ [
53
+ "index",
54
+ "number",
55
+ "—",
56
+ "Controlled front card."
57
+ ],
58
+ [
59
+ "defaultIndex",
60
+ "number",
61
+ "0",
62
+ "Uncontrolled initial front card."
63
+ ],
64
+ [
65
+ "onIndexChange",
66
+ "(index: number) => void",
67
+ "—",
68
+ "Fires when the front card changes."
69
+ ],
70
+ [
71
+ "onPress",
72
+ "(item: T, index: number) => void",
73
+ "—",
74
+ "Tap on the front card."
75
+ ],
76
+ [
77
+ "pagination",
78
+ "boolean",
79
+ "true",
80
+ "Dots under the ring."
81
+ ],
82
+ [
83
+ "accent",
84
+ "string",
85
+ "theme foreground",
86
+ "Active dot colour."
87
+ ],
88
+ [
89
+ "radius",
90
+ "number",
91
+ "18",
92
+ "Corner radius of each card."
93
+ ],
94
+ [
95
+ "style",
96
+ "StyleProp<ViewStyle>",
97
+ "—",
98
+ "Style for the root view."
99
+ ]
100
+ ],
101
+ "examples": []
102
+ }
@@ -0,0 +1,90 @@
1
+ {
2
+ "name": "scratch-card",
3
+ "category": "Coupons",
4
+ "aliases": [],
5
+ "exportName": "ScratchCard",
6
+ "files": [
7
+ "src/components/ui/scratch-card.tsx"
8
+ ],
9
+ "props": [
10
+ [
11
+ "children",
12
+ "ReactNode",
13
+ "—",
14
+ "The reward underneath; it sets the card's size."
15
+ ],
16
+ [
17
+ "foil",
18
+ "\"silver\" | \"gold\" | \"holo\" | \"rose\" | \"midnight\" | { colors, ink }",
19
+ "\"silver\"",
20
+ "Foil look."
21
+ ],
22
+ [
23
+ "label / sublabel",
24
+ "string",
25
+ "\"Scratch to reveal\" / —",
26
+ "Printed on the foil."
27
+ ],
28
+ [
29
+ "threshold",
30
+ "number",
31
+ "0.55",
32
+ "Share of the foil to scratch before the rest clears."
33
+ ],
34
+ [
35
+ "brushSize",
36
+ "number",
37
+ "22",
38
+ "Brush radius in points."
39
+ ],
40
+ [
41
+ "radius",
42
+ "number",
43
+ "20",
44
+ "Corner radius of the foil."
45
+ ],
46
+ [
47
+ "revealed",
48
+ "boolean",
49
+ "—",
50
+ "Controlled: true shows the reward, false puts the foil back."
51
+ ],
52
+ [
53
+ "disabled",
54
+ "boolean",
55
+ "false",
56
+ "Turn scratching off."
57
+ ],
58
+ [
59
+ "onScratchStart / onScratchEnd",
60
+ "() => void",
61
+ "—",
62
+ "Finger down / up — e.g. pause a parent ScrollView."
63
+ ],
64
+ [
65
+ "onProgress",
66
+ "(fraction) => void",
67
+ "—",
68
+ "0 … 1 while scratching."
69
+ ],
70
+ [
71
+ "onReveal",
72
+ "() => void",
73
+ "—",
74
+ "Once, when the foil clears."
75
+ ],
76
+ [
77
+ "ref",
78
+ "{ reveal(), reset() }",
79
+ "—",
80
+ "Clear the foil, or put a fresh one on."
81
+ ],
82
+ [
83
+ "style",
84
+ "StyleProp<ViewStyle>",
85
+ "—",
86
+ "Width, margins."
87
+ ]
88
+ ],
89
+ "examples": []
90
+ }
@@ -0,0 +1,140 @@
1
+ {
2
+ "name": "search-bar",
3
+ "category": "Inputs",
4
+ "aliases": [],
5
+ "exportName": "SearchBar",
6
+ "files": [
7
+ "src/components/ui/search-bar.tsx"
8
+ ],
9
+ "props": [
10
+ [
11
+ "variant",
12
+ "\"default\" | \"filled\" | \"minimal\"",
13
+ "\"default\"",
14
+ "Outlined pill, iOS grey field, or a round icon that expands into a field."
15
+ ],
16
+ [
17
+ "size",
18
+ "\"sm\" | \"md\" | \"lg\"",
19
+ "\"md\"",
20
+ "34 / 44 / 56pt tall; font, icons, padding and radius scale too."
21
+ ],
22
+ [
23
+ "value / defaultValue / onChangeText",
24
+ "string",
25
+ "—",
26
+ "Controlled or uncontrolled query."
27
+ ],
28
+ [
29
+ "loading",
30
+ "boolean",
31
+ "false",
32
+ "Crossfades the magnifier into a spinning arc."
33
+ ],
34
+ [
35
+ "showCancel",
36
+ "boolean",
37
+ "true (false for minimal)",
38
+ "Slide a Cancel button in while searching."
39
+ ],
40
+ [
41
+ "cancelLabel",
42
+ "string",
43
+ "\"Cancel\"",
44
+ "Cancel button text."
45
+ ],
46
+ [
47
+ "onCancel",
48
+ "() => void",
49
+ "—",
50
+ "After Cancel clears the query and blurs."
51
+ ],
52
+ [
53
+ "onClear",
54
+ "() => void",
55
+ "—",
56
+ "After the clear button empties the query."
57
+ ],
58
+ [
59
+ "align",
60
+ "\"left\" | \"right\"",
61
+ "\"left\"",
62
+ "Minimal only: where the collapsed icon rests."
63
+ ],
64
+ [
65
+ "suggestions",
66
+ "{ key, label, hint?, icon?: 'recent' | 'trending' | 'search' }[]",
67
+ "—",
68
+ "Shown in a dropdown panel while focused; the matching text is bolded."
69
+ ],
70
+ [
71
+ "onSelectSuggestion",
72
+ "(item) => void",
73
+ "—",
74
+ "Called after a suggestion is picked (the query is set to its label)."
75
+ ],
76
+ [
77
+ "filterSuggestions",
78
+ "boolean",
79
+ "true",
80
+ "Filter suggestions by the query. Turn off to filter them yourself."
81
+ ],
82
+ [
83
+ "maxSuggestions",
84
+ "number",
85
+ "6",
86
+ "Most rows shown in the panel."
87
+ ],
88
+ [
89
+ "trailing",
90
+ "ReactNode",
91
+ "—",
92
+ "Rendered inside the field on the right, e.g. a filter or mic button."
93
+ ],
94
+ [
95
+ "accent",
96
+ "string",
97
+ "theme accent",
98
+ "Focus ring, caret and Cancel colour."
99
+ ],
100
+ [
101
+ "style",
102
+ "StyleProp<ViewStyle>",
103
+ "—",
104
+ "Style for the root view around the field, cancel button and suggestions."
105
+ ],
106
+ [
107
+ "…TextInputProps",
108
+ "",
109
+ "",
110
+ "placeholder, onSubmitEditing, autoFocus, …"
111
+ ]
112
+ ],
113
+ "examples": [
114
+ {
115
+ "name": "WithSuggestions",
116
+ "title": "With Suggestions",
117
+ "code": "import React, { useEffect, useState } from 'react';\nimport { Pressable, StyleSheet, Text, View, type ViewProps } from 'react-native';\nimport { SearchBar, type SearchSuggestion } from '@/components/ui/search-bar';\nimport { alpha, useKit } from '@/lib/kit';\n\nconst SUGGESTIONS: SearchSuggestion[] = [\n { key: 'r1', label: 'Noise cancelling headphones', icon: 'recent' },\n { key: 'r2', label: 'Running shoes', icon: 'recent' },\n { key: 't1', label: 'Mechanical keyboard', icon: 'trending', hint: 'Trending' },\n { key: 't2', label: 'Standing desk', icon: 'trending', hint: '2.1k searches' },\n { key: 's1', label: 'Wireless charger', hint: 'Electronics' },\n { key: 's2', label: 'Coffee grinder', hint: 'Kitchen' },\n];\n\nexport default function WithSuggestions() {\n const { colors } = useKit();\n const [query, setQuery] = useState('');\n const [picked, setPicked] = useState<string | null>(null);\n return (\n // Reserve room for the open list, so the bar stays put when suggestions drop down below it.\n <View style={{ gap: 10, minHeight: 400 }}>\n <SearchBar\n value={query}\n onChangeText={setQuery}\n placeholder=\"Search products\"\n suggestions={SUGGESTIONS}\n maxSuggestions={5}\n onSelectSuggestion={(item) => setPicked(item.label)}\n />\n <Text style={{ fontSize: 13, color: colors.mutedForeground }}>{picked ? `Showing results for “${picked}”` : 'Tap the field to see recent and trending searches'}</Text>\n </View>\n );\n}\n"
118
+ },
119
+ {
120
+ "name": "LiveResults",
121
+ "title": "Live Results",
122
+ "code": "import React, { useEffect, useState } from 'react';\nimport { Pressable, StyleSheet, Text, View, type ViewProps } from 'react-native';\nimport { SearchBar, type SearchSuggestion } from '@/components/ui/search-bar';\nimport { alpha, useKit } from '@/lib/kit';\n\n/** Demo card that follows the kit theme, so the docs radius / accent picker reshapes it too. */\nfunction Card({ style, ...rest }: ViewProps) {\n const { colors, radius } = useKit();\n return (\n <View\n style={[\n { padding: 16, gap: 12, borderRadius: radius.xl, borderWidth: StyleSheet.hairlineWidth, borderColor: colors.border, backgroundColor: colors.card },\n style,\n ]}\n {...rest}\n />\n );\n}\n\nconst CONTACTS = [\n { name: 'Aarav Mehta', role: 'Design lead' },\n { name: 'Priya Nair', role: 'Product manager' },\n { name: 'Rohan Kapoor', role: 'iOS engineer' },\n { name: 'Sara Ali', role: 'Marketing' },\n { name: 'Vikram Rao', role: 'Backend engineer' },\n];\n\nexport default function LiveResults() {\n const { colors } = useKit();\n const [query, setQuery] = useState('');\n const [loading, setLoading] = useState(false);\n useEffect(() => {\n if (!query) return setLoading(false);\n setLoading(true);\n const id = setTimeout(() => setLoading(false), 600);\n return () => clearTimeout(id);\n }, [query]);\n const q = query.trim().toLowerCase();\n const results = CONTACTS.filter((c) => c.name.toLowerCase().includes(q) || c.role.toLowerCase().includes(q));\n return (\n <Card>\n <SearchBar variant=\"filled\" value={query} onChangeText={setQuery} loading={loading} placeholder=\"Search people\" />\n {loading ? (\n <Text style={{ fontSize: 13, color: colors.mutedForeground }}>Searching your team…</Text>\n ) : results.length ? (\n results.slice(0, 4).map((c) => (\n <View key={c.name} style={{ flexDirection: 'row', alignItems: 'center', gap: 12 }}>\n <View style={{ width: 34, height: 34, borderRadius: 17, backgroundColor: alpha(colors.accent, 0.16), alignItems: 'center', justifyContent: 'center' }}>\n <Text style={{ fontSize: 13, fontWeight: '400', color: colors.accent }}>{c.name.split(' ').map((p) => p[0]).join('')}</Text>\n </View>\n <View>\n <Text style={{ fontSize: 15, fontWeight: '400', color: colors.foreground }}>{c.name}</Text>\n <Text style={{ fontSize: 12.5, color: colors.mutedForeground }}>{c.role}</Text>\n </View>\n </View>\n ))\n ) : (\n <Text style={{ fontSize: 13, color: colors.mutedForeground }}>No one matches “{query}”</Text>\n )}\n </Card>\n );\n}\n"
123
+ },
124
+ {
125
+ "name": "Minimal",
126
+ "title": "Minimal",
127
+ "code": "import { Pressable, StyleSheet, Text, View, type ViewProps } from 'react-native';\nimport { SearchBar, type SearchSuggestion } from '@/components/ui/search-bar';\nimport { alpha, useKit } from '@/lib/kit';\n\n/** Demo card that follows the kit theme, so the docs radius / accent picker reshapes it too. */\nfunction Card({ style, ...rest }: ViewProps) {\n const { colors, radius } = useKit();\n return (\n <View\n style={[\n { padding: 16, gap: 12, borderRadius: radius.xl, borderWidth: StyleSheet.hairlineWidth, borderColor: colors.border, backgroundColor: colors.card },\n style,\n ]}\n {...rest}\n />\n );\n}\n\nexport default function Minimal() {\n const { colors } = useKit();\n return (\n <Card style={{ flexDirection: 'row', alignItems: 'center', gap: 12 }}>\n <Text style={{ fontSize: 22, fontWeight: '400', letterSpacing: -0.4, color: colors.foreground }}>Inbox</Text>\n <SearchBar variant=\"minimal\" align=\"right\" placeholder=\"Search mail\" style={{ flex: 1 }} />\n </Card>\n );\n}\n"
128
+ },
129
+ {
130
+ "name": "WithFilter",
131
+ "title": "With Filter",
132
+ "code": "import React, { useEffect, useState } from 'react';\nimport { Pressable, StyleSheet, Text, View, type ViewProps } from 'react-native';\nimport { SearchBar, type SearchSuggestion } from '@/components/ui/search-bar';\nimport { alpha, useKit } from '@/lib/kit';\n\nfunction FilterButton({ count, onPress }: { count: number; onPress: () => void }) {\n const { colors, radius } = useKit();\n return (\n <Pressable\n onPress={onPress}\n hitSlop={8}\n accessibilityRole=\"button\"\n accessibilityLabel={`Filters, ${count} active`}\n style={{ height: 32, paddingHorizontal: 10, borderRadius: radius.capsule(32), backgroundColor: count ? colors.accent : colors.muted, flexDirection: 'row', alignItems: 'center', gap: 6 }}\n >\n <View style={{ gap: 3, alignItems: 'center' }}>\n {[14, 10, 6].map((w) => (\n <View key={w} style={{ width: w, height: 2, borderRadius: 1, backgroundColor: count ? colors.accentForeground : colors.mutedForeground }} />\n ))}\n </View>\n {count ? <Text style={{ fontSize: 12.5, fontWeight: '400', color: colors.accentForeground }}>{count}</Text> : null}\n </Pressable>\n );\n}\n\nexport default function WithFilter() {\n const { colors } = useKit();\n const [count, setCount] = useState(2);\n return (\n <View style={{ gap: 10 }}>\n <SearchBar\n placeholder=\"Stays in Goa\"\n showCancel={false}\n trailing={<FilterButton count={count} onPress={() => setCount((c) => (c + 1) % 4)} />}\n />\n <Text style={{ fontSize: 13, color: colors.mutedForeground }}>{count ? `${count} filters · Pool, Under ₹8,000` : 'No filters applied'}</Text>\n </View>\n );\n}\n"
133
+ },
134
+ {
135
+ "name": "Sizes",
136
+ "title": "Sizes",
137
+ "code": "import { Pressable, StyleSheet, Text, View, type ViewProps } from 'react-native';\nimport { SearchBar, type SearchSuggestion } from '@/components/ui/search-bar';\nimport { alpha, useKit } from '@/lib/kit';\n\nexport default function Sizes() {\n const { colors } = useKit();\n return (\n <View style={{ gap: 14 }}>\n {(['sm', 'md', 'lg'] as const).map((size, i) => (\n <View key={size} style={{ gap: 6 }}>\n <Text style={{ fontSize: 12, fontWeight: '400', color: colors.mutedForeground }}>{['Small', 'Medium', 'Large'][i]}</Text>\n <SearchBar size={size} variant={i === 1 ? 'default' : 'filled'} defaultValue=\"Coffee near me\" showCancel={false} />\n </View>\n ))}\n </View>\n );\n}\n"
138
+ }
139
+ ]
140
+ }
@@ -0,0 +1,120 @@
1
+ {
2
+ "name": "search-results",
3
+ "category": "Blocks",
4
+ "aliases": [],
5
+ "exportName": "SearchResults",
6
+ "files": [
7
+ "src/components/blocks/search-results.tsx"
8
+ ],
9
+ "props": [
10
+ [
11
+ "results",
12
+ "{ id, title, subtitle?, rating, reviews?, price, distance?, freeDelivery?, open?, color?, icon? }[]",
13
+ "6 coffee results (₹)",
14
+ "Results for the current query. Filtered and sorted locally."
15
+ ],
16
+ [
17
+ "defaultQuery",
18
+ "string",
19
+ "'coffee'",
20
+ "Initial query in the field and the result count. Empty shows Recent and Trending."
21
+ ],
22
+ [
23
+ "totalCount",
24
+ "number",
25
+ "128",
26
+ "Backend total shown while no filter is active."
27
+ ],
28
+ [
29
+ "loading",
30
+ "boolean",
31
+ "false",
32
+ "Skeleton rows and a spinning search icon."
33
+ ],
34
+ [
35
+ "filters",
36
+ "('price' | 'rating' | 'free-delivery' | 'open')[]",
37
+ "—",
38
+ "Controlled quick filters."
39
+ ],
40
+ [
41
+ "defaultFilters",
42
+ "SearchFilter[]",
43
+ "[]",
44
+ "Initial filters when uncontrolled."
45
+ ],
46
+ [
47
+ "onFiltersChange",
48
+ "(filters) => void",
49
+ "—",
50
+ "Chips or the sheet changed the filters."
51
+ ],
52
+ [
53
+ "recentSearches / trendingSearches",
54
+ "string[]",
55
+ "3 / 4 samples",
56
+ "Shown while the field is empty (recent as rows with Clear, trending as chips). Submitted searches join Recent."
57
+ ],
58
+ [
59
+ "onSearch",
60
+ "(query: string) => void",
61
+ "—",
62
+ "Submitted from the keyboard, a recent / trending search or a no-results chip."
63
+ ],
64
+ [
65
+ "onSelect",
66
+ "(result) => void",
67
+ "—",
68
+ "A result row was tapped."
69
+ ],
70
+ [
71
+ "onClearRecent",
72
+ "() => void",
73
+ "—",
74
+ "Clear next to Recent was tapped."
75
+ ],
76
+ [
77
+ "autoFocus",
78
+ "boolean",
79
+ "false",
80
+ "Focus the field on mount."
81
+ ],
82
+ [
83
+ "currency",
84
+ "string",
85
+ "'₹'",
86
+ "Symbol placed before prices by the default formatter (Indian digit grouping, decimals only when non-zero)."
87
+ ],
88
+ [
89
+ "formatPrice",
90
+ "(amount) => string",
91
+ "'₹1,23,456'",
92
+ "Money formatter for rows, chips and the slider. Overrides currency — use for Intl, other grouping or suffix symbols like '12,50 €'."
93
+ ],
94
+ [
95
+ "maxPrice",
96
+ "number",
97
+ "2000",
98
+ "Top of the price-range slider; the top value reads as \"and up\"."
99
+ ],
100
+ [
101
+ "tintedThumbnails",
102
+ "boolean",
103
+ "false",
104
+ "Tint thumbnails with each result's color instead of the neutral default."
105
+ ],
106
+ [
107
+ "accent",
108
+ "string",
109
+ "theme accent",
110
+ "Active chip, slider and button colour (black in light, white in dark by default)."
111
+ ],
112
+ [
113
+ "style",
114
+ "StyleProp<ViewStyle>",
115
+ "—",
116
+ "Root style."
117
+ ]
118
+ ],
119
+ "examples": []
120
+ }