// App shell: fixed-height header on top, sidebar + main beside each // other below, both filling the remaining viewport height. The sidebar // owns its own scrolling (long menus don't push the header off-screen); // the main pane scrolls independently so opening a long page never // scrolls the sidebar out of view. :host { display: flex; flex-direction: column; min-height: 100vh; height: 100vh; } .shell-body { display: flex; flex: 1 1 auto; min-height: 0; } .shell-main { flex: 1 1 auto; min-width: 0; overflow-y: auto; background-color: #f9fafb; color: #111827; :where(.dark) & { background-color: #0b1220; color: #e5e7eb; } } // Skip-link (WCAG 2.4.1 "Bypass Blocks"). Hidden by default, fully // visible and focusable when reached via Tab from the address bar. // Plain CSS rather than the `sr-only` Tailwind utilities so the // visual state on focus is as predictable as possible across themes. .skip-link { position: absolute; top: -40px; left: 0.75rem; z-index: 50; padding: 0.5rem 0.75rem; background: var(--color-brand-primary-500); color: #fff; border-radius: 0.25rem; text-decoration: none; transition: top 0.15s ease-out; &:focus, &:focus-visible { top: 0.5rem; outline: 2px solid var(--color-brand-accent-300); outline-offset: 2px; } }