diff --git a/.planning/phases/01-pwa-scaffolding/01-02-SUMMARY.md b/.planning/phases/01-pwa-scaffolding/01-02-SUMMARY.md new file mode 100644 index 0000000..631e33e --- /dev/null +++ b/.planning/phases/01-pwa-scaffolding/01-02-SUMMARY.md @@ -0,0 +1,174 @@ +--- +phase: 01-pwa-scaffolding +plan: 02 +subsystem: pwa-scaffolding +gap_closure: true +tags: [css, tailwind4, mobile, pwa, safe-area] +requirements_satisfied: [PWA-04] +roadmap_criteria_satisfied: ["Phase 1 SC #3 — safe-area utility available"] +dependency_graph: + requires: [] + provides: + - "@utility pt-safe (padding-top: env(safe-area-inset-top))" + - "@utility pb-safe (padding-bottom: env(safe-area-inset-bottom))" + affects: + - "Phase 2 (mobile shell) — sticky header (SHELL-05) and fixed bottom nav (SHELL-06) consume these utilities" +tech_stack: + added: [] + patterns: + - "Tailwind 4 @utility blocks (already in use across brand.css)" + - "CSS env(safe-area-inset-*) — browser-native, falls back to 0" +key_files: + created: [] + modified: + - app/styles/brand.css +decisions: + - "Named utilities (pt-safe / pb-safe) over arbitrary values (pt-[env(safe-area-inset-top)]) — single source of truth, clearer JSX, easy future tweak if iOS rules change" + - "brand.css over globals.css — co-located with all other named project utilities (num, metric-label, surface-brand, tagline, etc.); already imported by globals.css line 125" + - "Top + bottom only (no pl-safe / pr-safe) — manifest pins orientation to portrait; left/right insets only matter in landscape on notched devices; speculative until a consumer asks" + - "Plain env() (not max(env(), 0px)) — env() already returns 0 on devices without insets; max() wrapper is a no-op" +metrics: + duration: "~5 min" + completed: 2026-05-03 + tasks_completed: 1 + files_modified: 1 + commits: 1 +--- + +# Phase 01 Plan 02: PWA-04 Safe-Area Utility Gap Closure Summary + +**One-liner:** Adds shared `pt-safe` / `pb-safe` Tailwind 4 `@utility` blocks to `app/styles/brand.css`, closing the orphaned PWA-04 requirement so Phase 2's sticky header and fixed bottom nav can opt into iOS notch / Android home-indicator padding via `env(safe-area-inset-*)`. + +## Requirements Satisfied + +- **PWA-04** — Header and bottom tab bar respect `env(safe-area-inset-top/bottom)` (Tailwind arbitrary values or shared utility class). **Closed** by shipping `@utility pt-safe` and `@utility pb-safe` in `app/styles/brand.css`. This restores the orphaned-requirement state flagged by `01-VERIFICATION.md` (where 01-01 had declared `requirements: [PWA-01, PWA-02, PWA-03]` only and silently deferred PWA-04 to Phase 2). +- **ROADMAP Phase 1 Success Criterion #3** — "Shared safe-area utility class available" — satisfied by the same two `@utility` blocks. + +## What Changed + +### Files Modified + +- `app/styles/brand.css` — appended one section comment block + two `@utility` definitions between the existing `@utility tagline` (ends line 140) and the `/* === Wolf-mark watermark === */` section header (now line 165). Net: **+23 lines, 0 deletions.** + +### Exact Diff (additive only) + +```css +/* === Safe-area insets ================================================= + * + * Opt-in padding helpers for sticky top / fixed bottom bars on devices + * with notches, dynamic islands, or gesture home indicators. Pair with + * the viewport-fit=cover viewport meta (set in app/layout.tsx) — without + * that, env(safe-area-inset-*) resolves to 0 and these utilities are + * no-ops, which is the desired fallback on non-PWA / non-mobile contexts. + * + * Usage: + *
// header clears notch + *