lottie-ios 3.4.0 → 3.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (394) hide show
  1. package/.github/workflows/main.yml +10 -7
  2. package/.github/workflows/stale_issues.yml +17 -0
  3. package/.swiftpm/xcode/package.xcworkspace/xcuserdata/calstephens.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  4. package/Lottie.xcodeproj/project.pbxproj +33 -21
  5. package/Lottie.xcodeproj/xcshareddata/xcschemes/Lottie (macOS).xcscheme +2 -2
  6. package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  7. package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +5 -6
  8. package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/xcdebugger/Expressions.xcexplist +114 -1
  9. package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +30 -0
  10. package/Package.swift +1 -1
  11. package/README.md +5 -6
  12. package/Rakefile +52 -17
  13. package/Sources/Private/CoreAnimation/Animations/CAAnimation+TimingConfiguration.swift +7 -2
  14. package/Sources/Private/CoreAnimation/Animations/CALayer+addAnimation.swift +192 -67
  15. package/Sources/Private/CoreAnimation/Animations/CombinedShapeAnimation.swift +28 -0
  16. package/Sources/Private/CoreAnimation/Animations/EllipseAnimation.swift +31 -4
  17. package/Sources/Private/CoreAnimation/Animations/GradientAnimations.swift +98 -43
  18. package/Sources/Private/CoreAnimation/Animations/LayerProperty.swift +19 -19
  19. package/Sources/Private/CoreAnimation/Animations/RectangleAnimation.swift +34 -7
  20. package/Sources/Private/CoreAnimation/Animations/ShapeAnimation.swift +25 -14
  21. package/Sources/Private/CoreAnimation/Animations/StarAnimation.swift +61 -32
  22. package/Sources/Private/CoreAnimation/Animations/StrokeAnimation.swift +6 -2
  23. package/Sources/Private/CoreAnimation/CoreAnimationLayer.swift +29 -11
  24. package/Sources/Private/CoreAnimation/Extensions/KeyframeGroup+exactlyOneKeyframe.swift +2 -2
  25. package/Sources/Private/CoreAnimation/Extensions/Keyframes+combinedIfPossible.swift +116 -23
  26. package/Sources/Private/CoreAnimation/Layers/AnimationLayer.swift +9 -0
  27. package/Sources/Private/CoreAnimation/Layers/BaseCompositionLayer.swift +2 -1
  28. package/Sources/Private/CoreAnimation/Layers/CALayer+setupLayerHierarchy.swift +48 -12
  29. package/Sources/Private/CoreAnimation/Layers/GradientRenderLayer.swift +10 -3
  30. package/Sources/Private/CoreAnimation/Layers/LayerModel+makeAnimationLayer.swift +5 -0
  31. package/Sources/Private/CoreAnimation/Layers/MaskCompositionLayer.swift +1 -1
  32. package/Sources/Private/CoreAnimation/Layers/PreCompLayer.swift +2 -2
  33. package/Sources/Private/CoreAnimation/Layers/RepeaterLayer.swift +85 -0
  34. package/Sources/Private/CoreAnimation/Layers/ShapeItemLayer.swift +94 -38
  35. package/Sources/Private/CoreAnimation/Layers/ShapeLayer.swift +131 -46
  36. package/Sources/Private/CoreAnimation/Layers/TextLayer.swift +16 -2
  37. package/Sources/Private/MainThread/LayerContainers/CompLayers/CompositionLayer.swift +1 -1
  38. package/Sources/Private/MainThread/LayerContainers/CompLayers/MaskContainerLayer.swift +0 -2
  39. package/Sources/Private/MainThread/LayerContainers/CompLayers/PreCompositionLayer.swift +2 -2
  40. package/Sources/Private/MainThread/LayerContainers/MainThreadAnimationLayer.swift +1 -2
  41. package/Sources/Private/MainThread/LayerContainers/Utility/CoreTextRenderLayer.swift +30 -1
  42. package/Sources/Private/MainThread/LayerContainers/Utility/InvertedMatteLayer.swift +1 -0
  43. package/Sources/Private/MainThread/LayerContainers/Utility/LayerTransformNode.swift +0 -1
  44. package/Sources/Private/MainThread/NodeRenderSystem/Extensions/ItemsExtension.swift +5 -2
  45. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/ModifierNodes/TrimPathNode.swift +4 -7
  46. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/OutputNodes/Renderables/GradientFillRenderer.swift +5 -0
  47. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/OutputNodes/Renderables/GradientStrokeRenderer.swift +1 -2
  48. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/OutputNodes/Renderables/LegacyGradientFillRenderer.swift +1 -1
  49. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/OutputNodes/Renderables/StrokeRenderer.swift +1 -1
  50. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/PathNodes/RectNode.swift +1 -1
  51. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/PathNodes/StarNode.swift +3 -3
  52. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/RenderNodes/GradientFillNode.swift +3 -0
  53. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/RenderNodes/GradientStrokeNode.swift +1 -1
  54. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/RenderNodes/StrokeNode.swift +28 -1
  55. package/Sources/Private/MainThread/NodeRenderSystem/RenderLayers/ShapeContainerLayer.swift +1 -1
  56. package/Sources/Private/MainThread/NodeRenderSystem/RenderLayers/ShapeRenderLayer.swift +0 -1
  57. package/Sources/Private/Model/Animation.swift +4 -4
  58. package/Sources/Private/Model/Keyframes/KeyframeGroup.swift +25 -0
  59. package/Sources/Private/Model/ShapeItems/Ellipse.swift +0 -1
  60. package/Sources/Private/Model/ShapeItems/Fill.swift +1 -1
  61. package/Sources/Private/Model/ShapeItems/GradientFill.swift +14 -1
  62. package/Sources/Private/Model/ShapeItems/GradientStroke.swift +0 -1
  63. package/Sources/Private/Model/ShapeItems/Group.swift +6 -1
  64. package/Sources/Private/Model/ShapeItems/Merge.swift +0 -1
  65. package/Sources/Private/Model/ShapeItems/Rectangle.swift +0 -1
  66. package/Sources/Private/Model/ShapeItems/Repeater.swift +0 -1
  67. package/Sources/Private/Model/ShapeItems/ShapeTransform.swift +0 -1
  68. package/Sources/Private/Model/ShapeItems/Star.swift +0 -1
  69. package/Sources/Private/Model/ShapeItems/Stroke.swift +0 -1
  70. package/Sources/Private/Model/ShapeItems/Trim.swift +0 -1
  71. package/Sources/Private/Model/Text/TextAnimator.swift +0 -1
  72. package/Sources/Private/Utility/Debugging/LayerDebugging.swift +1 -2
  73. package/Sources/Private/Utility/Extensions/MathKit.swift +1 -2
  74. package/Sources/Private/Utility/Extensions/StringExtensions.swift +0 -1
  75. package/Sources/Private/Utility/Interpolatable/InterpolatableExtensions.swift +0 -1
  76. package/Sources/Private/{MainThread/NodeRenderSystem/NodeProperties/ValueProviders → Utility/Interpolatable}/KeyframeInterpolator.swift +1 -4
  77. package/Sources/Private/Utility/Primitives/BezierPath.swift +1 -2
  78. package/Sources/Private/Utility/Primitives/CurveVertex.swift +2 -4
  79. package/Sources/Public/Animation/AnimationPublic.swift +2 -4
  80. package/Sources/Public/Animation/AnimationView.swift +29 -7
  81. package/Sources/Public/Animation/AnimationViewInitializers.swift +13 -11
  82. package/Sources/Public/DynamicProperties/ValueProviders/GradientValueProvider.swift +0 -2
  83. package/Sources/Public/FontProvider/AnimationFontProvider.swift +1 -1
  84. package/Sources/Public/Logging/LottieLogger.swift +15 -2
  85. package/Sources/Public/TextProvider/AnimationTextProvider.swift +1 -1
  86. package/Sources/Public/iOS/AnimatedButton.swift +10 -4
  87. package/Sources/Public/iOS/AnimatedControl.swift +3 -5
  88. package/Sources/Public/iOS/AnimatedSwitch.swift +9 -6
  89. package/Sources/Public/iOS/BundleImageProvider.swift +2 -3
  90. package/Sources/Public/iOS/FilepathImageProvider.swift +1 -2
  91. package/Sources/Public/macOS/BundleImageProvider.macOS.swift +1 -2
  92. package/Sources/Public/macOS/FilepathImageProvider.macOS.swift +1 -3
  93. package/Tests/AnimationKeypathTests.swift +10 -1
  94. package/Tests/AutomaticEngineTests.swift +1 -0
  95. package/Tests/ParsingTests.swift +2 -1
  96. package/Tests/PerformanceTests.swift +28 -29
  97. package/Tests/SnapshotConfiguration.swift +19 -0
  98. package/Tests/SnapshotTests.swift +4 -0
  99. package/Tests/Utils/HardcodedTextProvider.swift +27 -0
  100. package/lottie-ios.podspec +2 -2
  101. package/package.json +1 -1
  102. package/script/test-carthage/CarthageTest/AppDelegate.swift +6 -7
  103. package/script/test-carthage/CarthageTest/ViewController.swift +1 -1
  104. package/script/test-carthage/CarthageTest-macOS/AppDelegate.swift +7 -0
  105. package/script/test-carthage/CarthageTest-macOS/Assets.xcassets/AccentColor.colorset/Contents.json +11 -0
  106. package/script/test-carthage/CarthageTest-macOS/Assets.xcassets/AppIcon.appiconset/Contents.json +58 -0
  107. package/script/test-carthage/CarthageTest-macOS/Assets.xcassets/Contents.json +6 -0
  108. package/script/test-carthage/CarthageTest-macOS/Base.lproj/Main.storyboard +717 -0
  109. package/script/test-carthage/CarthageTest-macOS/CarthageTest_macOS.entitlements +10 -0
  110. package/script/test-carthage/CarthageTest-macOS/ViewController.swift +15 -0
  111. package/script/test-carthage/CarthageTest.xcodeproj/project.pbxproj +159 -5
  112. package/script/test-carthage/CarthageTest.xcodeproj/project.xcworkspace/xcuserdata/calstephens.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  113. package/script/test-carthage/CarthageTest.xcodeproj/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +19 -0
  114. package/Lottie.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +0 -23
  115. package/Mintfile +0 -3
  116. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~-7Vi1RszY1XYnR2CCkEwIpKG8NwwA9zsZEz_WD7Dv6kKh4RC7N7ob8NIRVHGUJKp7eXxlpeI_gzD87Pcs_2u0g== +0 -0
  117. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~-SKV2drO-SFlrlh-wrzECDMkUSr-aF1lV9h-5onOy94zSTsD-oI45s0-KpOK45L-kq3hRY7v9vm-xmh00_eheg== +0 -0
  118. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~-_CU_vuaiFfObSeDFfmp7GuB20ThMSAL-P_RUMowiQLbdu-y0bU9upIm3q8g6XmXUG5hP6J1az0Ma5Hi_rhhRg== +0 -0
  119. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~03aPYP6VHJjZj5DlphGarj0xdw43qu09Onx5SReZoPvg9zh5uL212E-KWfGct9jf6JG0JFV2tdbBi7X_8bH9aw== +0 -0
  120. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~1Z82GPBBPc1VLvn4O7V5glb6lgyXteNlDREUzV_TPymM4ra4UkBMklzV90lEqoYRCDuRVzaQHaDYbmYp3-8CFw== +0 -0
  121. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~1mFDCboXpUu9pSHAiVGr1O_QgqEEtvJp_LUhickxLZo0Z5pj3fvadn1l2MzEOd4bFsVBZifUvcyPa7dzlMWF-A== +0 -0
  122. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~2_L9PUjv2JDKu1n8bDLb4XLB-yex6ZVjDDMwfuKAr7teDw-SKgLgkW6H-m_gjWChIVdB4vW6yvHP7XJxvXtRNA== +0 -0
  123. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~4VqMqsI5lOfxRppnud6-VDWcNsU8J7VgFCJfW2dXPwOcAkvU-I8Um5yp9n0Zv6nr3VmcxYggaVMDFfR0U_vjKw== +0 -1
  124. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~4krT4ZMzDOu34msFUq0Xod142kw4pAeSWX4JSxlsjOI0Wanu3343qeespgFi61MTWq1DdH9XXspVKqGlGm_fyw== +0 -0
  125. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~5_aJsdP-e3dRTAUnH-y1U2plaCuUi1vyHriaZuNK0xFe8wGl9Qft6uLCX2Qt6CRBKJQluEe9o0uRWw1eb42FHQ== +0 -0
  126. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~8b0bSqV7eND54zvHvu1v2Htpm7yn-BOEFw5d3mITJrXWNykJ5BTR9WbrD80JEctNcT-rDqO2xfrQk1tFWeY6Sw== +0 -0
  127. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~9u8KAGpgtSm-mQ12Py8RZUbYbDlBhM3w1I2MQO53K2CSn6IePp7g65DBcdXTYMfG1bgoJ-6x30fjnGe-2UYsDQ== +0 -0
  128. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~Bw7uMs4wqB9ahfEqGii2FkQ9pvZmG6HGe2hmbAT2wyM5hpn8Xh5dELysMcEz6hEsqmn6HdRdLOLZhC_fNaXzgA== +0 -0
  129. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~BwUq2xXQYuE8ya6HT6lfNsdtEjz5AKGf8GvLY6VBxQyIY1vgj_Gov-3NeM69OS66BQRDK0PG9H4Oyg0R48E4vg== +0 -0
  130. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~EkDVUR6dcnzxV_lYjkrJ5QGMVTCvb_upAoBF6DBu61sQkGvZN3fSRTsJ1XfJIZO-JUzdNoVA3D_CcvokL0gnQg== +0 -0
  131. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~FUkcLSJ8RAuPenM4HFG1R-sN5-cDBGcTxgR2jaVCna7xV0ZTyBHriB1Nn59mariNlJDiCoBtMUQEmauGxWtfBA== +0 -0
  132. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~FqsuZe4RVLOOVUYLTL-GTIohZ8TdSfxx7m2KJtLYFPGOdE4XorTX7Oc7kXbhghPRppXT3jW-slI37M34YNEvLQ== +0 -0
  133. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~G4F_NtyTj3i46fmKm0NorHAeq8tYWWYf6uv5yC1DwzdpWVoYbOPufmFNvdEbxZt4AMdV0gKx3HI46EAXNOQVFg== +0 -0
  134. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~GxetzGUNDgaBBXcTmLK6p9JBDX3I3QPshshbui1IaEWvJbQko-E36tCKwaJYHbleAWz9FqkAM_Tqx3YOmSVkVg== +0 -0
  135. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~H1Wjd5kKWDW4t3SDodxiHV72V8WT0xwPubw5cJTNLkPRLgaILFPh-dpy8EOUNgy1KzrDujFsm9EcTsbuqtMPLA== +0 -0
  136. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~JpI5MH4zCgebUHFpXVn4zjtsGtMNnO7BQZWfNARAB5UWa9gqz6YXHR3uLCJ_AvJ3lh53BUVkavsx9TY2FMmxbA== +0 -0
  137. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~JujNYkJtcux0Ni4QnR64zu4Wz_zYjyKvYaYZm5ypxTLPSzF3_jNE_NO4sdbDamF8wEqWoky1uf4ZE0JT3L607A== +0 -0
  138. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~KJSEA6DKnb2_FRPSqKZGh41eo-C8x448J9kEBrH012bUrZfOSDvrgmIrU0Vz7Ri3gaS9aKKmSaVMvXsHSlTJVA== +0 -0
  139. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~MStOwu3jBlJtcRnxrseVOuhI4kCj--ggFPG7sqrq5w1hjrI3bVyD-bm1Jwyx0noY3wT1rHDEvaGWnV2qsGjGwg== +0 -0
  140. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~McsJ8kFVf3IjhgXIRdw8Xx-EXgbV071bmlj2BBnk52xrWl3sEeiIyxwUsF7mIWvMRWfcFfu4VGHYyqfk2BeHXw== +0 -0
  141. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~NHt9fVe4kDdbxnglKcEwXaRK-WsYEOaD23Kbl8SJPRMYHr_Z6SJd_HmG3BROHHR_M6TgSmucONpDJdTj5tjuFw== +0 -0
  142. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~Nfo2iwCPcfAcOBIVyoUAK0-PIfr5qYxIKZt-uaSaTBdrTNxAuJ1ItmeDPZ3VdJJmxD_c22No7x482bdd3_yYtw== +0 -0
  143. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~S2Qlu11xBhEd5aGSzWsnw1TR8u8PiOF93GO0j5bfNoAFCVzxKOwhRFoIXba2EpQnLQqFdIKyhWN3l70A4GPHmg== +0 -0
  144. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~W7a7M37RO9jgck2zeR0471Pm7e8K0Kqj5tXEouDjvqKZXSrWxMaWD28oqkKKYAiU4608R4S9mM11KyphljdMSw== +0 -0
  145. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~XUo1oyPCrlL7CA74wG-OzQ06VOWJYWvHGFHU7keZN1SKaIXjHX5qi_kBzjG_rBCi89-S8GVmCy7S3PHSjG8SbQ== +0 -0
  146. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~Xh0VmDvFNMELHu08-vrs54pegVyUwwDRxx_nXkwyD0NjnYozyqcGAKAr_QWHmw6F8XyuWg51M9KGpJJIFzzGuw== +0 -0
  147. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~Xve-wMBp_lxVUgD9qH5GwieGP9cAWtm0xULZvdGjBRUMvaevmpCB5gnbMBuIXAO6a1c9v6WUq0jNVX7ut5HvOw== +0 -0
  148. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~ZU1XkZFgnEE22CXEF-pOlcj5f10x-KM1Vw9d4IOLu-NiTZcz7koYPixhdrB1PJr8J-h9NpJmfqEastfxamA1jQ== +0 -0
  149. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~_YkNYEHTsbbtFILJpzH3HenH0t4ShI25dIMdve541CF5bl-jPF3X3F7tq-t5dvP0TEkATsOJdLQdBp1xv4Q-ag== +0 -0
  150. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~boy6mpn2jkwm60jjgQ0TG25UqRdN46LzmgTVCrpy6nBOgkLCGkGHcbceiwjU1itS_vj3-iQX0ZnrWOQrPyfHNA== +0 -0
  151. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~bwzpVZ9hAqGDHhXs2FRA82dfGfLmc7-m0uQhZDDfHHO7hQ17M_Np341BZX4WDLhYYS4cdUgaDodlNpdfpG3nXw== +0 -0
  152. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~cBxe-9PpAGFdAsYkmdN3lJVqEliLcRYlyoAov0aPZfJGwUr_cOm3XpjO7nmf_2eLf8UAx-rycjnJzw07xLrNCA== +0 -1
  153. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~dirWk6W4Pav1oyciuflfJlRu0iuxbYOmrpQapOJ0mV9C1SQ-jvDRv_7h753Cy18-SwULARUdWsyUy3yNNvxF7w== +0 -0
  154. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~ebwZVjSEHroc9jtIm4jd_h_YAqEBcOkAZ4HPNJT8pLCldjRcTq-obQLakxXOhfuoOBlYBoZLuO-Y0lskeZRYKw== +0 -0
  155. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~gfcRcmRIr0h09d0jiZsA7nUeQv2XtapxuYEXZy1Z9um0tTJQvz-O5ef5f7zhLenLvjnDtDtlY_aY4Hvpce6e1Q== +0 -0
  156. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~hgOgiVCyv2R0W-f0qKw5xYPeUwj8_ccCM9vKH_7vAQcCO9t8BwR1APGRBv20AONmp-PYMXmtgsBlQkNBRBpdQA== +0 -0
  157. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~hrhCl-YRAAr8ByNB_LCgEBsVNHMp92gTIUknetpUHMjcXl4Hpn_uY-h6C45oga0ZALnfGCo6iKTmiPLa4Qvnpg== +0 -0
  158. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~n2yoR7JsyL4DSUwmjnpE4Iq9Qi_eeZrmpPU8cdehDFKfESK7nwxXxfrSMQbk0BQ2lgGPadoRcd1-qr1xVz97jA== +0 -0
  159. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~nMCcZm8WvPogyO_nuJ926Q3Q2dqVMN2LdjEL1Kq2wJ_RG-rH-e_6v41l1xZbCsQTa3XykQdEiXNc0HtAvT6IRA== +0 -0
  160. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~oc3C7xkUt-OWDL6rrsxs-seS4Fu1bqBWAAXCHalgShaGg9MUrOiRbHT2DcAnhyQFKx6x5FRbvjmYoQWrQiXJZA== +0 -0
  161. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~p-ihj7SEgkDXpMu9hvKE_wiX9cvtwyXrdIn964BfedXHKGpC6o7mMPxEyC0kRPVi_EZs_MRV5bAPEpl5h5we0g== +0 -0
  162. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~qlhO_D9oE8uSKH-mZqyRF9pp4Zv1Tv0dIYcqrH4hb1VWlIxcdxmg2j0M8496cQeFXC5bn_JMXdBlD-d6cnFF8w== +0 -0
  163. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~tjpiyIxJR_boTdUNrtFDuKIZoY84fI4lA1oMJbq9e2ZmYKIK5FeRN2O8cV_yMOYJGr4lbv03kTmT70mCjUc2_Q== +0 -0
  164. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~wULeoj18eEKJWAKx1uFQVwS48cUGFcYPRJQj1Ro5XNJsWCwppGSCdIPhwifD6Z2f_j3zfI2SmC2Gg81sBXXW7g== +0 -0
  165. package/Tests/Artifacts/LottieTests.xcresult/Data/data.0~zrEihMys4NVV5rx6FmuzEGO2TjloI3OiC7yzIhvqYoRo43ibb2F-Km6Jf4NX-ac62pOLBYZRcjQTvYMpn75_oA== +0 -0
  166. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~-7Vi1RszY1XYnR2CCkEwIpKG8NwwA9zsZEz_WD7Dv6kKh4RC7N7ob8NIRVHGUJKp7eXxlpeI_gzD87Pcs_2u0g== +0 -0
  167. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~-SKV2drO-SFlrlh-wrzECDMkUSr-aF1lV9h-5onOy94zSTsD-oI45s0-KpOK45L-kq3hRY7v9vm-xmh00_eheg== +0 -0
  168. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~-_CU_vuaiFfObSeDFfmp7GuB20ThMSAL-P_RUMowiQLbdu-y0bU9upIm3q8g6XmXUG5hP6J1az0Ma5Hi_rhhRg== +0 -0
  169. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~03aPYP6VHJjZj5DlphGarj0xdw43qu09Onx5SReZoPvg9zh5uL212E-KWfGct9jf6JG0JFV2tdbBi7X_8bH9aw== +0 -0
  170. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~1Z82GPBBPc1VLvn4O7V5glb6lgyXteNlDREUzV_TPymM4ra4UkBMklzV90lEqoYRCDuRVzaQHaDYbmYp3-8CFw== +0 -0
  171. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~1mFDCboXpUu9pSHAiVGr1O_QgqEEtvJp_LUhickxLZo0Z5pj3fvadn1l2MzEOd4bFsVBZifUvcyPa7dzlMWF-A== +0 -0
  172. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~2_L9PUjv2JDKu1n8bDLb4XLB-yex6ZVjDDMwfuKAr7teDw-SKgLgkW6H-m_gjWChIVdB4vW6yvHP7XJxvXtRNA== +0 -0
  173. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~4VqMqsI5lOfxRppnud6-VDWcNsU8J7VgFCJfW2dXPwOcAkvU-I8Um5yp9n0Zv6nr3VmcxYggaVMDFfR0U_vjKw== +0 -0
  174. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~4krT4ZMzDOu34msFUq0Xod142kw4pAeSWX4JSxlsjOI0Wanu3343qeespgFi61MTWq1DdH9XXspVKqGlGm_fyw== +0 -0
  175. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~5_aJsdP-e3dRTAUnH-y1U2plaCuUi1vyHriaZuNK0xFe8wGl9Qft6uLCX2Qt6CRBKJQluEe9o0uRWw1eb42FHQ== +0 -0
  176. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~8b0bSqV7eND54zvHvu1v2Htpm7yn-BOEFw5d3mITJrXWNykJ5BTR9WbrD80JEctNcT-rDqO2xfrQk1tFWeY6Sw== +0 -0
  177. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~9u8KAGpgtSm-mQ12Py8RZUbYbDlBhM3w1I2MQO53K2CSn6IePp7g65DBcdXTYMfG1bgoJ-6x30fjnGe-2UYsDQ== +0 -0
  178. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~Bw7uMs4wqB9ahfEqGii2FkQ9pvZmG6HGe2hmbAT2wyM5hpn8Xh5dELysMcEz6hEsqmn6HdRdLOLZhC_fNaXzgA== +0 -0
  179. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~BwUq2xXQYuE8ya6HT6lfNsdtEjz5AKGf8GvLY6VBxQyIY1vgj_Gov-3NeM69OS66BQRDK0PG9H4Oyg0R48E4vg== +0 -0
  180. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~EkDVUR6dcnzxV_lYjkrJ5QGMVTCvb_upAoBF6DBu61sQkGvZN3fSRTsJ1XfJIZO-JUzdNoVA3D_CcvokL0gnQg== +0 -0
  181. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~FUkcLSJ8RAuPenM4HFG1R-sN5-cDBGcTxgR2jaVCna7xV0ZTyBHriB1Nn59mariNlJDiCoBtMUQEmauGxWtfBA== +0 -0
  182. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~FqsuZe4RVLOOVUYLTL-GTIohZ8TdSfxx7m2KJtLYFPGOdE4XorTX7Oc7kXbhghPRppXT3jW-slI37M34YNEvLQ== +0 -0
  183. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~G4F_NtyTj3i46fmKm0NorHAeq8tYWWYf6uv5yC1DwzdpWVoYbOPufmFNvdEbxZt4AMdV0gKx3HI46EAXNOQVFg== +0 -0
  184. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~GxetzGUNDgaBBXcTmLK6p9JBDX3I3QPshshbui1IaEWvJbQko-E36tCKwaJYHbleAWz9FqkAM_Tqx3YOmSVkVg== +0 -0
  185. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~H1Wjd5kKWDW4t3SDodxiHV72V8WT0xwPubw5cJTNLkPRLgaILFPh-dpy8EOUNgy1KzrDujFsm9EcTsbuqtMPLA== +0 -0
  186. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~JpI5MH4zCgebUHFpXVn4zjtsGtMNnO7BQZWfNARAB5UWa9gqz6YXHR3uLCJ_AvJ3lh53BUVkavsx9TY2FMmxbA== +0 -0
  187. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~JujNYkJtcux0Ni4QnR64zu4Wz_zYjyKvYaYZm5ypxTLPSzF3_jNE_NO4sdbDamF8wEqWoky1uf4ZE0JT3L607A== +0 -0
  188. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~KJSEA6DKnb2_FRPSqKZGh41eo-C8x448J9kEBrH012bUrZfOSDvrgmIrU0Vz7Ri3gaS9aKKmSaVMvXsHSlTJVA== +0 -0
  189. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~MStOwu3jBlJtcRnxrseVOuhI4kCj--ggFPG7sqrq5w1hjrI3bVyD-bm1Jwyx0noY3wT1rHDEvaGWnV2qsGjGwg== +0 -0
  190. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~McsJ8kFVf3IjhgXIRdw8Xx-EXgbV071bmlj2BBnk52xrWl3sEeiIyxwUsF7mIWvMRWfcFfu4VGHYyqfk2BeHXw== +0 -0
  191. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~NHt9fVe4kDdbxnglKcEwXaRK-WsYEOaD23Kbl8SJPRMYHr_Z6SJd_HmG3BROHHR_M6TgSmucONpDJdTj5tjuFw== +0 -0
  192. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~Nfo2iwCPcfAcOBIVyoUAK0-PIfr5qYxIKZt-uaSaTBdrTNxAuJ1ItmeDPZ3VdJJmxD_c22No7x482bdd3_yYtw== +0 -0
  193. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~S2Qlu11xBhEd5aGSzWsnw1TR8u8PiOF93GO0j5bfNoAFCVzxKOwhRFoIXba2EpQnLQqFdIKyhWN3l70A4GPHmg== +0 -0
  194. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~W7a7M37RO9jgck2zeR0471Pm7e8K0Kqj5tXEouDjvqKZXSrWxMaWD28oqkKKYAiU4608R4S9mM11KyphljdMSw== +0 -0
  195. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~XUo1oyPCrlL7CA74wG-OzQ06VOWJYWvHGFHU7keZN1SKaIXjHX5qi_kBzjG_rBCi89-S8GVmCy7S3PHSjG8SbQ== +0 -0
  196. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~Xh0VmDvFNMELHu08-vrs54pegVyUwwDRxx_nXkwyD0NjnYozyqcGAKAr_QWHmw6F8XyuWg51M9KGpJJIFzzGuw== +0 -0
  197. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~Xve-wMBp_lxVUgD9qH5GwieGP9cAWtm0xULZvdGjBRUMvaevmpCB5gnbMBuIXAO6a1c9v6WUq0jNVX7ut5HvOw== +0 -0
  198. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~ZU1XkZFgnEE22CXEF-pOlcj5f10x-KM1Vw9d4IOLu-NiTZcz7koYPixhdrB1PJr8J-h9NpJmfqEastfxamA1jQ== +0 -0
  199. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~_YkNYEHTsbbtFILJpzH3HenH0t4ShI25dIMdve541CF5bl-jPF3X3F7tq-t5dvP0TEkATsOJdLQdBp1xv4Q-ag== +0 -0
  200. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~boy6mpn2jkwm60jjgQ0TG25UqRdN46LzmgTVCrpy6nBOgkLCGkGHcbceiwjU1itS_vj3-iQX0ZnrWOQrPyfHNA== +0 -0
  201. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~bwzpVZ9hAqGDHhXs2FRA82dfGfLmc7-m0uQhZDDfHHO7hQ17M_Np341BZX4WDLhYYS4cdUgaDodlNpdfpG3nXw== +0 -0
  202. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~cBxe-9PpAGFdAsYkmdN3lJVqEliLcRYlyoAov0aPZfJGwUr_cOm3XpjO7nmf_2eLf8UAx-rycjnJzw07xLrNCA== +0 -0
  203. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~dirWk6W4Pav1oyciuflfJlRu0iuxbYOmrpQapOJ0mV9C1SQ-jvDRv_7h753Cy18-SwULARUdWsyUy3yNNvxF7w== +0 -0
  204. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~ebwZVjSEHroc9jtIm4jd_h_YAqEBcOkAZ4HPNJT8pLCldjRcTq-obQLakxXOhfuoOBlYBoZLuO-Y0lskeZRYKw== +0 -0
  205. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~gfcRcmRIr0h09d0jiZsA7nUeQv2XtapxuYEXZy1Z9um0tTJQvz-O5ef5f7zhLenLvjnDtDtlY_aY4Hvpce6e1Q== +0 -0
  206. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~hgOgiVCyv2R0W-f0qKw5xYPeUwj8_ccCM9vKH_7vAQcCO9t8BwR1APGRBv20AONmp-PYMXmtgsBlQkNBRBpdQA== +0 -0
  207. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~hrhCl-YRAAr8ByNB_LCgEBsVNHMp92gTIUknetpUHMjcXl4Hpn_uY-h6C45oga0ZALnfGCo6iKTmiPLa4Qvnpg== +0 -0
  208. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~n2yoR7JsyL4DSUwmjnpE4Iq9Qi_eeZrmpPU8cdehDFKfESK7nwxXxfrSMQbk0BQ2lgGPadoRcd1-qr1xVz97jA== +0 -0
  209. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~nMCcZm8WvPogyO_nuJ926Q3Q2dqVMN2LdjEL1Kq2wJ_RG-rH-e_6v41l1xZbCsQTa3XykQdEiXNc0HtAvT6IRA== +0 -0
  210. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~oc3C7xkUt-OWDL6rrsxs-seS4Fu1bqBWAAXCHalgShaGg9MUrOiRbHT2DcAnhyQFKx6x5FRbvjmYoQWrQiXJZA== +0 -0
  211. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~p-ihj7SEgkDXpMu9hvKE_wiX9cvtwyXrdIn964BfedXHKGpC6o7mMPxEyC0kRPVi_EZs_MRV5bAPEpl5h5we0g== +0 -0
  212. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~qlhO_D9oE8uSKH-mZqyRF9pp4Zv1Tv0dIYcqrH4hb1VWlIxcdxmg2j0M8496cQeFXC5bn_JMXdBlD-d6cnFF8w== +0 -0
  213. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~tjpiyIxJR_boTdUNrtFDuKIZoY84fI4lA1oMJbq9e2ZmYKIK5FeRN2O8cV_yMOYJGr4lbv03kTmT70mCjUc2_Q== +0 -0
  214. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~wULeoj18eEKJWAKx1uFQVwS48cUGFcYPRJQj1Ro5XNJsWCwppGSCdIPhwifD6Z2f_j3zfI2SmC2Gg81sBXXW7g== +0 -0
  215. package/Tests/Artifacts/LottieTests.xcresult/Data/refs.0~zrEihMys4NVV5rx6FmuzEGO2TjloI3OiC7yzIhvqYoRo43ibb2F-Km6Jf4NX-ac62pOLBYZRcjQTvYMpn75_oA== +0 -0
  216. package/Tests/Artifacts/LottieTests.xcresult/Info.plist +0 -29
  217. package/Tests/Samples/9squares_AlBoardman.json +0 -1
  218. package/Tests/Samples/Boat_Loader.json +0 -1
  219. package/Tests/Samples/HamburgerArrow.json +0 -1
  220. package/Tests/Samples/IconTransitions.json +0 -1
  221. package/Tests/Samples/Images/dog.png +0 -0
  222. package/Tests/Samples/Issues/issue_1403.json +0 -1
  223. package/Tests/Samples/Issues/issue_1407.json +0 -1
  224. package/Tests/Samples/Issues/issue_1488.json +0 -1
  225. package/Tests/Samples/Issues/issue_1505.json +0 -1
  226. package/Tests/Samples/Issues/issue_1628.json +0 -1
  227. package/Tests/Samples/Issues/pr_1536.json +0 -1
  228. package/Tests/Samples/Issues/pr_1563.json +0 -8439
  229. package/Tests/Samples/Issues/pr_1592.json +0 -5527
  230. package/Tests/Samples/Issues/pr_1599.json +0 -738
  231. package/Tests/Samples/Issues/pr_1604_1.json +0 -1
  232. package/Tests/Samples/Issues/pr_1604_2.json +0 -1
  233. package/Tests/Samples/LottieFiles/LICENSE.md +0 -14
  234. package/Tests/Samples/LottieFiles/bounce_strokes.json +0 -1
  235. package/Tests/Samples/LottieFiles/cactus.json +0 -1
  236. package/Tests/Samples/LottieFiles/dog_car_ride.json +0 -1
  237. package/Tests/Samples/LottieFiles/draft_icon.json +0 -1
  238. package/Tests/Samples/LottieFiles/gradient_1.json +0 -1
  239. package/Tests/Samples/LottieFiles/gradient_2.json +0 -1
  240. package/Tests/Samples/LottieFiles/gradient_pill.json +0 -1
  241. package/Tests/Samples/LottieFiles/gradient_shapes.json +0 -1
  242. package/Tests/Samples/LottieFiles/gradient_square.json +0 -1
  243. package/Tests/Samples/LottieFiles/growth.json +0 -1
  244. package/Tests/Samples/LottieFiles/infinity_loader.json +0 -1
  245. package/Tests/Samples/LottieFiles/loading_dots_1.json +0 -1
  246. package/Tests/Samples/LottieFiles/loading_dots_2.json +0 -1
  247. package/Tests/Samples/LottieFiles/loading_dots_3.json +0 -1
  248. package/Tests/Samples/LottieFiles/loading_gradient_strokes.json +0 -1
  249. package/Tests/Samples/LottieFiles/settings_slider.json +0 -1
  250. package/Tests/Samples/LottieFiles/shop.json +0 -1
  251. package/Tests/Samples/LottieFiles/step_loader.json +0 -1
  252. package/Tests/Samples/LottieLogo1.json +0 -1
  253. package/Tests/Samples/LottieLogo1_masked.json +0 -1
  254. package/Tests/Samples/LottieLogo2.json +0 -1
  255. package/Tests/Samples/MotionCorpse_Jrcanest.json +0 -1
  256. package/Tests/Samples/Nonanimating/BasicLayers.json +0 -1
  257. package/Tests/Samples/Nonanimating/DisableNodesTest.json +0 -1
  258. package/Tests/Samples/Nonanimating/FirstText.json +0 -1
  259. package/Tests/Samples/Nonanimating/GeometryTransformTest.json +0 -1
  260. package/Tests/Samples/Nonanimating/Text_AnimatedProperties.json +0 -1
  261. package/Tests/Samples/Nonanimating/Text_Glyph.json +0 -1
  262. package/Tests/Samples/Nonanimating/Text_NoAnimation.json +0 -1
  263. package/Tests/Samples/Nonanimating/Text_NoGlyph.json +0 -1
  264. package/Tests/Samples/Nonanimating/Zoom.json +0 -1
  265. package/Tests/Samples/Nonanimating/_dog.json +0 -1
  266. package/Tests/Samples/Nonanimating/base64Test.json +0 -1
  267. package/Tests/Samples/Nonanimating/blend_mode_test.json +0 -1
  268. package/Tests/Samples/Nonanimating/keypathTest.json +0 -1
  269. package/Tests/Samples/Nonanimating/verifyLineHeight.json +0 -1
  270. package/Tests/Samples/PinJump.json +0 -1
  271. package/Tests/Samples/Private/BrokenLottieFiles/growth_man.json +0 -874
  272. package/Tests/Samples/Private/BrokenLottieFiles/rocket.json +0 -1
  273. package/Tests/Samples/Private/China_EmptyState_Itinerary.json +0 -1
  274. package/Tests/Samples/Private/LoaderHourglass.json +0 -12070
  275. package/Tests/Samples/Private/README.md +0 -7
  276. package/Tests/Samples/Private/Urgency/alarm_animated.json +0 -1
  277. package/Tests/Samples/Private/Urgency/diamond_animated.json +0 -1
  278. package/Tests/Samples/Private/Urgency/eye_animated.json +0 -1
  279. package/Tests/Samples/Private/Urgency/light_bulb_animated.json +0 -1
  280. package/Tests/Samples/Private/Urgency/light_bulb_static.json +0 -1
  281. package/Tests/Samples/Private/Urgency/piggy_bank_static.json +0 -1
  282. package/Tests/Samples/Private/Urgency/price_tag_legacy.json +0 -1
  283. package/Tests/Samples/Private/Urgency/rausch_alarm.json +0 -1
  284. package/Tests/Samples/Private/Urgency/rausch_alert.json +0 -1
  285. package/Tests/Samples/Private/Urgency/rausch_clock.json +0 -1
  286. package/Tests/Samples/Private/Urgency/rausch_diamond.json +0 -1
  287. package/Tests/Samples/Private/Urgency/rausch_money.json +0 -1
  288. package/Tests/Samples/Private/Urgency/rausch_piggy_bank.json +0 -1
  289. package/Tests/Samples/Private/Urgency/rausch_tag.json +0 -1
  290. package/Tests/Samples/Private/Urgency/red_envelope_animated.json +0 -1
  291. package/Tests/Samples/Private/Urgency/tag_animated.json +0 -1
  292. package/Tests/Samples/Private/Urgency/trophy_animated.json +0 -1
  293. package/Tests/Samples/Private/Urgency/wings_key_animated.json +0 -1
  294. package/Tests/Samples/Private/_flexible.json +0 -1
  295. package/Tests/Samples/Private/aircover.json +0 -1
  296. package/Tests/Samples/Private/belo_spin_rausch.json +0 -1
  297. package/Tests/Samples/Private/celebration.json +0 -2821
  298. package/Tests/Samples/Private/checkbox.json +0 -1
  299. package/Tests/Samples/Private/checkbox_small.json +0 -1
  300. package/Tests/Samples/Private/getting_your_trip_ready.json +0 -3540
  301. package/Tests/Samples/Private/gradient_afternoon.json +0 -1
  302. package/Tests/Samples/Private/gradient_brand.json +0 -1
  303. package/Tests/Samples/Private/gradient_evening.json +0 -1
  304. package/Tests/Samples/Private/gradient_morning.json +0 -1
  305. package/Tests/Samples/Private/issue_1467.json +0 -1
  306. package/Tests/Samples/Private/loading_dots.json +0 -1
  307. package/Tests/Samples/Private/loading_dots_small.json +0 -1
  308. package/Tests/Samples/Private/payment_loader.json +0 -1
  309. package/Tests/Samples/Private/radio_button.json +0 -1
  310. package/Tests/Samples/Private/selfie_intro.json +0 -1
  311. package/Tests/Samples/Private/stepper_add.json +0 -1
  312. package/Tests/Samples/Private/stepper_subtract.json +0 -1
  313. package/Tests/Samples/Private/switch.json +0 -1
  314. package/Tests/Samples/Private/thumb.json +0 -1
  315. package/Tests/Samples/Private/toggle_no.json +0 -1
  316. package/Tests/Samples/Private/toggle_yes.json +0 -1
  317. package/Tests/Samples/Private/user_error_black_and_white.json +0 -1
  318. package/Tests/Samples/Private/user_error_cut_off.json +0 -1
  319. package/Tests/Samples/Switch.json +0 -1
  320. package/Tests/Samples/Switch_States.json +0 -1
  321. package/Tests/Samples/TwitterHeart.json +0 -1
  322. package/Tests/Samples/TwitterHeartButton.json +0 -1
  323. package/Tests/Samples/TypeFace/A.json +0 -1
  324. package/Tests/Samples/TypeFace/Apostrophe.json +0 -1
  325. package/Tests/Samples/TypeFace/B.json +0 -1
  326. package/Tests/Samples/TypeFace/BlinkingCursor.json +0 -1
  327. package/Tests/Samples/TypeFace/C.json +0 -1
  328. package/Tests/Samples/TypeFace/Colon.json +0 -1
  329. package/Tests/Samples/TypeFace/Comma.json +0 -1
  330. package/Tests/Samples/TypeFace/D.json +0 -1
  331. package/Tests/Samples/TypeFace/E.json +0 -1
  332. package/Tests/Samples/TypeFace/F.json +0 -1
  333. package/Tests/Samples/TypeFace/G.json +0 -1
  334. package/Tests/Samples/TypeFace/H.json +0 -1
  335. package/Tests/Samples/TypeFace/I.json +0 -1
  336. package/Tests/Samples/TypeFace/J.json +0 -1
  337. package/Tests/Samples/TypeFace/K.json +0 -1
  338. package/Tests/Samples/TypeFace/L.json +0 -1
  339. package/Tests/Samples/TypeFace/M.json +0 -1
  340. package/Tests/Samples/TypeFace/N.json +0 -1
  341. package/Tests/Samples/TypeFace/O.json +0 -1
  342. package/Tests/Samples/TypeFace/P.json +0 -1
  343. package/Tests/Samples/TypeFace/Q.json +0 -1
  344. package/Tests/Samples/TypeFace/R.json +0 -1
  345. package/Tests/Samples/TypeFace/S.json +0 -1
  346. package/Tests/Samples/TypeFace/T.json +0 -1
  347. package/Tests/Samples/TypeFace/U.json +0 -1
  348. package/Tests/Samples/TypeFace/V.json +0 -1
  349. package/Tests/Samples/TypeFace/W.json +0 -1
  350. package/Tests/Samples/TypeFace/X.json +0 -1
  351. package/Tests/Samples/TypeFace/Y.json +0 -1
  352. package/Tests/Samples/TypeFace/Z.json +0 -1
  353. package/Tests/Samples/Watermelon.json +0 -1
  354. package/Tests/Samples/setValueTest.json +0 -1
  355. package/Tests/Samples/timeremap.json +0 -1
  356. package/Tests/Samples/vcTransition1.json +0 -1
  357. package/Tests/Samples/vcTransition2.json +0 -1
  358. package/script/lint/airbnb.swiftformat +0 -68
  359. package/script/lint/swiftlint.yml +0 -38
  360. package/script/test-carthage/Carthage/Build/.lottie-ios.version +0 -19
  361. package/script/test-carthage/Carthage/Build/Lottie.xcframework/Info.plist +0 -46
  362. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/BCSymbolMaps/BF971162-BE99-3507-B5B3-11947DC6B176.bcsymbolmap +0 -14778
  363. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Headers/Lottie-Swift.h +0 -673
  364. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Info.plist +0 -0
  365. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Lottie +0 -0
  366. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Modules/Lottie.swiftmodule/arm64-apple-ios.swiftdoc +0 -0
  367. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Modules/Lottie.swiftmodule/arm64-apple-ios.swiftmodule +0 -0
  368. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Modules/Lottie.swiftmodule/arm64.swiftdoc +0 -0
  369. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Modules/Lottie.swiftmodule/arm64.swiftmodule +0 -0
  370. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/Lottie.framework/Modules/module.modulemap +0 -4
  371. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/dSYMs/Lottie.framework.dSYM/Contents/Info.plist +0 -20
  372. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64/dSYMs/Lottie.framework.dSYM/Contents/Resources/DWARF/Lottie +0 -0
  373. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Headers/Lottie-Swift.h +0 -1352
  374. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Info.plist +0 -0
  375. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Lottie +0 -0
  376. 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
  377. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/Project/arm64.swiftsourceinfo +0 -0
  378. 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
  379. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/Project/x86_64.swiftsourceinfo +0 -0
  380. 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
  381. 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
  382. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/arm64.swiftdoc +0 -0
  383. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/arm64.swiftmodule +0 -0
  384. 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
  385. 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
  386. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/x86_64.swiftdoc +0 -0
  387. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/Lottie.swiftmodule/x86_64.swiftmodule +0 -0
  388. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/Modules/module.modulemap +0 -4
  389. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/Lottie.framework/_CodeSignature/CodeResources +0 -256
  390. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/dSYMs/Lottie.framework.dSYM/Contents/Info.plist +0 -20
  391. package/script/test-carthage/Carthage/Build/Lottie.xcframework/ios-arm64_x86_64-simulator/dSYMs/Lottie.framework.dSYM/Contents/Resources/DWARF/Lottie +0 -0
  392. package/script/test-carthage/Carthage/Checkouts/lottie-ios/Lottie.xcodeproj/project.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  393. package/script/test-carthage/Carthage/Checkouts/lottie-ios/Lottie.xcodeproj/xcuserdata/cal.xcuserdatad/xcschemes/xcschememanagement.plist +0 -37
  394. package/script/test-carthage/Carthage/Checkouts/lottie-ios/Lottie.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
