@symbiote-native/cli 0.0.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 (384) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +492 -0
  3. package/bundle.js +2833 -0
  4. package/package.json +49 -0
  5. package/src/index.ts +70 -0
  6. package/templates/README.md +93 -0
  7. package/templates/js/angular/.prettierrc.js +5 -0
  8. package/templates/js/angular/.watchmanconfig +1 -0
  9. package/templates/js/angular/README.md +117 -0
  10. package/templates/js/angular/app.json +4 -0
  11. package/templates/js/angular/babel.config.js +34 -0
  12. package/templates/js/angular/index.js +12 -0
  13. package/templates/js/angular/metro.config.js +38 -0
  14. package/templates/js/angular/package.json.fragment.json +29 -0
  15. package/templates/js/angular/src/App.css +89 -0
  16. package/templates/js/angular/src/App.ts +40 -0
  17. package/templates/js/angular/src/assets/angular-logo.png +0 -0
  18. package/templates/js/angular/src/assets/angular-logo@2x.png +0 -0
  19. package/templates/js/angular/src/assets/angular-logo@3x.png +0 -0
  20. package/templates/js/angular/src/assets/plus-icon.png +0 -0
  21. package/templates/js/angular/src/assets/plus-icon@2x.png +0 -0
  22. package/templates/js/angular/src/assets/plus-icon@3x.png +0 -0
  23. package/templates/js/angular/src/assets/react-native-logo.png +0 -0
  24. package/templates/js/angular/src/assets/react-native-logo@2x.png +0 -0
  25. package/templates/js/angular/src/assets/react-native-logo@3x.png +0 -0
  26. package/templates/js/angular/src/css.d.ts +23 -0
  27. package/templates/js/angular/tsconfig.angular.json +42 -0
  28. package/templates/js/angular/tsconfig.json +17 -0
  29. package/templates/js/react/.prettierrc.js +5 -0
  30. package/templates/js/react/.watchmanconfig +1 -0
  31. package/templates/js/react/App.css +69 -0
  32. package/templates/js/react/App.jsx +27 -0
  33. package/templates/js/react/App.tsx +27 -0
  34. package/templates/js/react/README.md +116 -0
  35. package/templates/js/react/app.json +4 -0
  36. package/templates/js/react/assets/react-native-logo.png +0 -0
  37. package/templates/js/react/assets/react-native-logo@2x.png +0 -0
  38. package/templates/js/react/assets/react-native-logo@3x.png +0 -0
  39. package/templates/js/react/babel.config.js +24 -0
  40. package/templates/js/react/css.d.ts +24 -0
  41. package/templates/js/react/index.js +14 -0
  42. package/templates/js/react/metro.config.js +29 -0
  43. package/templates/js/react/package.json.fragment.json +22 -0
  44. package/templates/js/react/package.json.fragment.typescript.json +11 -0
  45. package/templates/js/react/tsconfig.json +18 -0
  46. package/templates/js/solid/.prettierrc.js +5 -0
  47. package/templates/js/solid/.watchmanconfig +1 -0
  48. package/templates/js/solid/App.css +89 -0
  49. package/templates/js/solid/App.jsx +35 -0
  50. package/templates/js/solid/App.tsx +35 -0
  51. package/templates/js/solid/README.md +18 -0
  52. package/templates/js/solid/app.json +4 -0
  53. package/templates/js/solid/assets/plus-icon.png +0 -0
  54. package/templates/js/solid/assets/plus-icon@2x.png +0 -0
  55. package/templates/js/solid/assets/plus-icon@3x.png +0 -0
  56. package/templates/js/solid/assets/react-native-logo.png +0 -0
  57. package/templates/js/solid/assets/react-native-logo@2x.png +0 -0
  58. package/templates/js/solid/assets/react-native-logo@3x.png +0 -0
  59. package/templates/js/solid/assets/solid-logo.png +0 -0
  60. package/templates/js/solid/assets/solid-logo@2x.png +0 -0
  61. package/templates/js/solid/assets/solid-logo@3x.png +0 -0
  62. package/templates/js/solid/babel.config.js +29 -0
  63. package/templates/js/solid/css.d.ts +20 -0
  64. package/templates/js/solid/eslint.config.js +3 -0
  65. package/templates/js/solid/index.js +13 -0
  66. package/templates/js/solid/metro.config.js +50 -0
  67. package/templates/js/solid/package.json.fragment.json +23 -0
  68. package/templates/js/solid/package.json.fragment.typescript.json +11 -0
  69. package/templates/js/solid/tsconfig.json +11 -0
  70. package/templates/js/svelte/.prettierrc.js +15 -0
  71. package/templates/js/svelte/.watchmanconfig +1 -0
  72. package/templates/js/svelte/App.svelte +123 -0
  73. package/templates/js/svelte/App.typescript.svelte +123 -0
  74. package/templates/js/svelte/README.md +18 -0
  75. package/templates/js/svelte/app.json +4 -0
  76. package/templates/js/svelte/babel.config.js +22 -0
  77. package/templates/js/svelte/css.d.ts +21 -0
  78. package/templates/js/svelte/eslint.config.js +37 -0
  79. package/templates/js/svelte/image-uris.js +8 -0
  80. package/templates/js/svelte/index.js +13 -0
  81. package/templates/js/svelte/metro.config.js +83 -0
  82. package/templates/js/svelte/package.json.fragment.json +26 -0
  83. package/templates/js/svelte/package.json.fragment.typescript.json +12 -0
  84. package/templates/js/svelte/svelte.config.js +47 -0
  85. package/templates/js/svelte/tsconfig.json +9 -0
  86. package/templates/js/svelte/tsconfig.typecheck.json +4 -0
  87. package/templates/js/vue-sfc/.prettierrc.js +5 -0
  88. package/templates/js/vue-sfc/.watchmanconfig +1 -0
  89. package/templates/js/vue-sfc/App.typescript.vue +128 -0
  90. package/templates/js/vue-sfc/App.vue +128 -0
  91. package/templates/js/vue-sfc/README.md +124 -0
  92. package/templates/js/vue-sfc/app.json +4 -0
  93. package/templates/js/vue-sfc/assets/plus-icon.png +0 -0
  94. package/templates/js/vue-sfc/assets/plus-icon@2x.png +0 -0
  95. package/templates/js/vue-sfc/assets/plus-icon@3x.png +0 -0
  96. package/templates/js/vue-sfc/assets/react-native-logo.png +0 -0
  97. package/templates/js/vue-sfc/assets/react-native-logo@2x.png +0 -0
  98. package/templates/js/vue-sfc/assets/react-native-logo@3x.png +0 -0
  99. package/templates/js/vue-sfc/assets/vue-logo.png +0 -0
  100. package/templates/js/vue-sfc/assets/vue-logo@2x.png +0 -0
  101. package/templates/js/vue-sfc/assets/vue-logo@3x.png +0 -0
  102. package/templates/js/vue-sfc/babel.config.js +24 -0
  103. package/templates/js/vue-sfc/css.d.ts +24 -0
  104. package/templates/js/vue-sfc/eslint.config.js +48 -0
  105. package/templates/js/vue-sfc/index.js +13 -0
  106. package/templates/js/vue-sfc/metro.config.js +30 -0
  107. package/templates/js/vue-sfc/package.json.fragment.json +26 -0
  108. package/templates/js/vue-sfc/package.json.fragment.typescript.json +11 -0
  109. package/templates/js/vue-sfc/tsconfig.json +18 -0
  110. package/templates/js/vue-sfc/tsconfig.typecheck.json +8 -0
  111. package/templates/js/vue-sfc/vue-runtime-core.d.ts +3 -0
  112. package/templates/js/vue-tsx/.prettierrc.js +5 -0
  113. package/templates/js/vue-tsx/.watchmanconfig +1 -0
  114. package/templates/js/vue-tsx/App.css +89 -0
  115. package/templates/js/vue-tsx/App.jsx +40 -0
  116. package/templates/js/vue-tsx/App.tsx +40 -0
  117. package/templates/js/vue-tsx/README.md +110 -0
  118. package/templates/js/vue-tsx/app.json +4 -0
  119. package/templates/js/vue-tsx/assets/plus-icon.png +0 -0
  120. package/templates/js/vue-tsx/assets/plus-icon@2x.png +0 -0
  121. package/templates/js/vue-tsx/assets/plus-icon@3x.png +0 -0
  122. package/templates/js/vue-tsx/assets/react-native-logo.png +0 -0
  123. package/templates/js/vue-tsx/assets/react-native-logo@2x.png +0 -0
  124. package/templates/js/vue-tsx/assets/react-native-logo@3x.png +0 -0
  125. package/templates/js/vue-tsx/assets/vue-logo.png +0 -0
  126. package/templates/js/vue-tsx/assets/vue-logo@2x.png +0 -0
  127. package/templates/js/vue-tsx/assets/vue-logo@3x.png +0 -0
  128. package/templates/js/vue-tsx/babel.config.js +67 -0
  129. package/templates/js/vue-tsx/css.d.ts +24 -0
  130. package/templates/js/vue-tsx/index.js +14 -0
  131. package/templates/js/vue-tsx/metro.config.js +42 -0
  132. package/templates/js/vue-tsx/package.json.fragment.json +26 -0
  133. package/templates/js/vue-tsx/package.json.fragment.typescript.json +11 -0
  134. package/templates/js/vue-tsx/tsconfig.json +15 -0
  135. package/templates/js/vue-tsx/tsconfig.typecheck.json +10 -0
  136. package/templates/js/vue-tsx/vue-jsx.d.ts +43 -0
  137. package/templates/js/vue-tsx/vue-runtime-core.d.ts +3 -0
  138. package/templates/layers/README.md +90 -0
  139. package/templates/layers/application/package.json.fragment.json +5 -0
  140. package/templates/layers/battery/package.json.fragment.json +5 -0
  141. package/templates/layers/brightness/package.json.fragment.json +5 -0
  142. package/templates/layers/cellular/package.json.fragment.json +5 -0
  143. package/templates/layers/clipboard/package.json.fragment.json +5 -0
  144. package/templates/layers/crypto/package.json.fragment.json +5 -0
  145. package/templates/layers/device/package.json.fragment.json +5 -0
  146. package/templates/layers/expo-modules/ios/Canary/Info.plist +66 -0
  147. package/templates/layers/expo-modules/package.json.fragment.json +9 -0
  148. package/templates/layers/haptics/package.json.fragment.json +5 -0
  149. package/templates/layers/keep-awake/package.json.fragment.json +5 -0
  150. package/templates/layers/local-auth/package.json.fragment.json +5 -0
  151. package/templates/layers/localization/package.json.fragment.json +5 -0
  152. package/templates/layers/navigation/app/angular/assets/angular-logo.png +0 -0
  153. package/templates/layers/navigation/app/angular/assets/angular-logo@2x.png +0 -0
  154. package/templates/layers/navigation/app/angular/assets/angular-logo@3x.png +0 -0
  155. package/templates/layers/navigation/app/angular/assets/plus-icon.png +0 -0
  156. package/templates/layers/navigation/app/angular/assets/plus-icon@2x.png +0 -0
  157. package/templates/layers/navigation/app/angular/assets/plus-icon@3x.png +0 -0
  158. package/templates/layers/navigation/app/angular/assets/react-native-logo.png +0 -0
  159. package/templates/layers/navigation/app/angular/assets/react-native-logo@2x.png +0 -0
  160. package/templates/layers/navigation/app/angular/assets/react-native-logo@3x.png +0 -0
  161. package/templates/layers/navigation/app/angular/src/App.css +129 -0
  162. package/templates/layers/navigation/app/angular/src/App.ts +31 -0
  163. package/templates/layers/navigation/app/angular/src/DetailsScreen.ts +24 -0
  164. package/templates/layers/navigation/app/angular/src/MenuScreen.ts +43 -0
  165. package/templates/layers/navigation/app/react/App.css +109 -0
  166. package/templates/layers/navigation/app/react/App.jsx +77 -0
  167. package/templates/layers/navigation/app/react/App.tsx +77 -0
  168. package/templates/layers/navigation/app/react/assets/react-native-logo.png +0 -0
  169. package/templates/layers/navigation/app/react/assets/react-native-logo@2x.png +0 -0
  170. package/templates/layers/navigation/app/react/assets/react-native-logo@3x.png +0 -0
  171. package/templates/layers/navigation/app/solid/App.css +129 -0
  172. package/templates/layers/navigation/app/solid/App.jsx +85 -0
  173. package/templates/layers/navigation/app/solid/App.tsx +85 -0
  174. package/templates/layers/navigation/app/solid/assets/plus-icon.png +0 -0
  175. package/templates/layers/navigation/app/solid/assets/plus-icon@2x.png +0 -0
  176. package/templates/layers/navigation/app/solid/assets/plus-icon@3x.png +0 -0
  177. package/templates/layers/navigation/app/solid/assets/react-native-logo.png +0 -0
  178. package/templates/layers/navigation/app/solid/assets/react-native-logo@2x.png +0 -0
  179. package/templates/layers/navigation/app/solid/assets/react-native-logo@3x.png +0 -0
  180. package/templates/layers/navigation/app/solid/assets/solid-logo.png +0 -0
  181. package/templates/layers/navigation/app/solid/assets/solid-logo@2x.png +0 -0
  182. package/templates/layers/navigation/app/solid/assets/solid-logo@3x.png +0 -0
  183. package/templates/layers/navigation/app/svelte/App.css +129 -0
  184. package/templates/layers/navigation/app/svelte/App.svelte +19 -0
  185. package/templates/layers/navigation/app/svelte/App.typescript.svelte +19 -0
  186. package/templates/layers/navigation/app/svelte/DetailsScreen.svelte +17 -0
  187. package/templates/layers/navigation/app/svelte/DetailsScreen.typescript.svelte +17 -0
  188. package/templates/layers/navigation/app/svelte/MenuScreen.svelte +40 -0
  189. package/templates/layers/navigation/app/svelte/MenuScreen.typescript.svelte +40 -0
  190. package/templates/layers/navigation/app/svelte/image-uris.js +8 -0
  191. package/templates/layers/navigation/app/vue-sfc/App.css +129 -0
  192. package/templates/layers/navigation/app/vue-sfc/App.typescript.vue +36 -0
  193. package/templates/layers/navigation/app/vue-sfc/App.vue +36 -0
  194. package/templates/layers/navigation/app/vue-sfc/DetailsScreen.typescript.vue +20 -0
  195. package/templates/layers/navigation/app/vue-sfc/DetailsScreen.vue +20 -0
  196. package/templates/layers/navigation/app/vue-sfc/MenuScreen.typescript.vue +52 -0
  197. package/templates/layers/navigation/app/vue-sfc/MenuScreen.vue +52 -0
  198. package/templates/layers/navigation/app/vue-sfc/assets/plus-icon.png +0 -0
  199. package/templates/layers/navigation/app/vue-sfc/assets/plus-icon@2x.png +0 -0
  200. package/templates/layers/navigation/app/vue-sfc/assets/plus-icon@3x.png +0 -0
  201. package/templates/layers/navigation/app/vue-sfc/assets/react-native-logo.png +0 -0
  202. package/templates/layers/navigation/app/vue-sfc/assets/react-native-logo@2x.png +0 -0
  203. package/templates/layers/navigation/app/vue-sfc/assets/react-native-logo@3x.png +0 -0
  204. package/templates/layers/navigation/app/vue-sfc/assets/vue-logo.png +0 -0
  205. package/templates/layers/navigation/app/vue-sfc/assets/vue-logo@2x.png +0 -0
  206. package/templates/layers/navigation/app/vue-sfc/assets/vue-logo@3x.png +0 -0
  207. package/templates/layers/navigation/app/vue-tsx/App.css +129 -0
  208. package/templates/layers/navigation/app/vue-tsx/App.jsx +91 -0
  209. package/templates/layers/navigation/app/vue-tsx/App.tsx +91 -0
  210. package/templates/layers/navigation/app/vue-tsx/assets/plus-icon.png +0 -0
  211. package/templates/layers/navigation/app/vue-tsx/assets/plus-icon@2x.png +0 -0
  212. package/templates/layers/navigation/app/vue-tsx/assets/plus-icon@3x.png +0 -0
  213. package/templates/layers/navigation/app/vue-tsx/assets/react-native-logo.png +0 -0
  214. package/templates/layers/navigation/app/vue-tsx/assets/react-native-logo@2x.png +0 -0
  215. package/templates/layers/navigation/app/vue-tsx/assets/react-native-logo@3x.png +0 -0
  216. package/templates/layers/navigation/app/vue-tsx/assets/vue-logo.png +0 -0
  217. package/templates/layers/navigation/app/vue-tsx/assets/vue-logo@2x.png +0 -0
  218. package/templates/layers/navigation/app/vue-tsx/assets/vue-logo@3x.png +0 -0
  219. package/templates/layers/navigation/package.json.fragment.json +5 -0
  220. package/templates/layers/network/package.json.fragment.json +5 -0
  221. package/templates/layers/screen-orientation/package.json.fragment.json +5 -0
  222. package/templates/layers/secure-store/package.json.fragment.json +5 -0
  223. package/templates/layers/sensors/package.json.fragment.json +5 -0
  224. package/templates/layers/sharing/package.json.fragment.json +5 -0
  225. package/templates/layers/slider/package.json.fragment.json +5 -0
  226. package/templates/layers/sms/package.json.fragment.json +5 -0
  227. package/templates/layers/splash-screen/native/android/app/src/main/AndroidManifest.xml +28 -0
  228. package/templates/layers/splash-screen/native/android/app/src/main/java/com/canary/MainActivity.kt +29 -0
  229. package/templates/layers/splash-screen/native/android/app/src/main/res/values/styles.xml +12 -0
  230. package/templates/layers/splash-screen/native/ios/Canary/AppDelegate.swift +54 -0
  231. package/templates/layers/splash-screen/package.json.fragment.json +5 -0
  232. package/templates/layers/standard-web-crypto/package.json.fragment.json +5 -0
  233. package/templates/layers/store-review/package.json.fragment.json +5 -0
  234. package/templates/layers/system-ui/package.json.fragment.json +5 -0
  235. package/templates/layers/testing/detox.config.js +42 -0
  236. package/templates/layers/testing/e2e/jest.config.js +21 -0
  237. package/templates/layers/testing/e2e/setup.ts +3 -0
  238. package/templates/layers/testing/e2e/smoke.test.ts +17 -0
  239. package/templates/layers/testing/e2e/tsconfig.json +7 -0
  240. package/templates/layers/testing/fragment/angular/package.json.fragment.json +18 -0
  241. package/templates/layers/testing/fragment/base/package.json.fragment.json +18 -0
  242. package/templates/layers/tracking-transparency/package.json.fragment.json +5 -0
  243. package/templates/layers/web-browser/package.json.fragment.json +5 -0
  244. package/templates/native/Gemfile +17 -0
  245. package/templates/native/README.md +48 -0
  246. package/templates/native/android/app/build.gradle +130 -0
  247. package/templates/native/android/app/debug.keystore +0 -0
  248. package/templates/native/android/app/proguard-rules.pro +10 -0
  249. package/templates/native/android/app/src/androidTest/java/com/canary/DetoxTest.java +29 -0
  250. package/templates/native/android/app/src/main/AndroidManifest.xml +28 -0
  251. package/templates/native/android/app/src/main/java/com/canary/MainActivity.kt +22 -0
  252. package/templates/native/android/app/src/main/java/com/canary/MainApplication.kt +27 -0
  253. package/templates/native/android/app/src/main/res/drawable/rn_edit_text_material.xml +37 -0
  254. package/templates/native/android/app/src/main/res/drawable-hdpi/bootsplash_logo.png +0 -0
  255. package/templates/native/android/app/src/main/res/drawable-mdpi/bootsplash_logo.png +0 -0
  256. package/templates/native/android/app/src/main/res/drawable-xhdpi/bootsplash_logo.png +0 -0
  257. package/templates/native/android/app/src/main/res/drawable-xxhdpi/bootsplash_logo.png +0 -0
  258. package/templates/native/android/app/src/main/res/drawable-xxxhdpi/bootsplash_logo.png +0 -0
  259. package/templates/native/android/app/src/main/res/mipmap-hdpi/ic_launcher.png +0 -0
  260. package/templates/native/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png +0 -0
  261. package/templates/native/android/app/src/main/res/mipmap-mdpi/ic_launcher.png +0 -0
  262. package/templates/native/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png +0 -0
  263. package/templates/native/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png +0 -0
  264. package/templates/native/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png +0 -0
  265. package/templates/native/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png +0 -0
  266. package/templates/native/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png +0 -0
  267. package/templates/native/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
  268. package/templates/native/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png +0 -0
  269. package/templates/native/android/app/src/main/res/values/colors.xml +3 -0
  270. package/templates/native/android/app/src/main/res/values/strings.xml +3 -0
  271. package/templates/native/android/app/src/main/res/values/styles.xml +6 -0
  272. package/templates/native/android/build.gradle +33 -0
  273. package/templates/native/android/gradle/wrapper/gradle-wrapper.jar +0 -0
  274. package/templates/native/android/gradle/wrapper/gradle-wrapper.properties +7 -0
  275. package/templates/native/android/gradle.properties +44 -0
  276. package/templates/native/android/gradlew +248 -0
  277. package/templates/native/android/gradlew.bat +98 -0
  278. package/templates/native/android/settings.gradle +10 -0
  279. package/templates/native/bootsplash-logo/angular/android/app/src/main/res/drawable-hdpi/bootsplash_logo.png +0 -0
  280. package/templates/native/bootsplash-logo/angular/android/app/src/main/res/drawable-mdpi/bootsplash_logo.png +0 -0
  281. package/templates/native/bootsplash-logo/angular/android/app/src/main/res/drawable-xhdpi/bootsplash_logo.png +0 -0
  282. package/templates/native/bootsplash-logo/angular/android/app/src/main/res/drawable-xxhdpi/bootsplash_logo.png +0 -0
  283. package/templates/native/bootsplash-logo/angular/android/app/src/main/res/drawable-xxxhdpi/bootsplash_logo.png +0 -0
  284. package/templates/native/bootsplash-logo/angular/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55.png +0 -0
  285. package/templates/native/bootsplash-logo/angular/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55@2x.png +0 -0
  286. package/templates/native/bootsplash-logo/angular/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55@3x.png +0 -0
  287. package/templates/native/bootsplash-logo/solid/android/app/src/main/res/drawable-hdpi/bootsplash_logo.png +0 -0
  288. package/templates/native/bootsplash-logo/solid/android/app/src/main/res/drawable-mdpi/bootsplash_logo.png +0 -0
  289. package/templates/native/bootsplash-logo/solid/android/app/src/main/res/drawable-xhdpi/bootsplash_logo.png +0 -0
  290. package/templates/native/bootsplash-logo/solid/android/app/src/main/res/drawable-xxhdpi/bootsplash_logo.png +0 -0
  291. package/templates/native/bootsplash-logo/solid/android/app/src/main/res/drawable-xxxhdpi/bootsplash_logo.png +0 -0
  292. package/templates/native/bootsplash-logo/solid/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55.png +0 -0
  293. package/templates/native/bootsplash-logo/solid/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55@2x.png +0 -0
  294. package/templates/native/bootsplash-logo/solid/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55@3x.png +0 -0
  295. package/templates/native/bootsplash-logo/svelte/android/app/src/main/res/drawable-hdpi/bootsplash_logo.png +0 -0
  296. package/templates/native/bootsplash-logo/svelte/android/app/src/main/res/drawable-mdpi/bootsplash_logo.png +0 -0
  297. package/templates/native/bootsplash-logo/svelte/android/app/src/main/res/drawable-xhdpi/bootsplash_logo.png +0 -0
  298. package/templates/native/bootsplash-logo/svelte/android/app/src/main/res/drawable-xxhdpi/bootsplash_logo.png +0 -0
  299. package/templates/native/bootsplash-logo/svelte/android/app/src/main/res/drawable-xxxhdpi/bootsplash_logo.png +0 -0
  300. package/templates/native/bootsplash-logo/svelte/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55.png +0 -0
  301. package/templates/native/bootsplash-logo/svelte/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55@2x.png +0 -0
  302. package/templates/native/bootsplash-logo/svelte/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55@3x.png +0 -0
  303. package/templates/native/bootsplash-logo/vue/android/app/src/main/res/drawable-hdpi/bootsplash_logo.png +0 -0
  304. package/templates/native/bootsplash-logo/vue/android/app/src/main/res/drawable-mdpi/bootsplash_logo.png +0 -0
  305. package/templates/native/bootsplash-logo/vue/android/app/src/main/res/drawable-xhdpi/bootsplash_logo.png +0 -0
  306. package/templates/native/bootsplash-logo/vue/android/app/src/main/res/drawable-xxhdpi/bootsplash_logo.png +0 -0
  307. package/templates/native/bootsplash-logo/vue/android/app/src/main/res/drawable-xxxhdpi/bootsplash_logo.png +0 -0
  308. package/templates/native/bootsplash-logo/vue/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55.png +0 -0
  309. package/templates/native/bootsplash-logo/vue/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55@2x.png +0 -0
  310. package/templates/native/bootsplash-logo/vue/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55@3x.png +0 -0
  311. package/templates/native/eslint.config.js +3 -0
  312. package/templates/native/ios/.xcode.env +11 -0
  313. package/templates/native/ios/Canary/AppDelegate.swift +48 -0
  314. package/templates/native/ios/Canary/BootSplash.storyboard +46 -0
  315. package/templates/native/ios/Canary/Colors.xcassets/BootSplashBackground-498e55.colorset/Contents.json +20 -0
  316. package/templates/native/ios/Canary/Images.xcassets/AppIcon.appiconset/Contents.json +53 -0
  317. package/templates/native/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/Contents.json +23 -0
  318. package/templates/native/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55.png +0 -0
  319. package/templates/native/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55@2x.png +0 -0
  320. package/templates/native/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55@3x.png +0 -0
  321. package/templates/native/ios/Canary/Images.xcassets/Contents.json +6 -0
  322. package/templates/native/ios/Canary/Info.plist +60 -0
  323. package/templates/native/ios/Canary/LaunchScreen.storyboard +47 -0
  324. package/templates/native/ios/Canary/PrivacyInfo.xcprivacy +37 -0
  325. package/templates/native/ios/Canary.xcodeproj/project.pbxproj +504 -0
  326. package/templates/native/ios/Canary.xcodeproj/xcshareddata/xcschemes/Canary.xcscheme +88 -0
  327. package/templates/native/ios/Canary.xcworkspace/contents.xcworkspacedata +10 -0
  328. package/templates/native/ios/Podfile +34 -0
  329. package/templates/native/package.json.fragment.json +22 -0
  330. package/templates/native/package.json.fragment.typescript.json +8 -0
  331. package/templates/styling/js/angular/css-modules/src/App.ts +25 -0
  332. package/templates/styling/js/angular/stylesheet/src/App.ts +26 -0
  333. package/templates/styling/js/react/css-modules/App.jsx +15 -0
  334. package/templates/styling/js/react/css-modules/App.tsx +15 -0
  335. package/templates/styling/js/react/stylesheet/App.jsx +19 -0
  336. package/templates/styling/js/react/stylesheet/App.tsx +19 -0
  337. package/templates/styling/js/solid/css-modules/App.jsx +15 -0
  338. package/templates/styling/js/solid/css-modules/App.tsx +15 -0
  339. package/templates/styling/js/solid/stylesheet/App.jsx +19 -0
  340. package/templates/styling/js/solid/stylesheet/App.tsx +19 -0
  341. package/templates/styling/js/svelte/css-modules/App.svelte +12 -0
  342. package/templates/styling/js/svelte/css-modules/App.typescript.svelte +12 -0
  343. package/templates/styling/js/svelte/stylesheet/App.svelte +15 -0
  344. package/templates/styling/js/svelte/stylesheet/App.typescript.svelte +15 -0
  345. package/templates/styling/js/vue-sfc/css-modules/App.typescript.vue +15 -0
  346. package/templates/styling/js/vue-sfc/css-modules/App.vue +15 -0
  347. package/templates/styling/js/vue-sfc/stylesheet/App.typescript.vue +18 -0
  348. package/templates/styling/js/vue-sfc/stylesheet/App.vue +18 -0
  349. package/templates/styling/js/vue-tsx/css-modules/App.jsx +16 -0
  350. package/templates/styling/js/vue-tsx/css-modules/App.tsx +16 -0
  351. package/templates/styling/js/vue-tsx/stylesheet/App.jsx +20 -0
  352. package/templates/styling/js/vue-tsx/stylesheet/App.tsx +20 -0
  353. package/templates/styling/navigation/angular/css-modules/src/DetailsScreen.ts +17 -0
  354. package/templates/styling/navigation/angular/css-modules/src/MenuScreen.ts +22 -0
  355. package/templates/styling/navigation/angular/stylesheet/src/DetailsScreen.ts +18 -0
  356. package/templates/styling/navigation/angular/stylesheet/src/MenuScreen.ts +23 -0
  357. package/templates/styling/navigation/react/css-modules/App.jsx +32 -0
  358. package/templates/styling/navigation/react/css-modules/App.tsx +32 -0
  359. package/templates/styling/navigation/react/stylesheet/App.jsx +36 -0
  360. package/templates/styling/navigation/react/stylesheet/App.tsx +36 -0
  361. package/templates/styling/navigation/solid/css-modules/App.jsx +32 -0
  362. package/templates/styling/navigation/solid/css-modules/App.tsx +32 -0
  363. package/templates/styling/navigation/solid/stylesheet/App.jsx +36 -0
  364. package/templates/styling/navigation/solid/stylesheet/App.tsx +36 -0
  365. package/templates/styling/navigation/svelte/css-modules/DetailsScreen.svelte +7 -0
  366. package/templates/styling/navigation/svelte/css-modules/DetailsScreen.typescript.svelte +7 -0
  367. package/templates/styling/navigation/svelte/css-modules/MenuScreen.svelte +13 -0
  368. package/templates/styling/navigation/svelte/css-modules/MenuScreen.typescript.svelte +13 -0
  369. package/templates/styling/navigation/svelte/stylesheet/DetailsScreen.svelte +11 -0
  370. package/templates/styling/navigation/svelte/stylesheet/DetailsScreen.typescript.svelte +11 -0
  371. package/templates/styling/navigation/svelte/stylesheet/MenuScreen.svelte +16 -0
  372. package/templates/styling/navigation/svelte/stylesheet/MenuScreen.typescript.svelte +16 -0
  373. package/templates/styling/navigation/vue-sfc/css-modules/DetailsScreen.typescript.vue +9 -0
  374. package/templates/styling/navigation/vue-sfc/css-modules/DetailsScreen.vue +9 -0
  375. package/templates/styling/navigation/vue-sfc/css-modules/MenuScreen.typescript.vue +15 -0
  376. package/templates/styling/navigation/vue-sfc/css-modules/MenuScreen.vue +15 -0
  377. package/templates/styling/navigation/vue-sfc/stylesheet/DetailsScreen.typescript.vue +13 -0
  378. package/templates/styling/navigation/vue-sfc/stylesheet/DetailsScreen.vue +13 -0
  379. package/templates/styling/navigation/vue-sfc/stylesheet/MenuScreen.typescript.vue +18 -0
  380. package/templates/styling/navigation/vue-sfc/stylesheet/MenuScreen.vue +18 -0
  381. package/templates/styling/navigation/vue-tsx/css-modules/App.jsx +34 -0
  382. package/templates/styling/navigation/vue-tsx/css-modules/App.tsx +34 -0
  383. package/templates/styling/navigation/vue-tsx/stylesheet/App.jsx +38 -0
  384. package/templates/styling/navigation/vue-tsx/stylesheet/App.tsx +38 -0
