vibefast-cli 1.2.1 → 1.3.1

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 (348) hide show
  1. package/README.md +30 -95
  2. package/dist/__tests__/recipes.test.js +94 -91
  3. package/dist/__tests__/recipes.test.js.map +1 -1
  4. package/dist/commands/add.d.ts.map +1 -1
  5. package/dist/commands/add.js +301 -125
  6. package/dist/commands/add.js.map +1 -1
  7. package/dist/commands/checklist.d.ts.map +1 -1
  8. package/dist/commands/checklist.js +85 -44
  9. package/dist/commands/checklist.js.map +1 -1
  10. package/dist/commands/health.d.ts.map +1 -1
  11. package/dist/commands/health.js +13 -4
  12. package/dist/commands/health.js.map +1 -1
  13. package/dist/commands/init.d.ts.map +1 -1
  14. package/dist/commands/init.js +118 -26
  15. package/dist/commands/init.js.map +1 -1
  16. package/dist/commands/migrate.d.ts +3 -0
  17. package/dist/commands/migrate.d.ts.map +1 -0
  18. package/dist/commands/migrate.js +202 -0
  19. package/dist/commands/migrate.js.map +1 -0
  20. package/dist/commands/remove.d.ts.map +1 -1
  21. package/dist/commands/remove.js +61 -3
  22. package/dist/commands/remove.js.map +1 -1
  23. package/dist/core/auth.d.ts.map +1 -1
  24. package/dist/core/auth.js +20 -18
  25. package/dist/core/auth.js.map +1 -1
  26. package/dist/core/codemod.d.ts +33 -0
  27. package/dist/core/codemod.d.ts.map +1 -1
  28. package/dist/core/codemod.js +116 -0
  29. package/dist/core/codemod.js.map +1 -1
  30. package/dist/core/detect.d.ts.map +1 -1
  31. package/dist/core/detect.js +24 -7
  32. package/dist/core/detect.js.map +1 -1
  33. package/dist/core/journal.d.ts +1 -0
  34. package/dist/core/journal.d.ts.map +1 -1
  35. package/dist/core/journal.js.map +1 -1
  36. package/dist/core/recipes.d.ts.map +1 -1
  37. package/dist/core/recipes.js +25 -7
  38. package/dist/core/recipes.js.map +1 -1
  39. package/dist/index.js +2 -2
  40. package/dist/index.js.map +1 -1
  41. package/docs/architecture.md +50 -0
  42. package/docs/commands.md +78 -0
  43. package/docs/contributing.md +27 -0
  44. package/docs/quickstart.md +50 -0
  45. package/docs/recipes.md +57 -0
  46. package/docs/troubleshooting.md +31 -0
  47. package/package.json +2 -2
  48. package/recipes/0/apps/native/src/components/advanced-ui/timeline/demo.tsx +445 -0
  49. package/recipes/0/apps/native/src/components/advanced-ui/timeline/timeline-view.tsx +355 -0
  50. package/recipes/0/apps/native/src/components/advanced-ui/timeline/types.ts +31 -0
  51. package/recipes/0/recipe.json +18 -0
  52. package/recipes/animated-chip/apps/native/src/components/advanced-ui/chip/demo.tsx +2 -1
  53. package/recipes/animated-chip/recipe.json +5 -2
  54. package/recipes/animated-chip-native@latest.zip +0 -0
  55. package/recipes/animated-chip@latest.zip +0 -0
  56. package/recipes/animated-switch/apps/native/src/components/advanced-ui/switch/demo.tsx +1 -1
  57. package/recipes/animated-switch/recipe.json +5 -2
  58. package/recipes/animated-switch-native@latest.zip +0 -0
  59. package/recipes/animated-switch@latest.zip +0 -0
  60. package/recipes/audio-recorder/apps/native/src/features/audio-recorder/components/audio-recorder.tsx +2 -1
  61. package/recipes/audio-recorder/apps/native/src/features/audio-recorder/demo/with-recording-list-demo.tsx +2 -2
  62. package/recipes/audio-recorder/recipe.json +7 -2
  63. package/recipes/audio-recorder-native@latest.zip +0 -0
  64. package/recipes/audio-recorder-supabase/apps/native/src/features/audio-recorder/components/audio-recorder.tsx +2 -1
  65. package/recipes/audio-recorder-supabase/apps/native/src/features/audio-recorder/demo/with-recording-list-demo.tsx +2 -1
  66. package/recipes/audio-recorder-supabase/recipe.json +12 -16
  67. package/recipes/audio-recorder-supabase-native@latest.zip +0 -0
  68. package/recipes/audio-recorder-supabase@latest.zip +0 -0
  69. package/recipes/audio-recorder@latest.zip +0 -0
  70. package/recipes/charts/apps/native/src/app/charts/index.tsx +3 -0
  71. package/recipes/charts/apps/native/src/features/charts/components/bar-chart.tsx +3 -1
  72. package/recipes/charts/apps/native/src/features/charts/components/candlestick-chart.tsx +3 -1
  73. package/recipes/charts/apps/native/src/features/charts/components/column-chart.tsx +3 -1
  74. package/recipes/charts/apps/native/src/features/charts/components/doughnut-chart.tsx +3 -1
  75. package/recipes/charts/apps/native/src/features/charts/components/line-chart.tsx +3 -1
  76. package/recipes/charts/apps/native/src/features/charts/components/radar-chart.tsx +3 -1
  77. package/recipes/charts/apps/native/src/features/charts/components/stacked-bar-chart.tsx +3 -1
  78. package/recipes/charts/recipe.json +13 -4
  79. package/recipes/charts-native@latest.zip +0 -0
  80. package/recipes/charts@latest.zip +0 -0
  81. package/recipes/chatbot/apps/native/src/features/chatbot/components/chat-markdown.tsx +86 -86
  82. package/recipes/chatbot/apps/native/src/features/chatbot/components/markdown/code-block.tsx +4 -4
  83. package/recipes/chatbot/recipe.json +3 -40
  84. package/recipes/chatbot-native@latest.zip +0 -0
  85. package/recipes/chatbot-supabase/apps/native/src/features/chatbot/components/chat-markdown.tsx +4 -1
  86. package/recipes/chatbot-supabase/apps/native/src/features/chatbot/components/markdown/code-block.tsx +86 -53
  87. package/recipes/chatbot-supabase/recipe.json +3 -42
  88. package/recipes/chatbot-supabase-native@latest.zip +0 -0
  89. package/recipes/chatbot-supabase@latest.zip +0 -0
  90. package/recipes/chatbot@latest.zip +0 -0
  91. package/recipes/glowing-button/recipe.json +6 -2
  92. package/recipes/glowing-button-native@latest.zip +0 -0
  93. package/recipes/glowing-button@latest.zip +0 -0
  94. package/recipes/image-analysis/apps/native/src/app/analysis/[type]/_layout.tsx +5 -0
  95. package/recipes/image-analysis/apps/native/src/app/analysis/[type]/analysis-options.tsx +50 -0
  96. package/recipes/image-analysis/apps/native/src/app/analysis/[type]/camera.tsx +2 -0
  97. package/recipes/image-analysis/apps/native/src/app/analysis/[type]/index.tsx +50 -0
  98. package/recipes/image-analysis/apps/native/src/app/analysis/[type]/loading.tsx +50 -0
  99. package/recipes/image-analysis/apps/native/src/app/analysis/[type]/results.tsx +2 -0
  100. package/recipes/image-analysis/apps/native/src/app/analysis/[type]/trait-details.tsx +3 -0
  101. package/recipes/image-analysis/apps/native/src/features/image-analyzer/app/analysis-options-screen.tsx +2 -2
  102. package/recipes/image-analysis/apps/native/src/features/image-analyzer/app/camera.tsx +72 -65
  103. package/recipes/image-analysis/apps/native/src/features/image-analyzer/app/image-capture-screen.tsx +65 -47
  104. package/recipes/image-analysis/apps/native/src/features/image-analyzer/app/loading-screen.tsx +43 -2
  105. package/recipes/image-analysis/apps/native/src/features/image-analyzer/app/loading.tsx +34 -1
  106. package/recipes/image-analysis/apps/native/src/features/image-analyzer/hooks/use-image-analysis.ts +83 -2
  107. package/recipes/image-analysis/recipe.json +11 -19
  108. package/recipes/image-analysis-native@latest.zip +0 -0
  109. package/recipes/image-analysis-supabase/apps/native/src/app/analysis/[type]/_layout.tsx +5 -0
  110. package/recipes/image-analysis-supabase/apps/native/src/app/analysis/[type]/analysis-options.tsx +50 -0
  111. package/recipes/image-analysis-supabase/apps/native/src/app/analysis/[type]/camera.tsx +2 -0
  112. package/recipes/image-analysis-supabase/apps/native/src/app/analysis/[type]/index.tsx +50 -0
  113. package/recipes/image-analysis-supabase/apps/native/src/app/analysis/[type]/loading.tsx +50 -0
  114. package/recipes/image-analysis-supabase/apps/native/src/app/analysis/[type]/results.tsx +2 -0
  115. package/recipes/image-analysis-supabase/apps/native/src/app/analysis/[type]/trait-details.tsx +3 -0
  116. package/recipes/image-analysis-supabase/recipe.json +10 -37
  117. package/recipes/image-analysis-supabase-native@latest.zip +0 -0
  118. package/recipes/image-analysis-supabase@latest.zip +0 -0
  119. package/recipes/image-analysis@latest.zip +0 -0
  120. package/recipes/image-analyzer/apps/native/src/app/(root)/(protected)/image-analyzer/index.tsx +2 -0
  121. package/recipes/image-generator/apps/native/src/app/image-generator/gallery.tsx +3 -0
  122. package/recipes/image-generator/apps/native/src/app/image-generator/index.tsx +3 -0
  123. package/recipes/image-generator/recipe.json +8 -18
  124. package/recipes/image-generator-native@latest.zip +0 -0
  125. package/recipes/image-generator-supabase/recipe.json +6 -35
  126. package/recipes/image-generator-supabase-native@latest.zip +0 -0
  127. package/recipes/image-generator-supabase@latest.zip +0 -0
  128. package/recipes/image-generator@latest.zip +0 -0
  129. package/recipes/ios-widget/recipe.json +18 -119
  130. package/recipes/ios-widget-native@latest.zip +0 -0
  131. package/recipes/ios-widget@latest.zip +0 -0
  132. package/recipes/number-stepper/apps/native/src/components/advanced-ui/stepper/demo.tsx +1 -1
  133. package/recipes/number-stepper/recipe.json +5 -2
  134. package/recipes/number-stepper-native@latest.zip +0 -0
  135. package/recipes/number-stepper@latest.zip +0 -0
  136. package/recipes/onboarding/apps/native/src/features/onboarding/expense-tracker/components/interactive-onboarding.tsx +11 -18
  137. package/recipes/onboarding/apps/native/src/features/onboarding/expense-tracker/components/steps/ai-tone-step.tsx +5 -7
  138. package/recipes/onboarding/apps/native/src/features/onboarding/expense-tracker/components/steps/currency-step.tsx +9 -7
  139. package/recipes/onboarding/apps/native/src/features/onboarding/expense-tracker/components/steps/feature-ai-step.tsx +8 -7
  140. package/recipes/onboarding/apps/native/src/features/onboarding/expense-tracker/components/steps/feature-chatbot-step.tsx +6 -5
  141. package/recipes/onboarding/apps/native/src/features/onboarding/expense-tracker/components/steps/feature-manual-step.tsx +4 -3
  142. package/recipes/onboarding/apps/native/src/features/onboarding/expense-tracker/components/steps/feature-scan-step.tsx +6 -5
  143. package/recipes/onboarding/apps/native/src/features/onboarding/expense-tracker/components/steps/main-reason-step.tsx +5 -7
  144. package/recipes/onboarding/apps/native/src/features/onboarding/expense-tracker/components/steps/notification-step.tsx +7 -6
  145. package/recipes/onboarding/apps/native/src/features/onboarding/expense-tracker/components/steps/overspend-step.tsx +5 -7
  146. package/recipes/onboarding/apps/native/src/features/onboarding/expense-tracker/components/steps/personalizing-step.tsx +8 -7
  147. package/recipes/onboarding/apps/native/src/features/onboarding/expense-tracker/components/steps/rating-step.tsx +6 -5
  148. package/recipes/onboarding/apps/native/src/features/onboarding/expense-tracker/components/steps/reminder-step.tsx +5 -6
  149. package/recipes/onboarding/apps/native/src/features/onboarding/expense-tracker/components/steps/safety-step.tsx +5 -4
  150. package/recipes/onboarding/apps/native/src/features/onboarding/expense-tracker/components/steps/struggle-step.tsx +5 -7
  151. package/recipes/onboarding/apps/native/src/features/onboarding/expense-tracker/components/steps/welcome-step.tsx +7 -6
  152. package/recipes/onboarding/apps/native/src/features/onboarding/expense-tracker/components/ui/onboarding-header.tsx +4 -3
  153. package/recipes/onboarding/recipe.json +9 -6
  154. package/recipes/onboarding-native@latest.zip +0 -0
  155. package/recipes/onboarding@latest.zip +0 -0
  156. package/recipes/payments/apps/native/src/app/paywall/index.tsx +74 -0
  157. package/recipes/payments/apps/native/src/app/paywall/local.tsx +25 -0
  158. package/recipes/payments/apps/native/src/app/paywall/remote.tsx +23 -0
  159. package/recipes/payments/packages/backend/convex/payments.ts +21 -3
  160. package/recipes/payments/recipe.json +14 -34
  161. package/recipes/payments-native@latest.zip +0 -0
  162. package/recipes/payments-supabase/apps/native/src/app/paywall/index.tsx +74 -0
  163. package/recipes/payments-supabase/apps/native/src/app/paywall/local.tsx +25 -0
  164. package/recipes/payments-supabase/apps/native/src/app/paywall/remote.tsx +23 -0
  165. package/recipes/payments-supabase/recipe.json +16 -23
  166. package/recipes/payments-supabase-native@latest.zip +0 -0
  167. package/recipes/payments-supabase@latest.zip +0 -0
  168. package/recipes/payments@latest.zip +0 -0
  169. package/recipes/posthog/apps/native/src/components/analytics/navigation-tracker.tsx +14 -0
  170. package/recipes/posthog/apps/native/src/lib/hooks/use-navigation-analytics.ts +44 -0
  171. package/recipes/posthog/apps/native/src/providers/posthog-provider.tsx +51 -0
  172. package/recipes/posthog/recipe.json +60 -0
  173. package/recipes/posthog-native@latest.zip +0 -0
  174. package/recipes/progress-circle/apps/native/src/components/advanced-ui/progress-bars/progress-circle-page.tsx +1 -1
  175. package/recipes/progress-circle/recipe.json +5 -2
  176. package/recipes/progress-circle-native@latest.zip +0 -0
  177. package/recipes/progress-circle@latest.zip +0 -0
  178. package/recipes/quiz/apps/native/src/app/quiz/index.tsx +47 -0
  179. package/recipes/quiz/recipe.json +9 -6
  180. package/recipes/quiz-native@latest.zip +0 -0
  181. package/recipes/quiz@latest.zip +0 -0
  182. package/recipes/screen-kits/apps/native/src/app/screen-kits/_layout.tsx +12 -0
  183. package/recipes/screen-kits/apps/native/src/app/screen-kits/index.tsx +114 -0
  184. package/recipes/screen-kits/apps/native/src/features/screen-kits/index.ts +1 -0
  185. package/recipes/screen-kits/apps/native/src/features/screen-kits/types.ts +28 -0
  186. package/recipes/screen-kits/recipe.json +26 -0
  187. package/recipes/screen-kits-duolingo/apps/native/src/app/screen-kits/duolingo/_layout.tsx +12 -0
  188. package/recipes/screen-kits-duolingo/apps/native/src/app/screen-kits/duolingo/home.tsx +5 -0
  189. package/recipes/screen-kits-duolingo/apps/native/src/app/screen-kits/duolingo/index.tsx +5 -0
  190. package/recipes/screen-kits-duolingo/apps/native/src/app/screen-kits/duolingo/lesson-complete.tsx +5 -0
  191. package/recipes/screen-kits-duolingo/apps/native/src/app/screen-kits/duolingo/lesson-fail.tsx +5 -0
  192. package/recipes/screen-kits-duolingo/apps/native/src/app/screen-kits/duolingo/lesson.tsx +5 -0
  193. package/recipes/screen-kits-duolingo/apps/native/src/app/screen-kits/duolingo/skill-tree.tsx +5 -0
  194. package/recipes/screen-kits-duolingo/apps/native/src/features/screen-kits/duolingo/components/duo-button.tsx +174 -0
  195. package/recipes/screen-kits-duolingo/apps/native/src/features/screen-kits/duolingo/components/skill-button.tsx +186 -0
  196. package/recipes/screen-kits-duolingo/apps/native/src/features/screen-kits/duolingo/components/xp-header.tsx +115 -0
  197. package/recipes/screen-kits-duolingo/apps/native/src/features/screen-kits/duolingo/constants.ts +89 -0
  198. package/recipes/screen-kits-duolingo/apps/native/src/features/screen-kits/duolingo/index.ts +3 -0
  199. package/recipes/screen-kits-duolingo/apps/native/src/features/screen-kits/duolingo/screens/home-screen.tsx +225 -0
  200. package/recipes/screen-kits-duolingo/apps/native/src/features/screen-kits/duolingo/screens/lesson-complete-screen.tsx +485 -0
  201. package/recipes/screen-kits-duolingo/apps/native/src/features/screen-kits/duolingo/screens/lesson-fail-screen.tsx +105 -0
  202. package/recipes/screen-kits-duolingo/apps/native/src/features/screen-kits/duolingo/screens/lesson-screen.tsx +384 -0
  203. package/recipes/screen-kits-duolingo/recipe.json +58 -0
  204. package/recipes/screen-kits-duolingo-native@latest.zip +0 -0
  205. package/recipes/screen-kits-finance/apps/native/src/app/screen-kits/finance/_layout.tsx +45 -0
  206. package/recipes/screen-kits-finance/apps/native/src/app/screen-kits/finance/asset-detail.tsx +3 -0
  207. package/recipes/screen-kits-finance/apps/native/src/app/screen-kits/finance/notifications.tsx +3 -0
  208. package/recipes/screen-kits-finance/apps/native/src/app/screen-kits/finance/receive.tsx +3 -0
  209. package/recipes/screen-kits-finance/apps/native/src/app/screen-kits/finance/send.tsx +3 -0
  210. package/recipes/screen-kits-finance/apps/native/src/app/screen-kits/finance/swap.tsx +3 -0
  211. package/recipes/screen-kits-finance/apps/native/src/app/screen-kits/finance/wallet.tsx +3 -0
  212. package/recipes/screen-kits-finance/apps/native/src/features/screen-kits/finance/components/ActionButtons.tsx +78 -0
  213. package/recipes/screen-kits-finance/apps/native/src/features/screen-kits/finance/components/AssetRow.tsx +94 -0
  214. package/recipes/screen-kits-finance/apps/native/src/features/screen-kits/finance/components/BalanceCard.tsx +118 -0
  215. package/recipes/screen-kits-finance/apps/native/src/features/screen-kits/finance/constants.ts +85 -0
  216. package/recipes/screen-kits-finance/apps/native/src/features/screen-kits/finance/screens/asset-detail.tsx +378 -0
  217. package/recipes/screen-kits-finance/apps/native/src/features/screen-kits/finance/screens/notifications.tsx +210 -0
  218. package/recipes/screen-kits-finance/apps/native/src/features/screen-kits/finance/screens/receive-modal.tsx +317 -0
  219. package/recipes/screen-kits-finance/apps/native/src/features/screen-kits/finance/screens/send-modal.tsx +420 -0
  220. package/recipes/screen-kits-finance/apps/native/src/features/screen-kits/finance/screens/swap-modal.tsx +363 -0
  221. package/recipes/screen-kits-finance/apps/native/src/features/screen-kits/finance/screens/wallet-dashboard.tsx +281 -0
  222. package/recipes/screen-kits-finance/recipe.json +46 -0
  223. package/recipes/screen-kits-finance-native@latest.zip +0 -0
  224. package/recipes/screen-kits-fitness/apps/native/assets/sounds/timer-beep.wav +0 -0
  225. package/recipes/screen-kits-fitness/apps/native/src/app/screen-kits/fitness/_layout.tsx +10 -0
  226. package/recipes/screen-kits-fitness/apps/native/src/app/screen-kits/fitness/index.tsx +6 -0
  227. package/recipes/screen-kits-fitness/apps/native/src/app/screen-kits/fitness/timer.tsx +3 -0
  228. package/recipes/screen-kits-fitness/apps/native/src/app/screen-kits/fitness/workout.tsx +3 -0
  229. package/recipes/screen-kits-fitness/apps/native/src/features/screen-kits/fitness/components/timer-components.tsx +500 -0
  230. package/recipes/screen-kits-fitness/apps/native/src/features/screen-kits/fitness/components/timer-settings-modal.tsx +352 -0
  231. package/recipes/screen-kits-fitness/apps/native/src/features/screen-kits/fitness/components/workout-card.tsx +105 -0
  232. package/recipes/screen-kits-fitness/apps/native/src/features/screen-kits/fitness/constants.ts +189 -0
  233. package/recipes/screen-kits-fitness/apps/native/src/features/screen-kits/fitness/hooks/use-timer.ts +307 -0
  234. package/recipes/screen-kits-fitness/apps/native/src/features/screen-kits/fitness/index.ts +1 -0
  235. package/recipes/screen-kits-fitness/apps/native/src/features/screen-kits/fitness/screens/timer-screen.tsx +278 -0
  236. package/recipes/screen-kits-fitness/apps/native/src/features/screen-kits/fitness/screens/workout-dashboard.tsx +350 -0
  237. package/recipes/screen-kits-fitness/recipe.json +63 -0
  238. package/recipes/screen-kits-fitness-native@latest.zip +0 -0
  239. package/recipes/screen-kits-habits/apps/native/src/app/screen-kits/productivity/habits.tsx +1 -0
  240. package/recipes/screen-kits-habits/apps/native/src/app/screen-kits/productivity/kanban.tsx +1 -0
  241. package/recipes/screen-kits-habits/apps/native/src/app/screen-kits/productivity/routes.ts +4 -0
  242. package/recipes/screen-kits-habits/apps/native/src/features/screen-kits/productivity/components/AddTaskModal.tsx +246 -0
  243. package/recipes/screen-kits-habits/apps/native/src/features/screen-kits/productivity/components/DraggableTaskCard.tsx +92 -0
  244. package/recipes/screen-kits-habits/apps/native/src/features/screen-kits/productivity/components/KanbanColumn.tsx +238 -0
  245. package/recipes/screen-kits-habits/apps/native/src/features/screen-kits/productivity/components/TaskCard.tsx +144 -0
  246. package/recipes/screen-kits-habits/apps/native/src/features/screen-kits/productivity/components/add-habit-modal.tsx +271 -0
  247. package/recipes/screen-kits-habits/apps/native/src/features/screen-kits/productivity/constants.ts +295 -0
  248. package/recipes/screen-kits-habits/apps/native/src/features/screen-kits/productivity/kanban-utils.ts +62 -0
  249. package/recipes/screen-kits-habits/apps/native/src/features/screen-kits/productivity/screens/habit-tracker.tsx +1160 -0
  250. package/recipes/screen-kits-habits/apps/native/src/features/screen-kits/productivity/screens/kanban-board.tsx +432 -0
  251. package/recipes/screen-kits-habits/recipe.json +52 -0
  252. package/recipes/screen-kits-habits-native@latest.zip +0 -0
  253. package/recipes/screen-kits-native@latest.zip +0 -0
  254. package/recipes/sentry/apps/native/src/providers/sentry-provider.tsx +64 -0
  255. package/recipes/sentry/recipe.json +39 -0
  256. package/recipes/sentry-native@latest.zip +0 -0
  257. package/recipes/swipe-slider/apps/native/src/components/advanced-ui/sliders/swipe-slider-page.tsx +1 -1
  258. package/recipes/swipe-slider/recipe.json +5 -2
  259. package/recipes/swipe-slider-native@latest.zip +0 -0
  260. package/recipes/swipe-slider@latest.zip +0 -0
  261. package/recipes/timeline/apps/native/src/components/advanced-ui/timeline/demo.tsx +2 -1
  262. package/recipes/timeline/recipe.json +5 -2
  263. package/recipes/timeline-native@latest.zip +0 -0
  264. package/recipes/timeline@latest.zip +0 -0
  265. package/recipes/tracker-app/apps/native/src/app/tracker-app/index.tsx +1 -0
  266. package/recipes/tracker-app/recipe.json +10 -7
  267. package/recipes/tracker-app-native@latest.zip +0 -0
  268. package/recipes/tracker-app@latest.zip +0 -0
  269. package/recipes/upload-all.sh +8 -31
  270. package/recipes/voice-bot/apps/native/src/app/voice-bot/index.tsx +56 -0
  271. package/recipes/voice-bot/recipe.json +31 -7
  272. package/recipes/voice-bot-native@latest.zip +0 -0
  273. package/recipes/voice-bot@latest.zip +0 -0
  274. package/recipes/wake-word/apps/native/src/app/{(root)/(protected)/test-wake-word.tsx → test-wake-word.tsx} +43 -4
  275. package/recipes/wake-word/recipe.json +16 -26
  276. package/recipes/wake-word-native@latest.zip +0 -0
  277. package/recipes/wake-word@latest.zip +0 -0
  278. package/scripts/create-advanced-ui-recipes.sh +46 -19
  279. package/scripts/create-recipes.mjs +471 -117
  280. package/scripts/package-recipes.mjs +76 -0
  281. package/scripts/publish-all.sh +6 -2
  282. package/CHANGELOG.md +0 -198
  283. package/docs/archive/AUTO-DETECT-DEPS.md +0 -607
  284. package/docs/archive/FINAL-PACKAGE-STRATEGY.md +0 -583
  285. package/docs/archive/FINAL-SIMPLE-PLAN.md +0 -487
  286. package/docs/archive/FINAL-STATUS.md +0 -144
  287. package/docs/archive/FLOW-DIAGRAM.md +0 -1629
  288. package/docs/archive/GOTCHAS-AND-RISKS.md +0 -801
  289. package/docs/archive/IMPLEMENTATION-PLAN.md +0 -1360
  290. package/docs/archive/PLAN.md +0 -453
  291. package/docs/archive/PRODUCTION-READINESS.md +0 -684
  292. package/docs/archive/PRODUCTION-TEST-RESULTS.md +0 -465
  293. package/docs/archive/SIMPLIFIED-PLAN.md +0 -578
  294. package/docs/archive/STATUS.md +0 -199
  295. package/docs/archive/SUCCESS.md +0 -259
  296. package/docs/archive/TEST-SUMMARY.md +0 -261
  297. package/docs/archive/TESTING-CHECKLIST.md +0 -450
  298. package/docs/archive/USER-MODIFICATIONS.md +0 -448
  299. package/docs/decisions.md +0 -55
  300. package/docs/manual-testing.md +0 -91
  301. package/docs/next-steps.md +0 -12
  302. package/recipes/README.md +0 -156
  303. package/recipes/audio-recorder-supabase/packages/backend/src/services/recordings.ts +0 -369
  304. package/recipes/chatbot/apps/native/src/api-client/chatbot.ts +0 -83
  305. package/recipes/chatbot/packages/backend/convex/agents.ts +0 -115
  306. package/recipes/chatbot/packages/backend/convex/tools/index.ts +0 -18
  307. package/recipes/chatbot/packages/backend/convex/tools/knowledgeRetrieval.ts +0 -97
  308. package/recipes/chatbot/packages/backend/convex/tools/tavilySearch.ts +0 -83
  309. package/recipes/chatbot/packages/backend/convex/tools/userProfile.ts +0 -72
  310. package/recipes/chatbot-supabase/apps/native/src/api-client/supabase/chatbot.ts +0 -515
  311. package/recipes/chatbot-supabase/packages/backend/src/services/conversations.ts +0 -243
  312. package/recipes/chatbot-supabase/packages/backend/src/services/messages.ts +0 -327
  313. package/recipes/image-analysis/apps/native/src/api-client/image-analyzer.ts +0 -62
  314. package/recipes/image-analysis-supabase/packages/backend/src/services/image-analyses.ts +0 -132
  315. package/recipes/image-generator/apps/native/src/api-client/image-generator.ts +0 -34
  316. package/recipes/payments/apps/native/src/api-client/payments.ts +0 -44
  317. package/recipes/payments-supabase/packages/backend/src/services/payments.ts +0 -201
  318. package/recipes/posthog.json +0 -47
  319. package/recipes/revenuecat.json +0 -43
  320. package/recipes/sentry.json +0 -47
  321. package/recipes/wake-word/apps/native/assets/vosk-model/README.md +0 -103
  322. package/recipes/wake-word/apps/native/scripts/download-vosk-model.mjs +0 -127
  323. /package/recipes/{audio-recorder/apps/native/src/app/(root)/(protected) → audio-recorder-supabase/apps/native/src/app}/audio-recorder/index.tsx +0 -0
  324. /package/recipes/ios-widget/{targets → apps/native/targets}/widget/AppIntent.swift +0 -0
  325. /package/recipes/ios-widget/{targets → apps/native/targets}/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-20x20@1x.png +0 -0
  326. /package/recipes/ios-widget/{targets → apps/native/targets}/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-20x20@2x.png +0 -0
  327. /package/recipes/ios-widget/{targets → apps/native/targets}/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-20x20@3x.png +0 -0
  328. /package/recipes/ios-widget/{targets → apps/native/targets}/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-29x29@1x.png +0 -0
  329. /package/recipes/ios-widget/{targets → apps/native/targets}/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-29x29@2x.png +0 -0
  330. /package/recipes/ios-widget/{targets → apps/native/targets}/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-29x29@3x.png +0 -0
  331. /package/recipes/ios-widget/{targets → apps/native/targets}/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-40x40@1x.png +0 -0
  332. /package/recipes/ios-widget/{targets → apps/native/targets}/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-40x40@2x.png +0 -0
  333. /package/recipes/ios-widget/{targets → apps/native/targets}/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-40x40@3x.png +0 -0
  334. /package/recipes/ios-widget/{targets → apps/native/targets}/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-60x60@2x.png +0 -0
  335. /package/recipes/ios-widget/{targets → apps/native/targets}/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-60x60@3x.png +0 -0
  336. /package/recipes/ios-widget/{targets → apps/native/targets}/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-76x76@1x.png +0 -0
  337. /package/recipes/ios-widget/{targets → apps/native/targets}/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-76x76@2x.png +0 -0
  338. /package/recipes/ios-widget/{targets → apps/native/targets}/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-83.5x83.5@2x.png +0 -0
  339. /package/recipes/ios-widget/{targets → apps/native/targets}/widget/Assets.xcassets/AppIcon.appiconset/Contents.json +0 -0
  340. /package/recipes/ios-widget/{targets → apps/native/targets}/widget/Assets.xcassets/AppIcon.appiconset/ItunesArtwork@2x.png +0 -0
  341. /package/recipes/ios-widget/{targets → apps/native/targets}/widget/CalorieTrackerWidget.swift +0 -0
  342. /package/recipes/ios-widget/{targets → apps/native/targets}/widget/HabitTrackerWidget.swift +0 -0
  343. /package/recipes/ios-widget/{targets → apps/native/targets}/widget/Info.plist +0 -0
  344. /package/recipes/ios-widget/{targets → apps/native/targets}/widget/WidgetLiveActivity.swift +0 -0
  345. /package/recipes/ios-widget/{targets → apps/native/targets}/widget/expo-target.config.js +0 -0
  346. /package/recipes/ios-widget/{targets → apps/native/targets}/widget/generated.entitlements +0 -0
  347. /package/recipes/ios-widget/{targets → apps/native/targets}/widget/index.swift +0 -0
  348. /package/recipes/ios-widget/{targets → apps/native/targets}/widget/widgets.swift +0 -0