@@ -29,18 +29,36 @@ extension GradientRenderLayer {
29
29
  // MARK: Internal
30
30
 
31
31
  /// Adds gradient-related animations to this layer, from the given `GradientFill`
32
- func addGradientAnimations(for gradient: GradientShapeItem, context: LayerAnimationContext) throws {
33
- // We have to set `colors` to a non-nil value with some valid number of colors
34
- // for the color animation below to have any effect
35
- colors = .init(
36
- repeating: CGColor.rgb(0, 0, 0),
37
- count: gradient.numberOfColors)
32
+ /// - The RGB components and alpha components can have different color stops / locations,
33
+ /// so have to be rendered in separate `CAGradientLayer`s.
34
+ func addGradientAnimations(
35
+ for gradient: GradientShapeItem,
36
+ type: GradientContentType,
37
+ context: LayerAnimationContext) throws
38
+ {
39
+ // We have to set `colors` and `locations` to non-nil values
40
+ // for the animations below to actually take effect
41
+ locations = []
42
+
43
+ // The initial value for `colors` must be an array with the exact same number of colors
44
+ // as the gradient that will be applied in the `CAAnimation`
45
+ switch type {
46
+ case .rgb:
47
+ colors = .init(
48
+ repeating: CGColor.rgb(0, 0, 0),
49
+ count: gradient.numberOfColors)
50
+
51
+ case .alpha:
52
+ colors = .init(
53
+ repeating: CGColor.rgb(0, 0, 0),
54
+ count: gradient.colorConfiguration(from: gradient.colors.keyframes[0].value, type: .alpha).count)
55
+ }
38
56
 
39
57
  try addAnimation(
40
58
  for: .colors,
41
59
  keyframes: gradient.colors.keyframes,
42
60
  value: { colorComponents in
43
- try gradient.colorConfiguration(from: colorComponents, context: context).map { $0.color }
61
+ gradient.colorConfiguration(from: colorComponents, type: type).map { $0.color }
44
62
  },
45
63
  context: context)
46
64
 
@@ -48,7 +66,7 @@ extension GradientRenderLayer {
48
66
  for: .locations,
49
67
  keyframes: gradient.colors.keyframes,
50
68
  value: { colorComponents in
51
- try gradient.colorConfiguration(from: colorComponents, context: context).map { $0.location }
69
+ gradient.colorConfiguration(from: colorComponents, type: type).map { $0.location }
52
70
  },
53
71
  context: context)
54
72
 
@@ -98,10 +116,10 @@ extension GradientRenderLayer {
98
116
  // at any given time requires knowing the current `startPoint`,
99
117
  // we can't allow them to animate separately.
100
118
  let absoluteStartPoint = try gradient.startPoint
101
- .exactlyOneKeyframe(context: context, description: "gradient startPoint").value.pointValue
119
+ .exactlyOneKeyframe(context: context, description: "gradient startPoint").pointValue
102
120
 
103
121
  let absoluteEndPoint = try gradient.endPoint
104
- .exactlyOneKeyframe(context: context, description: "gradient endPoint").value.pointValue
122
+ .exactlyOneKeyframe(context: context, description: "gradient endPoint").pointValue
105
123
 
106
124
  startPoint = percentBasedPointInBounds(from: absoluteStartPoint)
107
125
 
@@ -113,55 +131,92 @@ extension GradientRenderLayer {
113
131
  }
114
132
  }
115
133
 
134
+ // MARK: - GradientContentType
135
+
136
+ /// Each type of gradient that can be constructed from a `GradientShapeItem`
137
+ enum GradientContentType {
138
+ case rgb
139
+ case alpha
140
+ }
141
+
142
+ /// `colors` and `locations` configuration for a `CAGradientLayer`
143
+ typealias GradientColorConfiguration = [(color: CGColor, location: CGFloat)]
144
+
116
145
  extension GradientShapeItem {
146
+
147
+ // MARK: Internal
148
+
149
+ /// Whether or not this `GradientShapeItem` includes an alpha component
150
+ /// that has to be rendered as a separate `CAGradientLayer` from the
151
+ /// layer that renders the rgb color components
152
+ var hasAlphaComponent: Bool {
153
+ for colorComponentsKeyframe in colors.keyframes {
154
+ let colorComponents = colorComponentsKeyframe.value
155
+ let alphaConfiguration = colorConfiguration(from: colorComponents, type: .alpha)
156
+
157
+ let notFullyOpaque = alphaConfiguration.contains(where: { color, _ in
158
+ color.alpha < 0.999
159
+ })
160
+
161
+ if notFullyOpaque {
162
+ return true
163
+ }
164
+ }
165
+
166
+ return false
167
+ }
168
+
169
+ // MARK: Fileprivate
170
+
117
171
  /// Converts the compact `[Double]` color components representation
118
172
  /// into an array of `CGColor`s and the location of those colors within the gradient.
119
173
  /// - The color components array is a repeating list of `[location, red, green, blue]` values
120
174
  /// for each color in the gradient, followed by an optional repeating list of
121
175
  /// `[location, alpha]` values that control the colors' alpha values.
176
+ /// - The RGB and alpha values can have different color stops / locations,
177
+ /// so each has to be rendered in a separate `CAGradientLayer`.
122
178
  fileprivate func colorConfiguration(
123
179
  from colorComponents: [Double],
124
- context: LayerAnimationContext) throws
125
- -> [(color: CGColor, location: CGFloat)]
180
+ type: GradientContentType)
181
+ -> GradientColorConfiguration
126
182
  {
127
- precondition(
128
- colorComponents.count >= numberOfColors * 4,
129
- "Each color must have RGB components and a location component")
183
+ switch type {
184
+ case .rgb:
185
+ precondition(
186
+ colorComponents.count >= numberOfColors * 4,
187
+ "Each color must have RGB components and a location component")
130
188
 
131
- var cgColors = [(color: CGColor, location: CGFloat)]()
189
+ // Each group of four `Double` values represents a single `CGColor`,
190
+ // and its relative location within the gradient.
191
+ var colors = GradientColorConfiguration()
132
192
 
133
- // Each group of four `Double` values represents a single `CGColor`,
134
- // and its relative location within the gradient.
135
- for colorIndex in 0..<numberOfColors {
136
- let colorStartIndex = colorIndex * 4
193
+ for colorIndex in 0..<numberOfColors {
194
+ let colorStartIndex = colorIndex * 4
137
195
 
138
- let colorLocation = CGFloat(colorComponents[colorStartIndex])
196
+ let colorLocation = CGFloat(colorComponents[colorStartIndex])
139
197
 
140
- // Alpha values aren't stored contiguously with the RGB color components,
141
- // but are instead optionally listed at the end of the array
142
- var alpha = 1.0
143
- let alphaIndex = (numberOfColors * 4) + (colorIndex * 2)
144
- if alphaIndex < colorComponents.count {
145
- let alphaLocation = CGFloat(colorComponents[alphaIndex])
146
- if alphaLocation == colorLocation {
147
- alpha = colorComponents[alphaIndex + 1]
148
- } else {
149
- try context.logCompatibilityIssue("""
150
- The Core Animation rendering engine currently expects gradient colors and alpha values
151
- to be in the same order, with the same color stops / locations.
152
- """)
153
- }
198
+ let color = CGColor.rgb(
199
+ CGFloat(colorComponents[colorStartIndex + 1]),
200
+ CGFloat(colorComponents[colorStartIndex + 2]),
201
+ CGFloat(colorComponents[colorStartIndex + 3]))
202
+
203
+ colors.append((color: color, location: colorLocation))
154
204
  }
155
205
 
156
- let color = CGColor.rgba(
157
- CGFloat(colorComponents[colorStartIndex + 1]),
158
- CGFloat(colorComponents[colorStartIndex + 2]),
159
- CGFloat(colorComponents[colorStartIndex + 3]),
160
- CGFloat(alpha))
206
+ return colors
161
207
 
162
- cgColors.append((color, colorLocation))
163
- }
208
+ case .alpha:
209
+ // After the rgb color components, there can be arbitrary number of repeating
210
+ // `[alphaLocation, alphaValue]` pairs that define a separate alpha gradient.
211
+ var alphaValues = GradientColorConfiguration()
212
+
213
+ for alphaIndex in stride(from: numberOfColors * 4, to: colorComponents.endIndex, by: 2) {
214
+ let alphaLocation = CGFloat(colorComponents[alphaIndex])
215
+ let alphaValue = CGFloat(colorComponents[alphaIndex + 1])
216
+ alphaValues.append((color: .rgba(0, 0, 0, alphaValue), location: alphaLocation))
217
+ }
164
218
 
165
- return cgColors
219
+ return alphaValues
220
+ }
166
221
  }
167
222
  }
@@ -58,56 +58,56 @@ extension LayerProperty {
58
58
  .init(
59
59
  caLayerKeypath: "transform.translation",
60
60
  defaultValue: CGPoint(x: 0, y: 0),
61
- customizableProperty: nil /* currently unsupported */)
61
+ customizableProperty: nil /* currently unsupported */ )
62
62
  }
63
63
 
64
64
  static var positionX: LayerProperty<CGFloat> {
65
65
  .init(
66
66
  caLayerKeypath: "transform.translation.x",
67
67
  defaultValue: 0,
68
- customizableProperty: nil /* currently unsupported */)
68
+ customizableProperty: nil /* currently unsupported */ )
69
69
  }
70
70
 
71
71
  static var positionY: LayerProperty<CGFloat> {
72
72
  .init(
73
73
  caLayerKeypath: "transform.translation.y",
74
74
  defaultValue: 0,
75
- customizableProperty: nil /* currently unsupported */)
75
+ customizableProperty: nil /* currently unsupported */ )
76
76
  }
