Saltar al contenido
Índice de Kit UI
Kit UI Componentes

Preferencias de cookies.

Patrón canónico de preferencias de cookies para todos los consumidores.

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

Preferencias de privacidad

Nivel 2COCHID · variación

Preferencias de privacidad

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

Preferencias de privacidad

Ver y copiar el código de este render
HTML del nivel canónico
<form class="ui-sample ui-form" data-cookie-preferences="true"><h3>Preferencias de privacidad</h3><label><input type="checkbox" disabled="" checked=""/> Necesarias · sesión y seguridad</label><label><input type="checkbox" name="analitica"/> Analítica</label><label><input type="checkbox" name="terceros"/> Contenido de terceros</label><div class="ui-actions"><button class="btn btn--primary" type="submit">Guardar preferencias</button><button class="btn btn--secondary" type="reset">Rechazar opcionales</button></div></form>

Variaciones por marca y sitio

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

innovacionsantiago.cl

Compañía de Innovación de Santiago

Autoridad: CONSTITUTION.md + LOGOS-CANONICOS.md

Preferencias de privacidad

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
cochid.cl

COCHID

Autoridad: core-style/DECISIONES.md M15 y LOGOS-CANONICOS.md

Preferencias de privacidad

Cambia en esta marca

  • Cuadrado azul y namebrand de tres líneas
  • Azul COCHID en selección, capas y series

Permanece canónico

  • Estructura y semántica comunes
  • Fuentes, unidades y alternativa tabular

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
Preferencias de cookies tiene 3 implementaciones observadas en 1 repositorios: cds/cis/periodismo2-frontend.
Cambio propuesto
Publicar en r19 el contrato de Preferencias de cookies para Patrón canónico de preferencias de cookies para todos los consumidores.
Qué ocurre si respondes No
No se adopta el contrato r19 de Preferencias de cookies; las 3 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.

r19 · correctoContrato canónico renderizado

Preferencias de privacidad

  • Usa HTML semántico, foco visible y estados explícitos.
  • Conserva contenido útil a 320 px y sin JavaScript.
Antes · problema observadoAnti-ejemplo no interactivo
EN LÍNEATodo funciona correctamenteSin señal, hora ni servicio asociado
  • No agregues sombras, radios ni franjas laterales decorativas.
  • No uses color, placeholder o icono como única explicación.

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

Preferencias de privacidad

1280 pxEscritorio

Preferencias de privacidad

Cobertura

DimensiónContrato
Propietario canónicoSistema de diseño CIS · core/core-style
ConsumidoresTodos los consumidores
DependenciasHTML nativo, ARIA sólo cuando aporta
Estadocandidato

Evidencia de adopción

Patrón observado. 3 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.

DatoResultado
ClasificaciónPatrón observado
Implementaciones3 implementaciones observadas
Repositorioscds/cis/periodismo2-frontend
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
información
advertencia
error
éxito

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
<form class="ui-sample ui-form" data-cookie-preferences="true"><h3>Preferencias de privacidad</h3><label><input type="checkbox" disabled="" checked=""/> Necesarias · sesión y seguridad</label><label><input type="checkbox" name="analitica"/> Analítica</label><label><input type="checkbox" name="terceros"/> Contenido de terceros</label><div class="ui-actions"><button class="btn btn--primary" type="submit">Guardar preferencias</button><button class="btn btn--secondary" type="reset">Rechazar opcionales</button></div></form>

Código TAILWIND

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

Código de referencia
<form class="ui-sample ui-form border border-slate-300 bg-white p-4 text-slate-950 grid gap-3" data-cookie-preferences="true"><h3>Preferencias de privacidad</h3><label><input class="border border-slate-400 bg-white px-3 py-2 focus-visible:outline-2 focus-visible:outline-offset-2" type="checkbox" disabled="" checked=""/> Necesarias · sesión y seguridad</label><label><input class="border border-slate-400 bg-white px-3 py-2 focus-visible:outline-2 focus-visible:outline-offset-2" type="checkbox" name="analitica"/> Analítica</label><label><input class="border border-slate-400 bg-white px-3 py-2 focus-visible:outline-2 focus-visible:outline-offset-2" type="checkbox" name="terceros"/> Contenido de terceros</label><div class="ui-actions"><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="submit">Guardar preferencias</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="reset">Rechazar opcionales</button></div></form>

