Minimal contract a toc rail exposes to its collaborators (the opt-in
CngxTocRouterSync fragment directive): the active-section signal it
derives, the activation output it emits, and the imperative scrollTo
it owns. Injected via CNGX_TOC + useExisting, never by injecting
the concrete CngxToc class - that would create a cyclic type dependency
and block the decompose brain/skin split.
Direction mirrors CNGX_SIDENAV, not CNGX_BREADCRUMB_ITEMS_SOURCE: the
rail owns the state (activeId, scrollTo) and the collaborator consumes
it, so the toc provides the token and the sync directive injects it.