77
77
 
78
78
  static var scale: LayerProperty<CGFloat> {
79
79
  .init(
80
80
  caLayerKeypath: "transform.scale",
81
81
  defaultValue: 1,
82
- customizableProperty: nil /* currently unsupported */)
82
+ customizableProperty: nil /* currently unsupported */ )
83
83
  }
84
84
 
85
85
  static var scaleX: LayerProperty<CGFloat> {
86
86
  .init(
87
87
  caLayerKeypath: "transform.scale.x",
88
88
  defaultValue: 1,
89
- customizableProperty: nil /* currently unsupported */)
89
+ customizableProperty: nil /* currently unsupported */ )
90
90
  }
91
91
 
92
92
  static var scaleY: LayerProperty<CGFloat> {
93
93
  .init(
94
94
  caLayerKeypath: "transform.scale.y",
95
95
  defaultValue: 1,
96
- customizableProperty: nil /* currently unsupported */)
96
+ customizableProperty: nil /* currently unsupported */ )
97
97
  }
98
98
 
99
99
  static var rotation: LayerProperty<CGFloat> {
100
100
  .init(
101
101
  caLayerKeypath: "transform.rotation",
102
102
  defaultValue: 0,
103
- customizableProperty: nil /* currently unsupported */)
103
+ customizableProperty: nil /* currently unsupported */ )
104
104
  }
