Minimal contract a sidenav rail exposes to the router-sync directive: the
two-way opened signal it reads and writes. Injected via CNGX_SIDENAV
useExisting, never by injecting the concrete CngxSidenav class - that
would create a cyclic type dependency and block the decompose brain/skin
split. The deferred layout-coordination consumer will broaden this contract
(with close() / elementRef) in the branch that migrates
CngxSidenavLayout onto the token.