diff --git a/.screenmap/SKILL.md b/.screenmap/SKILL.md index c5586e3..5452d09 100644 --- a/.screenmap/SKILL.md +++ b/.screenmap/SKILL.md @@ -17,7 +17,7 @@ The Methods tab has an "About this guide" row that opens a modal. ## Real params -- `/brew/:id` → the id is a method id: `v60`, `aeropress` or `french-press`. +- `/brew/:id` → the id is a method id: `v60`, `aeropress`, `french-press` or `moka-pot`. Use `v60`. Anything else falls back to the first method rather than erroring. ## Screens worth extra states diff --git a/README.md b/README.md index 9ea61a3..b5391d4 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,7 @@ on-screen. | `/method/v60` | Hario V60 — recipe, pour schedule, tips | | `/method/aeropress` | AeroPress | | `/method/french-press` | French Press | +| `/method/moka-pot` | Moka Pot | | `/brew/[id]` | Brew timer for one method | | `/grind` | Grind guide | | `/about` | About, presented as a modal | diff --git a/src/app/(tabs)/index.tsx b/src/app/(tabs)/index.tsx index 963fbcc..2ff2e80 100644 --- a/src/app/(tabs)/index.tsx +++ b/src/app/(tabs)/index.tsx @@ -30,6 +30,9 @@ export default function MethodsScreen() { + + + diff --git a/src/app/_layout.tsx b/src/app/_layout.tsx index 69a9531..68795b8 100644 --- a/src/app/_layout.tsx +++ b/src/app/_layout.tsx @@ -20,6 +20,7 @@ export default function RootLayout() { + diff --git a/src/app/method/moka-pot.tsx b/src/app/method/moka-pot.tsx new file mode 100644 index 0000000..337b6b7 --- /dev/null +++ b/src/app/method/moka-pot.tsx @@ -0,0 +1,19 @@ +import { Link } from 'expo-router'; + +import { BrewTimerButton } from '@/components/brew-button'; +import { MethodScreen } from '@/components/method-screen'; +import { methodById } from '@/data/methods'; + +export default function MokaPotRoute() { + const method = methodById('moka-pot')!; + return ( + + + + } + /> + ); +} diff --git a/src/data/methods.ts b/src/data/methods.ts index c4eed4a..53b3e48 100644 --- a/src/data/methods.ts +++ b/src/data/methods.ts @@ -120,6 +120,33 @@ export const METHODS: Method[] = [ 'Coarse means coarse. Fines are what make it muddy.', ], }, + { + id: 'moka-pot', + name: 'Moka Pot', + tagline: 'Stovetop, steam pressure', + ratio: '1:10', + dose: '18 g', + grind: 'fine', + water: '180 g, already boiling', + totalTime: 300, + body: 5, + clarity: 2, + effort: 3, + blurb: + 'Steam pressure from the bottom chamber pushes water up through the coffee in one continuous shot. It is not espresso and it is not filter — it is thick, dark and closer to a stovetop lungo than either.', + steps: [ + { at: 0, label: 'Fill hot', detail: 'Boiling water to just under the valve. Cold water stews the grounds.' }, + { at: 30, label: 'Level the basket', detail: 'Fine grind, level, never tamped. Tamping chokes it.' }, + { at: 60, label: 'Low heat', detail: 'Assemble with a towel, medium-low flame, lid open.' }, + { at: 210, label: 'Listen', detail: 'A steady gurgle means it is done. A violent splutter means it is over.' }, + { at: 270, label: 'Kill the heat', detail: 'Off the flame, base into cold water, pour straight away.' }, + ], + tips: [ + 'Start with boiling water — the shorter the metal sits on the flame, the less scorched it tastes.', + 'Never tamp. The basket only needs to be full and flat.', + 'Stop at the gurgle. Everything after it is the bitter tail.', + ], + }, ]; export function methodById(id: string): Method | undefined {