105
105
 
106
106
  static var rotationY: LayerProperty<CGFloat> {
107
107
  .init(
108
108
  caLayerKeypath: "transform.rotation.y",
109
109
  defaultValue: 0,
110
- customizableProperty: nil /* currently unsupported */)
110
+ customizableProperty: nil /* currently unsupported */ )
111
111
  }
112
112
 
113
113
  static var anchorPoint: LayerProperty<CGPoint> {
@@ -116,14 +116,14 @@ extension LayerProperty {
116
116
  // This is intentionally not `GGPoint(x: 0.5, y: 0.5)` (the actual default)
117
117
  // to opt `anchorPoint` out of the KVC `setValue` flow, which causes issues.
118
118
  defaultValue: nil,
119
- customizableProperty: nil /* currently unsupported */)
119
+ customizableProperty: nil /* currently unsupported */ )
120
120
  }
121
121
 
122
122
  static var opacity: LayerProperty<CGFloat> {
123
123
  .init(
124
124
  caLayerKeypath: #keyPath(CALayer.opacity),
125
125
  defaultValue: 1,
126
- customizableProperty: nil /* currently unsupported */)
126
+ customizableProperty: nil /* currently unsupported */ )
127
127
  }
128
128
  }
129
129
 
@@ -134,7 +134,7 @@ extension LayerProperty {
134
134
  .init(
135
135
  caLayerKeypath: #keyPath(CAShapeLayer.path),
136
136
  defaultValue: nil,
137
- customizableProperty: nil /* currently unsupported */)
137
+ customizableProperty: nil /* currently unsupported */ )
138
138
  }
