lottie-ios 3.2.3 → 3.4.0
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/.github/actions/setup/action.yml +32 -0
- package/.github/issue_template.md +6 -23
- package/.github/workflows/main.yml +95 -0
- package/.spi.yml +6 -0
- package/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata +7 -0
- package/.swiftpm/xcode/package.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/.swiftpm/xcode/xcuserdata/{brandonwithrow.xcuserdatad → cal.xcuserdatad}/xcschemes/xcschememanagement.plist +25 -15
- package/.swiftpm/xcode/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +14 -0
- package/Gemfile +4 -0
- package/Gemfile.lock +102 -0
- package/Lottie.xcodeproj/project.pbxproj +2005 -1974
- package/Lottie.xcodeproj/project.xcworkspace/contents.xcworkspacedata +1 -1
- package/Lottie.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +23 -0
- package/Lottie.xcodeproj/project.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/Lottie.xcodeproj/xcshareddata/xcschemes/{Lottie_iOS.xcscheme → Lottie (iOS).xcscheme } +15 -18
- package/Lottie.xcodeproj/xcshareddata/xcschemes/{Lottie_macOS.xcscheme → Lottie (macOS).xcscheme } +7 -20
- package/Lottie.xcodeproj/xcshareddata/xcschemes/{Lottie_tvOS.xcscheme → Lottie (tvOS).xcscheme } +5 -18
- package/Lottie.xcodeproj/xcuserdata/cal.xcuserdatad/xcschemes/xcschememanagement.plist +37 -0
- package/Lottie.xcodeproj/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +24 -0
- package/Lottie.xcworkspace/contents.xcworkspacedata +10 -0
- package/Lottie.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
- package/Lottie.xcworkspace/xcshareddata/swiftpm/Package.resolved +34 -0
- package/Lottie.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/{Lottie.xcodeproj/xcuserdata/brandonwithrow.xcuserdatad → Lottie.xcworkspace/xcuserdata/cal.xcuserdatad}/xcdebugger/Breakpoints_v2.xcbkptlist +2 -2
- package/Lottie.xcworkspace/xcuserdata/cal.xcuserdatad/xcdebugger/Expressions.xcexplist +153 -0
- package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +39 -0
- package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/xcdebugger/Expressions.xcexplist +25 -0
- package/Mintfile +3 -0
- package/Package.swift +5 -15
- package/README.md +40 -59
- package/Rakefile +125 -0
- package/Sources/Private/CoreAnimation/Animations/CAAnimation+TimingConfiguration.swift +76 -0
- package/Sources/Private/CoreAnimation/Animations/CALayer+addAnimation.swift +322 -0
- package/Sources/Private/CoreAnimation/Animations/CombinedShapeAnimation.swift +53 -0
- package/Sources/Private/CoreAnimation/Animations/CustomPathAnimation.swift +41 -0
- package/Sources/Private/CoreAnimation/Animations/EllipseAnimation.swift +28 -0
- package/Sources/Private/CoreAnimation/Animations/GradientAnimations.swift +167 -0
- package/Sources/Private/CoreAnimation/Animations/LayerProperty.swift +229 -0
- package/Sources/Private/CoreAnimation/Animations/OpacityAnimation.swift +52 -0
- package/Sources/Private/CoreAnimation/Animations/RectangleAnimation.swift +31 -0
- package/Sources/Private/CoreAnimation/Animations/ShapeAnimation.swift +246 -0
- package/Sources/Private/CoreAnimation/Animations/StarAnimation.swift +95 -0
- package/Sources/Private/CoreAnimation/Animations/StrokeAnimation.swift +70 -0
- package/Sources/Private/CoreAnimation/Animations/TransformAnimations.swift +205 -0
- package/Sources/Private/CoreAnimation/Animations/VisibilityAnimation.swift +37 -0
- package/Sources/Private/CoreAnimation/CompatibilityTracker.swift +130 -0
- package/Sources/Private/CoreAnimation/CoreAnimationLayer.swift +492 -0
- package/Sources/Private/CoreAnimation/Extensions/CALayer+fillBounds.swift +35 -0
- package/Sources/Private/CoreAnimation/Extensions/KeyframeGroup+exactlyOneKeyframe.swift +37 -0
- package/Sources/Private/CoreAnimation/Extensions/Keyframes+combinedIfPossible.swift +61 -0
- package/Sources/Private/CoreAnimation/Layers/AnimationLayer.swift +77 -0
- package/Sources/Private/CoreAnimation/Layers/BaseAnimationLayer.swift +33 -0
- package/Sources/Private/CoreAnimation/Layers/BaseCompositionLayer.swift +87 -0
- package/Sources/Private/CoreAnimation/Layers/CALayer+setupLayerHierarchy.swift +131 -0
- package/Sources/Private/CoreAnimation/Layers/GradientRenderLayer.swift +87 -0
- package/Sources/Private/CoreAnimation/Layers/ImageLayer.swift +79 -0
- package/Sources/Private/CoreAnimation/Layers/LayerModel+makeAnimationLayer.swift +60 -0
- package/Sources/Private/CoreAnimation/Layers/MaskCompositionLayer.swift +138 -0
- package/Sources/Private/CoreAnimation/Layers/PreCompLayer.swift +140 -0
- package/Sources/Private/CoreAnimation/Layers/ShapeItemLayer.swift +259 -0
- package/Sources/Private/CoreAnimation/Layers/ShapeLayer.swift +305 -0
- package/Sources/Private/CoreAnimation/Layers/SolidLayer.swift +47 -0
- package/Sources/Private/CoreAnimation/Layers/TextLayer.swift +91 -0
- package/Sources/Private/CoreAnimation/Layers/TransformLayer.swift +11 -0
- package/Sources/Private/CoreAnimation/ValueProviderStore.swift +139 -0
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/CompositionLayer.swift +93 -85
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/ImageCompositionLayer.swift +24 -21
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/MaskContainerLayer.swift +77 -54
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/NullCompositionLayer.swift +5 -5
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/PreCompositionLayer.swift +57 -41
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/ShapeCompositionLayer.swift +22 -20
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/SolidCompositionLayer.swift +26 -17
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/TextCompositionLayer.swift +42 -36
- package/{lottie-swift/src/Private/LayerContainers/AnimationContainer.swift → Sources/Private/MainThread/LayerContainers/MainThreadAnimationLayer.swift} +201 -140
- package/Sources/Private/MainThread/LayerContainers/Utility/CachedImageProvider.swift +47 -0
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/Utility/CompositionLayersInitializer.swift +33 -24
- package/{lottie-swift/src/Private/LayerContainers/Utility/TextLayer.swift → Sources/Private/MainThread/LayerContainers/Utility/CoreTextRenderLayer.swift} +119 -105
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/Utility/InvertedMatteLayer.swift +25 -24
- package/Sources/Private/MainThread/LayerContainers/Utility/LayerFontProvider.swift +41 -0
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/Utility/LayerImageProvider.swift +20 -16
- package/Sources/Private/MainThread/LayerContainers/Utility/LayerTextProvider.swift +40 -0
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/Utility/LayerTransformNode.swift +83 -67
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Extensions/ItemsExtension.swift +6 -4
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/NodeProperty.swift +29 -21
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/Protocols/AnyNodeProperty.swift +16 -10
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/Protocols/AnyValueContainer.swift +6 -6
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/Protocols/KeypathSearchable.swift +5 -5
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/Protocols/NodePropertyMap.swift +10 -8
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/ValueContainer.swift +25 -21
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/ValueProviders/GroupInterpolator.swift +23 -17
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/ValueProviders/KeyframeInterpolator.swift +128 -108
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/ValueProviders/SingleValueProvider.swift +22 -17
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/ModifierNodes/TrimPathNode.swift +113 -79
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/GroupOutputNode.swift +22 -16
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/PassThroughOutputNode.swift +19 -15
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/PathOutputNode.swift +22 -20
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/Renderables/FillRenderer.swift +22 -23
- package/Sources/Private/MainThread/NodeRenderSystem/Nodes/OutputNodes/Renderables/GradientFillRenderer.swift +242 -0
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/Renderables/GradientStrokeRenderer.swift +29 -22
- package/{lottie-swift/src/Private/NodeRenderSystem/Nodes/OutputNodes/Renderables/GradientFillRenderer.swift → Sources/Private/MainThread/NodeRenderSystem/Nodes/OutputNodes/Renderables/LegacyGradientFillRenderer.swift} +92 -65
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/Renderables/StrokeRenderer.swift +22 -18
- package/Sources/Private/MainThread/NodeRenderSystem/Nodes/PathNodes/EllipseNode.swift +139 -0
- package/Sources/Private/MainThread/NodeRenderSystem/Nodes/PathNodes/PolygonNode.swift +170 -0
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/PathNodes/RectNode.swift +94 -57
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/PathNodes/ShapeNode.swift +42 -29
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/PathNodes/StarNode.swift +105 -66
- package/Sources/Private/MainThread/NodeRenderSystem/Nodes/RenderContainers/GroupNode.swift +155 -0
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/RenderNodes/FillNode.swift +51 -37
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/RenderNodes/GradientFillNode.swift +54 -42
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/RenderNodes/GradientStrokeNode.swift +65 -57
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/RenderNodes/StrokeNode.swift +84 -58
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/Text/TextAnimatorNode.swift +138 -119
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Protocols/AnimatorNode.swift +80 -79
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Protocols/PathNode.swift +5 -3
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Protocols/RenderNode.swift +22 -17
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/RenderLayers/ShapeContainerLayer.swift +26 -23
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/RenderLayers/ShapeRenderLayer.swift +35 -25
- package/Sources/Private/Model/Animation.swift +160 -0
- package/Sources/Private/Model/Assets/Asset.swift +43 -0
- package/{lottie-swift/src → Sources}/Private/Model/Assets/AssetLibrary.swift +40 -13
- package/Sources/Private/Model/Assets/ImageAsset.swift +112 -0
- package/{lottie-swift/src → Sources}/Private/Model/Assets/PrecompAsset.swift +20 -10
- package/Sources/Private/Model/DictionaryInitializable.swift +67 -0
- package/Sources/Private/Model/Extensions/Bundle.swift +34 -0
- package/{lottie-swift/src → Sources}/Private/Model/Extensions/KeyedDecodingContainerExtensions.swift +8 -4
- package/Sources/Private/Model/Keyframes/KeyframeData.swift +113 -0
- package/Sources/Private/Model/Keyframes/KeyframeGroup.swift +197 -0
- package/{lottie-swift/src → Sources}/Private/Model/Layers/ImageLayerModel.swift +21 -11
- package/Sources/Private/Model/Layers/LayerModel.swift +228 -0
- package/{lottie-swift/src → Sources}/Private/Model/Layers/PreCompLayerModel.swift +39 -22
- package/{lottie-swift/src → Sources}/Private/Model/Layers/ShapeLayerModel.swift +23 -12
- package/{lottie-swift/src → Sources}/Private/Model/Layers/SolidLayerModel.swift +31 -19
- package/{lottie-swift/src → Sources}/Private/Model/Layers/TextLayerModel.swift +33 -19
- package/Sources/Private/Model/Objects/DashPattern.swift +44 -0
- package/Sources/Private/Model/Objects/Marker.swift +33 -0
- package/Sources/Private/Model/Objects/Mask.swift +80 -0
- package/Sources/Private/Model/Objects/Transform.swift +179 -0
- package/Sources/Private/Model/ShapeItems/Ellipse.swift +75 -0
- package/Sources/Private/Model/ShapeItems/Fill.swift +74 -0
- package/Sources/Private/Model/ShapeItems/GradientFill.swift +124 -0
- package/Sources/Private/Model/ShapeItems/GradientStroke.swift +186 -0
- package/{lottie-swift/src → Sources}/Private/Model/ShapeItems/Group.swift +21 -10
- package/{lottie-swift/src → Sources}/Private/Model/ShapeItems/Merge.swift +29 -11
- package/Sources/Private/Model/ShapeItems/Rectangle.swift +73 -0
- package/Sources/Private/Model/ShapeItems/Repeater.swift +136 -0
- package/Sources/Private/Model/ShapeItems/Shape.swift +56 -0
- package/Sources/Private/Model/ShapeItems/ShapeItem.swift +163 -0
- package/Sources/Private/Model/ShapeItems/ShapeTransform.swift +136 -0
- package/Sources/Private/Model/ShapeItems/Star.swift +132 -0
- package/Sources/Private/Model/ShapeItems/Stroke.swift +102 -0
- package/Sources/Private/Model/ShapeItems/Trim.swift +78 -0
- package/Sources/Private/Model/Text/Font.swift +61 -0
- package/{lottie-swift/src → Sources}/Private/Model/Text/Glyph.swift +63 -39
- package/Sources/Private/Model/Text/TextAnimator.swift +165 -0
- package/Sources/Private/Model/Text/TextDocument.swift +123 -0
- package/Sources/Private/RootAnimationLayer.swift +51 -0
- package/{lottie-swift/src → Sources}/Private/Utility/Debugging/AnimatorNodeDebugging.swift +7 -7
- package/{lottie-swift/src → Sources}/Private/Utility/Debugging/LayerDebugging.swift +72 -47
- package/Sources/Private/Utility/Debugging/TestHelpers.swift +10 -0
- package/{lottie-swift/src → Sources}/Private/Utility/Extensions/AnimationKeypathExtension.swift +69 -59
- package/Sources/Private/Utility/Extensions/BlendMode+Filter.swift +31 -0
- package/Sources/Private/Utility/Extensions/CGColor+RGB.swift +22 -0
- package/{lottie-swift/src → Sources}/Private/Utility/Extensions/CGFloatExtensions.swift +70 -67
- package/Sources/Private/Utility/Extensions/DataExtension.swift +27 -0
- package/Sources/Private/Utility/Extensions/MathKit.swift +451 -0
- package/Sources/Private/Utility/Extensions/StringExtensions.swift +39 -0
- package/{lottie-swift/src → Sources}/Private/Utility/Helpers/AnimationContext.swift +42 -16
- package/Sources/Private/Utility/Interpolatable/InterpolatableExtensions.swift +135 -0
- package/{lottie-swift/src → Sources}/Private/Utility/Interpolatable/KeyframeExtensions.swift +13 -10
- package/Sources/Private/Utility/Interpolatable/KeyframeGroup+Extensions.swift +59 -0
- package/{lottie-swift/src → Sources}/Private/Utility/Primitives/BezierPath.swift +229 -142
- package/Sources/Private/Utility/Primitives/CGPointExtension.swift +35 -0
- package/{lottie-swift/src → Sources}/Private/Utility/Primitives/ColorExtension.swift +46 -14
- package/{lottie-swift/src → Sources}/Private/Utility/Primitives/CompoundBezierPath.swift +58 -49
- package/Sources/Private/Utility/Primitives/CurveVertex.swift +186 -0
- package/Sources/Private/Utility/Primitives/PathElement.swift +75 -0
- package/Sources/Private/Utility/Primitives/UnitBezier.swift +115 -0
- package/Sources/Private/Utility/Primitives/VectorsExtensions.swift +341 -0
- package/Sources/Public/Animation/AnimationPublic.swift +269 -0
- package/Sources/Public/Animation/AnimationView.swift +1315 -0
- package/Sources/Public/Animation/AnimationViewInitializers.swift +107 -0
- package/Sources/Public/AnimationCache/AnimationCacheProvider.swift +22 -0
- package/{lottie-swift/src → Sources}/Public/AnimationCache/LRUAnimationCache.swift +22 -18
- package/Sources/Public/DynamicProperties/AnimationKeypath.swift +49 -0
- package/Sources/Public/DynamicProperties/AnyValueProvider.swift +132 -0
- package/{lottie-swift/src → Sources}/Public/DynamicProperties/ValueProviders/ColorValueProvider.swift +54 -36
- package/{lottie-swift/src → Sources}/Public/DynamicProperties/ValueProviders/FloatValueProvider.swift +40 -36
- package/Sources/Public/DynamicProperties/ValueProviders/GradientValueProvider.swift +125 -0
- package/{lottie-swift/src → Sources}/Public/DynamicProperties/ValueProviders/PointValueProvider.swift +40 -35
- package/{lottie-swift/src → Sources}/Public/DynamicProperties/ValueProviders/SizeValueProvider.swift +40 -35
- package/{lottie-swift/src → Sources}/Public/FontProvider/AnimationFontProvider.swift +15 -8
- package/Sources/Public/ImageProvider/AnimationImageProvider.swift +21 -0
- package/Sources/Public/Keyframes/Interpolatable.swift +253 -0
- package/Sources/Public/Keyframes/Keyframe.swift +92 -0
- package/Sources/Public/Logging/LottieLogger.swift +124 -0
- package/Sources/Public/LottieConfiguration.swift +143 -0
- package/{lottie-swift/src → Sources}/Public/Primitives/AnimationTime.swift +1 -1
- package/{lottie-swift/src → Sources}/Public/Primitives/Color.swift +10 -6
- package/{lottie-swift/src → Sources}/Public/Primitives/Vectors.swift +13 -12
- package/Sources/Public/TextProvider/AnimationTextProvider.swift +53 -0
- package/{lottie-swift/src → Sources}/Public/iOS/AnimatedButton.swift +36 -26
- package/{lottie-swift/src → Sources}/Public/iOS/AnimatedControl.swift +102 -91
- package/{lottie-swift/src → Sources}/Public/iOS/AnimatedSwitch.swift +123 -92
- package/{lottie-swift/src → Sources}/Public/iOS/AnimationSubview.swift +3 -3
- package/Sources/Public/iOS/AnimationViewBase.swift +78 -0
- package/{lottie-swift/src → Sources}/Public/iOS/BundleImageProvider.swift +37 -34
- package/{lottie-swift/src → Sources}/Public/iOS/Compatibility/CompatibleAnimationKeypath.swift +4 -0
- package/{lottie-swift/src → Sources}/Public/iOS/Compatibility/CompatibleAnimationView.swift +38 -29
- package/{lottie-swift/src → Sources}/Public/iOS/FilepathImageProvider.swift +24 -20
- package/{lottie-swift/src → Sources}/Public/iOS/UIColorExtension.swift +4 -4
- package/{lottie-swift/src/Public/MacOS/AnimationSubview.swift → Sources/Public/macOS/AnimationSubview.macOS.swift} +4 -5
- package/{lottie-swift/src/Public/MacOS/LottieView.swift → Sources/Public/macOS/AnimationViewBase.macOS.swift} +58 -50
- package/{lottie-swift/src/Public/MacOS/BundleImageProvider.swift → Sources/Public/macOS/BundleImageProvider.macOS.swift} +32 -32
- package/Sources/Public/macOS/FilepathImageProvider.macOS.swift +69 -0
- package/Tests/AnimationKeypathTests.swift +94 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~-7Vi1RszY1XYnR2CCkEwIpKG8NwwA9zsZEz_WD7Dv6kKh4RC7N7ob8NIRVHGUJKp7eXxlpeI_gzD87Pcs_2u0g== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~-SKV2drO-SFlrlh-wrzECDMkUSr-aF1lV9h-5onOy94zSTsD-oI45s0-KpOK45L-kq3hRY7v9vm-xmh00_eheg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~-_CU_vuaiFfObSeDFfmp7GuB20ThMSAL-P_RUMowiQLbdu-y0bU9upIm3q8g6XmXUG5hP6J1az0Ma5Hi_rhhRg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~03aPYP6VHJjZj5DlphGarj0xdw43qu09Onx5SReZoPvg9zh5uL212E-KWfGct9jf6JG0JFV2tdbBi7X_8bH9aw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~1Z82GPBBPc1VLvn4O7V5glb6lgyXteNlDREUzV_TPymM4ra4UkBMklzV90lEqoYRCDuRVzaQHaDYbmYp3-8CFw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~1mFDCboXpUu9pSHAiVGr1O_QgqEEtvJp_LUhickxLZo0Z5pj3fvadn1l2MzEOd4bFsVBZifUvcyPa7dzlMWF-A== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~2_L9PUjv2JDKu1n8bDLb4XLB-yex6ZVjDDMwfuKAr7teDw-SKgLgkW6H-m_gjWChIVdB4vW6yvHP7XJxvXtRNA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~4VqMqsI5lOfxRppnud6-VDWcNsU8J7VgFCJfW2dXPwOcAkvU-I8Um5yp9n0Zv6nr3VmcxYggaVMDFfR0U_vjKw== +1 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~4krT4ZMzDOu34msFUq0Xod142kw4pAeSWX4JSxlsjOI0Wanu3343qeespgFi61MTWq1DdH9XXspVKqGlGm_fyw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~5_aJsdP-e3dRTAUnH-y1U2plaCuUi1vyHriaZuNK0xFe8wGl9Qft6uLCX2Qt6CRBKJQluEe9o0uRWw1eb42FHQ== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~8b0bSqV7eND54zvHvu1v2Htpm7yn-BOEFw5d3mITJrXWNykJ5BTR9WbrD80JEctNcT-rDqO2xfrQk1tFWeY6Sw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~9u8KAGpgtSm-mQ12Py8RZUbYbDlBhM3w1I2MQO53K2CSn6IePp7g65DBcdXTYMfG1bgoJ-6x30fjnGe-2UYsDQ== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~Bw7uMs4wqB9ahfEqGii2FkQ9pvZmG6HGe2hmbAT2wyM5hpn8Xh5dELysMcEz6hEsqmn6HdRdLOLZhC_fNaXzgA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~BwUq2xXQYuE8ya6HT6lfNsdtEjz5AKGf8GvLY6VBxQyIY1vgj_Gov-3NeM69OS66BQRDK0PG9H4Oyg0R48E4vg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~EkDVUR6dcnzxV_lYjkrJ5QGMVTCvb_upAoBF6DBu61sQkGvZN3fSRTsJ1XfJIZO-JUzdNoVA3D_CcvokL0gnQg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~FUkcLSJ8RAuPenM4HFG1R-sN5-cDBGcTxgR2jaVCna7xV0ZTyBHriB1Nn59mariNlJDiCoBtMUQEmauGxWtfBA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~FqsuZe4RVLOOVUYLTL-GTIohZ8TdSfxx7m2KJtLYFPGOdE4XorTX7Oc7kXbhghPRppXT3jW-slI37M34YNEvLQ== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~G4F_NtyTj3i46fmKm0NorHAeq8tYWWYf6uv5yC1DwzdpWVoYbOPufmFNvdEbxZt4AMdV0gKx3HI46EAXNOQVFg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~GxetzGUNDgaBBXcTmLK6p9JBDX3I3QPshshbui1IaEWvJbQko-E36tCKwaJYHbleAWz9FqkAM_Tqx3YOmSVkVg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~H1Wjd5kKWDW4t3SDodxiHV72V8WT0xwPubw5cJTNLkPRLgaILFPh-dpy8EOUNgy1KzrDujFsm9EcTsbuqtMPLA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~JpI5MH4zCgebUHFpXVn4zjtsGtMNnO7BQZWfNARAB5UWa9gqz6YXHR3uLCJ_AvJ3lh53BUVkavsx9TY2FMmxbA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~JujNYkJtcux0Ni4QnR64zu4Wz_zYjyKvYaYZm5ypxTLPSzF3_jNE_NO4sdbDamF8wEqWoky1uf4ZE0JT3L607A== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~KJSEA6DKnb2_FRPSqKZGh41eo-C8x448J9kEBrH012bUrZfOSDvrgmIrU0Vz7Ri3gaS9aKKmSaVMvXsHSlTJVA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~MStOwu3jBlJtcRnxrseVOuhI4kCj--ggFPG7sqrq5w1hjrI3bVyD-bm1Jwyx0noY3wT1rHDEvaGWnV2qsGjGwg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~McsJ8kFVf3IjhgXIRdw8Xx-EXgbV071bmlj2BBnk52xrWl3sEeiIyxwUsF7mIWvMRWfcFfu4VGHYyqfk2BeHXw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~NHt9fVe4kDdbxnglKcEwXaRK-WsYEOaD23Kbl8SJPRMYHr_Z6SJd_HmG3BROHHR_M6TgSmucONpDJdTj5tjuFw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~Nfo2iwCPcfAcOBIVyoUAK0-PIfr5qYxIKZt-uaSaTBdrTNxAuJ1ItmeDPZ3VdJJmxD_c22No7x482bdd3_yYtw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~S2Qlu11xBhEd5aGSzWsnw1TR8u8PiOF93GO0j5bfNoAFCVzxKOwhRFoIXba2EpQnLQqFdIKyhWN3l70A4GPHmg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~W7a7M37RO9jgck2zeR0471Pm7e8K0Kqj5tXEouDjvqKZXSrWxMaWD28oqkKKYAiU4608R4S9mM11KyphljdMSw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~XUo1oyPCrlL7CA74wG-OzQ06VOWJYWvHGFHU7keZN1SKaIXjHX5qi_kBzjG_rBCi89-S8GVmCy7S3PHSjG8SbQ== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~Xh0VmDvFNMELHu08-vrs54pegVyUwwDRxx_nXkwyD0NjnYozyqcGAKAr_QWHmw6F8XyuWg51M9KGpJJIFzzGuw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~Xve-wMBp_lxVUgD9qH5GwieGP9cAWtm0xULZvdGjBRUMvaevmpCB5gnbMBuIXAO6a1c9v6WUq0jNVX7ut5HvOw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~ZU1XkZFgnEE22CXEF-pOlcj5f10x-KM1Vw9d4IOLu-NiTZcz7koYPixhdrB1PJr8J-h9NpJmfqEastfxamA1jQ== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~_YkNYEHTsbbtFILJpzH3HenH0t4ShI25dIMdve541CF5bl-jPF3X3F7tq-t5dvP0TEkATsOJdLQdBp1xv4Q-ag== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~boy6mpn2jkwm60jjgQ0TG25UqRdN46LzmgTVCrpy6nBOgkLCGkGHcbceiwjU1itS_vj3-iQX0ZnrWOQrPyfHNA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~bwzpVZ9hAqGDHhXs2FRA82dfGfLmc7-m0uQhZDDfHHO7hQ17M_Np341BZX4WDLhYYS4cdUgaDodlNpdfpG3nXw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~cBxe-9PpAGFdAsYkmdN3lJVqEliLcRYlyoAov0aPZfJGwUr_cOm3XpjO7nmf_2eLf8UAx-rycjnJzw07xLrNCA== +1 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~dirWk6W4Pav1oyciuflfJlRu0iuxbYOmrpQapOJ0mV9C1SQ-jvDRv_7h753Cy18-SwULARUdWsyUy3yNNvxF7w== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~ebwZVjSEHroc9jtIm4jd_h_YAqEBcOkAZ4HPNJT8pLCldjRcTq-obQLakxXOhfuoOBlYBoZLuO-Y0lskeZRYKw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~gfcRcmRIr0h09d0jiZsA7nUeQv2XtapxuYEXZy1Z9um0tTJQvz-O5ef5f7zhLenLvjnDtDtlY_aY4Hvpce6e1Q== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~hgOgiVCyv2R0W-f0qKw5xYPeUwj8_ccCM9vKH_7vAQcCO9t8BwR1APGRBv20AONmp-PYMXmtgsBlQkNBRBpdQA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~hrhCl-YRAAr8ByNB_LCgEBsVNHMp92gTIUknetpUHMjcXl4Hpn_uY-h6C45oga0ZALnfGCo6iKTmiPLa4Qvnpg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~n2yoR7JsyL4DSUwmjnpE4Iq9Qi_eeZrmpPU8cdehDFKfESK7nwxXxfrSMQbk0BQ2lgGPadoRcd1-qr1xVz97jA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~nMCcZm8WvPogyO_nuJ926Q3Q2dqVMN2LdjEL1Kq2wJ_RG-rH-e_6v41l1xZbCsQTa3XykQdEiXNc0HtAvT6IRA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~oc3C7xkUt-OWDL6rrsxs-seS4Fu1bqBWAAXCHalgShaGg9MUrOiRbHT2DcAnhyQFKx6x5FRbvjmYoQWrQiXJZA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~p-ihj7SEgkDXpMu9hvKE_wiX9cvtwyXrdIn964BfedXHKGpC6o7mMPxEyC0kRPVi_EZs_MRV5bAPEpl5h5we0g== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~qlhO_D9oE8uSKH-mZqyRF9pp4Zv1Tv0dIYcqrH4hb1VWlIxcdxmg2j0M8496cQeFXC5bn_JMXdBlD-d6cnFF8w== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~tjpiyIxJR_boTdUNrtFDuKIZoY84fI4lA1oMJbq9e2ZmYKIK5FeRN2O8cV_yMOYJGr4lbv03kTmT70mCjUc2_Q== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~wULeoj18eEKJWAKx1uFQVwS48cUGFcYPRJQj1Ro5XNJsWCwppGSCdIPhwifD6Z2f_j3zfI2SmC2Gg81sBXXW7g== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~zrEihMys4NVV5rx6FmuzEGO2TjloI3OiC7yzIhvqYoRo43ibb2F-Km6Jf4NX-ac62pOLBYZRcjQTvYMpn75_oA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~-7Vi1RszY1XYnR2CCkEwIpKG8NwwA9zsZEz_WD7Dv6kKh4RC7N7ob8NIRVHGUJKp7eXxlpeI_gzD87Pcs_2u0g== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~-SKV2drO-SFlrlh-wrzECDMkUSr-aF1lV9h-5onOy94zSTsD-oI45s0-KpOK45L-kq3hRY7v9vm-xmh00_eheg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~-_CU_vuaiFfObSeDFfmp7GuB20ThMSAL-P_RUMowiQLbdu-y0bU9upIm3q8g6XmXUG5hP6J1az0Ma5Hi_rhhRg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~03aPYP6VHJjZj5DlphGarj0xdw43qu09Onx5SReZoPvg9zh5uL212E-KWfGct9jf6JG0JFV2tdbBi7X_8bH9aw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~1Z82GPBBPc1VLvn4O7V5glb6lgyXteNlDREUzV_TPymM4ra4UkBMklzV90lEqoYRCDuRVzaQHaDYbmYp3-8CFw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~1mFDCboXpUu9pSHAiVGr1O_QgqEEtvJp_LUhickxLZo0Z5pj3fvadn1l2MzEOd4bFsVBZifUvcyPa7dzlMWF-A== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~2_L9PUjv2JDKu1n8bDLb4XLB-yex6ZVjDDMwfuKAr7teDw-SKgLgkW6H-m_gjWChIVdB4vW6yvHP7XJxvXtRNA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~4VqMqsI5lOfxRppnud6-VDWcNsU8J7VgFCJfW2dXPwOcAkvU-I8Um5yp9n0Zv6nr3VmcxYggaVMDFfR0U_vjKw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~4krT4ZMzDOu34msFUq0Xod142kw4pAeSWX4JSxlsjOI0Wanu3343qeespgFi61MTWq1DdH9XXspVKqGlGm_fyw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~5_aJsdP-e3dRTAUnH-y1U2plaCuUi1vyHriaZuNK0xFe8wGl9Qft6uLCX2Qt6CRBKJQluEe9o0uRWw1eb42FHQ== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~8b0bSqV7eND54zvHvu1v2Htpm7yn-BOEFw5d3mITJrXWNykJ5BTR9WbrD80JEctNcT-rDqO2xfrQk1tFWeY6Sw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~9u8KAGpgtSm-mQ12Py8RZUbYbDlBhM3w1I2MQO53K2CSn6IePp7g65DBcdXTYMfG1bgoJ-6x30fjnGe-2UYsDQ== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~Bw7uMs4wqB9ahfEqGii2FkQ9pvZmG6HGe2hmbAT2wyM5hpn8Xh5dELysMcEz6hEsqmn6HdRdLOLZhC_fNaXzgA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~BwUq2xXQYuE8ya6HT6lfNsdtEjz5AKGf8GvLY6VBxQyIY1vgj_Gov-3NeM69OS66BQRDK0PG9H4Oyg0R48E4vg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~EkDVUR6dcnzxV_lYjkrJ5QGMVTCvb_upAoBF6DBu61sQkGvZN3fSRTsJ1XfJIZO-JUzdNoVA3D_CcvokL0gnQg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~FUkcLSJ8RAuPenM4HFG1R-sN5-cDBGcTxgR2jaVCna7xV0ZTyBHriB1Nn59mariNlJDiCoBtMUQEmauGxWtfBA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~FqsuZe4RVLOOVUYLTL-GTIohZ8TdSfxx7m2KJtLYFPGOdE4XorTX7Oc7kXbhghPRppXT3jW-slI37M34YNEvLQ== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~G4F_NtyTj3i46fmKm0NorHAeq8tYWWYf6uv5yC1DwzdpWVoYbOPufmFNvdEbxZt4AMdV0gKx3HI46EAXNOQVFg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~GxetzGUNDgaBBXcTmLK6p9JBDX3I3QPshshbui1IaEWvJbQko-E36tCKwaJYHbleAWz9FqkAM_Tqx3YOmSVkVg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~H1Wjd5kKWDW4t3SDodxiHV72V8WT0xwPubw5cJTNLkPRLgaILFPh-dpy8EOUNgy1KzrDujFsm9EcTsbuqtMPLA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~JpI5MH4zCgebUHFpXVn4zjtsGtMNnO7BQZWfNARAB5UWa9gqz6YXHR3uLCJ_AvJ3lh53BUVkavsx9TY2FMmxbA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~JujNYkJtcux0Ni4QnR64zu4Wz_zYjyKvYaYZm5ypxTLPSzF3_jNE_NO4sdbDamF8wEqWoky1uf4ZE0JT3L607A== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~KJSEA6DKnb2_FRPSqKZGh41eo-C8x448J9kEBrH012bUrZfOSDvrgmIrU0Vz7Ri3gaS9aKKmSaVMvXsHSlTJVA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~MStOwu3jBlJtcRnxrseVOuhI4kCj--ggFPG7sqrq5w1hjrI3bVyD-bm1Jwyx0noY3wT1rHDEvaGWnV2qsGjGwg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~McsJ8kFVf3IjhgXIRdw8Xx-EXgbV071bmlj2BBnk52xrWl3sEeiIyxwUsF7mIWvMRWfcFfu4VGHYyqfk2BeHXw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~NHt9fVe4kDdbxnglKcEwXaRK-WsYEOaD23Kbl8SJPRMYHr_Z6SJd_HmG3BROHHR_M6TgSmucONpDJdTj5tjuFw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~Nfo2iwCPcfAcOBIVyoUAK0-PIfr5qYxIKZt-uaSaTBdrTNxAuJ1ItmeDPZ3VdJJmxD_c22No7x482bdd3_yYtw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~S2Qlu11xBhEd5aGSzWsnw1TR8u8PiOF93GO0j5bfNoAFCVzxKOwhRFoIXba2EpQnLQqFdIKyhWN3l70A4GPHmg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~W7a7M37RO9jgck2zeR0471Pm7e8K0Kqj5tXEouDjvqKZXSrWxMaWD28oqkKKYAiU4608R4S9mM11KyphljdMSw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~XUo1oyPCrlL7CA74wG-OzQ06VOWJYWvHGFHU7keZN1SKaIXjHX5qi_kBzjG_rBCi89-S8GVmCy7S3PHSjG8SbQ== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~Xh0VmDvFNMELHu08-vrs54pegVyUwwDRxx_nXkwyD0NjnYozyqcGAKAr_QWHmw6F8XyuWg51M9KGpJJIFzzGuw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~Xve-wMBp_lxVUgD9qH5GwieGP9cAWtm0xULZvdGjBRUMvaevmpCB5gnbMBuIXAO6a1c9v6WUq0jNVX7ut5HvOw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~ZU1XkZFgnEE22CXEF-pOlcj5f10x-KM1Vw9d4IOLu-NiTZcz7koYPixhdrB1PJr8J-h9NpJmfqEastfxamA1jQ== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~_YkNYEHTsbbtFILJpzH3HenH0t4ShI25dIMdve541CF5bl-jPF3X3F7tq-t5dvP0TEkATsOJdLQdBp1xv4Q-ag== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~boy6mpn2jkwm60jjgQ0TG25UqRdN46LzmgTVCrpy6nBOgkLCGkGHcbceiwjU1itS_vj3-iQX0ZnrWOQrPyfHNA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~bwzpVZ9hAqGDHhXs2FRA82dfGfLmc7-m0uQhZDDfHHO7hQ17M_Np341BZX4WDLhYYS4cdUgaDodlNpdfpG3nXw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~cBxe-9PpAGFdAsYkmdN3lJVqEliLcRYlyoAov0aPZfJGwUr_cOm3XpjO7nmf_2eLf8UAx-rycjnJzw07xLrNCA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~dirWk6W4Pav1oyciuflfJlRu0iuxbYOmrpQapOJ0mV9C1SQ-jvDRv_7h753Cy18-SwULARUdWsyUy3yNNvxF7w== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~ebwZVjSEHroc9jtIm4jd_h_YAqEBcOkAZ4HPNJT8pLCldjRcTq-obQLakxXOhfuoOBlYBoZLuO-Y0lskeZRYKw== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~gfcRcmRIr0h09d0jiZsA7nUeQv2XtapxuYEXZy1Z9um0tTJQvz-O5ef5f7zhLenLvjnDtDtlY_aY4Hvpce6e1Q== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~hgOgiVCyv2R0W-f0qKw5xYPeUwj8_ccCM9vKH_7vAQcCO9t8BwR1APGRBv20AONmp-PYMXmtgsBlQkNBRBpdQA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~hrhCl-YRAAr8ByNB_LCgEBsVNHMp92gTIUknetpUHMjcXl4Hpn_uY-h6C45oga0ZALnfGCo6iKTmiPLa4Qvnpg== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~n2yoR7JsyL4DSUwmjnpE4Iq9Qi_eeZrmpPU8cdehDFKfESK7nwxXxfrSMQbk0BQ2lgGPadoRcd1-qr1xVz97jA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~nMCcZm8WvPogyO_nuJ926Q3Q2dqVMN2LdjEL1Kq2wJ_RG-rH-e_6v41l1xZbCsQTa3XykQdEiXNc0HtAvT6IRA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~oc3C7xkUt-OWDL6rrsxs-seS4Fu1bqBWAAXCHalgShaGg9MUrOiRbHT2DcAnhyQFKx6x5FRbvjmYoQWrQiXJZA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~p-ihj7SEgkDXpMu9hvKE_wiX9cvtwyXrdIn964BfedXHKGpC6o7mMPxEyC0kRPVi_EZs_MRV5bAPEpl5h5we0g== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~qlhO_D9oE8uSKH-mZqyRF9pp4Zv1Tv0dIYcqrH4hb1VWlIxcdxmg2j0M8496cQeFXC5bn_JMXdBlD-d6cnFF8w== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~tjpiyIxJR_boTdUNrtFDuKIZoY84fI4lA1oMJbq9e2ZmYKIK5FeRN2O8cV_yMOYJGr4lbv03kTmT70mCjUc2_Q== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~wULeoj18eEKJWAKx1uFQVwS48cUGFcYPRJQj1Ro5XNJsWCwppGSCdIPhwifD6Z2f_j3zfI2SmC2Gg81sBXXW7g== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~zrEihMys4NVV5rx6FmuzEGO2TjloI3OiC7yzIhvqYoRo43ibb2F-Km6Jf4NX-ac62pOLBYZRcjQTvYMpn75_oA== +0 -0
- package/Tests/Artifacts/LottieTests.xcresult/Info.plist +29 -0
- package/Tests/AutomaticEngineTests.swift +57 -0
- package/Tests/BundleTests.swift +25 -0
- package/Tests/DataURLTests.swift +64 -0
- package/Tests/ParsingTests.swift +42 -0
- package/Tests/PerformanceTests.swift +215 -0
- package/Tests/Samples/9squares_AlBoardman.json +1 -0
- package/Tests/Samples/Boat_Loader.json +1 -0
- package/Tests/Samples/HamburgerArrow.json +1 -0
- package/Tests/Samples/IconTransitions.json +1 -0
- package/Tests/Samples/Images/dog.png +0 -0
- package/Tests/Samples/Issues/issue_1403.json +1 -0
- package/Tests/Samples/Issues/issue_1407.json +1 -0
- package/Tests/Samples/Issues/issue_1488.json +1 -0
- package/Tests/Samples/Issues/issue_1505.json +1 -0
- package/Tests/Samples/Issues/issue_1628.json +1 -0
- package/Tests/Samples/Issues/pr_1536.json +1 -0
- package/Tests/Samples/Issues/pr_1563.json +8439 -0
- package/Tests/Samples/Issues/pr_1592.json +5527 -0
- package/Tests/Samples/Issues/pr_1599.json +738 -0
- package/Tests/Samples/Issues/pr_1604_1.json +1 -0
- package/Tests/Samples/Issues/pr_1604_2.json +1 -0
- package/Tests/Samples/LottieFiles/LICENSE.md +14 -0
- package/Tests/Samples/LottieFiles/bounce_strokes.json +1 -0
- package/Tests/Samples/LottieFiles/cactus.json +1 -0
- package/Tests/Samples/LottieFiles/dog_car_ride.json +1 -0
- package/Tests/Samples/LottieFiles/draft_icon.json +1 -0
- package/Tests/Samples/LottieFiles/gradient_1.json +1 -0
- package/Tests/Samples/LottieFiles/gradient_2.json +1 -0
- package/Tests/Samples/LottieFiles/gradient_pill.json +1 -0
- package/Tests/Samples/LottieFiles/gradient_shapes.json +1 -0
- package/Tests/Samples/LottieFiles/gradient_square.json +1 -0
- package/Tests/Samples/LottieFiles/growth.json +1 -0
- package/Tests/Samples/LottieFiles/infinity_loader.json +1 -0
- package/Tests/Samples/LottieFiles/loading_dots_1.json +1 -0
- package/Tests/Samples/LottieFiles/loading_dots_2.json +1 -0
- package/Tests/Samples/LottieFiles/loading_dots_3.json +1 -0
- package/Tests/Samples/LottieFiles/loading_gradient_strokes.json +1 -0
- package/Tests/Samples/LottieFiles/settings_slider.json +1 -0
- package/Tests/Samples/LottieFiles/shop.json +1 -0
- package/Tests/Samples/LottieFiles/step_loader.json +1 -0
- package/Tests/Samples/LottieLogo1.json +1 -0
- package/Tests/Samples/LottieLogo1_masked.json +1 -0
- package/Tests/Samples/LottieLogo2.json +1 -0
- package/Tests/Samples/MotionCorpse_Jrcanest.json +1 -0
- package/Tests/Samples/Nonanimating/BasicLayers.json +1 -0
- package/Tests/Samples/Nonanimating/DisableNodesTest.json +1 -0
- package/Tests/Samples/Nonanimating/FirstText.json +1 -0
- package/Tests/Samples/Nonanimating/GeometryTransformTest.json +1 -0
- package/Tests/Samples/Nonanimating/Text_AnimatedProperties.json +1 -0
- package/Tests/Samples/Nonanimating/Text_Glyph.json +1 -0
- package/Tests/Samples/Nonanimating/Text_NoAnimation.json +1 -0
- package/Tests/Samples/Nonanimating/Text_NoGlyph.json +1 -0
- package/Tests/Samples/Nonanimating/Zoom.json +1 -0
- package/Tests/Samples/Nonanimating/_dog.json +1 -0
- package/Tests/Samples/Nonanimating/base64Test.json +1 -0
- package/Tests/Samples/Nonanimating/blend_mode_test.json +1 -0
- package/Tests/Samples/Nonanimating/keypathTest.json +1 -0
- package/Tests/Samples/Nonanimating/verifyLineHeight.json +1 -0
- package/Tests/Samples/PinJump.json +1 -0
- package/Tests/Samples/Private/BrokenLottieFiles/growth_man.json +874 -0
- package/Tests/Samples/Private/BrokenLottieFiles/rocket.json +1 -0
- package/Tests/Samples/Private/China_EmptyState_Itinerary.json +1 -0
- package/Tests/Samples/Private/LoaderHourglass.json +12070 -0
- package/Tests/Samples/Private/README.md +7 -0
- package/Tests/Samples/Private/Urgency/alarm_animated.json +1 -0
- package/Tests/Samples/Private/Urgency/diamond_animated.json +1 -0
- package/Tests/Samples/Private/Urgency/eye_animated.json +1 -0
- package/Tests/Samples/Private/Urgency/light_bulb_animated.json +1 -0
- package/Tests/Samples/Private/Urgency/light_bulb_static.json +1 -0
- package/Tests/Samples/Private/Urgency/piggy_bank_static.json +1 -0
- package/Tests/Samples/Private/Urgency/price_tag_legacy.json +1 -0
- package/Tests/Samples/Private/Urgency/rausch_alarm.json +1 -0
- package/Tests/Samples/Private/Urgency/rausch_alert.json +1 -0
- package/Tests/Samples/Private/Urgency/rausch_clock.json +1 -0
- package/Tests/Samples/Private/Urgency/rausch_diamond.json +1 -0
- package/Tests/Samples/Private/Urgency/rausch_money.json +1 -0
- package/Tests/Samples/Private/Urgency/rausch_piggy_bank.json +1 -0
- package/Tests/Samples/Private/Urgency/rausch_tag.json +1 -0
- package/Tests/Samples/Private/Urgency/red_envelope_animated.json +1 -0
- package/Tests/Samples/Private/Urgency/tag_animated.json +1 -0
- package/Tests/Samples/Private/Urgency/trophy_animated.json +1 -0
- package/Tests/Samples/Private/Urgency/wings_key_animated.json +1 -0
- package/Tests/Samples/Private/_flexible.json +1 -0
- package/Tests/Samples/Private/aircover.json +1 -0
- package/Tests/Samples/Private/belo_spin_rausch.json +1 -0
- package/Tests/Samples/Private/celebration.json +2821 -0
- package/Tests/Samples/Private/checkbox.json +1 -0
- package/Tests/Samples/Private/checkbox_small.json +1 -0
- package/Tests/Samples/Private/getting_your_trip_ready.json +3540 -0
- package/Tests/Samples/Private/gradient_afternoon.json +1 -0
- package/Tests/Samples/Private/gradient_brand.json +1 -0
- package/Tests/Samples/Private/gradient_evening.json +1 -0
- package/Tests/Samples/Private/gradient_morning.json +1 -0
- package/Tests/Samples/Private/issue_1467.json +1 -0
- package/Tests/Samples/Private/loading_dots.json +1 -0
- package/Tests/Samples/Private/loading_dots_small.json +1 -0
- package/Tests/Samples/Private/payment_loader.json +1 -0
- package/Tests/Samples/Private/radio_button.json +1 -0
- package/Tests/Samples/Private/selfie_intro.json +1 -0
- package/Tests/Samples/Private/stepper_add.json +1 -0
- package/Tests/Samples/Private/stepper_subtract.json +1 -0
- package/Tests/Samples/Private/switch.json +1 -0
- package/Tests/Samples/Private/thumb.json +1 -0
- package/Tests/Samples/Private/toggle_no.json +1 -0
- package/Tests/Samples/Private/toggle_yes.json +1 -0
- package/Tests/Samples/Private/user_error_black_and_white.json +1 -0
- package/Tests/Samples/Private/user_error_cut_off.json +1 -0
- package/Tests/Samples/Switch.json +1 -0
- package/Tests/Samples/Switch_States.json +1 -0
- package/Tests/Samples/TwitterHeart.json +1 -0
- package/Tests/Samples/TwitterHeartButton.json +1 -0
- package/Tests/Samples/TypeFace/A.json +1 -0
- package/Tests/Samples/TypeFace/Apostrophe.json +1 -0
- package/Tests/Samples/TypeFace/B.json +1 -0
- package/Tests/Samples/TypeFace/BlinkingCursor.json +1 -0
- package/Tests/Samples/TypeFace/C.json +1 -0
- package/Tests/Samples/TypeFace/Colon.json +1 -0
- package/Tests/Samples/TypeFace/Comma.json +1 -0
- package/Tests/Samples/TypeFace/D.json +1 -0
- package/Tests/Samples/TypeFace/E.json +1 -0
- package/Tests/Samples/TypeFace/F.json +1 -0
- package/Tests/Samples/TypeFace/G.json +1 -0
- package/Tests/Samples/TypeFace/H.json +1 -0
- package/Tests/Samples/TypeFace/I.json +1 -0
- package/Tests/Samples/TypeFace/J.json +1 -0
- package/Tests/Samples/TypeFace/K.json +1 -0
- package/Tests/Samples/TypeFace/L.json +1 -0
- package/Tests/Samples/TypeFace/M.json +1 -0
- package/Tests/Samples/TypeFace/N.json +1 -0
- package/Tests/Samples/TypeFace/O.json +1 -0
- package/Tests/Samples/TypeFace/P.json +1 -0
- package/Tests/Samples/TypeFace/Q.json +1 -0
- package/Tests/Samples/TypeFace/R.json +1 -0
- package/Tests/Samples/TypeFace/S.json +1 -0
- package/Tests/Samples/TypeFace/T.json +1 -0
- package/Tests/Samples/TypeFace/U.json +1 -0
- package/Tests/Samples/TypeFace/V.json +1 -0
- package/Tests/Samples/TypeFace/W.json +1 -0
- package/Tests/Samples/TypeFace/X.json +1 -0
- package/Tests/Samples/TypeFace/Y.json +1 -0
- package/Tests/Samples/TypeFace/Z.json +1 -0
- package/Tests/Samples/Watermelon.json +1 -0
- package/Tests/Samples/setValueTest.json +1 -0
- package/Tests/Samples/timeremap.json +1 -0
- package/Tests/Samples/vcTransition1.json +1 -0
- package/Tests/Samples/vcTransition2.json +1 -0
- package/Tests/SnapshotConfiguration.swift +153 -0
- package/Tests/SnapshotTests.swift +265 -0
- package/Tests/Utils/Bundle+Module.swift +30 -0
- package/Tests/Utils/HardcodedFontProvider.swift +19 -0
- package/Tests/Utils/HardcodedImageProvider.swift +23 -0
- package/Tests/Utils/Snapshotting+presentationLayer.swift +47 -0
- package/Tests/ValueProvidersTests.swift +27 -0
- package/lottie-ios.podspec +12 -12
- package/package.json +1 -1
- package/script/lint/airbnb.swiftformat +68 -0
- package/script/lint/swiftlint.yml +38 -0
- package/script/test-carthage/Cartfile +1 -0
- package/script/test-carthage/Cartfile.resolved +1 -0
- package/script/test-carthage/Carthage/Build/.lottie-ios.version +19 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/Info.plist +46 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/BCSymbolMaps/BF971162-BE99-3507-B5B3-11947DC6B176.bcsymbolmap +14778 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Headers/Lottie-Swift.h +673 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Info.plist +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Lottie +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Modules/Lottie.swiftmodule/arm64-apple-ios.swiftdoc +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Modules/Lottie.swiftmodule/arm64-apple-ios.swiftmodule +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Modules/Lottie.swiftmodule/arm64.swiftdoc +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Modules/Lottie.swiftmodule/arm64.swiftmodule +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Modules/module.modulemap +4 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/dSYMs/Lottie.framework.dSYM/Contents/Info.plist +20 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/dSYMs/Lottie.framework.dSYM/Contents/Resources/DWARF/Lottie +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Headers/Lottie-Swift.h +1352 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Info.plist +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Lottie +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/Project/arm64-apple-ios-simulator.swiftsourceinfo +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/Project/arm64.swiftsourceinfo +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/Project/x86_64-apple-ios-simulator.swiftsourceinfo +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/Project/x86_64.swiftsourceinfo +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/arm64-apple-ios-simulator.swiftdoc +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/arm64-apple-ios-simulator.swiftmodule +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/arm64.swiftdoc +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/arm64.swiftmodule +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/x86_64-apple-ios-simulator.swiftdoc +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/x86_64-apple-ios-simulator.swiftmodule +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/x86_64.swiftdoc +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/x86_64.swiftmodule +0 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/module.modulemap +4 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/_CodeSignature/CodeResources +256 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/dSYMs/Lottie.framework.dSYM/Contents/Info.plist +20 -0
- package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/dSYMs/Lottie.framework.dSYM/Contents/Resources/DWARF/Lottie +0 -0
- package/script/test-carthage/Carthage/Checkouts/lottie-ios/Lottie.xcodeproj/project.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/script/test-carthage/Carthage/Checkouts/lottie-ios/Lottie.xcodeproj/xcuserdata/cal.xcuserdatad/xcschemes/xcschememanagement.plist +37 -0
- package/script/test-carthage/Carthage/Checkouts/lottie-ios/Lottie.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/script/test-carthage/CarthageTest/AppDelegate.swift +27 -0
- package/script/test-carthage/CarthageTest/Assets.xcassets/AccentColor.colorset/Contents.json +11 -0
- package/script/test-carthage/CarthageTest/Assets.xcassets/AppIcon.appiconset/Contents.json +98 -0
- package/script/test-carthage/CarthageTest/Assets.xcassets/Contents.json +6 -0
- package/script/test-carthage/CarthageTest/Base.lproj/LaunchScreen.storyboard +25 -0
- package/script/test-carthage/CarthageTest/Base.lproj/Main.storyboard +24 -0
- package/script/test-carthage/CarthageTest/Info.plist +66 -0
- package/script/test-carthage/CarthageTest/SceneDelegate.swift +10 -0
- package/script/test-carthage/CarthageTest/ViewController.swift +15 -0
- package/script/test-carthage/CarthageTest.xcodeproj/project.pbxproj +378 -0
- package/script/test-carthage/CarthageTest.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
- package/script/test-carthage/CarthageTest.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
- package/script/test-carthage/CarthageTest.xcodeproj/project.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/script/test-carthage/CarthageTest.xcodeproj/xcuserdata/cal.xcuserdatad/xcschemes/xcschememanagement.plist +14 -0
- package/script/test-carthage/Mintfile +1 -0
- package/script/test-spm/LottieSPM.xcworkspace/contents.xcworkspacedata +7 -0
- package/script/test-spm/LottieSPM.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/script/test-spm/Mintfile +1 -0
- package/.swiftpm/xcode/package.xcworkspace/xcuserdata/brandonwithrow.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/Lottie/Info.plist +0 -22
- package/Lottie.xcodeproj/project.xcworkspace/xcuserdata/brandonwithrow.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/Lottie.xcodeproj/xcuserdata/brandonwithrow.xcuserdatad/xcschemes/LottieLibraryMacOS.xcscheme +0 -80
- package/Lottie.xcodeproj/xcuserdata/brandonwithrow.xcuserdatad/xcschemes/xcschememanagement.plist +0 -57
- package/lottie-swift/Assets/.gitkeep +0 -0
- package/lottie-swift/src/Private/LayerContainers/Utility/LayerFontProvider.swift +0 -37
- package/lottie-swift/src/Private/LayerContainers/Utility/LayerTextProvider.swift +0 -36
- package/lottie-swift/src/Private/Model/Animation.swift +0 -107
- package/lottie-swift/src/Private/Model/Assets/Asset.swift +0 -27
- package/lottie-swift/src/Private/Model/Assets/ImageAsset.swift +0 -48
- package/lottie-swift/src/Private/Model/Keyframes/Keyframe.swift +0 -128
- package/lottie-swift/src/Private/Model/Keyframes/KeyframeGroup.swift +0 -108
- package/lottie-swift/src/Private/Model/Layers/LayerModel.swift +0 -150
- package/lottie-swift/src/Private/Model/Objects/DashPattern.swift +0 -24
- package/lottie-swift/src/Private/Model/Objects/Marker.swift +0 -23
- package/lottie-swift/src/Private/Model/Objects/Mask.swift +0 -48
- package/lottie-swift/src/Private/Model/Objects/Transform.swift +0 -105
- package/lottie-swift/src/Private/Model/ShapeItems/Ellipse.swift +0 -50
- package/lottie-swift/src/Private/Model/ShapeItems/FillI.swift +0 -49
- package/lottie-swift/src/Private/Model/ShapeItems/GradientFill.swift +0 -86
- package/lottie-swift/src/Private/Model/ShapeItems/GradientStroke.swift +0 -125
- package/lottie-swift/src/Private/Model/ShapeItems/Rectangle.swift +0 -50
- package/lottie-swift/src/Private/Model/ShapeItems/Repeater.swift +0 -80
- package/lottie-swift/src/Private/Model/ShapeItems/Shape.swift +0 -37
- package/lottie-swift/src/Private/Model/ShapeItems/ShapeItem.swift +0 -95
- package/lottie-swift/src/Private/Model/ShapeItems/ShapeTransform.swift +0 -68
- package/lottie-swift/src/Private/Model/ShapeItems/Star.swift +0 -86
- package/lottie-swift/src/Private/Model/ShapeItems/Stroke.swift +0 -67
- package/lottie-swift/src/Private/Model/ShapeItems/Trim.swift +0 -53
- package/lottie-swift/src/Private/Model/Text/Font.swift +0 -35
- package/lottie-swift/src/Private/Model/Text/TextAnimator.swift +0 -99
- package/lottie-swift/src/Private/Model/Text/TextDocument.swift +0 -70
- package/lottie-swift/src/Private/NodeRenderSystem/Nodes/PathNodes/EllipseNode.swift +0 -109
- package/lottie-swift/src/Private/NodeRenderSystem/Nodes/PathNodes/PolygonNode.swift +0 -132
- package/lottie-swift/src/Private/NodeRenderSystem/Nodes/RenderContainers/GroupNode.swift +0 -141
- package/lottie-swift/src/Private/Utility/Extensions/MathKit.swift +0 -539
- package/lottie-swift/src/Private/Utility/Extensions/StringExtensions.swift +0 -32
- package/lottie-swift/src/Private/Utility/Interpolatable/Interpolatable.swift +0 -18
- package/lottie-swift/src/Private/Utility/Interpolatable/InterpolatableExtensions.swift +0 -170
- package/lottie-swift/src/Private/Utility/Primitives/CurveVertex.swift +0 -177
- package/lottie-swift/src/Private/Utility/Primitives/PathElement.swift +0 -68
- package/lottie-swift/src/Private/Utility/Primitives/VectorsExtensions.swift +0 -218
- package/lottie-swift/src/Public/Animation/AnimationPublic.swift +0 -196
- package/lottie-swift/src/Public/Animation/AnimationView.swift +0 -1006
- package/lottie-swift/src/Public/Animation/AnimationViewInitializers.swift +0 -83
- package/lottie-swift/src/Public/AnimationCache/AnimationCacheProvider.swift +0 -24
- package/lottie-swift/src/Public/DynamicProperties/AnimationKeypath.swift +0 -46
- package/lottie-swift/src/Public/DynamicProperties/AnyValueProvider.swift +0 -29
- package/lottie-swift/src/Public/DynamicProperties/ValueProviders/GradientValueProvider.swift +0 -114
- package/lottie-swift/src/Public/ImageProvider/AnimationImageProvider.swift +0 -23
- package/lottie-swift/src/Public/MacOS/FilepathImageProvider.swift +0 -67
- package/lottie-swift/src/Public/TextProvider/AnimationTextProvider.swift +0 -39
- package/lottie-swift/src/Public/iOS/LottieView.swift +0 -62
- package/lottie-swift-testing.podspec +0 -32
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"assets":[],"layers":[{"ddd":0,"ind":0,"ty":4,"nm":"outLayer","ks":{"o":{"k":100},"r":{"k":0},"p":{"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"n":"0p833_0p833_0p333_0","t":0,"s":[207,368,0],"e":[527,368,0],"to":[53.3333320617676,0,0],"ti":[-53.3333320617676,0,0]},{"t":13}]},"a":{"k":[0,0,0]},"s":{"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":0,"s":[1175.566,1175.566,100],"e":[4.648,4.648,100]},{"t":13}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"k":[104.875,104.875]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"fl","fillEnabled":true,"c":{"k":[1,0,0,1]},"o":{"k":100},"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"k":[0,0],"ix":2},"a":{"k":[0,0],"ix":1},"s":{"k":[100,100],"ix":3},"r":{"k":0,"ix":6},"o":{"k":100,"ix":7},"sk":{"k":0,"ix":4},"sa":{"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"mn":"ADBE Vector Group"}],"ip":0,"op":15,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":1,"ty":4,"nm":"outLayer 10","ks":{"o":{"k":100},"r":{"k":0},"p":{"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"n":"0p833_0p833_0p333_0","t":4,"s":[207,368,0],"e":[687,368,0],"to":[80,0,0],"ti":[-80,0,0]},{"t":17}]},"a":{"k":[0,0,0]},"s":{"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":4,"s":[1175.566,1175.566,100],"e":[4.648,4.648,100]},{"t":17}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"k":[104.875,104.875]},"p":{"k":[0,0]},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"fl","fillEnabled":true,"c":{"k":[0,0.82,0.76,1]},"o":{"k":100},"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"k":[0,0],"ix":2},"a":{"k":[0,0],"ix":1},"s":{"k":[100,100],"ix":3},"r":{"k":0,"ix":6},"o":{"k":100,"ix":7},"sk":{"k":0,"ix":4},"sa":{"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"mn":"ADBE Vector Group"}],"ip":4,"op":19,"st":4,"bm":0,"sr":1},{"ddd":0,"ind":2,"ty":4,"nm":"inLayer","ks":{"o":{"k":100},"r":{"k":0},"p":{"k":[207,368,0]},"a":{"k":[0,0,0]},"s":{"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"k":[1042.203,1042.203]},"p":{"k":[0,0]},"r":{"k":0},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect"},{"ty":"fl","fillEnabled":true,"c":{"k":[0,0.01,0.82,1]},"o":{"k":100},"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"k":[0,0],"ix":2},"a":{"k":[0,0],"ix":1},"s":{"k":[100,100],"ix":3},"r":{"k":0,"ix":6},"o":{"k":100,"ix":7},"sk":{"k":0,"ix":4},"sa":{"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":2,"mn":"ADBE Vector Group"}],"ip":0,"op":77,"st":0,"bm":0,"sr":1}],"v":"4.5.0","ddd":0,"ip":0,"op":22,"fr":24,"w":414,"h":736}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
// Created by Cal Stephens on 12/15/21.
|
|
2
|
+
// Copyright © 2021 Airbnb Inc. All rights reserved.
|
|
3
|
+
|
|
4
|
+
#if canImport(UIKit)
|
|
5
|
+
import Lottie
|
|
6
|
+
import UIKit
|
|
7
|
+
|
|
8
|
+
// MARK: - SnapshotConfiguration
|
|
9
|
+
|
|
10
|
+
/// Snapshot configuration for an individual test case
|
|
11
|
+
struct SnapshotConfiguration {
|
|
12
|
+
/// The precision that should be used when comparing the
|
|
13
|
+
/// captured snapshot with the reference image in `Tests/__Snapshots`
|
|
14
|
+
/// - Defaults to 1.0 (the snapshot must match exactly).
|
|
15
|
+
/// - This can be lowered for snapshots that render somewhat nondeterministically,
|
|
16
|
+
/// but should be kept as high as possible (while still permitting the diff to succeed)
|
|
17
|
+
var precision: Float = 1
|
|
18
|
+
|
|
19
|
+
/// Dynamic value providers that should be applied to the animation
|
|
20
|
+
var customValueProviders: [AnimationKeypath: AnyValueProvider] = [:]
|
|
21
|
+
|
|
22
|
+
/// A custom `AnimationImageProvider` to use when rendering this animation
|
|
23
|
+
var customImageProvider: AnimationImageProvider?
|
|
24
|
+
|
|
25
|
+
/// A custom `AnimationFontProvider` to use when rendering this animation
|
|
26
|
+
var customFontProvider: AnimationFontProvider?
|
|
27
|
+
|
|
28
|
+
/// Whether or not this sample should be tested with the automatic engine
|
|
29
|
+
/// - Defaults to `false` since this isn't necessary most of the time
|
|
30
|
+
/// - Enabling this for a set of animations gives us a regression suite for
|
|
31
|
+
/// the code supporting the automatic engine.
|
|
32
|
+
var testWithAutomaticEngine = false
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// MARK: Custom mapping
|
|
36
|
+
|
|
37
|
+
extension SnapshotConfiguration {
|
|
38
|
+
/// Custom configurations for individual snapshot tests that
|
|
39
|
+
/// cannot use the default configuration
|
|
40
|
+
static let customMapping: [String: SnapshotConfiguration] = [
|
|
41
|
+
/// These samples appear to render in a slightly non-deterministic way,
|
|
42
|
+
/// depending on the test environment, so we have to decrease precision a bit.
|
|
43
|
+
"Issues/issue_1407": .precision(0.9),
|
|
44
|
+
"Nonanimating/FirstText": .precision(0.99),
|
|
45
|
+
"Nonanimating/verifyLineHeight": .precision(0.99),
|
|
46
|
+
"Nonanimating/blend_mode_test": .precision(0.99),
|
|
47
|
+
|
|
48
|
+
/// Test cases for the `AnimationKeypath` / `AnyValueProvider` system
|
|
49
|
+
"Nonanimating/keypathTest": .customValueProviders([
|
|
50
|
+
AnimationKeypath(keypath: "**.Stroke 1.Color"): ColorValueProvider(.black),
|
|
51
|
+
AnimationKeypath(keypath: "**.Fill 1.Color"): ColorValueProvider(.red),
|
|
52
|
+
]),
|
|
53
|
+
|
|
54
|
+
"Switch": .customValueProviders([
|
|
55
|
+
AnimationKeypath(keypath: "Checkmark Outlines.Group 1.Stroke 1.Color"): ColorValueProvider(.black),
|
|
56
|
+
AnimationKeypath(keypath: "Checkmark Outlines 2.Group 1.Stroke 1.Color"): ColorValueProvider(.black),
|
|
57
|
+
AnimationKeypath(keypath: "X Outlines.Group 1.Stroke 1.Color"): ColorValueProvider(.black),
|
|
58
|
+
AnimationKeypath(keypath: "Switch Outline Outlines.Fill 1.Color"): ColorValueProvider([
|
|
59
|
+
Keyframe(value: Color.black, time: 0),
|
|
60
|
+
Keyframe(value: Color(r: 0.76, g: 0.76, b: 0.76, a: 1), time: 75),
|
|
61
|
+
Keyframe(value: Color.black, time: 150),
|
|
62
|
+
]),
|
|
63
|
+
]),
|
|
64
|
+
|
|
65
|
+
// Test cases for `AnimatedImageProvider`
|
|
66
|
+
"Nonanimating/_dog": .customImageProvider(HardcodedImageProvider(imageName: "Samples/Images/dog.png")),
|
|
67
|
+
|
|
68
|
+
// Test cases for `AnimationFontProvider`
|
|
69
|
+
"Nonanimating/Text_Glyph": .customFontProvider(HardcodedFontProvider(font: UIFont(name: "Chalkduster", size: 36)!)),
|
|
70
|
+
|
|
71
|
+
// Test cases for `RenderingEngineOption.automatic`
|
|
72
|
+
"9squares_AlBoardman": .useAutomaticRenderingEngine, // Supports the Core Animation engine
|
|
73
|
+
"LottieFiles/shop": .useAutomaticRenderingEngine, // Throws a compatibility error in `init`
|
|
74
|
+
"TypeFace/G": .useAutomaticRenderingEngine, // Throws a compatibility error in `display()`
|
|
75
|
+
]
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// MARK: Helpers
|
|
79
|
+
|
|
80
|
+
extension SnapshotConfiguration {
|
|
81
|
+
/// The default configuration to use if no custom mapping is provided
|
|
82
|
+
static let `default` = SnapshotConfiguration()
|
|
83
|
+
|
|
84
|
+
static var useAutomaticRenderingEngine: SnapshotConfiguration {
|
|
85
|
+
var configuration = SnapshotConfiguration.default
|
|
86
|
+
configuration.testWithAutomaticEngine = true
|
|
87
|
+
return configuration
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/// The `SnapshotConfiguration` to use for the given sample JSON file name
|
|
91
|
+
static func forSample(named sampleName: String) -> SnapshotConfiguration {
|
|
92
|
+
if let customConfiguration = customMapping[sampleName] {
|
|
93
|
+
return customConfiguration
|
|
94
|
+
} else {
|
|
95
|
+
return .default
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/// A `SnapshotConfiguration` value with `precision` customized to the given value
|
|
100
|
+
static func precision(_ precision: Float) -> SnapshotConfiguration {
|
|
101
|
+
var configuration = SnapshotConfiguration.default
|
|
102
|
+
configuration.precision = precision
|
|
103
|
+
return configuration
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/// A `SnapshotConfiguration` value using the given custom value providers
|
|
107
|
+
static func customValueProviders(
|
|
108
|
+
_ customValueProviders: [AnimationKeypath: AnyValueProvider])
|
|
109
|
+
-> SnapshotConfiguration
|
|
110
|
+
{
|
|
111
|
+
var configuration = SnapshotConfiguration.default
|
|
112
|
+
configuration.customValueProviders = customValueProviders
|
|
113
|
+
return configuration
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/// A `SnapshotConfiguration` value using the given custom value providers
|
|
117
|
+
static func customImageProvider(
|
|
118
|
+
_ customImageProvider: AnimationImageProvider)
|
|
119
|
+
-> SnapshotConfiguration
|
|
120
|
+
{
|
|
121
|
+
var configuration = SnapshotConfiguration.default
|
|
122
|
+
configuration.customImageProvider = customImageProvider
|
|
123
|
+
return configuration
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/// A `SnapshotConfiguration` value using the given custom value providers
|
|
127
|
+
static func customFontProvider(
|
|
128
|
+
_ customFontProvider: AnimationFontProvider)
|
|
129
|
+
-> SnapshotConfiguration
|
|
130
|
+
{
|
|
131
|
+
var configuration = SnapshotConfiguration.default
|
|
132
|
+
configuration.customFontProvider = customFontProvider
|
|
133
|
+
return configuration
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/// Whether or not this sample should be included in the snapshot tests for the given configuration
|
|
137
|
+
func shouldSnapshot(using configuration: LottieConfiguration) -> Bool {
|
|
138
|
+
switch configuration.renderingEngine {
|
|
139
|
+
case .automatic:
|
|
140
|
+
return testWithAutomaticEngine
|
|
141
|
+
case .specific:
|
|
142
|
+
return true
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// MARK: - Color helpers
|
|
148
|
+
|
|
149
|
+
extension Color {
|
|
150
|
+
static let black = Color(r: 0, g: 0, b: 0, a: 1)
|
|
151
|
+
static let red = Color(r: 1, g: 0, b: 0, a: 1)
|
|
152
|
+
}
|
|
153
|
+
#endif
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
// Created by Cal Stephens on 12/8/21.
|
|
2
|
+
// Copyright © 2021 Airbnb Inc. All rights reserved.
|
|
3
|
+
|
|
4
|
+
import SnapshotTesting
|
|
5
|
+
import XCTest
|
|
6
|
+
|
|
7
|
+
#if canImport(UIKit)
|
|
8
|
+
import UIKit
|
|
9
|
+
#endif
|
|
10
|
+
|
|
11
|
+
@testable import Lottie
|
|
12
|
+
|
|
13
|
+
// MARK: - SnapshotTests
|
|
14
|
+
|
|
15
|
+
class SnapshotTests: XCTestCase {
|
|
16
|
+
|
|
17
|
+
// MARK: Internal
|
|
18
|
+
|
|
19
|
+
/// Snapshots all of the sample animation JSON files visible to this test target
|
|
20
|
+
func testMainThreadRenderingEngine() throws {
|
|
21
|
+
try compareSampleSnapshots(configuration: LottieConfiguration(renderingEngine: .mainThread))
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/// Snapshots sample animation files using the Core Animation rendering engine
|
|
25
|
+
func testCoreAnimationRenderingEngine() throws {
|
|
26
|
+
try compareSampleSnapshots(configuration: LottieConfiguration(renderingEngine: .coreAnimation))
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/// Snapshots sample animation files using the automatic rendering engine option
|
|
30
|
+
func testAutomaticRenderingEngine() throws {
|
|
31
|
+
try compareSampleSnapshots(configuration: LottieConfiguration(renderingEngine: .automatic))
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/// Validates that all of the snapshots in __Snapshots__ correspond to
|
|
35
|
+
/// a sample JSON file that is visible to this test target.
|
|
36
|
+
func testAllSnapshotsHaveCorrespondingSampleFile() {
|
|
37
|
+
for snapshotURL in Samples.snapshotURLs {
|
|
38
|
+
// Exclude snapshots of private samples, since those aren't checked in to the repo
|
|
39
|
+
if snapshotURL.lastPathComponent.contains("Private") {
|
|
40
|
+
continue
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// The snapshot files follow the format `testCaseName.animationName-percentage.png`
|
|
44
|
+
// - We remove the known prefix and known suffixes to recover the input file name
|
|
45
|
+
// - `animationName` can contain dashes, so we can't just split the string at each dash
|
|
46
|
+
var animationName = snapshotURL.lastPathComponent
|
|
47
|
+
.replacingOccurrences(of: "testMainThreadRenderingEngine.", with: "")
|
|
48
|
+
.replacingOccurrences(of: "testCoreAnimationRenderingEngine.", with: "")
|
|
49
|
+
.replacingOccurrences(of: "testAutomaticRenderingEngine.", with: "")
|
|
50
|
+
|
|
51
|
+
for percentage in progressPercentagesToSnapshot {
|
|
52
|
+
animationName = animationName.replacingOccurrences(
|
|
53
|
+
of: "-\(Int(percentage * 100)).png",
|
|
54
|
+
with: "")
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
animationName = animationName.replacingOccurrences(of: "-", with: "/")
|
|
58
|
+
|
|
59
|
+
XCTAssert(
|
|
60
|
+
Samples.sampleAnimationURLs.contains(where: { $0.absoluteString.hasSuffix("\(animationName).json") }),
|
|
61
|
+
"Snapshot \"\(snapshotURL.lastPathComponent)\" has no corresponding sample animation")
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/// Validates that all of the custom snapshot configurations in `SnapshotConfiguration.customMapping`
|
|
66
|
+
/// reference a sample json file that actually exists
|
|
67
|
+
func testCustomSnapshotConfigurationsHaveCorrespondingSampleFile() {
|
|
68
|
+
for (animationName, _) in SnapshotConfiguration.customMapping {
|
|
69
|
+
let expectedSampleFile = Bundle.module.bundleURL.appendingPathComponent("Samples/\(animationName).json")
|
|
70
|
+
|
|
71
|
+
XCTAssert(
|
|
72
|
+
Samples.sampleAnimationURLs.contains(expectedSampleFile),
|
|
73
|
+
"Custom configuration for \"\(animationName)\" has no corresponding sample animation")
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/// Validates that this test target can access sample json files from `Tests/Samples`
|
|
78
|
+
/// and snapshot images from `Tests/__Snapshots__`.
|
|
79
|
+
func testCanAccessSamplesAndSnapshots() {
|
|
80
|
+
XCTAssert(Samples.sampleAnimationURLs.count > 50)
|
|
81
|
+
XCTAssert(Samples.snapshotURLs.count > 300)
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
override func setUp() {
|
|
85
|
+
LottieLogger.shared = .printToConsole
|
|
86
|
+
TestHelpers.snapshotTestsAreRunning = true
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
override func tearDown() {
|
|
90
|
+
LottieLogger.shared = LottieLogger()
|
|
91
|
+
TestHelpers.snapshotTestsAreRunning = false
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// MARK: Private
|
|
95
|
+
|
|
96
|
+
/// `currentProgress` percentages that should be snapshot in `compareSampleSnapshots`
|
|
97
|
+
private let progressPercentagesToSnapshot = [0, 0.25, 0.5, 0.75, 1.0]
|
|
98
|
+
|
|
99
|
+
/// Captures snapshots of `sampleAnimationURLs` and compares them to the snapshot images stored on disk
|
|
100
|
+
private func compareSampleSnapshots(
|
|
101
|
+
configuration: LottieConfiguration,
|
|
102
|
+
testName: String = #function) throws
|
|
103
|
+
{
|
|
104
|
+
#if os(iOS)
|
|
105
|
+
guard UIScreen.main.scale == 2 else {
|
|
106
|
+
/// Snapshots are captured at a 2x scale, so we can only support
|
|
107
|
+
/// running tests on a device that has a 2x scale.
|
|
108
|
+
/// - In CI we run tests on an iPhone 8 simulator,
|
|
109
|
+
/// but any device with a 2x scale works.
|
|
110
|
+
throw SnapshotError.unsupportedDevice
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
for sampleAnimationName in Samples.sampleAnimationNames {
|
|
114
|
+
for percent in progressPercentagesToSnapshot {
|
|
115
|
+
guard
|
|
116
|
+
let animationView = SnapshotConfiguration.makeAnimationView(
|
|
117
|
+
for: sampleAnimationName,
|
|
118
|
+
configuration: configuration)
|
|
119
|
+
else { continue }
|
|
120
|
+
|
|
121
|
+
animationView.currentProgress = CGFloat(percent)
|
|
122
|
+
|
|
123
|
+
assertSnapshot(
|
|
124
|
+
matching: animationView,
|
|
125
|
+
as: .imageOfPresentationLayer(
|
|
126
|
+
precision: SnapshotConfiguration.forSample(named: sampleAnimationName).precision),
|
|
127
|
+
named: "\(sampleAnimationName) (\(Int(percent * 100))%)",
|
|
128
|
+
testName: testName)
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
#else
|
|
132
|
+
// We only run snapshot tests on iOS, since running snapshot tests
|
|
133
|
+
// for macOS and tvOS would triple the number of snapshot images
|
|
134
|
+
// we have to check in to the repo.
|
|
135
|
+
throw SnapshotError.unsupportedPlatform
|
|
136
|
+
#endif
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// MARK: Animation + snapshotSize
|
|
142
|
+
|
|
143
|
+
extension Animation {
|
|
144
|
+
/// The size that this animation should be snapshot at
|
|
145
|
+
fileprivate var snapshotSize: CGSize {
|
|
146
|
+
let maxDimension: CGFloat = 500
|
|
147
|
+
|
|
148
|
+
// If this is a landscape aspect ratio, we clamp the width
|
|
149
|
+
if width > height {
|
|
150
|
+
let newWidth = min(CGFloat(width), maxDimension)
|
|
151
|
+
let newHeight = newWidth * (CGFloat(height) / CGFloat(width))
|
|
152
|
+
return CGSize(width: newWidth, height: newHeight)
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// otherwise, this is either a square or portrait aspect ratio,
|
|
156
|
+
// in which case we clamp the height
|
|
157
|
+
else {
|
|
158
|
+
let newHeight = min(CGFloat(height), maxDimension)
|
|
159
|
+
let newWidth = newHeight * (CGFloat(width) / CGFloat(height))
|
|
160
|
+
return CGSize(width: newWidth, height: newHeight)
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// MARK: - SnapshotError
|
|
166
|
+
|
|
167
|
+
enum SnapshotError: Error {
|
|
168
|
+
/// We only run snapshot tests on iOS, since running snapshot tests
|
|
169
|
+
/// for macOS and tvOS would triple the number of snapshot images
|
|
170
|
+
/// we have to check in to the repo.
|
|
171
|
+
case unsupportedPlatform
|
|
172
|
+
|
|
173
|
+
/// Snapshots are captured at a 2x scale, so we can only support
|
|
174
|
+
/// running tests on a device that has a 2x scale.
|
|
175
|
+
case unsupportedDevice
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// MARK: - Samples
|
|
179
|
+
|
|
180
|
+
/// MARK: - Samples
|
|
181
|
+
|
|
182
|
+
enum Samples {
|
|
183
|
+
/// The name of the directory that contains the sample json files
|
|
184
|
+
static let directoryName = "Samples"
|
|
185
|
+
|
|
186
|
+
/// The list of snapshot image files in `Tests/__Snapshots__`
|
|
187
|
+
static let snapshotURLs = Bundle.module.fileURLs(
|
|
188
|
+
in: "__Snapshots__",
|
|
189
|
+
withSuffix: "png")
|
|
190
|
+
|
|
191
|
+
/// The list of sample animation files in `Tests/Samples`
|
|
192
|
+
static let sampleAnimationURLs = Bundle.module.fileURLs(
|
|
193
|
+
in: Samples.directoryName,
|
|
194
|
+
withSuffix: "json")
|
|
195
|
+
|
|
196
|
+
/// The list of sample animation names in `Tests/Samples`
|
|
197
|
+
static let sampleAnimationNames = sampleAnimationURLs.lazy
|
|
198
|
+
.map { sampleAnimationURL -> String in
|
|
199
|
+
// Each of the sample animation URLs has the format
|
|
200
|
+
// `.../*.bundle/Samples/{subfolder}/{animationName}.json`.
|
|
201
|
+
// The sample animation name should include the subfolders
|
|
202
|
+
// (since that helps uniquely identity the animation JSON file).
|
|
203
|
+
let pathComponents = sampleAnimationURL.pathComponents
|
|
204
|
+
let samplesIndex = pathComponents.lastIndex(of: Samples.directoryName)!
|
|
205
|
+
let subpath = pathComponents[(samplesIndex + 1)...]
|
|
206
|
+
|
|
207
|
+
return subpath
|
|
208
|
+
.joined(separator: "/")
|
|
209
|
+
.replacingOccurrences(of: ".json", with: "")
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
static func animation(named sampleAnimationName: String) -> Animation? {
|
|
213
|
+
guard
|
|
214
|
+
let animation = Animation.named(
|
|
215
|
+
sampleAnimationName,
|
|
216
|
+
bundle: .module,
|
|
217
|
+
subdirectory: Samples.directoryName)
|
|
218
|
+
else {
|
|
219
|
+
XCTFail("Could not parse Samples/\(sampleAnimationName).json")
|
|
220
|
+
return nil
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
return animation
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
extension SnapshotConfiguration {
|
|
228
|
+
/// Creates an `AnimationView` for the sample snapshot with the given name
|
|
229
|
+
static func makeAnimationView(
|
|
230
|
+
for sampleAnimationName: String,
|
|
231
|
+
configuration: LottieConfiguration,
|
|
232
|
+
logger: LottieLogger = LottieLogger.shared)
|
|
233
|
+
-> AnimationView?
|
|
234
|
+
{
|
|
235
|
+
let snapshotConfiguration = SnapshotConfiguration.forSample(named: sampleAnimationName)
|
|
236
|
+
|
|
237
|
+
guard
|
|
238
|
+
snapshotConfiguration.shouldSnapshot(using: configuration),
|
|
239
|
+
let animation = Samples.animation(named: sampleAnimationName)
|
|
240
|
+
else { return nil }
|
|
241
|
+
|
|
242
|
+
let animationView = AnimationView(
|
|
243
|
+
animation: animation,
|
|
244
|
+
configuration: configuration,
|
|
245
|
+
logger: logger)
|
|
246
|
+
|
|
247
|
+
// Set up the animation view with a valid frame
|
|
248
|
+
// so the geometry is correct when setting up the `CAAnimation`s
|
|
249
|
+
animationView.frame.size = animation.snapshotSize
|
|
250
|
+
|
|
251
|
+
for (keypath, customValueProvider) in snapshotConfiguration.customValueProviders {
|
|
252
|
+
animationView.setValueProvider(customValueProvider, keypath: keypath)
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
if let customImageProvider = snapshotConfiguration.customImageProvider {
|
|
256
|
+
animationView.imageProvider = customImageProvider
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
if let customFontProvider = snapshotConfiguration.customFontProvider {
|
|
260
|
+
animationView.fontProvider = customFontProvider
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
return animationView
|
|
264
|
+
}
|
|
265
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
// Created by Cal Stephens on 1/25/22.
|
|
2
|
+
// Copyright © 2022 Airbnb Inc. All rights reserved.
|
|
3
|
+
|
|
4
|
+
import Foundation
|
|
5
|
+
|
|
6
|
+
extension Bundle {
|
|
7
|
+
/// The Bundle representing files in this module
|
|
8
|
+
static var module: Bundle {
|
|
9
|
+
Bundle(for: SnapshotTests.self)
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/// Retrieves URLs for all of the files in the given directory with the given suffix
|
|
13
|
+
func fileURLs(in directory: String, withSuffix suffix: String) -> [URL] {
|
|
14
|
+
let enumerator = FileManager.default.enumerator(atPath: Bundle.module.bundlePath)!
|
|
15
|
+
|
|
16
|
+
var fileURLs: [URL] = []
|
|
17
|
+
|
|
18
|
+
while let fileSubpath = enumerator.nextObject() as? String {
|
|
19
|
+
if
|
|
20
|
+
fileSubpath.hasPrefix(directory),
|
|
21
|
+
fileSubpath.contains(suffix)
|
|
22
|
+
{
|
|
23
|
+
let fileURL = Bundle.module.bundleURL.appendingPathComponent(fileSubpath)
|
|
24
|
+
fileURLs.append(fileURL)
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
return fileURLs
|
|
29
|
+
}
|
|
30
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// Created by Cal Stephens on 2/11/22.
|
|
2
|
+
// Copyright © 2022 Airbnb Inc. All rights reserved.
|
|
3
|
+
|
|
4
|
+
import Lottie
|
|
5
|
+
import QuartzCore
|
|
6
|
+
#if os(iOS)
|
|
7
|
+
import UIKit
|
|
8
|
+
#endif
|
|
9
|
+
|
|
10
|
+
// MARK: - HardcodedFontProvider
|
|
11
|
+
|
|
12
|
+
/// An `AnimationFontProvider` that always returns a specific hardcoded font
|
|
13
|
+
struct HardcodedFontProvider: AnimationFontProvider {
|
|
14
|
+
let font: CTFont
|
|
15
|
+
|
|
16
|
+
func fontFor(family _: String, size _: CGFloat) -> CTFont? {
|
|
17
|
+
font
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// Created by Cal Stephens on 1/19/22.
|
|
2
|
+
// Copyright © 2022 Airbnb Inc. All rights reserved.
|
|
3
|
+
|
|
4
|
+
import Lottie
|
|
5
|
+
import QuartzCore
|
|
6
|
+
#if os(iOS)
|
|
7
|
+
import UIKit
|
|
8
|
+
#endif
|
|
9
|
+
|
|
10
|
+
// MARK: - HardcodedImageProvider
|
|
11
|
+
|
|
12
|
+
/// An `AnimationImageProvider` that always returns a specific hardcoded image of a dog (hi Marley)
|
|
13
|
+
struct HardcodedImageProvider: AnimationImageProvider {
|
|
14
|
+
let imageName: String
|
|
15
|
+
|
|
16
|
+
func imageForAsset(asset _: ImageAsset) -> CGImage? {
|
|
17
|
+
#if os(iOS)
|
|
18
|
+
return UIImage(named: imageName, in: .module, compatibleWith: nil)?.cgImage
|
|
19
|
+
#else
|
|
20
|
+
return nil
|
|
21
|
+
#endif
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
// Created by Cal Stephens on 12/15/21.
|
|
2
|
+
// Copyright © 2021 Airbnb Inc. All rights reserved.
|
|
3
|
+
|
|
4
|
+
#if os(iOS)
|
|
5
|
+
import SnapshotTesting
|
|
6
|
+
import UIKit
|
|
7
|
+
import XCTest
|
|
8
|
+
|
|
9
|
+
extension Snapshotting where Value == UIView, Format == UIImage {
|
|
10
|
+
/// Captures an image of the input `UIView`'s `layer.presentation()`,
|
|
11
|
+
/// which reflects the current state of any in-flight animations.
|
|
12
|
+
static func imageOfPresentationLayer(
|
|
13
|
+
precision: Float = 1,
|
|
14
|
+
traits: UITraitCollection = .init())
|
|
15
|
+
-> Snapshotting<UIView, UIImage>
|
|
16
|
+
{
|
|
17
|
+
// Use the SnapshotTesting framework's base `SimplySnapshot.image`
|
|
18
|
+
// implementation for creating and diffing image files
|
|
19
|
+
SimplySnapshotting.image(precision: precision, scale: traits.displayScale)
|
|
20
|
+
// Convert the input `UIView` into a `UIImage`
|
|
21
|
+
// by creating and then rendering its `layer.presentation()`
|
|
22
|
+
.pullback { (view: UIView) -> UIImage in
|
|
23
|
+
// Place the view in an on-screen window and then
|
|
24
|
+
// have Core Animation update the screen synchronously
|
|
25
|
+
let window = UIWindow()
|
|
26
|
+
window.bounds = view.bounds
|
|
27
|
+
window.isHidden = false
|
|
28
|
+
window.addSubview(view)
|
|
29
|
+
|
|
30
|
+
// Calling CATransaction.flush() makes Core Animation synchronously update
|
|
31
|
+
// the content being displayed on-screen, which gives our view a presentation layer.
|
|
32
|
+
CATransaction.flush()
|
|
33
|
+
|
|
34
|
+
// Now that the view is on-screen, it has a presentation layer:
|
|
35
|
+
guard let presentationLayer = view.layer.presentation() else {
|
|
36
|
+
fatalError("Presentation layer does not exist and cannot be snapshot")
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
let image = UIGraphicsImageRenderer(bounds: view.bounds).image { context in
|
|
40
|
+
presentationLayer.render(in: context.cgContext)
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
return image
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
#endif
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
//
|
|
2
|
+
// ValueProvidersTests.swift
|
|
3
|
+
// LottieTests
|
|
4
|
+
//
|
|
5
|
+
// Created by Marcelo Fabri on 5/5/22.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
import Lottie
|
|
9
|
+
import XCTest
|
|
10
|
+
|
|
11
|
+
final class ValueProvidersTests: XCTestCase {
|
|
12
|
+
|
|
13
|
+
func testGetValue() throws {
|
|
14
|
+
let animationView = try XCTUnwrap(SnapshotConfiguration.makeAnimationView(
|
|
15
|
+
for: "HamburgerArrow",
|
|
16
|
+
configuration: .init(renderingEngine: .mainThread)))
|
|
17
|
+
|
|
18
|
+
let keypath = AnimationKeypath(keypath: "A1.Shape 1.Stroke 1.Color")
|
|
19
|
+
animationView.setValueProvider(ColorValueProvider(.red), keypath: keypath)
|
|
20
|
+
let updatedColor = try XCTUnwrap(animationView.getValue(for: keypath, atFrame: 0) as? Color)
|
|
21
|
+
XCTAssertEqual(updatedColor, .red)
|
|
22
|
+
|
|
23
|
+
let originalColor = try XCTUnwrap(animationView.getOriginalValue(for: keypath, atFrame: 0) as? Color)
|
|
24
|
+
XCTAssertEqual(originalColor, Color(r: 0.4, g: 0.16, b: 0.7, a: 1))
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
}
|
package/lottie-ios.podspec
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#
|
|
2
|
-
# Be sure to run `pod lib lint lottie-
|
|
2
|
+
# Be sure to run `pod lib lint lottie-ios.podspec' to ensure this is a
|
|
3
3
|
# valid spec before submitting.
|
|
4
4
|
#
|
|
5
5
|
# Any lines starting with a # are optional, but their use is encouraged
|
|
@@ -8,13 +8,13 @@
|
|
|
8
8
|
|
|
9
9
|
Pod::Spec.new do |s|
|
|
10
10
|
s.name = 'lottie-ios'
|
|
11
|
-
s.version = '3.
|
|
12
|
-
s.summary = 'A library to render native animations from bodymovin json
|
|
11
|
+
s.version = '3.4.0'
|
|
12
|
+
s.summary = 'A library to render native animations from bodymovin json'
|
|
13
13
|
|
|
14
14
|
s.description = <<-DESC
|
|
15
15
|
Lottie is a mobile library for Android and iOS that parses Adobe After Effects animations exported as json with bodymovin and renders the vector animations natively on mobile and through React Native!
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
Lottie enables designers to create and ship beautiful animations without an engineer painstakingly recreating it be hand. Since the animation is backed by JSON they are extremely small in size but can be large in complexity! Animations can be played, resized, looped, sped up, slowed down, and even interactively scrubbed.
|
|
18
18
|
DESC
|
|
19
19
|
|
|
20
20
|
s.homepage = 'https://github.com/airbnb/lottie-ios'
|
|
@@ -22,16 +22,16 @@ For the first time, designers can create and ship beautiful animations without a
|
|
|
22
22
|
s.author = { 'Brandon Withrow' => 'buba447@gmail.com' }
|
|
23
23
|
s.source = { :git => 'https://github.com/airbnb/lottie-ios.git', :tag => s.version.to_s }
|
|
24
24
|
|
|
25
|
-
s.swift_version = '5.
|
|
26
|
-
s.ios.deployment_target = '
|
|
25
|
+
s.swift_version = '5.4'
|
|
26
|
+
s.ios.deployment_target = '11.0'
|
|
27
27
|
s.osx.deployment_target = '10.10'
|
|
28
|
-
s.tvos.deployment_target = '
|
|
28
|
+
s.tvos.deployment_target = '11.0'
|
|
29
29
|
|
|
30
|
-
s.source_files = '
|
|
31
|
-
s.
|
|
32
|
-
s.ios.exclude_files = '
|
|
33
|
-
s.tvos.exclude_files = '
|
|
34
|
-
s.osx.exclude_files = '
|
|
30
|
+
s.source_files = 'Sources/**/*'
|
|
31
|
+
s.exclude_files = 'Sources/Lottie.swift'
|
|
32
|
+
s.ios.exclude_files = 'Sources/Public/MacOS/**/*'
|
|
33
|
+
s.tvos.exclude_files = 'Sources/Public/MacOS/**/*'
|
|
34
|
+
s.osx.exclude_files = 'Sources/Public/iOS/**/*'
|
|
35
35
|
|
|
36
36
|
s.ios.frameworks = ['UIKit', 'CoreGraphics', 'QuartzCore']
|
|
37
37
|
s.tvos.frameworks = ['UIKit', 'CoreGraphics', 'QuartzCore']
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lottie-ios",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.4.0",
|
|
4
4
|
"description": "Lottie is a mobile library for Android and iOS that parses Adobe After Effects animations exported as json with bodymovin and renders the vector animations natively on mobile and through React Native!",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"scripts": {
|