feat: EduEasy checkpoint - plan, scaffolding, pedagogia modules, components child+parent, API routes, Prisma schema, Docker infra, Better Auth

This commit is contained in:
Renato
2026-07-20 17:58:49 +02:00
commit e69b18abaa
49 changed files with 9842 additions and 0 deletions
+219
View File
@@ -0,0 +1,219 @@
# EduEasy — Plan de Plataforma
## Arquitectura General
Plataforma educativa para una nena de 8 años con déficit de atención, baja abstractividad, que no sabe leer ni contar (bases malas en 1er grado). Dos caras en un mismo server:
| App | Dominio | Dispositivo | Usuario |
|-----|---------|-------------|---------|
| **Aprendizaje** | `mate.cbcren.online` | iPad Air 4 (solo dedo) | La nena |
| **Dashboard** | `simulacro.cbcren.online` | Poco F6 Pro | La mamá |
**Stack**: Next.js 15 + React 19 + TypeScript estricto + Tailwind CSS + shadcn/ui + Better Auth + Prisma + PostgreSQL + ts-fsrs
**Deploy**: All-in-one Docker (un proceso Next.js + Postgres) en red `caddy` del server existente (194.163.191.200)
## Decisiones de Diseño Cerradas
| Decisión | Respuesta |
|----------|-----------|
| **Mascota** | 🐱 **Gato** — guía las sesiones con instrucciones en audio, celebra logros, da feedback en errorless learning. Sin nombre fijo aún. |
| **Paleta** | **Calmada** — fondo `#FFF8F0` crema/beige, primario `#8CB8A0` verde salvia, secundario `#6B8FA3` azul medio, acento `#D4A574` terracota, texto `#2D3436` (no negro puro). Bajas saturaciones en todos. |
| **Audio** | **TTS por ahora** (Web Speech API, voz es-ES femenina). Se reemplaza por grabaciones reales es-AR en Fase 4+ cuando el contenido esté validado. |
---
## Pedagogía (Métodos Europeos)
| Área | Método | Aplicación |
|------|--------|------------|
| **Lectura** | Borel-Maisonny (FR) | Cada fonema tiene un gesto físico + sonido. La nena hace el gesto en el aire + traza con el dedo en la pantalla + escucha el audio. |
| **Lectura** | Jolly Phonics (UK) adaptado | Orden de aprendizaje: no A-B-C, sino por frecuencia de uso. Vocales primero (A, E, I, O, U) + consonantes sonoras continuas (S, M, L, N). |
| **Lectura** | Método silábico | Español = 5 vocales puras, sílabas CV, CVC, CCV. Silabeo sistemático desde el día 1. |
| **Numeración** | CPA (Concrete-Pictórico-Abstracto) | **Concreto**: objetos (tapitas virtuales para contar). **Pictórico**: dibujos de objetos. **Abstracto**: el número símbolo. |
| **Numeración** | Regletas Cuisenaire (Bélgica) | Cantidad como barra de color. 1=blanco, 2=rojo, 3=verde claro... La nena ve y toca la cantidad sin "contar" abstractamente. |
| **Internalización** | Galperin (URSS) | **1. Mano**: manipular objetos. **2. Voz externa**: decir en voz alta. **3. Voz interna**: susurrar. **4. Mental**: hacerlo en la cabeza. |
| **Errores** | Errorless learning | **Nunca** se muestra "incorrecto". Si titubea, el sistema da la pista más obvia (modelado). Si persiste el error, fadea la ayuda. |
| **Refuerzo** | Fijo y predecible | Sin slots, sin FOMO, sin rachas ansiosas. Estrellita predecible después de cada ronda completa. |
| **Sesiones** | Chunking estructurado | 10-15 min máximo. Temporizador visual tipo Time Timer. Micro-pausa motora cada 5 min (saltar, aplaudir). |
---
## Stack Técnico
```
Frontend: Next.js 15 (App Router) + React 19 + TypeScript + Tailwind CSS
UI Lib: shadcn/ui (componentes base)
Auth: Better Auth (login mamá + QR pairing → JWT device-bound para nena)
DB: PostgreSQL + Prisma ORM
Spaced Rep: ts-fsrs (Free Spaced Repetition Scheduler)
Canvas: perfect-freehand (trazo con dedo) + @use-gesture/react
Audio: Web Speech API (TTS es-ES/es-MX, confirmado: TTS por ahora → reemplazar con grabaciones reales es-AR en Fase 4+)
Animación: framer-motion (transiciones lentas 300-500ms, sin sparkles)
Charts: Recharts (dashboard mamá)
Deploy: Docker + red caddy existente
```
### Repos reutilizados
- `ts-fsrs` (npm) — algoritmo FSRS de repetición espaciada
- `perfect-freehand` (npm) — trazado fluido con dedo (Excalidraw)
- Better Auth (npm) — auth + device pairing
- shadcn/ui (npm) — componentes base de UI
- Math Learning Center apps — referencia UX de manipulativos virtuales (number-rack, ten-frames)
---
## Modelo de Datos
```prisma
model Family { id, name, created_at }
model Parent { id, family_id, email, name, auth_provider }
model Child { id, family_id, name, avatar, birthdate, profile_notes }
model Device { id, child_id, device_fingerprint, paired_at, last_seen, role }
model Session { id, child_id, started_at, ended_at, duration_sec, skills_practiced }
model SkillAttempt { id, session_id, skill_code, prompt_level, correct, response_ms }
model FsrsCard { id, child_id, skill_code, due_at, stability, difficulty, reps, lapses }
model Milestone { id, child_id, skill_code, reached_at }
```
---
## Estructura del Proyecto
```
/home/ren/edueasy/
├── app/
│ ├── globals.css
│ ├── layout.tsx # Raíz (fonts, metadata)
│ ├── page.tsx # Redirige según host
│ ├── child/ # mate.cbcren.online
│ │ ├── layout.tsx # Layout infantil (gato, audio siempre presente)
│ │ ├── page.tsx # Menú principal de la nena
│ │ ├── sesion/
│ │ └── logros/
│ ├── parent/ # simulacro.cbcren.online
│ │ ├── layout.tsx # Layout dashboard + sidebar
│ │ ├── page.tsx # Dashboard principal
│ │ ├── auth/login/
│ │ ├── auth/pairing/
│ │ └── configuracion/
│ └── api/
│ ├── auth/[...all]/ # Better Auth handler
│ ├── pairing/ # QR pairing endpoint
│ └── sessions/sync/ # Sync offline → server
├── components/
│ ├── ui/ # shadcn/ui
│ ├── child/ # Componentes de la nena
│ │ ├── gato-mascota
│ │ ├── trazo-letra (canvas tracing)
│ │ ├── vocal-card
│ │ ├── cuisenaire-rod
│ │ ├── temporizador-visual
│ │ └── boton-grande (60-80px)
│ └── parent/ # Componentes del dashboard
├── lib/
│ ├── db.ts (Prisma client)
│ ├── auth.ts (Better Auth server)
│ ├── auth-client.ts
│ ├── speech.ts (Web Speech API)
│ ├── fsrs.ts (ts-fsrs wrapper)
│ └── pedagogia/
│ ├── borel-maisonny.ts (fonemas + gestos)
│ ├── cuisenaire.ts (regletas)
│ ├── errorless.ts (prompt fading)
│ └── cpa-progression.ts (CPA estados)
├── prisma/schema.prisma
├── middleware.ts (host-based routing)
├── Dockerfile
├── docker-compose.yml
├── package.json
├── tsconfig.json
├── next.config.ts
├── tailwind.config.ts
├── postcss.config.js
├── components.json (shadcn/ui)
└── .env.local
```
---
## UX Constraints (iPad Air 4 + Dedo)
- **Touch targets**: 6080px mínimo (baselines adultos 44px no alcanzan para niños)
- **Drag > Tap** para interacciones principales
- **Una sola acción focal** por pantalla
- **100% iconografía + audio** (la nena NO LEE)
- **Sin "X roja"** nunca — sonido neutro + mascota dice "probemos juntas"
- **Fondo claro baja saturación** (crema/beige) + acentos verde salvia + azul medio
- **Botón "Tocá para empezar"** en cada sesión (unlock AudioContext en iOS Safari)
- **Persistencia al backend siempre** (Safari evicta IndexedDB a 7 días)
### iOS Safari Técnico
- Audio: .m4a primario + .mp3 fallback. **NUNCA .ogg**.
- AudioContext: requiere user gesture para desbloquear.
- `100dvh` en vez de `100vh` (barra de Safari).
- `touch-action: manipulation` para eliminar delay 300ms.
- inputs con `font-size: 16px` mínimo (evita zoom automático).
---
## Roadmap
### Fase 0 — Fundaciones (1-2 sem)
- [x] Repositorio + package.json + configs
- [x] Docker + docker-compose
- [x] Prisma schema + migración
- [x] Better Auth + QR pairing
- [x] Design system base (gato mascota, paleta, component primitives)
- [x] Caddy config update
### Fase 1 — Lectura MVP
- [ ] Módulo vocales: A, E, I, O, U
- [ ] Audio TTS para cada fonema + palabra ejemplo
- [ ] Gesto Borel-Maisonny (animación + instrucción)
- [ ] Trazo con dedo (canvas + perfect-freehand)
- [ ] Sesión guiada 10 min + temporizador visual
- [ ] Errorless learning + fading automático
- [ ] Logros por vocal completada
### Fase 2 — Numeración MVP
- [ ] Módulo cantidades 1-5 (expandir a 10)
- [ ] CPA: objetos → imagen → símbolo
- [ ] Regletas Cuisenaire virtuales (arrastrar, comparar)
- [ ] Conteo one-to-one con arrastre
- [ ] Galperin: mano → voz → cabeza
### Fase 3 — Adaptativo + Dashboard
- [ ] ts-fsrs: repaso espaciado por skill
- [ ] Dashboard mamá: streak, tiempo, mastery %, último resumen
- [ ] Push notifications al Poco F6 Pro
- [ ] QR pairing funcional
- [ ] Export de progreso
### Fase 4+ (futuro)
- [ ] Consonantes y sílabas completas
- [ ] Números 11-100, suma/resta
- [ ] Grabaciones de audio real (es-AR)
- [ ] IA adaptativa (Ollama/Open WebUI)
---
## Diseño Visual
**Mascota**: 🐱 Gato (sin nombre definido — que la nena lo nombre).
- Guía las sesiones, da instrucciones en audio, celebra logros.
- Animaciones suaves (no bruscas), tamaño grande en pantalla.
**Paleta**:
- Fondo: `#FFF8F0` (crema suave)
- Primario: `#8CB8A0` (verde salvia)
- Secundario: `#6B8FA3` (azul medio)
- Acento: `#D4A574` (terracota suave)
- Texto: `#2D3436` (gris oscuro, no negro puro)
- Correcto: `#7FB685` (verde suave, no brillante)
**Tipografía**:
- Títulos: Fredoka One (redondeada, amigable, legible)
- Interface: Inter (sistema, para dashboard de la mamá)
- La nena no ve texto — solo escucha. Las letras aparecen grandes, claras, bien trazadas.
---