139
139
 
140
140
  static var fillColor: LayerProperty<CGColor> {
@@ -148,14 +148,14 @@ extension LayerProperty {
148
148
  .init(
149
149
  caLayerKeypath: #keyPath(CAShapeLayer.lineWidth),
150
150
  defaultValue: 1,
151
- customizableProperty: nil /* currently unsupported */)
151
+ customizableProperty: nil /* currently unsupported */ )
152
152
  }
153
153
 
154
154
  static var lineDashPhase: LayerProperty<CGFloat> {
155
155
  .init(
156
156
  caLayerKeypath: #keyPath(CAShapeLayer.lineDashPhase),
157
157
  defaultValue: 0,
158
- customizableProperty: nil /* currently unsupported */)
158
+ customizableProperty: nil /* currently unsupported */ )
159
159
  }
160
160
 
161
161
  static var strokeColor: LayerProperty<CGColor> {
@@ -169,14 +169,14 @@ extension LayerProperty {
169
169
  .init(
170
170
  caLayerKeypath: #keyPath(CAShapeLayer.strokeStart),
171
171
  defaultValue: 0,
172
- customizableProperty: nil /* currently unsupported */)
172
+ customizableProperty: nil /* currently unsupported */ )
173
173
  }
174
174
 
175
175
  static var strokeEnd: LayerProperty<CGFloat> {
176
176
  .init(
177
177
  caLayerKeypath: #keyPath(CAShapeLayer.strokeEnd),
178
178
  defaultValue: 1,
179
- customizableProperty: nil /* currently unsupported */)
179
+ customizableProperty: nil /* currently unsupported */ )
180
180
  }
