From b7ada11ddbabe4dd2f0798e140e5b280de4d6952 Mon Sep 17 00:00:00 2001 From: Okiki Date: Sat, 14 Aug 2021 00:58:00 +0000 Subject: WIP update examples/docs/ --- .../components/RightSidebar/TableOfContents.tsx | 45 ++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 examples/docs/src/components/RightSidebar/TableOfContents.tsx (limited to 'examples/docs/src/components/RightSidebar/TableOfContents.tsx') diff --git a/examples/docs/src/components/RightSidebar/TableOfContents.tsx b/examples/docs/src/components/RightSidebar/TableOfContents.tsx new file mode 100644 index 000000000..d8ea998d4 --- /dev/null +++ b/examples/docs/src/components/RightSidebar/TableOfContents.tsx @@ -0,0 +1,45 @@ +import type { FunctionalComponent } from 'preact'; +import { h, Fragment } from 'preact'; +import { useState, useEffect, useRef } from 'preact/hooks'; + +const TableOfContents: FunctionalComponent<{ headers: any[] }> = ({ headers = [] }) => { + const itemOffsets = useRef([]); + const [activeId, setActiveId] = useState(undefined); + + 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); + }; + }, []); + + return ( + <> +

On this page

+ + + ); +}; + +export default TableOfContents; -- cgit v1.2.3