import type { MarkdownHeading } from 'astro'; import type { FunctionalComponent } from 'preact'; import { unescape } from 'html-escaper'; import { useState, useEffect, useRef } from 'preact/hooks'; type ItemOffsets = { id: string; topOffset: number; }; const TableOfContents: FunctionalComponent<{ headings: MarkdownHeading[] }> = ({ headings = [], }) => { const toc = useRef(); const onThisPageID = 'on-this-page-heading'; const itemOffsets = useRef([]); const [currentID, setCurrentID] = useState('overview'); useEffect(() => { const getItemOffsets = () => { const titles = document.querySelectorAll('article :is(h1, h2, h3, h4)'); itemOffsets.current = Array.from(titles).map((title) => ({ id: title.id, topOffset: title.getBoundingClientRect().top + window.scrollY, })); }; getItemOffsets(); window.addEventListener('resize', getItemOffsets); return () => { window.removeEventListener('resize', getItemOffsets); }; }, []); useEffect(() => { if (!toc.current) return; const setCurrent: IntersectionObserverCallback = (entries) => { for (const entry of entries) { if (entry.isIntersecting) { const { id } = entry.target; if (id === onThisPageID) continue; setCurrentID(entry.target.id); break; } } }; const observerOptions: IntersectionObserverInit = { // Negative top margin accounts for `scroll-margin`. // Negative bottom margin means heading needs to be towards top of viewport to trigger intersection. rootMargin: '-100px 0% -66%', threshold: 1, }; const headingsObserver = new IntersectionObserver(setCurrent, observerOptions); // Observe all the headings in the main page content. document.querySelectorAll('article :is(h1,h2,h3)').forEach((h) => headingsObserver.observe(h)); // Stop observing when the component is unmounted. return () => headingsObserver.disconnect(); }, [toc.current]); const onLinkClick = (e) => { setCurrentID(e.target.getAttribute('href').replace('#', '')); }; return ( <>

On this page

); }; export default TableOfContents; value='dave/lol'>dave/lol Unnamed repository; edit this file 'description' to name the repository.
aboutsummaryrefslogtreecommitdiff
AgeCommit message (Expand)AuthorFilesLines
2021-06-06Fix crash that happens when hundreds of files have been parsed and process.en...Gravatar Jarred Sumner 1-18/+26
2021-06-06hashGravatar Jarred Sumner 2-3/+3
2021-06-06Upgrade hash tableGravatar Jarred Sumner 9-66/+126
2021-06-06Fix bug printing large scientific notation floatsGravatar Jarred Sumner 1-9/+29
2021-06-06hmGravatar Jarred Sumner 14-186/+167
2021-06-06WIP node module bundlesGravatar Jarred Sumner 22-1047/+1411
2021-06-06wipGravatar Jarred Sumner 1-1/+2
2021-06-06debug-only printGravatar Jarred Sumner 1-0/+12
2021-06-06Bump schemaGravatar Jarred Sumner 4-0/+926
2021-06-04Generate parser versions at compile timeGravatar Jarred Sumner 1-9667/+9690
2021-06-04oops typescriptGravatar Jarred Sumner 2-3/+7
2021-06-04Fix extra space in printerGravatar Jarred Sumner 3-28/+52
2021-06-04Fix extra underscore in ensureValidIdentifierGravatar Jarred Sumner 2-14/+21
2021-06-04Generate differnet versions of Bundler, Resolver, and Caches at comptime base...Gravatar Jarred Sumner 10-2236/+2303
2021-06-04mostly fix --resolve=disableGravatar Jarred Sumner 3-29/+145
2021-06-04renameGravatar Jarred Sumner 3-10/+9
2021-06-04readme was prematureGravatar Jarred Sumner 4-150/+16
2021-06-04fix the leaksGravatar Jarred Sumner 15-566/+21587
2021-06-02oklGravatar Jarred Sumner 5-13/+39
2021-06-02keep thatGravatar Jarred Sumner 1-2/+2
2021-06-02HTTP fixes + buffer stdout/in + a little HTTP cachingGravatar Jarred Sumner 15-108/+241
2021-06-02JSX & CJS work end-to-end!Gravatar Jarred Sumner 7-157/+292
2021-06-01wipGravatar Jarred Sumner 32-793/+13870
2021-05-31linker thingsGravatar Jarred Sumner 9-183/+322
2021-05-30Fix printing bugsGravatar Jarred Sumner 8-44/+206
2021-05-30coolGravatar Jarred Sumner 9-3/+54
2021-05-30stderrGravatar Jarred Sumner 3-6/+10
2021-05-30Fix indentGravatar Jarred Sumner 1-117/+56
2021-05-30Fix Define, JSX, use more pointers for property access to minimize calls to m...Gravatar Jarred Sumner 9-795/+364
2021-05-30This'll do for now, I guess.Gravatar Jarred Sumner 3-466/+168
2021-05-30This blocks approach seems to workGravatar Jarred Sumner 6-781/+469
2021-05-29Revert "WIP"Gravatar Jarred Sumner 8-498/+653
2021-05-29WIPGravatar Jarred Sumner 8-653/+498
2021-05-29micropGravatar Jarred Sumner 7-25/+92
2021-05-29fix crashGravatar Jarred Sumner 1-1/+1
2021-05-29microp-optimize hash table stuffGravatar Jarred Sumner 1-4/+36
2021-05-29Move wyhasxhGravatar Jarred Sumner 1-0/+0
2021-05-282Gravatar Jarred Sumner 1-1/+4
2021-05-28allGravatar Jarred Sumner 14-89/+591
2021-05-28wGravatar Jarred Sumner 1-1/+4