       )
     )
 
+  # @getter
+  #   internalAnimators: ->
+  #     @_velocity = 0
+  #     @_animationMode = "tracking" # "toValue" "physics"
+
+  #     scrollPosition:
+  #       animate: (persistantAnimator) =>
+  #         # {currentValue, toValue, element, frameSeconds, state, options} = persistantAnimator
+  #         ###
+  #         we basically need 3 modes:
+
+  #         * tracking - no animations; this is the default mode
+  #         * animating-to-value: still use the same basic physics, but guarantee we reach the toValue exactly
+  #         * physics:
+  #           just uses @_velocity and basic physics
+  #         ###
+  #         switch @_animationMode
+  #           when "tracking" then persistantAnimator.stop()
+  #           when "toValue" then
+  #             easeInQuad
+  #         persistantAnimator.stop() # do this is 'tracking'
+
+  #       on:
+  #         state: =>
+  #           @_animating = true
+  #         done: =>
+  #           @_animating = false
+  #           @animators = originialAnimators
+
   animateToValidScrollPosition: (desiredOffset = 0)->
     {scrollPosition} = @
     @_validScrollPositionCheckScheduled = false
-    boundedScrollPosition = @boundSp scrollPosition + desiredOffset
-    if boundedScrollPosition != scrollPosition && !@_animating
-      @_animating = true
-      @animators = merge originialAnimators = @animators,
-        scrollPosition: on: done: =>
-          @_animating = false
-          @animators = originialAnimators
-
-      @scrollPosition = boundedScrollPosition
+    # switch to toValue animating
+    @scrollPosition = @boundSp scrollPosition + desiredOffset
 
   setFirstElementPosition: (fp)->
     @scrollPosition = @boundSp @fp2sp fp


Foundation = require 'art-foundation'
Atomic = require 'art-atomic'
{EventEpoch} = require 'art-events'

flickSpeedMultiplier = 1

###
ScrollElement

guarantee:
  Will never scroll more than one "windowSize" per frame.
