@effijs/templates 0.0.0-stage → 1.0.0-alpha.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 (367) hide show
  1. package/CONTRIBUTING.md +27 -0
  2. package/LICENSE +22 -0
  3. package/README.md +32 -2
  4. package/ai/SETUP.md +5 -0
  5. package/docs/catalog.md +85 -0
  6. package/forge.manifest.js +75 -0
  7. package/lib/compat.js +40 -0
  8. package/lib/docs/build.js +146 -0
  9. package/lib/install.js +51 -0
  10. package/lib/journal.js +40 -0
  11. package/lib/jsonConfig.js +33 -0
  12. package/lib/migration.js +35 -0
  13. package/lib/names.js +42 -0
  14. package/lib/patch.js +62 -0
  15. package/lib/paths.js +12 -0
  16. package/lib/project.js +48 -0
  17. package/lib/registry.js +99 -0
  18. package/package.json +46 -4
  19. package/platforms/react-native/CATALOG.md +391 -0
  20. package/platforms/react-native/ORIGIN.md +42 -0
  21. package/platforms/react-native/README.md +78 -0
  22. package/platforms/react-native/ai/AGENTS.md.hbs +36 -0
  23. package/platforms/react-native/ai/SETUP.md +89 -0
  24. package/platforms/react-native/compat/matrix.js +150 -0
  25. package/platforms/react-native/configs/babel.js +63 -0
  26. package/platforms/react-native/configs/forgeConfig.js +35 -0
  27. package/platforms/react-native/configs/jsConfigs.js +96 -0
  28. package/platforms/react-native/configs/metro.js +86 -0
  29. package/platforms/react-native/generators/add/generator.js +12 -0
  30. package/platforms/react-native/generators/add/run.js +64 -0
  31. package/platforms/react-native/generators/component/generator.js +75 -0
  32. package/platforms/react-native/generators/component/render.js +69 -0
  33. package/platforms/react-native/generators/component/templates/Common.tsx.hbs +13 -0
  34. package/platforms/react-native/generators/component/templates/index.ts.hbs +13 -0
  35. package/platforms/react-native/generators/component/templates/pm.ts.hbs +7 -0
  36. package/platforms/react-native/generators/component/templates/types.ts.hbs +3 -0
  37. package/platforms/react-native/generators/demo/files/api/app.http +8 -0
  38. package/platforms/react-native/generators/demo/files/api/environment/http-client.env.json +5 -0
  39. package/platforms/react-native/generators/demo/files/entity/category/category.api.ts +18 -0
  40. package/platforms/react-native/generators/demo/files/entity/category/category.dto.ts +15 -0
  41. package/platforms/react-native/generators/demo/files/entity/category/category.service.ts +42 -0
  42. package/platforms/react-native/generators/demo/files/entity/category/category.store.ts +26 -0
  43. package/platforms/react-native/generators/demo/files/entity/category/index.ts +2 -0
  44. package/platforms/react-native/generators/demo/files/entity/product/index.ts +2 -0
  45. package/platforms/react-native/generators/demo/files/entity/product/product.api.ts +49 -0
  46. package/platforms/react-native/generators/demo/files/entity/product/product.dto.ts +120 -0
  47. package/platforms/react-native/generators/demo/files/entity/product/product.service.ts +139 -0
  48. package/platforms/react-native/generators/demo/files/entity/product/product.store.ts +37 -0
  49. package/platforms/react-native/generators/demo/files/feature/product/components/Product.CategorySelect.tsx +36 -0
  50. package/platforms/react-native/generators/demo/files/feature/product/detail/Product.Detail.Screen.tsx +100 -0
  51. package/platforms/react-native/generators/demo/files/feature/product/detail/product.detail.service.ts +33 -0
  52. package/platforms/react-native/generators/demo/files/feature/product/filter/Product.Filter.Screen.tsx +59 -0
  53. package/platforms/react-native/generators/demo/files/feature/product/filter/product.filter.service.ts +78 -0
  54. package/platforms/react-native/generators/demo/files/feature/product/form/Product.Form.Screen.tsx +71 -0
  55. package/platforms/react-native/generators/demo/files/feature/product/form/product.form.service.ts +142 -0
  56. package/platforms/react-native/generators/demo/files/feature/product/index.ts +7 -0
  57. package/platforms/react-native/generators/demo/files/feature/product/list/Product.List.Item.tsx +34 -0
  58. package/platforms/react-native/generators/demo/files/feature/product/list/Product.List.Screen.tsx +106 -0
  59. package/platforms/react-native/generators/demo/files/feature/product/list/product.list.service.ts +47 -0
  60. package/platforms/react-native/generators/demo/files/feature/product/product.feature.ts +29 -0
  61. package/platforms/react-native/generators/demo/files/feature/product/product.hooks.ts +7 -0
  62. package/platforms/react-native/generators/demo/files/feature/product/search/Product.Search.Screen.tsx +82 -0
  63. package/platforms/react-native/generators/demo/files/feature/product/search/product.search.service.ts +97 -0
  64. package/platforms/react-native/generators/demo/files/navigation/navigation.product.ts +46 -0
  65. package/platforms/react-native/generators/demo/generator.js +93 -0
  66. package/platforms/react-native/generators/entity/generator.js +68 -0
  67. package/platforms/react-native/generators/feature/generator.js +224 -0
  68. package/platforms/react-native/generators/feature/render.js +163 -0
  69. package/platforms/react-native/generators/feature/templates/detail.screen.tsx.hbs +25 -0
  70. package/platforms/react-native/generators/feature/templates/detail.service.ts.hbs +14 -0
  71. package/platforms/react-native/generators/feature/templates/feature.ts.hbs +18 -0
  72. package/platforms/react-native/generators/feature/templates/filter.screen.tsx.hbs +17 -0
  73. package/platforms/react-native/generators/feature/templates/filter.service.ts.hbs +14 -0
  74. package/platforms/react-native/generators/feature/templates/form.screen.tsx.hbs +21 -0
  75. package/platforms/react-native/generators/feature/templates/form.service.ts.hbs +37 -0
  76. package/platforms/react-native/generators/feature/templates/hooks.ts.hbs +7 -0
  77. package/platforms/react-native/generators/feature/templates/index.ts.hbs +2 -0
  78. package/platforms/react-native/generators/feature/templates/list.item.tsx.hbs +16 -0
  79. package/platforms/react-native/generators/feature/templates/list.screen.tsx.hbs +34 -0
  80. package/platforms/react-native/generators/feature/templates/list.service.ts.hbs +15 -0
  81. package/platforms/react-native/generators/feature/templates/navigation.ts.hbs +12 -0
  82. package/platforms/react-native/generators/feature/templates/search.screen.tsx.hbs +24 -0
  83. package/platforms/react-native/generators/feature/templates/search.service.ts.hbs +13 -0
  84. package/platforms/react-native/generators/feature/templates/tab.tsx.hbs +8 -0
  85. package/platforms/react-native/generators/init/files/app/app.controller.ts +41 -0
  86. package/platforms/react-native/generators/init/files/app/app.error.ts +1 -0
  87. package/platforms/react-native/generators/init/files/app/app.store.ts +12 -0
  88. package/platforms/react-native/generators/init/files/app/index.ts +19 -0
  89. package/platforms/react-native/generators/init/files/app/splash/Onboarding.Screen.tsx +31 -0
  90. package/platforms/react-native/generators/init/files/app/splash/Splash.Screen.tsx +14 -0
  91. package/platforms/react-native/generators/init/files/app/tabs/home/Home.tab.tsx +24 -0
  92. package/platforms/react-native/generators/init/files/app/tabs/profile/Profile.tab.tsx +1 -0
  93. package/platforms/react-native/generators/init/files/configs/dev.ts.hbs +5 -0
  94. package/platforms/react-native/generators/init/files/configs/index.ts +4 -0
  95. package/platforms/react-native/generators/init/files/configs/prod.ts.hbs +5 -0
  96. package/platforms/react-native/generators/init/files/entity/auth/auth.api.ts +36 -0
  97. package/platforms/react-native/generators/init/files/entity/auth/auth.dto.ts +26 -0
  98. package/platforms/react-native/generators/init/files/entity/auth/auth.service.ts +94 -0
  99. package/platforms/react-native/generators/init/files/entity/auth/auth.session.store.ts +14 -0
  100. package/platforms/react-native/generators/init/files/entity/auth/auth.store.ts +20 -0
  101. package/platforms/react-native/generators/init/files/entity/auth/index.ts +2 -0
  102. package/platforms/react-native/generators/init/files/entity/index.ts +2 -0
  103. package/platforms/react-native/generators/init/files/feature/auth/auth.feature.ts +10 -0
  104. package/platforms/react-native/generators/init/files/feature/auth/auth.hooks.ts +7 -0
  105. package/platforms/react-native/generators/init/files/feature/auth/index.ts +1 -0
  106. package/platforms/react-native/generators/init/files/feature/auth/sign-in/SignIn.Screen.tsx +39 -0
  107. package/platforms/react-native/generators/init/files/feature/auth/sign-in/signIn.service.ts +54 -0
  108. package/platforms/react-native/generators/init/files/feature/auth/sign-up/SignUp.Screen.tsx +64 -0
  109. package/platforms/react-native/generators/init/files/feature/auth/sign-up/signUp.service.ts +73 -0
  110. package/platforms/react-native/generators/init/files/feature/feature.hooks.ts +15 -0
  111. package/platforms/react-native/generators/init/files/feature/index.ts +3 -0
  112. package/platforms/react-native/generators/init/files/feature/profile/Profile.Screen.tsx +52 -0
  113. package/platforms/react-native/generators/init/files/feature/profile/index.ts +1 -0
  114. package/platforms/react-native/generators/init/files/feature/profile/profile.feature.ts +18 -0
  115. package/platforms/react-native/generators/init/files/feature/profile/profile.hooks.ts +7 -0
  116. package/platforms/react-native/generators/init/files/index.ts +16 -0
  117. package/platforms/react-native/generators/init/files/navigation/index.ts +18 -0
  118. package/platforms/react-native/generators/init/files/navigation/navigation.app.ts +58 -0
  119. package/platforms/react-native/generators/init/files/navigation/navigation.features.ts +9 -0
  120. package/platforms/react-native/generators/init/files/navigation/navigation.hooks.ts +5 -0
  121. package/platforms/react-native/generators/init/files/navigation/navigation.tabs.ts +55 -0
  122. package/platforms/react-native/generators/init/files/navigation/navigation.widgets.ts +23 -0
  123. package/platforms/react-native/generators/init/files/services/http/http.base.ts +69 -0
  124. package/platforms/react-native/generators/init/files/services/http/http.error.ts +10 -0
  125. package/platforms/react-native/generators/init/files/services/http/http.service.ts +24 -0
  126. package/platforms/react-native/generators/init/files/services/http/middleware/index.ts +12 -0
  127. package/platforms/react-native/generators/init/files/services/http/middleware/middleware.error.ts +36 -0
  128. package/platforms/react-native/generators/init/files/services/http/middleware/middleware.registry.ts +3 -0
  129. package/platforms/react-native/generators/init/files/services/http/middleware/middleware.token.ts +97 -0
  130. package/platforms/react-native/generators/init/files/services/index.ts +15 -0
  131. package/platforms/react-native/generators/init/files/ui/components/Box/Common.tsx +19 -0
  132. package/platforms/react-native/generators/init/files/ui/components/Box/box.pm.ts +111 -0
  133. package/platforms/react-native/generators/init/files/ui/components/Box/box.types.ts +8 -0
  134. package/platforms/react-native/generators/init/files/ui/components/Box/index.ts +13 -0
  135. package/platforms/react-native/generators/init/files/ui/components/Button/Common.tsx +50 -0
  136. package/platforms/react-native/generators/init/files/ui/components/Button/Touchable.tsx +19 -0
  137. package/platforms/react-native/generators/init/files/ui/components/Button/button.pm.ts +197 -0
  138. package/platforms/react-native/generators/init/files/ui/components/Button/button.types.ts +22 -0
  139. package/platforms/react-native/generators/init/files/ui/components/Button/button.utils.ts +16 -0
  140. package/platforms/react-native/generators/init/files/ui/components/Button/index.ts +19 -0
  141. package/platforms/react-native/generators/init/files/ui/components/Form/Colours.tsx +50 -0
  142. package/platforms/react-native/generators/init/files/ui/components/Form/Common.tsx +38 -0
  143. package/platforms/react-native/generators/init/files/ui/components/Form/ErrorText.tsx +11 -0
  144. package/platforms/react-native/generators/init/files/ui/components/Form/Input.tsx +115 -0
  145. package/platforms/react-native/generators/init/files/ui/components/Form/InputArea.tsx +70 -0
  146. package/platforms/react-native/generators/init/files/ui/components/Form/Label.tsx +18 -0
  147. package/platforms/react-native/generators/init/files/ui/components/Form/Select.tsx +86 -0
  148. package/platforms/react-native/generators/init/files/ui/components/Form/components/SecureTextEntry.tsx +19 -0
  149. package/platforms/react-native/generators/init/files/ui/components/Form/form.error.ts +18 -0
  150. package/platforms/react-native/generators/init/files/ui/components/Form/form.pm.ts +134 -0
  151. package/platforms/react-native/generators/init/files/ui/components/Form/form.types.ts +59 -0
  152. package/platforms/react-native/generators/init/files/ui/components/Form/index.ts +67 -0
  153. package/platforms/react-native/generators/init/files/ui/components/Grid/Common.tsx +11 -0
  154. package/platforms/react-native/generators/init/files/ui/components/Grid/grid.pm.ts +93 -0
  155. package/platforms/react-native/generators/init/files/ui/components/Grid/grid.types.ts +79 -0
  156. package/platforms/react-native/generators/init/files/ui/components/Grid/index.ts +13 -0
  157. package/platforms/react-native/generators/init/files/ui/components/Icon/Common.tsx +19 -0
  158. package/platforms/react-native/generators/init/files/ui/components/Icon/icons.pm.ts +74 -0
  159. package/platforms/react-native/generators/init/files/ui/components/Icon/icons.types.ts +19 -0
  160. package/platforms/react-native/generators/init/files/ui/components/Icon/index.ts +3 -0
  161. package/platforms/react-native/generators/init/files/ui/components/Loading/Loading.tsx +10 -0
  162. package/platforms/react-native/generators/init/files/ui/components/Loading/loading.hook.ts +5 -0
  163. package/platforms/react-native/generators/init/files/ui/components/Loading/loading.service.ts +22 -0
  164. package/platforms/react-native/generators/init/files/ui/components/Loading/loading.store.ts +8 -0
  165. package/platforms/react-native/generators/init/files/ui/components/Screen/Common.tsx +87 -0
  166. package/platforms/react-native/generators/init/files/ui/components/Screen/Content.tsx +77 -0
  167. package/platforms/react-native/generators/init/files/ui/components/Screen/Header.tsx +80 -0
  168. package/platforms/react-native/generators/init/files/ui/components/Screen/HeaderTab.tsx +17 -0
  169. package/platforms/react-native/generators/init/files/ui/components/Screen/SafeAreaHOC.tsx +9 -0
  170. package/platforms/react-native/generators/init/files/ui/components/Screen/index.ts +22 -0
  171. package/platforms/react-native/generators/init/files/ui/components/Text/Common.tsx +20 -0
  172. package/platforms/react-native/generators/init/files/ui/components/Text/index.ts +13 -0
  173. package/platforms/react-native/generators/init/files/ui/components/Text/text.pm.ts +55 -0
  174. package/platforms/react-native/generators/init/files/ui/components/Text/text.types.ts +27 -0
  175. package/platforms/react-native/generators/init/files/ui/components/TextInput/Common.tsx +19 -0
  176. package/platforms/react-native/generators/init/files/ui/components/TextInput/index.ts +15 -0
  177. package/platforms/react-native/generators/init/files/ui/components/TextInput/textInput.pm.ts +65 -0
  178. package/platforms/react-native/generators/init/files/ui/components/TextInput/textInput.types.ts +16 -0
  179. package/platforms/react-native/generators/init/files/ui/components/ThemePicker/ThemePicker.tsx +92 -0
  180. package/platforms/react-native/generators/init/files/ui/components/ThemePicker/index.ts +1 -0
  181. package/platforms/react-native/generators/init/files/ui/components/index.ts +27 -0
  182. package/platforms/react-native/generators/init/files/ui/components/utils/color.ts +19 -0
  183. package/platforms/react-native/generators/init/files/ui/components/utils/index.ts +3 -0
  184. package/platforms/react-native/generators/init/files/ui/components/utils/useLoading.hook.spec.tsx +202 -0
  185. package/platforms/react-native/generators/init/files/ui/components/utils/useLoading.hook.ts +172 -0
  186. package/platforms/react-native/generators/init/files/ui/components/utils/useStore.ts +34 -0
  187. package/platforms/react-native/generators/init/files/ui/fonts/font-icons.ttf +0 -0
  188. package/platforms/react-native/generators/init/files/ui/icons/font-icons.json +53 -0
  189. package/platforms/react-native/generators/init/files/ui/icons/logo.png +0 -0
  190. package/platforms/react-native/generators/init/files/ui/icons/logo.svg +304 -0
  191. package/platforms/react-native/generators/init/files/ui/icons/tabs/icon-1.png +0 -0
  192. package/platforms/react-native/generators/init/files/ui/icons/tabs/icon-2.png +0 -0
  193. package/platforms/react-native/generators/init/files/ui/theme/black/black.color.ts +8 -0
  194. package/platforms/react-native/generators/init/files/ui/theme/black/index.ts +10 -0
  195. package/platforms/react-native/generators/init/files/ui/theme/blue/blue.color.ts +8 -0
  196. package/platforms/react-native/generators/init/files/ui/theme/blue/index.ts +10 -0
  197. package/platforms/react-native/generators/init/files/ui/theme/green/green.color.ts +8 -0
  198. package/platforms/react-native/generators/init/files/ui/theme/green/index.ts +10 -0
  199. package/platforms/react-native/generators/init/files/ui/theme/index.ts +11 -0
  200. package/platforms/react-native/generators/init/files/ui/theme/pink/index.ts +10 -0
  201. package/platforms/react-native/generators/init/files/ui/theme/pink/pink.color.ts +8 -0
  202. package/platforms/react-native/generators/init/files/ui/theme/scheme/index.ts +23 -0
  203. package/platforms/react-native/generators/init/files/ui/theme/scheme/theme.scheme.color.ts +139 -0
  204. package/platforms/react-native/generators/init/files/ui/theme/scheme/theme.scheme.radius.ts +21 -0
  205. package/platforms/react-native/generators/init/files/ui/theme/scheme/theme.scheme.spacing.ts +24 -0
  206. package/platforms/react-native/generators/init/files/ui/theme/scheme/theme.scheme.ts +25 -0
  207. package/platforms/react-native/generators/init/files/ui/theme/scheme/theme.scheme.typography.ts +98 -0
  208. package/platforms/react-native/generators/init/files/ui/theme/shared/index.ts +4 -0
  209. package/platforms/react-native/generators/init/files/ui/theme/shared/shared.color.base.ts +79 -0
  210. package/platforms/react-native/generators/init/files/ui/theme/shared/shared.radius.ts +8 -0
  211. package/platforms/react-native/generators/init/files/ui/theme/shared/shared.spacing.ts +9 -0
  212. package/platforms/react-native/generators/init/files/ui/theme/shared/shared.typography.ts +105 -0
  213. package/platforms/react-native/generators/init/files/ui/theme/theme.hooks.ts +7 -0
  214. package/platforms/react-native/generators/init/files/ui/theme/theme.meta.ts +10 -0
  215. package/platforms/react-native/generators/init/files/ui/theme/theme.provider.tsx +19 -0
  216. package/platforms/react-native/generators/init/files/ui/theme/theme.service.ts +36 -0
  217. package/platforms/react-native/generators/init/files/ui/theme/theme.ts +27 -0
  218. package/platforms/react-native/generators/init/files/ui/widgets/index.ts +1 -0
  219. package/platforms/react-native/generators/init/files/ui/widgets/toast/Toast.Item.tsx +175 -0
  220. package/platforms/react-native/generators/init/files/ui/widgets/toast/Toast.Overlay.tsx +46 -0
  221. package/platforms/react-native/generators/init/files/ui/widgets/toast/Toast.Stack.tsx +75 -0
  222. package/platforms/react-native/generators/init/files/ui/widgets/toast/index.ts +7 -0
  223. package/platforms/react-native/generators/init/files/ui/widgets/toast/toast.hooks.ts +18 -0
  224. package/platforms/react-native/generators/init/files/ui/widgets/toast/toast.service.ts +39 -0
  225. package/platforms/react-native/generators/init/files/ui/widgets/toast/toast.store.ts +59 -0
  226. package/platforms/react-native/generators/init/files/ui/widgets/toast/toast.types.ts +18 -0
  227. package/platforms/react-native/generators/init/files/ui/widgets/widgets.feature.ts +14 -0
  228. package/platforms/react-native/generators/init/files/utils/date.ts +11 -0
  229. package/platforms/react-native/generators/init/files/utils/index.ts +12 -0
  230. package/platforms/react-native/generators/init/files/utils/store.persistent.ts +103 -0
  231. package/platforms/react-native/generators/init/files/utils/store.registry.ts +14 -0
  232. package/platforms/react-native/generators/init/files/utils/string.ts +100 -0
  233. package/platforms/react-native/generators/init/generator.js +86 -0
  234. package/platforms/react-native/generators/init/kit.js +23 -0
  235. package/platforms/react-native/generators/init/navigators/expo-router/index.ts +18 -0
  236. package/platforms/react-native/generators/init/navigators/expo-router/navigation.app.ts +8 -0
  237. package/platforms/react-native/generators/init/navigators/expo-router/navigation.features.ts +9 -0
  238. package/platforms/react-native/generators/init/navigators/expo-router/navigation.hooks.ts +5 -0
  239. package/platforms/react-native/generators/init/navigators/expo-router/navigation.tabs.ts +7 -0
  240. package/platforms/react-native/generators/init/navigators/expo-router/navigation.widgets.ts +5 -0
  241. package/platforms/react-native/generators/init/navigators/react-navigation/index.ts +18 -0
  242. package/platforms/react-native/generators/init/navigators/react-navigation/navigation.app.ts +8 -0
  243. package/platforms/react-native/generators/init/navigators/react-navigation/navigation.features.ts +9 -0
  244. package/platforms/react-native/generators/init/navigators/react-navigation/navigation.hooks.ts +5 -0
  245. package/platforms/react-native/generators/init/navigators/react-navigation/navigation.tabs.ts +7 -0
  246. package/platforms/react-native/generators/init/navigators/react-navigation/navigation.widgets.ts +5 -0
  247. package/platforms/react-native/generators/setup/generator.js +225 -0
  248. package/platforms/react-native/generators/util/generator.js +12 -0
  249. package/platforms/react-native/platform.js +32 -0
  250. package/platforms/react-native/runtime.js +57 -0
  251. package/platforms/react-native/solutions/components/BottomSheet/README.md +29 -0
  252. package/platforms/react-native/solutions/components/BottomSheet/files/Common.tsx +120 -0
  253. package/platforms/react-native/solutions/components/BottomSheet/files/Content.tsx +57 -0
  254. package/platforms/react-native/solutions/components/BottomSheet/files/Context.tsx +22 -0
  255. package/platforms/react-native/solutions/components/BottomSheet/files/FlatList.tsx +50 -0
  256. package/platforms/react-native/solutions/components/BottomSheet/files/Header.tsx +57 -0
  257. package/platforms/react-native/solutions/components/BottomSheet/files/Search.tsx +24 -0
  258. package/platforms/react-native/solutions/components/BottomSheet/files/bottomSheet.constants.ts +13 -0
  259. package/platforms/react-native/solutions/components/BottomSheet/files/bottomSheet.types.ts +31 -0
  260. package/platforms/react-native/solutions/components/BottomSheet/files/index.ts +33 -0
  261. package/platforms/react-native/solutions/components/BottomSheet/solution.js +38 -0
  262. package/platforms/react-native/solutions/components/BottomSheetWidgets/README.md +29 -0
  263. package/platforms/react-native/solutions/components/BottomSheetWidgets/files/SelectPicker.tsx +47 -0
  264. package/platforms/react-native/solutions/components/BottomSheetWidgets/files/bottomSheet/Content.BottomSheet.tsx +22 -0
  265. package/platforms/react-native/solutions/components/BottomSheetWidgets/files/bottomSheet/DateTimePicker.BottomSheet.tsx +74 -0
  266. package/platforms/react-native/solutions/components/BottomSheetWidgets/files/bottomSheet/List.BottomSheet.tsx +62 -0
  267. package/platforms/react-native/solutions/components/BottomSheetWidgets/solution.js +49 -0
  268. package/platforms/react-native/solutions/components/Calendar/README.md +29 -0
  269. package/platforms/react-native/solutions/components/Calendar/files/Common.tsx +16 -0
  270. package/platforms/react-native/solutions/components/Calendar/files/Context.tsx +466 -0
  271. package/platforms/react-native/solutions/components/Calendar/files/DayCell.tsx +89 -0
  272. package/platforms/react-native/solutions/components/Calendar/files/MonthView.tsx +41 -0
  273. package/platforms/react-native/solutions/components/Calendar/files/MonthYearOverlay.tsx +51 -0
  274. package/platforms/react-native/solutions/components/Calendar/files/SwipeablePeriod.tsx +44 -0
  275. package/platforms/react-native/solutions/components/Calendar/files/WeekDayTitles.tsx +31 -0
  276. package/platforms/react-native/solutions/components/Calendar/files/WeekView.tsx +40 -0
  277. package/platforms/react-native/solutions/components/Calendar/files/calendar.styles.ts +142 -0
  278. package/platforms/react-native/solutions/components/Calendar/files/calendar.types.ts +126 -0
  279. package/platforms/react-native/solutions/components/Calendar/files/calendar.utils.ts +143 -0
  280. package/platforms/react-native/solutions/components/Calendar/files/index.ts +40 -0
  281. package/platforms/react-native/solutions/components/Calendar/solution.js +38 -0
  282. package/platforms/react-native/solutions/components/Chart/README.md +29 -0
  283. package/platforms/react-native/solutions/components/Chart/files/Cilcular.tsx +140 -0
  284. package/platforms/react-native/solutions/components/Chart/files/index.ts +3 -0
  285. package/platforms/react-native/solutions/components/Chart/solution.js +38 -0
  286. package/platforms/react-native/solutions/components/CheckBox/README.md +29 -0
  287. package/platforms/react-native/solutions/components/CheckBox/files/Common.tsx +55 -0
  288. package/platforms/react-native/solutions/components/CheckBox/files/checkbox.pm.ts +71 -0
  289. package/platforms/react-native/solutions/components/CheckBox/files/index.ts +9 -0
  290. package/platforms/react-native/solutions/components/CheckBox/form/Checkbox.tsx +22 -0
  291. package/platforms/react-native/solutions/components/CheckBox/solution.js +57 -0
  292. package/platforms/react-native/solutions/components/DateTimePicker/README.md +29 -0
  293. package/platforms/react-native/solutions/components/DateTimePicker/files/DateTimePicker.tsx +44 -0
  294. package/platforms/react-native/solutions/components/DateTimePicker/solution.js +45 -0
  295. package/platforms/react-native/solutions/components/Image/README.md +29 -0
  296. package/platforms/react-native/solutions/components/Image/files/SVG.tsx +74 -0
  297. package/platforms/react-native/solutions/components/Image/files/image.pm.ts +25 -0
  298. package/platforms/react-native/solutions/components/Image/files/image.utils.ts +35 -0
  299. package/platforms/react-native/solutions/components/Image/files/index.ts +5 -0
  300. package/platforms/react-native/solutions/components/Image/solution.js +40 -0
  301. package/platforms/react-native/solutions/components/InputSecurity/README.md +29 -0
  302. package/platforms/react-native/solutions/components/InputSecurity/files/InputSecurity.ts +142 -0
  303. package/platforms/react-native/solutions/components/InputSecurity/solution.js +28 -0
  304. package/platforms/react-native/solutions/components/OTP/README.md +29 -0
  305. package/platforms/react-native/solutions/components/OTP/files/Item.tsx +16 -0
  306. package/platforms/react-native/solutions/components/OTP/files/Items.tsx +33 -0
  307. package/platforms/react-native/solutions/components/OTP/files/index.tsx +120 -0
  308. package/platforms/react-native/solutions/components/OTP/files/otp.pm.ts +30 -0
  309. package/platforms/react-native/solutions/components/OTP/solution.js +38 -0
  310. package/platforms/react-native/solutions/components/ProgressIndicator/README.md +29 -0
  311. package/platforms/react-native/solutions/components/ProgressIndicator/files/Circular.tsx +154 -0
  312. package/platforms/react-native/solutions/components/ProgressIndicator/files/Linear.tsx +133 -0
  313. package/platforms/react-native/solutions/components/ProgressIndicator/files/circular.pm.ts +34 -0
  314. package/platforms/react-native/solutions/components/ProgressIndicator/files/index.ts +16 -0
  315. package/platforms/react-native/solutions/components/ProgressIndicator/solution.js +39 -0
  316. package/platforms/react-native/solutions/components/Ruler/README.md +29 -0
  317. package/platforms/react-native/solutions/components/Ruler/files/Common.tsx +44 -0
  318. package/platforms/react-native/solutions/components/Ruler/files/Context.tsx +210 -0
  319. package/platforms/react-native/solutions/components/Ruler/files/Track.tsx +686 -0
  320. package/platforms/react-native/solutions/components/Ruler/files/Value.tsx +60 -0
  321. package/platforms/react-native/solutions/components/Ruler/files/index.ts +23 -0
  322. package/platforms/react-native/solutions/components/Ruler/files/ruler.constants.ts +70 -0
  323. package/platforms/react-native/solutions/components/Ruler/files/ruler.types.ts +98 -0
  324. package/platforms/react-native/solutions/components/Ruler/files/ruler.utils.ts +332 -0
  325. package/platforms/react-native/solutions/components/Ruler/solution.js +38 -0
  326. package/platforms/react-native/solutions/components/Section/README.md +29 -0
  327. package/platforms/react-native/solutions/components/Section/files/Common.tsx +144 -0
  328. package/platforms/react-native/solutions/components/Section/solution.js +37 -0
  329. package/platforms/react-native/solutions/components/Slider/README.md +29 -0
  330. package/platforms/react-native/solutions/components/Slider/files/Container.tsx +5 -0
  331. package/platforms/react-native/solutions/components/Slider/files/Content.tsx +44 -0
  332. package/platforms/react-native/solutions/components/Slider/files/Context.tsx +30 -0
  333. package/platforms/react-native/solutions/components/Slider/files/Pagination.Dot.tsx +61 -0
  334. package/platforms/react-native/solutions/components/Slider/files/index.ts +22 -0
  335. package/platforms/react-native/solutions/components/Slider/solution.js +38 -0
  336. package/platforms/react-native/solutions/components/Switch/README.md +29 -0
  337. package/platforms/react-native/solutions/components/Switch/files/Common.tsx +38 -0
  338. package/platforms/react-native/solutions/components/Switch/files/index.ts +9 -0
  339. package/platforms/react-native/solutions/components/Switch/files/switch.pm.ts +53 -0
  340. package/platforms/react-native/solutions/components/Switch/solution.js +38 -0
  341. package/platforms/react-native/solutions/install.js +97 -0
  342. package/platforms/react-native/solutions/services/firebase-core/README.md +31 -0
  343. package/platforms/react-native/solutions/services/firebase-core/files/index.ts +5 -0
  344. package/platforms/react-native/solutions/services/firebase-core/solution.js +39 -0
  345. package/platforms/react-native/solutions/services/firebase-messaging/README.md +31 -0
  346. package/platforms/react-native/solutions/services/firebase-messaging/files/index.ts +20 -0
  347. package/platforms/react-native/solutions/services/firebase-messaging/solution.js +42 -0
  348. package/platforms/react-native/solutions/utils/permissions/README.md +29 -0
  349. package/platforms/react-native/solutions/utils/permissions/files/permissions.ts +10 -0
  350. package/platforms/react-native/solutions/utils/permissions/solution.js +32 -0
  351. package/presets/react-native-fsd/index.js +25 -0
  352. package/shared/generators/entity/render.js +88 -0
  353. package/shared/generators/entity/templates/crud/api.ts.hbs +36 -0
  354. package/shared/generators/entity/templates/crud/dto.ts.hbs +36 -0
  355. package/shared/generators/entity/templates/crud/service.ts.hbs +73 -0
  356. package/shared/generators/entity/templates/crud/store.ts.hbs +27 -0
  357. package/shared/generators/entity/templates/index.ts.hbs +2 -0
  358. package/shared/generators/entity/templates/simple/api.ts.hbs +16 -0
  359. package/shared/generators/entity/templates/simple/dto.ts.hbs +5 -0
  360. package/shared/generators/entity/templates/simple/service.ts.hbs +26 -0
  361. package/shared/generators/entity/templates/simple/store.ts.hbs +18 -0
  362. package/shared/solutions/utils/date/README.md +29 -0
  363. package/shared/solutions/utils/date/files/date.ts +11 -0
  364. package/shared/solutions/utils/date/solution.js +27 -0
  365. package/shared/solutions/utils/string/README.md +29 -0
  366. package/shared/solutions/utils/string/files/string.ts +100 -0
  367. package/shared/solutions/utils/string/solution.js +27 -0
