8.4 KiB
8.4 KiB
SPEC 01 — Home: feed de la guardería (plantilla feed.dc.html)
Estado: Verificada (2026-10-20) Depende de: — Fecha: 2026-10-19 Objetivo: Implementar la plantilla
references/pantallas/feed.dc.htmlcomo página home (/) en Next.js, visualmente idéntica al original, sin autenticación ni base de datos.
Alcance
In:
- Página
/(app/page.tsx) con: sidebar sticky de 248px (logo OpenDayCare · Sala Soles, botón "Nueva publicación", nav con Feed activo + Niños/Avisos/Mi cuenta, tarjeta de usuario "Caro Giménez" con logout), saludo ("GUARDERÍA · SALA SOLES" / "Buenas, Caro" / "12 niños · martes 17 jun"), caja "Compartí un momento…", separador "PUBLICADO HOY" y los 3 posts de la plantilla (logro, actividad con placeholder de foto, anuncio). - Datos mock tipados en
app/data/feed.tscon los 3 posts exactos de la plantilla. - Componentes en
app/components/:Sidebar.tsx,FeedHeader.tsx,ShareBox.tsx,PostCard.tsx. - Cambio de fuentes en
app/layout.tsx(Fredoka + Nunito víanext/font/google),lang="es"y metadata "OpenDayCare". - Estilos base en
app/globals.css(fondo #F6ECDF, texto #3F362E, scrollbar custom, tema claro fijo). - Todos los links como
<Link>a rutas futuras (/crear-publicacion,/ninos,/avisos,/mi-cuenta,/detalle-publicacion,/login,/foto— este último en el placeholder de foto, comofoto.dc.htmlen la plantilla).
Out of scope (para specs futuras):
- Las páginas destino del nav y sus funcionalidades (hoy darán 404 y está bien).
- Autenticación y logout funcional.
- Base de datos y persistencia.
- Interactividad real de likes, comentarios y editar (solo visual, contadores fijos).
- Responsive móvil.
- Dark mode.
- Foto real en el post de actividad (se mantiene el placeholder dashed de la plantilla).
Modelo de datos
// app/data/feed.ts
export type PostCategory = "logro" | "actividad" | "anuncio";
export interface Post {
id: string;
authorName: string; // "Mateo" | "Anuncio general"
authorInitial: string; // "M" (solo posts de niño)
authorColors: { bg: string; text: string }; // p.ej. { bg: "#A9D9E8", text: "#1F7A93" }
timeLabel: string; // "14:20"
publishedBy: string; // "publicado por vos"
category: PostCategory; // define badge y colores vía mapa en PostCard
audience: string; // "familia de Mateo" | "toda la sala"
body: string;
photoLabel?: string; // "pintando con témperas" → placeholder dashed
likes: number;
comments: number;
}
export const posts: Post[] = [
// Los 3 posts de la plantilla: logro (3/1), actividad con foto (5/2), anuncio (8/0)
];
Convenciones: los colores van como hex exactos de la plantilla; el mapa category → colores del badge vive en PostCard.tsx.
Plan de implementación
- Fuentes y layout —
app/layout.tsx: reemplazar Geist por Fredoka y Nunito como fuentes variables connext/font/google(variables--font-fredoka/--font-nunito),lang="es", title "OpenDayCare". Test manual:npm run devsigue compilando. - Estilos globales —
app/globals.css: body conbackground:#F6ECDF,color:#3F362E,font-family: var(--font-nunito), system-ui, sans-serif; scrollbar custom (thumb#E4D6C4); eliminar el bloqueprefers-color-schemey las variables Geist. Test manual: la app ya se ve crema. - Mock del feed — crear
app/data/feed.tscon el tipoPosty los 3 posts de la plantilla. - Sidebar — crear
app/components/Sidebar.tsxcon logo, botón "Nueva publicación" (→/crear-publicacion), nav (Feed activo, Niños, Avisos, Mi cuenta) y usuario + logout (→/login). - Componentes del feed — crear
FeedHeader.tsx,ShareBox.tsxyPostCard.tsxcon utilities Tailwind de valores exactos. - Página home — reemplazar
app/page.tsx: flex con Sidebar +<main>de scroll propio, contenido centradomax-width:760px, mapeandoposts. Test manual:http://localhost:3000muestra el feed completo. - Fidelidad visual — comparación lado a lado con
references/pantallas/feed.dc.htmla ancho ≥1280px; ajustar diferencias. Captura de verificación en.playwright-mcp/.
Criterios de aceptación
npm run devlevanta sin errores y/muestra el feed completo: sidebar + saludo + caja + separador + 3 posts. (Verificado 2026-10-20 enlocalhost:3001a 1440×900; consola sin errores de compilación ni hidratación. Capturas:.playwright-mcp/verify-feed-app-1440.png,.playwright-mcp/verify-feed-app-bottom.png.)npm run buildcompleta sin errores. (Next.js 16.4.2 + Turbopack: compilación, TypeScript y prerender de/OK.)- A ancho ≥1280px el layout coincide con la plantilla: sidebar 248px sticky, main con scroll propio y contenido centrado de 760px. (Computed styles:
aside248px sticky top-0 h-screen;mainh-screen overflow-y auto; contenedor max-width 760px centrado — márgenes 211px/211px a 1440px.) - Fredoka en logo, saludo y nombres de autor; Nunito (pesos 400–800) en el resto. (Computed: Fredoka 17px/600 logo, 30px/600 h1, 16.5px/600 autores; Nunito 400 texto, 600 nav inactivo, 700 likes, 800 eyebrow/nav activo. Fuentes variables self-hosted vía
next/font/google.) - Post 1: badge LOGRO (fondo
#CFEBD8, texto#3E9B6C), ♥ 3, 💬 1, link "Editar". (Computed:rgb(207,235,216)/rgb(62,155,108); acciones 3 / 1 / Editar →/crear-publicacion.) - Post 2: badge ACTIVIDAD (fondo
#C7E7F1, texto#2E89A6), placeholder dashed "Foto · pintando con témperas", ♥ 5, 💬 2. (Computed:rgb(199,231,241)/rgb(46,137,166); placeholder dashed 1.5px#DBCDBA, 200px alto, link a/foto; acciones 5 / 2.) - Post 3: avatar megáfono (fondo
#CCD8F4), badge ANUNCIO, "Para: toda la sala", ♥ 8, 💬 0. (Computed: avatar 44pxrgb(204,216,244)con SVG megáfono idéntico a la plantilla; badgergb(204,216,244)/rgb(78,114,200); acciones 8 / 0.) - Todos los links navegan con
<Link>:/crear-publicacion(botón, caja y Editar),/ninos,/avisos,/mi-cuenta,/detalle-publicacion(íconos de comentarios),/login(logout),/foto(placeholder de foto). (Hrefs del DOM verificados;next/linkimportado en Sidebar, ShareBox y PostCard; sin<a>planos.) - Colores base exactos: fondo
#F6ECDF, tarjetas#FFFDF9con borde#ECE0D0, sombras y radios según plantilla. (Computed: bodyrgb(246,236,223); tarjetasrgb(255,253,249), borde 1pxrgb(236,224,208), radio 20px, sombrargba(120,90,60,.5) 0 4px 16px -12px; caja 18px.) - Con el sistema en modo oscuro la página se mantiene en tema claro (sin dark mode). (Emulación
prefers-color-scheme: darken Playwright: body, aside y tarjetas mantienen sus colores claros. Captura:.playwright-mcp/verify-feed-darkmode.png.) - Los componentes nuevos no usan atributos
style; todo está en utilities Tailwind con valores arbitrarios exactos. (Grepstyle=enapp/**/*.{tsx,css}: 0 resultados; los únicos[style]del DOM son internos de Next.js —nextjs-portal,next-route-announcer— fuera de los componentes.)
Decisiones
- Sí: Tailwind 4 con valores arbitrarios exactos (
bg-[#F6ECDF],shadow-[0_4px_16px_-12px_rgba(120,90,60,.5)]…) — consistente con el proyecto y pixel-perfect. - No: estilos inline literales ni CSS Modules — divergen de la convención del repo.
- Sí: componentes separados en
app/components/— el sidebar se reutiliza en Niños, Avisos y Mi cuenta. - Sí: mock tipado en
app/data/feed.ts— deja el terreno listo para la BD futura. - Sí:
<Link>a rutas futuras aunque hoy den 404 — la navegación queda cableada desde el día uno. - Sí: solo desktop, réplica exacta — el móvil merece decisiones de diseño propias (otra spec).
- Sí:
next/font/googlepara Fredoka y Nunito como fuentes variables — misma familia y pesos que el<link>de la plantilla, self-hosted y sin FOUT. - Sí: tema claro fijo, eliminando el dark mode automático de
globals.css— la plantilla no define modo oscuro. - No: autenticación, BD, likes/comentarios/editar funcionales ni foto real — excluidos explícitamente por el usuario.
Qué no está en esta spec
- Otras páginas (Niños, Avisos, Mi cuenta, crear/editar publicación, detalle, login) — cada una irá en su propia spec.
- Autenticación y base de datos.
- Likes, comentarios y edición funcionales.
- Responsive móvil y dark mode.