diff --git a/zenno/src/routes/doc/Article.svelte b/zenno/src/routes/doc/Article.svelte
index 102ff01..011b982 100644
--- a/zenno/src/routes/doc/Article.svelte
+++ b/zenno/src/routes/doc/Article.svelte
@@ -10,6 +10,26 @@
let { head, children }: Props = $props();
+ let tocViewed = $state(false);
+ let tocElem: HTMLElement | undefined = $state();
+ const observeTOC: IntersectionObserverCallback = (entries, obs) => {
+ for (const e of entries) {
+ if (!e.isIntersecting) {
+ continue;
+ }
+ tocViewed = true;
+ obs.disconnect();
+ }
+ }
+
+ $effect(() => {
+ if (tocElem == null) {
+ return;
+ }
+ const obs = new IntersectionObserver(observeTOC, {rootMargin: "20% 0px"});
+ obs.observe(tocElem);
+ });
+
function tocClass(s: Section) {
switch (s.h) {
case 1:
@@ -32,10 +52,12 @@
{@render head()}
{#if sections.length > 0}