@@ -0,0 +1,42 @@
1
+ {
2
+ "extends": "@symbiote-native/angular/tsconfig.angular.base.json",
3
+ "compilerOptions": {
4
+ // packages/navigation's `./angular` export now hands ngc a prebuilt
5
+ // `build-ngc/angular/index.d.ts` (a conditional `exports` entry, mirroring
6
+ // packages/splash-screen and adapters/angular) instead of raw `.ts` source, so this app no
7
+ // longer pulls sibling package source into its own program — declaration files are exempt
8
+ // from TS's rootDir check, so rootDir stays scoped to this directory like every other
9
+ // `.examples/*` app.
10
+ "rootDir": ".",
11
+ "outDir": "build/angular",
12
+ "baseUrl": "."
13
+ },
14
+ "files": ["src/App.ts", "src/css.d.ts"],
15
+ "exclude": ["build", "e2e", "**/node_modules", "**/Pods"],
16
+ // `ngc --watch` (perform_watch.js) chokidar-watches `angularCompilerOptions.basePath`
17
+ // recursively, filtered only by a hardcoded regex (node_modules/.dotfiles/.js/.map/
18
+ // .metadata.json — NOT ios/android/build). basePath defaults to dirname(this file) =
19
+ // examples/angular/, a sibling of ios/ (17k+ files) and android/ (1k+ files), so the watcher
20
+ // recursed into both and hit EMFILE. All real source now lives under src/ (moved 2026-07-14
21
+ // specifically for this), so basePath narrows the watch root to just that — confirmed empirically
22
+ // that overriding basePath does NOT affect file/rootDir resolution (parseJsonConfigFileContent
23
+ // uses it only as the include/exclude glob base, independent of `files`), only the watch root.
24
+ // Kept relative here (portable, machine-independent) even though @angular/compiler-cli's
25
+ // INCREMENTAL recompile path needs it absolute (throws TS500 "path is not absolute" via
26
+ // absoluteFrom() otherwise, on the second file change onward) — symbiote-angular-dev.cjs
27
+ // resolves it to absolute at spawn time via a throwaway override config, so this file never
28
+ // carries a hardcoded machine path. `ngc -p tsconfig.angular.json` one-shot builds (ng:build)
29
+ // don't need that resolution — a relative basePath is fine for a cold compile.
30
+ "angularCompilerOptions": {
31
+ "basePath": "src"
32
+ },
33
+ // Editor tsserver honors this (and resolves it relative to THIS file, not the
34
+ // extended tsconfig.angular.base.json — microsoft/TypeScript#55656 — so it can't
35
+ // live in the shared base). `ngc --watch` itself does NOT: @angular/compiler-cli's
36
+ // watch mode calls chokidar directly (perform_watch.js) instead of TS's native
37
+ // watch host, so watchOptions has zero effect on it — the angularCompilerOptions.basePath
38
+ // above is what actually fixes the watch scope.
39
+ "watchOptions": {
40
+ "excludeDirectories": ["**/node_modules", "../../node_modules", "**/.git", "**/build"]
41
+ }
42
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "extends": "@react-native/typescript-config",
3
+ "compilerOptions": {
4
+ // @angular/core's own .d.ts surface references DOM lib types (Node, Document, …) even though
5
+ // this adapter never touches a real DOM at runtime (DOM-less bootstrap, see render.ts) — every
6
+ // file importing it needs DOM in scope or an editor language server spams TS2584 on those
7
+ // ambient names. tsconfig.angular.json (the real ngc build config) already sets this; mirrored
8
+ // here so editor diagnostics for the whole example (not just App.ts) match the real build.
9
+ "lib": ["ES2022", "DOM"],
10
+ "types": [],
11
+ "plugins": [{ "name": "@symbiote-native/css-parser/typescript-plugin" }]
12
+ },
13
+ "include": ["**/*.ts"],
14
+ // e2e/ ships its own complete tsconfig.json (jest + detox + node) — excluded here so this
15
+ // root config, which has no reason to typecheck it, doesn't also need jest's globals declared.
16
+ "exclude": ["build", "**/node_modules", "**/Pods", "e2e"]
17
+ }
@@ -0,0 +1,5 @@
1
+ module.exports = {
2
+ arrowParens: 'avoid',
3
+ singleQuote: true,
4
+ trailingComma: 'all',
5
+ };
@@ -0,0 +1 @@
1
+ {}
@@ -0,0 +1,69 @@
1
+ :root {
2
+ --ink: #0b1622;
3
+ --paper: #13243a;
4
+ --mist: #41506a;
5
+ --chalk: #cbd5e1;
6
+ --chalk-bright: #ffffff;
7
+ --brand: #61dafb;
8
+ }
9
+
10
+ .screen {
11
+ flex: 1;
12
+ background-color: var(--ink);
13
+ align-items: center;
14
+ justify-content: center;
15
+ gap: 24px;
16
+ padding: 24px 32px;
17
+ }
18
+
19
+ .brand-logo {
20
+ height: 64px;
21
+ aspect-ratio: 1.0977;
22
+ }
23
+
24
+ .title {
25
+ color: var(--chalk-bright);
26
+ font-size: 22px;
27
+ font-weight: bold;
28
+ text-align: center;
29
+ }
30
+
31
+ .subtitle {
32
+ color: var(--chalk);
33
+ font-size: 14px;
34
+ text-align: center;
35
+ }
36
+
37
+ .counter-card {
38
+ align-items: center;
39
+ gap: 4px;
40
+ padding: 20px 28px;
41
+ border-radius: 16px;
42
+ background-color: var(--paper);
43
+ }
44
+
45
+ .counter-label {
46
+ color: var(--mist);
47
+ font-size: 12px;
48
+ letter-spacing: 1px;
49
+ }
50
+
51
+ .counter-value {
52
+ color: var(--brand);
53
+ font-size: 32px;
54
+ font-weight: bold;
55
+ }
56
+
57
+ .button-primary {
58
+ align-items: center;
59
+ justify-content: center;
60
+ border-radius: 12px;
61
+ padding: 14px 22px;
62
+ background-color: var(--brand);
63
+ }
64
+
65
+ .button-primary-text {
66
+ color: var(--ink);
67
+ font-size: 15px;
68
+ font-weight: bold;
69
+ }
@@ -0,0 +1,27 @@
1
+ import { useState } from 'react';
2
+ import './App.css';
3
+
4
+ export default function App() {
5
+ const [count, setCount] = useState(0);
6
+
7
+ return (
8
+ <safe-area-view className="screen">
9
+ <image
10
+ className="brand-logo"
11
+ resizeMode="contain"
12
+ source={require('./assets/react-native-logo.png')}
13
+ />
14
+ <text className="title">Welcome to SymbioteNative!</text>
15
+ <text className="subtitle">Framework-agnostic React Native, driven by React.</text>
16
+
17
+ <view className="counter-card">
18
+ <text className="counter-label">TAPS</text>
19
+ <text className="counter-value">{count}</text>
20
+ </view>
21
+
22
+ <pressable className="button-primary" onPress={() => setCount((value) => value + 1)}>
23
+ <text className="button-primary-text">Tap me</text>
24
+ </pressable>
25
+ </safe-area-view>
26
+ );
27
+ }
@@ -0,0 +1,27 @@
1
+ import { useState } from 'react';
2
+ import './App.css';
3
+
4
+ export default function App() {
5
+ const [count, setCount] = useState<number>(0);
6
+
7
+ return (
8
+ <safe-area-view className="screen">
9
+ <image
10
+ className="brand-logo"
11
+ resizeMode="contain"
12
+ source={require('./assets/react-native-logo.png')}
13
+ />
14
+ <text className="title">Welcome to SymbioteNative!</text>
15
+ <text className="subtitle">Framework-agnostic React Native, driven by React.</text>
16
+
17
+ <view className="counter-card">
18
+ <text className="counter-label">TAPS</text>
19
+ <text className="counter-value">{count}</text>
20
+ </view>
21
+
22
+ <pressable className="button-primary" onPress={() => setCount((value) => value + 1)}>
23
+ <text className="button-primary-text">Tap me</text>
24
+ </pressable>
25
+ </safe-area-view>
26
+ );
27
+ }
@@ -0,0 +1,116 @@
1
+ # `templates/js/react`
2
+
3
+ The React JS-level overlay for `@symbiote-native/cli new --framework react`. Combined at generation
4
+ time with `templates/native/{ios,android}` (the framework-agnostic native shell, shared by
5
+ every framework) to produce a full bare React Native app. Source of truth for every file here:
6
+ `examples/react` — the reference React canary — root-level files only (its `ios/`/`android/`
7
+ are covered by `templates/native`, not this folder).
8
+
9
+ ## What was copied, and why each belongs in the seam
10
+
11
+ Every file below is bootstrap/tooling: identical (or safe-to-reuse-verbatim) in any new
12
+ SymbioteNative React app, regardless of what screens/components the app author writes.
13
+
14
+ | File | Why it's part of the seam |
15
+ |---|---|
16
+ | `index.js` | The RN entry point. Calls `registerApp(App, { appName })` from `@symbiote-native/react/bootstrap`, which wires the native-host seams (colors, images, device events, third-party ViewConfigs) before mounting — every generated app needs this exact wiring, only `App` and `appName` vary. |
17
+ | `metro.config.js` | Wires `@symbiote-native/react/metro-css-parser` as Metro's `babelTransformerPath` (so `.css`/`.scss`/`.sass`/`.less`/`.styl` imports compile) and extends `resolver.sourceExts` accordingly. Framework-agnostic mechanism, React-specific only in which adapter package's transformer it points at. |
18
+ | `babel.config.js` | `@react-native/babel-preset` plus a small custom plugin that inlines `process.env.DEBUG` at bundle time, so `DEBUG=1` diagnostic logging (`dlog`/`isDebug` from `@symbiote-native/engine`) can be toggled without a runtime dependency. Generic to every SymbioteNative app. |
19
+ | `tsconfig.json` | Extends `@react-native/typescript-config` and registers `@symbiote-native/css-parser/typescript-plugin` for live per-file CSS-module typing in the editor. No app-specific paths. |
20
+ | `app.json` | RN's app registry name (`name`/`displayName`). Copied verbatim — see the parameterization note below. |
21
+ | `css.d.ts` | Ambient module declarations for `*.css` (side-effect import) and the generic `*.module.css` fallback typing. Needed by any app that imports CSS, regardless of what the CSS contains. |
22
+ | `.eslintrc.js` | `extends: '@react-native'` — the standard RN lint baseline, no app-specific rules. |
23
+ | `.prettierrc.js` | Formatting preferences (`arrowParens`, `singleQuote`, `trailingComma`) — a project-wide style choice, not app content. |
24
+ | `.watchmanconfig` | Empty `{}` — Watchman's marker file, identical in every RN project. |
25
+ | `.gitignore` | Standard RN ignore rules (Xcode/Gradle build artifacts, CocoaPods, node_modules, Detox artifacts, etc.) — applies at the generated app's root, which is where both this overlay and `templates/native` land, so it still earns its place here even though some entries (`ios/build/`, `.gradle`) cover the native tree. |
26
+ | `package.json.fragment.json` | Not from `examples/react` directly — see below. |
27
+
28
+ ## What was deliberately excluded, and why
29
+
30
+ - **App content**: `App.tsx`, `App.css`, `components/`, `screens/`, `navigation-lines.ts`,
31
+ `navigation-linking.ts`, `routes.ts`, `assets/` — the example's own demo screens/components,
32
+ not part of the scaffold seam. A generated app needs its own `App` from scratch (or a future
33
+ minimal starter, out of scope for this pass).
34
+ - **`e2e/`** — the example's own Detox test journeys (`canary-journeys.test.ts`,
35
+ `probe.test.ts`), written against the example's specific screens/navigation. Not applicable
36
+ to a freshly generated app with no screens yet.
37
+ - **`package-lock.json`** — a lockfile is generated fresh by whichever package manager
38
+ `@symbiote-native/cli new --pm <pm>` runs, never copied.
39
+ - **`README.md`** (the example's own) — documents the *example app*'s specific run/test
40
+ instructions (mentions "Canary" by name, the shared-native-shell caveat between the three
41
+ React/Vue examples). Not generic bootstrap content; a generated app gets its own README from
42
+ a future `generate.ts`, not this one verbatim.
43
+
44
+ ## Judgment calls on borderline files
45
+
46
+ - **`Gemfile` / `Gemfile.lock`** — excluded. These pin CocoaPods/Ruby gem versions for iOS
47
+ builds, which makes them native-tooling config, not JS-level config — closer in kind to
48
+ `templates/native/ios/Podfile`/`Podfile.lock` (which already live in the native shell) than
49
+ to anything in this folder. `templates/native/ios` doesn't currently have a `Gemfile` either,
50
+ which looks like a real gap for the native shell to close in its own pass — flagging it here
51
+ rather than silently copying it into `templates/js/react` (wrong tree) or into
52
+ `templates/native` (out of scope for this task, which was scoped to `templates/js/react`
53
+ only).
54
+ - **`detox.config.js`** — excluded. It's e2e test infrastructure, symmetric with excluding
55
+ `e2e/` itself (the config is useless without the test files it points at via
56
+ `testRunner.args.config: 'e2e/jest.config.js'`). It also hardcodes the literal app name/scheme
57
+ ("Canary", `ios/Canary.xcworkspace`) the same way `app.json` does — another argument for
58
+ treating e2e wiring as a later, parameterization-aware addition rather than a verbatim copy
59
+ now.
60
+ - **`app.json`** — copied, but **not parameterized**. Its `name`/`displayName` are still the
61
+ literal `"Canary"` values from `examples/react`. Inventing a placeholder/templating scheme
62
+ (e.g. `ejs` variables) is explicitly out of scope for this pass — that's real follow-up work
63
+ for `@symbiote-native/cli new`'s actual generation logic, which as of this pass is still stubbed
64
+ with `NotImplementedCommandError` in `src/commands/new.ts`/`src/commands/add.ts`. When that
65
+ lands, `app.json`'s `name` (and the matching native-side bundle id / scheme) needs to be
66
+ rewritten per-app, not left as this example's value.
67
+
68
+ ## `package.json.fragment.json`
69
+
70
+ A dependency **fragment**, not a full `package.json` — this folder isn't itself an npm
71
+ package. Lists only the dependencies a generated React app's `package.json` needs to run the
72
+ files above, pulled from `examples/react/package.json`'s exact (real, working) version ranges:
73
+
74
+ ```json
75
+ {
76
+ "dependencies": {
77
+ "@symbiote-native/react": "^0.2.8",
78
+ "react": "19.2.3",
79
+ "react-native": "0.86.0"
80
+ },
81
+ "devDependencies": {
82
+ "@react-native/babel-preset": "0.86.0",
83
+ "@react-native/metro-config": "0.86.0"
84
+ }
85
+ }
86
+ ```
87
+
88
+ Derivation: `@symbiote-native/react`, `react`, `react-native` per the task brief (the
89
+ SymbioteNative React runtime plus its two peer-dependency anchors — see
90
+ `<react_native_is_an_explicit_top_level_peer>` in the root `CLAUDE.md`); `@react-native/babel-
91
+ preset` because `babel.config.js` names it in its `presets` array; `@react-native/metro-config`
92
+ because `metro.config.js` `require()`s it directly.
93
+
94
+ **Not included, on purpose** (scoped out by the task brief, which limited the "actually
95
+ import/require" check to `index.js`/`metro.config.js`/`babel.config.js`): `tsconfig.json` also
96
+ needs `@react-native/typescript-config` (its `extends`) and `@symbiote-native/css-parser` (its
97
+ `plugins` entry), and `.eslintrc.js` needs `@react-native/eslint-config` (its `extends:
98
+ '@react-native'` shorthand) plus `eslint` itself. A real generated `package.json` will need
99
+ those too — flagging them here rather than silently expanding this fragment beyond what was
100
+ asked, since the actual merge logic (and whether it lives in this fragment or a separate
101
+ devDependencies-only fragment) is a `generate.ts` design decision, not this pass's call to
102
+ make.
103
+
104
+ ## No app-name/bundle-id parameterization yet
105
+
106
+ Worth repeating on its own: nothing in this folder is templated. `app.json`'s `name` field is
107
+ the literal `"Canary"` example value, unchanged. Turning this into a real generator — choosing
108
+ a templating mechanism (the package README's own notes point at `ejs`, matching `create-vue`'s
109
+ toolchain, but that's not decided or installed yet), parameterizing `app.json`, and wiring the
110
+ native-side app name/bundle id to match — is real follow-up work for `@symbiote-native/cli new`'s
111
+ generation logic, which is still stubbed with `NotImplementedCommandError` as of this pass.
112
+
113
+ ## Precedent
114
+
115
+ `examples/react` (bare) / `examples/expo-react` (what `--expo-modules` adds on top — not yet
116
+ reflected in this folder, since `--expo-modules` overlay content wasn't part of this pass).
@@ -0,0 +1,4 @@
1
+ {
2
+ "name": "Canary",
3
+ "displayName": "Canary"
4
+ }
@@ -0,0 +1,24 @@
1
+ // Inline `process.env.DEBUG` at bundle time so the @symbiote diagnostic logs can
2
+ // be toggled from the shell without a dependency:
3
+ // DEBUG=1 npx react-native start --reset-cache
4
+ // The value is read from Metro's own environment when this config is evaluated
5
+ // and baked into every transformed module (the app entry and the shared source).
6
+ const debugFlag = process.env.DEBUG === '1' ? '1' : '0';
7
+
8
+ function inlineDebugFlag({ types: t }) {
9
+ return {
10
+ name: 'inline-debug-flag',
11
+ visitor: {
12
+ MemberExpression(path) {
13
+ if (path.matchesPattern('process.env.DEBUG')) {
14
+ path.replaceWith(t.stringLiteral(debugFlag));
15
+ }
16
+ },
17
+ },
18
+ };
19
+ }
20
+
21
+ module.exports = {
22
+ presets: ['module:@react-native/babel-preset'],
23
+ plugins: [inlineDebugFlag],
24
+ };
@@ -0,0 +1,24 @@
1
+ // Ambient module for a plain, side-effect-only `.css` import (`import './App.css'`) —
2
+ // @symbiote-native/css-parser compiles it at build time (Metro's babelTransformerPath, see
3
+ // metro-css-transformer.js) into a registerStyles() call; there's no runtime export to type.
4
+ // Mirrors examples/angular/css.d.ts.
5
+ declare module '*.css';
6
+
7
+ // Same shape for the three optional preprocessor sources — css-parser reduces each to plain CSS
8
+ // before compiling, so a side-effect import of one is indistinguishable downstream from a `.css`
9
+ // one.
10
+ declare module '*.scss';
11
+ declare module '*.sass';
12
+ declare module '*.less';
13
+ declare module '*.styl';
14
+
15
+ // Generic (non-literal) fallback for a `.module.css` import — used by `tsc` outside a file that
16
+ // already has its own generated `Card.module.css.d.ts` (see `css-dts`, wired to `pretypecheck`;
17
+ // a real per-file `.d.ts` takes priority over this wildcard once generated). The
18
+ // `@symbiote-native/react/typescript-plugin` entry in tsconfig.json's `compilerOptions.plugins` gives
19
+ // the SAME per-file literal-key typing live in the editor — plugins never load for a standalone
20
+ // `tsc`/CI run, which is why both mechanisms exist side by side.
21
+ declare module '*.module.css' {
22
+ const styles: Record<string, string>;
23
+ export default styles;
24
+ }
@@ -0,0 +1,14 @@
1
+ /**
2
+ * @format
3
+ *
4
+ * Symbiote canary entry. App code uses our own AppRegistry (the RN-identical
5
+ * `registerComponent(appKey, () => App)`) which mounts via @symbiote-native/engine, not
6
+ * React Native's renderer; registerApp wires the native-host seams (colors, images, device
7
+ * events, third-party ViewConfigs) before registering, so this file only needs the app itself.
8
+ */
9
+
10
+ import { registerApp } from '@symbiote-native/react/bootstrap';
11
+ import App from './App';
12
+ import { name as appName } from './app.json';
13
+
14
+ registerApp(App, { appName });
@@ -0,0 +1,29 @@
1
+ const { getDefaultConfig, mergeConfig } = require('@react-native/metro-config');
2
+
3
+ const projectRoot = __dirname;
4
+
5
+ /**
6
+ * @symbiote-native/* resolve as ordinary npm packages from this app's own node_modules
7
+ * (examples/* is a standalone npm install, decoupled from the monorepo's pnpm workspace —
8
+ * see pnpm-workspace.yaml). @react-native/babel-preset strips the types.
9
+ *
10
+ * @type {import('@react-native/metro-config').MetroConfig}
11
+ */
12
+ const defaultConfig = getDefaultConfig(projectRoot);
13
+
14
+ const config = {
15
+ // Compile standalone .css/.module.css imports on the way into the bundle —
16
+ // @symbiote-native/react ships this transformer itself, the framework-agnostic path
17
+ // mirrored by the Vue and Angular examples' own adapter's ./metro-css-parser export.
18
+ transformer: {
19
+ babelTransformerPath: require.resolve('@symbiote-native/react/metro-css-parser'),
20
+ },
21
+ resolver: {
22
+ // Teach Metro that a style file is a source file (the transformer turns it into a module).
23
+ // scss/sass/less/styl are optional SCSS/Sass/Less/Stylus preprocessor sources handled by
24
+ // core/css-parser/src/preprocessors.ts, which reduces each to plain CSS before compiling.
25
+ sourceExts: [...defaultConfig.resolver.sourceExts, 'css', 'scss', 'sass', 'less', 'styl'],
26
+ },
27
+ };
28
+
29
+ module.exports = mergeConfig(defaultConfig, config);
@@ -0,0 +1,22 @@
1
+ {
2
+ "scripts": {
3
+ "android": "react-native run-android",
4
+ "android:release": "react-native run-android --mode Release",
5
+ "ios": "react-native run-ios",
6
+ "ios:release": "react-native run-ios --mode Release",
7
+ "lint": "eslint .",
8
+ "start": "react-native start",
9
+ "dev": "react-native start --reset-cache"
10
+ },
11
+ "dependencies": {
12
+ "@symbiote-native/android": "latest",
13
+ "@symbiote-native/engine": "latest",
14
+ "@symbiote-native/react": "latest",
15
+ "react": "19.2.3",
16
+ "react-native": "0.86.0"
17
+ },
18
+ "devDependencies": {
19
+ "@react-native/babel-preset": "0.86.0",
20
+ "@react-native/metro-config": "0.86.0"
21
+ }
22
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "scripts": {
3
+ "pretypecheck": "css-dts .",
4
+ "typecheck": "tsc --noEmit"
5
+ },
6
+ "devDependencies": {
7
+ "@react-native/typescript-config": "0.86.0",
8
+ "@types/react": "^19.2.0",
9
+ "typescript": "~6.0.0"
10
+ }
11
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "extends": "@react-native/typescript-config",
3
+ "compilerOptions": {
4
+ // @react-native/typescript-config's own base unconditionally sets types:["jest"] — an empty
5
+ // array here is a real override (not just "no opinion"), needed because @types/jest is only
6
+ // resolvable once --testing installs it; omitting this key entirely would inherit the
7
+ // base's ["jest"] through `extends` and fail with "Cannot find type definition file 'jest'".
8
+ "types": [],
9
+ // The adapter owns its own JSX namespace (adapters/react/src/jsx-runtime.ts) — without this,
10
+ // `<view>`/`<text>` are unknown intrinsics to tsc.
11
+ "jsxImportSource": "@symbiote-native/react",
12
+ "plugins": [{ "name": "@symbiote-native/css-parser/typescript-plugin" }]
13
+ },
14
+ "include": ["**/*.ts", "**/*.tsx"],
15
+ // e2e/ ships its own complete tsconfig.json (jest + detox + node) — excluded here so this root
16
+ // config, which has no reason to typecheck it, doesn't also need jest's globals declared.
17
+ "exclude": ["**/node_modules", "**/Pods", "e2e"]
18
+ }
@@ -0,0 +1,5 @@
1
+ module.exports = {
2
+ arrowParens: 'avoid',
3
+ singleQuote: true,
4
+ trailingComma: 'all',
5
+ };
@@ -0,0 +1 @@
1
+ {}
@@ -0,0 +1,89 @@
1
+ :root {
2
+ --ink: #0b1622;
3
+ --paper: #13243a;
4
+ --mist: #41506a;
5
+ --chalk: #cbd5e1;
6
+ --chalk-bright: #ffffff;
7
+ --brand: #2c4f7c;
8
+ }
9
+
10
+ .screen {
11
+ flex: 1;
12
+ background-color: var(--ink);
13
+ align-items: center;
14
+ justify-content: center;
15
+ gap: 24px;
16
+ padding: 24px 32px;
17
+ }
18
+
19
+ .brand-row {
20
+ flex-direction: row;
21
+ align-items: center;
22
+ gap: 28px;
23
+ }
24
+
25
+ .brand-logo {
26
+ height: 64px;
27
+ }
28
+
29
+ /* aspect-ratio matches each source PNG's real pixel proportions — a shared square box would
30
+ stretch them off their real shape. */
31
+ .brand-logo-react {
32
+ aspect-ratio: 1.0977;
33
+ }
34
+
35
+ .brand-logo-solid {
36
+ aspect-ratio: 1.03125;
37
+ }
38
+
39
+ .plus-icon {
40
+ width: 48px;
41
+ height: 48px;
42
+ }
43
+
44
+ .title {
45
+ color: var(--chalk-bright);
46
+ font-size: 22px;
47
+ font-weight: bold;
48
+ text-align: center;
49
+ }
50
+
51
+ .subtitle {
52
+ color: var(--chalk);
53
+ font-size: 14px;
54
+ text-align: center;
55
+ }
56
+
57
+ .counter-card {
58
+ align-items: center;
59
+ gap: 4px;
60
+ padding: 20px 28px;
61
+ border-radius: 16px;
62
+ background-color: var(--paper);
63
+ }
64
+
65
+ .counter-label {
66
+ color: var(--mist);
67
+ font-size: 12px;
68
+ letter-spacing: 1px;
69
+ }
70
+
71
+ .counter-value {
72
+ color: var(--brand);
73
+ font-size: 32px;
74
+ font-weight: bold;
75
+ }
76
+
77
+ .button-primary {
78
+ align-items: center;
79
+ justify-content: center;
80
+ border-radius: 12px;
81
+ padding: 14px 22px;
82
+ background-color: var(--brand);
83
+ }
84
+
85
+ .button-primary-text {
86
+ color: var(--chalk-bright);
87
+ font-size: 15px;
88
+ font-weight: bold;
89
+ }
@@ -0,0 +1,35 @@
1
+ import { createSignal } from 'solid-js';
2
+ import './App.css';
3
+
4
+ export default function App() {
5
+ const [count, setCount] = createSignal(0);
6
+
7
+ return (
8
+ <safe-area-view class="screen">
9
+ <view class="brand-row">
10
+ <image
11
+ class="brand-logo brand-logo-react"
12
+ resizeMode="contain"
13
+ source={require('./assets/react-native-logo.png')}
14
+ />
15
+ <image class="plus-icon" resizeMode="contain" source={require('./assets/plus-icon.png')} />
16
+ <image
17
+ class="brand-logo brand-logo-solid"
18
+ resizeMode="contain"
19
+ source={require('./assets/solid-logo.png')}
20
+ />
21
+ </view>
22
+ <text class="title">Welcome to SymbioteNative!</text>
23
+ <text class="subtitle">Framework-agnostic React Native, driven by Solid.</text>
24
+
25
+ <view class="counter-card">
26
+ <text class="counter-label">TAPS</text>
27
+ <text class="counter-value">{count()}</text>
28
+ </view>
29
+
30
+ <pressable class="button-primary" onPress={() => setCount((value) => value + 1)}>
31
+ <text class="button-primary-text">Tap me</text>
32
+ </pressable>
33
+ </safe-area-view>
34
+ );
35
+ }
@@ -0,0 +1,35 @@
1
+ import { createSignal } from 'solid-js';
2
+ import './App.css';
3
+
4
+ export default function App() {
5
+ const [count, setCount] = createSignal<number>(0);
6
+
7
+ return (
8
+ <safe-area-view class="screen">
9
+ <view class="brand-row">
10
+ <image
11
+ class="brand-logo brand-logo-react"
12
+ resizeMode="contain"
13
+ source={require('./assets/react-native-logo.png')}
14
+ />
15
+ <image class="plus-icon" resizeMode="contain" source={require('./assets/plus-icon.png')} />
16
+ <image
17
+ class="brand-logo brand-logo-solid"
18
+ resizeMode="contain"
19
+ source={require('./assets/solid-logo.png')}
20
+ />
21
+ </view>
22
+ <text class="title">Welcome to SymbioteNative!</text>
23
+ <text class="subtitle">Framework-agnostic React Native, driven by Solid.</text>
24
+
25
+ <view class="counter-card">
26
+ <text class="counter-label">TAPS</text>
27
+ <text class="counter-value">{count()}</text>
28
+ </view>
29
+
30
+ <pressable class="button-primary" onPress={() => setCount((value) => value + 1)}>
31
+ <text class="button-primary-text">Tap me</text>
32
+ </pressable>
33
+ </safe-area-view>
34
+ );
35
+ }