package/lib/patch.js ADDED
@@ -0,0 +1,62 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { createRequire } from 'node:module';
4
+
5
+ export function isPlainData(value) {
6
+ if (value == null) return true;
7
+ const kind = typeof value;
8
+ if (kind === 'function' || kind === 'symbol' || kind === 'bigint') return false;
9
+ if (kind !== 'object') return true;
10
+ if (Array.isArray(value)) return value.every(isPlainData);
11
+ const proto = Object.getPrototypeOf(value);
12
+ if (proto !== Object.prototype && proto !== null) return false;
13
+ return Object.values(value).every(isPlainData);
14
+ }
15
+
16
+ export function requireCjs(file) {
17
+ const absolute = path.resolve(file);
18
+ const require = createRequire(absolute);
19
+ delete require.cache[absolute];
20
+ return require(absolute);
21
+ }
22
+
23
+ export function stamp() {
24
+ return new Date().toISOString().replace(/[:.]/g, '-');
25
+ }
26
+
27
+ export async function backupFile(root, file) {
28
+ if (!fs.existsSync(file)) return null;
29
+ const relative = path.relative(root, file);
30
+ const dest = path.join(root, '.forge/backup', stamp(), relative);
31
+ await fs.promises.mkdir(path.dirname(dest), { recursive: true });
32
+ await fs.promises.copyFile(file, dest);
33
+ return dest;
34
+ }
35
+
36
+ export async function readTextIfExists(file) {
37
+ if (!fs.existsSync(file)) return null;
38
+ return fs.promises.readFile(file, 'utf8');
39
+ }
40
+
41
+ export async function applyTextPatch(root, file, transform, { dryRun = false } = {}) {
42
+ const backup = dryRun ? null : await backupFile(root, file);
43
+ const existed = fs.existsSync(file);
44
+ const current = existed ? await fs.promises.readFile(file, 'utf8') : '';
45
+ const result = await transform(current, { exists: existed });
46
+ if (!result?.ok) {
47
+ return {
48
+ ok: false,
49
+ file,
50
+ backup,
51
+ reason: result?.reason ?? 'Patch failed',
52
+ manual: result?.manual,
53
+ };
54
+ }
55
+ if (result.content === current) {
56
+ return { ok: true, file, backup, unchanged: true };
57
+ }
58
+ if (dryRun) return { ok: true, file, dryRun: true, backup };
59
+ await fs.promises.mkdir(path.dirname(file), { recursive: true });
60
+ await fs.promises.writeFile(file, result.content);
61
+ return { ok: true, file, backup, changed: true };
62
+ }
package/lib/paths.js ADDED
@@ -0,0 +1,12 @@
1
+ import path from 'node:path';
2
+ import { fileURLToPath } from 'node:url';
3
+
4
+ const libDir = path.dirname(fileURLToPath(import.meta.url));
5
+
6
+ export function packageRoot() {
7
+ return path.resolve(libDir, '..');
8
+ }
9
+
10
+ export function platformRoot(id = 'react-native') {
11
+ return path.join(packageRoot(), 'platforms', id);
12
+ }
package/lib/project.js ADDED
@@ -0,0 +1,48 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+
4
+ export function readJson(file) {
5
+ return JSON.parse(fs.readFileSync(file, 'utf8'));
6
+ }
7
+
8
+ export function readPackageJson(root) {
9
+ const file = path.join(root, 'package.json');
10
+ if (!fs.existsSync(file)) return null;
11
+ return readJson(file);
12
+ }
13
+
14
+ export function detectPackageManager(root) {
15
+ if (fs.existsSync(path.join(root, 'pnpm-lock.yaml'))) return 'pnpm';
16
+ if (fs.existsSync(path.join(root, 'yarn.lock'))) return 'yarn';
17
+ if (fs.existsSync(path.join(root, 'package-lock.json'))) return 'npm';
18
+ return 'yarn';
19
+ }
20
+
21
+ export function detectReactNativeVersion(root) {
22
+ const pkg = readPackageJson(root);
23
+ const version = pkg?.dependencies?.['react-native'] ?? pkg?.devDependencies?.['react-native'];
24
+ if (!version) return null;
25
+ const match = String(version).match(/(\d+\.\d+\.\d+)/);
26
+ return match ? match[1] : String(version).replace(/^[^\d]*/, '');
27
+ }
28
+
29
+ export function detectNavigator(root) {
30
+ const pkg = readPackageJson(root);
31
+ const deps = { ...pkg?.dependencies, ...pkg?.devDependencies };
32
+ if (deps?.['expo-router']) return 'expo-router';
33
+ if (deps?.['@react-navigation/native']) return 'react-navigation';
34
+ if (deps?.['react-native-navigation']) return 'react-native-navigation';
35
+ return null;
36
+ }
37
+
38
+ export function projectRoot(forge) {
39
+ return forge?.paths?.root ?? process.cwd();
40
+ }
41
+
42
+ export function listDirs(dir) {
43
+ if (!fs.existsSync(dir)) return [];
44
+ return fs
45
+ .readdirSync(dir, { withFileTypes: true })
46
+ .filter((entry) => entry.isDirectory())
47
+ .map((entry) => entry.name);
48
+ }
@@ -0,0 +1,99 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { pathToFileURL } from 'node:url';
4
+
5
+ import { readState } from './journal.js';
6
+
7
+ const REQUIRED = [
8
+ 'id',
9
+ 'type',
10
+ 'platforms',
11
+ 'title',
12
+ 'description',
13
+ 'status',
14
+ 'since',
15
+ 'tags',
16
+ 'requires',
17
+ 'dependencies',
18
+ 'files',
19
+ 'register',
20
+ 'manual',
21
+ ];
22
+
23
+ export function validateSolution(solution, file) {
24
+ const missing = REQUIRED.filter((key) => solution[key] === undefined);
25
+ if (missing.length) {
26
+ throw new Error(`${file} is missing fields: ${missing.join(', ')}`);
27
+ }
28
+ if (!['component', 'service', 'util'].includes(solution.type)) {
29
+ throw new Error(`${file} has unknown type ${solution.type}`);
30
+ }
31
+ if (!['stable', 'experimental', 'stub'].includes(solution.status)) {
32
+ throw new Error(`${file} has unknown status ${solution.status}`);
33
+ }
34
+ }
35
+
36
+ export async function loadSolutions(packageRoot) {
37
+ const roots = [
38
+ path.join(packageRoot, 'platforms'),
39
+ path.join(packageRoot, 'shared/solutions'),
40
+ ];
41
+ const files = [];
42
+ for (const root of roots) {
43
+ if (!fs.existsSync(root)) continue;
44
+ walk(root, files);
45
+ }
46
+ const solutions = [];
47
+ for (const file of files) {
48
+ const mod = await import(pathToFileURL(file).href);
49
+ const solution = mod.default ?? mod;
50
+ validateSolution(solution, file);
51
+ solutions.push({ ...solution, _dir: path.dirname(file), _file: file });
52
+ }
53
+ return solutions;
54
+ }
55
+
56
+ function walk(dir, files) {
57
+ for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
58
+ const next = path.join(dir, entry.name);
59
+ if (entry.isDirectory()) walk(next, files);
60
+ else if (entry.name === 'solution.js') files.push(next);
61
+ }
62
+ }
63
+
64
+ export function filterByPlatform(solutions, platform) {
65
+ return solutions.filter((solution) => solution.platforms.includes(platform));
66
+ }
67
+
68
+ export function byId(solutions) {
69
+ return new Map(solutions.map((solution) => [solution.id, solution]));
70
+ }
71
+
72
+ export function expandRequires(ids, solutions) {
73
+ const map = byId(solutions);
74
+ const selected = [];
75
+ const seen = new Set();
76
+ const visit = (id) => {
77
+ if (seen.has(id)) return;
78
+ const solution = map.get(id);
79
+ if (!solution) throw new Error(`Unknown solution "${id}"`);
80
+ seen.add(id);
81
+ for (const req of solution.requires ?? []) visit(req);
82
+ selected.push(solution);
83
+ };
84
+ for (const id of ids) visit(id);
85
+ return selected;
86
+ }
87
+
88
+ export async function isInstalled(root, solution) {
89
+ const state = await readState(root);
90
+ if ((state.installed ?? []).includes(solution.id)) return true;
91
+ const primary = solution.files?.[0];
92
+ if (!primary) return false;
93
+ const target = path.join(root, 'src', primary.to);
94
+ return fs.existsSync(target);
95
+ }
96
+
97
+ export function solutionReadmePath(solution) {
98
+ return path.join(solution._dir, 'README.md');
99
+ }
package/package.json CHANGED
@@ -1,6 +1,48 @@
1
1
  {
2
2
  "name": "@effijs/templates",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "1.0.0-alpha.1",
4
+ "description": "Forge presets and generators for EffiJS apps",
5
+ "type": "module",
6
+ "author": "Yevhenii Kyrychok",
7
+ "license": "MIT",
8
+ "exports": {
9
+ ".": "./forge.manifest.js",
10
+ "./presets/*": "./presets/*/index.js",
11
+ "./lib/*": "./lib/*.js",
12
+ "./platforms/*": "./platforms/*/platform.js",
13
+ "./forge.manifest.js": "./forge.manifest.js"
14
+ },
15
+ "files": [
16
+ "presets",
17
+ "lib",
18
+ "shared",
19
+ "platforms",
20
+ "docs",
21
+ "ai",
22
+ "forge.manifest.js",
23
+ "README.md",
24
+ "CONTRIBUTING.md"
25
+ ],
26
+ "scripts": {
27
+ "docs": "node lib/docs/build.js",
28
+ "docs:check": "node lib/docs/build.js --check",
29
+ "test": "node --test test/*.test.js"
30
+ },
31
+ "dependencies": {
32
+ "jsonc-parser": "^3.3.1",
33
+ "semver": "^7.7.2"
34
+ },
35
+ "peerDependencies": {
36
+ "@effijs/forge": "1.0.0-alpha.1"
37
+ },
38
+ "keywords": [
39
+ "forge",
40
+ "scaffolding",
41
+ "effijs",
42
+ "react-native",
43
+ "fsd"
44
+ ],
45
+ "engines": {
46
+ "node": ">=20.6.0"
47
+ }
48
+ }
@@ -0,0 +1,391 @@
1
+ <!-- GENERATED. Не редагувати вручну. Run `npm run docs` in @effijs/templates. -->
2
+
3
+ # react-native catalog
4
+
5
+ ## Генератори
6
+
7
+ ### rn-fsd:setup
8
+
9
+ Install EffiJS dependencies and patch React Native configs.
10
+
11
+ Command: `forge g setup`
12
+
13
+ Prompts: packageManager, navigator, moveStarter
14
+
15
+ Flags: --package-manager, --navigator, --link-local <path>, --move-starter, --yes
16
+
17
+ ### rn-fsd:init
18
+
19
+ Copy the FSD base: app shell, auth, profile, http, theme, and the base UI kit.
20
+
21
+ Command: `forge g init`
22
+
23
+ Prompts: apiUrl
24
+
25
+ Flags: --api-url, --navigator, --yes
26
+
27
+ ### rn-fsd:demo
28
+
29
+ Add product and category on top of init, including BottomSheet and Image.
30
+
31
+ Command: `forge g demo`
32
+
33
+ Prompts: none
34
+
35
+ Flags: --yes
36
+
37
+ ### rn-fsd:entity
38
+
39
+ Add an entity. crud matches product; simple matches category.
40
+
41
+ Command: `forge g entity`
42
+
43
+ Prompts: name, variant, apiUrl, fields
44
+
45
+ Flags: --name, --variant crud|simple, --api-url, --fields title:string,price:number
46
+
47
+ ### rn-fsd:feature
48
+
49
+ Add a feature and the screens you select. filter implies list. search still generates the list item.
50
+
51
+ Command: `forge g feature`
52
+
53
+ Prompts: name, entity, screens, tab
54
+
55
+ Flags: --name, --entity, --screens all, --tab
56
+
57
+ ### rn-fsd:component
58
+
59
+ Add a props-manager component: Common, pm, types, and index.
60
+
61
+ Command: `forge g component`
62
+
63
+ Prompts: name, base, extend, slots, location
64
+
65
+ Flags: --name, --base View|Pressable|Text, --extend Box|Grid|Text|none, --slots container, --location ui
66
+
67
+ ### rn-fsd:add
68
+
69
+ Install a catalog solution and its requirements.
70
+
71
+ Command: `forge g add`
72
+
73
+ Prompts: id
74
+
75
+ Flags: --id component:BottomSheet
76
+
77
+ ### rn-fsd:util
78
+
79
+ Install a utility. Same engine as add, filtered to type util.
80
+
81
+ Command: `forge g util`
82
+
83
+ Prompts: id
84
+
85
+ Flags: --id util:permissions
86
+
87
+ ## Базовий набір (init)
88
+
89
+ ### Box
90
+
91
+ - Type: component
92
+ - Path: `ui/components/Box`
93
+ - View with theme color, radius, and shadow props.
94
+
95
+ ### Grid
96
+
97
+ - Type: component
98
+ - Path: `ui/components/Grid`
99
+ - Layout primitive with spacing and alignment props.
100
+
101
+ ### Text
102
+
103
+ - Type: component
104
+ - Path: `ui/components/Text`
105
+ - Themed text with typography props.
106
+
107
+ ### Button
108
+
109
+ - Type: component
110
+ - Path: `ui/components/Button`
111
+ - Pressable button. Loading uses ActivityIndicator.
112
+
113
+ ### Screen
114
+
115
+ - Type: component
116
+ - Path: `ui/components/Screen`
117
+ - Screen shell with header, content, and safe area. Built for Wix navigation.
118
+
119
+ ### Form
120
+
121
+ - Type: component
122
+ - Path: `ui/components/Form`
123
+ - EffiJS form bindings. DateTimePicker, SelectPicker, and InputSecurity are separate solutions.
124
+
125
+ ### TextInput
126
+
127
+ - Type: component
128
+ - Path: `ui/components/TextInput`
129
+ - Themed text input. OTP is a separate solution.
130
+
131
+ ### Icon
132
+
133
+ - Type: component
134
+ - Path: `ui/components/Icon`
135
+ - Icon font glyph.
136
+
137
+ ### Loading
138
+
139
+ - Type: component
140
+ - Path: `ui/components/Loading`
141
+ - Loading overlay driven by a small store.
142
+
143
+ ### ThemePicker
144
+
145
+ - Type: component
146
+ - Path: `ui/components/ThemePicker`
147
+ - Switches the active theme scheme.
148
+
149
+ ### toast
150
+
151
+ - Type: widget
152
+ - Path: `ui/widgets/toast`
153
+ - Toast stack shown through navigation.widgets.showToast.
154
+
155
+ ### http
156
+
157
+ - Type: service
158
+ - Path: `services/http`
159
+ - HTTP client with token and error middleware.
160
+
161
+ ### string
162
+
163
+ - Type: util
164
+ - Path: `utils/string.ts`
165
+ - Text transforms used by form inputs.
166
+
167
+ ### date
168
+
169
+ - Type: util
170
+ - Path: `utils/date.ts`
171
+ - Date helpers.
172
+
173
+ ### store.persistent
174
+
175
+ - Type: util
176
+ - Path: `utils/store.persistent.ts`
177
+ - MMKV-backed persistent store.
178
+
179
+ ### auth
180
+
181
+ - Type: entity
182
+ - Path: `entity/auth`
183
+ - Session, sign-in, and sign-up entity.
184
+
185
+ ### auth
186
+
187
+ - Type: feature
188
+ - Path: `feature/auth`
189
+ - Sign-in and sign-up screens.
190
+
191
+ ### profile
192
+
193
+ - Type: feature
194
+ - Path: `feature/profile`
195
+ - Profile screen and theme picker.
196
+
197
+ ## Компоненти
198
+
199
+ ### component:BottomSheet
200
+
201
+ - Status: stable
202
+ - Gesture-driven sheet with header and content slots.
203
+ - Requires: none
204
+ - npm: none
205
+ - Command: `forge g add --id component:BottomSheet`
206
+ - Manual: none
207
+ - Guide: [solutions/components/BottomSheet/README.md](solutions/components/BottomSheet/README.md)
208
+
209
+ ### component:BottomSheetWidgets
210
+
211
+ - Status: stable
212
+ - List and date-time sheets, plus Form.Element.SelectPicker.
213
+ - Requires: component:BottomSheet
214
+ - npm: none
215
+ - Command: `forge g add --id component:BottomSheetWidgets`
216
+ - Manual: none
217
+ - Guide: [solutions/components/BottomSheetWidgets/README.md](solutions/components/BottomSheetWidgets/README.md)
218
+
219
+ ### component:Calendar
220
+
221
+ - Status: experimental
222
+ - Calendar from the previous template kit. Treat the API as experimental until it is wired into a screen.
223
+ - Requires: none
224
+ - npm: none
225
+ - Command: `forge g add --id component:Calendar`
226
+ - Manual: none
227
+ - Guide: [solutions/components/Calendar/README.md](solutions/components/Calendar/README.md)
228
+
229
+ ### component:Chart
230
+
231
+ - Status: experimental
232
+ - Chart from the previous template kit. Treat the API as experimental until it is wired into a screen.
233
+ - Requires: none
234
+ - npm: none
235
+ - Command: `forge g add --id component:Chart`
236
+ - Manual: none
237
+ - Guide: [solutions/components/Chart/README.md](solutions/components/Chart/README.md)
238
+
239
+ ### component:CheckBox
240
+
241
+ - Status: stable
242
+ - Themed checkbox and the matching form element.
243
+ - Requires: none
244
+ - npm: none
245
+ - Command: `forge g add --id component:CheckBox`
246
+ - Manual: none
247
+ - Guide: [solutions/components/CheckBox/README.md](solutions/components/CheckBox/README.md)
248
+
249
+ ### component:DateTimePicker
250
+
251
+ - Status: stable
252
+ - Form date field that opens the bottom-sheet picker.
253
+ - Requires: component:BottomSheetWidgets
254
+ - npm: none
255
+ - Command: `forge g add --id component:DateTimePicker`
256
+ - Manual: none
257
+ - Guide: [solutions/components/DateTimePicker/README.md](solutions/components/DateTimePicker/README.md)
258
+
259
+ ### component:Image
260
+
261
+ - Status: stable
262
+ - Native and SVG image with theme sizing. SVG rendering uses Skia.
263
+ - Requires: none
264
+ - npm: @shopify/react-native-skia
265
+ - Command: `forge g add --id component:Image`
266
+ - Manual: none
267
+ - Guide: [solutions/components/Image/README.md](solutions/components/Image/README.md)
268
+
269
+ ### component:InputSecurity
270
+
271
+ - Status: experimental
272
+ - Sanitize and validate text with the validator package.
273
+ - Requires: none
274
+ - npm: validator
275
+ - Command: `forge g add --id component:InputSecurity`
276
+ - Manual: none
277
+ - Guide: [solutions/components/InputSecurity/README.md](solutions/components/InputSecurity/README.md)
278
+
279
+ ### component:OTP
280
+
281
+ - Status: stable
282
+ - One-time code field attached to TextInput.
283
+ - Requires: none
284
+ - npm: none
285
+ - Command: `forge g add --id component:OTP`
286
+ - Manual: none
287
+ - Guide: [solutions/components/OTP/README.md](solutions/components/OTP/README.md)
288
+
289
+ ### component:ProgressIndicator
290
+
291
+ - Status: stable
292
+ - Linear and circular progress drawn with Skia.
293
+ - Requires: none
294
+ - npm: @shopify/react-native-skia
295
+ - Command: `forge g add --id component:ProgressIndicator`
296
+ - Manual: none
297
+ - Guide: [solutions/components/ProgressIndicator/README.md](solutions/components/ProgressIndicator/README.md)
298
+
299
+ ### component:Ruler
300
+
301
+ - Status: experimental
302
+ - Ruler from the previous template kit. Treat the API as experimental until it is wired into a screen.
303
+ - Requires: none
304
+ - npm: none
305
+ - Command: `forge g add --id component:Ruler`
306
+ - Manual: none
307
+ - Guide: [solutions/components/Ruler/README.md](solutions/components/Ruler/README.md)
308
+
309
+ ### component:Section
310
+
311
+ - Status: stable
312
+ - Segmented section control.
313
+ - Requires: none
314
+ - npm: none
315
+ - Command: `forge g add --id component:Section`
316
+ - Manual: none
317
+ - Guide: [solutions/components/Section/README.md](solutions/components/Section/README.md)
318
+
319
+ ### component:Slider
320
+
321
+ - Status: experimental
322
+ - Slider from the previous template kit. Treat the API as experimental until it is wired into a screen.
323
+ - Requires: none
324
+ - npm: none
325
+ - Command: `forge g add --id component:Slider`
326
+ - Manual: none
327
+ - Guide: [solutions/components/Slider/README.md](solutions/components/Slider/README.md)
328
+
329
+ ### component:Switch
330
+
331
+ - Status: stable
332
+ - Themed switch.
333
+ - Requires: none
334
+ - npm: none
335
+ - Command: `forge g add --id component:Switch`
336
+ - Manual: none
337
+ - Guide: [solutions/components/Switch/README.md](solutions/components/Switch/README.md)
338
+
339
+ ## Сервіси
340
+
341
+ ### service:firebase-core
342
+
343
+ - Status: stable
344
+ - Resolves the default Firebase app.
345
+ - Requires: none
346
+ - npm: @react-native-firebase/app
347
+ - Command: `forge g add --id service:firebase-core`
348
+ - Manual: Download GoogleService-Info.plist and add it to the iOS app target. Download google-services.json and place it in android/app. Apply the Google services Gradle plugin in the Android build files.
349
+ - Guide: [solutions/services/firebase-core/README.md](solutions/services/firebase-core/README.md)
350
+
351
+ ### service:firebase-messaging
352
+
353
+ - Status: stable
354
+ - Requests notification permission and reads the FCM token.
355
+ - Requires: service:firebase-core, util:permissions
356
+ - npm: @react-native-firebase/messaging
357
+ - Command: `forge g add --id service:firebase-messaging`
358
+ - Manual: Enable Cloud Messaging in the Firebase console. Upload the APNs authentication key for iOS. On iOS, enable the Push Notifications capability.
359
+ - Guide: [solutions/services/firebase-messaging/README.md](solutions/services/firebase-messaging/README.md)
360
+
361
+ ## Утиліти
362
+
363
+ ### util:permissions
364
+
365
+ - Status: stable
366
+ - Asks for notification permission on iOS and Android.
367
+ - Requires: none
368
+ - npm: none
369
+ - Command: `forge g util --id util:permissions`
370
+ - Manual: none
371
+ - Guide: [solutions/utils/permissions/README.md](solutions/utils/permissions/README.md)
372
+
373
+ ### util:date
374
+
375
+ - Status: stable
376
+ - Pure date helpers. init already copies this file for React Native.
377
+ - Requires: none
378
+ - npm: none
379
+ - Command: `forge g util --id util:date`
380
+ - Manual: none
381
+ - Guide: [../../shared/solutions/utils/date/README.md](../../shared/solutions/utils/date/README.md)
382
+
383
+ ### util:string
384
+
385
+ - Status: stable
386
+ - Pure string transforms. init already copies this file for React Native.
387
+ - Requires: none
388
+ - npm: none
389
+ - Command: `forge g util --id util:string`
390
+ - Manual: none
391
+ - Guide: [../../shared/solutions/utils/string/README.md](../../shared/solutions/utils/string/README.md)