Código REACT

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

Código de referencia
import type { ChangeEventHandler, FormEventHandler, MouseEventHandler } from "react";

export interface CookiePreferencesOption {
  /** Categoría y, si hace falta, para qué se usa («Necesarias · sesión y seguridad»). */
  label: string;
  /** Nombre con que se envía la casilla; sin él, el formulario no la incluye. */
  name?: string;
  /** Valor enviado cuando la casilla está marcada; por defecto, `on`. */
  value?: string;
  /** Estado inicial de una casilla no controlada. */
  defaultChecked?: boolean;
  /** Estado de una casilla controlada; va junto con `onChange`. */
  checked?: boolean;
  /** Se llama al marcar o desmarcar la casilla, sea controlada o no. */
  onChange?: ChangeEventHandler<HTMLInputElement>;
  /** Categoría que no se puede desactivar, como las necesarias; va junto con `defaultChecked`. */
  disabled?: boolean;
}

export interface CookiePreferencesProps {
  title?: string;
  /** Una casilla por categoría; por defecto, las opcionales empiezan sin marcar. */
  options?: CookiePreferencesOption[];
  /** Texto del botón que envía el formulario; vacío lo oculta. */
  submitLabel?: string;
  /** Texto del botón de tipo `reset`, que vuelve las casillas a su estado inicial; vacío lo oculta. */
  rejectLabel?: string;
  /** Se llama al pulsar el botón de rechazo. Con casillas controladas, actualiza aquí su estado: el `reset` no dispara `onChange`. */
  onReject?: MouseEventHandler<HTMLButtonElement>;
  /** Destino del formulario; sin JavaScript, el envío va ahí. */
  action?: string;
  method?: "get" | "post";
  /** Se llama al enviar el formulario. */
  onSubmit?: FormEventHandler<HTMLFormElement>;
  className?: string;
}

const OPCIONES: CookiePreferencesOption[] = [
  { label: "Necesarias · sesión y seguridad", defaultChecked: true, disabled: true },
  { label: "Analítica", name: "analitica" },
  { label: "Contenido de terceros", name: "terceros" },
];

/**
 * Formulario de preferencias de cookies por categoría, con las necesarias fijas y las opcionales a elección de la persona.
 *
 * El botón de rechazo es de tipo `reset`: si las opcionales empiezan sin marcar, deja sólo las necesarias. Una casilla deshabilitada no se envía con el formulario.
 *
 * @example <CookiePreferences action="/privacidad/cookies" method="post" options={[{ label: "Necesarias · sesión y seguridad", defaultChecked: true, disabled: true }, { label: "Analítica", name: "analitica" }, { label: "Contenido de terceros", name: "terceros" }]} />
 * @example <CookiePreferences options={[{ label: "Necesarias · sesión y seguridad", defaultChecked: true, disabled: true }, { label: "Analítica", name: "analitica", checked: analitica, onChange: alternar }]} onSubmit={guardar} />
 */
export function CookiePreferences({
  title = "Preferencias de privacidad",
  options = OPCIONES,
  submitLabel = "Guardar preferencias",
  rejectLabel = "Rechazar opcionales",
  onReject,
  action,
  method,
  onSubmit,
  className,
}: CookiePreferencesProps) {
  return (
    <form className={["ui-form", className].filter(Boolean).join(" ")} data-cookie-preferences action={action} method={method} onSubmit={onSubmit}>
      {title ? <h3>{title}</h3> : null}
      {options.map((opcion, indice) => {
        const controlado = opcion.checked !== undefined && opcion.onChange !== undefined;
        return (
          <label key={`${opcion.label}-${indice}`}>
            <input
              type="checkbox"
              name={opcion.name}
              value={opcion.value}
              disabled={opcion.disabled}
              onChange={opcion.onChange}
              {...(controlado ? { checked: opcion.checked } : { defaultChecked: opcion.checked ?? opcion.defaultChecked })}
            />
            {` ${opcion.label}`}
          </label>
        );
      })}
      {submitLabel || rejectLabel ? (
        <div className="ui-actions">
          {submitLabel ? <button className="btn btn--primary" type="submit">{submitLabel}</button> : null}
          {rejectLabel ? <button className="btn btn--secondary" type="reset" onClick={onReject}>{rejectLabel}</button> : null}
        </div>
      ) : null}
    </form>
  );
}