181
181
  }
182
182
 
@@ -187,28 +187,28 @@ extension LayerProperty {
187
187
  .init(
188
188
  caLayerKeypath: #keyPath(CAGradientLayer.colors),
189
189
  defaultValue: nil,
190
- customizableProperty: nil /* currently unsupported */)
190
+ customizableProperty: nil /* currently unsupported */ )
191
191
  }
192
192
 
193
193
  static var locations: LayerProperty<[CGFloat]> {
194
194
  .init(
195
195
  caLayerKeypath: #keyPath(CAGradientLayer.locations),
196
196
  defaultValue: nil,
197
- customizableProperty: nil /* currently unsupported */)
197
+ customizableProperty: nil /* currently unsupported */ )
198
198
  }
199
199
 
200
200
  static var startPoint: LayerProperty<CGPoint> {
201
201
  .init(
202
202
  caLayerKeypath: #keyPath(CAGradientLayer.startPoint),
203
203
  defaultValue: nil,
204
- customizableProperty: nil /* currently unsupported */)
204
+ customizableProperty: nil /* currently unsupported */ )
205
205
  }
206
206
 
207
207
  static var endPoint: LayerProperty<CGPoint> {
208
208
  .init(
209
209
  caLayerKeypath: #keyPath(CAGradientLayer.endPoint),
210
210
  defaultValue: nil,
211
- customizableProperty: nil /* currently unsupported */)
211
+ customizableProperty: nil /* currently unsupported */ )
212
212
  }
