5795e3c19a
Promote the sidebar's collapsed state to a shell-level `LayoutStateService` (signal + localStorage persistence) so the header can read it. Split the header into two zones: a logo zone whose width matches the sidebar (16rem expanded / 4rem collapsed) and the existing search + actions cluster on the right. The logo glyph stays visible at both widths; the "APF Portal" wordmark hides when the rail is collapsed. The logo-zone right border and the sidebar right border share the same x coordinate, so they read as one continuous column separator running the full height of the shell. The width transition matches the sidebar's (0.18s ease-out) and is skipped under `prefers-reduced-motion: reduce`. Side-effect: cleans up `<app-sidebar>` — its own signal + effect + storage glue is gone; it now just delegates reads and the toggle click to the service. Same UX, single source of truth, ready to absorb future shared shell state (density, theme, ...) without prop-drilling.