@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,118 @@
|
|
|
1
|
+
import SwiftUI
|
|
2
|
+
|
|
3
|
+
public struct VoltraLinearProgressView: VoltraView {
|
|
4
|
+
public typealias Parameters = LinearProgressViewParameters
|
|
5
|
+
|
|
6
|
+
public let element: VoltraElement
|
|
7
|
+
|
|
8
|
+
@State private var internalStartTime = Date()
|
|
9
|
+
|
|
10
|
+
public init(_ element: VoltraElement) {
|
|
11
|
+
self.element = element
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
@ViewBuilder
|
|
15
|
+
public var body: some View {
|
|
16
|
+
let p = params
|
|
17
|
+
let progressColor = p.progressColor.flatMap { JSColorParser.parse($0) }
|
|
18
|
+
let trackColor = p.trackColor.flatMap { JSColorParser.parse($0) }
|
|
19
|
+
let cornerRadius = p.cornerRadius.map { CGFloat($0) }
|
|
20
|
+
let height = p.height.map { CGFloat($0) }
|
|
21
|
+
let thumbComponent = element.componentProp("thumb")
|
|
22
|
+
|
|
23
|
+
let isTimer = p.endAtMs != nil
|
|
24
|
+
|
|
25
|
+
// Linear progress bar only supports Determinate and Timer modes.
|
|
26
|
+
// If no value or timer is provided, we fall back to a 0% determinate state
|
|
27
|
+
// as linear indeterminate progress is not supported.
|
|
28
|
+
let isDeterminate = p.value != nil
|
|
29
|
+
let effectiveValue = p.value ?? 0.0
|
|
30
|
+
|
|
31
|
+
// Built-in style is required for timers to animate in realtime (Live Activities).
|
|
32
|
+
let hasCustomProps = trackColor != nil || cornerRadius != nil || height != nil || thumbComponent != .empty
|
|
33
|
+
let useCustomStyle = hasCustomProps && isDeterminate
|
|
34
|
+
|
|
35
|
+
if isTimer, let endAtMs = p.endAtMs {
|
|
36
|
+
// Timer-based progress (Always uses built-in style for realtime updates)
|
|
37
|
+
ProgressView(
|
|
38
|
+
timerInterval: Date.toTimerInterval(
|
|
39
|
+
startAtMs: p.startAtMs ?? (internalStartTime.timeIntervalSince1970 * 1000),
|
|
40
|
+
endAtMs: endAtMs
|
|
41
|
+
),
|
|
42
|
+
countsDown: p.countDown ?? false
|
|
43
|
+
) {
|
|
44
|
+
element.componentProp("label")
|
|
45
|
+
} currentValueLabel: {
|
|
46
|
+
element.componentProp("currentValueLabel")
|
|
47
|
+
}
|
|
48
|
+
.progressViewStyle(.linear)
|
|
49
|
+
.tint(progressColor)
|
|
50
|
+
.applyStyle(element.style)
|
|
51
|
+
} else {
|
|
52
|
+
// Determinate progress (Default fallback if no value/timer)
|
|
53
|
+
ProgressView(value: effectiveValue, total: p.maximumValue) {
|
|
54
|
+
element.componentProp("label")
|
|
55
|
+
} currentValueLabel: {
|
|
56
|
+
element.componentProp("currentValueLabel")
|
|
57
|
+
}
|
|
58
|
+
.tint(progressColor)
|
|
59
|
+
.voltraIf(useCustomStyle) {
|
|
60
|
+
$0.progressViewStyle(VoltraLinearProgressStyle(
|
|
61
|
+
progressTint: progressColor,
|
|
62
|
+
trackTint: trackColor ?? Color.gray.opacity(0.2),
|
|
63
|
+
cornerRadius: cornerRadius,
|
|
64
|
+
explicitHeight: height,
|
|
65
|
+
thumbComponent: thumbComponent != .empty ? thumbComponent : nil
|
|
66
|
+
))
|
|
67
|
+
}
|
|
68
|
+
.voltraIf(!useCustomStyle) {
|
|
69
|
+
$0.progressViewStyle(.linear)
|
|
70
|
+
}
|
|
71
|
+
.applyStyle(element.style)
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
@available(iOS 16.0, macOS 13.0, *)
|
|
77
|
+
private struct VoltraLinearProgressStyle: ProgressViewStyle {
|
|
78
|
+
var progressTint: Color?
|
|
79
|
+
var trackTint: Color
|
|
80
|
+
var cornerRadius: CGFloat?
|
|
81
|
+
var explicitHeight: CGFloat?
|
|
82
|
+
var thumbComponent: VoltraNode?
|
|
83
|
+
|
|
84
|
+
func makeBody(configuration: Configuration) -> some View {
|
|
85
|
+
let fraction = max(0, min(configuration.fractionCompleted ?? 0, 1))
|
|
86
|
+
let baseHeight = explicitHeight ?? 4
|
|
87
|
+
|
|
88
|
+
VStack(alignment: .leading, spacing: 4) {
|
|
89
|
+
configuration.label
|
|
90
|
+
|
|
91
|
+
GeometryReader { geometry in
|
|
92
|
+
let totalWidth = geometry.size.width
|
|
93
|
+
let radius = cornerRadius ?? baseHeight / 2
|
|
94
|
+
|
|
95
|
+
ZStack(alignment: .leading) {
|
|
96
|
+
// Track
|
|
97
|
+
RoundedRectangle(cornerRadius: radius, style: .continuous)
|
|
98
|
+
.fill(trackTint)
|
|
99
|
+
.frame(width: totalWidth, height: baseHeight)
|
|
100
|
+
|
|
101
|
+
// Progress fill
|
|
102
|
+
RoundedRectangle(cornerRadius: radius, style: .continuous)
|
|
103
|
+
.fill(progressTint ?? Color.accentColor)
|
|
104
|
+
.frame(width: totalWidth * CGFloat(fraction), height: baseHeight)
|
|
105
|
+
}
|
|
106
|
+
.overlay(alignment: .leading) {
|
|
107
|
+
if let thumbComponent = thumbComponent {
|
|
108
|
+
thumbComponent
|
|
109
|
+
.offset(x: totalWidth * CGFloat(fraction))
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
.frame(height: baseHeight)
|
|
114
|
+
|
|
115
|
+
configuration.currentValueLabel
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import SwiftUI
|
|
2
|
+
|
|
3
|
+
public struct VoltraLink: VoltraView {
|
|
4
|
+
public typealias Parameters = LinkParameters
|
|
5
|
+
public let element: VoltraElement
|
|
6
|
+
|
|
7
|
+
public init(_ element: VoltraElement) {
|
|
8
|
+
self.element = element
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
public var body: some View {
|
|
12
|
+
if let urlString = params.destination,
|
|
13
|
+
let url = VoltraDeepLinkResolver.resolveUrl(urlString)
|
|
14
|
+
{
|
|
15
|
+
Link(destination: url) {
|
|
16
|
+
element.children ?? .empty
|
|
17
|
+
}
|
|
18
|
+
.applyStyle(element.style)
|
|
19
|
+
} else {
|
|
20
|
+
// Fallback: render children without link if destination is invalid
|
|
21
|
+
(element.children ?? .empty)
|
|
22
|
+
.applyStyle(element.style)
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import SwiftUI
|
|
2
|
+
|
|
3
|
+
public struct VoltraMask: VoltraView {
|
|
4
|
+
public typealias Parameters = EmptyParameters
|
|
5
|
+
|
|
6
|
+
public let element: VoltraElement
|
|
7
|
+
|
|
8
|
+
public init(_ element: VoltraElement) {
|
|
9
|
+
self.element = element
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
public var body: some View {
|
|
13
|
+
// Get the mask element from element props
|
|
14
|
+
let maskElement = element.componentProp("maskElement")
|
|
15
|
+
|
|
16
|
+
// Render children as the content to be masked
|
|
17
|
+
(element.children ?? .empty)
|
|
18
|
+
.mask {
|
|
19
|
+
maskElement
|
|
20
|
+
}
|
|
21
|
+
.applyStyle(element.style)
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import SwiftUI
|
|
2
|
+
|
|
3
|
+
public struct VoltraSpacer: VoltraView {
|
|
4
|
+
public typealias Parameters = SpacerParameters
|
|
5
|
+
|
|
6
|
+
public let element: VoltraElement
|
|
7
|
+
|
|
8
|
+
public init(_ element: VoltraElement) {
|
|
9
|
+
self.element = element
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
public var body: some View {
|
|
13
|
+
Spacer(minLength: params.minLength.map { CGFloat($0) })
|
|
14
|
+
.applyStyle(element.style)
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import SwiftUI
|
|
2
|
+
|
|
3
|
+
private enum SymbolRenderingMode: String {
|
|
4
|
+
case monochrome
|
|
5
|
+
case hierarchical
|
|
6
|
+
case palette
|
|
7
|
+
case multicolor
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
public struct VoltraSymbol: VoltraView {
|
|
11
|
+
public typealias Parameters = SymbolParameters
|
|
12
|
+
|
|
13
|
+
public let element: VoltraElement
|
|
14
|
+
|
|
15
|
+
private var params: Parameters {
|
|
16
|
+
element.parameters(Parameters.self)
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
public init(_ element: VoltraElement) {
|
|
20
|
+
self.element = element
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
private func symbolName(params: SymbolParameters) -> String {
|
|
24
|
+
if let name = params.name, !name.isEmpty {
|
|
25
|
+
return name
|
|
26
|
+
}
|
|
27
|
+
return "questionmark"
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
private func symbolTypeKey(params: SymbolParameters) -> String {
|
|
31
|
+
params.type?.lowercased() ?? "monochrome"
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
private func renderingMode(params: SymbolParameters) -> SymbolRenderingMode {
|
|
35
|
+
SymbolRenderingMode(rawValue: symbolTypeKey(params: params)) ?? .monochrome
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
private func symbolScale(params: SymbolParameters) -> Image.Scale {
|
|
39
|
+
switch params.scale?.lowercased() {
|
|
40
|
+
case "small":
|
|
41
|
+
return .small
|
|
42
|
+
case "large":
|
|
43
|
+
return .large
|
|
44
|
+
case "unspecified":
|
|
45
|
+
return .medium
|
|
46
|
+
case "medium", "default":
|
|
47
|
+
return .medium
|
|
48
|
+
default:
|
|
49
|
+
return .medium
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
private func symbolWeight(params: SymbolParameters) -> Font.Weight {
|
|
54
|
+
switch params.weight?.lowercased() {
|
|
55
|
+
case "ultralight":
|
|
56
|
+
return .ultraLight
|
|
57
|
+
case "thin":
|
|
58
|
+
return .thin
|
|
59
|
+
case "light":
|
|
60
|
+
return .light
|
|
61
|
+
case "medium":
|
|
62
|
+
return .medium
|
|
63
|
+
case "semibold":
|
|
64
|
+
return .semibold
|
|
65
|
+
case "bold":
|
|
66
|
+
return .bold
|
|
67
|
+
case "heavy":
|
|
68
|
+
return .heavy
|
|
69
|
+
case "black":
|
|
70
|
+
return .black
|
|
71
|
+
case "regular", "unspecified", nil:
|
|
72
|
+
return .regular
|
|
73
|
+
default:
|
|
74
|
+
return .regular
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
private func symbolSize(params: SymbolParameters) -> CGFloat {
|
|
79
|
+
CGFloat(params.size)
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
private func tintColor(params: SymbolParameters) -> Color? {
|
|
83
|
+
guard let string = params.tintColor else {
|
|
84
|
+
return nil
|
|
85
|
+
}
|
|
86
|
+
return JSColorParser.parse(string)
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
private func paletteColors(params: SymbolParameters) -> [Color] {
|
|
90
|
+
guard let colorsString = params.colors, !colorsString.isEmpty else {
|
|
91
|
+
return []
|
|
92
|
+
}
|
|
93
|
+
return colorsString
|
|
94
|
+
.split(separator: "|")
|
|
95
|
+
.compactMap { part in
|
|
96
|
+
let value = String(part)
|
|
97
|
+
return JSColorParser.parse(value)
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
public var body: some View {
|
|
102
|
+
let image = Image(systemName: symbolName(params: params))
|
|
103
|
+
|
|
104
|
+
applyStyling(params: params, to: image)
|
|
105
|
+
.applyStyle(element.style)
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
@ViewBuilder
|
|
109
|
+
private func applyStyling(params: SymbolParameters, to image: Image) -> some View {
|
|
110
|
+
let sized = image
|
|
111
|
+
.font(.system(size: symbolSize(params: params), weight: symbolWeight(params: params)))
|
|
112
|
+
.imageScale(symbolScale(params: params))
|
|
113
|
+
|
|
114
|
+
let colored = applyColor(params: params, to: sized)
|
|
115
|
+
|
|
116
|
+
colored
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
@ViewBuilder
|
|
120
|
+
private func applyColor(params: SymbolParameters, to view: some View) -> some View {
|
|
121
|
+
let mode = renderingMode(params: params)
|
|
122
|
+
let tint = tintColor(params: params)
|
|
123
|
+
let palette = paletteColors(params: params)
|
|
124
|
+
switch mode {
|
|
125
|
+
case .monochrome:
|
|
126
|
+
if let tint = tint {
|
|
127
|
+
view.foregroundStyle(tint)
|
|
128
|
+
} else {
|
|
129
|
+
view.symbolRenderingMode(.monochrome)
|
|
130
|
+
}
|
|
131
|
+
case .hierarchical:
|
|
132
|
+
if let tint = tint {
|
|
133
|
+
view.symbolRenderingMode(.hierarchical).foregroundStyle(tint)
|
|
134
|
+
} else {
|
|
135
|
+
view.symbolRenderingMode(.hierarchical)
|
|
136
|
+
}
|
|
137
|
+
case .palette:
|
|
138
|
+
if !palette.isEmpty {
|
|
139
|
+
// Swift's variadic foregroundStyle is tricky with array,
|
|
140
|
+
// but .foregroundStyle(Color, Color...) works up to a limit.
|
|
141
|
+
// We'll support up to 3 colors for now as that's common for symbols.
|
|
142
|
+
if palette.count == 1 {
|
|
143
|
+
view.symbolRenderingMode(.palette).foregroundStyle(palette[0])
|
|
144
|
+
} else if palette.count == 2 {
|
|
145
|
+
view.symbolRenderingMode(.palette).foregroundStyle(palette[0], palette[1])
|
|
146
|
+
} else if palette.count >= 3 {
|
|
147
|
+
view.symbolRenderingMode(.palette).foregroundStyle(palette[0], palette[1], palette[2])
|
|
148
|
+
} else {
|
|
149
|
+
view.symbolRenderingMode(.palette)
|
|
150
|
+
}
|
|
151
|
+
} else if let tint = tint {
|
|
152
|
+
view.symbolRenderingMode(.hierarchical).foregroundStyle(tint)
|
|
153
|
+
} else {
|
|
154
|
+
view.symbolRenderingMode(.palette)
|
|
155
|
+
}
|
|
156
|
+
case .multicolor:
|
|
157
|
+
view.symbolRenderingMode(.multicolor)
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import SwiftUI
|
|
2
|
+
|
|
3
|
+
public struct VoltraText: VoltraView {
|
|
4
|
+
public typealias Parameters = TextParameters
|
|
5
|
+
|
|
6
|
+
public let element: VoltraElement
|
|
7
|
+
@Environment(\.voltraEnvironment) private var voltraEnvironment
|
|
8
|
+
|
|
9
|
+
public init(_ element: VoltraElement) {
|
|
10
|
+
self.element = element
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
public var body: some View {
|
|
14
|
+
let textContent: String = {
|
|
15
|
+
if let children = element.children, case let .text(text) = children {
|
|
16
|
+
return text
|
|
17
|
+
}
|
|
18
|
+
return ""
|
|
19
|
+
}()
|
|
20
|
+
let anyStyle = (element.style ?? [:]).mapValues { $0.toAny() }
|
|
21
|
+
let style = StyleConverter.convert(anyStyle)
|
|
22
|
+
let textStyle = style.3
|
|
23
|
+
|
|
24
|
+
var font: Font {
|
|
25
|
+
// If custom fontFamily is specified, use it
|
|
26
|
+
if let fontFamily = textStyle.fontFamily {
|
|
27
|
+
var baseFont = Font.custom(fontFamily, size: textStyle.fontSize)
|
|
28
|
+
|
|
29
|
+
if textStyle.fontVariant.contains(.smallCaps) {
|
|
30
|
+
baseFont = baseFont.smallCaps()
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
if textStyle.fontVariant.contains(.tabularNums) {
|
|
34
|
+
baseFont = baseFont.monospacedDigit()
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
return baseFont
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Otherwise use system font with weight
|
|
41
|
+
var baseFont = Font.system(size: textStyle.fontSize, weight: textStyle.fontWeight)
|
|
42
|
+
|
|
43
|
+
if textStyle.fontVariant.contains(.smallCaps) {
|
|
44
|
+
baseFont = baseFont.smallCaps()
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
if textStyle.fontVariant.contains(.tabularNums) {
|
|
48
|
+
baseFont = baseFont.monospacedDigit()
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
return baseFont
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
let alignment: TextAlignment = {
|
|
55
|
+
// Parameter takes precedence over style
|
|
56
|
+
if let mta = params.multilineTextAlignment {
|
|
57
|
+
return JSStyleParser.textAlignment(mta)
|
|
58
|
+
}
|
|
59
|
+
return textStyle.alignment
|
|
60
|
+
}()
|
|
61
|
+
|
|
62
|
+
let resolvedColor: Color = {
|
|
63
|
+
if let widget = voltraEnvironment.widget,
|
|
64
|
+
widget.usesReducedBackgroundPresentation,
|
|
65
|
+
textStyle.usesPrimaryColorInReducedPresentation
|
|
66
|
+
{
|
|
67
|
+
return .primary
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
return textStyle.color
|
|
71
|
+
}()
|
|
72
|
+
|
|
73
|
+
Text(.init(textContent))
|
|
74
|
+
.kerning(textStyle.letterSpacing)
|
|
75
|
+
.underline(textStyle.decoration == .underline || textStyle.decoration == .underlineLineThrough)
|
|
76
|
+
.strikethrough(textStyle.decoration == .lineThrough || textStyle.decoration == .underlineLineThrough)
|
|
77
|
+
// These technically work on View, but good to keep close
|
|
78
|
+
.font(font)
|
|
79
|
+
.foregroundColor(resolvedColor)
|
|
80
|
+
.multilineTextAlignment(alignment)
|
|
81
|
+
.lineSpacing(textStyle.lineSpacing)
|
|
82
|
+
.voltraIfLet(params.numberOfLines) { view, numberOfLines in
|
|
83
|
+
view.lineLimit(Int(numberOfLines))
|
|
84
|
+
}
|
|
85
|
+
.applyStyle(element.style)
|
|
86
|
+
}
|
|
87
|
+
}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import SwiftUI
|
|
2
|
+
|
|
3
|
+
public struct VoltraTimer: VoltraView {
|
|
4
|
+
public typealias Parameters = TimerParameters
|
|
5
|
+
|
|
6
|
+
public let element: VoltraElement
|
|
7
|
+
|
|
8
|
+
public init(_ element: VoltraElement) {
|
|
9
|
+
self.element = element
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
private func progressRange(params: TimerParameters) -> ClosedRange<Date>? {
|
|
13
|
+
// Stopwatch support: if counting up (not down) and we have a start time
|
|
14
|
+
// but no end time or duration, treat it as an open-ended stopwatch.
|
|
15
|
+
if !countsDown(params: params),
|
|
16
|
+
let startAtMs = params.startAtMs,
|
|
17
|
+
params.endAtMs == nil,
|
|
18
|
+
params.durationMs == nil
|
|
19
|
+
{
|
|
20
|
+
let start = Date(timeIntervalSince1970: startAtMs / 1000)
|
|
21
|
+
return start ... Date.distantFuture
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
return VoltraProgressDriver.resolveRange(
|
|
25
|
+
startAtMs: params.startAtMs,
|
|
26
|
+
endAtMs: params.endAtMs,
|
|
27
|
+
durationMs: params.durationMs
|
|
28
|
+
)
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
private func resolvedEndDate(params: TimerParameters) -> Date? {
|
|
32
|
+
progressRange(params: params)?.upperBound
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
private func countsDown(params: TimerParameters) -> Bool {
|
|
36
|
+
(params.direction.lowercased()) != "up"
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
private func textStyle(params: TimerParameters) -> String {
|
|
40
|
+
params.textStyle.lowercased()
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
private struct TextTemplates: Codable {
|
|
44
|
+
let running: String?
|
|
45
|
+
let completed: String?
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
private func textTemplates(params: TimerParameters) -> TextTemplates? {
|
|
49
|
+
guard let raw = params.textTemplates,
|
|
50
|
+
let data = raw.data(using: .utf8)
|
|
51
|
+
else { return nil }
|
|
52
|
+
return try? JSONDecoder().decode(TextTemplates.self, from: data)
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
@ViewBuilder
|
|
56
|
+
public var body: some View {
|
|
57
|
+
if let range = progressRange(params: params) {
|
|
58
|
+
timerView(params: params, range: range)
|
|
59
|
+
.applyStyle(element.style)
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
@ViewBuilder
|
|
64
|
+
private func timerView(params: TimerParameters, range: ClosedRange<Date>) -> some View {
|
|
65
|
+
let isFinished = Date() >= range.upperBound
|
|
66
|
+
let templates = textTemplates(params: params)
|
|
67
|
+
let style = textStyle(params: params)
|
|
68
|
+
let showHours = params.showHours
|
|
69
|
+
|
|
70
|
+
if isFinished, let completedTemplate = templates?.completed {
|
|
71
|
+
renderTemplate(template: completedTemplate) {
|
|
72
|
+
staticZeroText(style: style, showHours: showHours)
|
|
73
|
+
}
|
|
74
|
+
} else {
|
|
75
|
+
if let runningTemplate = templates?.running {
|
|
76
|
+
renderTemplate(template: runningTemplate) {
|
|
77
|
+
activeTimerText(params: params, range: range)
|
|
78
|
+
}
|
|
79
|
+
} else {
|
|
80
|
+
activeTimerText(params: params, range: range)
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
@ViewBuilder
|
|
86
|
+
private func activeTimerText(params: TimerParameters, range: ClosedRange<Date>) -> some View {
|
|
87
|
+
let style = textStyle(params: params)
|
|
88
|
+
let isCountDown = countsDown(params: params)
|
|
89
|
+
let showHours = params.showHours
|
|
90
|
+
|
|
91
|
+
if style == "relative" {
|
|
92
|
+
let targetDate = isCountDown ? range.upperBound : range.lowerBound
|
|
93
|
+
Text(targetDate, style: .relative).monospacedDigit()
|
|
94
|
+
} else {
|
|
95
|
+
// Live Activities require Text(timerInterval:...) for automatic updates
|
|
96
|
+
Text(timerInterval: range, countsDown: isCountDown, showsHours: showHours)
|
|
97
|
+
.monospacedDigit()
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
@ViewBuilder
|
|
102
|
+
private func staticZeroText(style: String, showHours: Bool) -> some View {
|
|
103
|
+
if style == "relative" {
|
|
104
|
+
Text("0s").monospacedDigit()
|
|
105
|
+
} else {
|
|
106
|
+
Text(showHours ? "0:00:00" : "0:00")
|
|
107
|
+
.monospacedDigit()
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
@ViewBuilder
|
|
112
|
+
private func renderTemplate<T: View>(template: String, @ViewBuilder timeView: @escaping () -> T)
|
|
113
|
+
-> some View
|
|
114
|
+
{
|
|
115
|
+
let placeholder = "{time}"
|
|
116
|
+
let segments = template.components(separatedBy: placeholder)
|
|
117
|
+
|
|
118
|
+
if segments.count > 1 {
|
|
119
|
+
HStack(spacing: 0) {
|
|
120
|
+
ForEach(Array(segments.enumerated()), id: \.offset) { index, segment in
|
|
121
|
+
Text(verbatim: segment)
|
|
122
|
+
if index < segments.count - 1 {
|
|
123
|
+
timeView()
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
} else {
|
|
128
|
+
Text(template)
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import AppIntents
|
|
2
|
+
import SwiftUI
|
|
3
|
+
|
|
4
|
+
public struct VoltraToggle: VoltraView {
|
|
5
|
+
public typealias Parameters = ToggleParameters
|
|
6
|
+
|
|
7
|
+
public let element: VoltraElement
|
|
8
|
+
private let title: String
|
|
9
|
+
|
|
10
|
+
@Environment(\.voltraEnvironment)
|
|
11
|
+
private var voltraEnvironment
|
|
12
|
+
|
|
13
|
+
public init(_ element: VoltraElement) {
|
|
14
|
+
self.element = element
|
|
15
|
+
title = element.props?["title"]?.stringValue ?? ""
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
public var body: some View {
|
|
19
|
+
if #available(iOS 17.0, *) {
|
|
20
|
+
Toggle(
|
|
21
|
+
isOn: params.defaultValue,
|
|
22
|
+
intent: VoltraInteractionIntent(
|
|
23
|
+
activityId: voltraEnvironment.activityId,
|
|
24
|
+
componentId: element.id ?? "unknown",
|
|
25
|
+
payload: (params.defaultValue) ? "false" : "true"
|
|
26
|
+
)
|
|
27
|
+
) {
|
|
28
|
+
Text(title)
|
|
29
|
+
}
|
|
30
|
+
.applyStyle(element.style)
|
|
31
|
+
} else {
|
|
32
|
+
// Fallback for iOS 16.x: Toggle with static value (intents not supported)
|
|
33
|
+
Toggle(isOn: .constant(params.defaultValue)) {
|
|
34
|
+
Text(title)
|
|
35
|
+
}
|
|
36
|
+
.applyStyle(element.style)
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import SwiftUI
|
|
2
|
+
|
|
3
|
+
public struct VoltraVStack: View {
|
|
4
|
+
private let element: VoltraElement
|
|
5
|
+
|
|
6
|
+
public init(_ element: VoltraElement) {
|
|
7
|
+
self.element = element
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
public var body: some View {
|
|
11
|
+
let params = element.parameters(VStackParameters.self)
|
|
12
|
+
|
|
13
|
+
if params.layout == "flex" {
|
|
14
|
+
flexBody(params: params)
|
|
15
|
+
} else {
|
|
16
|
+
legacyBody(params: params)
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
@ViewBuilder
|
|
21
|
+
private func legacyBody(params: VStackParameters) -> some View {
|
|
22
|
+
let alignmentStr = params.alignment.lowercased()
|
|
23
|
+
let alignment: HorizontalAlignment = switch alignmentStr {
|
|
24
|
+
case "leading": .leading
|
|
25
|
+
case "trailing": .trailing
|
|
26
|
+
case "center": .center
|
|
27
|
+
default: .center
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// Extract gap from style for legacy mode too
|
|
31
|
+
let anyStyle = element.style?.mapValues { $0.toAny() } ?? [:]
|
|
32
|
+
let (layout, _, _, _) = StyleConverter.convert(anyStyle)
|
|
33
|
+
// spacing prop takes precedence over gap style
|
|
34
|
+
let gap = params.spacing ?? layout.gap ?? 0
|
|
35
|
+
|
|
36
|
+
let hasFillWidth = layout.width == .fill
|
|
37
|
+
|
|
38
|
+
let frameAlignment = Alignment(horizontal: alignment, vertical: .center)
|
|
39
|
+
|
|
40
|
+
VStack(alignment: alignment, spacing: gap) {
|
|
41
|
+
element.children ?? .empty
|
|
42
|
+
}
|
|
43
|
+
.voltraIf(hasFillWidth) { content in
|
|
44
|
+
content.frame(maxWidth: .infinity, alignment: frameAlignment)
|
|
45
|
+
}
|
|
46
|
+
.applyStyle(element.style, contentAlignment: frameAlignment)
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
@ViewBuilder
|
|
50
|
+
private func flexBody(params: VStackParameters) -> some View {
|
|
51
|
+
let alignmentFallback = FlexContainerHelper.verticalAlignmentFallback(params.alignment)
|
|
52
|
+
let values = FlexContainerHelper.parseValues(from: element, alignmentFallback: alignmentFallback)
|
|
53
|
+
// spacing prop takes precedence over gap style
|
|
54
|
+
let spacing = params.spacing ?? values.gap
|
|
55
|
+
|
|
56
|
+
VoltraFlexStackLayout(
|
|
57
|
+
axis: .vertical,
|
|
58
|
+
spacing: spacing,
|
|
59
|
+
alignItems: values.alignItems,
|
|
60
|
+
justifyContent: values.justifyContent,
|
|
61
|
+
containerPadding: values.padding
|
|
62
|
+
) {
|
|
63
|
+
(element.children ?? .empty)
|
|
64
|
+
.environment(\.isInFlexContainer, true)
|
|
65
|
+
}
|
|
66
|
+
.modifier(FlexContainerStyleModifier(values: values))
|
|
67
|
+
}
|
|
68
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import SwiftUI
|
|
2
|
+
|
|
3
|
+
public struct VoltraZStack: VoltraView {
|
|
4
|
+
public typealias Parameters = ZStackParameters
|
|
5
|
+
|
|
6
|
+
public let element: VoltraElement
|
|
7
|
+
|
|
8
|
+
public init(_ element: VoltraElement) {
|
|
9
|
+
self.element = element
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
public var body: some View {
|
|
13
|
+
let alignmentStr = params.alignment?.lowercased()
|
|
14
|
+
|
|
15
|
+
let alignment: Alignment = switch alignmentStr {
|
|
16
|
+
case "leading": .leading
|
|
17
|
+
case "trailing": .trailing
|
|
18
|
+
case "top": .top
|
|
19
|
+
case "bottom": .bottom
|
|
20
|
+
case "topleading": .topLeading
|
|
21
|
+
case "toptrailing": .topTrailing
|
|
22
|
+
case "bottomleading": .bottomLeading
|
|
23
|
+
case "bottomtrailing": .bottomTrailing
|
|
24
|
+
case "center": .center
|
|
25
|
+
default: .center
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
ZStack(alignment: alignment) {
|
|
29
|
+
element.children ?? .empty
|
|
30
|
+
}
|
|
31
|
+
.applyStyle(element.style)
|
|
32
|
+
}
|
|
33
|
+
}
|