-
1
-
2
-
3
-
4
-
5
-
6
-
7
-
8
-
9
-
10
-
11
-
12
-
13
-
14
-
15
-
16
-
17
-
18
-
19
-
20
-
21
-
22
-
23
-
24
-
25
-
26
-
27
-
28
-
29
-
30
-
31
-
32
-
33
-
34
-
35
-
36
-
37
-
38
-
39
-
40
-
41
-
42
-
43
-
44
-
45
-
46
-
47
-
48
-
49
-
50
-
51
-
52
-
53
-
54
-
55
-
56
-
57
-
58
-
59
-
60
-
61
-
62
-
63
-
64
-
65
-
66
-
67
/** @jsx h */
import { h, withStyles } from "../deps/nano_jsx.ts";
function cx(className: string): string {
return `toc__${className}`;
}
type TocProps = {
/**
* Inner HTML.
*
* Must be `<nav><ol>...</ol></nav>`
*/
children: unknown;
} | {
/**
* Inner HTML.
*
* Must be `<nav><ol>...</ol></nav>`
*/
html: string;
};
/**
* Table of Contents component.
*/
export const Toc = (props: TocProps) => {
return withStyles(css)(
"html" in props
? (
<div
class={cx("root")}
dangerouslySetInnerHTML={{ __html: props.html }}
/>
)
: <div class={cx("root")}>{props.children}</div>,
);
};
const css = `
.${cx("root")} {
min-width: 15rem;
}
.${cx("root")} ol {
list-style: none;
}
.${cx("root")} ol ol {
padding-left: var(--gutter-lg);
list-style: square;
}
.${cx("root")} ol ol ol {
list-style: circle;
}
.${cx("root")} a {
font-size: var(--font-size-sm);
color: hsl(var(--color-on-neutral));
text-decoration: underline hsl(var(--color-border));
opacity: 0.9;
}
.${cx("root")} a:hover {
text-decoration: underline calc(var(--border-width) * 2) hsl(var(--color-primary));
}
`;