--- name: liquid-glass-layout-shell classification: feature success_metric: | `components/Layout.js` (826 lines) and `components/MobileNavigation.js` render as glass surfaces (sidebar rail, top bar, mobile bottom bar, mobile drawer); the existing 5-assertion Layout test suite stays green; the smoke `'sign-in page renders'` and visual-diff workflows defend the change; visual-diff baselines re-seeded on Linux post-merge. skip: [] status: merged created: 2026-06-03 merged: 2026-06-03 depends_on: - liquid-glass-design-tokens - liquid-glass-modal-and-surface-primitive umbrella: liquid-glass-redesign --- # Convoy: liquid-glass-layout-shell Sub-convoy #4 of the `liquid-glass-redesign` epic. This is the **highest-blast-radius** PR in the portfolio because Layout is composed by every authenticated page (and several anonymous ones — `pages/invite/*.js` legitimately render Layout for anonymous visitors). Treat with appropriate gating. ## Why `components/Layout.js` is the single most-rendered component in the app: sidebar nav, top header (search + theme toggle + profile dropdown), mobile drawer, and now (per the user's ask) the warm-room container that surrounds every page. Under the current design, the sidebar is an opaque wood panel with a warm-cream column. Under Liquid Glass, the sidebar becomes a tall glass rail: the page content is dimly visible through it, the active nav item has an ember rim, and the brand monogram is a glass pill with inner ember gradient. `MobileNavigation.js` already has a 16px backdrop-filter on the bottom bar (`styles/globals.css` lines 800–819). That's the only place glass exists today; this sub-convoy makes it canonical app-wide. ## Scope ### In scope - `components/Layout.js`: - Sidebar — wrapped in ``. - Header — separate `` strip; ember rim under the bottom edge to suggest "light cast onto the page". - Logo pill — glass with inner ember gradient. - `UserProfileDropdown` menu panel — `` (or pull out into a `` primitive — see Decision 4). - `UserProfileDropdown` logged-out CTA — preserves the Sign-in link + monogram; `test/components/Layout.test.js` 5 assertions MUST stay green. - Nav-item active state — current `border-left: 3px solid var(--accent-ember)` recipe stays as the *secondary* signal; new primary signal is an inset ember rim on the active glass tile. - `components/MobileNavigation.js`: - Bottom bar — upgrade existing `mobile-nav-backdrop` rule to the canonical `--glass-blur-mid` + `--glass-surface-mid` tokens (don't re-implement on top — see Risk in umbrella). - Mobile drawer — ``. - Bottom-bar active state — verify AA contrast (the existing finding in `.convoys/ship-readiness.md` § Role-ux-reviewer: *"the bottom-bar's active state contrast looks low in light mode"*). - `styles/globals.css`: - Update `.mobile-nav-backdrop` to reference the new tokens. - Update `.theme-toggle`, `.header-icon`, `.logo-container`, `.nav-item*` selectors to consume new tokens. - **Do NOT delete** legacy color mappings yet — #8 handles that. ### Out of scope - Form elements inside Layout (search bar, theme toggle as a `