Agenda de hoy
- Sesión del Concejo Municipal Ver fuente
- Conversatorio sobre ciudad Detalles
Patrón canónico de agenda para periodismo2, comentario, editorial sebastián y lepp.
Primero el componente, después la variación de marca y finalmente su uso dentro de una página.
<section class="ui-sample ui-content" data-agenda="true"><h3>Agenda de hoy</h3><ol><li><time dateTime="2026-08-25T10:00:00-04:00">10:00</time> <span>Sesión del Concejo Municipal</span> <a href="#evento">Ver fuente</a></li><li><time dateTime="2026-08-25T18:30:00-04:00">18:30</time> <span>Conversatorio sobre ciudad</span> <a href="#evento-2">Detalles</a></li></ol></section>Cada cambio visible declara su autoridad; lo que permanece canónico no se vuelve a inventar en el producto.
Compara la propuesta con cortes reales del repositorio. La ausencia de una muestra se declara y nunca se reconstruye de memoria.
Preparando comparación histórica…
La comparación convierte una regla abstracta en una diferencia visible y verificable.
La prosa completa usa una voz técnica.La misma anatomía debe conservar lectura, foco y acciones sin cortar contenido ni crear scroll horizontal en la página.
| Dimensión | Contrato |
|---|---|
| Propietario canónico | Sistema de diseño CIS y equipo editorial · core/core-style |
| Consumidores | Periodismo2, Comentario, Editorial Sebastián y LEPP |
| Dependencias | prosa canónica, metadatos editoriales |
| Estado | candidato |
Patrón observado. 1 implementaciones observadas en 1 repositorios.
La observación demuestra uso existente; la aceptación canónica sigue dependiendo de esta ficha y de su propietario.
| Dato | Resultado |
|---|---|
| Clasificación | Patrón observado |
| Implementaciones | 1 implementaciones observadas |
| Repositorios | cds/cis/periodismo2-frontend |
| Snapshot | kit/componentes/componentes-observados.json |
El inventario conserva repositorio, archivo fuente y criterio de asociación. Observar una implementación no la convierte automáticamente en canónica.
| Estado requerido |
|---|
| base |
| destacado |
| archivo |
| contenido largo |
Copia el bloque completo; después cambia contenido y destinos, no su anatomía.
<section class="ui-sample ui-content" data-agenda="true"><h3>Agenda de hoy</h3><ol><li><time dateTime="2026-08-25T10:00:00-04:00">10:00</time> <span>Sesión del Concejo Municipal</span> <a href="#evento">Ver fuente</a></li><li><time dateTime="2026-08-25T18:30:00-04:00">18:30</time> <span>Conversatorio sobre ciudad</span> <a href="#evento-2">Detalles</a></li></ol></section>Copia el bloque completo; después cambia contenido y destinos, no su anatomía.
<section class="ui-sample ui-content border border-slate-300 bg-white p-4 text-slate-950 grid gap-3" data-agenda="true"><h3>Agenda de hoy</h3><ol class="grid gap-2"><li><time dateTime="2026-08-25T10:00:00-04:00">10:00</time> <span>Sesión del Concejo Municipal</span> <a class="underline underline-offset-4" href="#evento">Ver fuente</a></li><li><time dateTime="2026-08-25T18:30:00-04:00">18:30</time> <span>Conversatorio sobre ciudad</span> <a class="underline underline-offset-4" href="#evento-2">Detalles</a></li></ol></section>Copia el bloque completo; después cambia contenido y destinos, no su anatomía.
export interface AgendaItem {
/** Hora visible del evento (`10:00`). */
time: string;
/** Fecha y hora completas en ISO 8601 para el atributo `datetime` de `<time>`. */
dateTime?: string;
/** Nombre del evento. */
title: string;
/** Enlace a la fuente o al detalle del evento; vacío oculta el enlace. */
href?: string;
/** Texto del enlace de este evento (`Ver fuente`); si falta, se usa el `linkLabel` de la agenda. */
linkLabel?: string;
}
export interface AgendaProps {
/** Título de la agenda. */
title?: string;
/** Eventos en orden cronológico. */
items?: AgendaItem[];
/** Texto del enlace para los eventos que no traen `linkLabel` propio. */
linkLabel?: string;
className?: string;
}
const AGENDA_ITEMS: AgendaItem[] = [
{ time: "10:00", dateTime: "2026-08-25T10:00:00-04:00", title: "Sesión del Concejo Municipal", href: "#evento", linkLabel: "Ver fuente" },
{ time: "18:30", dateTime: "2026-08-25T18:30:00-04:00", title: "Conversatorio sobre ciudad", href: "#evento-2", linkLabel: "Detalles" },
];
/**
* Agenda del día: lista ordenada de eventos con hora, nombre y enlace a la fuente o al detalle, para secciones de ciudad o coberturas.
*
* Cada enlace usa el `linkLabel` del evento o, si falta, el de la agenda.
*
* @example <Agenda title="Agenda de mañana" items={[{ time: "10:00", dateTime: "2026-08-26T10:00:00-04:00", title: "Sesión del Concejo Municipal", href: "/concejo", linkLabel: "Ver fuente" }]} />
*/
export function Agenda({ title = "Agenda de hoy", items = AGENDA_ITEMS, linkLabel = "Detalles", className }: AgendaProps) {
if (!items.length) return null;
return (
<section className={["ui-content", className].filter(Boolean).join(" ")} data-agenda>
{title ? <h3>{title}</h3> : null}
<ol>
{items.map((item, i) => {
const enlace = item.linkLabel || linkLabel;
return (
<li key={`${item.title}-${i}`}>
<time dateTime={item.dateTime}>{item.time}</time>{" "}
<span>{item.title}</span>
{item.href && enlace ? <>{" "}<a href={item.href}>{enlace}</a></> : null}
</li>
);
})}
</ol>
</section>
);
}