Saltar al contenido
Índice de Kit UI
Kit UI Componentes

Encabezado de artículo.

Patrón canónico de encabezado de artículo para periodismo2, comentario, editorial sebastián y lepp.

Verlo por niveles

Primero el componente, después la variación de marca y finalmente su uso dentro de una página.

Nivel 1Componente canónico

Santiago cambia a escala de barrio

Un recorrido por las decisiones que cambian el espacio público y su evidencia.

· · 4 min
Nivel 3Dentro de una página
Sitio · sección

Santiago cambia a escala de barrio

Un recorrido por las decisiones que cambian el espacio público y su evidencia.

· · 4 min
Ver y copiar el código de este render
HTML del nivel canónico
<header class="ui-sample ui-content" data-article-header="true"><h2>Santiago cambia a escala de barrio</h2><p>Un recorrido por las decisiones que cambian el espacio público y su evidencia.</p><div><a rel="author" href="#autor">Sebastián Illanes</a> · <time dateTime="2026-08-25">25 de agosto de 2026</time> · 4 min</div></header>

Variaciones por marca y sitio

Cada cambio visible declara su autoridad; lo que permanece canónico no se vuelve a inventar en el producto.

comentario.cl

Comentario

Autoridad: CANON.md + decisión editorial de producto

Santiago cambia a escala de barrio

Un recorrido por las decisiones que cambian el espacio público y su evidencia.

· · 4 min

Cambia en esta marca

  • Namebrand comentario.cl en celeste
  • Mayor ancho de prosa e imágenes editoriales

Permanece canónico

  • Chrome, foco y controles canónicos
  • Autoría, fecha, fuente y jerarquía semántica
circulodesantiago.cl

Editorial Sebastián

Autoridad: Feedback de revisión r14 + capa CDS

Una decisión explicada con evidencia

y · · 9 min

Cambia en esta marca

  • Editorial Sebastián en rojo, con E y S mayúsculas
  • Atribución societaria a Círculo de Santiago

Permanece canónico

  • Caja normal y espaciado legible
  • Anatomía editorial y accesibilidad canónicas

Comparación histórica recuperable

Compara la propuesta con cortes reales del repositorio. La ausencia de una muestra se declara y nunca se reconstruye de memoria.

Estado actual
Encabezado de artículo no tiene una implementación vigente demostrada; sus ejemplos son material candidato.
Cambio propuesto
Publicar en r19 el contrato de Encabezado de artículo para Patrón canónico de encabezado de artículo para periodismo2, comentario, editorial sebastián y lepp.
Qué ocurre si respondes No
Encabezado de artículo queda fuera de r19 y sus ejemplos siguen sólo como evidencia pendiente de reformulación.

Preparando comparación histórica…

Antes / r19

La comparación convierte una regla abstracta en una diferencia visible y verificable.

r19 · correctoContrato canónico renderizado

Santiago cambia a escala de barrio

Un recorrido por las decisiones que cambian el espacio público y su evidencia.

· · 4 min
  • Prioriza título, evidencia, autoría y una prosa legible.
  • Usa el namebrand y el color editorial propios sin alterar el canon.
Antes · problema observadoAnti-ejemplo no interactivo
NUEVO · DESTACADO · LECTURAUn título subordinado a etiquetasLa prosa completa usa una voz técnica.
  • No llenes la página de epígrafes o etiquetas redundantes.
  • No uses JetBrains Mono como voz editorial ni prosa principal.

Responsive

La misma anatomía debe conservar lectura, foco y acciones sin cortar contenido ni crear scroll horizontal en la página.

320 pxMóvil y zoom

Santiago cambia a escala de barrio

Un recorrido por las decisiones que cambian el espacio público y su evidencia.

· · 4 min
1280 pxEscritorio

Una decisión explicada con evidencia

y · · 9 min

Cobertura

DimensiónContrato
Propietario canónicoSistema de diseño CIS y equipo editorial · core/core-style
ConsumidoresPeriodismo2, Comentario, Editorial Sebastián y LEPP
Dependenciasprosa canónica, metadatos editoriales
Estadocandidato

Evidencia de adopción

Patrón propuesto. 0 implementaciones observadas en 0 repositorios.

La observación demuestra uso existente; la aceptación canónica sigue dependiendo de esta ficha y de su propietario.

DatoResultado
ClasificaciónPatrón propuesto
Implementaciones0 implementaciones observadas
RepositoriosNingún repositorio observado
Snapshotkit/componentes/componentes-observados.json

Consumidores observados

