@use-voltra/ios-client 1.4.1 → 2.0.0-rc.2

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 (577) 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/ButtonParameters.swift +15 -0
  391. package/ios/ui/Generated/Parameters/ChartParameters.swift +33 -0
  392. package/ios/ui/Generated/Parameters/CircularProgressViewParameters.swift +59 -0
  393. package/ios/ui/Generated/Parameters/ComponentParameters.swift +12 -0
  394. package/ios/ui/Generated/Parameters/DividerParameters.swift +12 -0
  395. package/ios/ui/Generated/Parameters/GaugeParameters.swift +54 -0
  396. package/ios/ui/Generated/Parameters/GlassContainerParameters.swift +15 -0
  397. package/ios/ui/Generated/Parameters/GroupBoxParameters.swift +12 -0
  398. package/ios/ui/Generated/Parameters/HStackParameters.swift +34 -0
  399. package/ios/ui/Generated/Parameters/ImageParameters.swift +29 -0
  400. package/ios/ui/Generated/Parameters/LabelParameters.swift +18 -0
  401. package/ios/ui/Generated/Parameters/LinearGradientParameters.swift +27 -0
  402. package/ios/ui/Generated/Parameters/LinearProgressViewParameters.swift +64 -0
  403. package/ios/ui/Generated/Parameters/LinkParameters.swift +15 -0
  404. package/ios/ui/Generated/Parameters/MaskParameters.swift +12 -0
  405. package/ios/ui/Generated/Parameters/SpacerParameters.swift +15 -0
  406. package/ios/ui/Generated/Parameters/SymbolParameters.swift +59 -0
  407. package/ios/ui/Generated/Parameters/TextParameters.swift +18 -0
  408. package/ios/ui/Generated/Parameters/TimerParameters.swift +54 -0
  409. package/ios/ui/Generated/Parameters/ToggleParameters.swift +24 -0
  410. package/ios/ui/Generated/Parameters/VStackParameters.swift +34 -0
  411. package/ios/ui/Generated/Parameters/ViewParameters.swift +12 -0
  412. package/ios/ui/Generated/Parameters/ZStackParameters.swift +15 -0
  413. package/ios/ui/Helpers/VoltraDeepLinkResolver.swift +43 -0
  414. package/ios/ui/Helpers/VoltraProgressDriver.swift +52 -0
  415. package/ios/ui/Layout/FlexContainerHelper.swift +114 -0
  416. package/ios/ui/Layout/VoltraFlexStackLayout.swift +417 -0
  417. package/ios/ui/Protocols/VoltraView.swift +29 -0
  418. package/ios/ui/Style/BackgroundValue.swift +27 -0
  419. package/ios/ui/Style/CompositeStyle.swift +81 -0
  420. package/ios/ui/Style/DecorationStyle.swift +207 -0
  421. package/ios/ui/Style/FlexEnvironment.swift +35 -0
  422. package/ios/ui/Style/FontVariant.swift +4 -0
  423. package/ios/ui/Style/GlassEffect.swift +6 -0
  424. package/ios/ui/Style/JSColorParser.swift +517 -0
  425. package/ios/ui/Style/JSGradientParser.swift +674 -0
  426. package/ios/ui/Style/JSStyleParser.swift +223 -0
  427. package/ios/ui/Style/LayoutStyle.swift +184 -0
  428. package/ios/ui/Style/Overflow.swift +4 -0
  429. package/ios/ui/Style/RenderingStyle.swift +33 -0
  430. package/ios/ui/Style/StyleConverter.swift +202 -0
  431. package/ios/ui/Style/TextDecoration.swift +6 -0
  432. package/ios/ui/Style/TextStyle.swift +50 -0
  433. package/ios/ui/Style/View+applyStyle.swift +38 -0
  434. package/ios/ui/Views/VoltraButton.swift +57 -0
  435. package/ios/ui/Views/VoltraChart.swift +840 -0
  436. package/ios/ui/Views/VoltraCircularProgressView.swift +103 -0
  437. package/ios/ui/Views/VoltraDivider.swift +16 -0
  438. package/ios/ui/Views/VoltraFlexView.swift +33 -0
  439. package/ios/ui/Views/VoltraGauge.swift +65 -0
  440. package/ios/ui/Views/VoltraGlassContainer.swift +29 -0
  441. package/ios/ui/Views/VoltraGroupBox.swift +26 -0
  442. package/ios/ui/Views/VoltraHStack.swift +70 -0
  443. package/ios/ui/Views/VoltraImage.swift +109 -0
  444. package/ios/ui/Views/VoltraLabel.swift +24 -0
  445. package/ios/ui/Views/VoltraLinearGradient.swift +115 -0
  446. package/ios/ui/Views/VoltraLinearProgressView.swift +118 -0
  447. package/ios/ui/Views/VoltraLink.swift +25 -0
  448. package/ios/ui/Views/VoltraMask.swift +23 -0
  449. package/ios/ui/Views/VoltraSpacer.swift +16 -0
  450. package/ios/ui/Views/VoltraSymbol.swift +160 -0
  451. package/ios/ui/Views/VoltraText.swift +87 -0
  452. package/ios/ui/Views/VoltraTimer.swift +131 -0
  453. package/ios/ui/Views/VoltraToggle.swift +39 -0
  454. package/ios/ui/Views/VoltraVStack.swift +68 -0
  455. package/ios/ui/Views/VoltraZStack.swift +33 -0
  456. package/ios/ui/Voltra.swift +86 -0
  457. package/package.json +105 -19
  458. package/src/VoltraModule.ts +2 -0
  459. package/src/components/VoltraLiveActivityPreview.tsx +29 -0
  460. package/src/components/VoltraView.tsx +49 -0
  461. package/src/components/VoltraWidgetPreview.tsx +38 -0
  462. package/src/events.ts +70 -0
  463. package/src/helpers.ts +21 -0
  464. package/src/index.ts +52 -0
  465. package/src/live-activity/api.ts +224 -0
  466. package/src/logger.ts +35 -0
  467. package/src/native/NativeVoltra.ts +118 -0
  468. package/src/native/VoltraRNNativeComponent.ts +9 -0
  469. package/src/preload.ts +50 -0
  470. package/src/types.ts +12 -0
  471. package/src/utils/assertRunningOnApple.ts +10 -0
  472. package/src/utils/helpers.ts +1 -0
  473. package/src/utils/index.ts +2 -0
  474. package/src/utils/useUpdateOnHMR.ts +25 -0
  475. package/src/widgets/server-credentials.ts +16 -0
  476. package/src/widgets/widget-api.ts +65 -0
  477. package/build/cjs/VoltraModule.js +0 -6
  478. package/build/cjs/VoltraModule.js.map +0 -1
  479. package/build/cjs/components/VoltraLiveActivityPreview.js +0 -20
  480. package/build/cjs/components/VoltraLiveActivityPreview.js.map +0 -1
  481. package/build/cjs/components/VoltraView.js +0 -37
  482. package/build/cjs/components/VoltraView.js.map +0 -1
  483. package/build/cjs/components/VoltraWidgetPreview.js +0 -26
  484. package/build/cjs/components/VoltraWidgetPreview.js.map +0 -1
  485. package/build/cjs/events.js +0 -19
  486. package/build/cjs/events.js.map +0 -1
  487. package/build/cjs/helpers.js +0 -30
  488. package/build/cjs/helpers.js.map +0 -1
  489. package/build/cjs/index.js +0 -49
  490. package/build/cjs/index.js.map +0 -1
  491. package/build/cjs/live-activity/api.js +0 -158
  492. package/build/cjs/live-activity/api.js.map +0 -1
  493. package/build/cjs/logger.js +0 -36
  494. package/build/cjs/logger.js.map +0 -1
  495. package/build/cjs/preload.js +0 -54
  496. package/build/cjs/preload.js.map +0 -1
  497. package/build/cjs/utils/assertRunningOnApple.js +0 -13
  498. package/build/cjs/utils/assertRunningOnApple.js.map +0 -1
  499. package/build/cjs/utils/helpers.js +0 -7
  500. package/build/cjs/utils/helpers.js.map +0 -1
  501. package/build/cjs/utils/index.js +0 -19
  502. package/build/cjs/utils/index.js.map +0 -1
  503. package/build/cjs/utils/useUpdateOnHMR.js +0 -22
  504. package/build/cjs/utils/useUpdateOnHMR.js.map +0 -1
  505. package/build/cjs/widgets/server-credentials.js +0 -18
  506. package/build/cjs/widgets/server-credentials.js.map +0 -1
  507. package/build/cjs/widgets/widget-api.js +0 -59
  508. package/build/cjs/widgets/widget-api.js.map +0 -1
  509. package/build/esm/VoltraModule.js +0 -4
  510. package/build/esm/VoltraModule.js.map +0 -1
  511. package/build/esm/components/VoltraLiveActivityPreview.js +0 -17
  512. package/build/esm/components/VoltraLiveActivityPreview.js.map +0 -1
  513. package/build/esm/components/VoltraView.js +0 -34
  514. package/build/esm/components/VoltraView.js.map +0 -1
  515. package/build/esm/components/VoltraWidgetPreview.js +0 -23
  516. package/build/esm/components/VoltraWidgetPreview.js.map +0 -1
  517. package/build/esm/events.js +0 -13
  518. package/build/esm/events.js.map +0 -1
  519. package/build/esm/helpers.js +0 -23
  520. package/build/esm/helpers.js.map +0 -1
  521. package/build/esm/index.js +0 -10
  522. package/build/esm/index.js.map +0 -1
  523. package/build/esm/live-activity/api.js +0 -146
  524. package/build/esm/live-activity/api.js.map +0 -1
  525. package/build/esm/logger.js +0 -33
  526. package/build/esm/logger.js.map +0 -1
  527. package/build/esm/preload.js +0 -46
  528. package/build/esm/preload.js.map +0 -1
  529. package/build/esm/utils/assertRunningOnApple.js +0 -9
  530. package/build/esm/utils/assertRunningOnApple.js.map +0 -1
  531. package/build/esm/utils/helpers.js.map +0 -1
  532. package/build/esm/utils/index.js.map +0 -1
  533. package/build/esm/utils/useUpdateOnHMR.js +0 -18
  534. package/build/esm/utils/useUpdateOnHMR.js.map +0 -1
  535. package/build/esm/widgets/server-credentials.js +0 -11
  536. package/build/esm/widgets/server-credentials.js.map +0 -1
  537. package/build/esm/widgets/widget-api.js +0 -47
  538. package/build/esm/widgets/widget-api.js.map +0 -1
  539. package/build/types/VoltraModule.d.ts +0 -44
  540. package/build/types/VoltraModule.d.ts.map +0 -1
  541. package/build/types/components/VoltraLiveActivityPreview.d.ts.map +0 -1
  542. package/build/types/components/VoltraView.d.ts.map +0 -1
  543. package/build/types/components/VoltraWidgetPreview.d.ts.map +0 -1
  544. package/build/types/events.d.ts.map +0 -1
  545. package/build/types/helpers.d.ts.map +0 -1
  546. package/build/types/index.d.ts.map +0 -1
  547. package/build/types/live-activity/api.d.ts.map +0 -1
  548. package/build/types/logger.d.ts.map +0 -1
  549. package/build/types/preload.d.ts.map +0 -1
  550. package/build/types/types.d.ts.map +0 -1
  551. package/build/types/utils/assertRunningOnApple.d.ts.map +0 -1
  552. package/build/types/utils/helpers.d.ts.map +0 -1
  553. package/build/types/utils/index.d.ts.map +0 -1
  554. package/build/types/utils/useUpdateOnHMR.d.ts.map +0 -1
  555. package/build/types/widgets/server-credentials.d.ts.map +0 -1
  556. package/build/types/widgets/widget-api.d.ts.map +0 -1
  557. /package/build/{types → typescript/commonjs}/components/VoltraLiveActivityPreview.d.ts +0 -0
  558. /package/build/{types → typescript/commonjs}/components/VoltraView.d.ts +0 -0
  559. /package/build/{types → typescript/commonjs}/components/VoltraWidgetPreview.d.ts +0 -0
  560. /package/build/{types → typescript/commonjs}/events.d.ts +0 -0
  561. /package/build/{types → typescript/commonjs}/helpers.d.ts +0 -0
  562. /package/build/{types → typescript/commonjs}/live-activity/api.d.ts +0 -0
  563. /package/build/{types → typescript/commonjs}/logger.d.ts +0 -0
  564. /package/build/{types → typescript/commonjs}/preload.d.ts +0 -0
  565. /package/build/{types → typescript/commonjs}/types.d.ts +0 -0
  566. /package/build/{types → typescript/commonjs}/utils/assertRunningOnApple.d.ts +0 -0
  567. /package/build/{types → typescript/commonjs}/utils/helpers.d.ts +0 -0
  568. /package/build/{types → typescript/commonjs}/utils/index.d.ts +0 -0
  569. /package/build/{types → typescript/commonjs}/utils/useUpdateOnHMR.d.ts +0 -0
  570. /package/build/{types → typescript/commonjs}/widgets/server-credentials.d.ts +0 -0
  571. /package/build/{types → typescript/commonjs}/widgets/widget-api.d.ts +0 -0
  572. /package/{build → expo-plugin/build}/cjs/package.json +0 -0
  573. /package/{build → expo-plugin/build}/cjs/types.js +0 -0
  574. /package/{build → expo-plugin/build}/cjs/types.js.map +0 -0
  575. /package/{build → expo-plugin/build}/esm/package.json +0 -0
  576. /package/{build → expo-plugin/build}/esm/types.js +0 -0
  577. /package/{build → expo-plugin/build}/esm/types.js.map +0 -0
