@use-voltra/ios-client 1.4.0 → 2.0.0-rc.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 (559) hide show
  1. package/README.md +113 -0
  2. package/Voltra.podspec +28 -0
  3. package/build/commonjs/VoltraModule.js +13 -0
  4. package/build/commonjs/VoltraModule.js.map +1 -0
  5. package/build/commonjs/components/VoltraLiveActivityPreview.js +30 -0
  6. package/build/commonjs/components/VoltraLiveActivityPreview.js.map +1 -0
  7. package/build/commonjs/components/VoltraView.js +50 -0
  8. package/build/commonjs/components/VoltraView.js.map +1 -0
  9. package/build/commonjs/components/VoltraWidgetPreview.js +58 -0
  10. package/build/commonjs/components/VoltraWidgetPreview.js.map +1 -0
  11. package/build/commonjs/events.js +32 -0
  12. package/build/commonjs/events.js.map +1 -0
  13. package/build/commonjs/helpers.js +26 -0
  14. package/build/commonjs/helpers.js.map +1 -0
  15. package/build/commonjs/index.js +226 -0
  16. package/build/commonjs/index.js.map +1 -0
  17. package/build/commonjs/live-activity/api.js +168 -0
  18. package/build/commonjs/live-activity/api.js.map +1 -0
  19. package/build/commonjs/logger.js +39 -0
  20. package/build/commonjs/logger.js.map +1 -0
  21. package/build/commonjs/native/NativeVoltra.js +15 -0
  22. package/build/commonjs/native/NativeVoltra.js.map +1 -0
  23. package/build/commonjs/native/VoltraRNNativeComponent.ts +9 -0
  24. package/build/commonjs/package.json +1 -0
  25. package/build/commonjs/preload.js +54 -0
  26. package/build/commonjs/preload.js.map +1 -0
  27. package/build/commonjs/types.js +2 -0
  28. package/build/commonjs/types.js.map +1 -0
  29. package/build/commonjs/utils/assertRunningOnApple.js +16 -0
  30. package/build/commonjs/utils/assertRunningOnApple.js.map +1 -0
  31. package/build/commonjs/utils/helpers.js +19 -0
  32. package/build/commonjs/utils/helpers.js.map +1 -0
  33. package/build/commonjs/utils/index.js +28 -0
  34. package/build/commonjs/utils/index.js.map +1 -0
  35. package/build/commonjs/utils/useUpdateOnHMR.js +25 -0
  36. package/build/commonjs/utils/useUpdateOnHMR.js.map +1 -0
  37. package/build/commonjs/widgets/server-credentials.js +18 -0
  38. package/build/commonjs/widgets/server-credentials.js.map +1 -0
  39. package/build/commonjs/widgets/widget-api.js +55 -0
  40. package/build/commonjs/widgets/widget-api.js.map +1 -0
  41. package/build/module/VoltraModule.js +4 -0
  42. package/build/module/VoltraModule.js.map +1 -0
  43. package/build/module/components/VoltraLiveActivityPreview.js +25 -0
  44. package/build/module/components/VoltraLiveActivityPreview.js.map +1 -0
  45. package/build/module/components/VoltraView.js +44 -0
  46. package/build/module/components/VoltraView.js.map +1 -0
  47. package/build/module/components/VoltraWidgetPreview.js +53 -0
  48. package/build/module/components/VoltraWidgetPreview.js.map +1 -0
  49. package/build/module/events.js +28 -0
  50. package/build/module/events.js.map +1 -0
  51. package/build/module/helpers.js +21 -0
  52. package/build/module/helpers.js.map +1 -0
  53. package/build/module/index.js +17 -0
  54. package/build/module/index.js.map +1 -0
  55. package/build/module/live-activity/api.js +158 -0
  56. package/build/module/live-activity/api.js.map +1 -0
  57. package/build/module/logger.js +35 -0
  58. package/build/module/logger.js.map +1 -0
  59. package/build/module/native/NativeVoltra.js +11 -0
  60. package/build/module/native/NativeVoltra.js.map +1 -0
  61. package/build/module/native/VoltraRNNativeComponent.ts +9 -0
  62. package/build/module/package.json +1 -0
  63. package/build/module/preload.js +48 -0
  64. package/build/module/preload.js.map +1 -0
  65. package/build/module/types.js +2 -0
  66. package/build/module/types.js.map +1 -0
  67. package/build/module/utils/assertRunningOnApple.js +11 -0
  68. package/build/module/utils/assertRunningOnApple.js.map +1 -0
  69. package/build/module/utils/helpers.js +4 -0
  70. package/build/module/utils/helpers.js.map +1 -0
  71. package/build/module/utils/index.js +5 -0
  72. package/build/module/utils/index.js.map +1 -0
  73. package/build/module/utils/useUpdateOnHMR.js +20 -0
  74. package/build/module/utils/useUpdateOnHMR.js.map +1 -0
  75. package/build/module/widgets/server-credentials.js +13 -0
  76. package/build/module/widgets/server-credentials.js.map +1 -0
  77. package/build/module/widgets/widget-api.js +45 -0
  78. package/build/module/widgets/widget-api.js.map +1 -0
  79. package/build/typescript/commonjs/VoltraModule.d.ts +3 -0
  80. package/build/typescript/commonjs/VoltraModule.d.ts.map +1 -0
  81. package/build/typescript/commonjs/components/VoltraLiveActivityPreview.d.ts.map +1 -0
  82. package/build/typescript/commonjs/components/VoltraView.d.ts.map +1 -0
  83. package/build/typescript/commonjs/components/VoltraWidgetPreview.d.ts.map +1 -0
  84. package/build/typescript/commonjs/events.d.ts.map +1 -0
  85. package/build/typescript/commonjs/helpers.d.ts.map +1 -0
  86. package/build/{types → typescript/commonjs}/index.d.ts +5 -0
  87. package/build/typescript/commonjs/index.d.ts.map +1 -0
  88. package/build/typescript/commonjs/live-activity/api.d.ts.map +1 -0
  89. package/build/typescript/commonjs/logger.d.ts.map +1 -0
  90. package/build/typescript/commonjs/native/NativeVoltra.d.ts +100 -0
  91. package/build/typescript/commonjs/native/NativeVoltra.d.ts.map +1 -0
  92. package/build/typescript/commonjs/native/VoltraRNNativeComponent.d.ts +8 -0
  93. package/build/typescript/commonjs/native/VoltraRNNativeComponent.d.ts.map +1 -0
  94. package/build/typescript/commonjs/package.json +1 -0
  95. package/build/typescript/commonjs/preload.d.ts.map +1 -0
  96. package/build/typescript/commonjs/types.d.ts.map +1 -0
  97. package/build/typescript/commonjs/utils/assertRunningOnApple.d.ts.map +1 -0
  98. package/build/typescript/commonjs/utils/helpers.d.ts.map +1 -0
  99. package/build/typescript/commonjs/utils/index.d.ts.map +1 -0
  100. package/build/typescript/commonjs/utils/useUpdateOnHMR.d.ts.map +1 -0
  101. package/build/typescript/commonjs/widgets/server-credentials.d.ts.map +1 -0
  102. package/build/typescript/commonjs/widgets/widget-api.d.ts.map +1 -0
  103. package/build/typescript/module/VoltraModule.d.ts +3 -0
  104. package/build/typescript/module/VoltraModule.d.ts.map +1 -0
  105. package/build/typescript/module/components/VoltraLiveActivityPreview.d.ts +7 -0
  106. package/build/typescript/module/components/VoltraLiveActivityPreview.d.ts.map +1 -0
  107. package/build/typescript/module/components/VoltraView.d.ts +12 -0
  108. package/build/typescript/module/components/VoltraView.d.ts.map +1 -0
  109. package/build/typescript/module/components/VoltraWidgetPreview.d.ts +9 -0
  110. package/build/typescript/module/components/VoltraWidgetPreview.d.ts.map +1 -0
  111. package/build/typescript/module/events.d.ts +33 -0
  112. package/build/typescript/module/events.d.ts.map +1 -0
  113. package/build/typescript/module/helpers.d.ts +3 -0
  114. package/build/typescript/module/helpers.d.ts.map +1 -0
  115. package/build/typescript/module/index.d.ts +18 -0
  116. package/build/typescript/module/index.d.ts.map +1 -0
  117. package/build/typescript/module/live-activity/api.d.ts +35 -0
  118. package/build/typescript/module/live-activity/api.d.ts.map +1 -0
  119. package/build/typescript/module/logger.d.ts +16 -0
  120. package/build/typescript/module/logger.d.ts.map +1 -0
  121. package/build/typescript/module/native/NativeVoltra.d.ts +100 -0
  122. package/build/typescript/module/native/NativeVoltra.d.ts.map +1 -0
  123. package/build/typescript/module/native/VoltraRNNativeComponent.d.ts +8 -0
  124. package/build/typescript/module/native/VoltraRNNativeComponent.d.ts.map +1 -0
  125. package/build/typescript/module/package.json +1 -0
  126. package/build/typescript/module/preload.d.ts +6 -0
  127. package/build/typescript/module/preload.d.ts.map +1 -0
  128. package/build/typescript/module/types.d.ts +2 -0
  129. package/build/typescript/module/types.d.ts.map +1 -0
  130. package/build/typescript/module/utils/assertRunningOnApple.d.ts +2 -0
  131. package/build/typescript/module/utils/assertRunningOnApple.d.ts.map +1 -0
  132. package/build/{esm/utils/helpers.js → typescript/module/utils/helpers.d.ts} +1 -1
  133. package/build/typescript/module/utils/helpers.d.ts.map +1 -0
  134. package/build/{esm/utils/index.js → typescript/module/utils/index.d.ts} +1 -1
  135. package/build/typescript/module/utils/index.d.ts.map +1 -0
  136. package/build/typescript/module/utils/useUpdateOnHMR.d.ts +5 -0
  137. package/build/typescript/module/utils/useUpdateOnHMR.d.ts.map +1 -0
  138. package/build/typescript/module/widgets/server-credentials.d.ts +5 -0
  139. package/build/typescript/module/widgets/server-credentials.d.ts.map +1 -0
  140. package/build/typescript/module/widgets/widget-api.d.ts +11 -0
  141. package/build/typescript/module/widgets/widget-api.d.ts.map +1 -0
  142. package/expo-plugin/app.plugin.js +3 -0
  143. package/expo-plugin/build/cjs/constants.js +23 -0
  144. package/expo-plugin/build/cjs/constants.js.map +1 -0
  145. package/expo-plugin/build/cjs/index.js +51 -0
  146. package/expo-plugin/build/cjs/index.js.map +1 -0
  147. package/expo-plugin/build/cjs/ios/eas.js +28 -0
  148. package/expo-plugin/build/cjs/ios/eas.js.map +1 -0
  149. package/expo-plugin/build/cjs/ios/entitlements.js +46 -0
  150. package/expo-plugin/build/cjs/ios/entitlements.js.map +1 -0
  151. package/expo-plugin/build/cjs/ios/index.js +39 -0
  152. package/expo-plugin/build/cjs/ios/index.js.map +1 -0
  153. package/expo-plugin/build/cjs/ios/infoPlist.js +51 -0
  154. package/expo-plugin/build/cjs/ios/infoPlist.js.map +1 -0
  155. package/expo-plugin/build/cjs/ios/pushNotifications.js +22 -0
  156. package/expo-plugin/build/cjs/ios/pushNotifications.js.map +1 -0
  157. package/expo-plugin/build/cjs/ios-widget/eas.js +66 -0
  158. package/expo-plugin/build/cjs/ios-widget/eas.js.map +1 -0
  159. package/expo-plugin/build/cjs/ios-widget/files/assets.js +199 -0
  160. package/expo-plugin/build/cjs/ios-widget/files/assets.js.map +1 -0
  161. package/expo-plugin/build/cjs/ios-widget/files/entitlements.js +77 -0
  162. package/expo-plugin/build/cjs/ios-widget/files/entitlements.js.map +1 -0
  163. package/expo-plugin/build/cjs/ios-widget/files/index.js +92 -0
  164. package/expo-plugin/build/cjs/ios-widget/files/index.js.map +1 -0
  165. package/expo-plugin/build/cjs/ios-widget/files/infoPlist.js +91 -0
  166. package/expo-plugin/build/cjs/ios-widget/files/infoPlist.js.map +1 -0
  167. package/expo-plugin/build/cjs/ios-widget/files/swift.js +443 -0
  168. package/expo-plugin/build/cjs/ios-widget/files/swift.js.map +1 -0
  169. package/expo-plugin/build/cjs/ios-widget/fonts.js +151 -0
  170. package/expo-plugin/build/cjs/ios-widget/fonts.js.map +1 -0
  171. package/expo-plugin/build/cjs/ios-widget/index.js +46 -0
  172. package/expo-plugin/build/cjs/ios-widget/index.js.map +1 -0
  173. package/expo-plugin/build/cjs/ios-widget/podfile.js +41 -0
  174. package/expo-plugin/build/cjs/ios-widget/podfile.js.map +1 -0
  175. package/expo-plugin/build/cjs/ios-widget/widgetPlist.js +99 -0
  176. package/expo-plugin/build/cjs/ios-widget/widgetPlist.js.map +1 -0
  177. package/expo-plugin/build/cjs/ios-widget/xcode/buildPhases.js +247 -0
  178. package/expo-plugin/build/cjs/ios-widget/xcode/buildPhases.js.map +1 -0
  179. package/expo-plugin/build/cjs/ios-widget/xcode/configurationList.js +91 -0
  180. package/expo-plugin/build/cjs/ios-widget/xcode/configurationList.js.map +1 -0
  181. package/expo-plugin/build/cjs/ios-widget/xcode/groups.js +79 -0
  182. package/expo-plugin/build/cjs/ios-widget/xcode/groups.js.map +1 -0
  183. package/expo-plugin/build/cjs/ios-widget/xcode/index.js +155 -0
  184. package/expo-plugin/build/cjs/ios-widget/xcode/index.js.map +1 -0
  185. package/expo-plugin/build/cjs/ios-widget/xcode/mainAppSettings.js +71 -0
  186. package/expo-plugin/build/cjs/ios-widget/xcode/mainAppSettings.js.map +1 -0
  187. package/expo-plugin/build/cjs/ios-widget/xcode/productFile.js +74 -0
  188. package/expo-plugin/build/cjs/ios-widget/xcode/productFile.js.map +1 -0
  189. package/expo-plugin/build/cjs/ios-widget/xcode/target.js +113 -0
  190. package/expo-plugin/build/cjs/ios-widget/xcode/target.js.map +1 -0
  191. package/expo-plugin/build/cjs/utils/fileDiscovery.js +120 -0
  192. package/expo-plugin/build/cjs/utils/fileDiscovery.js.map +1 -0
  193. package/expo-plugin/build/cjs/utils/urlScheme.js +40 -0
  194. package/expo-plugin/build/cjs/utils/urlScheme.js.map +1 -0
  195. package/expo-plugin/build/cjs/validation.js +55 -0
  196. package/expo-plugin/build/cjs/validation.js.map +1 -0
  197. package/expo-plugin/build/esm/constants.js +20 -0
  198. package/expo-plugin/build/esm/constants.js.map +1 -0
  199. package/expo-plugin/build/esm/index.js +49 -0
  200. package/expo-plugin/build/esm/index.js.map +1 -0
  201. package/expo-plugin/build/esm/ios/eas.js +24 -0
  202. package/expo-plugin/build/esm/ios/eas.js.map +1 -0
  203. package/expo-plugin/build/esm/ios/entitlements.js +42 -0
  204. package/expo-plugin/build/esm/ios/entitlements.js.map +1 -0
  205. package/expo-plugin/build/esm/ios/index.js +34 -0
  206. package/expo-plugin/build/esm/ios/index.js.map +1 -0
  207. package/expo-plugin/build/esm/ios/infoPlist.js +47 -0
  208. package/expo-plugin/build/esm/ios/infoPlist.js.map +1 -0
  209. package/expo-plugin/build/esm/ios/pushNotifications.js +18 -0
  210. package/expo-plugin/build/esm/ios/pushNotifications.js.map +1 -0
  211. package/expo-plugin/build/esm/ios-widget/eas.js +62 -0
  212. package/expo-plugin/build/esm/ios-widget/eas.js.map +1 -0
  213. package/expo-plugin/build/esm/ios-widget/files/assets.js +163 -0
  214. package/expo-plugin/build/esm/ios-widget/files/assets.js.map +1 -0
  215. package/expo-plugin/build/esm/ios-widget/files/entitlements.js +37 -0
  216. package/expo-plugin/build/esm/ios-widget/files/entitlements.js.map +1 -0
  217. package/expo-plugin/build/esm/ios-widget/files/index.js +55 -0
  218. package/expo-plugin/build/esm/ios-widget/files/index.js.map +1 -0
  219. package/expo-plugin/build/esm/ios-widget/files/infoPlist.js +55 -0
  220. package/expo-plugin/build/esm/ios-widget/files/infoPlist.js.map +1 -0
  221. package/expo-plugin/build/esm/ios-widget/files/swift.js +403 -0
  222. package/expo-plugin/build/esm/ios-widget/files/swift.js.map +1 -0
  223. package/expo-plugin/build/esm/ios-widget/fonts.js +111 -0
  224. package/expo-plugin/build/esm/ios-widget/fonts.js.map +1 -0
  225. package/expo-plugin/build/esm/ios-widget/index.js +42 -0
  226. package/expo-plugin/build/esm/ios-widget/index.js.map +1 -0
  227. package/expo-plugin/build/esm/ios-widget/podfile.js +37 -0
  228. package/expo-plugin/build/esm/ios-widget/podfile.js.map +1 -0
  229. package/expo-plugin/build/esm/ios-widget/widgetPlist.js +92 -0
  230. package/expo-plugin/build/esm/ios-widget/widgetPlist.js.map +1 -0
  231. package/expo-plugin/build/esm/ios-widget/xcode/buildPhases.js +210 -0
  232. package/expo-plugin/build/esm/ios-widget/xcode/buildPhases.js.map +1 -0
  233. package/expo-plugin/build/esm/ios-widget/xcode/configurationList.js +87 -0
  234. package/expo-plugin/build/esm/ios-widget/xcode/configurationList.js.map +1 -0
  235. package/expo-plugin/build/esm/ios-widget/xcode/groups.js +75 -0
  236. package/expo-plugin/build/esm/ios-widget/xcode/groups.js.map +1 -0
  237. package/expo-plugin/build/esm/ios-widget/xcode/index.js +118 -0
  238. package/expo-plugin/build/esm/ios-widget/xcode/index.js.map +1 -0
  239. package/expo-plugin/build/esm/ios-widget/xcode/mainAppSettings.js +68 -0
  240. package/expo-plugin/build/esm/ios-widget/xcode/mainAppSettings.js.map +1 -0
  241. package/expo-plugin/build/esm/ios-widget/xcode/productFile.js +70 -0
  242. package/expo-plugin/build/esm/ios-widget/xcode/productFile.js.map +1 -0
  243. package/expo-plugin/build/esm/ios-widget/xcode/target.js +108 -0
  244. package/expo-plugin/build/esm/ios-widget/xcode/target.js.map +1 -0
  245. package/expo-plugin/build/esm/utils/fileDiscovery.js +83 -0
  246. package/expo-plugin/build/esm/utils/fileDiscovery.js.map +1 -0
  247. package/expo-plugin/build/esm/utils/urlScheme.js +37 -0
  248. package/expo-plugin/build/esm/utils/urlScheme.js.map +1 -0
  249. package/expo-plugin/build/esm/validation.js +51 -0
  250. package/expo-plugin/build/esm/validation.js.map +1 -0
  251. package/expo-plugin/build/types/constants.d.ts +13 -0
  252. package/expo-plugin/build/types/constants.d.ts.map +1 -0
  253. package/expo-plugin/build/types/index.d.ts +10 -0
  254. package/expo-plugin/build/types/index.d.ts.map +1 -0
  255. package/expo-plugin/build/types/ios/eas.d.ts +12 -0
  256. package/expo-plugin/build/types/ios/eas.d.ts.map +1 -0
  257. package/expo-plugin/build/types/ios/entitlements.d.ts +14 -0
  258. package/expo-plugin/build/types/ios/entitlements.d.ts.map +1 -0
  259. package/expo-plugin/build/types/ios/index.d.ts +19 -0
  260. package/expo-plugin/build/types/ios/index.d.ts.map +1 -0
  261. package/expo-plugin/build/types/ios/infoPlist.d.ts +21 -0
  262. package/expo-plugin/build/types/ios/infoPlist.d.ts.map +1 -0
  263. package/expo-plugin/build/types/ios/pushNotifications.d.ts +10 -0
  264. package/expo-plugin/build/types/ios/pushNotifications.d.ts.map +1 -0
  265. package/expo-plugin/build/types/ios-widget/eas.d.ts +15 -0
  266. package/expo-plugin/build/types/ios-widget/eas.d.ts.map +1 -0
  267. package/expo-plugin/build/types/ios-widget/files/assets.d.ts +13 -0
  268. package/expo-plugin/build/types/ios-widget/files/assets.d.ts.map +1 -0
  269. package/expo-plugin/build/types/ios-widget/files/entitlements.d.ts +17 -0
  270. package/expo-plugin/build/types/ios-widget/files/entitlements.d.ts.map +1 -0
  271. package/expo-plugin/build/types/ios-widget/files/index.d.ts +24 -0
  272. package/expo-plugin/build/types/ios-widget/files/index.d.ts.map +1 -0
  273. package/expo-plugin/build/types/ios-widget/files/infoPlist.d.ts +10 -0
  274. package/expo-plugin/build/types/ios-widget/files/infoPlist.d.ts.map +1 -0
  275. package/expo-plugin/build/types/ios-widget/files/swift.d.ts +24 -0
  276. package/expo-plugin/build/types/ios-widget/files/swift.d.ts.map +1 -0
  277. package/expo-plugin/build/types/ios-widget/fonts.d.ts +22 -0
  278. package/expo-plugin/build/types/ios-widget/fonts.d.ts.map +1 -0
  279. package/expo-plugin/build/types/ios-widget/index.d.ts +31 -0
  280. package/expo-plugin/build/types/ios-widget/index.d.ts.map +1 -0
  281. package/expo-plugin/build/types/ios-widget/podfile.d.ts +9 -0
  282. package/expo-plugin/build/types/ios-widget/podfile.d.ts.map +1 -0
  283. package/expo-plugin/build/types/ios-widget/widgetPlist.d.ts +20 -0
  284. package/expo-plugin/build/types/ios-widget/widgetPlist.d.ts.map +1 -0
  285. package/expo-plugin/build/types/ios-widget/xcode/buildPhases.d.ts +25 -0
  286. package/expo-plugin/build/types/ios-widget/xcode/buildPhases.d.ts.map +1 -0
  287. package/expo-plugin/build/types/ios-widget/xcode/configurationList.d.ts +20 -0
  288. package/expo-plugin/build/types/ios-widget/xcode/configurationList.d.ts.map +1 -0
  289. package/expo-plugin/build/types/ios-widget/xcode/groups.d.ts +15 -0
  290. package/expo-plugin/build/types/ios-widget/xcode/groups.d.ts.map +1 -0
  291. package/expo-plugin/build/types/ios-widget/xcode/index.d.ts +20 -0
  292. package/expo-plugin/build/types/ios-widget/xcode/index.d.ts.map +1 -0
  293. package/expo-plugin/build/types/ios-widget/xcode/mainAppSettings.d.ts +15 -0
  294. package/expo-plugin/build/types/ios-widget/xcode/mainAppSettings.d.ts.map +1 -0
  295. package/expo-plugin/build/types/ios-widget/xcode/productFile.d.ts +14 -0
  296. package/expo-plugin/build/types/ios-widget/xcode/productFile.d.ts.map +1 -0
  297. package/expo-plugin/build/types/ios-widget/xcode/target.d.ts +42 -0
  298. package/expo-plugin/build/types/ios-widget/xcode/target.d.ts.map +1 -0
  299. package/expo-plugin/build/types/types.d.ts +74 -0
  300. package/expo-plugin/build/types/types.d.ts.map +1 -0
  301. package/expo-plugin/build/types/utils/fileDiscovery.d.ts +15 -0
  302. package/expo-plugin/build/types/utils/fileDiscovery.d.ts.map +1 -0
  303. package/expo-plugin/build/types/utils/urlScheme.d.ts +10 -0
  304. package/expo-plugin/build/types/utils/urlScheme.d.ts.map +1 -0
  305. package/expo-plugin/build/types/validation.d.ts +4 -0
  306. package/expo-plugin/build/types/validation.d.ts.map +1 -0
  307. package/expo-plugin/jest.config.js +18 -0
  308. package/expo-plugin/src/constants.ts +25 -0
  309. package/expo-plugin/src/index.ts +72 -0
  310. package/expo-plugin/src/ios/eas.ts +33 -0
  311. package/expo-plugin/src/ios/entitlements.ts +59 -0
  312. package/expo-plugin/src/ios/index.ts +47 -0
  313. package/expo-plugin/src/ios/infoPlist.ts +63 -0
  314. package/expo-plugin/src/ios/pushNotifications.ts +22 -0
  315. package/expo-plugin/src/ios-widget/eas.ts +79 -0
  316. package/expo-plugin/src/ios-widget/files/assets.ts +201 -0
  317. package/expo-plugin/src/ios-widget/files/entitlements.ts +48 -0
  318. package/expo-plugin/src/ios-widget/files/index.ts +74 -0
  319. package/expo-plugin/src/ios-widget/files/infoPlist.ts +57 -0
  320. package/expo-plugin/src/ios-widget/files/swift.node.test.ts +22 -0
  321. package/expo-plugin/src/ios-widget/files/swift.ts +476 -0
  322. package/expo-plugin/src/ios-widget/fonts.ts +132 -0
  323. package/expo-plugin/src/ios-widget/index.ts +73 -0
  324. package/expo-plugin/src/ios-widget/podfile.ts +44 -0
  325. package/expo-plugin/src/ios-widget/widgetPlist.ts +115 -0
  326. package/expo-plugin/src/ios-widget/xcode/buildPhases.ts +301 -0
  327. package/expo-plugin/src/ios-widget/xcode/configurationList.ts +127 -0
  328. package/expo-plugin/src/ios-widget/xcode/groups.ts +101 -0
  329. package/expo-plugin/src/ios-widget/xcode/index.ts +149 -0
  330. package/expo-plugin/src/ios-widget/xcode/mainAppSettings.ts +95 -0
  331. package/expo-plugin/src/ios-widget/xcode/productFile.ts +91 -0
  332. package/expo-plugin/src/ios-widget/xcode/target.ts +148 -0
  333. package/expo-plugin/src/types.ts +89 -0
  334. package/expo-plugin/src/utils/fileDiscovery.ts +96 -0
  335. package/expo-plugin/src/utils/urlScheme.ts +45 -0
  336. package/expo-plugin/src/validation.node.test.ts +19 -0
  337. package/expo-plugin/src/validation.ts +63 -0
  338. package/expo-plugin/tsconfig.base.json +17 -0
  339. package/expo-plugin/tsconfig.cjs.json +9 -0
  340. package/expo-plugin/tsconfig.esm.json +9 -0
  341. package/expo-plugin/tsconfig.jest.json +8 -0
  342. package/expo-plugin/tsconfig.typecheck.json +12 -0
  343. package/expo-plugin/tsconfig.types.json +10 -0
  344. package/ios/Package.swift +68 -0
  345. package/ios/Tests/JSGradientParserTests.swift +201 -0
  346. package/ios/Tests/VoltraSharedTests/SmokeTests.swift +8 -0
  347. package/ios/VoltraWidget.podspec +30 -0
  348. package/ios/app/NativeVoltra.h +5 -0
  349. package/ios/app/NativeVoltra.mm +211 -0
  350. package/ios/app/VoltraActivity.swift +5 -0
  351. package/ios/app/VoltraImagePreload.swift +154 -0
  352. package/ios/app/VoltraLiveActivityManager.swift +228 -0
  353. package/ios/app/VoltraLiveActivityService.swift +306 -0
  354. package/ios/app/VoltraModule.swift +215 -0
  355. package/ios/app/VoltraModuleImpl.swift +331 -0
  356. package/ios/app/VoltraOptions.swift +27 -0
  357. package/ios/app/VoltraViewComponentView.h +10 -0
  358. package/ios/app/VoltraViewComponentView.mm +67 -0
  359. package/ios/app/VoltraViewRoot.swift +63 -0
  360. package/ios/app/VoltraWidgetService.swift +154 -0
  361. package/ios/shared/BrotliCompression.swift +81 -0
  362. package/ios/shared/ComponentTypeID.swift +117 -0
  363. package/ios/shared/Data+hexString.swift +8 -0
  364. package/ios/shared/Date+toTimerInterval.swift +25 -0
  365. package/ios/shared/JSONValue.swift +128 -0
  366. package/ios/shared/ShortNames.swift +180 -0
  367. package/ios/shared/VoltraAttributes.swift +58 -0
  368. package/ios/shared/VoltraConfig.swift +18 -0
  369. package/ios/shared/VoltraConstants.swift +45 -0
  370. package/ios/shared/VoltraElement.swift +153 -0
  371. package/ios/shared/VoltraEvent.swift +72 -0
  372. package/ios/shared/VoltraEventBus.swift +80 -0
  373. package/ios/shared/VoltraImageStore.swift +119 -0
  374. package/ios/shared/VoltraInitialStateLocale.swift +54 -0
  375. package/ios/shared/VoltraInteractionIntent.swift +39 -0
  376. package/ios/shared/VoltraKeychainHelper.swift +178 -0
  377. package/ios/shared/VoltraLiveActivityPayload.swift +113 -0
  378. package/ios/shared/VoltraLogger.swift +30 -0
  379. package/ios/shared/VoltraNode.swift +194 -0
  380. package/ios/shared/VoltraPayloadMigrator.swift +63 -0
  381. package/ios/shared/VoltraPersistentEventQueue.swift +67 -0
  382. package/ios/shared/VoltraRefreshIntent.swift +29 -0
  383. package/ios/shared/VoltraRegion.swift +37 -0
  384. package/ios/shared/VoltraWidgetDefaults.swift +114 -0
  385. package/ios/shared/VoltraWidgetServerFetcher.swift +166 -0
  386. package/ios/target/VoltraHomeWidget.swift +508 -0
  387. package/ios/target/VoltraWidget.swift +158 -0
  388. package/ios/ui/Extensions/View.modifiers.swift +28 -0
  389. package/ios/ui/Extensions/VoltraNode+Parameters.swift +18 -0
  390. package/ios/ui/Generated/Parameters/.generated +8 -0
  391. package/ios/ui/Generated/Parameters/ButtonParameters.swift +15 -0
  392. package/ios/ui/Generated/Parameters/ChartParameters.swift +33 -0
  393. package/ios/ui/Generated/Parameters/CircularProgressViewParameters.swift +59 -0
  394. package/ios/ui/Generated/Parameters/ComponentParameters.swift +12 -0
  395. package/ios/ui/Generated/Parameters/DividerParameters.swift +12 -0
  396. package/ios/ui/Generated/Parameters/GaugeParameters.swift +54 -0
  397. package/ios/ui/Generated/Parameters/GlassContainerParameters.swift +15 -0
  398. package/ios/ui/Generated/Parameters/GroupBoxParameters.swift +12 -0
  399. package/ios/ui/Generated/Parameters/HStackParameters.swift +34 -0
  400. package/ios/ui/Generated/Parameters/ImageParameters.swift +29 -0
  401. package/ios/ui/Generated/Parameters/LabelParameters.swift +18 -0
  402. package/ios/ui/Generated/Parameters/LinearGradientParameters.swift +27 -0
  403. package/ios/ui/Generated/Parameters/LinearProgressViewParameters.swift +64 -0
  404. package/ios/ui/Generated/Parameters/LinkParameters.swift +15 -0
  405. package/ios/ui/Generated/Parameters/MaskParameters.swift +12 -0
  406. package/ios/ui/Generated/Parameters/SpacerParameters.swift +15 -0
  407. package/ios/ui/Generated/Parameters/SymbolParameters.swift +59 -0
  408. package/ios/ui/Generated/Parameters/TextParameters.swift +18 -0
  409. package/ios/ui/Generated/Parameters/TimerParameters.swift +54 -0
  410. package/ios/ui/Generated/Parameters/ToggleParameters.swift +24 -0
  411. package/ios/ui/Generated/Parameters/VStackParameters.swift +34 -0
  412. package/ios/ui/Generated/Parameters/ViewParameters.swift +12 -0
  413. package/ios/ui/Generated/Parameters/ZStackParameters.swift +15 -0
  414. package/ios/ui/Helpers/VoltraDeepLinkResolver.swift +43 -0
  415. package/ios/ui/Helpers/VoltraProgressDriver.swift +52 -0
  416. package/ios/ui/Layout/FlexContainerHelper.swift +114 -0
  417. package/ios/ui/Layout/VoltraFlexStackLayout.swift +417 -0
  418. package/ios/ui/Protocols/VoltraView.swift +29 -0
  419. package/ios/ui/Style/BackgroundValue.swift +27 -0
  420. package/ios/ui/Style/CompositeStyle.swift +81 -0
  421. package/ios/ui/Style/DecorationStyle.swift +207 -0
  422. package/ios/ui/Style/FlexEnvironment.swift +35 -0
  423. package/ios/ui/Style/FontVariant.swift +4 -0
  424. package/ios/ui/Style/GlassEffect.swift +6 -0
  425. package/ios/ui/Style/JSColorParser.swift +517 -0
  426. package/ios/ui/Style/JSGradientParser.swift +674 -0
  427. package/ios/ui/Style/JSStyleParser.swift +223 -0
  428. package/ios/ui/Style/LayoutStyle.swift +184 -0
  429. package/ios/ui/Style/Overflow.swift +4 -0
  430. package/ios/ui/Style/RenderingStyle.swift +33 -0
  431. package/ios/ui/Style/StyleConverter.swift +202 -0
  432. package/ios/ui/Style/TextDecoration.swift +6 -0
  433. package/ios/ui/Style/TextStyle.swift +50 -0
  434. package/ios/ui/Style/View+applyStyle.swift +38 -0
  435. package/ios/ui/Views/VoltraButton.swift +57 -0
  436. package/ios/ui/Views/VoltraChart.swift +840 -0
  437. package/ios/ui/Views/VoltraCircularProgressView.swift +103 -0
  438. package/ios/ui/Views/VoltraDivider.swift +16 -0
  439. package/ios/ui/Views/VoltraFlexView.swift +33 -0
  440. package/ios/ui/Views/VoltraGauge.swift +65 -0
  441. package/ios/ui/Views/VoltraGlassContainer.swift +29 -0
  442. package/ios/ui/Views/VoltraGroupBox.swift +26 -0
  443. package/ios/ui/Views/VoltraHStack.swift +70 -0
  444. package/ios/ui/Views/VoltraImage.swift +109 -0
  445. package/ios/ui/Views/VoltraLabel.swift +24 -0
  446. package/ios/ui/Views/VoltraLinearGradient.swift +115 -0
  447. package/ios/ui/Views/VoltraLinearProgressView.swift +118 -0
  448. package/ios/ui/Views/VoltraLink.swift +25 -0
  449. package/ios/ui/Views/VoltraMask.swift +23 -0
  450. package/ios/ui/Views/VoltraSpacer.swift +16 -0
  451. package/ios/ui/Views/VoltraSymbol.swift +160 -0
  452. package/ios/ui/Views/VoltraText.swift +87 -0
  453. package/ios/ui/Views/VoltraTimer.swift +131 -0
  454. package/ios/ui/Views/VoltraToggle.swift +39 -0
  455. package/ios/ui/Views/VoltraVStack.swift +68 -0
  456. package/ios/ui/Views/VoltraZStack.swift +33 -0
  457. package/ios/ui/Voltra.swift +86 -0
  458. package/package.json +91 -18
  459. package/build/cjs/VoltraModule.js +0 -6
  460. package/build/cjs/VoltraModule.js.map +0 -1
  461. package/build/cjs/components/VoltraLiveActivityPreview.js +0 -20
  462. package/build/cjs/components/VoltraLiveActivityPreview.js.map +0 -1
  463. package/build/cjs/components/VoltraView.js +0 -37
  464. package/build/cjs/components/VoltraView.js.map +0 -1
  465. package/build/cjs/components/VoltraWidgetPreview.js +0 -26
  466. package/build/cjs/components/VoltraWidgetPreview.js.map +0 -1
  467. package/build/cjs/events.js +0 -19
  468. package/build/cjs/events.js.map +0 -1
  469. package/build/cjs/helpers.js +0 -30
  470. package/build/cjs/helpers.js.map +0 -1
  471. package/build/cjs/index.js +0 -49
  472. package/build/cjs/index.js.map +0 -1
  473. package/build/cjs/live-activity/api.js +0 -158
  474. package/build/cjs/live-activity/api.js.map +0 -1
  475. package/build/cjs/logger.js +0 -36
  476. package/build/cjs/logger.js.map +0 -1
  477. package/build/cjs/preload.js +0 -54
  478. package/build/cjs/preload.js.map +0 -1
  479. package/build/cjs/utils/assertRunningOnApple.js +0 -13
  480. package/build/cjs/utils/assertRunningOnApple.js.map +0 -1
  481. package/build/cjs/utils/helpers.js +0 -7
  482. package/build/cjs/utils/helpers.js.map +0 -1
  483. package/build/cjs/utils/index.js +0 -19
  484. package/build/cjs/utils/index.js.map +0 -1
  485. package/build/cjs/utils/useUpdateOnHMR.js +0 -22
  486. package/build/cjs/utils/useUpdateOnHMR.js.map +0 -1
  487. package/build/cjs/widgets/server-credentials.js +0 -18
  488. package/build/cjs/widgets/server-credentials.js.map +0 -1
  489. package/build/cjs/widgets/widget-api.js +0 -59
  490. package/build/cjs/widgets/widget-api.js.map +0 -1
  491. package/build/esm/VoltraModule.js +0 -4
  492. package/build/esm/VoltraModule.js.map +0 -1
  493. package/build/esm/components/VoltraLiveActivityPreview.js +0 -17
  494. package/build/esm/components/VoltraLiveActivityPreview.js.map +0 -1
  495. package/build/esm/components/VoltraView.js +0 -34
  496. package/build/esm/components/VoltraView.js.map +0 -1
  497. package/build/esm/components/VoltraWidgetPreview.js +0 -23
  498. package/build/esm/components/VoltraWidgetPreview.js.map +0 -1
  499. package/build/esm/events.js +0 -13
  500. package/build/esm/events.js.map +0 -1
  501. package/build/esm/helpers.js +0 -23
  502. package/build/esm/helpers.js.map +0 -1
  503. package/build/esm/index.js +0 -10
  504. package/build/esm/index.js.map +0 -1
  505. package/build/esm/live-activity/api.js +0 -146
  506. package/build/esm/live-activity/api.js.map +0 -1
  507. package/build/esm/logger.js +0 -33
  508. package/build/esm/logger.js.map +0 -1
  509. package/build/esm/preload.js +0 -46
  510. package/build/esm/preload.js.map +0 -1
  511. package/build/esm/utils/assertRunningOnApple.js +0 -9
  512. package/build/esm/utils/assertRunningOnApple.js.map +0 -1
  513. package/build/esm/utils/helpers.js.map +0 -1
  514. package/build/esm/utils/index.js.map +0 -1
  515. package/build/esm/utils/useUpdateOnHMR.js +0 -18
  516. package/build/esm/utils/useUpdateOnHMR.js.map +0 -1
  517. package/build/esm/widgets/server-credentials.js +0 -11
  518. package/build/esm/widgets/server-credentials.js.map +0 -1
  519. package/build/esm/widgets/widget-api.js +0 -47
  520. package/build/esm/widgets/widget-api.js.map +0 -1
  521. package/build/types/VoltraModule.d.ts +0 -44
  522. package/build/types/VoltraModule.d.ts.map +0 -1
  523. package/build/types/components/VoltraLiveActivityPreview.d.ts.map +0 -1
  524. package/build/types/components/VoltraView.d.ts.map +0 -1
  525. package/build/types/components/VoltraWidgetPreview.d.ts.map +0 -1
  526. package/build/types/events.d.ts.map +0 -1
  527. package/build/types/helpers.d.ts.map +0 -1
  528. package/build/types/index.d.ts.map +0 -1
  529. package/build/types/live-activity/api.d.ts.map +0 -1
  530. package/build/types/logger.d.ts.map +0 -1
  531. package/build/types/preload.d.ts.map +0 -1
  532. package/build/types/types.d.ts.map +0 -1
  533. package/build/types/utils/assertRunningOnApple.d.ts.map +0 -1
  534. package/build/types/utils/helpers.d.ts.map +0 -1
  535. package/build/types/utils/index.d.ts.map +0 -1
  536. package/build/types/utils/useUpdateOnHMR.d.ts.map +0 -1
  537. package/build/types/widgets/server-credentials.d.ts.map +0 -1
  538. package/build/types/widgets/widget-api.d.ts.map +0 -1
  539. /package/build/{types → typescript/commonjs}/components/VoltraLiveActivityPreview.d.ts +0 -0
  540. /package/build/{types → typescript/commonjs}/components/VoltraView.d.ts +0 -0
  541. /package/build/{types → typescript/commonjs}/components/VoltraWidgetPreview.d.ts +0 -0
  542. /package/build/{types → typescript/commonjs}/events.d.ts +0 -0
  543. /package/build/{types → typescript/commonjs}/helpers.d.ts +0 -0
  544. /package/build/{types → typescript/commonjs}/live-activity/api.d.ts +0 -0
  545. /package/build/{types → typescript/commonjs}/logger.d.ts +0 -0
  546. /package/build/{types → typescript/commonjs}/preload.d.ts +0 -0
  547. /package/build/{types → typescript/commonjs}/types.d.ts +0 -0
  548. /package/build/{types → typescript/commonjs}/utils/assertRunningOnApple.d.ts +0 -0
  549. /package/build/{types → typescript/commonjs}/utils/helpers.d.ts +0 -0
  550. /package/build/{types → typescript/commonjs}/utils/index.d.ts +0 -0
  551. /package/build/{types → typescript/commonjs}/utils/useUpdateOnHMR.d.ts +0 -0
  552. /package/build/{types → typescript/commonjs}/widgets/server-credentials.d.ts +0 -0
  553. /package/build/{types → typescript/commonjs}/widgets/widget-api.d.ts +0 -0
  554. /package/{build → expo-plugin/build}/cjs/package.json +0 -0
  555. /package/{build → expo-plugin/build}/cjs/types.js +0 -0
  556. /package/{build → expo-plugin/build}/cjs/types.js.map +0 -0
  557. /package/{build → expo-plugin/build}/esm/package.json +0 -0
  558. /package/{build → expo-plugin/build}/esm/types.js +0 -0
  559. /package/{build → expo-plugin/build}/esm/types.js.map +0 -0
