in src/app/shared/table-of-contents/table-of-contents.ts [151:174]
private onScroll(): void {
const scrollOffset = this.getScrollOffset();
let hasChanged = false;
for (let i = 0; i < this._links.length; i++) {
// A link is considered active if the page is scrolled past the
// anchor without also being scrolled passed the next link.
const currentLink = this._links[i];
const nextLink = this._links[i + 1];
const isActive = scrollOffset >= currentLink.top &&
(!nextLink || nextLink.top >= scrollOffset);
if (isActive !== currentLink.active) {
currentLink.active = isActive;
hasChanged = true;
}
}
if (hasChanged) {
// The scroll listener runs outside of the Angular zone so
// we need to bring it back in only when something has changed.
this._ngZone.run(() => this._changeDetectorRef.markForCheck());
}
}