Fix nested remap animation not respecting work area.
diff --git a/include/rive/animation/linear_animation.hpp b/include/rive/animation/linear_animation.hpp
index 9871bc6..1d91d3e 100644
--- a/include/rive/animation/linear_animation.hpp
+++ b/include/rive/animation/linear_animation.hpp
@@ -28,6 +28,10 @@
         float endSeconds() const;
         float durationSeconds() const;
 
+        /// Convert a global clock to local seconds (takes into consideration
+        /// work area start/end, speed, looping).
+        float globalToLocalSeconds(float seconds) const;
+
 #ifdef TESTING
         size_t numKeyedObjects() { return m_KeyedObjects.size(); }
         // Used in testing to check how many animations gets deleted.
diff --git a/src/animation/linear_animation.cpp b/src/animation/linear_animation.cpp
index c7a8e46..4a8d743 100644
--- a/src/animation/linear_animation.cpp
+++ b/src/animation/linear_animation.cpp
@@ -67,4 +67,21 @@
 }
 float LinearAnimation::durationSeconds() const {
     return endSeconds() - startSeconds();
+}
+
+float LinearAnimation::globalToLocalSeconds(float seconds) const {
+    switch (loop()) {
+        case Loop::oneShot:
+            return seconds + startSeconds();
+        case Loop::loop:
+            return std::fmod(seconds, (endSeconds() - startSeconds())) +
+                   startSeconds();
+        case Loop::pingPong:
+            float localTime =
+                std::fmod(seconds, (endSeconds() - startSeconds()));
+            int direction =
+                ((int)(seconds / (endSeconds() - startSeconds()))) % 2;
+            return direction == 0 ? localTime + startSeconds()
+                                  : endSeconds() - localTime;
+    }
 }
\ No newline at end of file
diff --git a/src/animation/nested_remap_animation.cpp b/src/animation/nested_remap_animation.cpp
index ba76daa..47b81be 100644
--- a/src/animation/nested_remap_animation.cpp
+++ b/src/animation/nested_remap_animation.cpp
@@ -5,8 +5,9 @@
 
 void NestedRemapAnimation::timeChanged() {
     if (m_AnimationInstance != nullptr) {
-        m_AnimationInstance->time(m_AnimationInstance->durationSeconds() *
-                                  time());
+        m_AnimationInstance->time(
+            m_AnimationInstance->animation()->globalToLocalSeconds(
+                m_AnimationInstance->durationSeconds() * time()));
     }
 }