@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,87 @@
1
+ {
2
+ "name": "profile",
3
+ "category": "Blocks",
4
+ "aliases": [],
5
+ "exportName": "Profile",
6
+ "files": [
7
+ "src/components/blocks/profile.tsx"
8
+ ],
9
+ "summary": null,
10
+ "props": [
11
+ [
12
+ "user",
13
+ "{ name, email?, phone?, avatar?, subtitle?, badge? }",
14
+ "Aarav Mehta",
15
+ "Who the account belongs to. subtitle is a muted line (e.g. 'Member since 2023'); badge shows a chip next to the name (e.g. 'Pro')."
16
+ ],
17
+ [
18
+ "stats",
19
+ "{ label, value, onPress? }[]",
20
+ "Orders / Wishlist / Reviews",
21
+ "Highlights strip under the header. Pass [] to hide."
22
+ ],
23
+ [
24
+ "details",
25
+ "{ key, label, value?, icon? }[]",
26
+ "Date of birth, Address",
27
+ "“Personal details” rows (name, email and phone already show in the header). Empty value shows a muted “Add”. Pass [] to hide."
28
+ ],
29
+ [
30
+ "sections",
31
+ "{ title?, items: { key, label, value?, icon?, badge?, destructive?, onPress? }[] }[]",
32
+ "Account, Preferences, Support",
33
+ "Grouped rows below the details. destructive rows are red with no chevron."
34
+ ],
35
+ [
36
+ "title",
37
+ "string",
38
+ "'Profile'",
39
+ "Header title."
40
+ ],
41
+ [
42
+ "onEditProfile",
43
+ "() => void",
44
+ "—",
45
+ "Shows a small 'Edit profile' pill under the contact details."
46
+ ],
47
+ [
48
+ "onAvatarPress",
49
+ "() => void",
50
+ "—",
51
+ "Makes the avatar pressable and adds a camera badge."
52
+ ],
53
+ [
54
+ "onRowPress",
55
+ "(key: string) => void",
56
+ "—",
57
+ "Any detail or section row was pressed (after the item's own onPress)."
58
+ ],
59
+ [
60
+ "onSignOut",
61
+ "() => void",
62
+ "—",
63
+ "The destructive 'Sign out' row at the end was pressed."
64
+ ],
65
+ [
66
+ "onBack",
67
+ "() => void",
68
+ "—",
69
+ "Shows a back button in the header."
70
+ ],
71
+ [
72
+ "accent",
73
+ "string",
74
+ "theme accent",
75
+ "Badge chip and pressed-state tint. Everything else stays monochrome."
76
+ ],
77
+ [
78
+ "style",
79
+ "StyleProp<ViewStyle>",
80
+ "—",
81
+ "Root style."
82
+ ]
83
+ ],
84
+ "behavior": [],
85
+ "usage": null,
86
+ "examples": []
87
+ }
@@ -0,0 +1,116 @@
1
+ {
2
+ "name": "progress-steps",
3
+ "category": "Navigation",
4
+ "aliases": [],
5
+ "exportName": "ProgressSteps",
6
+ "files": [
7
+ "src/components/ui/progress-steps.tsx"
8
+ ],
9
+ "summary": "Finished steps pop and draw a check while the line pours into the next one.",
10
+ "props": [
11
+ [
12
+ "steps",
13
+ "(string | { label, description? })[]",
14
+ "—",
15
+ "Step labels with optional descriptions (vertical, and two short lines in horizontal)."
16
+ ],
17
+ [
18
+ "current",
19
+ "number",
20
+ "—",
21
+ "Active step index. Earlier steps are complete; steps.length marks all done."
22
+ ],
23
+ [
24
+ "errorStep",
25
+ "number",
26
+ "—",
27
+ "A failed step, drawn red with \"!\"."
28
+ ],
29
+ [
30
+ "variant",
31
+ "\"horizontal\" | \"vertical\" | \"bar\"",
32
+ "\"horizontal\"",
33
+ "Nodes with labels · vertical list with descriptions · compact header and segmented bar."
34
+ ],
35
+ [
36
+ "onStepPress",
37
+ "(index: number) => void",
38
+ "—",
39
+ "Makes steps tappable, e.g. to jump back."
40
+ ],
41
+ [
42
+ "pressableSteps",
43
+ "\"all\" | \"completed\"",
44
+ "\"all\"",
45
+ "Which steps onStepPress applies to; \"completed\" only lets people go back."
46
+ ],
47
+ [
48
+ "haptics",
49
+ "boolean",
50
+ "true",
51
+ "Selection tick whenever current changes."
52
+ ],
53
+ [
54
+ "accent",
55
+ "string",
56
+ "theme accent",
57
+ "Solid colour of completed steps, connectors and the current ring; halos and tracks are tints of it."
58
+ ],
59
+ [
60
+ "style",
61
+ "StyleProp<ViewStyle>",
62
+ "—",
63
+ "Style for the step row / column (the bar container in the bar variant)."
64
+ ]
65
+ ],
66
+ "behavior": [
67
+ [
68
+ "Motion",
69
+ "When current changes, the finished node pops and draws its check, the connector fills toward the next step and the new step lights up. The current step's ring pulses."
70
+ ],
71
+ [
72
+ "Touch",
73
+ "With onStepPress, steps become buttons that squish on press; pressableSteps='completed' limits taps to finished steps."
74
+ ],
75
+ [
76
+ "Haptics",
77
+ "A selection tick plays whenever current changes (haptics, on by default)."
78
+ ],
79
+ [
80
+ "Reduced motion",
81
+ "Steps move with a short timing instead of springs, the ring stops pulsing and the done node appears without the overshoot pop."
82
+ ],
83
+ [
84
+ "Screen readers",
85
+ "Each step reads like 'Step 2 of 4, Shipping, current'. The bar variant is a progressbar labelled 'Step N of M' with the step name."
86
+ ]
87
+ ],
88
+ "usage": "import { useState } from 'react';\nimport { ProgressSteps } from '@/components/ui/progress-steps';\n\nconst [step, setStep] = useState(1);\n<ProgressSteps steps={['Cart', 'Shipping', 'Payment', 'Review']} current={step} onStepPress={setStep} pressableSteps=\"completed\" />",
89
+ "examples": [
90
+ {
91
+ "name": "Checkout",
92
+ "title": "Checkout",
93
+ "code": "import React, { useState } from 'react';\nimport { Pressable, Text, View } from 'react-native';\nimport { ProgressSteps } from '@/components/ui/progress-steps';\nimport { alpha, useKit } from '@/lib/kit';\n\nfunction Buttons({ step, max, set, last = 'Place order' }: { step: number; max: number; set: (n: number) => void; last?: string }) {\n const { colors, radius } = useKit();\n const done = step >= max;\n return (\n <View style={{ flexDirection: 'row', gap: 10 }}>\n <Pressable\n onPress={() => set(Math.max(0, step - 1))}\n disabled={step === 0}\n accessibilityRole=\"button\"\n style={({ pressed }) => ({\n flex: 1,\n height: 48,\n borderRadius: radius.capsule(48),\n backgroundColor: alpha(colors.foreground, pressed ? 0.1 : 0.05),\n alignItems: 'center',\n justifyContent: 'center',\n opacity: step === 0 ? 0.4 : 1,\n })}\n >\n <Text style={{ fontSize: 15, color: colors.foreground }}>Back</Text>\n </Pressable>\n <Pressable\n onPress={() => set(done ? 0 : step + 1)}\n accessibilityRole=\"button\"\n style={({ pressed }) => ({\n flex: 1.5,\n height: 48,\n borderRadius: radius.capsule(48),\n backgroundColor: colors.accent,\n alignItems: 'center',\n justifyContent: 'center',\n transform: [{ scale: pressed ? 0.98 : 1 }],\n })}\n >\n <Text style={{ fontSize: 15, color: colors.accentForeground }}>\n {done ? 'Start over' : step === max - 1 ? last : 'Continue'}\n </Text>\n </Pressable>\n </View>\n );\n}\n\nexport default function Checkout() {\n const { colors } = useKit();\n const [step, setStep] = useState(1);\n const copy = [\n '2 items · ₹2,798',\n 'Delivering to 14 Rua das Flores, Lisbon',\n 'Visa ending 4242',\n 'Arrives Thursday, 16 October',\n ];\n return (\n <View style={{ gap: 22 }}>\n <ProgressSteps\n steps={['Cart', 'Shipping', 'Payment', 'Review']}\n current={step}\n pressableSteps=\"completed\"\n onStepPress={setStep}\n />\n <Text style={{ fontSize: 14, textAlign: 'center', color: colors.mutedForeground }}>\n {step >= 4 ? 'Order #4821 placed — receipt sent to amelia@hart.studio' : copy[step]}\n </Text>\n <Buttons step={step} max={4} set={setStep} />\n </View>\n );\n}\n"
94
+ },
95
+ {
96
+ "name": "Onboarding",
97
+ "title": "Onboarding",
98
+ "code": "import React, { useState } from 'react';\nimport { Pressable, Text, View } from 'react-native';\nimport { ProgressSteps } from '@/components/ui/progress-steps';\nimport { alpha, useKit } from '@/lib/kit';\n\nfunction Buttons({ step, max, set, last = 'Place order' }: { step: number; max: number; set: (n: number) => void; last?: string }) {\n const { colors, radius } = useKit();\n const done = step >= max;\n return (\n <View style={{ flexDirection: 'row', gap: 10 }}>\n <Pressable\n onPress={() => set(Math.max(0, step - 1))}\n disabled={step === 0}\n accessibilityRole=\"button\"\n style={({ pressed }) => ({\n flex: 1,\n height: 48,\n borderRadius: radius.capsule(48),\n backgroundColor: alpha(colors.foreground, pressed ? 0.1 : 0.05),\n alignItems: 'center',\n justifyContent: 'center',\n opacity: step === 0 ? 0.4 : 1,\n })}\n >\n <Text style={{ fontSize: 15, color: colors.foreground }}>Back</Text>\n </Pressable>\n <Pressable\n onPress={() => set(done ? 0 : step + 1)}\n accessibilityRole=\"button\"\n style={({ pressed }) => ({\n flex: 1.5,\n height: 48,\n borderRadius: radius.capsule(48),\n backgroundColor: colors.accent,\n alignItems: 'center',\n justifyContent: 'center',\n transform: [{ scale: pressed ? 0.98 : 1 }],\n })}\n >\n <Text style={{ fontSize: 15, color: colors.accentForeground }}>\n {done ? 'Start over' : step === max - 1 ? last : 'Continue'}\n </Text>\n </Pressable>\n </View>\n );\n}\n\nexport default function Onboarding() {\n const [step, setStep] = useState(2);\n return (\n <View style={{ gap: 20 }}>\n <ProgressSteps\n variant=\"vertical\"\n current={step}\n pressableSteps=\"completed\"\n onStepPress={setStep}\n steps={[\n { label: 'Create your account', description: 'Signed up with amelia@hart.studio' },\n { label: 'Verify your email', description: 'Confirmed with a 6-digit code.' },\n { label: 'Connect your bank', description: 'Read-only access. You can disconnect any time.' },\n { label: 'Set your first budget', description: 'Pick categories and a monthly limit.' },\n ]}\n />\n <Buttons step={step} max={4} set={setStep} last=\"Finish setup\" />\n </View>\n );\n}\n"
99
+ },
100
+ {
101
+ "name": "Compact",
102
+ "title": "Compact",
103
+ "code": "import React, { useState } from 'react';\nimport { Pressable, Text, View } from 'react-native';\nimport { ProgressSteps } from '@/components/ui/progress-steps';\nimport { alpha, useKit } from '@/lib/kit';\n\nfunction Buttons({ step, max, set, last = 'Place order' }: { step: number; max: number; set: (n: number) => void; last?: string }) {\n const { colors, radius } = useKit();\n const done = step >= max;\n return (\n <View style={{ flexDirection: 'row', gap: 10 }}>\n <Pressable\n onPress={() => set(Math.max(0, step - 1))}\n disabled={step === 0}\n accessibilityRole=\"button\"\n style={({ pressed }) => ({\n flex: 1,\n height: 48,\n borderRadius: radius.capsule(48),\n backgroundColor: alpha(colors.foreground, pressed ? 0.1 : 0.05),\n alignItems: 'center',\n justifyContent: 'center',\n opacity: step === 0 ? 0.4 : 1,\n })}\n >\n <Text style={{ fontSize: 15, color: colors.foreground }}>Back</Text>\n </Pressable>\n <Pressable\n onPress={() => set(done ? 0 : step + 1)}\n accessibilityRole=\"button\"\n style={({ pressed }) => ({\n flex: 1.5,\n height: 48,\n borderRadius: radius.capsule(48),\n backgroundColor: colors.accent,\n alignItems: 'center',\n justifyContent: 'center',\n transform: [{ scale: pressed ? 0.98 : 1 }],\n })}\n >\n <Text style={{ fontSize: 15, color: colors.accentForeground }}>\n {done ? 'Start over' : step === max - 1 ? last : 'Continue'}\n </Text>\n </Pressable>\n </View>\n );\n}\n\nexport default function Compact() {\n const [step, setStep] = useState(1);\n return (\n <View style={{ gap: 20 }}>\n <ProgressSteps variant=\"bar\" steps={['Shipping address', 'Delivery options', 'Payment', 'Review order']} current={step} />\n <Buttons step={step} max={4} set={setStep} />\n </View>\n );\n}\n"
104
+ },
105
+ {
106
+ "name": "WithDescriptions",
107
+ "title": "With Descriptions",
108
+ "code": "import React, { useState } from 'react';\nimport { Pressable, Text, View } from 'react-native';\nimport { ProgressSteps } from '@/components/ui/progress-steps';\nimport { alpha, useKit } from '@/lib/kit';\n\nfunction Buttons({ step, max, set, last = 'Place order' }: { step: number; max: number; set: (n: number) => void; last?: string }) {\n const { colors, radius } = useKit();\n const done = step >= max;\n return (\n <View style={{ flexDirection: 'row', gap: 10 }}>\n <Pressable\n onPress={() => set(Math.max(0, step - 1))}\n disabled={step === 0}\n accessibilityRole=\"button\"\n style={({ pressed }) => ({\n flex: 1,\n height: 48,\n borderRadius: radius.capsule(48),\n backgroundColor: alpha(colors.foreground, pressed ? 0.1 : 0.05),\n alignItems: 'center',\n justifyContent: 'center',\n opacity: step === 0 ? 0.4 : 1,\n })}\n >\n <Text style={{ fontSize: 15, color: colors.foreground }}>Back</Text>\n </Pressable>\n <Pressable\n onPress={() => set(done ? 0 : step + 1)}\n accessibilityRole=\"button\"\n style={({ pressed }) => ({\n flex: 1.5,\n height: 48,\n borderRadius: radius.capsule(48),\n backgroundColor: colors.accent,\n alignItems: 'center',\n justifyContent: 'center',\n transform: [{ scale: pressed ? 0.98 : 1 }],\n })}\n >\n <Text style={{ fontSize: 15, color: colors.accentForeground }}>\n {done ? 'Start over' : step === max - 1 ? last : 'Continue'}\n </Text>\n </Pressable>\n </View>\n );\n}\n\nexport default function WithDescriptions() {\n const [step, setStep] = useState(1);\n return (\n <View style={{ gap: 22 }}>\n <ProgressSteps\n current={step}\n steps={[\n { label: 'Profile', description: 'Name, photo' },\n { label: 'Workspace', description: 'Invite team' },\n { label: 'Plan', description: 'Free or Pro' },\n ]}\n />\n <Buttons step={step} max={3} set={setStep} last=\"Create workspace\" />\n </View>\n );\n}\n"
109
+ },
110
+ {
111
+ "name": "WithError",
112
+ "title": "With Error",
113
+ "code": "import { Pressable, Text, View } from 'react-native';\nimport { ProgressSteps } from '@/components/ui/progress-steps';\nimport { alpha, useKit } from '@/lib/kit';\n\nexport default function WithError() {\n const { colors } = useKit();\n return (\n <View style={{ gap: 14 }}>\n <ProgressSteps steps={['Upload', 'Verify', 'Approve', 'Publish']} current={1} errorStep={1} />\n <Text style={{ fontSize: 13, lineHeight: 18, color: colors.mutedForeground, textAlign: 'center' }}>\n ID photo was blurry — retake it to continue.\n </Text>\n </View>\n );\n}\n"
114
+ }
115
+ ]
116
+ }
@@ -0,0 +1,152 @@
1
+ {
2
+ "name": "progress",
3
+ "category": "Feedback",
4
+ "aliases": [],
5
+ "exportName": "Progress",
6
+ "files": [
7
+ "src/components/ui/progress.tsx"
8
+ ],
9
+ "summary": "A bar, ring or segments with a glowing head; finishing flashes and draws a check.",
10
+ "props": [
11
+ [
12
+ "variant",
13
+ "\"linear\" | \"circular\" | \"steps\"",
14
+ "\"linear\"",
15
+ "Horizontal bar, circular ring, or a row of segments."
16
+ ],
17
+ [
18
+ "value",
19
+ "number",
20
+ "—",
21
+ "0 → max (completed steps for steps). Omit for indeterminate."
22
+ ],
23
+ [
24
+ "max",
25
+ "number",
26
+ "100 (steps: steps)",
27
+ "Upper bound."
28
+ ],
29
+ [
30
+ "indeterminate",
31
+ "boolean",
32
+ "false",
33
+ "Comet sweep on the bar, spinning arc on the ring."
34
+ ],
35
+ [
36
+ "steps",
37
+ "number",
38
+ "4",
39
+ "Segment count for the steps variant."
40
+ ],
41
+ [
42
+ "size",
43
+ "\"sm\" | \"md\" | \"lg\"",
44
+ "\"md\"",
45
+ "Bar 4 / 8 / 12pt, ring 44 / 72 / 112pt."
46
+ ],
47
+ [
48
+ "color",
49
+ "string",
50
+ "theme accent",
51
+ "Fill colour (solid); the track, glow and pulse are tints of it."
52
+ ],
53
+ [
54
+ "trackColor",
55
+ "string",
56
+ "subtle foreground",
57
+ "Track colour."
58
+ ],
59
+ [
60
+ "label",
61
+ "string",
62
+ "—",
63
+ "Caption above the bar or under the ring."
64
+ ],
65
+ [
66
+ "showValue",
67
+ "boolean",
68
+ "ring: true",
69
+ "Show the percentage (a drawn check once complete)."
70
+ ],
71
+ [
72
+ "formatValue",
73
+ "(value, max) => string",
74
+ "—",
75
+ "Custom value text (e.g. \"3 of 5\")."
76
+ ],
77
+ [
78
+ "celebrate",
79
+ "boolean",
80
+ "true",
81
+ "At max, flash the fill and turn the value into a drawn check."
82
+ ],
83
+ [
84
+ "striped",
85
+ "boolean",
86
+ "false",
87
+ "Animated diagonal stripes on the linear fill for processing states."
88
+ ],
89
+ [
90
+ "style",
91
+ "StyleProp<ViewStyle>",
92
+ "—",
93
+ "Style for the root view of the bar, ring or step row."
94
+ ]
95
+ ],
96
+ "behavior": [
97
+ [
98
+ "Motion",
99
+ "The fill springs to each value with a glow riding its head, and the ring's percentage counts up. Reaching max flashes the fill and morphs the value into a drawn check."
100
+ ],
101
+ [
102
+ "Reduced motion",
103
+ "The completion flash, moving stripes and segment pop and pulse are skipped. The fill still springs and indeterminate loops still run."
104
+ ],
105
+ [
106
+ "Screen readers",
107
+ "A progressbar with your label and its min, max and current value. Indeterminate progress is marked busy."
108
+ ],
109
+ [
110
+ "Platforms",
111
+ "Transforms and opacity use the native driver; only the ring's SVG stroke and the check drawing use the JS driver."
112
+ ]
113
+ ],
114
+ "usage": "import { Progress } from '@/components/ui/progress';\n\n<Progress value={64} label=\"Uploading trip-to-lisbon.mov\" showValue />\n<Progress variant=\"circular\" value={64} />",
115
+ "examples": [
116
+ {
117
+ "name": "Linear",
118
+ "title": "Linear",
119
+ "code": "import React, { useEffect, useState } from 'react';\nimport { Text, View } from 'react-native';\nimport { Button } from '@/components/ui/button';\nimport { Progress } from '@/components/ui/progress';\n\nexport default function Linear() {\n const [value, setValue] = useState(32);\n return (\n <View style={{ gap: 18 }}>\n <Progress value={value} label=\"Uploading trip-to-lisbon.mov\" showValue />\n <Progress value={value} size=\"sm\" />\n <Progress value={value} size=\"lg\" />\n <View style={{ flexDirection: 'row', gap: 10 }}>\n <Button size=\"sm\" variant=\"outline\" onPress={() => setValue((v) => Math.max(0, v - 20))}>\n − 20\n </Button>\n <Button size=\"sm\" variant=\"outline\" onPress={() => setValue((v) => Math.min(100, v + 20))}>\n + 20\n </Button>\n </View>\n </View>\n );\n}\n"
120
+ },
121
+ {
122
+ "name": "Download",
123
+ "title": "Download",
124
+ "code": "import React, { useEffect, useState } from 'react';\nimport { Text, View } from 'react-native';\nimport { Progress } from '@/components/ui/progress';\nimport { useKit } from '@/lib/kit';\n\nexport default function Download() {\n const { colors } = useKit();\n const [mb, setMb] = useState(6);\n useEffect(() => {\n const id = setInterval(() => setMb((v) => (v >= 48 ? 0 : Math.min(48, v + 3.4))), 700);\n return () => clearInterval(id);\n }, []);\n return (\n <View style={{ gap: 6 }}>\n <Progress\n value={mb}\n max={48}\n label=\"Offline maps · Portugal\"\n showValue\n formatValue={(v, max) => `${v.toFixed(1)} of ${max} MB`}\n />\n <Text style={{ fontSize: 12, color: colors.mutedForeground }}>\n {mb >= 48 ? 'Ready to use offline' : `4.8 MB/s · about ${Math.ceil((48 - mb) / 4.8)} s left`}\n </Text>\n </View>\n );\n}\n"
125
+ },
126
+ {
127
+ "name": "Completion",
128
+ "title": "Completion",
129
+ "code": "import React, { useEffect, useState } from 'react';\nimport { Text, View } from 'react-native';\nimport { Button } from '@/components/ui/button';\nimport { Progress } from '@/components/ui/progress';\n\nexport default function Completion() {\n const [value, setValue] = useState(0);\n useEffect(() => {\n if (value >= 100) return;\n const id = setTimeout(() => setValue((v) => Math.min(100, v + 12 + Math.round(Math.random() * 10))), 450);\n return () => clearTimeout(id);\n }, [value]);\n return (\n <View style={{ gap: 18 }}>\n <Progress value={value} label={value >= 100 ? 'Backup complete' : 'Backing up photos'} showValue />\n <View style={{ flexDirection: 'row', alignItems: 'center', gap: 16 }}>\n <Progress variant=\"circular\" size=\"md\" value={value} />\n <Button size=\"sm\" variant=\"outline\" onPress={() => setValue(0)}>\n Run again\n </Button>\n </View>\n </View>\n );\n}\n"
130
+ },
131
+ {
132
+ "name": "Indeterminate",
133
+ "title": "Indeterminate",
134
+ "code": "import { Text, View } from 'react-native';\nimport { Progress } from '@/components/ui/progress';\n\nexport default function Indeterminate() {\n return (\n <View style={{ gap: 18 }}>\n <Progress indeterminate label=\"Connecting to Wi‑Fi printer\" />\n <Progress value={64} striped label=\"Compressing video\" showValue />\n <Progress indeterminate size=\"sm\" />\n </View>\n );\n}\n"
135
+ },
136
+ {
137
+ "name": "Spinning",
138
+ "title": "Spinning",
139
+ "code": "import { Text, View } from 'react-native';\nimport { Progress } from '@/components/ui/progress';\n\nexport default function Spinning() {\n return (\n <View style={{ flexDirection: 'row', justifyContent: 'space-around' }}>\n <Progress variant=\"circular\" size=\"sm\" indeterminate />\n <Progress variant=\"circular\" size=\"md\" indeterminate label=\"Restoring backup\" />\n </View>\n );\n}\n"
140
+ },
141
+ {
142
+ "name": "Circular",
143
+ "title": "Circular",
144
+ "code": "import React, { useEffect, useState } from 'react';\nimport { Text, View } from 'react-native';\nimport { Progress } from '@/components/ui/progress';\n\nexport default function Circular() {\n const [value, setValue] = useState(0);\n useEffect(() => {\n const id = setInterval(() => setValue((v) => (v >= 100 ? 0 : v + 25)), 1600);\n return () => clearInterval(id);\n }, []);\n return (\n <View style={{ flexDirection: 'row', alignItems: 'flex-end', justifyContent: 'space-around' }}>\n <Progress variant=\"circular\" size=\"sm\" value={value} />\n <Progress variant=\"circular\" size=\"md\" value={72} label=\"iCloud storage\" />\n <Progress variant=\"circular\" size=\"lg\" value={value} label=\"Move goal\" />\n </View>\n );\n}\n"
145
+ },
146
+ {
147
+ "name": "Steps",
148
+ "title": "Steps",
149
+ "code": "import React, { useEffect, useState } from 'react';\nimport { Text, View } from 'react-native';\nimport { Button } from '@/components/ui/button';\nimport { Progress } from '@/components/ui/progress';\n\nexport default function Steps() {\n const [step, setStep] = useState(2);\n return (\n <View style={{ gap: 16 }}>\n <Progress\n variant=\"steps\"\n steps={5}\n value={step}\n label={step >= 5 ? 'Profile ready' : 'Set up your profile'}\n showValue\n formatValue={(v, max) => `Step ${Math.min(max, v + 1)} of ${max}`}\n />\n <View style={{ flexDirection: 'row', gap: 10 }}>\n <Button size=\"sm\" variant=\"outline\" onPress={() => setStep((s) => Math.max(0, s - 1))}>\n Back\n </Button>\n <Button size=\"sm\" variant=\"accent\" onPress={() => setStep((s) => Math.min(5, s + 1))}>\n Continue\n </Button>\n </View>\n </View>\n );\n}\n"
150
+ }
151
+ ]
152
+ }
@@ -0,0 +1,112 @@
1
+ {
2
+ "name": "radio-group",
3
+ "category": "Selection",
4
+ "aliases": [],
5
+ "exportName": "RadioGroup",
6
+ "files": [
7
+ "src/components/ui/radio-group.tsx"
8
+ ],
9
+ "summary": "The dot springs in with a ripple; cards light up and draw a check badge.",
10
+ "props": [
11
+ [
12
+ "options",
13
+ "{ value, label, description?, icon?, hint?, disabled? }[]",
14
+ "—",
15
+ "The choices. `hint` is trailing text such as a price."
16
+ ],
17
+ [
18
+ "value / onValueChange",
19
+ "string",
20
+ "—",
21
+ "Controlled selection (or use defaultValue)."
22
+ ],
23
+ [
24
+ "defaultValue",
25
+ "string",
26
+ "—",
27
+ "Initial selection when uncontrolled."
28
+ ],
29
+ [
30
+ "variant",
31
+ "\"default\" | \"card\" | \"segmented-list\"",
32
+ "\"default\"",
33
+ "Radio dots, selectable cards or a grouped list with ticks."
34
+ ],
35
+ [
36
+ "direction",
37
+ "\"vertical\" | \"horizontal\"",
38
+ "\"vertical\"",
39
+ "Stack or lay out side by side (cards share the width)."
40
+ ],
41
+ [
42
+ "accent",
43
+ "string",
44
+ "theme accent",
45
+ "Selected colour."
46
+ ],
47
+ [
48
+ "haptics",
49
+ "boolean",
50
+ "true",
51
+ "Selection tick on change."
52
+ ],
53
+ [
54
+ "disabled",
55
+ "boolean",
56
+ "false",
57
+ "Disable the whole group (or per option)."
58
+ ],
59
+ [
60
+ "style",
61
+ "StyleProp<ViewStyle>",
62
+ "—",
63
+ "Style for the group container (the bordered card in the segmented-list variant)."
64
+ ]
65
+ ],
66
+ "behavior": [
67
+ [
68
+ "Touch",
69
+ "Rows squish on press in the default and card variants, and the default dot has extra hitSlop. Disabled options are dimmed and ignore taps."
70
+ ],
71
+ [
72
+ "Motion",
73
+ "The selected dot pops on a bouncy spring with a ripple ring. Cards tint their border and pop a self-drawing check; the list variant draws a tick."
74
+ ],
75
+ [
76
+ "Haptics",
77
+ "A selection tick plays on each change (haptics, on by default)."
78
+ ],
79
+ [
80
+ "Screen readers",
81
+ "The group is a radiogroup and each option a radio with checked and disabled state. Descriptions are read as hints."
82
+ ]
83
+ ],
84
+ "usage": "import { RadioGroup } from '@/components/ui/radio-group';\n\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 · $9' },\n ]}\n/>",
85
+ "examples": [
86
+ {
87
+ "name": "Default",
88
+ "title": "Default",
89
+ "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"
90
+ },
91
+ {
92
+ "name": "Horizontal",
93
+ "title": "Horizontal",
94
+ "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"
95
+ },
96
+ {
97
+ "name": "Cards",
98
+ "title": "Cards",
99
+ "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"
100
+ },
101
+ {
102
+ "name": "CardsHorizontal",
103
+ "title": "Cards Horizontal",
104
+ "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"
105
+ },
106
+ {
107
+ "name": "GroupedList",
108
+ "title": "Grouped List",
109
+ "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"
110
+ }
111
+ ]
112
+ }
@@ -0,0 +1,114 @@
1
+ {
2
+ "name": "rating",
3
+ "category": "Selection",
4
+ "aliases": [],
5
+ "exportName": "Rating",
6
+ "files": [
7
+ "src/components/ui/rating.tsx"
8
+ ],
9
+ "summary": "Drag across the stars to rate; the top one throws a little spark burst.",
10
+ "props": [
11
+ [
12
+ "value / onValueChange",
13
+ "number",
14
+ "—",
15
+ "Controlled value (or use defaultValue)."
16
+ ],
17
+ [
18
+ "defaultValue",
19
+ "number",
20
+ "0",
21
+ "Initial value when uncontrolled."
22
+ ],
23
+ [
24
+ "max",
25
+ "number",
26
+ "5",
27
+ "Number of icons."
28
+ ],
29
+ [
30
+ "allowHalf",
31
+ "boolean",
32
+ "false",
33
+ "Half-icon precision when tapping or dragging."
34
+ ],
35
+ [
36
+ "readOnly",
37
+ "boolean",
38
+ "false",
39
+ "Display only; fractional values (4.3) fill partially."
40
+ ],
41
+ [
42
+ "clearable",
43
+ "boolean",
44
+ "false",
45
+ "Tap the current value again to reset to 0."
46
+ ],
47
+ [
48
+ "icon",
49
+ "\"star\" | \"heart\"",
50
+ "\"star\"",
51
+ "Star or heart icons; heart switches the default fill to danger."
52
+ ],
53
+ [
54
+ "size",
55
+ "\"sm\" | \"md\" | \"lg\" | number",
56
+ "\"md\"",
57
+ "18 / 28 / 40pt, or any number."
58
+ ],
59
+ [
60
+ "accent",
61
+ "string",
62
+ "warning / danger",
63
+ "Fill colour."
64
+ ],
65
+ [
66
+ "gap",
67
+ "number",
68
+ "20% of size",
69
+ "Space between icons."
70
+ ],
71
+ [
72
+ "haptics",
73
+ "boolean",
74
+ "true",
75
+ "Selection tick for every step while tapping or dragging."
76
+ ],
77
+ [
78
+ "disabled",
79
+ "boolean",
80
+ "false",
81
+ "Dims and blocks input."
82
+ ],
83
+ [
84
+ "style",
85
+ "StyleProp<ViewStyle>",
86
+ "—",
87
+ "Style for the row of icons."
88
+ ]
89
+ ],
90
+ "behavior": [
91
+ [
92
+ "Touch",
93
+ "Tap or drag across the row to set the value, to half-icon precision with allowHalf. With clearable, tapping the current value clears it."
94
+ ],
95
+ [
96
+ "Motion",
97
+ "Icons fill smoothly and pop in a quick stagger with a wobble. When you raise the rating, the top icon throws a spark burst."
98
+ ],
99
+ [
100
+ "Haptics",
101
+ "A selection tick plays for every step while tapping or dragging."
102
+ ],
103
+ [
104
+ "Screen readers",
105
+ "One adjustable element read as 'N of 5'. Swipe up or down to change it by one step."
106
+ ],
107
+ [
108
+ "Web",
109
+ "Works with the mouse too, and shows a pointer cursor while interactive."
110
+ ]
111
+ ],
112
+ "usage": null,
113
+ "examples": []
114
+ }