@@ -0,0 +1,118 @@
1
+ import SwiftUI
2
+
3
+ public struct VoltraLinearProgressView: VoltraView {
4
+ public typealias Parameters = LinearProgressViewParameters
5
+
6
+ public let element: VoltraElement
7
+
8
+ @State private var internalStartTime = Date()
9
+
10
+ public init(_ element: VoltraElement) {
11
+ self.element = element
12
+ }
13
+
14
+ @ViewBuilder
15
+ public var body: some View {
16
+ let p = params
17
+ let progressColor = p.progressColor.flatMap { JSColorParser.parse($0) }
18
+ let trackColor = p.trackColor.flatMap { JSColorParser.parse($0) }
19
+ let cornerRadius = p.cornerRadius.map { CGFloat($0) }
20
+ let height = p.height.map { CGFloat($0) }
21
+ let thumbComponent = element.componentProp("thumb")
22
+
23
+ let isTimer = p.endAtMs != nil
24
+
25
+ // Linear progress bar only supports Determinate and Timer modes.
26
+ // If no value or timer is provided, we fall back to a 0% determinate state
27
+ // as linear indeterminate progress is not supported.
28
+ let isDeterminate = p.value != nil
29
+ let effectiveValue = p.value ?? 0.0
30
+
31
+ // Built-in style is required for timers to animate in realtime (Live Activities).
32
+ let hasCustomProps = trackColor != nil || cornerRadius != nil || height != nil || thumbComponent != .empty
33
+ let useCustomStyle = hasCustomProps && isDeterminate
34
+
35
+ if isTimer, let endAtMs = p.endAtMs {
36
+ // Timer-based progress (Always uses built-in style for realtime updates)
37
+ ProgressView(
38
+ timerInterval: Date.toTimerInterval(
39
+ startAtMs: p.startAtMs ?? (internalStartTime.timeIntervalSince1970 * 1000),
40
+ endAtMs: endAtMs
41
+ ),
42
+ countsDown: p.countDown ?? false
43
+ ) {
44
+ element.componentProp("label")
45
+ } currentValueLabel: {
46
+ element.componentProp("currentValueLabel")
47
+ }
48
+ .progressViewStyle(.linear)
49
+ .tint(progressColor)
50
+ .applyStyle(element.style)
51
+ } else {
52
+ // Determinate progress (Default fallback if no value/timer)
53
+ ProgressView(value: effectiveValue, total: p.maximumValue) {
54
+ element.componentProp("label")
55
+ } currentValueLabel: {
56
+ element.componentProp("currentValueLabel")
57
+ }
58
+ .tint(progressColor)
59
+ .voltraIf(useCustomStyle) {
60
+ $0.progressViewStyle(VoltraLinearProgressStyle(
61
+ progressTint: progressColor,
62
+ trackTint: trackColor ?? Color.gray.opacity(0.2),
63
+ cornerRadius: cornerRadius,
64
+ explicitHeight: height,
65
+ thumbComponent: thumbComponent != .empty ? thumbComponent : nil
66
+ ))
67
+ }
68
+ .voltraIf(!useCustomStyle) {
69
+ $0.progressViewStyle(.linear)
70
+ }
71
+ .applyStyle(element.style)
72
+ }
73
+ }
74
+ }
75
+
76
+ @available(iOS 16.0, macOS 13.0, *)
77
+ private struct VoltraLinearProgressStyle: ProgressViewStyle {
78
+ var progressTint: Color?
79
+ var trackTint: Color
80
+ var cornerRadius: CGFloat?
81
+ var explicitHeight: CGFloat?
82
+ var thumbComponent: VoltraNode?
83
+
84
+ func makeBody(configuration: Configuration) -> some View {
85
+ let fraction = max(0, min(configuration.fractionCompleted ?? 0, 1))
86
+ let baseHeight = explicitHeight ?? 4
87
+
88
+ VStack(alignment: .leading, spacing: 4) {
89
+ configuration.label
90
+
91
+ GeometryReader { geometry in
92
+ let totalWidth = geometry.size.width
93
+ let radius = cornerRadius ?? baseHeight / 2
94
+
95
+ ZStack(alignment: .leading) {
96
+ // Track
97
+ RoundedRectangle(cornerRadius: radius, style: .continuous)
98
+ .fill(trackTint)
99
+ .frame(width: totalWidth, height: baseHeight)
100
+
101
+ // Progress fill
102
+ RoundedRectangle(cornerRadius: radius, style: .continuous)
103
+ .fill(progressTint ?? Color.accentColor)
104
+ .frame(width: totalWidth * CGFloat(fraction), height: baseHeight)
105
+ }
106
+ .overlay(alignment: .leading) {
107
+ if let thumbComponent = thumbComponent {
108
+ thumbComponent
109
+ .offset(x: totalWidth * CGFloat(fraction))
110
+ }
111
+ }
112
+ }
113
+ .frame(height: baseHeight)
114
+
115
+ configuration.currentValueLabel
116
+ }
117
+ }
118
+ }
@@ -0,0 +1,25 @@
1
+ import SwiftUI
2
+
3
+ public struct VoltraLink: VoltraView {
4
+ public typealias Parameters = LinkParameters
5
+ public let element: VoltraElement
6
+
7
+ public init(_ element: VoltraElement) {
8
+ self.element = element
9
+ }
10
+
11
+ public var body: some View {
12
+ if let urlString = params.destination,
13
+ let url = VoltraDeepLinkResolver.resolveUrl(urlString)
14
+ {
15
+ Link(destination: url) {
16
+ element.children ?? .empty
17
+ }
18
+ .applyStyle(element.style)
19
+ } else {
20
+ // Fallback: render children without link if destination is invalid
21
+ (element.children ?? .empty)
22
+ .applyStyle(element.style)
23
+ }
24
+ }
25
+ }
@@ -0,0 +1,23 @@
1
+ import SwiftUI
2
+
3
+ public struct VoltraMask: VoltraView {
4
+ public typealias Parameters = EmptyParameters
5
+
6
+ public let element: VoltraElement
7
+
8
+ public init(_ element: VoltraElement) {
9
+ self.element = element
10
+ }
11
+
12
+ public var body: some View {
13
+ // Get the mask element from element props
14
+ let maskElement = element.componentProp("maskElement")
15
+
16
+ // Render children as the content to be masked
17
+ (element.children ?? .empty)
18
+ .mask {
19
+ maskElement
20
+ }
21
+ .applyStyle(element.style)
22
+ }
23
+ }
@@ -0,0 +1,16 @@
1
+ import SwiftUI
2
+
3
+ public struct VoltraSpacer: VoltraView {
4
+ public typealias Parameters = SpacerParameters
5
+
6
+ public let element: VoltraElement
7
+
8
+ public init(_ element: VoltraElement) {
9
+ self.element = element
10
+ }
11
+
12
+ public var body: some View {
13
+ Spacer(minLength: params.minLength.map { CGFloat($0) })
14
+ .applyStyle(element.style)
15
+ }
16
+ }
@@ -0,0 +1,160 @@
1
+ import SwiftUI
2
+
3
+ private enum SymbolRenderingMode: String {
4
+ case monochrome
5
+ case hierarchical
6
+ case palette
7
+ case multicolor
8
+ }
9
+
10
+ public struct VoltraSymbol: VoltraView {
11
+ public typealias Parameters = SymbolParameters
12
+
13
+ public let element: VoltraElement
14
+
15
+ private var params: Parameters {
16
+ element.parameters(Parameters.self)
17
+ }
18
+
19
+ public init(_ element: VoltraElement) {
20
+ self.element = element
21
+ }
22
+
23
+ private func symbolName(params: SymbolParameters) -> String {
24
+ if let name = params.name, !name.isEmpty {
25
+ return name
26
+ }
27
+ return "questionmark"
28
+ }
29
+
30
+ private func symbolTypeKey(params: SymbolParameters) -> String {
31
+ params.type?.lowercased() ?? "monochrome"
32
+ }
33
+
34
+ private func renderingMode(params: SymbolParameters) -> SymbolRenderingMode {
35
+ SymbolRenderingMode(rawValue: symbolTypeKey(params: params)) ?? .monochrome
36
+ }
37
+
38
+ private func symbolScale(params: SymbolParameters) -> Image.Scale {
39
+ switch params.scale?.lowercased() {
40
+ case "small":
41
+ return .small
42
+ case "large":
43
+ return .large
44
+ case "unspecified":
45
+ return .medium
46
+ case "medium", "default":
47
+ return .medium
48
+ default:
49
+ return .medium
50
+ }
51
+ }
52
+
53
+ private func symbolWeight(params: SymbolParameters) -> Font.Weight {
54
+ switch params.weight?.lowercased() {
55
+ case "ultralight":
56
+ return .ultraLight
57
+ case "thin":
58
+ return .thin
59
+ case "light":
60
+ return .light
61
+ case "medium":
62
+ return .medium
63
+ case "semibold":
64
+ return .semibold
65
+ case "bold":
66
+ return .bold
67
+ case "heavy":
68
+ return .heavy
69
+ case "black":
70
+ return .black
71
+ case "regular", "unspecified", nil:
72
+ return .regular
73
+ default:
74
+ return .regular
75
+ }
76
+ }
77
+
78
+ private func symbolSize(params: SymbolParameters) -> CGFloat {
79
+ CGFloat(params.size)
80
+ }
81
+
82
+ private func tintColor(params: SymbolParameters) -> Color? {
83
+ guard let string = params.tintColor else {
84
+ return nil
85
+ }
86
+ return JSColorParser.parse(string)
87
+ }
88
+
89
+ private func paletteColors(params: SymbolParameters) -> [Color] {
90
+ guard let colorsString = params.colors, !colorsString.isEmpty else {
91
+ return []
92
+ }
93
+ return colorsString
94
+ .split(separator: "|")
95
+ .compactMap { part in
96
+ let value = String(part)
97
+ return JSColorParser.parse(value)
98
+ }
99
+ }
100
+
101
+ public var body: some View {
102
+ let image = Image(systemName: symbolName(params: params))
103
+
104
+ applyStyling(params: params, to: image)
105
+ .applyStyle(element.style)
106
+ }
107
+
108
+ @ViewBuilder
109
+ private func applyStyling(params: SymbolParameters, to image: Image) -> some View {
110
+ let sized = image
111
+ .font(.system(size: symbolSize(params: params), weight: symbolWeight(params: params)))
112
+ .imageScale(symbolScale(params: params))
113
+
114
+ let colored = applyColor(params: params, to: sized)
115
+
116
+ colored
117
+ }
118
+
119
+ @ViewBuilder
120
+ private func applyColor(params: SymbolParameters, to view: some View) -> some View {
121
+ let mode = renderingMode(params: params)
122
+ let tint = tintColor(params: params)
123
+ let palette = paletteColors(params: params)
124
+ switch mode {
125
+ case .monochrome:
126
+ if let tint = tint {
127
+ view.foregroundStyle(tint)
128
+ } else {
129
+ view.symbolRenderingMode(.monochrome)
130
+ }
131
+ case .hierarchical:
132
+ if let tint = tint {
133
+ view.symbolRenderingMode(.hierarchical).foregroundStyle(tint)
134
+ } else {
135
+ view.symbolRenderingMode(.hierarchical)
136
+ }
137
+ case .palette:
138
+ if !palette.isEmpty {
139
+ // Swift's variadic foregroundStyle is tricky with array,
140
+ // but .foregroundStyle(Color, Color...) works up to a limit.
141
+ // We'll support up to 3 colors for now as that's common for symbols.
142
+ if palette.count == 1 {
143
+ view.symbolRenderingMode(.palette).foregroundStyle(palette[0])
144
+ } else if palette.count == 2 {
145
+ view.symbolRenderingMode(.palette).foregroundStyle(palette[0], palette[1])
146
+ } else if palette.count >= 3 {
147
+ view.symbolRenderingMode(.palette).foregroundStyle(palette[0], palette[1], palette[2])
148
+ } else {
149
+ view.symbolRenderingMode(.palette)
150
+ }
151
+ } else if let tint = tint {
152
+ view.symbolRenderingMode(.hierarchical).foregroundStyle(tint)
153
+ } else {
154
+ view.symbolRenderingMode(.palette)
155
+ }
156
+ case .multicolor:
157
+ view.symbolRenderingMode(.multicolor)
158
+ }
159
+ }
160
+ }
@@ -0,0 +1,87 @@
1
+ import SwiftUI
2
+
3
+ public struct VoltraText: VoltraView {
4
+ public typealias Parameters = TextParameters
5
+
6
+ public let element: VoltraElement
7
+ @Environment(\.voltraEnvironment) private var voltraEnvironment
8
+
9
+ public init(_ element: VoltraElement) {
10
+ self.element = element
11
+ }
12
+
13
+ public var body: some View {
14
+ let textContent: String = {
15
+ if let children = element.children, case let .text(text) = children {
16
+ return text
17
+ }
18
+ return ""
19
+ }()
20
+ let anyStyle = (element.style ?? [:]).mapValues { $0.toAny() }
21
+ let style = StyleConverter.convert(anyStyle)
22
+ let textStyle = style.3
23
+
24
+ var font: Font {
25
+ // If custom fontFamily is specified, use it
26
+ if let fontFamily = textStyle.fontFamily {
27
+ var baseFont = Font.custom(fontFamily, size: textStyle.fontSize)
28
+
29
+ if textStyle.fontVariant.contains(.smallCaps) {
30
+ baseFont = baseFont.smallCaps()
31
+ }
32
+
33
+ if textStyle.fontVariant.contains(.tabularNums) {
34
+ baseFont = baseFont.monospacedDigit()
35
+ }
36
+
37
+ return baseFont
38
+ }
39
+
40
+ // Otherwise use system font with weight
41
+ var baseFont = Font.system(size: textStyle.fontSize, weight: textStyle.fontWeight)
42
+
43
+ if textStyle.fontVariant.contains(.smallCaps) {
44
+ baseFont = baseFont.smallCaps()
45
+ }
46
+
47
+ if textStyle.fontVariant.contains(.tabularNums) {
48
+ baseFont = baseFont.monospacedDigit()
49
+ }
50
+
51
+ return baseFont
52
+ }
53
+
54
+ let alignment: TextAlignment = {
55
+ // Parameter takes precedence over style
56
+ if let mta = params.multilineTextAlignment {
57
+ return JSStyleParser.textAlignment(mta)
58
+ }
59
+ return textStyle.alignment
60
+ }()
61
+
62
+ let resolvedColor: Color = {
63
+ if let widget = voltraEnvironment.widget,
64
+ widget.usesReducedBackgroundPresentation,
65
+ textStyle.usesPrimaryColorInReducedPresentation
66
+ {
67
+ return .primary
68
+ }
69
+
70
+ return textStyle.color
71
+ }()
72
+
73
+ Text(.init(textContent))
74
+ .kerning(textStyle.letterSpacing)
75
+ .underline(textStyle.decoration == .underline || textStyle.decoration == .underlineLineThrough)
76
+ .strikethrough(textStyle.decoration == .lineThrough || textStyle.decoration == .underlineLineThrough)
77
+ // These technically work on View, but good to keep close
78
+ .font(font)
79
+ .foregroundColor(resolvedColor)
80
+ .multilineTextAlignment(alignment)
81
+ .lineSpacing(textStyle.lineSpacing)
82
+ .voltraIfLet(params.numberOfLines) { view, numberOfLines in
83
+ view.lineLimit(Int(numberOfLines))
84
+ }
85
+ .applyStyle(element.style)
86
+ }
87
+ }
@@ -0,0 +1,131 @@
1
+ import SwiftUI
2
+
3
+ public struct VoltraTimer: VoltraView {
4
+ public typealias Parameters = TimerParameters
5
+
6
+ public let element: VoltraElement
7
+
8
+ public init(_ element: VoltraElement) {
9
+ self.element = element
10
+ }
11
+
12
+ private func progressRange(params: TimerParameters) -> ClosedRange<Date>? {
13
+ // Stopwatch support: if counting up (not down) and we have a start time
14
+ // but no end time or duration, treat it as an open-ended stopwatch.
15
+ if !countsDown(params: params),
16
+ let startAtMs = params.startAtMs,
17
+ params.endAtMs == nil,
18
+ params.durationMs == nil
19
+ {
20
+ let start = Date(timeIntervalSince1970: startAtMs / 1000)
21
+ return start ... Date.distantFuture
22
+ }
23
+
24
+ return VoltraProgressDriver.resolveRange(
25
+ startAtMs: params.startAtMs,
26
+ endAtMs: params.endAtMs,
27
+ durationMs: params.durationMs
28
+ )
29
+ }
30
+
31
+ private func resolvedEndDate(params: TimerParameters) -> Date? {
32
+ progressRange(params: params)?.upperBound
33
+ }
34
+
35
+ private func countsDown(params: TimerParameters) -> Bool {
36
+ (params.direction.lowercased()) != "up"
37
+ }
38
+
39
+ private func textStyle(params: TimerParameters) -> String {
40
+ params.textStyle.lowercased()
41
+ }
42
+
43
+ private struct TextTemplates: Codable {
44
+ let running: String?
45
+ let completed: String?
46
+ }
47
+
48
+ private func textTemplates(params: TimerParameters) -> TextTemplates? {
49
+ guard let raw = params.textTemplates,
50
+ let data = raw.data(using: .utf8)
51
+ else { return nil }
52
+ return try? JSONDecoder().decode(TextTemplates.self, from: data)
53
+ }
54
+
55
+ @ViewBuilder
56
+ public var body: some View {
57
+ if let range = progressRange(params: params) {
58
+ timerView(params: params, range: range)
59
+ .applyStyle(element.style)
60
+ }
61
+ }
62
+
63
+ @ViewBuilder
64
+ private func timerView(params: TimerParameters, range: ClosedRange<Date>) -> some View {
65
+ let isFinished = Date() >= range.upperBound
66
+ let templates = textTemplates(params: params)
67
+ let style = textStyle(params: params)
68
+ let showHours = params.showHours
69
+
70
+ if isFinished, let completedTemplate = templates?.completed {
71
+ renderTemplate(template: completedTemplate) {
72
+ staticZeroText(style: style, showHours: showHours)
73
+ }
74
+ } else {
75
+ if let runningTemplate = templates?.running {
76
+ renderTemplate(template: runningTemplate) {
77
+ activeTimerText(params: params, range: range)
78
+ }
79
+ } else {
80
+ activeTimerText(params: params, range: range)
81
+ }
82
+ }
83
+ }
84
+
85
+ @ViewBuilder
86
+ private func activeTimerText(params: TimerParameters, range: ClosedRange<Date>) -> some View {
87
+ let style = textStyle(params: params)
88
+ let isCountDown = countsDown(params: params)
89
+ let showHours = params.showHours
90
+
91
+ if style == "relative" {
92
+ let targetDate = isCountDown ? range.upperBound : range.lowerBound
93
+ Text(targetDate, style: .relative).monospacedDigit()
94
+ } else {
95
+ // Live Activities require Text(timerInterval:...) for automatic updates
96
+ Text(timerInterval: range, countsDown: isCountDown, showsHours: showHours)
97
+ .monospacedDigit()
98
+ }
99
+ }
100
+
101
+ @ViewBuilder
102
+ private func staticZeroText(style: String, showHours: Bool) -> some View {
103
+ if style == "relative" {
104
+ Text("0s").monospacedDigit()
105
+ } else {
106
+ Text(showHours ? "0:00:00" : "0:00")
107
+ .monospacedDigit()
108
+ }
109
+ }
110
+
111
+ @ViewBuilder
112
+ private func renderTemplate<T: View>(template: String, @ViewBuilder timeView: @escaping () -> T)
113
+ -> some View
114
+ {
115
+ let placeholder = "{time}"
116
+ let segments = template.components(separatedBy: placeholder)
117
+
118
+ if segments.count > 1 {
119
+ HStack(spacing: 0) {
120
+ ForEach(Array(segments.enumerated()), id: \.offset) { index, segment in
121
+ Text(verbatim: segment)
122
+ if index < segments.count - 1 {
123
+ timeView()
124
+ }
125
+ }
126
+ }
127
+ } else {
128
+ Text(template)
129
+ }
130
+ }
131
+ }
@@ -0,0 +1,39 @@
1
+ import AppIntents
2
+ import SwiftUI
3
+
4
+ public struct VoltraToggle: VoltraView {
5
+ public typealias Parameters = ToggleParameters
6
+
7
+ public let element: VoltraElement
8
+ private let title: String
9
+
10
+ @Environment(\.voltraEnvironment)
11
+ private var voltraEnvironment
12
+
13
+ public init(_ element: VoltraElement) {
14
+ self.element = element
15
+ title = element.props?["title"]?.stringValue ?? ""
16
+ }
17
+
18
+ public var body: some View {
19
+ if #available(iOS 17.0, *) {
20
+ Toggle(
21
+ isOn: params.defaultValue,
22
+ intent: VoltraInteractionIntent(
23
+ activityId: voltraEnvironment.activityId,
24
+ componentId: element.id ?? "unknown",
25
+ payload: (params.defaultValue) ? "false" : "true"
26
+ )
27
+ ) {
28
+ Text(title)
29
+ }
30
+ .applyStyle(element.style)
31
+ } else {
32
+ // Fallback for iOS 16.x: Toggle with static value (intents not supported)
33
+ Toggle(isOn: .constant(params.defaultValue)) {
34
+ Text(title)
35
+ }
36
+ .applyStyle(element.style)
37
+ }
38
+ }
39
+ }
@@ -0,0 +1,68 @@
1
+ import SwiftUI
2
+
3
+ public struct VoltraVStack: View {
4
+ private let element: VoltraElement
5
+
6
+ public init(_ element: VoltraElement) {
7
+ self.element = element
8
+ }
9
+
10
+ public var body: some View {
11
+ let params = element.parameters(VStackParameters.self)
12
+
13
+ if params.layout == "flex" {
14
+ flexBody(params: params)
15
+ } else {
16
+ legacyBody(params: params)
17
+ }
18
+ }
19
+
20
+ @ViewBuilder
21
+ private func legacyBody(params: VStackParameters) -> some View {
22
+ let alignmentStr = params.alignment.lowercased()
23
+ let alignment: HorizontalAlignment = switch alignmentStr {
24
+ case "leading": .leading
25
+ case "trailing": .trailing
26
+ case "center": .center
27
+ default: .center
28
+ }
29
+
30
+ // Extract gap from style for legacy mode too
31
+ let anyStyle = element.style?.mapValues { $0.toAny() } ?? [:]
32
+ let (layout, _, _, _) = StyleConverter.convert(anyStyle)
33
+ // spacing prop takes precedence over gap style
34
+ let gap = params.spacing ?? layout.gap ?? 0
35
+
36
+ let hasFillWidth = layout.width == .fill
37
+
38
+ let frameAlignment = Alignment(horizontal: alignment, vertical: .center)
39
+
40
+ VStack(alignment: alignment, spacing: gap) {
41
+ element.children ?? .empty
42
+ }
43
+ .voltraIf(hasFillWidth) { content in
44
+ content.frame(maxWidth: .infinity, alignment: frameAlignment)
45
+ }
46
+ .applyStyle(element.style, contentAlignment: frameAlignment)
47
+ }
48
+
49
+ @ViewBuilder
50
+ private func flexBody(params: VStackParameters) -> some View {
51
+ let alignmentFallback = FlexContainerHelper.verticalAlignmentFallback(params.alignment)
52
+ let values = FlexContainerHelper.parseValues(from: element, alignmentFallback: alignmentFallback)
53
+ // spacing prop takes precedence over gap style
54
+ let spacing = params.spacing ?? values.gap
55
+
56
+ VoltraFlexStackLayout(
57
+ axis: .vertical,
58
+ spacing: spacing,
59
+ alignItems: values.alignItems,
60
+ justifyContent: values.justifyContent,
61
+ containerPadding: values.padding
62
+ ) {
63
+ (element.children ?? .empty)
64
+ .environment(\.isInFlexContainer, true)
65
+ }
66
+ .modifier(FlexContainerStyleModifier(values: values))
67
+ }
68
+ }
@@ -0,0 +1,33 @@
1
+ import SwiftUI
2
+
3
+ public struct VoltraZStack: VoltraView {
4
+ public typealias Parameters = ZStackParameters
5
+
6
+ public let element: VoltraElement
7
+
8
+ public init(_ element: VoltraElement) {
9
+ self.element = element
10
+ }
11
+
12
+ public var body: some View {
13
+ let alignmentStr = params.alignment?.lowercased()
14
+
15
+ let alignment: Alignment = switch alignmentStr {
16
+ case "leading": .leading
17
+ case "trailing": .trailing
18
+ case "top": .top
19
+ case "bottom": .bottom
20
+ case "topleading": .topLeading
21
+ case "toptrailing": .topTrailing
22
+ case "bottomleading": .bottomLeading
23
+ case "bottomtrailing": .bottomTrailing
24
+ case "center": .center
25
+ default: .center
26
+ }
27
+
28
+ ZStack(alignment: alignment) {
29
+ element.children ?? .empty
30
+ }
31
+ .applyStyle(element.style)
32
+ }
33
+ }