docs(fase-5.14): document inline add-form UX change

Recorded in plan/fase-5-mobile-ux.md (new §5.14 with the six UX answers)
and CLAUDE.md "Fase 5 — what has been built" section. Also corrected the
"Fase 2a — what has been built" line that still claimed a sticky create
input for /lists, which was replaced by the masthead "New list" button
back in Fase 5.8.

Code change was committed in 3a11914.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-14 03:12:49 +02:00
parent 3a11914fc5
commit 12b7b7443f
2 changed files with 47 additions and 1 deletions

View File

@@ -442,6 +442,44 @@ Doble tap corto (≤ 300 ms entre toques) en una fila (en modo normal) abre un o
---
#### 5.14 Formulario de alta inline al final de la lista
**Cambio de UX:** el formulario de "añadir ítem" (lists) y "añadir tarea" (tasks) dejan de estar pegados al borde inferior del viewport y pasan a vivir **dentro del scroll**, como el último elemento de la sección sin marcar (unchecked / pending). Las sugerencias de frecuencia bajan **debajo** del input en vez de encima.
**Decisiones (respuestas del usuario a las preguntas 16):**
1. Posición del formulario → opción `a`: al final de *unchecked only*, justo encima de la sección Checked.
2. Scroll → inline puro. Sin FAB, sin auto-scroll.
3. Empty state → mensaje primero, formulario debajo (usuario puede añadir el primer ítem sin scrollear).
4. Sugerencias: input arriba, chips debajo. Mobile: scroll horizontal. Desktop: wrap (comportamiento actual de `ItemSuggestions`).
5. Aplica a `/lists/[id]` **y** `/tasks/[id]`.
6. Selection mode: el formulario se oculta.
**Cambios:**
- [x] `/lists/[id]/+page.svelte`:
- Eliminado el bloque `absolute bottom-0` con `backdrop-blur`.
- Nuevo snippet `addItemForm` renderizado (a) dentro de la rama empty-state y (b) entre las secciones unchecked y checked. Sólo se renderiza cuando `!selectionMode`.
- `ItemSuggestions` movido dentro del snippet, debajo del input.
- Padding inferior del scroll: `pb-32` → `pb-16 md:pb-6`.
- `data-testid="add-item-form"` añadido como hook de tests futuros.
- [x] `/tasks/[id]/+page.svelte`:
- Mismo patrón con `addTaskForm` (sin suggestions — `/tasks` no tiene `item_frequency`).
- `data-testid="add-task-form"`.
- Reposicionamiento sin cambiar el comportamiento de Enter / botón `+`.
**Tests:**
- Los tests existentes pasan sin cambios — los locators son `getByPlaceholder(/add item|añadir producto/i)` / `getByPlaceholder(/add task|añadir tarea/i)` y funcionan estén donde estén los inputs.
- Hooks `data-testid` añadidos por si se quieren assertions explícitos de ubicación más adelante.
**Criterio de aceptación:**
- Form no flota; scrollea con la lista.
- Sugerencias debajo del input en ambos breakpoints.
- En lista vacía: mensaje + form debajo.
- Selection mode: form desaparece (el action bar toma su lugar).
---
#### 5.13 Resistencia a contextos no-seguros (HTTP LAN)
**Problema descubierto tras deploy de la preview mobile:** el usuario abrió `http://192.168.1.167:5173` en el móvil (origen no-seguro) y `handleAdd` lanzó `TypeError: crypto.randomUUID is not a function`. `crypto.randomUUID` solo está expuesto en HTTPS, localhost, 127.0.0.1 o file:// — fuera de eso queda `undefined`.
@@ -464,6 +502,7 @@ Doble tap corto (≤ 300 ms entre toques) en una fila (en modo normal) abre un o
- 140 Vitest integration + 2 skipped presence (sin cambios)
- 15 Vitest unit (was 11, +4 generateId)
- 44 Playwright (was 43, +1 INS-01)
- [x] Inline add-form UX (5.14) verificado manualmente en DevTools mobile + desktop tras el refactor.
- [ ] Validación visual en DevTools iPhone 13 (390×844) + Pixel 7 (412×915) + Desktop (1280×800) — pendiente (manual, post-deploy).
- [x] `loginAs(USERS.borja)` con `page.setViewportSize(MOBILE)` activa el shell mobile automáticamente (verificado en M-01..M-04).
- [x] Seis commits incrementales (5.10.0 → 5.12 → 5.8 → 5.10 → 5.11) para facilitar revert o review por pasos.