El inventario conserva repositorio, archivo fuente y criterio de asociación. Observar una implementación no la convierte automáticamente en canónica.

Estados

Estado requerido
base
destacado
archivo
contenido largo

Accesibilidad

  • Conserva nombre accesible, orden de lectura y foco visible.
  • Funciona a 320 px, con zoom de 200% y texto largo.
  • El color nunca es la única señal de estado o acción.
  • El contenido esencial permanece disponible sin JavaScript.

Código HTML

Copia el bloque completo; después cambia contenido y destinos, no su anatomía.

Código de referencia
<header class="ui-sample ui-content" data-article-header="true"><h2>Santiago cambia a escala de barrio</h2><p>Un recorrido por las decisiones que cambian el espacio público y su evidencia.</p><div><a rel="author" href="#autor">Sebastián Illanes</a> · <time dateTime="2026-08-25">25 de agosto de 2026</time> · 4 min</div></header>

Código TAILWIND

Copia el bloque completo; después cambia contenido y destinos, no su anatomía.

Código de referencia
<header class="ui-sample ui-content border border-slate-300 bg-white p-4 text-slate-950 flex flex-wrap items-center justify-between gap-3" data-article-header="true"><h2>Santiago cambia a escala de barrio</h2><p>Un recorrido por las decisiones que cambian el espacio público y su evidencia.</p><div><a class="underline underline-offset-4" rel="author" href="#autor">Sebastián Illanes</a> · <time dateTime="2026-08-25">25 de agosto de 2026</time> · 4 min</div></header>

Código REACT

Copia el bloque completo; después cambia contenido y destinos, no su anatomía.

Código de referencia
import type { ReactNode } from "react";

export interface ArticleHeaderAuthor {
  /** Nombre visible; vacío omite al autor. */
  name: string;
  /** Página de la persona o del equipo; sin enlace, el nombre va como texto. */
  href?: string;
}

const AUTHORS: ArticleHeaderAuthor[] = [{ name: "Sebastián Illanes", href: "#autor" }];

export interface ArticleHeaderProps {
  /** Título del artículo. */
  title?: string;
  /** Bajada: una o dos oraciones que resumen el artículo; vacía no se muestra. */
  description?: string;
  /** Autores en orden de firma; se unen con comas y «y». Una lista vacía omite la autoría. */
  authors?: ArticleHeaderAuthor[];
  /** Fecha de publicación en ISO 8601 (atributo `dateTime`). */
  dateTime?: string;
  /** Texto visible de la fecha dentro de `<time>`; vacío la oculta. */
  time?: string;
  /** Tiempo estimado de lectura («4 min»); vacío lo oculta. */
  readingTime?: string;
  className?: string;
}

function firmas(authors: ArticleHeaderAuthor[]): ReactNode[] {
  return authors.flatMap((author, i) => [
    i === 0 ? null : i === authors.length - 1 ? " y " : ", ",
    author.href ? <a rel="author" href={author.href} key={i}>{author.name}</a> : author.name,
  ]);
}

/**
 * Encabezado de artículo con título, bajada y línea de autoría, fecha y tiempo de lectura; va al inicio de una nota, crónica o ensayo.
 *
 * Autoría, fecha y tiempo de lectura van en una línea separada por « · »; cada parte vacía se omite.
 *
 * @example <ArticleHeader title="Una decisión explicada con evidencia" authors={[{ name: "Sebastián Illanes", href: "/autores/sebastian" }]} dateTime="2026-08-25" time="25 de agosto de 2026" readingTime="4 min" />
 */
export function ArticleHeader({
  title = "Santiago cambia a escala de barrio",
  description = "Un recorrido por las decisiones que cambian el espacio público y su evidencia.",
  authors = AUTHORS,
  dateTime = "2026-08-25",
  time = "25 de agosto de 2026",
  readingTime = "4 min",
  className,
}: ArticleHeaderProps) {
  const firmantes = authors.filter((author) => author.name);
  const partes: ReactNode[] = [];
  if (firmantes.length) partes.push(firmas(firmantes));
  if (time) partes.push(<time dateTime={dateTime || undefined} key="fecha">{time}</time>);
  if (readingTime) partes.push(readingTime);
  if (!title && !description && !partes.length) return null;
  return (
    <header className={["ui-content", className].filter(Boolean).join(" ")} data-article-header>
      {title ? <h2>{title}</h2> : null}
      {description ? <p>{description}</p> : null}
      {partes.length ? <div>{partes.flatMap((parte, i) => (i ? [" · ", parte] : [parte]))}</div> : null}
    </header>
  );
}