# Phase 2.1: App Shell, Navigation & Search Foundation - Discussion Log > **Audit trail only.** Do not use as input to planning, research, or execution agents. > Decisions are captured in CONTEXT.md — this log preserves the alternatives considered. **Date:** 2026-05-08 **Phase:** 02.1-app-shell-navigation-search-foundation **Areas discussed:** Tab bar shape & chrome placement, Search affordance behavior, Empty state design language, Theme tokens + Liquid fallback --- ## Tab bar shape & chrome placement ### Q1 — Adopt the mockup's floating pill dock for the tab bar? | Option | Description | Selected | |--------|-------------|----------| | Floating pill dock (Recommended) | Centered, bottom-anchored Liquid-glass capsule. Active wider with icon+label, inactive icon-only circles. | ✓ (with modification) | | Static bottom tab bar (full-width) | Edge-to-edge fixed-width tabs. | | | Platform-adaptive | iOS pill, Android Material 3 NavigationBar. | | **User's choice:** Floating pill dock — but with labels on inactive tabs too (not just active). When search opens, the dock collapses to a single button showing only the active tab's icon (no label, slightly reduced height). **Notes:** User explicitly preferred a single visual language across platforms and wanted all tabs to remain readable; differentiation is by width/emphasis, not by hiding labels. ### Q2 — Tab order and default landing tab? | Option | Description | Selected | |--------|-------------|----------| | Mockup order: Planer / Przepisy / Spiżarnia / Zakupy (Recommended) | Lands on Planer (hero feature). | ✓ | | REQ order: Przepisy / Planer / Spiżarnia / Zakupy | Follows UI-03 listing literally. | | | Last-used tab persisted | Remember across launches. | | **User's choice:** Mockup order; lands on Planer. **Notes:** Aligns with the "my week is planned" core value. ### Q3 — Top app bar in v1? | Option | Description | Selected | |--------|-------------|----------| | No top bar — bottom chrome only (Recommended) | Mirror mockup; one chrome surface. | ✓ | | Minimal top bar with title | Plain text title per tab. | | | Top bar with title + profile/settings icon | Adds global affordance. | | **User's choice:** No top bar. **Notes:** Simpler chrome story; profile/settings will find its slot when Phase 3 lands. ### Q4 — Mockup's collapsible-dock behavior in this phase? | Option | Description | Selected | |--------|-------------|----------| | Defer collapse-to-toggle (Recommended) | Static pill; revisit in Phase 10. | | | Implement collapse-to-toggle now | Match mockup fully. | ✓ (scoped to search-open) | | You decide | Claude's discretion. | | **User's choice:** Implement the collapse, but only as the transition that happens when search opens (not the per-tab/scroll-state collapse). Inspired by Apple apps where bottom chrome morphs as search context activates. **Notes:** Per-tab/scroll collapse is deferred to Phase 10; only search-open collapse is in scope here. --- ## Search affordance behavior ### Q1 — Where does the search button live? | Option | Description | Selected | |--------|-------------|----------| | Per-tab on Przepisy + Spiżarnia (Recommended) | Floating circular button next to dock; only on tabs with searchable content. | ✓ | | Global on every tab | Always present; ambiguous on Planer/Zakupy. | | | Per-tab on all four tabs | Tab-scoped behavior including tabs with no v1 search. | | **User's choice:** Per-tab on Przepisy + Spiżarnia only. **Notes:** Matches mockup; avoids designing search states for tabs with no v1 content. ### Q2 — Search surface behavior before real data exists (this phase)? | Option | Description | Selected | |--------|-------------|----------| | Functional input + empty-state placeholder body (Recommended) | Open/close + query, body shows "Brak danych do przeszukania". | | | Functional input + dimmed/disabled visual | Greyed body. | | | Just open/close + query echo | No body content rendered. | ✓ | **User's choice:** Open/close + query echo only. **Notes:** Lightest scaffolding; Phase 5 will wire result rendering. UI-10 is satisfied by demonstrating the affordance is functional, not by faking content. ### Q3 — Search query state — what persists? | Option | Description | Selected | |--------|-------------|----------| | Cleared on close (Recommended) | iOS-typical behavior. | ✓ | | Persists per-tab within session | Foreground only. | | | Persists per-tab across launches | Saved via multiplatform-settings. | | **User's choice:** Cleared on close. **Notes:** Simplest mental model; aligns with iOS conventions. ### Q4 — Search input — inline pill or full-screen sheet? | Option | Description | Selected | |--------|-------------|----------| | Inline bottom pill, dock collapses next to it (Recommended) | Mockup behavior. | ✓ | | Full-screen modal sheet | iOS Settings/Mail style. | | | Inline with results overlay | Pill + translucent overlay. | | **User's choice:** Inline bottom pill. **Notes:** Coordinated with the dock-collapse transition (Tab Q4). --- ## Empty state design language ### Q1 — Empty state visual treatment? | Option | Description | Selected | |--------|-------------|----------| | Icon + headline + subline (Recommended) | Tab-themed icon, calm color, no bespoke art. | ✓ | | Custom illustrations per tab | Bespoke SVG/PNG per state. | | | Text-only, no icon | Centered headline + subline only. | | **User's choice:** Icon + headline + subline. **Notes:** No illustration assets needed; cheap and on-brand. ### Q2 — Empty state tone? | Option | Description | Selected | |--------|-------------|----------| | Anticipatory — "soon you'll see X" (Recommended) | Forward-looking Polish copy. | ✓ | | Neutral / informational | "Brak danych" style. | | | Welcoming with onboarding hint | Chatty onboarding copy. | | **User's choice:** Anticipatory. **Notes:** Honestly signals the feature is real but waiting. ### Q3 — CTA buttons in empty states this phase? | Option | Description | Selected | |--------|-------------|----------| | No CTAs in this phase (Recommended) | Add as actions become real. | ✓ | | Disabled-looking CTA placeholders | Greyed, inert. | | | Cross-tab CTAs | "Browse recipes" → Przepisy (also empty). | | **User's choice:** No CTAs. **Notes:** Households (Phase 3) and catalog (Phase 5) don't exist yet; CTAs would no-op. ### Q4 — Empty state component architecture? | Option | Description | Selected | |--------|-------------|----------| | Single reusable EmptyState composable (Recommended) | `EmptyState(icon, title, subtitle, action?)`. | ✓ | | Per-screen bespoke composables | Each screen rolls its own. | | | You decide | Claude's discretion. | | **User's choice:** Single reusable EmptyState composable with optional action slot. **Notes:** Action slot reserved unused this phase; feature phases populate it. --- ## Theme tokens + Liquid fallback ### Q1 — Theme token scaffolding scope for this phase? | Option | Description | Selected | |--------|-------------|----------| | Full scaffold: colors + typography + spacing + glass-surface (Recommended) | Phase 5 inherits cleanly; Phase 10 tunes. | ✓ | | Minimal: only what the shell uses | Defer typography/spacing to feature phases. | | | Full scaffold + lift mockup CSS palette directly | Seed palette from `--*-rgb` vars. | | **User's choice:** Full scaffold; mockup palette is reference, not directly ported. **Notes:** The visual rebuild owns its own palette. ### Q2 — Light/dark scheme posture? | Option | Description | Selected | |--------|-------------|----------| | Both schemes defined; system-following (Recommended) | UI-05 foundation here, full landing in Phase 5. | ✓ | | Light-only this phase, dark in Phase 5 | Half-build now. | | | Both, but app forces dark | Light tokens un-tested. | | **User's choice:** Both, system-following. **Notes:** Avoids retrofit cost in Phase 5. ### Q3 — Liquid fallback strategy? | Option | Description | Selected | |--------|-------------|----------| | Liquid → Haze → flat fallback chain (Recommended) | Layered primitive, same token API. | ✓ | | Liquid + flat fallback (skip Haze) | Two-tier, no middle quality. | | | Liquid-only, no fallback | Cheapest now. | | **User's choice:** Three-tier layered fallback. **Notes:** `GlassSurface` primitive consumes the same token API across all three paths. ### Q4 — When does fallback engage? | Option | Description | Selected | |--------|-------------|----------| | Compile-time per-target + runtime debug toggle (Recommended) | Build-time selection; debug-build comparison toggle. | ✓ | | Always-best, no toggle | Silent platform selection. | | | Runtime perf detection auto-downgrades | Real engineering investment. | | **User's choice:** Compile-time + debug toggle. **Notes:** No automatic perf detection in v1; Phase 10 may add it. --- ## Claude's Discretion - Liquid library API specifics (radius, blur, refraction values) — researcher to surface - Nav graph topology — default to nested NavHost per tab unless research blocks it - Whether to migrate Phase 2 Material 3 auth screens now — default: leave as legacy - Specific empty-state copy strings (subject to Phase 11 copy pass) - Icon source — Material Icons Outlined unless research surfaces a better fit - Animation curves and durations for the dock-collapse-on-search transition - Accessibility specifics (Role.Tab semantics, focus order) - Whether to expose the GlassSurface debug toggle in-app or as a build flag ## Deferred Ideas - Per-tab/scroll-state dock collapse (mockup) — Phase 10 - Profile/settings entry point in chrome — Phase 3 onboards households first - Cross-tab CTAs in empty states — feature phases as content lands - Custom empty-state illustrations - Material 3 migration of auth screens - Runtime perf detection auto-downgrade for GlassSurface — Phase 10 - Persisting search query across sessions / tab-switches - Real-device Liquid tuning — Phase 10