Saltar al contenido
Índice de Kit UI
Kit UI Componentes

Cuenta y sesión.

Patrón canónico de cuenta y sesión para cis, cds, cochid y todos los sitios.

Verlo por niveles

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

Nivel 2Círculo de Santiago · variación
Ver y copiar el código de este render
HTML del nivel canónico
<div class="ui-sample ui-account ui-actions" data-account-menu><a class="btn btn--quiet" href="#ingresar">Iniciar sesión</a><a class="btn btn--primary" href="#crear-cuenta">Crear cuenta</a></div>

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

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

Círculo de Santiago

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

Cambia en esta marca

  • Mark circular y namebrand Círculo de Santiago en caja normal
  • Contenido societario y navegación propia

Permanece canónico

  • Misma estructura, orden de cuenta y footer
  • Tipografía, foco y comportamiento canónicos

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
Cuenta y sesión no tiene una implementación vigente demostrada; sus ejemplos son material candidato.
Cambio propuesto
Publicar en r19 el contrato de Cuenta y sesión para Patrón canónico de cuenta y sesión para cis, cds, cochid y todos los sitios.
Qué ocurre si respondes No
Cuenta y sesión 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
  • Conserva el namebrand canónico y el contexto en una línea separada.
  • Mantén cuenta, navegación y destino actual en lugares predecibles.
Antes · problema observadoAnti-ejemplo no interactivo
CISTítulo debajo del namebrandMenú distinto en esta página
  • No inventes abreviaturas ni cambies mayúsculas del namebrand.
  • No cambies navbar o footer entre páginas del mismo sitio.

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
1280 pxEscritorio

Cobertura

DimensiónContrato
Propietario canónicoSistema de diseño CIS · core/core-style
ConsumidoresCIS, CDS, COCHID y todos los sitios
DependenciasHTML nativo, cis-auth para sesión
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
actual
móvil
sin sesión

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
<div class="ui-sample ui-account ui-actions" data-account-menu><a class="btn btn--quiet" href="#ingresar">Iniciar sesión</a><a class="btn btn--primary" href="#crear-cuenta">Crear cuenta</a></div>

Código TAILWIND

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

Código de referencia
<div class="ui-sample ui-account ui-actions border border-slate-300 bg-white p-4 text-slate-950" data-account-menu><a class="btn btn--quiet underline underline-offset-4" href="#ingresar">Iniciar sesión</a><a class="btn btn--primary underline underline-offset-4" href="#crear-cuenta">Crear cuenta</a></div>

Código REACT

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

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

export interface AccountMenuItem {
  label: string;
  href: string;
  /** Marca la página actual con `aria-current="page"`. */
  current?: boolean;
}

const ITEMS: AccountMenuItem[] = [
  { label: "Perfil", href: "#perfil" },
  { label: "Facturación", href: "#facturacion" },
];

export interface AccountMenuProps {
  /** Nombre de la persona con sesión iniciada; sin él, se muestran los enlaces para ingresar y crear cuenta. */
  userName?: string;
  /** Muestra el menú de la cuenta desplegado (atributo nativo `open` de `<details>`). */
  open?: boolean;
  /** Se llama al abrir o cerrar el menú con sesión iniciada. */
  onToggle?: ReactEventHandler<HTMLDetailsElement>;
  /** Destino del enlace para ingresar; se usa sin sesión. */
  loginHref?: string;
  /** Texto del enlace para ingresar; se usa sin sesión. */
  loginLabel?: string;
  /** Destino para crear cuenta; vacío, no se muestra el enlace. */
  signupHref?: string;
  /** Texto del enlace para crear cuenta; se usa sin sesión. */
  signupLabel?: string;
  /** Encabezado del menú con sesión iniciada; vacío, no se muestra. */
  title?: string;
  /** Enlaces del menú con sesión iniciada, en orden. */
  items?: AccountMenuItem[];
  /** Nombre accesible del menú con sesión iniciada (`aria-label`). */
  label?: string;
  /** Destino del formulario `POST` que cierra la sesión. */
  logoutAction?: string;
  /** Se llama al enviar el formulario de cierre de sesión. */
  onLogout?: FormEventHandler<HTMLFormElement>;
  /** Texto del botón que cierra la sesión; se usa con sesión iniciada. */
  logoutLabel?: string;
  className?: string;
}

/**
 * Acceso a la cuenta en la cabecera: enlaces para ingresar y crear cuenta sin sesión, o menú de la cuenta con sesión iniciada.
 *
 * El estado llega por `userName`. El menú usa `<details>` y abre sin JavaScript; el cierre de sesión es un formulario `POST` y `onLogout` recibe el envío.
 *
 * @example <AccountMenu loginHref="/ingresar" signupHref="/crear-cuenta" />
 * @example <AccountMenu userName="Martín Illanes" logoutAction="/salir" onLogout={cerrarSesion} items={[{ label: "Perfil", href: "/perfil" }]} />
 */
export function AccountMenu({
  userName,
  open = false,
  onToggle,
  loginHref = "#ingresar",
  loginLabel = "Iniciar sesión",
  signupHref = "#crear-cuenta",
  signupLabel = "Crear cuenta",
  title = "Cuenta de la Compañía",
  items = ITEMS,
  label = "Cuenta",
  logoutAction = "#cerrar-sesion",
  onLogout,
  logoutLabel = "Cerrar sesión",
  className,
}: AccountMenuProps) {
  if (!userName) {
    return (
      <div className={["ui-account ui-actions", className].filter(Boolean).join(" ")} data-account-menu>
        <a className="btn btn--quiet" href={loginHref}>{loginLabel}</a>
        {signupHref ? <a className="btn btn--primary" href={signupHref}>{signupLabel}</a> : null}
      </div>
    );
  }
  return (
    <details className={["ui-account", className].filter(Boolean).join(" ")} data-account-menu open={open} onToggle={onToggle}>
      <summary className="btn btn--secondary">{userName}</summary>
      <nav aria-label={label}>
        {title ? <strong>{title}</strong> : null}
        {items.map((item, i) => (
          <a key={i} href={item.href} aria-current={item.current ? "page" : undefined}>{item.label}</a>
        ))}
        <form action={logoutAction} method="post" onSubmit={onLogout}>
          <button type="submit">{logoutLabel}</button>
        </form>
      </nav>
    </details>
  );
}