213
213
  }
214
214
 
@@ -14,14 +14,12 @@ extension CAShapeLayer {
14
14
  {
15
15
  try addAnimation(
16
16
  for: .path,
17
- keyframes: rectangle.size.keyframes,
18
- value: { sizeKeyframe in
17
+ keyframes: try rectangle.combinedKeyframes(context: context).keyframes,
18
+ value: { keyframe in
19
19
  BezierPath.rectangle(
20
- position: try rectangle.position
21
- .exactlyOneKeyframe(context: context, description: "rectangle position").value.pointValue,
22
- size: sizeKeyframe.sizeValue,
23
- cornerRadius: try rectangle.cornerRadius
24
- .exactlyOneKeyframe(context: context, description: "rectangle cornerRadius").value.cgFloatValue,
20
+ position: keyframe.position.pointValue,
21
+ size: keyframe.size.sizeValue,
22
+ cornerRadius: keyframe.cornerRadius.cgFloatValue,
25
23
  direction: rectangle.direction)
26
24
  .cgPath()
27
25
  .duplicated(times: pathMultiplier)
@@ -29,3 +27,32 @@ extension CAShapeLayer {
29
27
  context: context)
30
28
  }
31
29
  }
30
+
31
+ extension Rectangle {
32
+ /// Data that represents how to render a rectangle at a specific point in time
33
+ struct Keyframe {
34
+ let size: Vector3D
35
+ let position: Vector3D
36
+ let cornerRadius: Vector1D
37
+ }
38
+
39
+ /// Creates a single array of animatable keyframes from the separate arrays of keyframes in this Rectangle
40
+ func combinedKeyframes(context: LayerAnimationContext) throws-> KeyframeGroup<Rectangle.Keyframe> {
41
+ let combinedKeyframes = Keyframes.combinedIfPossible(
42
+ size, position, cornerRadius,
43
+ makeCombinedResult: Rectangle.Keyframe.init)
44
+
45
+ if let combinedKeyframes = combinedKeyframes {
46
+ return combinedKeyframes
47
+ } else {
48
+ // If we weren't able to combine all of the keyframes, we have to take the timing values
49
+ // from one property and use a fixed value for the other properties.
50
+ return try size.map { sizeValue in
51
+ Keyframe(
52
+ size: sizeValue,
53
+ position: try position.exactlyOneKeyframe(context: context, description: "rectangle position"),
54
+ cornerRadius: try cornerRadius.exactlyOneKeyframe(context: context, description: "rectangle cornerRadius"))
55
+ }
56
+ }
57
+ }
58
+ }
@@ -120,25 +120,36 @@ extension Trim {
120
120
  let interpolatedStrokeEnd = strokeEnd.manuallyInterpolateKeyframes()
121
121
  let interpolatedStrokeOffset = offset.manuallyInterpolateKeyframes()
122
122
 
123
- let adjustedStrokeStart = try adjustKeyframesForTrimOffsets(
124
- strokeKeyframes: interpolatedStrokeStart,
125
- offsetKeyframes: interpolatedStrokeOffset,
126
- context: context)
127
-
128
- let adjustedStrokeEnd = try adjustKeyframesForTrimOffsets(
129
- strokeKeyframes: interpolatedStrokeEnd,
130
- offsetKeyframes: interpolatedStrokeOffset,
131
- context: context)
123
+ var adjustedStrokeStart = KeyframeGroup(
124
+ keyframes: try adjustKeyframesForTrimOffsets(
125
+ strokeKeyframes: interpolatedStrokeStart,
126
+ offsetKeyframes: interpolatedStrokeOffset,
127
+ context: context))
128
+
129
+ var adjustedStrokeEnd = KeyframeGroup(
130
+ keyframes: try adjustKeyframesForTrimOffsets(
131
+ strokeKeyframes: interpolatedStrokeEnd,
132
+ offsetKeyframes: interpolatedStrokeOffset,
133
+ context: context))
132
134
 
133
135
  // If maximum stroke value is larger than 100%, then we have to create copies of the path
134
136
  // so the total path length includes the maximum stroke
135
- let maximumStroke = adjustedStrokeEnd.map { $0.value.cgFloatValue }.max() ?? 100
136
- let pathMultiplier = Int(ceil(maximumStroke / 100.0))
137
+ let startStrokes = adjustedStrokeStart.keyframes.map { $0.value.cgFloatValue }
138
+ let endStrokes = adjustedStrokeEnd.keyframes.map { $0.value.cgFloatValue }
139
+ let minimumStrokeMultiplier = Double(floor((startStrokes.min() ?? 0) / 100.0))
140
+ let maximumStrokeMultiplier = Double(ceil((endStrokes.max() ?? 100) / 100.0))
141
+
142
+ if minimumStrokeMultiplier < 0 {
143
+ // Core Animation doesn't support negative stroke offsets, so we have to
144
+ // shift all of the offset values up by the minimum
145
+ adjustedStrokeStart = adjustedStrokeStart.map { Vector1D($0.value + (abs(minimumStrokeMultiplier) * 100.0)) }
146
+ adjustedStrokeEnd = adjustedStrokeEnd.map { Vector1D($0.value + (abs(minimumStrokeMultiplier) * 100.0)) }
147
+ }
137
148
 
138
149
  return (
139
- strokeStart: KeyframeGroup<Vector1D>(keyframes: adjustedStrokeStart),
140
- strokeEnd: KeyframeGroup<Vector1D>(keyframes: adjustedStrokeEnd),
141
- pathMultiplier: pathMultiplier)
150
+ strokeStart: adjustedStrokeStart,
151
+ strokeEnd: adjustedStrokeEnd,
152
+ pathMultiplier: Int(abs(maximumStrokeMultiplier) + abs(minimumStrokeMultiplier)))
142
153
  }
143
154
 
144
155
  // MARK: Private
@@ -36,25 +36,16 @@ extension CAShapeLayer {
36
36
  {
37
37
  try addAnimation(
38
38
  for: .path,
39
- keyframes: star.position.keyframes,
40
- value: { position in
41
- // We can only use one set of keyframes to animate a given CALayer keypath,
42
- // so we currently animate `position` and ignore any other keyframes.
43
- // TODO: Is there a way to support this properly?
39
+ keyframes: try star.combinedKeyframes(context: context).keyframes,
40
+ value: { keyframe in
44
41
  BezierPath.star(
45
- position: position.pointValue,
46
- outerRadius: try star.outerRadius
47
- .exactlyOneKeyframe(context: context, description: "outerRadius").value.cgFloatValue,
48
- innerRadius: try star.innerRadius?
49
- .exactlyOneKeyframe(context: context, description: "innerRadius").value.cgFloatValue ?? 0,
50
- outerRoundedness: try star.outerRoundness
51
- .exactlyOneKeyframe(context: context, description: "outerRoundness").value.cgFloatValue,
52
- innerRoundedness: try star.innerRoundness?
53
- .exactlyOneKeyframe(context: context, description: "innerRoundness").value.cgFloatValue ?? 0,
54
- numberOfPoints: try star.points
55
- .exactlyOneKeyframe(context: context, description: "points").value.cgFloatValue,
56
- rotation: try star.rotation
57
- .exactlyOneKeyframe(context: context, description: "rotation").value.cgFloatValue,
42
+ position: keyframe.position.pointValue,
43
+ outerRadius: keyframe.outerRadius.cgFloatValue,
44
+ innerRadius: keyframe.innerRadius.cgFloatValue,
45
+ outerRoundedness: keyframe.outerRoundness.cgFloatValue,
46
+ innerRoundedness: keyframe.innerRoundness.cgFloatValue,
47
+ numberOfPoints: keyframe.points.cgFloatValue,
48
+ rotation: keyframe.rotation.cgFloatValue,
58
49
  direction: star.direction)
59
50
  .cgPath()
60
51
  .duplicated(times: pathMultiplier)
@@ -71,21 +62,14 @@ extension CAShapeLayer {
71
62
  {
72
63
  try addAnimation(
73
64
  for: .path,
74
- keyframes: star.position.keyframes,
75
- value: { position in
76
- // We can only use one set of keyframes to animate a given CALayer keypath,
77
- // so we currently animate `position` and ignore any other keyframes.
78
- // TODO: Is there a way to support this properly?
65
+ keyframes: try star.combinedKeyframes(context: context).keyframes,
66
+ value: { keyframe in
79
67
  BezierPath.polygon(
80
- position: position.pointValue,
81
- numberOfPoints: try star.points
82
- .exactlyOneKeyframe(context: context, description: "numberOfPoints").value.cgFloatValue,
83
- outerRadius: try star.outerRadius
84
- .exactlyOneKeyframe(context: context, description: "outerRadius").value.cgFloatValue,
85
- outerRoundedness: try star.outerRoundness
86
- .exactlyOneKeyframe(context: context, description: "outerRoundedness").value.cgFloatValue,
87
- rotation: try star.rotation
88
- .exactlyOneKeyframe(context: context, description: "rotation").value.cgFloatValue,
68
+ position: keyframe.position.pointValue,
69
+ numberOfPoints: keyframe.points.cgFloatValue,
70
+ outerRadius: keyframe.outerRadius.cgFloatValue,
71
+ outerRoundedness: keyframe.outerRoundness.cgFloatValue,
72
+ rotation: keyframe.rotation.cgFloatValue,
89
73
  direction: star.direction)
90
74
  .cgPath()
91
75
  .duplicated(times: pathMultiplier)
@@ -93,3 +77,48 @@ extension CAShapeLayer {
93
77
  context: context)
94
78
  }
95
79
  }
80
+
81
+ extension Star {
82
+ /// Data that represents how to render a star at a specific point in time
83
+ struct Keyframe {
84
+ let position: Vector3D
85
+ let outerRadius: Vector1D
86
+ let innerRadius: Vector1D
87
+ let outerRoundness: Vector1D
88
+ let innerRoundness: Vector1D
89
+ let points: Vector1D
90
+ let rotation: Vector1D
91
+ }
92
+
93
+ /// Creates a single array of animatable keyframes from the separate arrays of keyframes in this star/polygon
94
+ func combinedKeyframes(context: LayerAnimationContext) throws -> KeyframeGroup<Keyframe> {
95
+ let combinedKeyframes = Keyframes.combinedIfPossible(
96
+ position,
97
+ outerRadius,
98
+ innerRadius ?? KeyframeGroup(Vector1D(0)),
99
+ outerRoundness,
100
+ innerRoundness ?? KeyframeGroup(Vector1D(0)),
101
+ points,
102
+ rotation,
103
+ makeCombinedResult: Star.Keyframe.init)
104
+
105
+ if let combinedKeyframes = combinedKeyframes {
106
+ return combinedKeyframes
107
+ } else {
108
+ // If we weren't able to combine all of the keyframes, we have to take the timing values
109
+ // from one property and use a fixed value for the other properties.
110
+ return try position.map { positionValue in
111
+ Keyframe(
112
+ position: positionValue,
113
+ outerRadius: try outerRadius.exactlyOneKeyframe(context: context, description: "star outerRadius"),
114
+ innerRadius: try innerRadius?.exactlyOneKeyframe(context: context, description: "star innerRadius")
115
+ ?? Vector1D(0),
116
+ outerRoundness: try outerRoundness.exactlyOneKeyframe(context: context, description: "star outerRoundness"),
117
+ innerRoundness: try innerRoundness?.exactlyOneKeyframe(context: context, description: "star innerRoundness")
118
+ ?? Vector1D(0),
119
+ points: try points.exactlyOneKeyframe(context: context, description: "star points"),
120
+ rotation: try rotation.exactlyOneKeyframe(context: context, description: "star rotation"))
121
+ }
122
+ }
123
+ }
124
+ }
@@ -55,9 +55,13 @@ extension CAShapeLayer {
55
55
  try addOpacityAnimation(for: stroke, context: context)
56
56
 
57
57
  if let (dashPattern, dashPhase) = stroke.dashPattern?.shapeLayerConfiguration {
58
- lineDashPattern = try dashPattern.map {
58
+ let lineDashPattern = try dashPattern.map {
59
59
  try KeyframeGroup(keyframes: $0)
60
- .exactlyOneKeyframe(context: context, description: "stroke dashPattern").value.cgFloatValue as NSNumber
60
+ .exactlyOneKeyframe(context: context, description: "stroke dashPattern").cgFloatValue
61
+ }
62
+
63
+ if lineDashPattern.isSupportedLayerDashPattern {
64
+ self.lineDashPattern = lineDashPattern as [NSNumber]
61
65
  }
62
66
 
63
67
  try addAnimation(