summaryrefslogtreecommitdiff
path: root/examples/docs/src/components/RightSidebar/TableOfContents.tsx
diff options
context:
space:
mode:
authorGravatar Fred K. Schott <fkschott@gmail.com> 2021-08-26 15:04:19 -0700
committerGravatar Fred K. Schott <fkschott@gmail.com> 2021-08-26 15:04:44 -0700
commitfdd701dd88529ee0d4911283e35be86b000ed1fc (patch)
tree61d450d04633eece1c12b350b9ef3512dc2fa7b7 /examples/docs/src/components/RightSidebar/TableOfContents.tsx
parent84c18d3030c98b2770144a8a27d1cca7bbfedc1d (diff)
parent2e8db7ad2384b756894eac6be72bcf720f7f28fa (diff)
downloadastro-fdd701dd88529ee0d4911283e35be86b000ed1fc.tar.gz
astro-fdd701dd88529ee0d4911283e35be86b000ed1fc.tar.zst
astro-fdd701dd88529ee0d4911283e35be86b000ed1fc.zip
Merge branch 'okikio/main' (#1111)
Diffstat (limited to 'examples/docs/src/components/RightSidebar/TableOfContents.tsx')
-rw-r--r--examples/docs/src/components/RightSidebar/TableOfContents.tsx45
1 files changed, 45 insertions, 0 deletions
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<string>(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 (
+ <>
+ <h2 class="heading">On this page</h2>
+ <ul>
+ <li class={`header-link depth-2 ${activeId === 'overview' ? 'active' : ''}`.trim()}>
+ <a href="#overview">Overview</a>
+ </li>
+ {headers
+ .filter(({ depth }) => depth > 1 && depth < 4)
+ .map((header) => (
+ <li class={`header-link depth-${header.depth} ${activeId === header.slug ? 'active' : ''}`.trim()}>
+ <a href={`#${header.slug}`}>{header.text}</a>
+ </li>
+ ))}
+ </ul>
+ </>
+ );
+};
+
+export default TableOfContents;