summaryrefslogtreecommitdiff
path: root/src/web/app/desktop/scripts/follow-scroll.ls
diff options
context:
space:
mode:
Diffstat (limited to 'src/web/app/desktop/scripts/follow-scroll.ls')
-rw-r--r--src/web/app/desktop/scripts/follow-scroll.ls56
1 files changed, 56 insertions, 0 deletions
diff --git a/src/web/app/desktop/scripts/follow-scroll.ls b/src/web/app/desktop/scripts/follow-scroll.ls
new file mode 100644
index 0000000000..5072e9c583
--- /dev/null
+++ b/src/web/app/desktop/scripts/follow-scroll.ls
@@ -0,0 +1,56 @@
+class Follower
+ (el) ->
+ @follower = el
+ @last-scroll-top = window.scroll-y
+ @initial-follower-top = @follower.get-bounding-client-rect!.top
+ @page-top = 48
+
+ follow: ->
+ window-height = window.inner-height
+ follower-height = @follower.offset-height
+
+ scroll-top = window.scroll-y
+ scroll-bottom = scroll-top + window-height
+
+ follower-top = @follower.get-bounding-client-rect!.top + scroll-top
+ follower-bottom = follower-top + follower-height
+
+ height-delta = Math.abs window-height - follower-height
+ scroll-delta = @last-scroll-top - scroll-top
+
+ is-scrolling-down = (scroll-top > @last-scroll-top)
+ is-window-larger = (window-height > follower-height)
+
+ console.log @initial-follower-top
+
+ if (is-window-larger && scroll-top > @initial-follower-top) || (!is-window-larger && scroll-top > @initial-follower-top + height-delta)
+ @follower.class-list.add \fixed
+ else if !is-scrolling-down && scroll-top + @page-top <= @initial-follower-top
+ @follower.class-list.remove \fixed
+ @follower.style.top = 0
+ return
+
+ drag-bottom-down = (follower-bottom <= scroll-bottom && is-scrolling-down)
+ drag-top-up = (follower-top >= scroll-top + @page-top && !is-scrolling-down)
+
+ if drag-bottom-down
+ console.log \down
+ @follower.style.top = if is-window-larger then 0 else -height-delta + \px
+ else if drag-top-up
+ console.log \up
+ @follower.style.top = @page-top + \px
+ else if @follower.class-list.contains \fixed
+ console.log \-
+ current-top = parse-int @follower.style.top, 10
+
+ min-top = -height-delta
+ scrolled-top = current-top + scroll-delta
+
+ is-page-at-bottom = (scroll-top + window-height >= document.body.offset-height)
+ new-top = if is-page-at-bottom then min-top else scrolled-top
+
+ @follower.style.top = new-top + \px
+
+ @last-scroll-top = scroll-top
+
+module.exports = Follower