@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.
- package/README.md +113 -0
- package/Voltra.podspec +28 -0
- package/build/commonjs/VoltraModule.js +13 -0
- package/build/commonjs/VoltraModule.js.map +1 -0
- package/build/commonjs/components/VoltraLiveActivityPreview.js +30 -0
- package/build/commonjs/components/VoltraLiveActivityPreview.js.map +1 -0
- package/build/commonjs/components/VoltraView.js +50 -0
- package/build/commonjs/components/VoltraView.js.map +1 -0
- package/build/commonjs/components/VoltraWidgetPreview.js +58 -0
- package/build/commonjs/components/VoltraWidgetPreview.js.map +1 -0
- package/build/commonjs/events.js +32 -0
- package/build/commonjs/events.js.map +1 -0
- package/build/commonjs/helpers.js +26 -0
- package/build/commonjs/helpers.js.map +1 -0
- package/build/commonjs/index.js +226 -0
- package/build/commonjs/index.js.map +1 -0
- package/build/commonjs/live-activity/api.js +168 -0
- package/build/commonjs/live-activity/api.js.map +1 -0
- package/build/commonjs/logger.js +39 -0
- package/build/commonjs/logger.js.map +1 -0
- package/build/commonjs/native/NativeVoltra.js +15 -0
- package/build/commonjs/native/NativeVoltra.js.map +1 -0
- package/build/commonjs/native/VoltraRNNativeComponent.ts +9 -0
- package/build/commonjs/package.json +1 -0
- package/build/commonjs/preload.js +54 -0
- package/build/commonjs/preload.js.map +1 -0
- package/build/commonjs/types.js +2 -0
- package/build/commonjs/types.js.map +1 -0
- package/build/commonjs/utils/assertRunningOnApple.js +16 -0
- package/build/commonjs/utils/assertRunningOnApple.js.map +1 -0
- package/build/commonjs/utils/helpers.js +19 -0
- package/build/commonjs/utils/helpers.js.map +1 -0
- package/build/commonjs/utils/index.js +28 -0
- package/build/commonjs/utils/index.js.map +1 -0
- package/build/commonjs/utils/useUpdateOnHMR.js +25 -0
- package/build/commonjs/utils/useUpdateOnHMR.js.map +1 -0
- package/build/commonjs/widgets/server-credentials.js +18 -0
- package/build/commonjs/widgets/server-credentials.js.map +1 -0
- package/build/commonjs/widgets/widget-api.js +55 -0
- package/build/commonjs/widgets/widget-api.js.map +1 -0
- package/build/module/VoltraModule.js +4 -0
- package/build/module/VoltraModule.js.map +1 -0
- package/build/module/components/VoltraLiveActivityPreview.js +25 -0
- package/build/module/components/VoltraLiveActivityPreview.js.map +1 -0
- package/build/module/components/VoltraView.js +44 -0
- package/build/module/components/VoltraView.js.map +1 -0
- package/build/module/components/VoltraWidgetPreview.js +53 -0
- package/build/module/components/VoltraWidgetPreview.js.map +1 -0
- package/build/module/events.js +28 -0
- package/build/module/events.js.map +1 -0
- package/build/module/helpers.js +21 -0
- package/build/module/helpers.js.map +1 -0
- package/build/module/index.js +17 -0
- package/build/module/index.js.map +1 -0
- package/build/module/live-activity/api.js +158 -0
- package/build/module/live-activity/api.js.map +1 -0
- package/build/module/logger.js +35 -0
- package/build/module/logger.js.map +1 -0
- package/build/module/native/NativeVoltra.js +11 -0
- package/build/module/native/NativeVoltra.js.map +1 -0
- package/build/module/native/VoltraRNNativeComponent.ts +9 -0
- package/build/module/package.json +1 -0
- package/build/module/preload.js +48 -0
- package/build/module/preload.js.map +1 -0
- package/build/module/types.js +2 -0
- package/build/module/types.js.map +1 -0
- package/build/module/utils/assertRunningOnApple.js +11 -0
- package/build/module/utils/assertRunningOnApple.js.map +1 -0
- package/build/module/utils/helpers.js +4 -0
- package/build/module/utils/helpers.js.map +1 -0
- package/build/module/utils/index.js +5 -0
- package/build/module/utils/index.js.map +1 -0
- package/build/module/utils/useUpdateOnHMR.js +20 -0
- package/build/module/utils/useUpdateOnHMR.js.map +1 -0
- package/build/module/widgets/server-credentials.js +13 -0
- package/build/module/widgets/server-credentials.js.map +1 -0
- package/build/module/widgets/widget-api.js +45 -0
- package/build/module/widgets/widget-api.js.map +1 -0
- package/build/typescript/commonjs/VoltraModule.d.ts +3 -0
- package/build/typescript/commonjs/VoltraModule.d.ts.map +1 -0
- package/build/typescript/commonjs/components/VoltraLiveActivityPreview.d.ts.map +1 -0
- package/build/typescript/commonjs/components/VoltraView.d.ts.map +1 -0
- package/build/typescript/commonjs/components/VoltraWidgetPreview.d.ts.map +1 -0
- package/build/typescript/commonjs/events.d.ts.map +1 -0
- package/build/typescript/commonjs/helpers.d.ts.map +1 -0
- package/build/{types → typescript/commonjs}/index.d.ts +5 -0
- package/build/typescript/commonjs/index.d.ts.map +1 -0
- package/build/typescript/commonjs/live-activity/api.d.ts.map +1 -0
- package/build/typescript/commonjs/logger.d.ts.map +1 -0
- package/build/typescript/commonjs/native/NativeVoltra.d.ts +100 -0
- package/build/typescript/commonjs/native/NativeVoltra.d.ts.map +1 -0
- package/build/typescript/commonjs/native/VoltraRNNativeComponent.d.ts +8 -0
- package/build/typescript/commonjs/native/VoltraRNNativeComponent.d.ts.map +1 -0
- package/build/typescript/commonjs/package.json +1 -0
- package/build/typescript/commonjs/preload.d.ts.map +1 -0
- package/build/typescript/commonjs/types.d.ts.map +1 -0
- package/build/typescript/commonjs/utils/assertRunningOnApple.d.ts.map +1 -0
- package/build/typescript/commonjs/utils/helpers.d.ts.map +1 -0
- package/build/typescript/commonjs/utils/index.d.ts.map +1 -0
- package/build/typescript/commonjs/utils/useUpdateOnHMR.d.ts.map +1 -0
- package/build/typescript/commonjs/widgets/server-credentials.d.ts.map +1 -0
- package/build/typescript/commonjs/widgets/widget-api.d.ts.map +1 -0
- package/build/typescript/module/VoltraModule.d.ts +3 -0
- package/build/typescript/module/VoltraModule.d.ts.map +1 -0
- package/build/typescript/module/components/VoltraLiveActivityPreview.d.ts +7 -0
- package/build/typescript/module/components/VoltraLiveActivityPreview.d.ts.map +1 -0
- package/build/typescript/module/components/VoltraView.d.ts +12 -0
- package/build/typescript/module/components/VoltraView.d.ts.map +1 -0
- package/build/typescript/module/components/VoltraWidgetPreview.d.ts +9 -0
- package/build/typescript/module/components/VoltraWidgetPreview.d.ts.map +1 -0
- package/build/typescript/module/events.d.ts +33 -0
- package/build/typescript/module/events.d.ts.map +1 -0
- package/build/typescript/module/helpers.d.ts +3 -0
- package/build/typescript/module/helpers.d.ts.map +1 -0
- package/build/typescript/module/index.d.ts +18 -0
- package/build/typescript/module/index.d.ts.map +1 -0
- package/build/typescript/module/live-activity/api.d.ts +35 -0
- package/build/typescript/module/live-activity/api.d.ts.map +1 -0
- package/build/typescript/module/logger.d.ts +16 -0
- package/build/typescript/module/logger.d.ts.map +1 -0
- package/build/typescript/module/native/NativeVoltra.d.ts +100 -0
- package/build/typescript/module/native/NativeVoltra.d.ts.map +1 -0
- package/build/typescript/module/native/VoltraRNNativeComponent.d.ts +8 -0
- package/build/typescript/module/native/VoltraRNNativeComponent.d.ts.map +1 -0
- package/build/typescript/module/package.json +1 -0
- package/build/typescript/module/preload.d.ts +6 -0
- package/build/typescript/module/preload.d.ts.map +1 -0
- package/build/typescript/module/types.d.ts +2 -0
- package/build/typescript/module/types.d.ts.map +1 -0
- package/build/typescript/module/utils/assertRunningOnApple.d.ts +2 -0
- package/build/typescript/module/utils/assertRunningOnApple.d.ts.map +1 -0
- package/build/{esm/utils/helpers.js → typescript/module/utils/helpers.d.ts} +1 -1
- package/build/typescript/module/utils/helpers.d.ts.map +1 -0
- package/build/{esm/utils/index.js → typescript/module/utils/index.d.ts} +1 -1
- package/build/typescript/module/utils/index.d.ts.map +1 -0
- package/build/typescript/module/utils/useUpdateOnHMR.d.ts +5 -0
- package/build/typescript/module/utils/useUpdateOnHMR.d.ts.map +1 -0
- package/build/typescript/module/widgets/server-credentials.d.ts +5 -0
- package/build/typescript/module/widgets/server-credentials.d.ts.map +1 -0
- package/build/typescript/module/widgets/widget-api.d.ts +11 -0
- package/build/typescript/module/widgets/widget-api.d.ts.map +1 -0
- package/expo-plugin/app.plugin.js +3 -0
- package/expo-plugin/build/cjs/constants.js +23 -0
- package/expo-plugin/build/cjs/constants.js.map +1 -0
- package/expo-plugin/build/cjs/index.js +51 -0
- package/expo-plugin/build/cjs/index.js.map +1 -0
- package/expo-plugin/build/cjs/ios/eas.js +28 -0
- package/expo-plugin/build/cjs/ios/eas.js.map +1 -0
- package/expo-plugin/build/cjs/ios/entitlements.js +46 -0
- package/expo-plugin/build/cjs/ios/entitlements.js.map +1 -0
- package/expo-plugin/build/cjs/ios/index.js +39 -0
- package/expo-plugin/build/cjs/ios/index.js.map +1 -0
- package/expo-plugin/build/cjs/ios/infoPlist.js +51 -0
- package/expo-plugin/build/cjs/ios/infoPlist.js.map +1 -0
- package/expo-plugin/build/cjs/ios/pushNotifications.js +22 -0
- package/expo-plugin/build/cjs/ios/pushNotifications.js.map +1 -0
- package/expo-plugin/build/cjs/ios-widget/eas.js +66 -0
- package/expo-plugin/build/cjs/ios-widget/eas.js.map +1 -0
- package/expo-plugin/build/cjs/ios-widget/files/assets.js +199 -0
- package/expo-plugin/build/cjs/ios-widget/files/assets.js.map +1 -0
- package/expo-plugin/build/cjs/ios-widget/files/entitlements.js +77 -0
- package/expo-plugin/build/cjs/ios-widget/files/entitlements.js.map +1 -0
- package/expo-plugin/build/cjs/ios-widget/files/index.js +92 -0
- package/expo-plugin/build/cjs/ios-widget/files/index.js.map +1 -0
- package/expo-plugin/build/cjs/ios-widget/files/infoPlist.js +91 -0
- package/expo-plugin/build/cjs/ios-widget/files/infoPlist.js.map +1 -0
- package/expo-plugin/build/cjs/ios-widget/files/swift.js +443 -0
- package/expo-plugin/build/cjs/ios-widget/files/swift.js.map +1 -0
- package/expo-plugin/build/cjs/ios-widget/fonts.js +151 -0
- package/expo-plugin/build/cjs/ios-widget/fonts.js.map +1 -0
- package/expo-plugin/build/cjs/ios-widget/index.js +46 -0
- package/expo-plugin/build/cjs/ios-widget/index.js.map +1 -0
- package/expo-plugin/build/cjs/ios-widget/podfile.js +41 -0
- package/expo-plugin/build/cjs/ios-widget/podfile.js.map +1 -0
- package/expo-plugin/build/cjs/ios-widget/widgetPlist.js +99 -0
- package/expo-plugin/build/cjs/ios-widget/widgetPlist.js.map +1 -0
- package/expo-plugin/build/cjs/ios-widget/xcode/buildPhases.js +247 -0
- package/expo-plugin/build/cjs/ios-widget/xcode/buildPhases.js.map +1 -0
- package/expo-plugin/build/cjs/ios-widget/xcode/configurationList.js +91 -0
- package/expo-plugin/build/cjs/ios-widget/xcode/configurationList.js.map +1 -0
- package/expo-plugin/build/cjs/ios-widget/xcode/groups.js +79 -0
- package/expo-plugin/build/cjs/ios-widget/xcode/groups.js.map +1 -0
- package/expo-plugin/build/cjs/ios-widget/xcode/index.js +155 -0
- package/expo-plugin/build/cjs/ios-widget/xcode/index.js.map +1 -0
- package/expo-plugin/build/cjs/ios-widget/xcode/mainAppSettings.js +71 -0
- package/expo-plugin/build/cjs/ios-widget/xcode/mainAppSettings.js.map +1 -0
- package/expo-plugin/build/cjs/ios-widget/xcode/productFile.js +74 -0
- package/expo-plugin/build/cjs/ios-widget/xcode/productFile.js.map +1 -0
- package/expo-plugin/build/cjs/ios-widget/xcode/target.js +113 -0
- package/expo-plugin/build/cjs/ios-widget/xcode/target.js.map +1 -0
- package/expo-plugin/build/cjs/utils/fileDiscovery.js +120 -0
- package/expo-plugin/build/cjs/utils/fileDiscovery.js.map +1 -0
- package/expo-plugin/build/cjs/utils/urlScheme.js +40 -0
- package/expo-plugin/build/cjs/utils/urlScheme.js.map +1 -0
- package/expo-plugin/build/cjs/validation.js +55 -0
- package/expo-plugin/build/cjs/validation.js.map +1 -0
- package/expo-plugin/build/esm/constants.js +20 -0
- package/expo-plugin/build/esm/constants.js.map +1 -0
- package/expo-plugin/build/esm/index.js +49 -0
- package/expo-plugin/build/esm/index.js.map +1 -0
- package/expo-plugin/build/esm/ios/eas.js +24 -0
- package/expo-plugin/build/esm/ios/eas.js.map +1 -0
- package/expo-plugin/build/esm/ios/entitlements.js +42 -0
- package/expo-plugin/build/esm/ios/entitlements.js.map +1 -0
- package/expo-plugin/build/esm/ios/index.js +34 -0
- package/expo-plugin/build/esm/ios/index.js.map +1 -0
- package/expo-plugin/build/esm/ios/infoPlist.js +47 -0
- package/expo-plugin/build/esm/ios/infoPlist.js.map +1 -0
- package/expo-plugin/build/esm/ios/pushNotifications.js +18 -0
- package/expo-plugin/build/esm/ios/pushNotifications.js.map +1 -0
- package/expo-plugin/build/esm/ios-widget/eas.js +62 -0
- package/expo-plugin/build/esm/ios-widget/eas.js.map +1 -0
- package/expo-plugin/build/esm/ios-widget/files/assets.js +163 -0
- package/expo-plugin/build/esm/ios-widget/files/assets.js.map +1 -0
- package/expo-plugin/build/esm/ios-widget/files/entitlements.js +37 -0
- package/expo-plugin/build/esm/ios-widget/files/entitlements.js.map +1 -0
- package/expo-plugin/build/esm/ios-widget/files/index.js +55 -0
- package/expo-plugin/build/esm/ios-widget/files/index.js.map +1 -0
- package/expo-plugin/build/esm/ios-widget/files/infoPlist.js +55 -0
- package/expo-plugin/build/esm/ios-widget/files/infoPlist.js.map +1 -0
- package/expo-plugin/build/esm/ios-widget/files/swift.js +403 -0
- package/expo-plugin/build/esm/ios-widget/files/swift.js.map +1 -0
- package/expo-plugin/build/esm/ios-widget/fonts.js +111 -0
- package/expo-plugin/build/esm/ios-widget/fonts.js.map +1 -0
- package/expo-plugin/build/esm/ios-widget/index.js +42 -0
- package/expo-plugin/build/esm/ios-widget/index.js.map +1 -0
- package/expo-plugin/build/esm/ios-widget/podfile.js +37 -0
- package/expo-plugin/build/esm/ios-widget/podfile.js.map +1 -0
- package/expo-plugin/build/esm/ios-widget/widgetPlist.js +92 -0
- package/expo-plugin/build/esm/ios-widget/widgetPlist.js.map +1 -0
- package/expo-plugin/build/esm/ios-widget/xcode/buildPhases.js +210 -0
- package/expo-plugin/build/esm/ios-widget/xcode/buildPhases.js.map +1 -0
- package/expo-plugin/build/esm/ios-widget/xcode/configurationList.js +87 -0
- package/expo-plugin/build/esm/ios-widget/xcode/configurationList.js.map +1 -0
- package/expo-plugin/build/esm/ios-widget/xcode/groups.js +75 -0
- package/expo-plugin/build/esm/ios-widget/xcode/groups.js.map +1 -0
- package/expo-plugin/build/esm/ios-widget/xcode/index.js +118 -0
- package/expo-plugin/build/esm/ios-widget/xcode/index.js.map +1 -0
- package/expo-plugin/build/esm/ios-widget/xcode/mainAppSettings.js +68 -0
- package/expo-plugin/build/esm/ios-widget/xcode/mainAppSettings.js.map +1 -0
- package/expo-plugin/build/esm/ios-widget/xcode/productFile.js +70 -0
- package/expo-plugin/build/esm/ios-widget/xcode/productFile.js.map +1 -0
- package/expo-plugin/build/esm/ios-widget/xcode/target.js +108 -0
- package/expo-plugin/build/esm/ios-widget/xcode/target.js.map +1 -0
- package/expo-plugin/build/esm/utils/fileDiscovery.js +83 -0
- package/expo-plugin/build/esm/utils/fileDiscovery.js.map +1 -0
- package/expo-plugin/build/esm/utils/urlScheme.js +37 -0
- package/expo-plugin/build/esm/utils/urlScheme.js.map +1 -0
- package/expo-plugin/build/esm/validation.js +51 -0
- package/expo-plugin/build/esm/validation.js.map +1 -0
- package/expo-plugin/build/types/constants.d.ts +13 -0
- package/expo-plugin/build/types/constants.d.ts.map +1 -0
- package/expo-plugin/build/types/index.d.ts +10 -0
- package/expo-plugin/build/types/index.d.ts.map +1 -0
- package/expo-plugin/build/types/ios/eas.d.ts +12 -0
- package/expo-plugin/build/types/ios/eas.d.ts.map +1 -0
- package/expo-plugin/build/types/ios/entitlements.d.ts +14 -0
- package/expo-plugin/build/types/ios/entitlements.d.ts.map +1 -0
- package/expo-plugin/build/types/ios/index.d.ts +19 -0
- package/expo-plugin/build/types/ios/index.d.ts.map +1 -0
- package/expo-plugin/build/types/ios/infoPlist.d.ts +21 -0
- package/expo-plugin/build/types/ios/infoPlist.d.ts.map +1 -0
- package/expo-plugin/build/types/ios/pushNotifications.d.ts +10 -0
- package/expo-plugin/build/types/ios/pushNotifications.d.ts.map +1 -0
- package/expo-plugin/build/types/ios-widget/eas.d.ts +15 -0
- package/expo-plugin/build/types/ios-widget/eas.d.ts.map +1 -0
- package/expo-plugin/build/types/ios-widget/files/assets.d.ts +13 -0
- package/expo-plugin/build/types/ios-widget/files/assets.d.ts.map +1 -0
- package/expo-plugin/build/types/ios-widget/files/entitlements.d.ts +17 -0
- package/expo-plugin/build/types/ios-widget/files/entitlements.d.ts.map +1 -0
- package/expo-plugin/build/types/ios-widget/files/index.d.ts +24 -0
- package/expo-plugin/build/types/ios-widget/files/index.d.ts.map +1 -0
- package/expo-plugin/build/types/ios-widget/files/infoPlist.d.ts +10 -0
- package/expo-plugin/build/types/ios-widget/files/infoPlist.d.ts.map +1 -0
- package/expo-plugin/build/types/ios-widget/files/swift.d.ts +24 -0
- package/expo-plugin/build/types/ios-widget/files/swift.d.ts.map +1 -0
- package/expo-plugin/build/types/ios-widget/fonts.d.ts +22 -0
- package/expo-plugin/build/types/ios-widget/fonts.d.ts.map +1 -0
- package/expo-plugin/build/types/ios-widget/index.d.ts +31 -0
- package/expo-plugin/build/types/ios-widget/index.d.ts.map +1 -0
- package/expo-plugin/build/types/ios-widget/podfile.d.ts +9 -0
- package/expo-plugin/build/types/ios-widget/podfile.d.ts.map +1 -0
- package/expo-plugin/build/types/ios-widget/widgetPlist.d.ts +20 -0
- package/expo-plugin/build/types/ios-widget/widgetPlist.d.ts.map +1 -0
- package/expo-plugin/build/types/ios-widget/xcode/buildPhases.d.ts +25 -0
- package/expo-plugin/build/types/ios-widget/xcode/buildPhases.d.ts.map +1 -0
- package/expo-plugin/build/types/ios-widget/xcode/configurationList.d.ts +20 -0
- package/expo-plugin/build/types/ios-widget/xcode/configurationList.d.ts.map +1 -0
- package/expo-plugin/build/types/ios-widget/xcode/groups.d.ts +15 -0
- package/expo-plugin/build/types/ios-widget/xcode/groups.d.ts.map +1 -0
- package/expo-plugin/build/types/ios-widget/xcode/index.d.ts +20 -0
- package/expo-plugin/build/types/ios-widget/xcode/index.d.ts.map +1 -0
- package/expo-plugin/build/types/ios-widget/xcode/mainAppSettings.d.ts +15 -0
- package/expo-plugin/build/types/ios-widget/xcode/mainAppSettings.d.ts.map +1 -0
- package/expo-plugin/build/types/ios-widget/xcode/productFile.d.ts +14 -0
- package/expo-plugin/build/types/ios-widget/xcode/productFile.d.ts.map +1 -0
- package/expo-plugin/build/types/ios-widget/xcode/target.d.ts +42 -0
- package/expo-plugin/build/types/ios-widget/xcode/target.d.ts.map +1 -0
- package/expo-plugin/build/types/types.d.ts +74 -0
- package/expo-plugin/build/types/types.d.ts.map +1 -0
- package/expo-plugin/build/types/utils/fileDiscovery.d.ts +15 -0
- package/expo-plugin/build/types/utils/fileDiscovery.d.ts.map +1 -0
- package/expo-plugin/build/types/utils/urlScheme.d.ts +10 -0
- package/expo-plugin/build/types/utils/urlScheme.d.ts.map +1 -0
- package/expo-plugin/build/types/validation.d.ts +4 -0
- package/expo-plugin/build/types/validation.d.ts.map +1 -0
- package/expo-plugin/jest.config.js +18 -0
- package/expo-plugin/src/constants.ts +25 -0
- package/expo-plugin/src/index.ts +72 -0
- package/expo-plugin/src/ios/eas.ts +33 -0
- package/expo-plugin/src/ios/entitlements.ts +59 -0
- package/expo-plugin/src/ios/index.ts +47 -0
- package/expo-plugin/src/ios/infoPlist.ts +63 -0
- package/expo-plugin/src/ios/pushNotifications.ts +22 -0
- package/expo-plugin/src/ios-widget/eas.ts +79 -0
- package/expo-plugin/src/ios-widget/files/assets.ts +201 -0
- package/expo-plugin/src/ios-widget/files/entitlements.ts +48 -0
- package/expo-plugin/src/ios-widget/files/index.ts +74 -0
- package/expo-plugin/src/ios-widget/files/infoPlist.ts +57 -0
- package/expo-plugin/src/ios-widget/files/swift.node.test.ts +22 -0
- package/expo-plugin/src/ios-widget/files/swift.ts +476 -0
- package/expo-plugin/src/ios-widget/fonts.ts +132 -0
- package/expo-plugin/src/ios-widget/index.ts +73 -0
- package/expo-plugin/src/ios-widget/podfile.ts +44 -0
- package/expo-plugin/src/ios-widget/widgetPlist.ts +115 -0
- package/expo-plugin/src/ios-widget/xcode/buildPhases.ts +301 -0
- package/expo-plugin/src/ios-widget/xcode/configurationList.ts +127 -0
- package/expo-plugin/src/ios-widget/xcode/groups.ts +101 -0
- package/expo-plugin/src/ios-widget/xcode/index.ts +149 -0
- package/expo-plugin/src/ios-widget/xcode/mainAppSettings.ts +95 -0
- package/expo-plugin/src/ios-widget/xcode/productFile.ts +91 -0
- package/expo-plugin/src/ios-widget/xcode/target.ts +148 -0
- package/expo-plugin/src/types.ts +89 -0
- package/expo-plugin/src/utils/fileDiscovery.ts +96 -0
- package/expo-plugin/src/utils/urlScheme.ts +45 -0
- package/expo-plugin/src/validation.node.test.ts +19 -0
- package/expo-plugin/src/validation.ts +63 -0
- package/expo-plugin/tsconfig.base.json +17 -0
- package/expo-plugin/tsconfig.cjs.json +9 -0
- package/expo-plugin/tsconfig.esm.json +9 -0
- package/expo-plugin/tsconfig.jest.json +8 -0
- package/expo-plugin/tsconfig.typecheck.json +12 -0
- package/expo-plugin/tsconfig.types.json +10 -0
- package/ios/Package.swift +68 -0
- package/ios/Tests/JSGradientParserTests.swift +201 -0
- package/ios/Tests/VoltraSharedTests/SmokeTests.swift +8 -0
- package/ios/VoltraWidget.podspec +30 -0
- package/ios/app/NativeVoltra.h +5 -0
- package/ios/app/NativeVoltra.mm +211 -0
- package/ios/app/VoltraActivity.swift +5 -0
- package/ios/app/VoltraImagePreload.swift +154 -0
- package/ios/app/VoltraLiveActivityManager.swift +228 -0
- package/ios/app/VoltraLiveActivityService.swift +306 -0
- package/ios/app/VoltraModule.swift +215 -0
- package/ios/app/VoltraModuleImpl.swift +331 -0
- package/ios/app/VoltraOptions.swift +27 -0
- package/ios/app/VoltraViewComponentView.h +10 -0
- package/ios/app/VoltraViewComponentView.mm +67 -0
- package/ios/app/VoltraViewRoot.swift +63 -0
- package/ios/app/VoltraWidgetService.swift +154 -0
- package/ios/shared/BrotliCompression.swift +81 -0
- package/ios/shared/ComponentTypeID.swift +117 -0
- package/ios/shared/Data+hexString.swift +8 -0
- package/ios/shared/Date+toTimerInterval.swift +25 -0
- package/ios/shared/JSONValue.swift +128 -0
- package/ios/shared/ShortNames.swift +180 -0
- package/ios/shared/VoltraAttributes.swift +58 -0
- package/ios/shared/VoltraConfig.swift +18 -0
- package/ios/shared/VoltraConstants.swift +45 -0
- package/ios/shared/VoltraElement.swift +153 -0
- package/ios/shared/VoltraEvent.swift +72 -0
- package/ios/shared/VoltraEventBus.swift +80 -0
- package/ios/shared/VoltraImageStore.swift +119 -0
- package/ios/shared/VoltraInitialStateLocale.swift +54 -0
- package/ios/shared/VoltraInteractionIntent.swift +39 -0
- package/ios/shared/VoltraKeychainHelper.swift +178 -0
- package/ios/shared/VoltraLiveActivityPayload.swift +113 -0
- package/ios/shared/VoltraLogger.swift +30 -0
- package/ios/shared/VoltraNode.swift +194 -0
- package/ios/shared/VoltraPayloadMigrator.swift +63 -0
- package/ios/shared/VoltraPersistentEventQueue.swift +67 -0
- package/ios/shared/VoltraRefreshIntent.swift +29 -0
- package/ios/shared/VoltraRegion.swift +37 -0
- package/ios/shared/VoltraWidgetDefaults.swift +114 -0
- package/ios/shared/VoltraWidgetServerFetcher.swift +166 -0
- package/ios/target/VoltraHomeWidget.swift +508 -0
- package/ios/target/VoltraWidget.swift +158 -0
- package/ios/ui/Extensions/View.modifiers.swift +28 -0
- package/ios/ui/Extensions/VoltraNode+Parameters.swift +18 -0
- package/ios/ui/Generated/Parameters/ButtonParameters.swift +15 -0
- package/ios/ui/Generated/Parameters/ChartParameters.swift +33 -0
- package/ios/ui/Generated/Parameters/CircularProgressViewParameters.swift +59 -0
- package/ios/ui/Generated/Parameters/ComponentParameters.swift +12 -0
- package/ios/ui/Generated/Parameters/DividerParameters.swift +12 -0
- package/ios/ui/Generated/Parameters/GaugeParameters.swift +54 -0
- package/ios/ui/Generated/Parameters/GlassContainerParameters.swift +15 -0
- package/ios/ui/Generated/Parameters/GroupBoxParameters.swift +12 -0
- package/ios/ui/Generated/Parameters/HStackParameters.swift +34 -0
- package/ios/ui/Generated/Parameters/ImageParameters.swift +29 -0
- package/ios/ui/Generated/Parameters/LabelParameters.swift +18 -0
- package/ios/ui/Generated/Parameters/LinearGradientParameters.swift +27 -0
- package/ios/ui/Generated/Parameters/LinearProgressViewParameters.swift +64 -0
- package/ios/ui/Generated/Parameters/LinkParameters.swift +15 -0
- package/ios/ui/Generated/Parameters/MaskParameters.swift +12 -0
- package/ios/ui/Generated/Parameters/SpacerParameters.swift +15 -0
- package/ios/ui/Generated/Parameters/SymbolParameters.swift +59 -0
- package/ios/ui/Generated/Parameters/TextParameters.swift +18 -0
- package/ios/ui/Generated/Parameters/TimerParameters.swift +54 -0
- package/ios/ui/Generated/Parameters/ToggleParameters.swift +24 -0
- package/ios/ui/Generated/Parameters/VStackParameters.swift +34 -0
- package/ios/ui/Generated/Parameters/ViewParameters.swift +12 -0
- package/ios/ui/Generated/Parameters/ZStackParameters.swift +15 -0
- package/ios/ui/Helpers/VoltraDeepLinkResolver.swift +43 -0
- package/ios/ui/Helpers/VoltraProgressDriver.swift +52 -0
- package/ios/ui/Layout/FlexContainerHelper.swift +114 -0
- package/ios/ui/Layout/VoltraFlexStackLayout.swift +417 -0
- package/ios/ui/Protocols/VoltraView.swift +29 -0
- package/ios/ui/Style/BackgroundValue.swift +27 -0
- package/ios/ui/Style/CompositeStyle.swift +81 -0
- package/ios/ui/Style/DecorationStyle.swift +207 -0
- package/ios/ui/Style/FlexEnvironment.swift +35 -0
- package/ios/ui/Style/FontVariant.swift +4 -0
- package/ios/ui/Style/GlassEffect.swift +6 -0
- package/ios/ui/Style/JSColorParser.swift +517 -0
- package/ios/ui/Style/JSGradientParser.swift +674 -0
- package/ios/ui/Style/JSStyleParser.swift +223 -0
- package/ios/ui/Style/LayoutStyle.swift +184 -0
- package/ios/ui/Style/Overflow.swift +4 -0
- package/ios/ui/Style/RenderingStyle.swift +33 -0
- package/ios/ui/Style/StyleConverter.swift +202 -0
- package/ios/ui/Style/TextDecoration.swift +6 -0
- package/ios/ui/Style/TextStyle.swift +50 -0
- package/ios/ui/Style/View+applyStyle.swift +38 -0
- package/ios/ui/Views/VoltraButton.swift +57 -0
- package/ios/ui/Views/VoltraChart.swift +840 -0
- package/ios/ui/Views/VoltraCircularProgressView.swift +103 -0
- package/ios/ui/Views/VoltraDivider.swift +16 -0
- package/ios/ui/Views/VoltraFlexView.swift +33 -0
- package/ios/ui/Views/VoltraGauge.swift +65 -0
- package/ios/ui/Views/VoltraGlassContainer.swift +29 -0
- package/ios/ui/Views/VoltraGroupBox.swift +26 -0
- package/ios/ui/Views/VoltraHStack.swift +70 -0
- package/ios/ui/Views/VoltraImage.swift +109 -0
- package/ios/ui/Views/VoltraLabel.swift +24 -0
- package/ios/ui/Views/VoltraLinearGradient.swift +115 -0
- package/ios/ui/Views/VoltraLinearProgressView.swift +118 -0
- package/ios/ui/Views/VoltraLink.swift +25 -0
- package/ios/ui/Views/VoltraMask.swift +23 -0
- package/ios/ui/Views/VoltraSpacer.swift +16 -0
- package/ios/ui/Views/VoltraSymbol.swift +160 -0
- package/ios/ui/Views/VoltraText.swift +87 -0
- package/ios/ui/Views/VoltraTimer.swift +131 -0
- package/ios/ui/Views/VoltraToggle.swift +39 -0
- package/ios/ui/Views/VoltraVStack.swift +68 -0
- package/ios/ui/Views/VoltraZStack.swift +33 -0
- package/ios/ui/Voltra.swift +86 -0
- package/package.json +105 -19
- package/src/VoltraModule.ts +2 -0
- package/src/components/VoltraLiveActivityPreview.tsx +29 -0
- package/src/components/VoltraView.tsx +49 -0
- package/src/components/VoltraWidgetPreview.tsx +38 -0
- package/src/events.ts +70 -0
- package/src/helpers.ts +21 -0
- package/src/index.ts +52 -0
- package/src/live-activity/api.ts +224 -0
- package/src/logger.ts +35 -0
- package/src/native/NativeVoltra.ts +118 -0
- package/src/native/VoltraRNNativeComponent.ts +9 -0
- package/src/preload.ts +50 -0
- package/src/types.ts +12 -0
- package/src/utils/assertRunningOnApple.ts +10 -0
- package/src/utils/helpers.ts +1 -0
- package/src/utils/index.ts +2 -0
- package/src/utils/useUpdateOnHMR.ts +25 -0
- package/src/widgets/server-credentials.ts +16 -0
- package/src/widgets/widget-api.ts +65 -0
- package/build/cjs/VoltraModule.js +0 -6
- package/build/cjs/VoltraModule.js.map +0 -1
- package/build/cjs/components/VoltraLiveActivityPreview.js +0 -20
- package/build/cjs/components/VoltraLiveActivityPreview.js.map +0 -1
- package/build/cjs/components/VoltraView.js +0 -37
- package/build/cjs/components/VoltraView.js.map +0 -1
- package/build/cjs/components/VoltraWidgetPreview.js +0 -26
- package/build/cjs/components/VoltraWidgetPreview.js.map +0 -1
- package/build/cjs/events.js +0 -19
- package/build/cjs/events.js.map +0 -1
- package/build/cjs/helpers.js +0 -30
- package/build/cjs/helpers.js.map +0 -1
- package/build/cjs/index.js +0 -49
- package/build/cjs/index.js.map +0 -1
- package/build/cjs/live-activity/api.js +0 -158
- package/build/cjs/live-activity/api.js.map +0 -1
- package/build/cjs/logger.js +0 -36
- package/build/cjs/logger.js.map +0 -1
- package/build/cjs/preload.js +0 -54
- package/build/cjs/preload.js.map +0 -1
- package/build/cjs/utils/assertRunningOnApple.js +0 -13
- package/build/cjs/utils/assertRunningOnApple.js.map +0 -1
- package/build/cjs/utils/helpers.js +0 -7
- package/build/cjs/utils/helpers.js.map +0 -1
- package/build/cjs/utils/index.js +0 -19
- package/build/cjs/utils/index.js.map +0 -1
- package/build/cjs/utils/useUpdateOnHMR.js +0 -22
- package/build/cjs/utils/useUpdateOnHMR.js.map +0 -1
- package/build/cjs/widgets/server-credentials.js +0 -18
- package/build/cjs/widgets/server-credentials.js.map +0 -1
- package/build/cjs/widgets/widget-api.js +0 -59
- package/build/cjs/widgets/widget-api.js.map +0 -1
- package/build/esm/VoltraModule.js +0 -4
- package/build/esm/VoltraModule.js.map +0 -1
- package/build/esm/components/VoltraLiveActivityPreview.js +0 -17
- package/build/esm/components/VoltraLiveActivityPreview.js.map +0 -1
- package/build/esm/components/VoltraView.js +0 -34
- package/build/esm/components/VoltraView.js.map +0 -1
- package/build/esm/components/VoltraWidgetPreview.js +0 -23
- package/build/esm/components/VoltraWidgetPreview.js.map +0 -1
- package/build/esm/events.js +0 -13
- package/build/esm/events.js.map +0 -1
- package/build/esm/helpers.js +0 -23
- package/build/esm/helpers.js.map +0 -1
- package/build/esm/index.js +0 -10
- package/build/esm/index.js.map +0 -1
- package/build/esm/live-activity/api.js +0 -146
- package/build/esm/live-activity/api.js.map +0 -1
- package/build/esm/logger.js +0 -33
- package/build/esm/logger.js.map +0 -1
- package/build/esm/preload.js +0 -46
- package/build/esm/preload.js.map +0 -1
- package/build/esm/utils/assertRunningOnApple.js +0 -9
- package/build/esm/utils/assertRunningOnApple.js.map +0 -1
- package/build/esm/utils/helpers.js.map +0 -1
- package/build/esm/utils/index.js.map +0 -1
- package/build/esm/utils/useUpdateOnHMR.js +0 -18
- package/build/esm/utils/useUpdateOnHMR.js.map +0 -1
- package/build/esm/widgets/server-credentials.js +0 -11
- package/build/esm/widgets/server-credentials.js.map +0 -1
- package/build/esm/widgets/widget-api.js +0 -47
- package/build/esm/widgets/widget-api.js.map +0 -1
- package/build/types/VoltraModule.d.ts +0 -44
- package/build/types/VoltraModule.d.ts.map +0 -1
- package/build/types/components/VoltraLiveActivityPreview.d.ts.map +0 -1
- package/build/types/components/VoltraView.d.ts.map +0 -1
- package/build/types/components/VoltraWidgetPreview.d.ts.map +0 -1
- package/build/types/events.d.ts.map +0 -1
- package/build/types/helpers.d.ts.map +0 -1
- package/build/types/index.d.ts.map +0 -1
- package/build/types/live-activity/api.d.ts.map +0 -1
- package/build/types/logger.d.ts.map +0 -1
- package/build/types/preload.d.ts.map +0 -1
- package/build/types/types.d.ts.map +0 -1
- package/build/types/utils/assertRunningOnApple.d.ts.map +0 -1
- package/build/types/utils/helpers.d.ts.map +0 -1
- package/build/types/utils/index.d.ts.map +0 -1
- package/build/types/utils/useUpdateOnHMR.d.ts.map +0 -1
- package/build/types/widgets/server-credentials.d.ts.map +0 -1
- package/build/types/widgets/widget-api.d.ts.map +0 -1
- /package/build/{types → typescript/commonjs}/components/VoltraLiveActivityPreview.d.ts +0 -0
- /package/build/{types → typescript/commonjs}/components/VoltraView.d.ts +0 -0
- /package/build/{types → typescript/commonjs}/components/VoltraWidgetPreview.d.ts +0 -0
- /package/build/{types → typescript/commonjs}/events.d.ts +0 -0
- /package/build/{types → typescript/commonjs}/helpers.d.ts +0 -0
- /package/build/{types → typescript/commonjs}/live-activity/api.d.ts +0 -0
- /package/build/{types → typescript/commonjs}/logger.d.ts +0 -0
- /package/build/{types → typescript/commonjs}/preload.d.ts +0 -0
- /package/build/{types → typescript/commonjs}/types.d.ts +0 -0
- /package/build/{types → typescript/commonjs}/utils/assertRunningOnApple.d.ts +0 -0
- /package/build/{types → typescript/commonjs}/utils/helpers.d.ts +0 -0
- /package/build/{types → typescript/commonjs}/utils/index.d.ts +0 -0
- /package/build/{types → typescript/commonjs}/utils/useUpdateOnHMR.d.ts +0 -0
- /package/build/{types → typescript/commonjs}/widgets/server-credentials.d.ts +0 -0
- /package/build/{types → typescript/commonjs}/widgets/widget-api.d.ts +0 -0
- /package/{build → expo-plugin/build}/cjs/package.json +0 -0
- /package/{build → expo-plugin/build}/cjs/types.js +0 -0
- /package/{build → expo-plugin/build}/cjs/types.js.map +0 -0
- /package/{build → expo-plugin/build}/esm/package.json +0 -0
- /package/{build → expo-plugin/build}/esm/types.js +0 -0
- /package/{build → expo-plugin/build}/esm/types.js.map +0 -0
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
import SwiftUI
|
|
2
|
+
|
|
3
|
+
enum JSStyleParser {
|
|
4
|
+
static func number(_ value: Any?) -> CGFloat? {
|
|
5
|
+
if let v = value as? CGFloat { return v }
|
|
6
|
+
if let v = value as? Double { return CGFloat(v) }
|
|
7
|
+
if let v = value as? Int { return CGFloat(v) }
|
|
8
|
+
// Handle "20.5" strings if necessary, though rarer in raw JSON objects
|
|
9
|
+
return nil
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
static func sizeValue(_ value: Any?) -> SizeValue? {
|
|
13
|
+
// Numeric → Fixed
|
|
14
|
+
if let n = number(value) { return .fixed(n) }
|
|
15
|
+
// String → Fill / Wrap / try numeric
|
|
16
|
+
guard let str = value as? String else { return nil }
|
|
17
|
+
switch str {
|
|
18
|
+
case "100%": return .fill
|
|
19
|
+
case "auto": return .wrap
|
|
20
|
+
default:
|
|
21
|
+
// Try parsing as numeric string
|
|
22
|
+
if let n = Double(str) { return .fixed(CGFloat(n)) }
|
|
23
|
+
return nil
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
static func size(_ value: Any?) -> CGSize? {
|
|
28
|
+
guard let dict = value as? [String: Any] else { return nil }
|
|
29
|
+
let w = number(dict["width"]) ?? 0
|
|
30
|
+
let h = number(dict["height"]) ?? 0
|
|
31
|
+
return CGSize(width: w, height: h)
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
static func color(_ value: Any?) -> Color? {
|
|
35
|
+
JSColorParser.parse(value)
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
static func background(_ value: Any?) -> BackgroundValue? {
|
|
39
|
+
guard let string = value as? String else { return nil }
|
|
40
|
+
let trimmed = string.trimmingCharacters(in: .whitespacesAndNewlines)
|
|
41
|
+
if let gradient = JSGradientParser.parse(trimmed) {
|
|
42
|
+
return gradient
|
|
43
|
+
}
|
|
44
|
+
if let color = JSColorParser.parse(string) {
|
|
45
|
+
return .color(color)
|
|
46
|
+
}
|
|
47
|
+
return nil
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
static func boolean(_ value: Any?) -> Bool {
|
|
51
|
+
guard let value = value else { return false }
|
|
52
|
+
|
|
53
|
+
if let bool = value as? Bool { return bool }
|
|
54
|
+
if let int = value as? Int { return int == 1 }
|
|
55
|
+
if let string = value as? String {
|
|
56
|
+
return string.lowercased() == "true"
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return false
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/// Helper to resolve CSS Edge Precedence:
|
|
63
|
+
/// Specific (Left) > Axis (Horizontal) > Generic (All)
|
|
64
|
+
static func parseInsets(from dict: [String: Any], prefix: String) -> EdgeInsets {
|
|
65
|
+
let all = number(dict[prefix]) ?? 0
|
|
66
|
+
let v = number(dict["\(prefix)Vertical"]) ?? all
|
|
67
|
+
let h = number(dict["\(prefix)Horizontal"]) ?? all
|
|
68
|
+
|
|
69
|
+
return EdgeInsets(
|
|
70
|
+
top: number(dict["\(prefix)Top"]) ?? v,
|
|
71
|
+
leading: number(dict["\(prefix)Left"]) ?? number(dict["\(prefix)Start"]) ?? h,
|
|
72
|
+
bottom: number(dict["\(prefix)Bottom"]) ?? v,
|
|
73
|
+
trailing: number(dict["\(prefix)Right"]) ?? number(dict["\(prefix)End"]) ?? h
|
|
74
|
+
)
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/// Maps "bold", "600", "normal" -> Font.Weight
|
|
78
|
+
static func fontWeight(_ value: Any?) -> Font.Weight {
|
|
79
|
+
guard let string = value as? String else { return .regular }
|
|
80
|
+
|
|
81
|
+
switch string.lowercased() {
|
|
82
|
+
case "bold", "700": return .bold
|
|
83
|
+
case "heavy", "800", "900": return .heavy // or .black
|
|
84
|
+
case "semibold", "600": return .semibold
|
|
85
|
+
case "medium", "500": return .medium
|
|
86
|
+
case "light", "300": return .light
|
|
87
|
+
case "thin", "100": return .thin
|
|
88
|
+
default: return .regular
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/// Maps "center", "right", "justify" -> TextAlignment
|
|
93
|
+
static func textAlignment(_ value: Any?) -> TextAlignment {
|
|
94
|
+
guard let string = value as? String else { return .leading }
|
|
95
|
+
|
|
96
|
+
switch string.lowercased() {
|
|
97
|
+
case "center": return .center
|
|
98
|
+
case "right", "end": return .trailing
|
|
99
|
+
default: return .leading
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
static func textDecoration(_ value: Any?) -> TextDecoration {
|
|
104
|
+
guard let string = (value as? String)?.lowercased() else { return .none }
|
|
105
|
+
|
|
106
|
+
// Simple string check (RN allows "underline line-through")
|
|
107
|
+
let hasUnderline = string.contains("underline")
|
|
108
|
+
let hasLineThrough = string.contains("line-through") || string.contains("strikethrough")
|
|
109
|
+
|
|
110
|
+
if hasUnderline, hasLineThrough { return .underlineLineThrough }
|
|
111
|
+
if hasUnderline { return .underline }
|
|
112
|
+
if hasLineThrough { return .lineThrough }
|
|
113
|
+
return .none
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
static func glassEffect(_ value: Any?) -> GlassEffect? {
|
|
117
|
+
guard let string = (value as? String)?.lowercased() else { return nil }
|
|
118
|
+
|
|
119
|
+
switch string {
|
|
120
|
+
case "clear": return .clear
|
|
121
|
+
case "identity": return .identity
|
|
122
|
+
case "regular": return .regular
|
|
123
|
+
case "none": return .none
|
|
124
|
+
default: return nil
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
static func overflow(_ value: Any?) -> Overflow? {
|
|
129
|
+
guard let string = (value as? String)?.lowercased() else { return nil }
|
|
130
|
+
|
|
131
|
+
if string == "hidden" { return .hidden }
|
|
132
|
+
if string == "visible" { return .visible }
|
|
133
|
+
return nil
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
static func fontVariant(_ value: Any?) -> Set<FontVariant> {
|
|
137
|
+
var variants: Set<FontVariant> = []
|
|
138
|
+
|
|
139
|
+
// Handle array of strings (e.g., ["small-caps", "tabular-nums"])
|
|
140
|
+
if let array = value as? [String] {
|
|
141
|
+
for variantString in array {
|
|
142
|
+
if let variant = FontVariant(rawValue: variantString) {
|
|
143
|
+
variants.insert(variant)
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
// Handle single string (e.g., "small-caps")
|
|
148
|
+
else if let string = value as? String {
|
|
149
|
+
if let variant = FontVariant(rawValue: string) {
|
|
150
|
+
variants.insert(variant)
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
return variants
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/// Parse RN transform array: [{ rotate: '45deg' }, { scale: 1.5 }]
|
|
158
|
+
static func transform(_ value: Any?) -> TransformStyle? {
|
|
159
|
+
guard let array = value as? [[String: Any]] else { return nil }
|
|
160
|
+
|
|
161
|
+
var transform = TransformStyle()
|
|
162
|
+
|
|
163
|
+
for item in array {
|
|
164
|
+
// Handle rotate: '45deg' or rotate: '0.785rad'
|
|
165
|
+
if let rotateStr = item["rotate"] as? String {
|
|
166
|
+
transform.rotate = parseAngle(rotateStr)
|
|
167
|
+
}
|
|
168
|
+
// Handle rotateZ (same as rotate for 2D)
|
|
169
|
+
if let rotateZStr = item["rotateZ"] as? String {
|
|
170
|
+
transform.rotate = parseAngle(rotateZStr)
|
|
171
|
+
}
|
|
172
|
+
// Handle scale
|
|
173
|
+
if let scale = item["scale"] as? Double {
|
|
174
|
+
transform.scale = CGFloat(scale)
|
|
175
|
+
} else if let scale = item["scale"] as? Int {
|
|
176
|
+
transform.scale = CGFloat(scale)
|
|
177
|
+
}
|
|
178
|
+
// Handle scaleX
|
|
179
|
+
if let scaleX = item["scaleX"] as? Double {
|
|
180
|
+
transform.scaleX = CGFloat(scaleX)
|
|
181
|
+
} else if let scaleX = item["scaleX"] as? Int {
|
|
182
|
+
transform.scaleX = CGFloat(scaleX)
|
|
183
|
+
}
|
|
184
|
+
// Handle scaleY
|
|
185
|
+
if let scaleY = item["scaleY"] as? Double {
|
|
186
|
+
transform.scaleY = CGFloat(scaleY)
|
|
187
|
+
} else if let scaleY = item["scaleY"] as? Int {
|
|
188
|
+
transform.scaleY = CGFloat(scaleY)
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
return transform.hasTransforms ? transform : nil
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/// Parse angle string like '45deg' or '0.785rad' to degrees
|
|
196
|
+
private static func parseAngle(_ value: String) -> CGFloat? {
|
|
197
|
+
let trimmed = value.trimmingCharacters(in: .whitespaces)
|
|
198
|
+
|
|
199
|
+
if trimmed.hasSuffix("deg") {
|
|
200
|
+
let numStr = String(trimmed.dropLast(3))
|
|
201
|
+
return Double(numStr).map { CGFloat($0) }
|
|
202
|
+
} else if trimmed.hasSuffix("rad") {
|
|
203
|
+
let numStr = String(trimmed.dropLast(3))
|
|
204
|
+
if let radians = Double(numStr) {
|
|
205
|
+
return CGFloat(radians * 180.0 / .pi) // Convert to degrees
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
// Try parsing as plain number (assume degrees)
|
|
209
|
+
return Double(trimmed).map { CGFloat($0) }
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/// Parsed transform style from RN transform array
|
|
214
|
+
struct TransformStyle {
|
|
215
|
+
var rotate: CGFloat? // in degrees
|
|
216
|
+
var scale: CGFloat?
|
|
217
|
+
var scaleX: CGFloat?
|
|
218
|
+
var scaleY: CGFloat?
|
|
219
|
+
|
|
220
|
+
var hasTransforms: Bool {
|
|
221
|
+
rotate != nil || scale != nil || scaleX != nil || scaleY != nil
|
|
222
|
+
}
|
|
223
|
+
}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import SwiftUI
|
|
2
|
+
|
|
3
|
+
// DO NOT PUT DEFAULT VALUES IN THE STRUCTURES.
|
|
4
|
+
// ONLY USE OPTIONALS.
|
|
5
|
+
|
|
6
|
+
// MARK: - Size Value
|
|
7
|
+
|
|
8
|
+
enum SizeValue: Equatable {
|
|
9
|
+
case fixed(CGFloat) // Explicit numeric value (e.g., 100)
|
|
10
|
+
case fill // "100%" — expand to fill available space
|
|
11
|
+
case wrap // "auto" or missing — size to content
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
// MARK: - Flex Alignment
|
|
15
|
+
|
|
16
|
+
enum FlexAlign: String {
|
|
17
|
+
case flexStart = "flex-start"
|
|
18
|
+
case center
|
|
19
|
+
case flexEnd = "flex-end"
|
|
20
|
+
case stretch
|
|
21
|
+
|
|
22
|
+
/// Accept both kebab-case ("flex-start") and camelCase ("flexStart")
|
|
23
|
+
init?(fromStyle value: String) {
|
|
24
|
+
if let v = FlexAlign(rawValue: value) {
|
|
25
|
+
self = v
|
|
26
|
+
} else {
|
|
27
|
+
switch value {
|
|
28
|
+
case "flexStart": self = .flexStart
|
|
29
|
+
case "flexEnd": self = .flexEnd
|
|
30
|
+
default: return nil
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
enum FlexJustify: String {
|
|
37
|
+
case flexStart = "flex-start"
|
|
38
|
+
case center
|
|
39
|
+
case flexEnd = "flex-end"
|
|
40
|
+
case spaceBetween = "space-between"
|
|
41
|
+
case spaceAround = "space-around"
|
|
42
|
+
case spaceEvenly = "space-evenly"
|
|
43
|
+
|
|
44
|
+
/// Accept both kebab-case ("space-between") and camelCase ("spaceBetween")
|
|
45
|
+
init?(fromStyle value: String) {
|
|
46
|
+
if let v = FlexJustify(rawValue: value) {
|
|
47
|
+
self = v
|
|
48
|
+
} else {
|
|
49
|
+
switch value {
|
|
50
|
+
case "flexStart": self = .flexStart
|
|
51
|
+
case "flexEnd": self = .flexEnd
|
|
52
|
+
case "spaceBetween": self = .spaceBetween
|
|
53
|
+
case "spaceAround": self = .spaceAround
|
|
54
|
+
case "spaceEvenly": self = .spaceEvenly
|
|
55
|
+
default: return nil
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// MARK: - Layout Style
|
|
62
|
+
|
|
63
|
+
struct LayoutStyle {
|
|
64
|
+
// 1. Size Constraints (now SizeValue for "auto"/"100%" support)
|
|
65
|
+
var width: SizeValue?
|
|
66
|
+
var height: SizeValue?
|
|
67
|
+
var minWidth: CGFloat?
|
|
68
|
+
var maxWidth: CGFloat?
|
|
69
|
+
var minHeight: CGFloat?
|
|
70
|
+
var maxHeight: CGFloat?
|
|
71
|
+
|
|
72
|
+
// 2. Flex properties (defaults applied in StyleConverter, not here)
|
|
73
|
+
var flex: CGFloat? // Shorthand (legacy compat)
|
|
74
|
+
var flexGrow: CGFloat // Default: 0 (applied in StyleConverter)
|
|
75
|
+
var flexShrink: CGFloat // Default: 0 (applied in StyleConverter)
|
|
76
|
+
var flexBasis: SizeValue? // nil = auto
|
|
77
|
+
var alignSelf: FlexAlign? // nil = auto (inherit from container)
|
|
78
|
+
var gap: CGFloat? // Spacing between flex children
|
|
79
|
+
|
|
80
|
+
/// 3. Priority (legacy only, derived from flex)
|
|
81
|
+
var layoutPriority: Double?
|
|
82
|
+
|
|
83
|
+
/// 4. Aspect Ratio
|
|
84
|
+
var aspectRatio: CGFloat?
|
|
85
|
+
|
|
86
|
+
// 5. Spacing
|
|
87
|
+
var padding: EdgeInsets?
|
|
88
|
+
var margin: EdgeInsets?
|
|
89
|
+
|
|
90
|
+
// 6. Positioning
|
|
91
|
+
var absolutePosition: CGPoint? // for position: 'absolute'
|
|
92
|
+
var relativeOffset: CGPoint? // for position: 'relative'
|
|
93
|
+
var zIndex: Double?
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// MARK: - Layout Modifier
|
|
97
|
+
|
|
98
|
+
struct LayoutModifier: ViewModifier {
|
|
99
|
+
let style: LayoutStyle
|
|
100
|
+
var contentAlignment: Alignment = .center
|
|
101
|
+
|
|
102
|
+
/// Extract CGFloat from SizeValue for frame constraints
|
|
103
|
+
private var widthValue: CGFloat? {
|
|
104
|
+
guard case let .fixed(v) = style.width else { return nil }
|
|
105
|
+
return v
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
private var heightValue: CGFloat? {
|
|
109
|
+
guard case let .fixed(v) = style.height else { return nil }
|
|
110
|
+
return v
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/// Derive effective ideal width: explicit width, then flexBasis, then nil
|
|
114
|
+
private var effectiveIdealWidth: CGFloat? {
|
|
115
|
+
if let w = widthValue { return w }
|
|
116
|
+
if case let .fixed(v) = style.flexBasis { return v }
|
|
117
|
+
return nil
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/// Derive effective ideal height: explicit height, then flexBasis, then nil
|
|
121
|
+
private var effectiveIdealHeight: CGFloat? {
|
|
122
|
+
if let h = heightValue { return h }
|
|
123
|
+
if case let .fixed(v) = style.flexBasis { return v }
|
|
124
|
+
return nil
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/// flexShrink > 0: allow shrinking by setting min to 0 (unless explicitly constrained)
|
|
128
|
+
private var effectiveMinWidth: CGFloat? {
|
|
129
|
+
style.flexShrink > 0 ? (style.minWidth ?? 0) : style.minWidth
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
private var effectiveMinHeight: CGFloat? {
|
|
133
|
+
style.flexShrink > 0 ? (style.minHeight ?? 0) : style.minHeight
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
func body(content: Content) -> some View {
|
|
137
|
+
content
|
|
138
|
+
// A. Aspect Ratio (Must be applied before frames to impact sizing)
|
|
139
|
+
.voltraIfLet(style.aspectRatio) { content, aspectRatio in
|
|
140
|
+
content.aspectRatio(aspectRatio, contentMode: .fill)
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// B. Fixed & Minimum Constraints
|
|
144
|
+
// We apply min/max/fixed constraints first to establish the "base" size.
|
|
145
|
+
.frame(
|
|
146
|
+
minWidth: effectiveMinWidth,
|
|
147
|
+
idealWidth: effectiveIdealWidth,
|
|
148
|
+
maxWidth: widthValue ?? style.maxWidth,
|
|
149
|
+
minHeight: effectiveMinHeight,
|
|
150
|
+
idealHeight: effectiveIdealHeight,
|
|
151
|
+
maxHeight: heightValue ?? style.maxHeight
|
|
152
|
+
)
|
|
153
|
+
|
|
154
|
+
// C. Flex / Grow Logic (legacy: expand to infinity)
|
|
155
|
+
// If flex > 0 OR flexGrow > 0 OR width/height is .fill, expand to .infinity
|
|
156
|
+
.frame(
|
|
157
|
+
maxWidth: shouldExpandWidth ? .infinity : nil,
|
|
158
|
+
maxHeight: shouldExpandHeight ? .infinity : nil,
|
|
159
|
+
// Use the component's own content alignment (e.g. VStack alignment prop)
|
|
160
|
+
// rather than forcing .topLeading, which would override it.
|
|
161
|
+
alignment: contentAlignment
|
|
162
|
+
)
|
|
163
|
+
|
|
164
|
+
// D. Layout Priority (Flex Grow/Shrink arbitration)
|
|
165
|
+
// Views with higher priority get their requested size first.
|
|
166
|
+
.voltraIfLet(style.layoutPriority) { content, priority in
|
|
167
|
+
content.layoutPriority(priority)
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// E. Inner Spacing (Padding)
|
|
171
|
+
.voltraIfLet(style.padding) { content, padding in
|
|
172
|
+
content.padding(padding)
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/// Expand if flex > 0 OR flexGrow > 0 OR width/height is .fill
|
|
177
|
+
private var shouldExpandWidth: Bool {
|
|
178
|
+
(style.flex ?? 0) > 0 || style.flexGrow > 0 || style.width == .fill
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
private var shouldExpandHeight: Bool {
|
|
182
|
+
(style.flex ?? 0) > 0 || style.flexGrow > 0 || style.height == .fill
|
|
183
|
+
}
|
|
184
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import SwiftUI
|
|
2
|
+
|
|
3
|
+
struct RenderingStyle {
|
|
4
|
+
var opacity: CGFloat = 1.0
|
|
5
|
+
var transform: TransformStyle?
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
struct RenderingModifier: ViewModifier {
|
|
9
|
+
let style: RenderingStyle
|
|
10
|
+
|
|
11
|
+
func body(content: Content) -> some View {
|
|
12
|
+
content
|
|
13
|
+
.opacity(style.opacity)
|
|
14
|
+
.modifier(TransformModifier(transform: style.transform))
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
struct TransformModifier: ViewModifier {
|
|
19
|
+
let transform: TransformStyle?
|
|
20
|
+
|
|
21
|
+
func body(content: Content) -> some View {
|
|
22
|
+
content
|
|
23
|
+
.voltraIfLet(transform?.rotate) { view, degrees in
|
|
24
|
+
view.rotationEffect(.degrees(degrees))
|
|
25
|
+
}
|
|
26
|
+
.voltraIfLet(transform?.scale) { view, scale in
|
|
27
|
+
view.scaleEffect(scale)
|
|
28
|
+
}
|
|
29
|
+
.voltraIf(transform?.scale == nil && (transform?.scaleX != nil || transform?.scaleY != nil)) { view in
|
|
30
|
+
view.scaleEffect(x: transform?.scaleX ?? 1.0, y: transform?.scaleY ?? 1.0)
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import SwiftUI
|
|
2
|
+
|
|
3
|
+
enum StyleConverter {
|
|
4
|
+
static func convert(_ js: [String: Any]) -> (LayoutStyle, DecorationStyle, RenderingStyle, TextStyle) {
|
|
5
|
+
(parseLayout(js), parseDecoration(js), parseRendering(js), parseText(js))
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
private static func parseLayout(_ js: [String: Any]) -> LayoutStyle {
|
|
9
|
+
// RN: "flex: 1" implies grow. "flexGrow" is specific.
|
|
10
|
+
let flexVal = JSStyleParser.number(js["flex"]) ?? 0
|
|
11
|
+
let flexGrowVal = JSStyleParser.number(js["flexGrow"]) ?? 0
|
|
12
|
+
let flexShrinkVal = JSStyleParser.number(js["flexShrink"])
|
|
13
|
+
let flexBasisVal = JSStyleParser.sizeValue(js["flexBasis"])
|
|
14
|
+
|
|
15
|
+
// Legacy flex: max of flex and flexGrow for backward compat
|
|
16
|
+
let finalFlex = max(flexVal, flexGrowVal)
|
|
17
|
+
let priority: Double? = finalFlex > 0 ? Double(finalFlex) : nil
|
|
18
|
+
|
|
19
|
+
// RN flex shorthand: flex > 0 → grow=flex, shrink=1, basis=0
|
|
20
|
+
let resolvedFlexGrow: CGFloat
|
|
21
|
+
let resolvedFlexShrink: CGFloat
|
|
22
|
+
let resolvedFlexBasis: SizeValue?
|
|
23
|
+
|
|
24
|
+
if flexVal > 0 {
|
|
25
|
+
resolvedFlexGrow = flexGrowVal > 0 ? flexGrowVal : flexVal
|
|
26
|
+
resolvedFlexShrink = flexShrinkVal ?? 1
|
|
27
|
+
resolvedFlexBasis = flexBasisVal ?? .fixed(0)
|
|
28
|
+
} else {
|
|
29
|
+
resolvedFlexGrow = flexGrowVal
|
|
30
|
+
resolvedFlexShrink = flexShrinkVal ?? 0
|
|
31
|
+
resolvedFlexBasis = flexBasisVal // nil = auto
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// Apply defaults here: 0 if not set (instead of in modifiers)
|
|
35
|
+
let finalFlexGrow: CGFloat = resolvedFlexGrow
|
|
36
|
+
let finalFlexShrink: CGFloat = resolvedFlexShrink
|
|
37
|
+
|
|
38
|
+
// alignSelf
|
|
39
|
+
let alignSelf: FlexAlign? = (js["alignSelf"] as? String).flatMap { FlexAlign(fromStyle: $0) }
|
|
40
|
+
|
|
41
|
+
// gap
|
|
42
|
+
let gap = JSStyleParser.number(js["gap"])
|
|
43
|
+
|
|
44
|
+
// Position parsing with mode support
|
|
45
|
+
let left = JSStyleParser.number(js["left"])
|
|
46
|
+
let top = JSStyleParser.number(js["top"])
|
|
47
|
+
|
|
48
|
+
var absolutePosition: CGPoint?
|
|
49
|
+
var relativeOffset: CGPoint?
|
|
50
|
+
|
|
51
|
+
// Only apply positioning if left or top are provided
|
|
52
|
+
if left != nil || top != nil {
|
|
53
|
+
let x = left ?? 0
|
|
54
|
+
let y = top ?? 0
|
|
55
|
+
|
|
56
|
+
// Default to 'absolute' if position mode not specified (backward compatibility)
|
|
57
|
+
let positionMode = js["position"] as? String ?? "absolute"
|
|
58
|
+
|
|
59
|
+
switch positionMode.lowercased() {
|
|
60
|
+
case "absolute":
|
|
61
|
+
absolutePosition = CGPoint(x: x, y: y)
|
|
62
|
+
case "relative":
|
|
63
|
+
relativeOffset = CGPoint(x: x, y: y)
|
|
64
|
+
case "static":
|
|
65
|
+
// Do nothing - ignore left/top
|
|
66
|
+
break
|
|
67
|
+
default:
|
|
68
|
+
// Unknown position value - ignore
|
|
69
|
+
break
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// zIndex: only set if explicitly provided in JS
|
|
74
|
+
let zIndex = JSStyleParser.number(js["zIndex"])
|
|
75
|
+
|
|
76
|
+
return LayoutStyle(
|
|
77
|
+
// Dimensions (now using SizeValue)
|
|
78
|
+
width: JSStyleParser.sizeValue(js["width"]),
|
|
79
|
+
height: JSStyleParser.sizeValue(js["height"]),
|
|
80
|
+
minWidth: JSStyleParser.number(js["minWidth"]),
|
|
81
|
+
maxWidth: JSStyleParser.number(js["maxWidth"]),
|
|
82
|
+
minHeight: JSStyleParser.number(js["minHeight"]),
|
|
83
|
+
maxHeight: JSStyleParser.number(js["maxHeight"]),
|
|
84
|
+
|
|
85
|
+
// Flex Logic
|
|
86
|
+
flex: finalFlex > 0 ? finalFlex : nil,
|
|
87
|
+
flexGrow: finalFlexGrow,
|
|
88
|
+
flexShrink: finalFlexShrink,
|
|
89
|
+
flexBasis: resolvedFlexBasis,
|
|
90
|
+
alignSelf: alignSelf,
|
|
91
|
+
gap: gap,
|
|
92
|
+
layoutPriority: priority,
|
|
93
|
+
aspectRatio: JSStyleParser.number(js["aspectRatio"]),
|
|
94
|
+
|
|
95
|
+
// Spacing (Resolves logic: padding -> paddingHorizontal -> paddingLeft)
|
|
96
|
+
padding: JSStyleParser.parseInsets(from: js, prefix: "padding"),
|
|
97
|
+
margin: JSStyleParser.parseInsets(from: js, prefix: "margin"),
|
|
98
|
+
|
|
99
|
+
// Positioning
|
|
100
|
+
absolutePosition: absolutePosition,
|
|
101
|
+
relativeOffset: relativeOffset,
|
|
102
|
+
zIndex: zIndex.map { Double($0) }
|
|
103
|
+
)
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
private static func parseDecoration(_ js: [String: Any]) -> DecorationStyle {
|
|
107
|
+
// Border Logic
|
|
108
|
+
var border: (CGFloat, Color)?
|
|
109
|
+
if let borderWidth = JSStyleParser.number(js["borderWidth"]), borderWidth > 0 {
|
|
110
|
+
let borderColor = JSStyleParser.color(js["borderColor"]) ?? .clear
|
|
111
|
+
border = (borderWidth, borderColor)
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// Shadow Logic (RN iOS style)
|
|
115
|
+
var shadow: (CGFloat, Color, Double, CGSize)?
|
|
116
|
+
|
|
117
|
+
let radius = JSStyleParser.number(js["shadowRadius"])
|
|
118
|
+
let opacity = JSStyleParser.number(js["shadowOpacity"])
|
|
119
|
+
let offset = JSStyleParser.size(js["shadowOffset"])
|
|
120
|
+
let color = JSStyleParser.color(js["shadowColor"])
|
|
121
|
+
|
|
122
|
+
if radius != nil || opacity != nil || offset != nil || color != nil {
|
|
123
|
+
let finalRadius = radius ?? 0.0
|
|
124
|
+
let finalOpacity = opacity ?? 1.0
|
|
125
|
+
let finalOffset = offset ?? .zero
|
|
126
|
+
let finalColor = color ?? .black
|
|
127
|
+
|
|
128
|
+
if finalOpacity > 0 {
|
|
129
|
+
shadow = (finalRadius, finalColor, Double(finalOpacity), finalOffset)
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
let glassEffect = JSStyleParser.glassEffect(js["glassEffect"])
|
|
134
|
+
let overflow = JSStyleParser.overflow(js["overflow"])
|
|
135
|
+
|
|
136
|
+
return DecorationStyle(
|
|
137
|
+
backgroundColor: JSStyleParser.background(js["backgroundColor"]),
|
|
138
|
+
cornerRadius: JSStyleParser.number(js["borderRadius"]),
|
|
139
|
+
border: border,
|
|
140
|
+
shadow: shadow,
|
|
141
|
+
glassEffect: glassEffect,
|
|
142
|
+
overflow: overflow
|
|
143
|
+
)
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
private static func parseRendering(_ js: [String: Any]) -> RenderingStyle {
|
|
147
|
+
RenderingStyle(
|
|
148
|
+
opacity: JSStyleParser.number(js["opacity"]) ?? 1.0,
|
|
149
|
+
transform: JSStyleParser.transform(js["transform"])
|
|
150
|
+
)
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
private static func parseText(_ js: [String: Any]) -> TextStyle {
|
|
154
|
+
var style = TextStyle()
|
|
155
|
+
|
|
156
|
+
if let color = JSColorParser.parse(js["color"]) {
|
|
157
|
+
style.color = color
|
|
158
|
+
style.usesPrimaryColorInReducedPresentation = JSColorParser.shouldUsePrimaryColorInReducedPresentation(js["color"])
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
if let size = JSStyleParser.number(js["fontSize"]) {
|
|
162
|
+
style.fontSize = size
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// CSS LineHeight includes text size. SwiftUI LineSpacing is the extra space.
|
|
166
|
+
if let lineHeight = JSStyleParser.number(js["lineHeight"]) {
|
|
167
|
+
let spacing = lineHeight - style.fontSize
|
|
168
|
+
style.lineSpacing = max(0, spacing)
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
if let weightRaw = js["fontWeight"] {
|
|
172
|
+
style.fontWeight = JSStyleParser.fontWeight(weightRaw)
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
if let fontFamily = js["fontFamily"] as? String {
|
|
176
|
+
style.fontFamily = fontFamily
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
if let alignRaw = js["textAlign"] {
|
|
180
|
+
style.alignment = JSStyleParser.textAlignment(alignRaw)
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
if let decoRaw = js["textDecorationLine"] {
|
|
184
|
+
style.decoration = JSStyleParser.textDecoration(decoRaw)
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// 6. Numbers
|
|
188
|
+
if let lines = js["numberOfLines"] as? Int {
|
|
189
|
+
style.lineLimit = lines
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
if let letterSpacing = JSStyleParser.number(js["letterSpacing"]) {
|
|
193
|
+
style.letterSpacing = letterSpacing
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
if let fontVariantRaw = js["fontVariant"] {
|
|
197
|
+
style.fontVariant = JSStyleParser.fontVariant(fontVariantRaw)
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
return style
|
|
201
|
+
}
|
|
202
|
+
}
|