Add preparing navigation to roadmap
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
|
||||
## What This Is
|
||||
|
||||
A mobile-first meal planning app for a small household — pick recipes for the week, fill a calendar across five meal slots per day, and watch pantry gaps + shopping lists emerge from the plan. Kotlin Multiplatform targeting iOS primarily, with Android, Desktop, and Wasm as secondary targets. Built for me + my partner (shared household plan) with a handful of family/friends as authorized users on the same self-hosted backend.
|
||||
A mobile-first meal planning app for a small household — pick recipes for the week, fill a calendar across five meal slots per day, and watch pantry gaps + shopping lists emerge from the plan. Kotlin Multiplatform targeting iOS primarily, with Android as the secondary app target and a JVM Ktor server. Built for me + my partner (shared household plan) with a handful of family/friends as authorized users on the same self-hosted backend.
|
||||
|
||||
## Core Value
|
||||
|
||||
@@ -60,6 +60,7 @@ A mobile-first meal planning app for a small household — pick recipes for the
|
||||
**Polish UI foundation**
|
||||
- [ ] All user-facing strings are externalized into resource files (i18n-ready), even though v1 ships Polish only
|
||||
- [ ] UI uses a Liquid-Glass-inspired visual language (translucent surfaces, blur, soft depth) implemented in Compose Multiplatform
|
||||
- [ ] Signed-in users have a real app shell early: main menu/tab chrome, empty Planner / Recipes / Pantry / Shopping views, and a working search affordance before domain data arrives
|
||||
- [ ] Visual hierarchy is less cramped than the mockup (more breathing room, calmer typography)
|
||||
- [ ] iOS app feels iOS-idiomatic within Compose's constraints (tab bar placement, navigation patterns, safe areas, dark mode)
|
||||
|
||||
@@ -71,7 +72,7 @@ A mobile-first meal planning app for a small household — pick recipes for the
|
||||
- Nutrition goal tracking (targets, streaks, deficits) — *v1 shows numbers informationally only*
|
||||
- English and other language copy — *code is i18n-ready but v1 ships Polish only*
|
||||
- True native iOS 26 Liquid Glass via SwiftUI interop — *Compose approximation for v1; revisit only if real-device chrome feels clearly inadequate*
|
||||
- Desktop and Wasm as shipped products — *Desktop useful for hot-reload dev; Wasm is a possible future target, neither is a v1 deliverable*
|
||||
- Desktop and Wasm app targets — *removed from the v1 target matrix to keep the build focused on iOS, Android, and the JVM server*
|
||||
- Sign in with Apple as a first-class button — *user's Authentik handles auth; Apple can be federated upstream in Authentik if needed later*
|
||||
- Barcode scanning / receipt OCR for pantry updates — *manual entry is fine for a 2-person household*
|
||||
- AI-generated recipes — *curated catalog is the value*
|
||||
@@ -88,7 +89,7 @@ A mobile-first meal planning app for a small household — pick recipes for the
|
||||
|
||||
## Context
|
||||
|
||||
**Codebase state.** The `~/dev/repo/recipe` directory is a freshly-generated Kotlin Multiplatform Compose template from IntelliJ with four modules: `composeApp` (Android + Desktop + iOS shared UI), `iosApp` (iOS bootstrap), `server` (Ktor, not yet written), and `shared` (common code). No app logic exists yet — this is effectively greenfield with the build infra in place.
|
||||
**Codebase state.** The `~/dev/repo/recipe` directory has four modules: `composeApp` (Android + iOS shared UI), `iosApp` (iOS bootstrap), `server` (Ktor), and `shared` (common domain/DTO code). `shared` still has a JVM target because the server consumes it; `composeApp` does not ship Desktop or Wasm targets in v1.
|
||||
|
||||
**Reference implementation.** The user built a working PWA at `~/dev/repo/recipe-mockup/` (vanilla JS + Tailwind CDN + nginx/Docker). It implements the same four views (Recipe List, Meal Planner, Pantry, Shopping List) and has mature logic worth mining as a *functional* spec — particularly planner entry customization (substitutions, amount overrides, product selection), shortfall computation over a horizon, and shopping-list aggregation with "bought" session tracking. The mockup's UI design is **not** being carried forward; the user is redesigning visuals around a Liquid-Glass-inspired language.
|
||||
|
||||
@@ -96,9 +97,9 @@ A mobile-first meal planning app for a small household — pick recipes for the
|
||||
|
||||
**Infra.** User runs a homelab. Authentik is already installed. The Ktor backend will run on the same server (containerized). No managed cloud dependencies planned.
|
||||
|
||||
**Language & platform.** Polish-only UI for v1 (strings externalized for future i18n). iOS is the primary daily driver; Android deployed later for friends; Desktop useful for development (hot reload); Wasm is aspirational.
|
||||
**Language & platform.** Polish-only UI for v1 (strings externalized for future i18n). iOS is the primary daily driver; Android deployed later for friends. Desktop and Wasm app targets are deferred out of v1.
|
||||
|
||||
**Liquid Glass decision.** True iOS 26 Liquid Glass (refractive material, specular highlights, morphing chrome) is a SwiftUI-native feature that Compose on iOS cannot reproduce exactly (Compose uses Skia, not Metal-native glass material). The v1 plan is: Compose-only approximation (blur + translucency + gradients) everywhere, measure real-device performance and visual quality, and **only** selectively add SwiftUI interop for the chrome (tab bar, nav bar) if the approximation feels insufficient. This avoids upfront interop complexity for 90%+ of the UI.
|
||||
**Liquid Glass decision.** True iOS 26 Liquid Glass (refractive material, specular highlights, morphing chrome) is a SwiftUI-native feature that Compose on iOS cannot reproduce exactly (Compose uses Skia, not Metal-native glass material). The v1 plan is: Compose-only approximation using the Liquid library for menu/search/button chrome first, with blur/translucency fallbacks where needed; measure real-device performance and visual quality; and **only** selectively add SwiftUI interop for chrome if the approximation feels insufficient. This avoids upfront interop complexity for 90%+ of the UI.
|
||||
|
||||
## Constraints
|
||||
|
||||
@@ -117,12 +118,13 @@ A mobile-first meal planning app for a small household — pick recipes for the
|
||||
|
||||
| Decision | Rationale | Outcome |
|
||||
|----------|-----------|---------|
|
||||
| KMP with Compose Multiplatform for UI | iOS-primary + Android secondary + Desktop/Wasm optional; single codebase for 90%+ of UI | — Pending |
|
||||
| KMP with Compose Multiplatform for UI | iOS-primary + Android secondary; Desktop/Wasm app targets removed from v1 to keep the build focused | — Pending |
|
||||
| Household-sharing from day 1 (me + partner share one plan) | Core use case is cooking together; per-user + later-sharing would force data-model rewrite | — Pending |
|
||||
| Authentik OIDC as sole auth provider for MVP | User already runs Authentik; self-hosted == aligned; Apple Sign-in likely not required for App Store since Authentik is user's own IdP, not a third-party social login | — Pending |
|
||||
| Server lives on user's homelab alongside Authentik | Existing infra, zero managed-cloud cost, same ops surface | — Pending |
|
||||
| Offline-first with last-write-wins sync | Grocery-store usage demands offline; conflict resolution overkill for a 2-person household | — Pending |
|
||||
| Compose-only Liquid Glass approximation for v1 | Real iOS 26 Liquid Glass requires SwiftUI interop; approximation keeps single codebase; revisit only if chrome feels inadequate on real device | — Pending |
|
||||
| Compose-only Liquid Glass approximation for v1 | Real iOS 26 Liquid Glass requires SwiftUI interop; Liquid gives Compose chrome/buttons a closer approximation while keeping a single codebase; revisit only if chrome feels inadequate on real device | — Pending |
|
||||
| Real app shell before household/domain work | The authenticated app should stop feeling like a placeholder before Phase 3; menu navigation, empty states, and search can be built without household data and will reduce UI churn in later phases | — Pending |
|
||||
| Polish-only strings, i18n-ready infrastructure | Single-language content for v1 speed; externalized strings prevent future rewrite | — Pending |
|
||||
| Start catalog fresh (don't port mockup seed data) | Mockup data is a reference, not production content; user wants to re-curate | — Pending |
|
||||
| Nutrition is informational only in v1 | Keep scope tight; tracking/goals are a natural v2 if usage patterns justify | — Pending |
|
||||
@@ -132,7 +134,8 @@ A mobile-first meal planning app for a small household — pick recipes for the
|
||||
|
||||
| Decision | Rationale | Outcome |
|
||||
|----------|-----------|---------|
|
||||
| Navigation: Jetpack Navigation Compose (CMP port) — `org.jetbrains.androidx.navigation:navigation-compose:2.9.x` | JetBrains-official recommendation on kotlinlang.org; type-safe routes via `@Serializable`; works across Android/iOS/Desktop/Wasm; skill transferable to Android | — Pending |
|
||||
| Navigation: Jetpack Navigation Compose (CMP port) — `org.jetbrains.androidx.navigation:navigation-compose:2.9.x` | JetBrains-official recommendation on kotlinlang.org; type-safe routes via `@Serializable`; works across Android/iOS; skill transferable to Android | — Pending |
|
||||
| Component foundation: Composables / Compose Unstyled | Use renderless, accessible primitives from `composables.com` for new shared controls so Recipe owns the visual language instead of inheriting Material 3's Android look. Composables One is optional only if the project has/chooses the paid kit. | — Pending |
|
||||
| Architecture: ViewModel + StateFlow + method-per-action | Standard modern pattern; matches JetBrains/Google samples; lowest ceremony; upgrade individual screens to sealed-event onEvent only when they grow complex | — Pending |
|
||||
| DI: Koin — `koin-core`, `koin-compose`, `koin-compose-viewmodel` | De facto KMP standard; smoothest `koinViewModel()` integration with Jetpack Nav back-stack scoping; no codegen; small surface to learn | — Pending |
|
||||
| Local DB: SQLDelight 2.x | Most mature KMP DB; Wasm-ready (hedge for future Compose-for-Web target); raw SQL is a transferable skill; clear migration story via .sq files | — Pending |
|
||||
@@ -142,7 +145,7 @@ A mobile-first meal planning app for a small household — pick recipes for the
|
||||
| Logging: Kermit (Touchlab) | KMP-native logger; simple API; optional Crashlytics/Sentry bridges | — Pending |
|
||||
| Image loading: Coil 3 (`io.coil-kt.coil3:coil-compose`) | First-class Compose Multiplatform support; modern API | — Pending |
|
||||
| Key-value settings: `com.russhwolf:multiplatform-settings` | Small prefs (last tab, theme toggles) that don't belong in SQLDelight | — Pending |
|
||||
| Glass/blur effects: Haze (`dev.chrisbanes.haze:haze`) | Purpose-built for glass UI in CMP; handles content capture + efficient re-blur; multiplatform | — Pending |
|
||||
| Glass effects: Liquid (`io.github.fletchmckee.liquid:liquid`) first for chrome/buttons; Haze only as a fallback/simple blur tool if needed | Liquid lets modifier nodes sample/manipulate pixels behind controls for a closer Liquid-Glass-style effect in Compose Multiplatform; keep effects constrained to chrome/buttons and verify on real iOS hardware | — Pending |
|
||||
| Mobile OIDC: Lokksmith on Android/iOS, exposed via the KMP `OidcClient` interface | Keeps OIDC browser flow, PKCE, state/nonce, refresh, and end-session in Kotlin Multiplatform; removes the Swift AppAuth bridge and SwiftPM package from the iOS shell while still using ASWebAuthenticationSession underneath on iOS | — Pending |
|
||||
|
||||
### Server tech stack
|
||||
|
||||
@@ -87,12 +87,13 @@
|
||||
- [ ] **UI-01**: All user-facing strings are externalized as Compose resources (i18n-ready), even though v1 ships Polish only
|
||||
- [ ] **UI-02**: App ships with Polish-language copy throughout
|
||||
- [ ] **UI-03**: Bottom tab navigation with 4 tabs: Przepisy / Planer / Spiżarnia / Zakupy, each preserving its own back stack independently
|
||||
- [ ] **UI-04**: Tab bar and nav bar use Haze-based glass/blur effects (Liquid Glass approximation)
|
||||
- [ ] **UI-04**: App chrome and primary icon buttons use the chosen Compose Liquid-Glass approximation, starting with the Liquid library for menu/search controls
|
||||
- [ ] **UI-05**: App supports light and dark color schemes with translucent surfaces working in both
|
||||
- [ ] **UI-06**: UI is iOS-idiomatic within Compose constraints (safe areas, swipe-back gesture where applicable, keyboard avoidance)
|
||||
- [ ] **UI-07**: Visual hierarchy is less cramped than the mockup — deliberate spacing, calmer typography, readable at arm's length
|
||||
- [ ] **UI-08**: Locale-aware date formatting for display (days, months, weekday names in Polish); sync wire-format stays UTC ISO-8601
|
||||
- [ ] **UI-09**: App starts cleanly on first launch (no blank flash) and shows appropriate empty states when catalog / plan / pantry / shopping are empty
|
||||
- [ ] **UI-10**: Main app search affordance is functional before catalog data exists: search opens, query state updates, clear/close actions work, and the no-results/empty-data state is deliberate
|
||||
|
||||
### Infrastructure & build
|
||||
|
||||
@@ -217,13 +218,14 @@ Populated during roadmap creation. Each v1 requirement maps to exactly one phase
|
||||
| SYNC-10 | Phase 4: Sync Engine Skeleton | Pending |
|
||||
| UI-01 | Phase 11: Localization & iOS Deployment | Pending |
|
||||
| UI-02 | Phase 11: Localization & iOS Deployment | Pending |
|
||||
| UI-03 | Phase 10: UI Chrome & Haze Liquid-Glass Polish | Pending |
|
||||
| UI-04 | Phase 10: UI Chrome & Haze Liquid-Glass Polish | Pending |
|
||||
| UI-03 | Phase 2.1: App Shell, Navigation & Search Foundation | Pending |
|
||||
| UI-04 | Phase 2.1: App Shell, Navigation & Search Foundation | Pending |
|
||||
| UI-05 | Phase 5: Recipe Catalog (Read Path) | Pending |
|
||||
| UI-06 | Phase 10: UI Chrome & Haze Liquid-Glass Polish | Pending |
|
||||
| UI-07 | Phase 10: UI Chrome & Haze Liquid-Glass Polish | Pending |
|
||||
| UI-06 | Phase 10: UI Chrome & Liquid-Glass Polish | Pending |
|
||||
| UI-07 | Phase 10: UI Chrome & Liquid-Glass Polish | Pending |
|
||||
| UI-08 | Phase 5: Recipe Catalog (Read Path) | Pending |
|
||||
| UI-09 | Phase 10: UI Chrome & Haze Liquid-Glass Polish | Pending |
|
||||
| UI-09 | Phase 2.1: App Shell, Navigation & Search Foundation | Pending |
|
||||
| UI-10 | Phase 2.1: App Shell, Navigation & Search Foundation | Pending |
|
||||
| INFRA-01 | Phase 1: Project Infrastructure & Module Wiring | Complete |
|
||||
| INFRA-02 | Phase 1: Project Infrastructure & Module Wiring | Complete |
|
||||
| INFRA-03 | Phase 1: Project Infrastructure & Module Wiring | Complete |
|
||||
@@ -233,8 +235,8 @@ Populated during roadmap creation. Each v1 requirement maps to exactly one phase
|
||||
| INFRA-07 | Phase 11: Localization & iOS Deployment | Pending |
|
||||
|
||||
**Coverage:**
|
||||
- v1 requirements: **72 total** (AUTH=6, HSHD=7, RCPE=8, PLAN=14, PNTR=5, SHOP=6, SYNC=10, UI=9, INFRA=7)
|
||||
- Mapped to phases: **72**
|
||||
- v1 requirements: **73 total** (AUTH=6, HSHD=7, RCPE=8, PLAN=14, PNTR=5, SHOP=6, SYNC=10, UI=10, INFRA=7)
|
||||
- Mapped to phases: **73**
|
||||
- Unmapped: **0**
|
||||
|
||||
---
|
||||
|
||||
@@ -2,14 +2,15 @@
|
||||
|
||||
**Core Value:** "My week is planned." I pick recipes, the calendar fills up, and I know what we're eating.
|
||||
|
||||
**Granularity:** Fine (11 phases)
|
||||
**Granularity:** Fine (11 phases + 1 inserted shell phase)
|
||||
**Mode:** YOLO
|
||||
**Source of truth:** Derived from `.planning/REQUIREMENTS.md` (72 v1 requirements) guided by `.planning/research/SUMMARY.md` (suggested skeleton) and `.planning/research/ARCHITECTURE.md` (build-order reasoning).
|
||||
**Source of truth:** Derived from `.planning/REQUIREMENTS.md` (73 v1 requirements) guided by `.planning/research/SUMMARY.md` (suggested skeleton) and `.planning/research/ARCHITECTURE.md` (build-order reasoning).
|
||||
|
||||
## Phases
|
||||
|
||||
- [x] **Phase 1: Project Infrastructure & Module Wiring** — Running-but-empty KMP client + Ktor server with all build infra baked in
|
||||
- [ ] **Phase 2: Authentication Foundation** — User signs in through Authentik (OIDC+PKCE) and the server validates tokens
|
||||
- [x] **Phase 2: Authentication Foundation** — User signs in through Authentik (OIDC+PKCE) and the server validates tokens
|
||||
- [ ] **Phase 2.1: App Shell, Navigation & Search Foundation** — Signed-in users can move between the four empty app areas through a Liquid-styled menu and open the search surface
|
||||
- [ ] **Phase 3: Households, Membership & Server Data Foundation** — Users create/join households; server enforces household scope
|
||||
- [ ] **Phase 4: Sync Engine Skeleton** — Offline-first read/write with outbox-backed LWW sync on a sentinel table
|
||||
- [ ] **Phase 5: Recipe Catalog (Read Path)** — User browses, filters, and opens recipe details from a seeded catalog
|
||||
@@ -17,7 +18,7 @@
|
||||
- [ ] **Phase 7: Meal Planner — Customization & Nutrition** — User tweaks servings/ingredients/products per meal entry and sees daily nutrition
|
||||
- [ ] **Phase 8: Pantry** — User tracks what's on hand and sees shortfalls against the plan
|
||||
- [ ] **Phase 9: Shopping List & Session Log** — User generates a grouped shopping list from the plan and shops with "bought" tracking
|
||||
- [ ] **Phase 10: UI Chrome & Haze Liquid-Glass Polish** — Tab/nav glass effects, iOS-idiomatic chrome, calmer visual hierarchy
|
||||
- [ ] **Phase 10: UI Chrome & Liquid-Glass Polish** — Real-device Liquid glass tuning, iOS-idiomatic chrome, calmer visual hierarchy
|
||||
- [ ] **Phase 11: Localization & iOS Deployment** — Full Polish copy pass, i18n-ready resources, TestFlight to partner
|
||||
|
||||
## Phase Summary Table
|
||||
@@ -26,6 +27,7 @@
|
||||
|---|------|-----------------|--------------|-----|
|
||||
| 1 | Project Infrastructure & Module Wiring | KMP client + Ktor server build cleanly with convention plugins, version catalog, iOS binary flags, and a shared DTO module | INFRA-01, INFRA-02, INFRA-03, INFRA-06 | 4 |
|
||||
| 2 | Authentication Foundation | End-to-end OIDC+PKCE login to Authentik with JIT user provisioning and server-side JWT validation | AUTH-01, AUTH-02, AUTH-03, AUTH-04, AUTH-05, AUTH-06 | 5 |
|
||||
| 2.1 | App Shell, Navigation & Search Foundation | Signed-in users land in the real 4-tab app shell with empty Planner / Recipes / Pantry / Shopping screens, Liquid-styled chrome, and an operational search affordance | UI-03, UI-04, UI-09, UI-10 | 5 |
|
||||
| 3 | Households, Membership & Server Data Foundation | Create/join households via invites; every request carries a household-scoped principal derived from JWT | HSHD-01, HSHD-02, HSHD-03, HSHD-04, HSHD-05, HSHD-06, HSHD-07, INFRA-05 | 5 |
|
||||
| 4 | Sync Engine Skeleton | Outbox-backed LWW sync works round-trip on a sentinel table with server-assigned timestamps and cursor pull | SYNC-01, SYNC-02, SYNC-03, SYNC-04, SYNC-05, SYNC-06, SYNC-07, SYNC-08, SYNC-09, SYNC-10 | 5 |
|
||||
| 5 | Recipe Catalog (Read Path) | User browses a seeded recipe catalog, filters/searches, and opens a detail view — offline-capable | RCPE-01, RCPE-02, RCPE-03, RCPE-04, RCPE-05, RCPE-06, RCPE-07, RCPE-08, UI-05, UI-08 | 5 |
|
||||
@@ -33,7 +35,7 @@
|
||||
| 7 | Meal Planner — Customization & Nutrition | User customizes ingredients per meal entry and sees daily macro totals that respect customizations | PLAN-07, PLAN-08, PLAN-09, PLAN-10, PLAN-11, PLAN-13 | 4 |
|
||||
| 8 | Pantry | User manages pantry inventory by category and sees shortfalls for a chosen horizon | PNTR-01, PNTR-02, PNTR-03, PNTR-04, PNTR-05 | 4 |
|
||||
| 9 | Shopping List & Session Log | User generates a category-grouped shopping list and marks items bought during a session | SHOP-01, SHOP-02, SHOP-03, SHOP-04, SHOP-05, SHOP-06 | 4 |
|
||||
| 10 | UI Chrome & Haze Liquid-Glass Polish | 4-tab nav with independent back stacks, Haze glass chrome, iOS idioms, breathing-room visual hierarchy | UI-03, UI-04, UI-06, UI-07, UI-09 | 5 |
|
||||
| 10 | UI Chrome & Liquid-Glass Polish | Real-device tuning for Liquid glass chrome, iOS idioms, breathing-room visual hierarchy, and cross-screen polish after real data exists | UI-06, UI-07 | 5 |
|
||||
| 11 | Localization & iOS Deployment | All strings externalized, Polish copy throughout, partner installs via TestFlight | UI-01, UI-02, INFRA-04, INFRA-07 | 4 |
|
||||
|
||||
## Phase Details
|
||||
@@ -78,18 +80,33 @@ Plans:
|
||||
Plans:
|
||||
- [x] 02-01-PLAN.md — Shared auth contracts, dependency aliases, Authentik setup docs, and source audit
|
||||
- [x] 02-02-PLAN.md — Server JWT validation, JWKS hardening, JIT users, and `/api/v1/me`
|
||||
- [ ] 02-03-PLAN.md — Common OIDC/store contracts, JVM/Wasm actuals, and store contract test
|
||||
- [ ] 02-04-PLAN.md — Android OIDC actual, Android secure AuthState store, and manifest callback
|
||||
- [ ] 02-05-PLAN.md — iOS OIDC actual, iOS Keychain store, and URL scheme callback
|
||||
- [ ] 02-06-PLAN.md — AuthSession state machine, bearer HTTP client, refresh/logout behavior, and Koin wiring
|
||||
- [ ] 02-07-PLAN.md — Compose auth gate UI, Polish resource strings, and iOS Authentik UAT
|
||||
- [x] 02-03-PLAN.md — Common OIDC/store contracts, JVM/Wasm actuals, and store contract test
|
||||
- [x] 02-04-PLAN.md — Android OIDC actual, Android secure AuthState store, and manifest callback
|
||||
- [x] 02-05-PLAN.md — iOS OIDC actual, iOS Keychain store, and URL scheme callback
|
||||
- [x] 02-06-PLAN.md — AuthSession state machine, bearer HTTP client, refresh/logout behavior, and Koin wiring
|
||||
- [x] 02-07-PLAN.md — Compose auth gate UI, Polish resource strings, and iOS Authentik UAT
|
||||
**UI hint:** yes
|
||||
**Research flag:** yes
|
||||
|
||||
### Phase 2.1: App Shell, Navigation & Search Foundation
|
||||
|
||||
**Goal:** Replace the post-login placeholder with the real app shell before household/domain data lands: four persistent top-level destinations (Przepisy, Planer, Spiżarnia, Zakupy), deliberate empty states for each, a working search affordance, and the first shared component layer based on Composables + Liquid instead of growing further around Material 3.
|
||||
**Depends on:** Phase 2
|
||||
**Requirements:** UI-03, UI-04, UI-09, UI-10
|
||||
**Success Criteria** (what must be TRUE):
|
||||
1. After sign-in I land in the main app shell, not the Phase 2 welcome placeholder; I can switch between Przepisy, Planer, Spiżarnia, and Zakupy from the main menu without signing out.
|
||||
2. Each tab has its own navigation state boundary from day 1, so future detail screens can preserve back stacks independently; the initial screens are intentionally empty states, not throwaway placeholders.
|
||||
3. The shared UI foundation uses Composables' Compose Unstyled/renderless primitives for new controls where applicable, with local Recipe components providing the visual styling; Material 3 remains only as temporary legacy auth scaffold until migrated.
|
||||
4. Menu chrome and primary icon buttons use the Liquid library (`io.github.fletchmckee.liquid:liquid`) for the first Liquid-Glass-inspired treatment, constrained to chrome/buttons and backed by a simple fallback path if performance or platform support is not acceptable.
|
||||
5. The search button is functional: tapping it opens a search surface, query input updates state, close/clear actions work, and empty/no-data content is intentional until the recipe catalog read path wires real results in Phase 5.
|
||||
**Plans:** TBD
|
||||
**UI hint:** yes
|
||||
**Research flag:** yes
|
||||
|
||||
### Phase 3: Households, Membership & Server Data Foundation
|
||||
|
||||
**Goal:** Introduce the tenancy model before any feature tables land — `households`, `memberships`, `invites` with Flyway migrations; server's `PrincipalResolver` maps JWT `sub` to an active `householdId`; client finishes onboarding by creating or joining a household.
|
||||
**Depends on:** Phase 2
|
||||
**Depends on:** Phase 2.1
|
||||
**Requirements:** HSHD-01, HSHD-02, HSHD-03, HSHD-04, HSHD-05, HSHD-06, HSHD-07, INFRA-05
|
||||
**Success Criteria** (what must be TRUE):
|
||||
1. On my first login, I see an onboarding screen asking me to create a new household or enter an invite code.
|
||||
@@ -188,17 +205,17 @@ Plans:
|
||||
**UI hint:** yes
|
||||
**Research flag:** no
|
||||
|
||||
### Phase 10: UI Chrome & Haze Liquid-Glass Polish
|
||||
### Phase 10: UI Chrome & Liquid-Glass Polish
|
||||
|
||||
**Goal:** Swap the boring default chrome used in Phases 5–9 for the intended Liquid-Glass-inspired feel — 4-tab bottom nav with independent back stacks, Haze-based blur on tab/nav chrome, iOS-idiomatic safe-area/keyboard/swipe-back behaviors, and a calmer spacing/typography pass across every screen. Measurable against realistic data already present.
|
||||
**Goal:** Polish and harden the app-wide visual system after real catalog/planner/pantry/shopping data exists — tune Liquid glass chrome on device, verify iOS idioms, remove remaining Material 3-looking surfaces, and run the calmer spacing/typography pass across every screen.
|
||||
**Depends on:** Phase 9
|
||||
**Requirements:** UI-03, UI-04, UI-06, UI-07, UI-09
|
||||
**Requirements:** UI-06, UI-07
|
||||
**Success Criteria** (what must be TRUE):
|
||||
1. The app has a 4-tab bottom nav (Przepisy / Planer / Spiżarnia / Zakupy); tapping into a recipe detail, switching tabs, and coming back preserves the detail — each tab keeps its own back stack.
|
||||
2. The tab bar and top nav bar use Haze-based translucent blur over content beneath them, consistent in light and dark schemes, and scrolling a full recipe grid on iPhone 11 stays above ~55 fps.
|
||||
1. The Phase 2.1 app shell still preserves each tab's back stack after real recipe detail, planner, pantry, and shopping flows exist.
|
||||
2. The tab bar, nav bar, and search/button chrome use the chosen Liquid-Glass approximation consistently in light and dark schemes, and scrolling a full recipe grid on iPhone 11 stays above ~55 fps.
|
||||
3. The app respects iOS safe areas, supports the swipe-back gesture where applicable, and keyboards never cover focused inputs.
|
||||
4. Typography and spacing feel noticeably calmer than the legacy PWA mockup — more whitespace between cards, larger hit targets, readable at arm's length.
|
||||
5. On a fresh install I never see a blank flash on launch, and every main screen (catalog / planner / pantry / shopping) renders a deliberate empty state when there's nothing to show yet.
|
||||
5. Any remaining Material 3-looking default components from earlier phases are replaced by Recipe-styled components built on the agreed component foundation.
|
||||
**Plans:** TBD
|
||||
**UI hint:** yes
|
||||
**Research flag:** yes
|
||||
@@ -222,7 +239,8 @@ Plans:
|
||||
| Phase | Plans Complete | Status | Completed |
|
||||
|-------|----------------|--------|-----------|
|
||||
| 1. Project Infrastructure & Module Wiring | 7/7 | Complete | 2026-04-24 |
|
||||
| 2. Authentication Foundation | 2/7 | Executing | - |
|
||||
| 2. Authentication Foundation | 7/7 | Complete | 2026-04-28 |
|
||||
| 2.1 App Shell, Navigation & Search Foundation | 0/0 | Not started | - |
|
||||
| 3. Households, Membership & Server Data Foundation | 0/0 | Not started | - |
|
||||
| 4. Sync Engine Skeleton | 0/0 | Not started | - |
|
||||
| 5. Recipe Catalog (Read Path) | 0/0 | Not started | - |
|
||||
@@ -230,16 +248,16 @@ Plans:
|
||||
| 7. Meal Planner — Customization & Nutrition | 0/0 | Not started | - |
|
||||
| 8. Pantry | 0/0 | Not started | - |
|
||||
| 9. Shopping List & Session Log | 0/0 | Not started | - |
|
||||
| 10. UI Chrome & Haze Liquid-Glass Polish | 0/0 | Not started | - |
|
||||
| 10. UI Chrome & Liquid-Glass Polish | 0/0 | Not started | - |
|
||||
| 11. Localization & iOS Deployment | 0/0 | Not started | - |
|
||||
|
||||
## Coverage Summary
|
||||
|
||||
- **v1 requirements total:** 72 (AUTH=6, HSHD=7, RCPE=8, PLAN=14, PNTR=5, SHOP=6, SYNC=10, UI=9, INFRA=7)
|
||||
- **Mapped to phases:** 72
|
||||
- **v1 requirements total:** 73 (AUTH=6, HSHD=7, RCPE=8, PLAN=14, PNTR=5, SHOP=6, SYNC=10, UI=10, INFRA=7)
|
||||
- **Mapped to phases:** 73
|
||||
- **Unmapped:** 0
|
||||
- **Coverage:** 100%
|
||||
|
||||
---
|
||||
*Roadmap created: 2026-04-23*
|
||||
*Granularity: fine (11 phases) | Mode: yolo*
|
||||
*Granularity: fine (11 phases + inserted Phase 2.1) | Mode: yolo*
|
||||
|
||||
@@ -2,15 +2,15 @@
|
||||
gsd_state_version: 1.0
|
||||
milestone: v1.0
|
||||
milestone_name: milestone
|
||||
current_plan: 7
|
||||
status: executing
|
||||
last_updated: "2026-04-28T14:57:40.504Z"
|
||||
current_plan: 0
|
||||
status: ready_to_plan
|
||||
last_updated: "2026-05-07T00:00:00.000Z"
|
||||
progress:
|
||||
total_phases: 11
|
||||
completed_phases: 1
|
||||
total_phases: 12
|
||||
completed_phases: 2
|
||||
total_plans: 14
|
||||
completed_plans: 13
|
||||
percent: 93
|
||||
completed_plans: 14
|
||||
percent: 17
|
||||
---
|
||||
|
||||
# Project State: Recipe
|
||||
@@ -25,23 +25,23 @@ progress:
|
||||
|
||||
## Current Position
|
||||
|
||||
Phase: 02 (authentication-foundation) — EXECUTING
|
||||
Plan: 7 of 7
|
||||
**Current focus:** Phase 02 — authentication-foundation
|
||||
**Current plan:** 7
|
||||
**Status:** Ready to execute
|
||||
**Phase progress:** 6 / 7 plans complete
|
||||
**Progress bar:** `[█████████░] 93%`
|
||||
Phase: 2.1 (app-shell-navigation-search-foundation) — READY TO PLAN
|
||||
Plan: not planned yet
|
||||
**Current focus:** Phase 2.1 — App Shell, Navigation & Search Foundation
|
||||
**Current plan:** none
|
||||
**Status:** Ready for detailed planning
|
||||
**Phase progress:** 0 / 0 plans created
|
||||
**Progress bar:** `[██░░░░░░░░] 17%`
|
||||
|
||||
## Performance Metrics
|
||||
|
||||
| Metric | Value |
|
||||
|--------|-------|
|
||||
| Phases planned | 11 |
|
||||
| v1 requirements | 72 |
|
||||
| Phases planned | 12 |
|
||||
| v1 requirements | 73 |
|
||||
| Coverage | 100% |
|
||||
| Phases complete | 1 |
|
||||
| Plans complete | 13 |
|
||||
| Phases complete | 2 |
|
||||
| Plans complete | 14 |
|
||||
| Phase 02 P02 | 13min | 3 tasks | 14 files |
|
||||
| Phase 02-authentication-foundation P03 | 31m | 2 tasks | 8 files |
|
||||
| Phase 02-authentication-foundation P06 | 34m | 3 tasks | 7 files |
|
||||
@@ -62,17 +62,19 @@ All locked tech-stack decisions are captured in `.planning/PROJECT.md § Key Dec
|
||||
|
||||
## Session Continuity
|
||||
|
||||
**Last session:** 2026-04-28T14:57:40.504Z
|
||||
**Last session:** 2026-05-07T00:00:00.000Z
|
||||
|
||||
**Next action:** `/gsd-execute-phase 2` — Authentication Foundation plan 07.
|
||||
**Next action:** `/gsd-discuss-phase 2.1` — App Shell, Navigation & Search Foundation, followed by `/gsd-plan-phase 2.1`.
|
||||
|
||||
**Research flags to revisit during future phase planning:**
|
||||
|
||||
- Phase 4 (SyncEngine): concrete cursor format, outbox schema ordering guarantees, retry/backoff policy.
|
||||
- Phase 10 (UI chrome): current Haze CMP-iOS perf on iPhone 11/12-era hardware; liquid-glass approximation patterns.
|
||||
- Phase 2.1 (App shell): validate current Composables / Compose Unstyled setup and Liquid `1.1.x` integration details before planning.
|
||||
- Phase 10 (UI chrome): real-device Liquid glass performance on iPhone 11/12-era hardware after real data exists.
|
||||
|
||||
---
|
||||
*Last updated: 2026-04-28*
|
||||
*Last updated: 2026-05-07*
|
||||
|
||||
**Planned Phase:** 1 (Project Infrastructure & Module Wiring) — 7 plans — 2026-04-24T16:07:36.289Z
|
||||
**Planned Phase:** 2 (Authentication Foundation) — 7 plans — 2026-04-28T08:30:48.000Z
|
||||
**Inserted Phase:** 2.1 (App Shell, Navigation & Search Foundation) — planning pending — 2026-05-07
|
||||
|
||||
Reference in New Issue
Block a user