Descripción
Componentes React y página Astro que conforman la UI del menú Correo (F0): vista completa del informe de buzón Zoho y widget compacto de dashboard.
Archivos:
src/components/correo/CorreoPage.tsx(181 LOC)src/components/widgets/CorreoWidget.tsx(93 LOC)src/pages/correo/index.astro(14 LOC)
Componentes
CorreoPage.tsx
Propósito: vista detallada del informe de /correo del miembro logueado.
Estado:
digest: último informe de D1 (null si no existe).loading: estado de carga desde GET/api/correo/digest.
Funciones auxiliares:
fmtFecha(iso: string): formatea timestamp ISO 8601 a formato legible ES (ej: “mié 12 ago 11:27”).ItemCard({ item }): renderiza un ítem individual con estilos (urgente en rojo, enlace a Zoho).
Layout:
-
Encabezado (
tools-page-header):- Eyebrow: “Correo”
- Título: “Tu buzón, digerido”
- Subtitle: fecha/hora de la última pasada.
-
Estado vacío: si no hay informe, aviso explicativo.
-
Secciones (si hay informe):
- Actúa (
nivel='actua'): ítems que requieren acción.- Tarjeta por ítem con remitente, asunto, “por qué importa”.
- Badge rojo “urgente” si aplica.
- Botón “Abrir en Zoho” (target=“_blank”).
- Entérate (
nivel='enterate'): solo informativos.- Mismo layout, sin urgencia esperada.
- Actúa (
-
Estadística final: línea con conteo de ruido filtrado.
Estilos:
- Tarjetas con borde izquierdo (rojo si urgente, transparente si no).
- KPI sutil para contadores.
- Responsive: flex column, gaps consistentes.
Comportamiento:
- En localhost (dev): no realiza fetch, muestra loading=false.
- En producción: GET
/api/correo/digestal montar. - Manejo de errores: catch silencioso,
digest=null.
CorreoWidget.tsx
Propósito: widget compacto para el dashboard principal (bento blue). Resume contadores y urgencias.
Estado:
digest: último informe.loading: carga desde GET/api/correo/digest.
Contenido:
- KPI visual:
N actúa · M entérate(en grande, Oswald bold). - Aviso de urgencias: si hay items
urgente=true, muestra en rojoX urgente(s) esperándote. - Marca de tiempo y ruido:
Última pasada: HH:mm · ruido filtrado: {count}.
Interactividad:
- Toda el área es clickable (
<a href="/correo">). - Sin decoración de link; hereda color foreground.
Comportamiento:
- Mismo localhost bypass que CorreoPage.
- Fallback a empty-state: “Sin informe aún”.
Página Astro: /correo
Archivo: src/pages/correo/index.astro
Layout: BaseLayout con título “Correo”.
Contenido: monta <CorreoPage client:load /> (React, hidratado en el cliente).
Estructura:
<BaseLayout title="Correo">
<div class="app-body">
<main>
<div class="mx-auto max-w-6xl px-6 py-8">
<CorreoPage client:load />
</div>
</main>
</div>
</BaseLayout>
Integración en navegación
El menú Correo aparece en:
-
Sidebar (
src/components/shell/Sidebar.tsx):- Entrada:
{ title: 'Correo', icon: 'mail', href: '/correo' } - Icono SVG custom (sobre abierto).
- Entrada:
-
BottomNav (
src/components/shell/BottomNav.tsx):- En submenu “Tareas”:
{ label: 'Correo', href: '/correo' }
- En submenu “Tareas”:
-
Navigation (
src/lib/navigation.ts):- Item en array principal.
-
DesktopA (
src/components/variants/desktop/DesktopA.tsx):- Widget Correo en el grid de bento cards (glow-blue, animate-in d-5).
- Encabezado con botón “Ver informe” →
/correo.
Flujo de datos
GET /api/correo/digest (D1)
↓
CorreoPage / CorreoWidget
↓
Filtra items por nivel + urgencia
↓
ItemCard renderiza remitente, asunto, porque, zoho_link
Estilos y diseño
- Clases CSS:
.tools-page-header,.tools-section-title,.tools-empty,.bento,.card-head. - Variables CSS:
--text-sm,--text-xs,--fg-dim,--fg-muted,--danger,--grad-blue. - Icono Sidebar: SVG simple de sobre (
<rect>+<path>).
Testing
- Build local: 2302 páginas ✅
- Prettier: pasado ✅
- E2E: pendiente (pasada real → widget).
Véase también
- [[entity—functions—endpoint—correo-digest]]
- [[feature—workspace—correo-menu-f0]]
- [[entity—migrations—table—correo-digests]]
- [[concept—workspace—ui-patterns]]
- [[concept—workspace—dashboard]]