@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,198 @@
1
+ {
2
+ "name": "sign-in",
3
+ "category": "Blocks",
4
+ "aliases": [],
5
+ "exportName": "SignIn",
6
+ "files": [
7
+ "src/components/blocks/sign-in.tsx"
8
+ ],
9
+ "props": [
10
+ [
11
+ "methods",
12
+ "('apple' | 'google' | 'microsoft' | 'github' | 'phone' | 'email')[]",
13
+ "['apple', 'google', 'phone', 'email']",
14
+ "Options in display order. OAuth ones render as 'Continue with X'; phone / email open their step. Exactly one of phone / email and no OAuth skips the welcome step."
15
+ ],
16
+ [
17
+ "emailMode",
18
+ "'password' | 'code' | 'magic-link'",
19
+ "'password'",
20
+ "What follows the email step: a password, a one-time email code, or a magic link + 'Check your inbox'."
21
+ ],
22
+ [
23
+ "mode / defaultMode",
24
+ "'sign-in' | 'sign-up'",
25
+ "'sign-in'",
26
+ "Controlled / initial mode. Sign-up shows 'Create account' and a password strength meter."
27
+ ],
28
+ [
29
+ "onModeChange",
30
+ "(mode) => void",
31
+ "—",
32
+ "The footer 'Sign up' / 'Sign in' link toggled the mode."
33
+ ],
34
+ [
35
+ "initialStep",
36
+ "'welcome' | 'phone' | 'otp' | 'email' | 'password' | 'email-code' | 'check-email' | 'forgot'",
37
+ "'welcome'",
38
+ "Step to open on mount (demos, deep links). Back still walks a sensible stack."
39
+ ],
40
+ [
41
+ "defaultPhone",
42
+ "string",
43
+ "''",
44
+ "Prefill the number (digits; a leading dial code is stripped)."
45
+ ],
46
+ [
47
+ "defaultEmail",
48
+ "string",
49
+ "''",
50
+ "Prefill the email field."
51
+ ],
52
+ [
53
+ "countryCode",
54
+ "string",
55
+ "'+91'",
56
+ "Selected dial code. +91 formats as '98765 43210' and needs 10 digits; others accept 7–15."
57
+ ],
58
+ [
59
+ "countries",
60
+ "{ code, dial, flag? }[]",
61
+ "IN, US, GB, AE, SG, AU",
62
+ "Dial-code picker list (tap the chip). One entry hides the picker."
63
+ ],
64
+ [
65
+ "otpLength",
66
+ "number",
67
+ "6",
68
+ "Digits in the one-time code."
69
+ ],
70
+ [
71
+ "resendSeconds",
72
+ "number",
73
+ "30",
74
+ "Countdown before 'Resend code' / 'Resend' is available."
75
+ ],
76
+ [
77
+ "onOAuth",
78
+ "(provider) => void | Promise",
79
+ "—",
80
+ "OAuth button pressed. Spinner while pending; resolve → onSuccess, throw → message shown inline."
81
+ ],
82
+ [
83
+ "onSendPhoneCode",
84
+ "(fullPhone: string) => void | Promise",
85
+ "—",
86
+ "Send an SMS code to the E.164 number ('+919876543210'). Resolve to open the code step; also used by Resend."
87
+ ],
88
+ [
89
+ "onVerifyPhoneCode",
90
+ "(fullPhone, code) => void | Promise",
91
+ "—",
92
+ "Called when the cells fill. Resolve → success state then onSuccess; throw → error on the cells."
93
+ ],
94
+ [
95
+ "onEmailPassword",
96
+ "({ email, password, mode }) => void | Promise",
97
+ "—",
98
+ "Password step submitted. Resolve → onSuccess; throw → message under the field."
99
+ ],
100
+ [
101
+ "onSendEmailCode",
102
+ "(email) => void | Promise",
103
+ "—",
104
+ "emailMode 'code': send the code. Resolve to open the code step."
105
+ ],
106
+ [
107
+ "onVerifyEmailCode",
108
+ "(email, code) => void | Promise",
109
+ "—",
110
+ "emailMode 'code': check the code. Resolve → onSuccess."
111
+ ],
112
+ [
113
+ "onSendMagicLink",
114
+ "(email) => void | Promise",
115
+ "—",
116
+ "emailMode 'magic-link': send the link. Resolve to show 'Check your inbox'."
117
+ ],
118
+ [
119
+ "onForgotPassword",
120
+ "(email) => void | Promise",
121
+ "—",
122
+ "'Send reset link' pressed on the forgot step. Resolve to show 'Check your inbox'."
123
+ ],
124
+ [
125
+ "onSuccess",
126
+ "() => void",
127
+ "—",
128
+ "Called after any successful final step (OAuth, code verified, email + password)."
129
+ ],
130
+ [
131
+ "onBack",
132
+ "() => void",
133
+ "—",
134
+ "Shows a back button on the first step."
135
+ ],
136
+ [
137
+ "onTerms / onPrivacy",
138
+ "() => void",
139
+ "—",
140
+ "Make 'Terms' / 'Privacy Policy' in the legal line tappable."
141
+ ],
142
+ [
143
+ "appName",
144
+ "string",
145
+ "'Northwind'",
146
+ "Used in the default title and the logo initial."
147
+ ],
148
+ [
149
+ "logo",
150
+ "ReactNode",
151
+ "monochrome initial mark",
152
+ "Replace the welcome logo."
153
+ ],
154
+ [
155
+ "title",
156
+ "string",
157
+ "`Welcome to ${appName}`",
158
+ "Welcome heading."
159
+ ],
160
+ [
161
+ "subtitle",
162
+ "string",
163
+ "'Sign in to continue.'",
164
+ "Line under the welcome heading."
165
+ ],
166
+ [
167
+ "accent",
168
+ "string",
169
+ "theme accent",
170
+ "Primary buttons, links and focus rings (black in light, white in dark by default)."
171
+ ],
172
+ [
173
+ "style",
174
+ "StyleProp<ViewStyle>",
175
+ "—",
176
+ "Root style."
177
+ ],
178
+ [
179
+ "error / onDismissError",
180
+ "string / () => void",
181
+ "—",
182
+ "Controlled error shown on the current step; onDismissError fires when the user edits or navigates."
183
+ ],
184
+ [
185
+ "onSignUp",
186
+ "() => void",
187
+ "—",
188
+ "Pressed 'Sign up' — called instead of toggling the mode."
189
+ ],
190
+ [
191
+ "onSubmit / onSocial / providers",
192
+ "deprecated",
193
+ "—",
194
+ "Aliases of onEmailPassword / onOAuth; providers (apple / google) sets the OAuth part of methods when methods isn't given."
195
+ ]
196
+ ],
197
+ "examples": []
198
+ }
@@ -0,0 +1,142 @@
1
+ {
2
+ "name": "skeleton",
3
+ "category": "Feedback",
4
+ "aliases": [],
5
+ "exportName": "SkeletonGroup",
6
+ "files": [
7
+ "src/components/ui/skeleton.tsx"
8
+ ],
9
+ "props": [
10
+ [
11
+ "width / height",
12
+ "DimensionValue",
13
+ "\"100%\" / 14",
14
+ "Block width and height, in points or percent."
15
+ ],
16
+ [
17
+ "radius",
18
+ "\"sm\" | \"md\" | \"lg\" | \"xl\" | \"capsule\" | \"full\" | number",
19
+ "\"sm\"",
20
+ "Corner radius. 'capsule' follows the kit radius for bars; 'full' is always a pill / circle."
21
+ ],
22
+ [
23
+ "variant",
24
+ "\"shimmer\" | \"wave\" | \"pulse\" | \"static\"",
25
+ "\"shimmer\"",
26
+ "Angled light band sweeping all blocks as one wave, a staggered top-to-bottom brighten, an opacity pulse, or no motion. Every variant is static when reduce motion is on."
27
+ ],
28
+ [
29
+ "color",
30
+ "string",
31
+ "faint foreground",
32
+ "Block colour."
33
+ ],
34
+ [
35
+ "children",
36
+ "ReactNode",
37
+ "—",
38
+ "Centred overlay inside the block (e.g. a faint glyph)."
39
+ ],
40
+ [
41
+ "Skeleton.Text",
42
+ "{ lines, lineHeight, gap, lastLineWidth }",
43
+ "3 lines",
44
+ "Paragraph placeholder with a slightly ragged edge."
45
+ ],
46
+ [
47
+ "Skeleton.Avatar",
48
+ "{ size, shape: \"circle\" | \"rounded\" }",
49
+ "40, circle",
50
+ "Avatar placeholder."
51
+ ],
52
+ [
53
+ "Skeleton.Media",
54
+ "{ aspectRatio, height, width, glyph, glyphSize, radius }",
55
+ "16 / 9, glyph off",
56
+ "Image block with a faint picture glyph in the centre."
57
+ ],
58
+ [
59
+ "Skeleton.List",
60
+ "{ rows, avatarSize, avatarShape, trailing, dividers }",
61
+ "4 rows, 44, circle, trailing on",
62
+ "Rows with an avatar, two lines and a trailing pill."
63
+ ],
64
+ [
65
+ "Skeleton.Card",
66
+ "{ media, mediaHeight, header, lines, actions }",
67
+ "all on, 168",
68
+ "Feed post: author row with menu, caption, media and an action bar."
69
+ ],
70
+ [
71
+ "Skeleton.Nav",
72
+ "{ header, back, actions, tabs, tabCount, rows, children }",
73
+ "header + 4 tabs + 4 rows",
74
+ "Screen chrome while content loads — app bar, list body, bottom tabs."
75
+ ],
76
+ [
77
+ "Skeleton.Group",
78
+ "{ style, children }",
79
+ "window",
80
+ "Frame the shimmer / wave travels across, so blocks inside line up as one wave (Nav and Reveal add one)."
81
+ ],
82
+ [
83
+ "Skeleton.Reveal",
84
+ "{ loading, skeleton, children, stagger, animateHeight, loadingLabel }",
85
+ "—, 3 lines, —, 70, true, \"Loading\"",
86
+ "Shows `skeleton` while loading; then it dissolves, top-level children rise in with a stagger and the height glides between the two."
87
+ ],
88
+ [
89
+ "style",
90
+ "StyleProp<ViewStyle>",
91
+ "—",
92
+ "Style for the block (composites apply it to their wrapper)."
93
+ ]
94
+ ],
95
+ "examples": [
96
+ {
97
+ "name": "Shimmer",
98
+ "title": "Shimmer",
99
+ "code": "import { Text, View, type DimensionValue } from 'react-native';\nimport { Skeleton } from '@/components/ui/skeleton';\n\nexport default function Shimmer() {\n return (\n <Skeleton.Group style={{ flexDirection: 'row', alignItems: 'center', gap: 14 }}>\n <Skeleton.Avatar size={52} />\n <View style={{ flex: 1, gap: 10 }}>\n <Skeleton width=\"70%\" height={14} radius=\"capsule\" />\n <Skeleton width=\"45%\" height={12} radius=\"capsule\" />\n </View>\n </Skeleton.Group>\n );\n}\n"
100
+ },
101
+ {
102
+ "name": "Card",
103
+ "title": "Card",
104
+ "code": "import { Skeleton } from '@/components/ui/skeleton';\n\nexport default function Card() {\n return (\n <Skeleton.Group style={{ gap: 14 }}>\n <Skeleton.Card />\n <Skeleton.Card media={false} lines={3} />\n </Skeleton.Group>\n );\n}\n"
105
+ },
106
+ {
107
+ "name": "List",
108
+ "title": "List",
109
+ "code": "import { Skeleton } from '@/components/ui/skeleton';\nimport { useKit } from '@/lib/kit';\n\nexport default function List() {\n const { radius } = useKit();\n return (\n <Skeleton.Group style={{ gap: 8 }}>\n <Skeleton height={40} radius={radius.capsule(40)} />\n <Skeleton.List rows={5} dividers />\n </Skeleton.Group>\n );\n}\n"
110
+ },
111
+ {
112
+ "name": "ProductGrid",
113
+ "title": "Product Grid",
114
+ "code": "import { Text, View, type DimensionValue } from 'react-native';\nimport { Skeleton } from '@/components/ui/skeleton';\n\nexport default function ProductGrid() {\n return (\n <Skeleton.Group style={{ flexDirection: 'row', flexWrap: 'wrap', gap: 12 }}>\n {[0, 1, 2, 3].map((i) => (\n <View key={i} style={{ flexBasis: '45%', flexGrow: 1, gap: 8 }}>\n <Skeleton.Media aspectRatio={1} radius=\"lg\" />\n <Skeleton width={i % 2 ? '70%' : '86%'} height={12} radius=\"capsule\" />\n <Skeleton width={56} height={14} radius=\"capsule\" />\n </View>\n ))}\n </Skeleton.Group>\n );\n}\n"
115
+ },
116
+ {
117
+ "name": "ProfileHeader",
118
+ "title": "Profile Header",
119
+ "code": "import { Text, View, type DimensionValue } from 'react-native';\nimport { Skeleton } from '@/components/ui/skeleton';\nimport { useKit } from '@/lib/kit';\n\nconst ROW_W: DimensionValue[] = ['34%', '46%', '28%'];\n\nexport default function ProfileHeader() {\n const { colors, radius, dark } = useKit();\n const surface = { backgroundColor: dark ? colors.card : colors.muted, borderRadius: radius.xl, paddingHorizontal: 14 };\n return (\n <Skeleton.Group style={{ gap: 20 }}>\n <View style={{ flexDirection: 'row', alignItems: 'center', gap: 16 }}>\n <Skeleton.Avatar size={72} />\n <View style={{ flex: 1, gap: 9 }}>\n <Skeleton width=\"58%\" height={16} radius=\"capsule\" />\n <Skeleton width=\"74%\" height={11} radius=\"capsule\" />\n <Skeleton width={96} height={28} radius=\"full\" style={{ marginTop: 4 }} />\n </View>\n </View>\n {[3, 2].map((rows, g) => (\n <View key={g} style={{ gap: 8 }}>\n <Skeleton width={g ? 84 : 120} height={10} radius=\"capsule\" />\n <View style={surface}>\n {Array.from({ length: rows }, (_, i) => (\n <View key={i} style={{ flexDirection: 'row', alignItems: 'center', gap: 12, height: 52 }}>\n <Skeleton width={30} height={30} radius=\"md\" />\n <Skeleton width={ROW_W[i % 3]} height={12} radius=\"capsule\" />\n <View style={{ flex: 1 }} />\n <Skeleton width={[64, 40, 52][i % 3]} height={11} radius=\"capsule\" />\n </View>\n ))}\n </View>\n </View>\n ))}\n </Skeleton.Group>\n );\n}\n"
120
+ },
121
+ {
122
+ "name": "LoadingSwap",
123
+ "title": "Loading Swap",
124
+ "code": "import React, { useEffect, useRef, useState } from 'react';\nimport { Text, View, type DimensionValue } from 'react-native';\nimport { Button } from '@/components/ui/button';\nimport { Skeleton } from '@/components/ui/skeleton';\nimport { useKit } from '@/lib/kit';\n\nexport default function LoadingSwap() {\n const { colors, radius, text } = useKit();\n const [loading, setLoading] = useState(true);\n const timer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const reload = () => {\n setLoading(true);\n if (timer.current) clearTimeout(timer.current);\n timer.current = setTimeout(() => setLoading(false), 1600);\n };\n useEffect(() => {\n timer.current = setTimeout(() => setLoading(false), 1600);\n return () => {\n if (timer.current) clearTimeout(timer.current);\n };\n }, []);\n return (\n <View style={{ gap: 16 }}>\n <Skeleton.Reveal\n loading={loading}\n skeleton={\n <View style={{ gap: 12 }}>\n <Skeleton.List rows={1} trailing={false} />\n <Skeleton.Text lines={2} />\n </View>\n }\n >\n <View style={{ flexDirection: 'row', alignItems: 'center', gap: 12, paddingVertical: 10 }}>\n <View style={{ width: 44, height: 44, borderRadius: radius.full, backgroundColor: colors.accent, alignItems: 'center', justifyContent: 'center' }}>\n <Text style={{ color: colors.accentForeground, fontSize: 16, fontWeight: '400' }}>MC</Text>\n </View>\n <View style={{ flex: 1 }}>\n <Text style={[text.md, { color: colors.foreground, fontWeight: '400' }]}>Maya Chen</Text>\n <Text style={[text.sm, { color: colors.mutedForeground, fontWeight: '400' }]}>Product designer · Lisbon</Text>\n </View>\n </View>\n <Text style={[text.sm, { color: colors.foreground, fontWeight: '400', marginTop: 4 }]}>\n Shipped the new onboarding flow today. Activation is up 18% in the first week — thanks to everyone who tested the beta.\n </Text>\n <Text style={[text.xs, { color: colors.mutedForeground, fontWeight: '400', marginTop: 10 }]}>\n 124 likes · 18 comments\n </Text>\n </Skeleton.Reveal>\n <Button size=\"sm\" variant=\"outline\" style={{ alignSelf: 'flex-start' }} disabled={loading} onPress={reload}>\n {loading ? 'Loading…' : 'Reload'}\n </Button>\n </View>\n );\n}\n"
125
+ },
126
+ {
127
+ "name": "Wave",
128
+ "title": "Wave",
129
+ "code": "import { Text, View, type DimensionValue } from 'react-native';\nimport { Skeleton } from '@/components/ui/skeleton';\n\nexport default function Wave() {\n return (\n <Skeleton.Group style={{ gap: 16 }}>\n <Skeleton.Media variant=\"wave\" radius=\"lg\" />\n <Skeleton.Text variant=\"wave\" lines={3} />\n <Skeleton.List variant=\"wave\" rows={2} />\n </Skeleton.Group>\n );\n}\n"
130
+ },
131
+ {
132
+ "name": "Pulse",
133
+ "title": "Pulse",
134
+ "code": "import { Text, View, type DimensionValue } from 'react-native';\nimport { Skeleton } from '@/components/ui/skeleton';\n\nexport default function Pulse() {\n return (\n <View style={{ gap: 16 }}>\n <Skeleton variant=\"pulse\" height={140} radius=\"lg\" />\n <Skeleton.Text variant=\"pulse\" lines={3} />\n </View>\n );\n}\n"
135
+ },
136
+ {
137
+ "name": "Nav",
138
+ "title": "Nav",
139
+ "code": "import { Skeleton } from '@/components/ui/skeleton';\n\nexport default function Nav() {\n return <Skeleton.Nav rows={6} tabCount={5} style={{ minHeight: 600 }} />;\n}\n"
140
+ }
141
+ ]
142
+ }
@@ -0,0 +1,84 @@
1
+ {
2
+ "name": "slide-to-confirm",
3
+ "category": "Buttons",
4
+ "aliases": [],
5
+ "exportName": "SlideToConfirm",
6
+ "files": [
7
+ "src/components/ui/slide-to-confirm.tsx"
8
+ ],
9
+ "props": [
10
+ [
11
+ "label",
12
+ "string",
13
+ "\"Slide to confirm\"",
14
+ "Shimmering text in the track."
15
+ ],
16
+ [
17
+ "confirmedLabel",
18
+ "string",
19
+ "\"Confirmed\"",
20
+ "Text once completed."
21
+ ],
22
+ [
23
+ "onConfirm",
24
+ "() => void | Promise<unknown>",
25
+ "—",
26
+ "Fires at the end. Return a promise to show a spinner in the thumb; a rejection shakes the track, flashes the danger colour and slides back."
27
+ ],
28
+ [
29
+ "variant",
30
+ "\"default\" | \"gradient\" | \"outline\" | \"compact\"",
31
+ "\"default\"",
32
+ "Tinted track with a solid thumb, opt-in two-tone gradient track with a white thumb, transparent track with a tinted hairline, or a 48pt slim track."
33
+ ],
34
+ [
35
+ "accent",
36
+ "string",
37
+ "theme accent",
38
+ "Thumb, trail and track colour; only the gradient variant derives a second tone from it."
39
+ ],
40
+ [
41
+ "icon",
42
+ "ReactNode",
43
+ "animated chevrons",
44
+ "Custom thumb icon."
45
+ ],
46
+ [
47
+ "resetAfter",
48
+ "number",
49
+ "—",
50
+ "Auto-reset after this many ms. Otherwise call ref.reset()."
51
+ ],
52
+ [
53
+ "threshold",
54
+ "number",
55
+ "0.82",
56
+ "Fraction of the track that confirms on release."
57
+ ],
58
+ [
59
+ "haptics",
60
+ "boolean",
61
+ "true",
62
+ "Ticks at 25 / 50 / 75 %, success on confirm, error on failure."
63
+ ],
64
+ [
65
+ "disabled",
66
+ "boolean",
67
+ "false",
68
+ "Locks the thumb."
69
+ ],
70
+ [
71
+ "ref",
72
+ "{ reset(): void }",
73
+ "—",
74
+ "Imperative reset."
75
+ ],
76
+ [
77
+ "style",
78
+ "StyleProp<ViewStyle>",
79
+ "—",
80
+ "Style for the track (merged over its height, radius and colour)."
81
+ ]
82
+ ],
83
+ "examples": []
84
+ }
@@ -0,0 +1,157 @@
1
+ {
2
+ "name": "slider",
3
+ "category": "Inputs",
4
+ "aliases": [],
5
+ "exportName": "Slider",
6
+ "files": [
7
+ "src/components/ui/slider.tsx"
8
+ ],
9
+ "props": [
10
+ [
11
+ "value / defaultValue",
12
+ "number | [number, number]",
13
+ "min / [min, max]",
14
+ "Controlled or uncontrolled. A number, or [from, to] when range is set (typed by the range prop)."
15
+ ],
16
+ [
17
+ "onValueChange",
18
+ "(value) => void",
19
+ "—",
20
+ "Fires when the stepped value changes (drag, tap, icon or accessibility action)."
21
+ ],
22
+ [
23
+ "onSlidingStart / onSlidingComplete",
24
+ "(value) => void",
25
+ "—",
26
+ "Drag lifecycle."
27
+ ],
28
+ [
29
+ "min / max / step",
30
+ "number",
31
+ "0 / 100 / 1",
32
+ "Bounds and snap interval (0 = continuous). Coarse steps spring between positions; fine ones follow the finger and snap on release."
33
+ ],
34
+ [
35
+ "range",
36
+ "boolean",
37
+ "false",
38
+ "Two thumbs selecting a span; value becomes [from, to]."
39
+ ],
40
+ [
41
+ "variant",
42
+ "\"default\" | \"bar\" | \"stepped\"",
43
+ "\"default\"",
44
+ "Thin track + round thumb, a tall Control-Center bar with no thumb, or a track with a tick at every step."
45
+ ],
46
+ [
47
+ "size",
48
+ "\"sm\" | \"md\" | \"lg\"",
49
+ "\"md\"",
50
+ "Scales track, thumb, bar height and text. Hit area is always ≥ 44pt."
51
+ ],
52
+ [
53
+ "marks",
54
+ "boolean | (number | { value, label })[]",
55
+ "stepped: true",
56
+ "Ticks at every step, or custom values with labels under the track."
57
+ ],
58
+ [
59
+ "showValue",
60
+ "\"drag\" | \"always\" | \"never\"",
61
+ "\"drag\" (bar: \"never\")",
62
+ "Value tooltip above the thumb. On a bar, \"always\" shows the value inside the bar instead."
63
+ ],
64
+ [
65
+ "formatValue",
66
+ "(value) => string",
67
+ "—",
68
+ "Text for the tooltip, labels and accessibility value."
69
+ ],
70
+ [
71
+ "showMinMax / minLabel / maxLabel",
72
+ "boolean / string / string",
73
+ "—",
74
+ "Labels under both ends of the track (formatted min / max by default)."
75
+ ],
76
+ [
77
+ "icon",
78
+ "SliderIconName | ReactNode | (color) => ReactNode",
79
+ "—",
80
+ "Bar only: icon inside the bar that changes colour as the fill passes over it."
81
+ ],
82
+ [
83
+ "leftIcon / rightIcon",
84
+ "SliderIconName | ReactNode | (color) => ReactNode",
85
+ "—",
86
+ "Icon beside the track. Built-ins ('volume-low', 'volume-high', 'volume-off', 'sun-low', 'sun-high', 'minus', 'plus') step the value when tapped."
87
+ ],
88
+ [
89
+ "thickFill",
90
+ "boolean",
91
+ "false",
92
+ "Default variant: draws the fill thicker than the track."
93
+ ],
94
+ [
95
+ "histogram / histogramHeight",
96
+ "number[] / number",
97
+ "— / 44",
98
+ "Bars above the track; bars inside the selection use the accent."
99
+ ],
100
+ [
101
+ "disabled",
102
+ "boolean",
103
+ "false",
104
+ "Dims and ignores touches."
105
+ ],
106
+ [
107
+ "accent",
108
+ "string",
109
+ "theme accent",
110
+ "Fill colour."
111
+ ],
112
+ [
113
+ "accessibilityLabel",
114
+ "string",
115
+ "—",
116
+ "Announced with the adjustable role; range thumbs get “minimum” / “maximum”."
117
+ ],
118
+ [
119
+ "style / trackStyle / fillStyle / thumbStyle / labelStyle",
120
+ "StyleProp",
121
+ "—",
122
+ "Root, inactive track, active fill, thumb and value text."
123
+ ]
124
+ ],
125
+ "examples": [
126
+ {
127
+ "name": "ControlCenter",
128
+ "title": "Control Center",
129
+ "code": "import React, { useState } from 'react';\nimport { StyleSheet, Text, View, type ViewProps } from 'react-native';\nimport { Slider } from '@/components/ui/slider';\nimport { 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={[s.card, { backgroundColor: colors.card, borderColor: colors.border, borderRadius: radius.xl }, style]}\n {...rest}\n />\n );\n}\n\nfunction Header({ title, value }: { title: string; value?: string }) {\n const { colors } = useKit();\n return (\n <View style={s.head}>\n <Text style={[s.title, { color: colors.foreground }]}>{title}</Text>\n {value ? <Text style={[s.value, { color: colors.mutedForeground }]}>{value}</Text> : null}\n </View>\n );\n}\n\nconst s = StyleSheet.create({\n card: { padding: 16, borderWidth: StyleSheet.hairlineWidth, gap: 12 },\n head: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'baseline' },\n title: { fontSize: 15, fontWeight: '400' },\n value: { fontSize: 15, fontWeight: '400', fontVariant: ['tabular-nums'] },\n label: { fontSize: 12, fontWeight: '400', letterSpacing: 0.4, textTransform: 'uppercase', marginBottom: -8 },\n note: { fontSize: 13 },\n});\n\nexport default function ControlCenter() {\n const [brightness, setBrightness] = useState(72);\n return (\n <Card>\n <Header title=\"Display & sound\" />\n <Slider\n variant=\"bar\"\n size=\"lg\"\n step={0}\n value={brightness}\n onValueChange={setBrightness}\n icon=\"sun-high\"\n showValue=\"always\"\n formatValue={(v) => `${Math.round(v)}%`}\n accessibilityLabel=\"Brightness\"\n />\n <Slider variant=\"bar\" size=\"lg\" defaultValue={40} icon=\"volume-high\" accessibilityLabel=\"Volume\" />\n </Card>\n );\n}\n"
130
+ },
131
+ {
132
+ "name": "Default",
133
+ "title": "Default",
134
+ "code": "import React, { useState } from 'react';\nimport { StyleSheet, Text, View, type ViewProps } from 'react-native';\nimport { Slider } from '@/components/ui/slider';\nimport { 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={[s.card, { backgroundColor: colors.card, borderColor: colors.border, borderRadius: radius.xl }, style]}\n {...rest}\n />\n );\n}\n\nfunction Header({ title, value }: { title: string; value?: string }) {\n const { colors } = useKit();\n return (\n <View style={s.head}>\n <Text style={[s.title, { color: colors.foreground }]}>{title}</Text>\n {value ? <Text style={[s.value, { color: colors.mutedForeground }]}>{value}</Text> : null}\n </View>\n );\n}\n\nconst s = StyleSheet.create({\n card: { padding: 16, borderWidth: StyleSheet.hairlineWidth, gap: 12 },\n head: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'baseline' },\n title: { fontSize: 15, fontWeight: '400' },\n value: { fontSize: 15, fontWeight: '400', fontVariant: ['tabular-nums'] },\n label: { fontSize: 12, fontWeight: '400', letterSpacing: 0.4, textTransform: 'uppercase', marginBottom: -8 },\n note: { fontSize: 13 },\n});\n\nexport default function Default() {\n const [volume, setVolume] = useState(64);\n return (\n <Card>\n <Header title=\"Media volume\" value={`${volume}%`} />\n <Slider\n value={volume}\n onValueChange={setVolume}\n leftIcon=\"volume-low\"\n rightIcon=\"volume-high\"\n formatValue={(v) => `${v}%`}\n accessibilityLabel=\"Media volume\"\n />\n </Card>\n );\n}\n"
135
+ },
136
+ {
137
+ "name": "PriceRange",
138
+ "title": "Price Range",
139
+ "code": "import React, { useState } from 'react';\nimport { StyleSheet, Text, View, type ViewProps } from 'react-native';\nimport { Slider } from '@/components/ui/slider';\nimport { 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={[s.card, { backgroundColor: colors.card, borderColor: colors.border, borderRadius: radius.xl }, style]}\n {...rest}\n />\n );\n}\n\nfunction Header({ title, value }: { title: string; value?: string }) {\n const { colors } = useKit();\n return (\n <View style={s.head}>\n <Text style={[s.title, { color: colors.foreground }]}>{title}</Text>\n {value ? <Text style={[s.value, { color: colors.mutedForeground }]}>{value}</Text> : null}\n </View>\n );\n}\n\nconst PRICE_MAX = 2000;\n\nconst rupees = (v: number) => `₹${String(v).replace(/(\\d)(?=(\\d\\d)+\\d$)/g, '$1,')}`;\n\nconst PRICES = [2, 4, 7, 11, 16, 22, 30, 34, 38, 33, 29, 26, 21, 18, 14, 12, 9, 7, 5, 4, 3, 2, 2, 1];\n\nconst s = StyleSheet.create({\n card: { padding: 16, borderWidth: StyleSheet.hairlineWidth, gap: 12 },\n head: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'baseline' },\n title: { fontSize: 15, fontWeight: '400' },\n value: { fontSize: 15, fontWeight: '400', fontVariant: ['tabular-nums'] },\n label: { fontSize: 12, fontWeight: '400', letterSpacing: 0.4, textTransform: 'uppercase', marginBottom: -8 },\n note: { fontSize: 13 },\n});\n\nexport default function PriceRange() {\n const { colors } = useKit();\n const [price, setPrice] = useState<[number, number]>([400, 1400]);\n const per = PRICE_MAX / PRICES.length;\n const results = PRICES.reduce((n, c, i) => (i * per + per / 2 >= price[0] && i * per + per / 2 <= price[1] ? n + c : n), 0);\n return (\n <Card>\n <Header title=\"Price\" value={`${rupees(price[0])} – ${rupees(price[1])}${price[1] === PRICE_MAX ? '+' : ''}`} />\n <Slider\n range\n min={0}\n max={PRICE_MAX}\n step={50}\n value={price}\n onValueChange={setPrice}\n histogram={PRICES}\n histogramHeight={40}\n showMinMax\n maxLabel={`${rupees(PRICE_MAX)}+`}\n formatValue={rupees}\n accessibilityLabel=\"Price\"\n />\n <Text style={[s.note, { color: colors.mutedForeground }]}>{results * 3} stays match</Text>\n </Card>\n );\n}\n"
140
+ },
141
+ {
142
+ "name": "FontSize",
143
+ "title": "Font Size",
144
+ "code": "import React, { useState } from 'react';\nimport { StyleSheet, Text, View, type ViewProps } from 'react-native';\nimport { Slider } from '@/components/ui/slider';\nimport { 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={[s.card, { backgroundColor: colors.card, borderColor: colors.border, borderRadius: radius.xl }, style]}\n {...rest}\n />\n );\n}\n\nfunction Header({ title, value }: { title: string; value?: string }) {\n const { colors } = useKit();\n return (\n <View style={s.head}>\n <Text style={[s.title, { color: colors.foreground }]}>{title}</Text>\n {value ? <Text style={[s.value, { color: colors.mutedForeground }]}>{value}</Text> : null}\n </View>\n );\n}\n\nconst s = StyleSheet.create({\n card: { padding: 16, borderWidth: StyleSheet.hairlineWidth, gap: 12 },\n head: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'baseline' },\n title: { fontSize: 15, fontWeight: '400' },\n value: { fontSize: 15, fontWeight: '400', fontVariant: ['tabular-nums'] },\n label: { fontSize: 12, fontWeight: '400', letterSpacing: 0.4, textTransform: 'uppercase', marginBottom: -8 },\n note: { fontSize: 13 },\n});\n\nexport default function FontSize() {\n const { colors } = useKit();\n const [size, setSize] = useState(17);\n const glyph = (px: number) => <Text style={{ color: colors.mutedForeground, fontSize: px, fontWeight: '400' }}>A</Text>;\n return (\n <Card>\n <Header title=\"Text size\" value={`${size} pt`} />\n <Text style={{ color: colors.foreground, fontSize: size, lineHeight: size * 1.35 }}>\n Your reading view will look like this.\n </Text>\n <Slider\n variant=\"stepped\"\n min={13}\n max={23}\n step={2}\n value={size}\n onValueChange={setSize}\n leftIcon={glyph(13)}\n rightIcon={glyph(21)}\n showValue=\"never\"\n accessibilityLabel=\"Text size\"\n />\n </Card>\n );\n}\n"
145
+ },
146
+ {
147
+ "name": "Sizes",
148
+ "title": "Sizes",
149
+ "code": "import { StyleSheet, Text, View, type ViewProps } from 'react-native';\nimport { Slider } from '@/components/ui/slider';\nimport { 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={[s.card, { backgroundColor: colors.card, borderColor: colors.border, borderRadius: radius.xl }, style]}\n {...rest}\n />\n );\n}\n\nconst s = StyleSheet.create({\n card: { padding: 16, borderWidth: StyleSheet.hairlineWidth, gap: 12 },\n head: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'baseline' },\n title: { fontSize: 15, fontWeight: '400' },\n value: { fontSize: 15, fontWeight: '400', fontVariant: ['tabular-nums'] },\n label: { fontSize: 12, fontWeight: '400', letterSpacing: 0.4, textTransform: 'uppercase', marginBottom: -8 },\n note: { fontSize: 13 },\n});\n\nexport default function Sizes() {\n const { colors } = useKit();\n const label = (t: string) => <Text style={[s.label, { color: colors.mutedForeground }]}>{t}</Text>;\n return (\n <Card>\n {label('Small')}\n <Slider size=\"sm\" defaultValue={25} accessibilityLabel=\"Small\" />\n {label('Medium')}\n <Slider size=\"md\" defaultValue={50} accessibilityLabel=\"Medium\" />\n {label('Large')}\n <Slider size=\"lg\" defaultValue={75} accessibilityLabel=\"Large\" />\n {label('Disabled')}\n <Slider defaultValue={40} disabled accessibilityLabel=\"Disabled\" />\n </Card>\n );\n}\n"
150
+ },
151
+ {
152
+ "name": "Colors",
153
+ "title": "Colors",
154
+ "code": "import { StyleSheet, Text, View, type ViewProps } from 'react-native';\nimport { Slider } from '@/components/ui/slider';\nimport { 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={[s.card, { backgroundColor: colors.card, borderColor: colors.border, borderRadius: radius.xl }, style]}\n {...rest}\n />\n );\n}\n\nfunction Header({ title, value }: { title: string; value?: string }) {\n const { colors } = useKit();\n return (\n <View style={s.head}>\n <Text style={[s.title, { color: colors.foreground }]}>{title}</Text>\n {value ? <Text style={[s.value, { color: colors.mutedForeground }]}>{value}</Text> : null}\n </View>\n );\n}\n\nconst s = StyleSheet.create({\n card: { padding: 16, borderWidth: StyleSheet.hairlineWidth, gap: 12 },\n head: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'baseline' },\n title: { fontSize: 15, fontWeight: '400' },\n value: { fontSize: 15, fontWeight: '400', fontVariant: ['tabular-nums'] },\n label: { fontSize: 12, fontWeight: '400', letterSpacing: 0.4, textTransform: 'uppercase', marginBottom: -8 },\n note: { fontSize: 13 },\n});\n\nexport default function Colors() {\n const { colors } = useKit();\n return (\n <Card>\n <Header title=\"Daily goals\" />\n <Slider defaultValue={80} accent={colors.success} showValue=\"always\" formatValue={(v) => `${v}% steps`} accessibilityLabel=\"Steps\" />\n <Slider variant=\"bar\" size=\"sm\" defaultValue={55} accent={colors.warning} accessibilityLabel=\"Calories\" />\n <Slider variant=\"stepped\" min={0} max={10} step={1} defaultValue={3} accent={colors.danger} accessibilityLabel=\"Screen time hours\" />\n </Card>\n );\n}\n"
155
+ }
156
+ ]
157
+ }