ReviewOS

also looking at this

stacks/bunpress

fix(toc): keep active outline entry visible

#83
Merged chrisbbreuer wants to merge codex/fix-scrollspy-outline into main
3 files +68 -6
test/page-toc-scrollspy.test.tsadded+22-0
Changes to test/page-toc-scrollspy.test.ts
@@ -0,0 +1,22 @@
1import { describe, expect, test } from 'bun:test'
2import { readFileSync } from 'node:fs'
3import { join } from 'node:path'
4
5const root = join(import.meta.dir, '..')
6const pageToc = readFileSync(join(root, 'packages/bunpress/src/templates/page-toc.stx'), 'utf8')
7const pageOutline = readFileSync(join(root, 'packages/bunpress/src/templates/page-outline.stx'), 'utf8')
8
9describe('page outline scrollspy', () => {
10 test('tracks both responsive outline variants', () => {
11 expect(pageToc).toContain("document.querySelectorAll('.page-toc a, .bp-local-outline-items a')")
12 expect(pageOutline).toContain('.bp-local-outline-items a.active')
13 })
14
15 test('keeps the active link inside the visible outline viewport', () => {
16 expect(pageToc).toContain('function keepActiveLinkVisible(activeLink)')
17 expect(pageToc).toContain("activeLink.closest('.BPDocAside') || activeLink.closest('.bp-local-outline-items')")
18 expect(pageToc).toContain('outlineViewport.scrollTop += linkRect.top - viewportRect.top - inset')
19 expect(pageToc).toContain('outlineViewport.scrollTop += linkRect.bottom - viewportRect.bottom + inset')
20 expect(pageToc).toContain('keepActiveLinkVisible(link)')
21 })
22})