/* Table of Contents — Anker-Menü mit Headings der aktuellen Page.
   Wird per JS befüllt; ohne JS / ohne Headings bleibt das Element ausgeblendet. */

.cb-toc {
    max-width: 1320px;
    margin: 1.5rem auto;
    padding: 0 1.5rem;
    /* Hidden until JS sets cb-toc--filled — keine leere "Auf dieser Seite"-Box. */
    display: none;
}

@media (min-width: 1024px) {
    .cb-toc {
        padding-left: 2.5rem;
        padding-right: 2.5rem;
        /* margin-top weg, damit sticky-Position bei top:80px direkt unter
           dem Nav klebt — sonst wirken die 1.5rem aus der Default-Regel als
           Abstand zur sticky-Linie. */
        margin-top: 0;
        transition: opacity 250ms ease, transform 250ms ease;
    }
    .cb-toc .cb-toc__panel {
        transition: box-shadow 250ms ease, background-color 250ms ease;
    }
    /* Wenn der User das Panel geoeffnet hat, scrollt die Heading-Liste
       INNERHALB des Panels statt unten aus dem Viewport zu laufen.
       Summary bleibt fix, nur die nav scrollt.
       100vh - stickyTop(80) - Summary/Panel-Padding(~5rem). */
    .cb-toc .cb-toc__panel[open] .cb-toc__nav {
        max-height: calc(100vh - 80px - 5rem);
        overflow-y: auto;
        overscroll-behavior: contain;
    }
    /* Just-stuck: zarter Lift sobald der Sentinel oberhalb des Viewports
       verschwindet. Kein Layout-Shift (Position bleibt sticky), nur
       visueller Cue. data-stuck wird vom IntersectionObserver gesetzt
       (siehe frontend.js). */
    .cb-toc[data-stuck="true"] .cb-toc__panel {
        box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12), 0 1px 3px rgba(0, 0, 0, 0.06);
        background: var(--color-surface, rgba(255, 255, 255, 0.98));
        backdrop-filter: blur(8px);
    }
    /* Auto-Hide on scroll: data-scrolling wird waehrend Scroll vom JS gesetzt
       und nach ~200ms Stillstand zurueckgesetzt. TOC fadet aber NUR weg,
       wenn er bereits sticky ist (data-stuck="true") — solange er in seiner
       natuerlichen Position oberhalb des sticky-Punkts steht, kein Ausblenden.
       Nur Desktop — Mobile ist eh ein <details>-Toggle. */
    .cb-toc[data-stuck="true"][data-scrolling="true"] {
        opacity: 0;
        pointer-events: none;
        transform: translateX(-8px);
    }
}

@media (prefers-reduced-motion: reduce) {
    .cb-toc,
    .cb-toc .cb-toc__panel {
        transition: opacity 100ms ease;
    }
    .cb-toc[data-stuck="true"][data-scrolling="true"] {
        transform: none;
    }
}

/* Sentinel-Element fuer IntersectionObserver — visuell unsichtbar,
   layoutet aber als 1px-Block direkt vor dem Panel. */
.cb-toc__sentinel {
    display: block;
    width: 100%;
    height: 1px;
    margin-top: -1px;
    pointer-events: none;
}

.cb-toc--filled {
    display: block;
}

.cb-toc--empty {
    display: none !important;
}

.cb-toc__panel {
    border: 1px solid var(--color-border, rgba(0, 0, 0, 0.1));
    border-radius: 0.75rem;
    background: var(--color-surface-light, transparent);
    overflow: hidden;
}

.cb-toc__summary {
    list-style: none;
    cursor: pointer;
    padding: 0.875rem 1.25rem;
    display: flex;
    align-items: center;
    gap: 0.625rem;
    font-weight: 600;
    font-size: 0.9375rem;
    color: var(--color-text);
    user-select: none;
}

.cb-toc__summary::-webkit-details-marker {
    display: none;
}

.cb-toc__summary-icon {
    display: inline-block;
    width: 1rem;
    height: 1rem;
    flex-shrink: 0;
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='currentColor'%3E%3Cpath d='M2 3h12v1.5H2zm0 4h12v1.5H2zm0 4h8v1.5H2z'/%3E%3C/svg%3E");
    background-size: contain;
    background-repeat: no-repeat;
    color: var(--color-accent);
    transition: transform 200ms;
}

.cb-toc__panel[open] .cb-toc__summary-icon {
    transform: rotate(90deg);
}

.cb-toc__nav {
    padding: 0.25rem 1.25rem 1rem;
    border-top: 1px solid var(--color-border, rgba(0, 0, 0, 0.08));
}

.cb-toc__list,
.cb-toc__sublist {
    list-style: none;
    padding: 0;
    margin: 0.5rem 0 0;
}

.cb-toc__sublist {
    margin-left: 1.25rem;
    margin-top: 0.25rem;
    padding-left: 0.75rem;
    border-left: 1px solid var(--color-border, rgba(0, 0, 0, 0.08));
}

.cb-toc__item {
    margin: 0.375rem 0;
    line-height: 1.4;
}

.cb-toc__item--h2 {
    font-weight: 500;
}

.cb-toc__item--h3 {
    font-size: 0.875rem;
    font-weight: 400;
}

.cb-toc__link {
    color: var(--color-text);
    text-decoration: none;
    border-bottom: 1px solid transparent;
    transition: color 150ms, border-color 150ms;
}

.cb-toc__link:hover,
.cb-toc__link:focus-visible {
    color: var(--color-accent);
    border-bottom-color: var(--color-accent);
}

/* Highlight active heading via :target — pure CSS, kein JS-Tracking nötig.
   Funktioniert beim Klick auf TOC-Link (URL-Hash wird gesetzt). */
.cb-toc__link[href]:target,
.cb-toc__list a[href$=":target"] {
    color: var(--color-accent);
    font-weight: 600;
}