@@ -0,0 +1,23 @@
1
+ import { Stack } from 'expo-router';
2
+ import React, { useMemo } from 'react';
3
+
4
+ import RemotePaywall from '@/features/payments/app/remote-paywall';
5
+ import { translate } from '@/lib';
6
+
7
+ export default function RemotePaywallScreen() {
8
+ const remoteTitle = translate('paywall.remote_title');
9
+ const screenOptions = useMemo(
10
+ () => ({
11
+ title: remoteTitle,
12
+ headerShown: true,
13
+ }),
14
+ [remoteTitle],
15
+ );
16
+
17
+ return (
18
+ <>
19
+ <Stack.Screen options={screenOptions} />
20
+ <RemotePaywall />
21
+ </>
22
+ );
23
+ }
@@ -1,8 +1,12 @@
1
1
  {
2
- "name": "payments",
2
+ "name": "payments-supabase",
3
3
  "version": "1.0.0",
4
- "description": "RevenueCat payments with Supabase sync",
4
+ "description": "Payments with Supabase",
5
5
  "copy": [
6
+ {
7
+ "from": "apps/native/src/app/paywall",
8
+ "to": "apps/native/src/app/(root)/(protected)/paywall"
9
+ },
6
10
  {
7
11
  "from": "apps/native/src/features/payments",
8
12
  "to": "apps/native/src/features/payments"
@@ -10,42 +14,31 @@
10
14
  {
11
15
  "from": "packages/backend/supabase/migrations/payments.sql",
12
16
  "to": "packages/backend/supabase/migrations/payments.sql"
13
- },
14
- {
15
- "from": "packages/backend/src/services/payments.ts",
16
- "to": "packages/backend/src/services/payments.ts"
17
17
  }
18
18
  ],
19
19
  "nav": {
20
- "href": "/(root)/(protected)/payments",
21
- "label": "Payments",
20
+ "href": "/(root)/(protected)/paywall",
21
+ "label": "Payments (Supabase)",
22
22
  "icon": "💳",
23
- "color": "#EC4899"
23
+ "color": "#F59E0B"
24
24
  },
25
25
  "target": "native",
26
26
  "dependencies": {
27
27
  "expo": [
28
- "@supabase/supabase-js",
29
28
  "react-native-purchases",
30
29
  "react-native-purchases-ui"
31
30
  ]
32
31
  },
33
- "env": [
32
+ "manualSteps": [
34
33
  {
35
- "key": "REVENUECAT_API_KEY_APPLE",
36
- "description": "RevenueCat API key for iOS",
37
- "example": "appl_..."
34
+ "title": "Enable RevenueCat initialization",
35
+ "description": "Uncomment the PaymentInitializer in root providers so the SDK is initialized on app startup.",
36
+ "file": "apps/native/src/providers/root-providers.tsx"
38
37
  },
39
38
  {
40
- "key": "REVENUECAT_API_KEY_GOOGLE",
41
- "description": "RevenueCat API key for Android",
42
- "example": "goog_..."
43
- }
44
- ],
45
- "manualSteps": [
46
- {
47
- "title": "Apply Supabase migration",
48
- "description": "Run: cd packages/backend && supabase db push"
39
+ "title": "Set RevenueCat API keys",
40
+ "description": "Update your .env files with REVENUECAT_API_KEY_APPLE and REVENUECAT_API_KEY_GOOGLE values from RevenueCat.",
41
+ "file": "apps/native/.env.local"
49
42
  }
50
43
  ]
51
44
  }
Binary file
@@ -0,0 +1,14 @@
1
+ import { Env } from '@env';
2
+ import { useNavigationAnalytics } from '@/lib/hooks/use-navigation-analytics';
3
+
4
+ /**
5
+ * Component to enable navigation tracking with PostHog
6
+ * Must be inside PostHogProvider to work properly
7
+ */
8
+ export function NavigationTracker() {
9
+ if (!Env.POSTHOG_API_KEY) {
10
+ return null;
11
+ }
12
+ useNavigationAnalytics();
13
+ return null;
14
+ }
@@ -0,0 +1,44 @@
1
+ import { usePathname, useSegments } from 'expo-router';
2
+ import { usePostHog } from 'posthog-react-native';
3
+ import { useEffect, useRef } from 'react';
4
+
5
+ /**
6
+ * Hook to track navigation changes with PostHog using Expo Router
7
+ * This replaces PostHog's automatic screen tracking which relies on React Navigation
8
+ */
9
+ export function useNavigationAnalytics() {
10
+ const posthog = usePostHog();
11
+ const segments = useSegments();
12
+ const pathname = usePathname();
13
+ const previousPathname = useRef<string>('');
14
+
15
+ useEffect(() => {
16
+ // Only track if pathname has actually changed
17
+ if (pathname && pathname !== previousPathname.current) {
18
+ try {
19
+ // Create a meaningful screen name from segments
20
+ const screenName =
21
+ segments.length > 0
22
+ ? segments.join('/')
23
+ : pathname.replace('/', '') || 'home';
24
+
25
+ // Track the screen view
26
+ posthog?.screen(screenName, {
27
+ pathname,
28
+ segments: segments.join('/'),
29
+ timestamp: Date.now(),
30
+ });
31
+
32
+ // Update previous pathname
33
+ previousPathname.current = pathname;
34
+ } catch (error) {
35
+ console.warn('[NavigationAnalytics] Failed to track screen:', error);
36
+ }
37
+ }
38
+ }, [pathname, segments, posthog]);
39
+
40
+ return {
41
+ currentScreen: segments.join('/') || 'home',
42
+ pathname,
43
+ };
44
+ }
@@ -0,0 +1,51 @@
1
+ import { Env } from '@env';
2
+ import { PostHogProvider } from 'posthog-react-native';
3
+ import type { ReactNode } from 'react';
4
+
5
+ interface AnalyticsProviderProps {
6
+ children: ReactNode;
7
+ }
8
+
9
+ /**
10
+ * PostHog analytics provider with session replay and custom navigation tracking
11
+ * Uses Expo Router compatible navigation tracking instead of automatic screen capture
12
+ */
13
+ export function AnalyticsProvider({ children }: AnalyticsProviderProps) {
14
+ if (!Env.POSTHOG_API_KEY) {
15
+ return <>{children}</>;
16
+ }
17
+
18
+ return (
19
+ <PostHogProvider
20
+ apiKey={Env.POSTHOG_API_KEY}
21
+ options={{
22
+ host: Env.POSTHOG_HOST || 'https://us.i.posthog.com',
23
+ // Disable automatic screen tracking to prevent getCurrentRoute error with Expo Router
24
+ // captureScreens: false, // This option doesn't exist in PostHog
25
+ // Re-enable session replay (error was from Sentry, not PostHog)
26
+ enableSessionReplay: true,
27
+ sessionReplayConfig: {
28
+ // Whether text inputs are masked. Default is true.
29
+ // Password inputs are always masked regardless
30
+ maskAllTextInputs: true,
31
+ // Whether images are masked. Default is true.
32
+ maskAllImages: true,
33
+ // Capture logs automatically. Default is true.
34
+ // Android only (Native Logcat only)
35
+ captureLog: true,
36
+ // Whether network requests are captured in recordings. Default is true
37
+ // Only metric-like data like speed, size, and response code are captured.
38
+ // No data is captured from the request or response body.
39
+ // iOS only
40
+ captureNetworkTelemetry: true,
41
+ // Deboucer delay used to reduce the number of snapshots captured and reduce performance impact. Default is 500ms
42
+ androidDebouncerDelayMs: 500,
43
+ // Deboucer delay used to reduce the number of snapshots captured and reduce performance impact. Default is 1000ms
44
+ iOSdebouncerDelayMs: 1000,
45
+ },
46
+ }}
47
+ >
48
+ {children}
49
+ </PostHogProvider>
50
+ );
51
+ }
@@ -0,0 +1,60 @@
1
+ {
2
+ "name": "posthog",
3
+ "version": "1.0.0",
4
+ "description": "Product analytics with PostHog",
5
+ "copy": [
6
+ {
7
+ "from": "apps/native/src/providers/posthog-provider.tsx",
8
+ "to": "apps/native/src/providers/posthog-provider.tsx"
9
+ },
10
+ {
11
+ "from": "apps/native/src/lib/hooks/use-navigation-analytics.ts",
12
+ "to": "apps/native/src/lib/hooks/use-navigation-analytics.ts"
13
+ },
14
+ {
15
+ "from": "apps/native/src/components/analytics/navigation-tracker.tsx",
16
+ "to": "apps/native/src/components/analytics/navigation-tracker.tsx"
17
+ }
18
+ ],
19
+ "target": "native",
20
+ "dependencies": {
21
+ "expo": [
22
+ "posthog-react-native",
23
+ "posthog-react-native-session-replay"
24
+ ]
25
+ },
26
+ "configuration": {
27
+ "env": {
28
+ "client": {
29
+ "schema": [
30
+ " POSTHOG_API_KEY: z.string().optional(),",
31
+ " POSTHOG_HOST: z.string().optional(),"
32
+ ],
33
+ "env": [
34
+ " POSTHOG_API_KEY: process.env.POSTHOG_API_KEY,",
35
+ " POSTHOG_HOST: process.env.POSTHOG_HOST,"
36
+ ]
37
+ }
38
+ }
39
+ },
40
+ "manualSteps": [
41
+ {
42
+ "title": "Add PostHog API key",
43
+ "description": "Add POSTHOG_API_KEY to your .env files.",
44
+ "file": "apps/native/.env.local"
45
+ },
46
+ {
47
+ "title": "Set PostHog host (optional)",
48
+ "description": "If you use a self-hosted instance, set POSTHOG_HOST in your .env files.",
49
+ "file": "apps/native/.env.local"
50
+ },
51
+ {
52
+ "title": "Suppress Expo doctor warnings (optional)",
53
+ "description": "If expo-doctor flags posthog-react-native-session-replay, add it to expo.doctor.reactNativeDirectoryCheck.exclude in apps/native/package.json.",
54
+ "file": "apps/native/package.json"
55
+ }
56
+ ],
57
+ "postInstall": {
58
+ "message": "✅ PostHog files added. Update env files and re-run the app."
59
+ }
60
+ }
@@ -1,8 +1,8 @@
1
1
  import Feather from '@expo/vector-icons/Feather';
2
2
  import React, { useState } from 'react';
3
3
  import { Button, StyleSheet, Text, View } from 'react-native';
4
- import { SafeAreaView } from 'react-native-safe-area-context';
5
4
 
5
+ import { SafeAreaView } from '@/components/ui';
6
6
  import { useThemeConfig } from '@/lib/use-theme-config';
7
7
 
8
8
  import TransitioningProgressCircle from './progress-circle';
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "progress-circle",
3
3
  "version": "1.0.0",
4
- "description": "Animated circular progress indicator",
4
+ "description": "Advanced UI component: progress-circle",
5
5
  "target": "native",
6
6
  "copy": [
7
7
  {
@@ -10,6 +10,9 @@
10
10
  }
11
11
  ],
12
12
  "dependencies": {
13
- "expo": ["react-native-reanimated", "react-native-svg"]
13
+ "expo": [
14
+ "react-native-reanimated",
15
+ "react-native-gesture-handler"
16
+ ]
14
17
  }
15
18
  }
Binary file
@@ -0,0 +1,47 @@
1
+ import Quiz from '@/features/quiz';
2
+ import { QuestionMode } from '@/features/quiz/config';
3
+
4
+ const questions = [
5
+ {
6
+ text: 'What is your favorite color?',
7
+ mode: QuestionMode.AutoAdvance,
8
+ options: [
9
+ { id: 'red', text: 'Red', note: 'Red is the color of passion.' },
10
+ { id: 'blue', text: 'Blue', note: 'Blue is the color of calm.' },
11
+ { id: 'green', text: 'Green', note: 'Green is the color of nature.' },
12
+ ],
13
+ },
14
+ {
15
+ text: 'What is your favorite animal?',
16
+ mode: QuestionMode.ManualAdvance,
17
+ options: [
18
+ { id: 'dog', text: 'Dog', note: 'Dogs are loyal.' },
19
+ { id: 'cat', text: 'Cat', note: 'Cats are independent.' },
20
+ { id: 'bird', text: 'Bird', note: 'Birds can fly.' },
21
+ ],
22
+ },
23
+ {
24
+ text: 'What is your favorite animal?',
25
+ mode: QuestionMode.ManualAdvance,
26
+ options: [
27
+ { id: 'dog', text: 'Dog', note: 'Dogs are loyal.' },
28
+ { id: 'cat', text: 'Cat', note: 'Cats are independent.' },
29
+ { id: 'bird', text: 'Bird', note: 'Birds can fly.' },
30
+ ],
31
+ },
32
+ {
33
+ text: 'What is your favorite animal?',
34
+ mode: QuestionMode.ManualAdvance,
35
+ options: [
36
+ { id: 'dog', text: 'Dog', note: 'Dogs are loyal.' },
37
+ { id: 'cat', text: 'Cat', note: 'Cats are independent.' },
38
+ { id: 'bird', text: 'Bird', note: 'Birds can fly.' },
39
+ ],
40
+ },
41
+ ];
42
+
43
+ const QuizScreen = () => {
44
+ return <Quiz questions={questions} />;
45
+ };
46
+
47
+ export default QuizScreen;
@@ -1,8 +1,12 @@
1
1
  {
2
2
  "name": "quiz",
3
3
  "version": "1.0.0",
4
- "description": "Interactive quiz component",
4
+ "description": "Interactive quiz feature",
5
5
  "copy": [
6
+ {
7
+ "from": "apps/native/src/app/quiz",
8
+ "to": "apps/native/src/app/(root)/(protected)/quiz"
9
+ },
6
10
  {
7
11
  "from": "apps/native/src/features/quiz",
8
12
  "to": "apps/native/src/features/quiz"
@@ -11,9 +15,8 @@
11
15
  "nav": {
12
16
  "href": "/(root)/(protected)/quiz",
13
17
  "label": "Quiz",
14
- "icon": "",
15
- "color": "#F59E0B"
18
+ "icon": "📱",
19
+ "color": "#F97316"
16
20
  },
17
- "target": "native",
18
- "dependencies": { "expo": ["react-native-reanimated"] }
19
- }
21
+ "target": "native"
22
+ }
Binary file
Binary file
@@ -0,0 +1,12 @@
1
+ import { Stack } from 'expo-router';
2
+
3
+ export default function ScreenKitsLayout() {
4
+ return (
5
+ <Stack
6
+ screenOptions={{
7
+ headerShown: false,
8
+ animation: 'slide_from_right',
9
+ }}
10
+ />
11
+ );
12
+ }
@@ -0,0 +1,114 @@
1
+ import { MaterialIcons } from '@expo/vector-icons';
2
+ import { useRouter } from 'expo-router';
3
+ import React from 'react';
4
+ import { ScrollView, TouchableOpacity, View } from 'react-native';
5
+ import Animated, { FadeInDown } from 'react-native-reanimated';
6
+
7
+ import { SafeAreaView, Text } from '@/components/ui';
8
+ import { KITS } from '@/features/screen-kits';
9
+ import { useThemeConfig } from '@/lib/use-theme-config';
10
+
11
+ export default function ScreenKitsGallery() {
12
+ const theme = useThemeConfig();
13
+ const router = useRouter();
14
+
15
+ return (
16
+ <SafeAreaView className="flex-1 bg-background">
17
+ <ScrollView
18
+ contentContainerStyle={{ padding: 20, paddingBottom: 100 }}
19
+ showsVerticalScrollIndicator={false}
20
+ >
21
+ <View className="mb-8 mt-4">
22
+ <Text className="text-4xl font-extrabold text-foreground tracking-tight">
23
+ Screen Kits
24
+ </Text>
25
+ <Text className="text-lg text-muted-foreground mt-2 font-medium">
26
+ Production-ready UI patterns inspired by popular apps.
27
+ </Text>
28
+ </View>
29
+
30
+ <View className="gap-6">
31
+ {KITS.length === 0 ? (
32
+ <View
33
+ className="rounded-3xl border p-6"
34
+ style={{
35
+ borderColor: theme.colors.border,
36
+ backgroundColor: theme.colors.card,
37
+ }}
38
+ >
39
+ <Text className="text-lg font-semibold text-foreground">
40
+ No screen kits installed
41
+ </Text>
42
+ <Text className="text-sm text-muted-foreground mt-2">
43
+ Add a kit with the CLI to see it here.
44
+ </Text>
45
+ </View>
46
+ ) : (
47
+ KITS.map((kit, index) => (
48
+ <Animated.View
49
+ key={kit.id}
50
+ entering={FadeInDown.delay(index * 100).springify()}
51
+ >
52
+ <View
53
+ className="rounded-3xl border overflow-hidden"
54
+ style={{
55
+ borderColor: theme.colors.border,
56
+ backgroundColor: theme.colors.card,
57
+ }}
58
+ >
59
+ {/* Header */}
60
+ <View
61
+ className="p-6 flex-row items-center gap-4"
62
+ style={{ backgroundColor: kit.color + '15' }}
63
+ >
64
+ <View
65
+ className="w-12 h-12 rounded-2xl items-center justify-center border-2 border-white/20 shadow-sm"
66
+ style={{ backgroundColor: kit.color }}
67
+ >
68
+ <Text className="text-2xl">{kit.icon}</Text>
69
+ </View>
70
+ <View className="flex-1">
71
+ <Text className="text-xl font-bold text-foreground">
72
+ {kit.title}
73
+ </Text>
74
+ <Text className="text-sm text-muted-foreground">
75
+ {kit.description}
76
+ </Text>
77
+ </View>
78
+ </View>
79
+
80
+ {/* Screens List */}
81
+ <View className="p-4 gap-3 bg-card">
82
+ {kit.screens.map((screen) => (
83
+ <TouchableOpacity
84
+ key={screen.id}
85
+ onPress={() => router.push(screen.route as any)}
86
+ className="flex-row items-center p-3 rounded-xl bg-muted/50 active:bg-muted/80"
87
+ style={{ gap: 12 }}
88
+ >
89
+ <View className="w-1 h-8 rounded-full bg-muted-foreground/20" />
90
+ <View className="flex-1">
91
+ <Text className="text-base font-semibold text-foreground">
92
+ {screen.name}
93
+ </Text>
94
+ <Text className="text-xs text-muted-foreground">
95
+ {screen.description}
96
+ </Text>
97
+ </View>
98
+ <MaterialIcons
99
+ name="arrow-forward-ios"
100
+ size={16}
101
+ color={theme.colors.mutedForeground}
102
+ />
103
+ </TouchableOpacity>
104
+ ))}
105
+ </View>
106
+ </View>
107
+ </Animated.View>
108
+ ))
109
+ )}
110
+ </View>
111
+ </ScrollView>
112
+ </SafeAreaView>
113
+ );
114
+ }
@@ -0,0 +1 @@
1
+ export * from './types';
@@ -0,0 +1,28 @@
1
+ export type KitId =
2
+ | 'duolingo'
3
+ | 'fitness'
4
+ | 'finance'
5
+ | 'habits'
6
+ | 'social'
7
+ | 'ecommerce';
8
+
9
+ export interface KitScreen {
10
+ id: string;
11
+ name: string;
12
+ description: string;
13
+ route: string;
14
+ }
15
+
16
+ export interface ScreenKit {
17
+ id: KitId;
18
+ title: string;
19
+ description: string;
20
+ icon: string;
21
+ color: string;
22
+ screens: KitScreen[];
23
+ }
24
+
25
+ export const KITS: ScreenKit[] = [
26
+ // --- @vibefast:screen-kits:start ---
27
+ // --- @vibefast:screen-kits:end ---
28
+ ];
@@ -0,0 +1,26 @@
1
+ {
2
+ "name": "screen-kits",
3
+ "version": "1.0.0",
4
+ "description": "Screen kits hub and shared types",
5
+ "copy": [
6
+ {
7
+ "from": "apps/native/src/app/screen-kits",
8
+ "to": "apps/native/src/app/(root)/(protected)/screen-kits"
9
+ },
10
+ {
11
+ "from": "apps/native/src/features/screen-kits/types.ts",
12
+ "to": "apps/native/src/features/screen-kits/types.ts"
13
+ },
14
+ {
15
+ "from": "apps/native/src/features/screen-kits/index.ts",
16
+ "to": "apps/native/src/features/screen-kits/index.ts"
17
+ }
18
+ ],
19
+ "nav": {
20
+ "href": "/(root)/(protected)/screen-kits",
21
+ "label": "Screen Kits",
22
+ "icon": "📱",
23
+ "color": "#EC4899"
24
+ },
25
+ "target": "native"
26
+ }
@@ -0,0 +1,12 @@
1
+ import { Stack } from 'expo-router';
2
+
3
+ export default function DuolingoLayout() {
4
+ return (
5
+ <Stack screenOptions={{ headerShown: false }}>
6
+ <Stack.Screen name="index" />
7
+ <Stack.Screen name="home" />
8
+ <Stack.Screen name="lesson" options={{ presentation: 'card' }} />
9
+ <Stack.Screen name="skill-tree" />
10
+ </Stack>
11
+ );
12
+ }
@@ -0,0 +1,5 @@
1
+ import { DuolingoHomeScreen } from '@/features/screen-kits/duolingo';
2
+
3
+ export default function Page() {
4
+ return <DuolingoHomeScreen />;
5
+ }
@@ -0,0 +1,5 @@
1
+ import { Redirect } from 'expo-router';
2
+
3
+ export default function Page() {
4
+ return <Redirect href="/screen-kits/duolingo/home" />;
5
+ }
@@ -0,0 +1,5 @@
1
+ import { DuolingoLessonCompleteScreen } from '@/features/screen-kits/duolingo';
2
+
3
+ export default function Page() {
4
+ return <DuolingoLessonCompleteScreen />;
5
+ }
@@ -0,0 +1,5 @@
1
+ import LessonFailScreen from '@/features/screen-kits/duolingo/screens/lesson-fail-screen';
2
+
3
+ export default function Page() {
4
+ return <LessonFailScreen />;
5
+ }
@@ -0,0 +1,5 @@
1
+ import { DuolingoLessonScreen } from '@/features/screen-kits/duolingo';
2
+
3
+ export default function Page() {
4
+ return <DuolingoLessonScreen />;
5
+ }
@@ -0,0 +1,5 @@
1
+ import { DuolingoHomeScreen } from '@/features/screen-kits/duolingo';
2
+
3
+ export default function Page() {
4
+ return <DuolingoHomeScreen />;
5
+ }