- Vigencia indefinida
+ Vigencia de doce meses desde la firmaVista de cambios.
Patrón canónico de vista de cambios para usaia, scribe, periodismo2 admin y claudia.
Verlo por niveles
Primero el componente, después la variación de marca y finalmente su uso dentro de una página.
- El contrato rige por tiempo indefinido.
+ El contrato rige por doce meses desde la firma.
+ Se renueva por períodos iguales salvo aviso con 30 días de anticipación.- Vigencia indefinida
+ Vigencia de doce meses desde la firmaVer y copiar el código de este render
<section class="ui-sample ui-ai" data-diff-view="true"><header><strong>Cambios propuestos</strong><span>1 bloque</span></header><pre><code>- Vigencia indefinida
+ Vigencia de doce meses desde la firma</code></pre><button class="btn btn--primary" type="button">Aceptar cambio</button><button class="btn btn--secondary" type="button">Descartar</button></section>Variaciones por marca y sitio
Cada cambio visible declara su autoridad; lo que permanece canónico no se vuelve a inventar en el producto.
usaia
Autoridad: CANON.md + decisión de producto usaia- Vigencia indefinida
+ Vigencia de doce meses desde la firmaCambia en esta marca
- Namebrand usaia en minúsculas y acento morado
- Superficies para evidencia, herramientas y aprobación
Permanece canónico
- Acciones explícitas y estados conectados
- Misma anatomía, tipografía y navegación
Compañía de Innovación de Santiago
Autoridad: CONSTITUTION.md + LOGOS-CANONICOS.md- El contrato rige por tiempo indefinido.
+ El contrato rige por doce meses desde la firma.
+ Se renueva por períodos iguales salvo aviso con 30 días de anticipación.Cambia en esta marca
- Navegación y contenido propios del servicio
- Acento reservado para acciones y datos
Permanece canónico
- Mark CIS y namebrand de tres líneas
- IBM Plex Sans, foco, espaciado y anatomía
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
- Vista de cambios tiene 2 implementaciones observadas en 1 repositorios: cochid/cochid-scribe.
- Cambio propuesto
- Publicar en r19 el contrato de Vista de cambios para Patrón canónico de vista de cambios para usaia, scribe, periodismo2 admin y claudia.
- Qué ocurre si respondes No
- No se adopta el contrato r19 de Vista de cambios; las 2 implementaciones observadas permanecen sin migración.
Preparando comparación histórica…
Antes / r19
La comparación convierte una regla abstracta en una diferencia visible y verificable.
- Vigencia indefinida
+ Vigencia de doce meses desde la firma- Separa propuesta, evidencia, herramientas y aprobación humana.
- Muestra procedencia, impacto y estado de cada tarea.
- No presentes razonamiento sintético como evidencia.
- No ejecutes mutaciones externas desde un control ambiguo.
Responsive
La misma anatomía debe conservar lectura, foco y acciones sin cortar contenido ni crear scroll horizontal en la página.
- Vigencia indefinida
+ Vigencia de doce meses desde la firma- El contrato rige por tiempo indefinido.
+ El contrato rige por doce meses desde la firma.
+ Se renueva por períodos iguales salvo aviso con 30 días de anticipación.Cobertura
| Dimensión | Contrato |
|---|---|
| Propietario canónico | Sistema de diseño CIS y usaia · core/core-style |
| Consumidores | usaia, Scribe, Periodismo2 Admin y Claudia |
| Dependencias | AI Elements adaptado, contrato de evidencia |
| Estado | candidato |
Evidencia de adopción
Patrón observado. 2 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 | 2 implementaciones observadas |
| Repositorios | cochid/cochid-scribe |
| Snapshot | kit/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 |
|---|
| idle |
| en curso |
| requiere aprobación |
| completo |
| error |
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.
<section class="ui-sample ui-ai" data-diff-view="true"><header><strong>Cambios propuestos</strong><span>1 bloque</span></header><pre><code>- Vigencia indefinida
+ Vigencia de doce meses desde la firma</code></pre><button class="btn btn--primary" type="button">Aceptar cambio</button><button class="btn btn--secondary" type="button">Descartar</button></section>Código TAILWIND
Copia el bloque completo; después cambia contenido y destinos, no su anatomía.
<section class="ui-sample ui-ai border border-slate-300 bg-white p-4 text-slate-950 grid gap-3" data-diff-view="true"><header class="flex flex-wrap items-center justify-between gap-3"><strong>Cambios propuestos</strong><span>1 bloque</span></header><pre class="overflow-x-auto border border-slate-300 bg-slate-50 p-3"><code>- Vigencia indefinida
+ Vigencia de doce meses desde la firma</code></pre><button class="btn btn--primary border border-slate-950 px-3 py-2 focus-visible:outline-2 focus-visible:outline-offset-2 disabled:cursor-not-allowed" type="button">Aceptar cambio</button><button class="btn btn--secondary border border-slate-950 px-3 py-2 focus-visible:outline-2 focus-visible:outline-offset-2 disabled:cursor-not-allowed" type="button">Descartar</button></section>Código REACT
Copia el bloque completo; después cambia contenido y destinos, no su anatomía.
import type { MouseEventHandler } from "react";
export interface DiffViewLine {
/** `removed` se marca con «-», `added` con «+» y `context` (sin cambio) con un espacio. */
type: "removed" | "added" | "context";
/** Texto de la línea, sin el signo del cambio. */
text: string;
}
export interface DiffViewProps {
title?: string;
/** Tamaño del cambio («1 bloque», «3 líneas»); vacío lo oculta. */
summary?: string;
/** Líneas del cambio en orden; cada una va en su propia línea dentro de `<pre>`. */
lines?: DiffViewLine[];
/** Texto del botón que acepta el cambio; vacío lo oculta. */
acceptLabel?: string;
onAccept?: MouseEventHandler<HTMLButtonElement>;
/** Texto del botón que descarta el cambio; vacío lo oculta. */
rejectLabel?: string;
onReject?: MouseEventHandler<HTMLButtonElement>;
className?: string;
}
const DIFF_VIEW_LINES: DiffViewLine[] = [
{ type: "removed", text: "Vigencia indefinida" },
{ type: "added", text: "Vigencia de doce meses desde la firma" },
];
const PREFIJOS: Record<DiffViewLine["type"], string> = { removed: "- ", added: "+ ", context: " " };
/**
* Cambio que propone un asistente o agente de IA sobre un texto, con las líneas que se quitan y las que se agregan y los botones para aceptarlo o descartarlo; se muestra antes de aplicar el cambio.
*
* Las líneas van en `<pre>` con el signo del cambio al inicio («-» o «+»), de modo que el cambio se lee sin depender del color. Aceptar es la acción principal (`btn--primary`); descartar, la secundaria. `summary` resume el tamaño del cambio y tiene que calzar con `lines`.
*
* @example <DiffView summary="1 bloque" lines={[{ type: "removed", text: "Vigencia indefinida" }, { type: "added", text: "Vigencia de doce meses desde la firma" }]} onAccept={aceptar} onReject={descartar} />
* @example <DiffView title="Cambios propuestos a la cláusula 4" summary="3 líneas" lines={[{ type: "removed", text: "El contrato rige por tiempo indefinido." }, { type: "added", text: "El contrato rige por doce meses desde la firma." }, { type: "added", text: "Se renueva por períodos iguales salvo aviso con 30 días de anticipación." }]} acceptLabel="Aceptar cambios" onAccept={aceptar} onReject={descartar} />
*/
export function DiffView({
title = "Cambios propuestos",
summary = "1 bloque",
lines = DIFF_VIEW_LINES,
acceptLabel = "Aceptar cambio",
onAccept,
rejectLabel = "Descartar",
onReject,
className,
}: DiffViewProps) {
return (
<section className={["ui-ai", className].filter(Boolean).join(" ")} data-diff-view>
<header>
<strong>{title}</strong>
{summary ? <span>{summary}</span> : null}
</header>
{lines.length ? <pre><code>{lines.map((line) => `${PREFIJOS[line.type]}${line.text}`).join("\n")}</code></pre> : null}
{acceptLabel ? <button className="btn btn--primary" type="button" onClick={onAccept}>{acceptLabel}</button> : null}
{rejectLabel ? <button className="btn btn--secondary" type="button" onClick={onReject}>{rejectLabel}</button> : null}
</section>
);
}