@use-voltra/ios-client 1.4.1 → 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,517 @@
1
+ import SwiftUI
2
+
3
+ enum JSColorParser {
4
+ /// Parses Hex, RGB, RGBA, HSL, HSLA, and named color strings into SwiftUI Color.
5
+ static func parse(_ value: Any?) -> Color? {
6
+ guard let string = value as? String else { return nil }
7
+
8
+ // Optimize: standard trim and lowercase
9
+ let trimmed = string.trimmingCharacters(in: .whitespacesAndNewlines).lowercased()
10
+
11
+ if trimmed.isEmpty { return nil }
12
+
13
+ // 1. Hex (with or without #)
14
+ if trimmed.hasPrefix("#") {
15
+ return parseHex(trimmed)
16
+ }
17
+
18
+ // Check for hex without # prefix (6 or 8 hex digits)
19
+ if isHexColor(trimmed) {
20
+ return parseHex("#" + trimmed)
21
+ }
22
+
23
+ // 2. RGB / RGBA
24
+ if trimmed.hasPrefix("rgb") {
25
+ return parseRGB(trimmed)
26
+ }
27
+
28
+ // 3. HSL / HSLA
29
+ if trimmed.hasPrefix("hsl") {
30
+ return parseHSL(trimmed)
31
+ }
32
+
33
+ // 4. Named colors
34
+ if let namedColor = parseNamedColor(trimmed) {
35
+ return namedColor
36
+ }
37
+
38
+ return nil
39
+ }
40
+
41
+ /// Returns true for neutral foreground colors that should follow WidgetKit's
42
+ /// reduced-presentation text color instead of preserving a hard-coded shade.
43
+ static func shouldUsePrimaryColorInReducedPresentation(_ value: Any?) -> Bool {
44
+ guard let components = parseColorComponents(value) else { return false }
45
+ return isNeutralColor(components.red, components.green, components.blue)
46
+ }
47
+
48
+ /// Check if a string is a valid hex color (6 or 8 hex digits)
49
+ private static func isHexColor(_ string: String) -> Bool {
50
+ guard string.count == 6 || string.count == 8 else { return false }
51
+ // Check if all characters are valid hex digits (0-9, a-f)
52
+ let hexChars = CharacterSet(charactersIn: "0123456789abcdef")
53
+ return string.unicodeScalars.allSatisfy { hexChars.contains($0) }
54
+ }
55
+
56
+ private static func parseColorComponents(_ value: Any?) -> (red: Double, green: Double, blue: Double, alpha: Double)? {
57
+ guard let string = value as? String else { return nil }
58
+
59
+ let trimmed = string.trimmingCharacters(in: .whitespacesAndNewlines).lowercased()
60
+ if trimmed.isEmpty { return nil }
61
+
62
+ if trimmed.hasPrefix("#") {
63
+ return parseHexComponents(trimmed)
64
+ }
65
+
66
+ if isHexColor(trimmed) {
67
+ return parseHexComponents("#" + trimmed)
68
+ }
69
+
70
+ if trimmed.hasPrefix("rgb") {
71
+ return parseRGBComponents(trimmed)
72
+ }
73
+
74
+ if trimmed.hasPrefix("hsl") {
75
+ return parseHSLComponents(trimmed)
76
+ }
77
+
78
+ return parseNamedColorComponents(trimmed)
79
+ }
80
+
81
+ private static func isNeutralColor(_ red: Double, _ green: Double, _ blue: Double) -> Bool {
82
+ let maxComponent = max(red, green, blue)
83
+ let minComponent = min(red, green, blue)
84
+ guard maxComponent > 0 else { return true }
85
+
86
+ let saturation = (maxComponent - minComponent) / maxComponent
87
+ return saturation <= 0.2
88
+ }
89
+
90
+ /// Parse named color strings
91
+ private static func parseNamedColor(_ name: String) -> Color? {
92
+ switch name {
93
+ case "red":
94
+ return .red
95
+ case "orange":
96
+ return .orange
97
+ case "yellow":
98
+ return .yellow
99
+ case "green":
100
+ return .green
101
+ case "mint":
102
+ if #available(iOS 15.0, macOS 12.0, tvOS 15.0, watchOS 8.0, *) {
103
+ return .mint
104
+ }
105
+ return .primary
106
+ case "teal":
107
+ if #available(iOS 15.0, macOS 12.0, tvOS 15.0, watchOS 8.0, *) {
108
+ return .teal
109
+ }
110
+ return .primary
111
+ case "cyan":
112
+ if #available(iOS 15.0, macOS 12.0, tvOS 15.0, watchOS 8.0, *) {
113
+ return .cyan
114
+ }
115
+ return .primary
116
+ case "blue":
117
+ return .blue
118
+ case "indigo":
119
+ if #available(iOS 15.0, macOS 12.0, tvOS 15.0, watchOS 8.0, *) {
120
+ return .indigo
121
+ }
122
+ return .primary
123
+ case "purple":
124
+ return .purple
125
+ case "pink":
126
+ return .pink
127
+ case "brown":
128
+ if #available(iOS 15.0, macOS 12.0, tvOS 15.0, watchOS 8.0, *) {
129
+ return .brown
130
+ }
131
+ return .primary
132
+ case "white":
133
+ return .white
134
+ case "gray":
135
+ return .gray
136
+ case "black":
137
+ return .black
138
+ case "clear", "transparent":
139
+ return .clear
140
+ case "primary":
141
+ return .primary
142
+ case "secondary":
143
+ return .secondary
144
+ default:
145
+ return nil
146
+ }
147
+ }
148
+
149
+ private static func parseNamedColorComponents(_ name: String) -> (red: Double, green: Double, blue: Double, alpha: Double)? {
150
+ switch name {
151
+ case "red":
152
+ return (1, 0, 0, 1)
153
+ case "orange":
154
+ return (1, 0.5, 0, 1)
155
+ case "yellow":
156
+ return (1, 1, 0, 1)
157
+ case "green":
158
+ return (0, 1, 0, 1)
159
+ case "mint":
160
+ return (0.62, 0.98, 0.84, 1)
161
+ case "teal":
162
+ return (0, 0.5, 0.5, 1)
163
+ case "cyan":
164
+ return (0, 1, 1, 1)
165
+ case "blue":
166
+ return (0, 0, 1, 1)
167
+ case "indigo":
168
+ return (0.29, 0, 0.51, 1)
169
+ case "purple":
170
+ return (0.5, 0, 0.5, 1)
171
+ case "pink":
172
+ return (1, 0.75, 0.8, 1)
173
+ case "brown":
174
+ return (0.6, 0.4, 0.2, 1)
175
+ case "white":
176
+ return (1, 1, 1, 1)
177
+ case "gray":
178
+ return (0.5, 0.5, 0.5, 1)
179
+ case "black":
180
+ return (0, 0, 0, 1)
181
+ case "clear", "transparent":
182
+ return (0, 0, 0, 0)
183
+ case "primary", "secondary":
184
+ return (0.5, 0.5, 0.5, 1)
185
+ default:
186
+ return nil
187
+ }
188
+ }
189
+
190
+ // MARK: - Hex Parser
191
+
192
+ /// Supports #RGB, #RGBA, #RRGGBB, #RRGGBBAA
193
+ private static func parseHex(_ hex: String) -> Color? {
194
+ guard let parsed = parseHexComponents(hex) else { return nil }
195
+ return Color(.sRGB, red: parsed.red, green: parsed.green, blue: parsed.blue, opacity: parsed.alpha)
196
+ }
197
+
198
+ private static func parseHexComponents(_ hex: String) -> (red: Double, green: Double, blue: Double, alpha: Double)? {
199
+ let hexSanitized = hex.replacingOccurrences(of: "#", with: "")
200
+
201
+ var rgb: UInt64 = 0
202
+ Scanner(string: hexSanitized).scanHexInt64(&rgb)
203
+
204
+ let r, g, b, a: Double
205
+ let length = hexSanitized.count
206
+
207
+ switch length {
208
+ case 3: // #RGB
209
+ r = Double((rgb >> 8) & 0xF) / 15.0
210
+ g = Double((rgb >> 4) & 0xF) / 15.0
211
+ b = Double(rgb & 0xF) / 15.0
212
+ a = 1.0
213
+ case 4: // #RGBA
214
+ r = Double((rgb >> 12) & 0xF) / 15.0
215
+ g = Double((rgb >> 8) & 0xF) / 15.0
216
+ b = Double((rgb >> 4) & 0xF) / 15.0
217
+ a = Double(rgb & 0xF) / 15.0
218
+ case 6: // #RRGGBB
219
+ r = Double((rgb >> 16) & 0xFF) / 255.0
220
+ g = Double((rgb >> 8) & 0xFF) / 255.0
221
+ b = Double(rgb & 0xFF) / 255.0
222
+ a = 1.0
223
+ case 8: // #RRGGBBAA
224
+ r = Double((rgb >> 24) & 0xFF) / 255.0
225
+ g = Double((rgb >> 16) & 0xFF) / 255.0
226
+ b = Double((rgb >> 8) & 0xFF) / 255.0
227
+ a = Double(rgb & 0xFF) / 255.0
228
+ default:
229
+ return nil
230
+ }
231
+
232
+ return (r, g, b, a)
233
+ }
234
+
235
+ // MARK: - RGB Parser
236
+
237
+ /// Supports:
238
+ /// - rgb(255, 0, 0), rgba(255, 0, 0, 0.5)
239
+ /// - rgb(255 0 0 / 80%), rgba(255 0 0 / 0.8)
240
+ private static func parseRGB(_ string: String) -> Color? {
241
+ guard let parsed = parseRGBComponents(string) else { return nil }
242
+
243
+ return Color(.sRGB, red: parsed.red, green: parsed.green, blue: parsed.blue, opacity: parsed.alpha)
244
+ }
245
+
246
+ private static func parseRGBComponents(_ string: String) -> (red: Double, green: Double, blue: Double, alpha: Double)? {
247
+ guard let function = parseFunctionCall(string, allowedNames: ["rgb", "rgba"]) else { return nil }
248
+
249
+ let isRgba = function.name == "rgba"
250
+ let parsed: (r: Double, g: Double, b: Double, a: Double)?
251
+ if function.arguments.contains(",") {
252
+ parsed = parseRGBCommaSyntax(arguments: function.arguments, expectsAlpha: isRgba)
253
+ } else {
254
+ parsed = parseRGBSpaceSyntax(arguments: function.arguments, expectsAlpha: isRgba)
255
+ }
256
+ guard let parsed else { return nil }
257
+
258
+ return (parsed.r, parsed.g, parsed.b, parsed.a)
259
+ }
260
+
261
+ // MARK: - HSL Parser
262
+
263
+ /// Supports:
264
+ /// - hsl(120, 100%, 50%), hsla(120, 100%, 50%, 0.5)
265
+ /// - hsl(120 100% 50% / 30%), hsla(120 100% 50% / 0.3)
266
+ private static func parseHSL(_ string: String) -> Color? {
267
+ guard let parsed = parseHSLComponents(string) else { return nil }
268
+ return Color(.sRGB, red: parsed.red, green: parsed.green, blue: parsed.blue, opacity: parsed.alpha)
269
+ }
270
+
271
+ private static func parseHSLComponents(_ string: String) -> (red: Double, green: Double, blue: Double, alpha: Double)? {
272
+ guard let function = parseFunctionCall(string, allowedNames: ["hsl", "hsla"]) else { return nil }
273
+
274
+ let isHsla = function.name == "hsla"
275
+ let parsed: (h: Double, s: Double, l: Double, a: Double)?
276
+ if function.arguments.contains(",") {
277
+ parsed = parseHSLCommaSyntax(arguments: function.arguments, expectsAlpha: isHsla)
278
+ } else {
279
+ parsed = parseHSLSpaceSyntax(arguments: function.arguments, expectsAlpha: isHsla)
280
+ }
281
+ guard let parsed else { return nil }
282
+
283
+ let (r, g, b) = hslToRgb(h: parsed.h, s: parsed.s, l: parsed.l)
284
+ return (r, g, b, parsed.a)
285
+ }
286
+
287
+ private struct FunctionCall {
288
+ var name: String
289
+ var arguments: String
290
+ }
291
+
292
+ private static func parseFunctionCall(_ input: String, allowedNames: Set<String>) -> FunctionCall? {
293
+ let trimmed = input.trimmingCharacters(in: .whitespacesAndNewlines).lowercased()
294
+ guard let open = trimmed.firstIndex(of: "("), trimmed.hasSuffix(")") else { return nil }
295
+
296
+ let name = String(trimmed[..<open]).trimmingCharacters(in: .whitespacesAndNewlines)
297
+ guard allowedNames.contains(name), !name.isEmpty else { return nil }
298
+
299
+ let argsStart = trimmed.index(after: open)
300
+ let argsEnd = trimmed.index(before: trimmed.endIndex)
301
+ guard argsStart <= argsEnd else { return nil }
302
+
303
+ let arguments = String(trimmed[argsStart ..< argsEnd]).trimmingCharacters(in: .whitespacesAndNewlines)
304
+ guard !arguments.isEmpty else { return nil }
305
+ return FunctionCall(name: name, arguments: arguments)
306
+ }
307
+
308
+ private static func parseRGBCommaSyntax(arguments: String, expectsAlpha: Bool) -> (r: Double, g: Double, b: Double, a: Double)? {
309
+ let parts = splitCommaSeparated(arguments)
310
+ let expected = expectsAlpha ? 4 : 3
311
+ guard parts.count == expected else { return nil }
312
+
313
+ guard
314
+ let r = parseRGBChannel(parts[0]),
315
+ let g = parseRGBChannel(parts[1]),
316
+ let b = parseRGBChannel(parts[2])
317
+ else { return nil }
318
+
319
+ let alpha: Double
320
+ if expectsAlpha {
321
+ guard let parsedAlpha = parseAlpha(parts[3]) else { return nil }
322
+ alpha = parsedAlpha
323
+ } else {
324
+ alpha = 1.0
325
+ }
326
+
327
+ return (r, g, b, alpha)
328
+ }
329
+
330
+ private static func parseRGBSpaceSyntax(arguments: String, expectsAlpha: Bool) -> (r: Double, g: Double, b: Double, a: Double)? {
331
+ let split = splitLeftAndOptionalAlpha(arguments)
332
+ guard let split else { return nil }
333
+ let channels = splitWhitespaceSeparated(split.left)
334
+ guard channels.count == 3 else { return nil }
335
+
336
+ guard
337
+ let r = parseRGBChannel(channels[0]),
338
+ let g = parseRGBChannel(channels[1]),
339
+ let b = parseRGBChannel(channels[2])
340
+ else { return nil }
341
+
342
+ let alpha: Double
343
+ if let alphaToken = split.alpha {
344
+ guard let parsedAlpha = parseAlpha(alphaToken) else { return nil }
345
+ alpha = parsedAlpha
346
+ } else {
347
+ guard !expectsAlpha else { return nil }
348
+ alpha = 1.0
349
+ }
350
+
351
+ return (r, g, b, alpha)
352
+ }
353
+
354
+ private static func parseHSLCommaSyntax(arguments: String, expectsAlpha: Bool) -> (h: Double, s: Double, l: Double, a: Double)? {
355
+ let parts = splitCommaSeparated(arguments)
356
+ let expected = expectsAlpha ? 4 : 3
357
+ guard parts.count == expected else { return nil }
358
+
359
+ guard
360
+ let h = parseHue(parts[0]),
361
+ let s = parsePercentage(parts[1]),
362
+ let l = parsePercentage(parts[2])
363
+ else { return nil }
364
+
365
+ let alpha: Double
366
+ if expectsAlpha {
367
+ guard let parsedAlpha = parseAlpha(parts[3]) else { return nil }
368
+ alpha = parsedAlpha
369
+ } else {
370
+ alpha = 1.0
371
+ }
372
+
373
+ return (h, s, l, alpha)
374
+ }
375
+
376
+ private static func parseHSLSpaceSyntax(arguments: String, expectsAlpha: Bool) -> (h: Double, s: Double, l: Double, a: Double)? {
377
+ let split = splitLeftAndOptionalAlpha(arguments)
378
+ guard let split else { return nil }
379
+ let channels = splitWhitespaceSeparated(split.left)
380
+ guard channels.count == 3 else { return nil }
381
+
382
+ guard
383
+ let h = parseHue(channels[0]),
384
+ let s = parsePercentage(channels[1]),
385
+ let l = parsePercentage(channels[2])
386
+ else { return nil }
387
+
388
+ let alpha: Double
389
+ if let alphaToken = split.alpha {
390
+ guard let parsedAlpha = parseAlpha(alphaToken) else { return nil }
391
+ alpha = parsedAlpha
392
+ } else {
393
+ guard !expectsAlpha else { return nil }
394
+ alpha = 1.0
395
+ }
396
+
397
+ return (h, s, l, alpha)
398
+ }
399
+
400
+ private static func splitCommaSeparated(_ arguments: String) -> [String] {
401
+ let parts = arguments
402
+ .split(separator: ",", omittingEmptySubsequences: false)
403
+ .map { $0.trimmingCharacters(in: .whitespacesAndNewlines) }
404
+ if parts.contains(where: \.isEmpty) {
405
+ return []
406
+ }
407
+ return parts
408
+ }
409
+
410
+ private static func splitWhitespaceSeparated(_ input: String) -> [String] {
411
+ input
412
+ .split { $0.isWhitespace }
413
+ .map(String.init)
414
+ .map { $0.trimmingCharacters(in: .whitespacesAndNewlines) }
415
+ .filter { !$0.isEmpty }
416
+ }
417
+
418
+ private static func splitLeftAndOptionalAlpha(_ arguments: String) -> (left: String, alpha: String?)? {
419
+ let parts = arguments.split(separator: "/", omittingEmptySubsequences: false).map {
420
+ $0.trimmingCharacters(in: .whitespacesAndNewlines)
421
+ }
422
+
423
+ guard (1 ... 2).contains(parts.count) else { return nil }
424
+ guard let left = parts.first, !left.isEmpty else { return nil }
425
+
426
+ if parts.count == 1 {
427
+ return (left, nil)
428
+ }
429
+
430
+ let alpha = parts[1]
431
+ guard !alpha.isEmpty else { return nil }
432
+ return (left, alpha)
433
+ }
434
+
435
+ private static func parseRGBChannel(_ token: String) -> Double? {
436
+ if token.hasSuffix("%") {
437
+ guard let pct = Double(token.dropLast()) else { return nil }
438
+ return clamp01(pct / 100.0)
439
+ }
440
+ guard let value = Double(token) else { return nil }
441
+ return clamp01(value / 255.0)
442
+ }
443
+
444
+ private static func parsePercentage(_ token: String) -> Double? {
445
+ guard token.hasSuffix("%"), let value = Double(token.dropLast()) else { return nil }
446
+ return clamp01(value / 100.0)
447
+ }
448
+
449
+ private static func parseAlpha(_ token: String) -> Double? {
450
+ if token.hasSuffix("%") {
451
+ guard let pct = Double(token.dropLast()) else { return nil }
452
+ return clamp01(pct / 100.0)
453
+ }
454
+ guard let value = Double(token) else { return nil }
455
+ return clamp01(value)
456
+ }
457
+
458
+ private static func parseHue(_ token: String) -> Double? {
459
+ let normalized: Double?
460
+ if token.hasSuffix("deg"), let value = Double(token.dropLast(3)) {
461
+ normalized = value / 360.0
462
+ } else if token.hasSuffix("rad"), let value = Double(token.dropLast(3)) {
463
+ normalized = value / (2 * .pi)
464
+ } else if token.hasSuffix("turn"), let value = Double(token.dropLast(4)) {
465
+ normalized = value
466
+ } else {
467
+ normalized = Double(token).map { $0 / 360.0 }
468
+ }
469
+
470
+ guard let value = normalized else { return nil }
471
+ return normalizeUnit(value)
472
+ }
473
+
474
+ private static func clamp01(_ value: Double) -> Double {
475
+ Swift.max(0, Swift.min(1, value))
476
+ }
477
+
478
+ private static func normalizeUnit(_ value: Double) -> Double {
479
+ var result = value.truncatingRemainder(dividingBy: 1)
480
+ if result < 0 { result += 1 }
481
+ return result
482
+ }
483
+
484
+ /// Convert HSL to RGB
485
+ /// - Parameters:
486
+ /// - h: Hue (0.0 to 1.0)
487
+ /// - s: Saturation (0.0 to 1.0)
488
+ /// - l: Lightness (0.0 to 1.0)
489
+ /// - Returns: RGB tuple with values from 0.0 to 1.0
490
+ private static func hslToRgb(h: Double, s: Double, l: Double) -> (r: Double, g: Double, b: Double) {
491
+ // Achromatic case (no saturation)
492
+ if s == 0 {
493
+ return (l, l, l)
494
+ }
495
+
496
+ let q = l < 0.5 ? l * (1 + s) : l + s - l * s
497
+ let p = 2 * l - q
498
+
499
+ let r = hueToRgb(p: p, q: q, t: h + 1.0 / 3.0)
500
+ let g = hueToRgb(p: p, q: q, t: h)
501
+ let b = hueToRgb(p: p, q: q, t: h - 1.0 / 3.0)
502
+
503
+ return (r, g, b)
504
+ }
505
+
506
+ /// Helper function for HSL to RGB conversion
507
+ private static func hueToRgb(p: Double, q: Double, t: Double) -> Double {
508
+ var t = t
509
+ if t < 0 { t += 1 }
510
+ if t > 1 { t -= 1 }
511
+
512
+ if t < 1.0 / 6.0 { return p + (q - p) * 6 * t }
513
+ if t < 1.0 / 2.0 { return q }
514
+ if t < 2.0 / 3.0 { return p + (q - p) * (2.0 / 3.0 - t) * 6 }
515
+ return p
516
+ }
517
+ }