From 679774196fbda0211a857e392800f31ba02d03d2 Mon Sep 17 00:00:00 2001 From: Brad Simpson Date: Tue, 23 Dec 2025 15:26:32 -0700 Subject: [PATCH 1/5] Add ScrollPositionTracker --- js/app.js | 1 + js/scrollPositionTracker.js | 51 +++++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 js/scrollPositionTracker.js diff --git a/js/app.js b/js/app.js index 0b349809..50050536 100644 --- a/js/app.js +++ b/js/app.js @@ -17,6 +17,7 @@ import 'core/js/models/lockingModel'; import 'core/js/mpabc'; import 'core/js/helpers'; import 'core/js/scrolling'; +import 'core/js/scrollPositionTracker'; import 'core/js/headings'; import 'core/js/navigation'; import 'core/js/startController'; diff --git a/js/scrollPositionTracker.js b/js/scrollPositionTracker.js new file mode 100644 index 00000000..18e81532 --- /dev/null +++ b/js/scrollPositionTracker.js @@ -0,0 +1,51 @@ +import Adapt from 'core/js/adapt'; +import scrolling from 'core/js/scrolling'; + +class ScrollPositionTracker extends Backbone.Controller { + + initialize() { + this.$html = $('html'); + this._scrollContainer = null; + this._isCheckingScroll = false; + this.checkScrollPosition = this.checkScrollPosition.bind(this); + this.onScroll = this.onScroll.bind(this); + + this.listenToOnce(Adapt, 'configModel:dataLoaded', this.setup); + } + + setup() { + this._scrollContainer = scrolling.isLegacyScrolling ? window : document.body; + + this.checkScrollPosition(); + + this.listenTo(Adapt, { + 'contentObjectView:ready': this.onContentObjectReady, + 'contentObjectView:preRemove': this.onContentObjectPreRemove + }); + } + + onContentObjectReady() { + $(this._scrollContainer).on('scroll.scrollPositionTracker', this.onScroll); + this.checkScrollPosition(); + } + + onContentObjectPreRemove() { + $(this._scrollContainer).off('scroll.scrollPositionTracker'); + } + + onScroll() { + if (this._isCheckingScroll) return; + this._isCheckingScroll = true; + requestAnimationFrame(this.checkScrollPosition); + } + + checkScrollPosition() { + this._isCheckingScroll = false; + const scrollY = window.scrollY || window.pageYOffset || 0; + const isAtTop = (scrollY === 0); + this.$html.toggleClass('is-scroll-at-top', isAtTop); + } + +} + +export default new ScrollPositionTracker(); From 0128adb3bc3028f1491c01979d75d43cded29d1f Mon Sep 17 00:00:00 2001 From: Brad Simpson Date: Thu, 8 Jan 2026 15:49:41 -0700 Subject: [PATCH 2/5] Update js/scrollPositionTracker.js Co-authored-by: Oliver Foster <7974663+oliverfoster@users.noreply.github.com> --- js/scrollPositionTracker.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/js/scrollPositionTracker.js b/js/scrollPositionTracker.js index 18e81532..a6280d51 100644 --- a/js/scrollPositionTracker.js +++ b/js/scrollPositionTracker.js @@ -41,9 +41,13 @@ class ScrollPositionTracker extends Backbone.Controller { checkScrollPosition() { this._isCheckingScroll = false; + this.$html.toggleClass('is-scroll-at-top', this.isAtTop); + } + + get isAtTop() { const scrollY = window.scrollY || window.pageYOffset || 0; const isAtTop = (scrollY === 0); - this.$html.toggleClass('is-scroll-at-top', isAtTop); + return isAtTop; } } From 7258fb5eccf56027bf4f28f5db351ef6a18a3e19 Mon Sep 17 00:00:00 2001 From: Brad Simpson Date: Thu, 8 Jan 2026 15:51:08 -0700 Subject: [PATCH 3/5] Rename scrollPositionTracker to scrollPosition --- js/app.js | 2 +- js/{scrollPositionTracker.js => scrollPosition.js} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename js/{scrollPositionTracker.js => scrollPosition.js} (100%) diff --git a/js/app.js b/js/app.js index 50050536..955557d6 100644 --- a/js/app.js +++ b/js/app.js @@ -17,7 +17,7 @@ import 'core/js/models/lockingModel'; import 'core/js/mpabc'; import 'core/js/helpers'; import 'core/js/scrolling'; -import 'core/js/scrollPositionTracker'; +import 'core/js/scrollPosition'; import 'core/js/headings'; import 'core/js/navigation'; import 'core/js/startController'; diff --git a/js/scrollPositionTracker.js b/js/scrollPosition.js similarity index 100% rename from js/scrollPositionTracker.js rename to js/scrollPosition.js From cd9c45feb1aacd822dba9a9939ad11d75e72250c Mon Sep 17 00:00:00 2001 From: Brad Simpson Date: Thu, 8 Jan 2026 15:51:36 -0700 Subject: [PATCH 4/5] Remove space characters --- js/scrollPosition.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/scrollPosition.js b/js/scrollPosition.js index a6280d51..4bb94df7 100644 --- a/js/scrollPosition.js +++ b/js/scrollPosition.js @@ -43,7 +43,7 @@ class ScrollPositionTracker extends Backbone.Controller { this._isCheckingScroll = false; this.$html.toggleClass('is-scroll-at-top', this.isAtTop); } - + get isAtTop() { const scrollY = window.scrollY || window.pageYOffset || 0; const isAtTop = (scrollY === 0); From de38a9c7b7e7d2ccca63708f287d63e97597ef3d Mon Sep 17 00:00:00 2001 From: Brad Simpson Date: Thu, 8 Jan 2026 15:52:20 -0700 Subject: [PATCH 5/5] Update references to scrollPositionTracker --- js/scrollPosition.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/js/scrollPosition.js b/js/scrollPosition.js index 4bb94df7..58866f73 100644 --- a/js/scrollPosition.js +++ b/js/scrollPosition.js @@ -1,7 +1,7 @@ import Adapt from 'core/js/adapt'; import scrolling from 'core/js/scrolling'; -class ScrollPositionTracker extends Backbone.Controller { +class ScrollPosition extends Backbone.Controller { initialize() { this.$html = $('html'); @@ -25,12 +25,12 @@ class ScrollPositionTracker extends Backbone.Controller { } onContentObjectReady() { - $(this._scrollContainer).on('scroll.scrollPositionTracker', this.onScroll); + $(this._scrollContainer).on('scroll.scrollPosition', this.onScroll); this.checkScrollPosition(); } onContentObjectPreRemove() { - $(this._scrollContainer).off('scroll.scrollPositionTracker'); + $(this._scrollContainer).off('scroll.scrollPosition'); } onScroll() { @@ -52,4 +52,4 @@ class ScrollPositionTracker extends Backbone.Controller { } -export default new ScrollPositionTracker(); +export default new ScrollPosition();