@@ -0,0 +1,223 @@
1
+ import SwiftUI
2
+
3
+ enum JSStyleParser {
4
+ static func number(_ value: Any?) -> CGFloat? {
5
+ if let v = value as? CGFloat { return v }
6
+ if let v = value as? Double { return CGFloat(v) }
7
+ if let v = value as? Int { return CGFloat(v) }
8
+ // Handle "20.5" strings if necessary, though rarer in raw JSON objects
9
+ return nil
10
+ }
11
+
12
+ static func sizeValue(_ value: Any?) -> SizeValue? {
13
+ // Numeric → Fixed
14
+ if let n = number(value) { return .fixed(n) }
15
+ // String → Fill / Wrap / try numeric
16
+ guard let str = value as? String else { return nil }
17
+ switch str {
18
+ case "100%": return .fill
19
+ case "auto": return .wrap
20
+ default:
21
+ // Try parsing as numeric string
22
+ if let n = Double(str) { return .fixed(CGFloat(n)) }
23
+ return nil
24
+ }
25
+ }
26
+
27
+ static func size(_ value: Any?) -> CGSize? {
28
+ guard let dict = value as? [String: Any] else { return nil }
29
+ let w = number(dict["width"]) ?? 0
30
+ let h = number(dict["height"]) ?? 0
31
+ return CGSize(width: w, height: h)
32
+ }
33
+
34
+ static func color(_ value: Any?) -> Color? {
35
+ JSColorParser.parse(value)
36
+ }
37
+
38
+ static func background(_ value: Any?) -> BackgroundValue? {
39
+ guard let string = value as? String else { return nil }
40
+ let trimmed = string.trimmingCharacters(in: .whitespacesAndNewlines)
41
+ if let gradient = JSGradientParser.parse(trimmed) {
42
+ return gradient
43
+ }
44
+ if let color = JSColorParser.parse(string) {
45
+ return .color(color)
46
+ }
47
+ return nil
48
+ }
49
+
50
+ static func boolean(_ value: Any?) -> Bool {
51
+ guard let value = value else { return false }
52
+
53
+ if let bool = value as? Bool { return bool }
54
+ if let int = value as? Int { return int == 1 }
55
+ if let string = value as? String {
56
+ return string.lowercased() == "true"
57
+ }
58
+
59
+ return false
60
+ }
61
+
62
+ /// Helper to resolve CSS Edge Precedence:
63
+ /// Specific (Left) > Axis (Horizontal) > Generic (All)
64
+ static func parseInsets(from dict: [String: Any], prefix: String) -> EdgeInsets {
65
+ let all = number(dict[prefix]) ?? 0
66
+ let v = number(dict["\(prefix)Vertical"]) ?? all
67
+ let h = number(dict["\(prefix)Horizontal"]) ?? all
68
+
69
+ return EdgeInsets(
70
+ top: number(dict["\(prefix)Top"]) ?? v,
71
+ leading: number(dict["\(prefix)Left"]) ?? number(dict["\(prefix)Start"]) ?? h,
72
+ bottom: number(dict["\(prefix)Bottom"]) ?? v,
73
+ trailing: number(dict["\(prefix)Right"]) ?? number(dict["\(prefix)End"]) ?? h
74
+ )
75
+ }
76
+
77
+ /// Maps "bold", "600", "normal" -> Font.Weight
78
+ static func fontWeight(_ value: Any?) -> Font.Weight {
79
+ guard let string = value as? String else { return .regular }
80
+
81
+ switch string.lowercased() {
82
+ case "bold", "700": return .bold
83
+ case "heavy", "800", "900": return .heavy // or .black
84
+ case "semibold", "600": return .semibold
85
+ case "medium", "500": return .medium
86
+ case "light", "300": return .light
87
+ case "thin", "100": return .thin
88
+ default: return .regular
89
+ }
90
+ }
91
+
92
+ /// Maps "center", "right", "justify" -> TextAlignment
93
+ static func textAlignment(_ value: Any?) -> TextAlignment {
94
+ guard let string = value as? String else { return .leading }
95
+
96
+ switch string.lowercased() {
97
+ case "center": return .center
98
+ case "right", "end": return .trailing
99
+ default: return .leading
100
+ }
101
+ }
102
+
103
+ static func textDecoration(_ value: Any?) -> TextDecoration {
104
+ guard let string = (value as? String)?.lowercased() else { return .none }
105
+
106
+ // Simple string check (RN allows "underline line-through")
107
+ let hasUnderline = string.contains("underline")
108
+ let hasLineThrough = string.contains("line-through") || string.contains("strikethrough")
109
+
110
+ if hasUnderline, hasLineThrough { return .underlineLineThrough }
111
+ if hasUnderline { return .underline }
112
+ if hasLineThrough { return .lineThrough }
113
+ return .none
114
+ }
115
+
116
+ static func glassEffect(_ value: Any?) -> GlassEffect? {
117
+ guard let string = (value as? String)?.lowercased() else { return nil }
118
+
119
+ switch string {
120
+ case "clear": return .clear
121
+ case "identity": return .identity
122
+ case "regular": return .regular
123
+ case "none": return .none
124
+ default: return nil
125
+ }
126
+ }
127
+
128
+ static func overflow(_ value: Any?) -> Overflow? {
129
+ guard let string = (value as? String)?.lowercased() else { return nil }
130
+
131
+ if string == "hidden" { return .hidden }
132
+ if string == "visible" { return .visible }
133
+ return nil
134
+ }
135
+
136
+ static func fontVariant(_ value: Any?) -> Set<FontVariant> {
137
+ var variants: Set<FontVariant> = []
138
+
139
+ // Handle array of strings (e.g., ["small-caps", "tabular-nums"])
140
+ if let array = value as? [String] {
141
+ for variantString in array {
142
+ if let variant = FontVariant(rawValue: variantString) {
143
+ variants.insert(variant)
144
+ }
145
+ }
146
+ }
147
+ // Handle single string (e.g., "small-caps")
148
+ else if let string = value as? String {
149
+ if let variant = FontVariant(rawValue: string) {
150
+ variants.insert(variant)
151
+ }
152
+ }
153
+
154
+ return variants
155
+ }
156
+
157
+ /// Parse RN transform array: [{ rotate: '45deg' }, { scale: 1.5 }]
158
+ static func transform(_ value: Any?) -> TransformStyle? {
159
+ guard let array = value as? [[String: Any]] else { return nil }
160
+
161
+ var transform = TransformStyle()
162
+
163
+ for item in array {
164
+ // Handle rotate: '45deg' or rotate: '0.785rad'
165
+ if let rotateStr = item["rotate"] as? String {
166
+ transform.rotate = parseAngle(rotateStr)
167
+ }
168
+ // Handle rotateZ (same as rotate for 2D)
169
+ if let rotateZStr = item["rotateZ"] as? String {
170
+ transform.rotate = parseAngle(rotateZStr)
171
+ }
172
+ // Handle scale
173
+ if let scale = item["scale"] as? Double {
174
+ transform.scale = CGFloat(scale)
175
+ } else if let scale = item["scale"] as? Int {
176
+ transform.scale = CGFloat(scale)
177
+ }
178
+ // Handle scaleX
179
+ if let scaleX = item["scaleX"] as? Double {
180
+ transform.scaleX = CGFloat(scaleX)
181
+ } else if let scaleX = item["scaleX"] as? Int {
182
+ transform.scaleX = CGFloat(scaleX)
183
+ }
184
+ // Handle scaleY
185
+ if let scaleY = item["scaleY"] as? Double {
186
+ transform.scaleY = CGFloat(scaleY)
187
+ } else if let scaleY = item["scaleY"] as? Int {
188
+ transform.scaleY = CGFloat(scaleY)
189
+ }
190
+ }
191
+
192
+ return transform.hasTransforms ? transform : nil
193
+ }
194
+
195
+ /// Parse angle string like '45deg' or '0.785rad' to degrees
196
+ private static func parseAngle(_ value: String) -> CGFloat? {
197
+ let trimmed = value.trimmingCharacters(in: .whitespaces)
198
+
199
+ if trimmed.hasSuffix("deg") {
200
+ let numStr = String(trimmed.dropLast(3))
201
+ return Double(numStr).map { CGFloat($0) }
202
+ } else if trimmed.hasSuffix("rad") {
203
+ let numStr = String(trimmed.dropLast(3))
204
+ if let radians = Double(numStr) {
205
+ return CGFloat(radians * 180.0 / .pi) // Convert to degrees
206
+ }
207
+ }
208
+ // Try parsing as plain number (assume degrees)
209
+ return Double(trimmed).map { CGFloat($0) }
210
+ }
211
+ }
212
+
213
+ /// Parsed transform style from RN transform array
214
+ struct TransformStyle {
215
+ var rotate: CGFloat? // in degrees
216
+ var scale: CGFloat?
217
+ var scaleX: CGFloat?
218
+ var scaleY: CGFloat?
219
+
220
+ var hasTransforms: Bool {
221
+ rotate != nil || scale != nil || scaleX != nil || scaleY != nil
222
+ }
223
+ }
@@ -0,0 +1,184 @@
1
+ import SwiftUI
2
+
3
+ // DO NOT PUT DEFAULT VALUES IN THE STRUCTURES.
4
+ // ONLY USE OPTIONALS.
5
+
6
+ // MARK: - Size Value
7
+
8
+ enum SizeValue: Equatable {
9
+ case fixed(CGFloat) // Explicit numeric value (e.g., 100)
10
+ case fill // "100%" — expand to fill available space
11
+ case wrap // "auto" or missing — size to content
12
+ }
13
+
14
+ // MARK: - Flex Alignment
15
+
16
+ enum FlexAlign: String {
17
+ case flexStart = "flex-start"
18
+ case center
19
+ case flexEnd = "flex-end"
20
+ case stretch
21
+
22
+ /// Accept both kebab-case ("flex-start") and camelCase ("flexStart")
23
+ init?(fromStyle value: String) {
24
+ if let v = FlexAlign(rawValue: value) {
25
+ self = v
26
+ } else {
27
+ switch value {
28
+ case "flexStart": self = .flexStart
29
+ case "flexEnd": self = .flexEnd
30
+ default: return nil
31
+ }
32
+ }
33
+ }
34
+ }
35
+
36
+ enum FlexJustify: String {
37
+ case flexStart = "flex-start"
38
+ case center
39
+ case flexEnd = "flex-end"
40
+ case spaceBetween = "space-between"
41
+ case spaceAround = "space-around"
42
+ case spaceEvenly = "space-evenly"
43
+
44
+ /// Accept both kebab-case ("space-between") and camelCase ("spaceBetween")
45
+ init?(fromStyle value: String) {
46
+ if let v = FlexJustify(rawValue: value) {
47
+ self = v
48
+ } else {
49
+ switch value {
50
+ case "flexStart": self = .flexStart
51
+ case "flexEnd": self = .flexEnd
52
+ case "spaceBetween": self = .spaceBetween
53
+ case "spaceAround": self = .spaceAround
54
+ case "spaceEvenly": self = .spaceEvenly
55
+ default: return nil
56
+ }
57
+ }
58
+ }
59
+ }
60
+
61
+ // MARK: - Layout Style
62
+
63
+ struct LayoutStyle {
64
+ // 1. Size Constraints (now SizeValue for "auto"/"100%" support)
65
+ var width: SizeValue?
66
+ var height: SizeValue?
67
+ var minWidth: CGFloat?
68
+ var maxWidth: CGFloat?
69
+ var minHeight: CGFloat?
70
+ var maxHeight: CGFloat?
71
+
72
+ // 2. Flex properties (defaults applied in StyleConverter, not here)
73
+ var flex: CGFloat? // Shorthand (legacy compat)
74
+ var flexGrow: CGFloat // Default: 0 (applied in StyleConverter)
75
+ var flexShrink: CGFloat // Default: 0 (applied in StyleConverter)
76
+ var flexBasis: SizeValue? // nil = auto
77
+ var alignSelf: FlexAlign? // nil = auto (inherit from container)
78
+ var gap: CGFloat? // Spacing between flex children
79
+
80
+ /// 3. Priority (legacy only, derived from flex)
81
+ var layoutPriority: Double?
82
+
83
+ /// 4. Aspect Ratio
84
+ var aspectRatio: CGFloat?
85
+
86
+ // 5. Spacing
87
+ var padding: EdgeInsets?
88
+ var margin: EdgeInsets?
89
+
90
+ // 6. Positioning
91
+ var absolutePosition: CGPoint? // for position: 'absolute'
92
+ var relativeOffset: CGPoint? // for position: 'relative'
93
+ var zIndex: Double?
94
+ }
95
+
96
+ // MARK: - Layout Modifier
97
+
98
+ struct LayoutModifier: ViewModifier {
99
+ let style: LayoutStyle
100
+ var contentAlignment: Alignment = .center
101
+
102
+ /// Extract CGFloat from SizeValue for frame constraints
103
+ private var widthValue: CGFloat? {
104
+ guard case let .fixed(v) = style.width else { return nil }
105
+ return v
106
+ }
107
+
108
+ private var heightValue: CGFloat? {
109
+ guard case let .fixed(v) = style.height else { return nil }
110
+ return v
111
+ }
112
+
113
+ /// Derive effective ideal width: explicit width, then flexBasis, then nil
114
+ private var effectiveIdealWidth: CGFloat? {
115
+ if let w = widthValue { return w }
116
+ if case let .fixed(v) = style.flexBasis { return v }
117
+ return nil
118
+ }
119
+
120
+ /// Derive effective ideal height: explicit height, then flexBasis, then nil
121
+ private var effectiveIdealHeight: CGFloat? {
122
+ if let h = heightValue { return h }
123
+ if case let .fixed(v) = style.flexBasis { return v }
124
+ return nil
125
+ }
126
+
127
+ /// flexShrink > 0: allow shrinking by setting min to 0 (unless explicitly constrained)
128
+ private var effectiveMinWidth: CGFloat? {
129
+ style.flexShrink > 0 ? (style.minWidth ?? 0) : style.minWidth
130
+ }
131
+
132
+ private var effectiveMinHeight: CGFloat? {
133
+ style.flexShrink > 0 ? (style.minHeight ?? 0) : style.minHeight
134
+ }
135
+
136
+ func body(content: Content) -> some View {
137
+ content
138
+ // A. Aspect Ratio (Must be applied before frames to impact sizing)
139
+ .voltraIfLet(style.aspectRatio) { content, aspectRatio in
140
+ content.aspectRatio(aspectRatio, contentMode: .fill)
141
+ }
142
+
143
+ // B. Fixed & Minimum Constraints
144
+ // We apply min/max/fixed constraints first to establish the "base" size.
145
+ .frame(
146
+ minWidth: effectiveMinWidth,
147
+ idealWidth: effectiveIdealWidth,
148
+ maxWidth: widthValue ?? style.maxWidth,
149
+ minHeight: effectiveMinHeight,
150
+ idealHeight: effectiveIdealHeight,
151
+ maxHeight: heightValue ?? style.maxHeight
152
+ )
153
+
154
+ // C. Flex / Grow Logic (legacy: expand to infinity)
155
+ // If flex > 0 OR flexGrow > 0 OR width/height is .fill, expand to .infinity
156
+ .frame(
157
+ maxWidth: shouldExpandWidth ? .infinity : nil,
158
+ maxHeight: shouldExpandHeight ? .infinity : nil,
159
+ // Use the component's own content alignment (e.g. VStack alignment prop)
160
+ // rather than forcing .topLeading, which would override it.
161
+ alignment: contentAlignment
162
+ )
163
+
164
+ // D. Layout Priority (Flex Grow/Shrink arbitration)
165
+ // Views with higher priority get their requested size first.
166
+ .voltraIfLet(style.layoutPriority) { content, priority in
167
+ content.layoutPriority(priority)
168
+ }
169
+
170
+ // E. Inner Spacing (Padding)
171
+ .voltraIfLet(style.padding) { content, padding in
172
+ content.padding(padding)
173
+ }
174
+ }
175
+
176
+ /// Expand if flex > 0 OR flexGrow > 0 OR width/height is .fill
177
+ private var shouldExpandWidth: Bool {
178
+ (style.flex ?? 0) > 0 || style.flexGrow > 0 || style.width == .fill
179
+ }
180
+
181
+ private var shouldExpandHeight: Bool {
182
+ (style.flex ?? 0) > 0 || style.flexGrow > 0 || style.height == .fill
183
+ }
184
+ }
@@ -0,0 +1,4 @@
1
+ enum Overflow {
2
+ case visible
3
+ case hidden
4
+ }
@@ -0,0 +1,33 @@
1
+ import SwiftUI
2
+
3
+ struct RenderingStyle {
4
+ var opacity: CGFloat = 1.0
5
+ var transform: TransformStyle?
6
+ }
7
+
8
+ struct RenderingModifier: ViewModifier {
9
+ let style: RenderingStyle
10
+
11
+ func body(content: Content) -> some View {
12
+ content
13
+ .opacity(style.opacity)
14
+ .modifier(TransformModifier(transform: style.transform))
15
+ }
16
+ }
17
+
18
+ struct TransformModifier: ViewModifier {
19
+ let transform: TransformStyle?
20
+
21
+ func body(content: Content) -> some View {
22
+ content
23
+ .voltraIfLet(transform?.rotate) { view, degrees in
24
+ view.rotationEffect(.degrees(degrees))
25
+ }
26
+ .voltraIfLet(transform?.scale) { view, scale in
27
+ view.scaleEffect(scale)
28
+ }
29
+ .voltraIf(transform?.scale == nil && (transform?.scaleX != nil || transform?.scaleY != nil)) { view in
30
+ view.scaleEffect(x: transform?.scaleX ?? 1.0, y: transform?.scaleY ?? 1.0)
31
+ }
32
+ }
33
+ }
@@ -0,0 +1,202 @@
1
+ import SwiftUI
2
+
3
+ enum StyleConverter {
4
+ static func convert(_ js: [String: Any]) -> (LayoutStyle, DecorationStyle, RenderingStyle, TextStyle) {
5
+ (parseLayout(js), parseDecoration(js), parseRendering(js), parseText(js))
6
+ }
7
+
8
+ private static func parseLayout(_ js: [String: Any]) -> LayoutStyle {
9
+ // RN: "flex: 1" implies grow. "flexGrow" is specific.
10
+ let flexVal = JSStyleParser.number(js["flex"]) ?? 0
11
+ let flexGrowVal = JSStyleParser.number(js["flexGrow"]) ?? 0
12
+ let flexShrinkVal = JSStyleParser.number(js["flexShrink"])
13
+ let flexBasisVal = JSStyleParser.sizeValue(js["flexBasis"])
14
+
15
+ // Legacy flex: max of flex and flexGrow for backward compat
16
+ let finalFlex = max(flexVal, flexGrowVal)
17
+ let priority: Double? = finalFlex > 0 ? Double(finalFlex) : nil
18
+
19
+ // RN flex shorthand: flex > 0 → grow=flex, shrink=1, basis=0
20
+ let resolvedFlexGrow: CGFloat
21
+ let resolvedFlexShrink: CGFloat
22
+ let resolvedFlexBasis: SizeValue?
23
+
24
+ if flexVal > 0 {
25
+ resolvedFlexGrow = flexGrowVal > 0 ? flexGrowVal : flexVal
26
+ resolvedFlexShrink = flexShrinkVal ?? 1
27
+ resolvedFlexBasis = flexBasisVal ?? .fixed(0)
28
+ } else {
29
+ resolvedFlexGrow = flexGrowVal
30
+ resolvedFlexShrink = flexShrinkVal ?? 0
31
+ resolvedFlexBasis = flexBasisVal // nil = auto
32
+ }
33
+
34
+ // Apply defaults here: 0 if not set (instead of in modifiers)
35
+ let finalFlexGrow: CGFloat = resolvedFlexGrow
36
+ let finalFlexShrink: CGFloat = resolvedFlexShrink
37
+
38
+ // alignSelf
39
+ let alignSelf: FlexAlign? = (js["alignSelf"] as? String).flatMap { FlexAlign(fromStyle: $0) }
40
+
41
+ // gap
42
+ let gap = JSStyleParser.number(js["gap"])
43
+
44
+ // Position parsing with mode support
45
+ let left = JSStyleParser.number(js["left"])
46
+ let top = JSStyleParser.number(js["top"])
47
+
48
+ var absolutePosition: CGPoint?
49
+ var relativeOffset: CGPoint?
50
+
51
+ // Only apply positioning if left or top are provided
52
+ if left != nil || top != nil {
53
+ let x = left ?? 0
54
+ let y = top ?? 0
55
+
56
+ // Default to 'absolute' if position mode not specified (backward compatibility)
57
+ let positionMode = js["position"] as? String ?? "absolute"
58
+
59
+ switch positionMode.lowercased() {
60
+ case "absolute":
61
+ absolutePosition = CGPoint(x: x, y: y)
62
+ case "relative":
63
+ relativeOffset = CGPoint(x: x, y: y)
64
+ case "static":
65
+ // Do nothing - ignore left/top
66
+ break
67
+ default:
68
+ // Unknown position value - ignore
69
+ break
70
+ }
71
+ }
72
+
73
+ // zIndex: only set if explicitly provided in JS
74
+ let zIndex = JSStyleParser.number(js["zIndex"])
75
+
76
+ return LayoutStyle(
77
+ // Dimensions (now using SizeValue)
78
+ width: JSStyleParser.sizeValue(js["width"]),
79
+ height: JSStyleParser.sizeValue(js["height"]),
80
+ minWidth: JSStyleParser.number(js["minWidth"]),
81
+ maxWidth: JSStyleParser.number(js["maxWidth"]),
82
+ minHeight: JSStyleParser.number(js["minHeight"]),
83
+ maxHeight: JSStyleParser.number(js["maxHeight"]),
84
+
85
+ // Flex Logic
86
+ flex: finalFlex > 0 ? finalFlex : nil,
87
+ flexGrow: finalFlexGrow,
88
+ flexShrink: finalFlexShrink,
89
+ flexBasis: resolvedFlexBasis,
90
+ alignSelf: alignSelf,
91
+ gap: gap,
92
+ layoutPriority: priority,
93
+ aspectRatio: JSStyleParser.number(js["aspectRatio"]),
94
+
95
+ // Spacing (Resolves logic: padding -> paddingHorizontal -> paddingLeft)
96
+ padding: JSStyleParser.parseInsets(from: js, prefix: "padding"),
97
+ margin: JSStyleParser.parseInsets(from: js, prefix: "margin"),
98
+
99
+ // Positioning
100
+ absolutePosition: absolutePosition,
101
+ relativeOffset: relativeOffset,
102
+ zIndex: zIndex.map { Double($0) }
103
+ )
104
+ }
105
+
106
+ private static func parseDecoration(_ js: [String: Any]) -> DecorationStyle {
107
+ // Border Logic
108
+ var border: (CGFloat, Color)?
109
+ if let borderWidth = JSStyleParser.number(js["borderWidth"]), borderWidth > 0 {
110
+ let borderColor = JSStyleParser.color(js["borderColor"]) ?? .clear
111
+ border = (borderWidth, borderColor)
112
+ }
113
+
114
+ // Shadow Logic (RN iOS style)
115
+ var shadow: (CGFloat, Color, Double, CGSize)?
116
+
117
+ let radius = JSStyleParser.number(js["shadowRadius"])
118
+ let opacity = JSStyleParser.number(js["shadowOpacity"])
119
+ let offset = JSStyleParser.size(js["shadowOffset"])
120
+ let color = JSStyleParser.color(js["shadowColor"])
121
+
122
+ if radius != nil || opacity != nil || offset != nil || color != nil {
123
+ let finalRadius = radius ?? 0.0
124
+ let finalOpacity = opacity ?? 1.0
125
+ let finalOffset = offset ?? .zero
126
+ let finalColor = color ?? .black
127
+
128
+ if finalOpacity > 0 {
129
+ shadow = (finalRadius, finalColor, Double(finalOpacity), finalOffset)
130
+ }
131
+ }
132
+
133
+ let glassEffect = JSStyleParser.glassEffect(js["glassEffect"])
134
+ let overflow = JSStyleParser.overflow(js["overflow"])
135
+
136
+ return DecorationStyle(
137
+ backgroundColor: JSStyleParser.background(js["backgroundColor"]),
138
+ cornerRadius: JSStyleParser.number(js["borderRadius"]),
139
+ border: border,
140
+ shadow: shadow,
141
+ glassEffect: glassEffect,
142
+ overflow: overflow
143
+ )
144
+ }
145
+
146
+ private static func parseRendering(_ js: [String: Any]) -> RenderingStyle {
147
+ RenderingStyle(
148
+ opacity: JSStyleParser.number(js["opacity"]) ?? 1.0,
149
+ transform: JSStyleParser.transform(js["transform"])
150
+ )
151
+ }
152
+
153
+ private static func parseText(_ js: [String: Any]) -> TextStyle {
154
+ var style = TextStyle()
155
+
156
+ if let color = JSColorParser.parse(js["color"]) {
157
+ style.color = color
158
+ style.usesPrimaryColorInReducedPresentation = JSColorParser.shouldUsePrimaryColorInReducedPresentation(js["color"])
159
+ }
160
+
161
+ if let size = JSStyleParser.number(js["fontSize"]) {
162
+ style.fontSize = size
163
+ }
164
+
165
+ // CSS LineHeight includes text size. SwiftUI LineSpacing is the extra space.
166
+ if let lineHeight = JSStyleParser.number(js["lineHeight"]) {
167
+ let spacing = lineHeight - style.fontSize
168
+ style.lineSpacing = max(0, spacing)
169
+ }
170
+
171
+ if let weightRaw = js["fontWeight"] {
172
+ style.fontWeight = JSStyleParser.fontWeight(weightRaw)
173
+ }
174
+
175
+ if let fontFamily = js["fontFamily"] as? String {
176
+ style.fontFamily = fontFamily
177
+ }
178
+
179
+ if let alignRaw = js["textAlign"] {
180
+ style.alignment = JSStyleParser.textAlignment(alignRaw)
181
+ }
182
+
183
+ if let decoRaw = js["textDecorationLine"] {
184
+ style.decoration = JSStyleParser.textDecoration(decoRaw)
185
+ }
186
+
187
+ // 6. Numbers
188
+ if let lines = js["numberOfLines"] as? Int {
189
+ style.lineLimit = lines
190
+ }
191
+
192
+ if let letterSpacing = JSStyleParser.number(js["letterSpacing"]) {
193
+ style.letterSpacing = letterSpacing
194
+ }
195
+
196
+ if let fontVariantRaw = js["fontVariant"] {
197
+ style.fontVariant = JSStyleParser.fontVariant(fontVariantRaw)
198
+ }
199
+
200
+ return style
201
+ }
202
+ }
@@ -0,0 +1,6 @@
1
+ enum TextDecoration {
2
+ case none
3
+ case underline
4
+ case lineThrough
5
+ case underlineLineThrough // Supports "underline line-through" combination
6
+ }