Klidná PWA na měření kontrakcí při porodu: délka, rozestupy (start-to-start), klouzavé průměry za poslední hodinu a upozornění podle pravidla 5-1-1. Minimalistické, soft-pink UX navržené tak, aby ho zvládla rodící žena.
- Fáze 1 (hotovo): plně funkční offline jádro — bez loginu, data jen v zařízení (localStorage). Instalovatelné na plochu, nezhasíná obrazovku (Wake Lock), čeština + angličtina.
- Fáze 2 (hotovo): účty (Google + email/heslo přes Auth.js) a záloha / synchronizace dat do Neon Postgres (Drizzle). Offline-first se synchronizací last-write-wins a tombstonami pro mazání.
- Další (hotovo): export dat do CSV (na
/ucet), dark mode s přepínačem vzhledu (auto / světlý / tmavý, default dle systému), uvítací banner pro nové uživatele (nabídne přihlášení, neblokuje měření). - Fáze 3 (zbývá): deploy na Vercel.
- Next.js 16 (App Router) + React 19 + TypeScript
- Tailwind CSS v4
- PWA (manifest + ikony), Wake Lock API
- Cíl deploye: Vercel, databáze: Neon Postgres (fáze 2)
npm install
npm run devPozn.: porty 3000/3100 na tomto stroji obsazují jiné projekty — dev server
běží na PORT=4321 npm run dev → http://localhost:4321
npm run build # produkční build
npm run lint # eslintsrc/
app/
layout.tsx # metadata, viewport, I18nProvider
page.tsx # hlavní obrazovka
manifest.ts # PWA manifest
icon.svg # favicon
apple-icon.tsx # iOS home-screen ikona (generovaná)
globals.css # soft-pink design systém
components/
ContractionTracker.tsx # hlavní stavová komponenta
HistoryList.tsx
LanguageToggle.tsx
I18nProvider.tsx
lib/
stats.ts # výpočty: délka, rozestup, průměry, pravidlo 5-1-1
storage.ts # localStorage repozitář
format.ts # formátování času (cs/en)
i18n.ts # slovníky cs/en
useWakeLock.ts # nezhasínání obrazovky
useMounted.ts # hydratačně bezpečné čtení client-only hodnot
Kontrakce ~5 minut od sebe, každá ~1 minutu dlouhá, po dobu ~1 hodiny.
Výpočet je v src/lib/stats.ts (fiveOneOne). Není to lékařská rada —
appka jen zobrazuje vzor; rozhodující jsou pokyny porodnice / lékaře.
Env proměnné (v .env.local, vzor v ENV.sample):
DATABASE_URL— connection string z NeonAUTH_SECRET—npx auth secretGOOGLE_CLIENT_ID,GOOGLE_CLIENT_SECRET— Google Cloud Console (redirect URIhttp://localhost:4321/api/auth/callback/googlepro vývoj,https://<doména>/api/auth/callback/googlepro produkci)
Databázové schéma:
npx drizzle-kit push # vytvoří / aktualizuje tabulky v NeonuKlíčové soubory: src/auth.ts (Auth.js), src/db/schema.ts (Drizzle schéma),
src/app/api/{auth,register,sync} (API), src/lib/sync.ts (klient sync).
Přihlašovací stránka /prihlaseni, účet /ucet.
Do Vercel projektu nastav stejné env proměnné, přidej produkční doménu do Google OAuth redirect URIs a nasaď. Databáze zůstává Neon.