import { FASTElement, Observable, html, css, repeat, when } from '@microsoft/fast-element';
import type { TocEntry } from '../extract-headings.js';
/**
*
* Renders the table of contents as anchor links.
*/
export class StarlightToc extends FASTElement {
entries: TocEntry[] = [];
handleClick(e: MouseEvent, slug: string) {
e.preventDefault();
const target = this._findDeep(document, slug);
if (target) target.scrollIntoView({ behavior: 'smooth' });
history.pushState(null, '', `#${slug}`);
}
private _findDeep(root: Document | ShadowRoot | Element, id: string): Element | null {
const sel = `#${CSS.escape(id)}`;
const direct = root.querySelector(sel);
if (direct) return direct;
for (const el of root.querySelectorAll('*')) {
if (el.shadowRoot) {
const found = this._findDeep(el.shadowRoot, id);
if (found) return found;
}
}
return null;
}
}
Observable.defineProperty(StarlightToc.prototype, 'entries');
const template = html`
${when(x => x.entries.length > 0, html`
`)}
`;
const styles = css`
:host { display: block; }
nav {
position: sticky;
top: calc(var(--sl-nav-height, 3.5rem) + 1rem);
max-height: calc(100vh - var(--sl-nav-height, 3.5rem) - 2rem);
overflow-y: auto;
padding: 0 0.5rem;
}
h2 {
font-size: var(--sl-text-xs, 0.75rem);
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.1em;
color: var(--sl-color-gray-4, #757575);
margin: 0 0 0.75rem;
padding: 0;
border: none;
}
ul { list-style: none; padding: 0; margin: 0; }
li { margin: 0; }
a {
display: block;
padding: 0.2rem 0;
font-size: var(--sl-text-sm, 0.875rem);
color: var(--sl-color-gray-4, #757575);
text-decoration: none;
transition: color 0.15s;
border-left: 2px solid transparent;
}
a:hover { color: var(--sl-color-text, #23262f); }
.depth-2 a { padding-left: 0.75rem; }
.depth-3 a { padding-left: 1.5rem; }
.depth-4 a { padding-left: 2.25rem; }
li a[aria-current='true'] {
color: var(--sl-color-accent, #7c3aed);
border-left-color: var(--sl-color-accent, #7c3aed);
}
`;
StarlightToc.define({ name: 'starlight-toc', template, styles });
export default StarlightToc;