Qué incluye el servicio
Acceso, soporte y actualizaciones de contrato.
Cómo se factura
Período, IVA y renovación aparecen antes de confirmar.
Patrón canónico de acordeón para todos los sitios y servicios.
Primero el componente, después la variación de marca y finalmente su uso dentro de una página.
Acceso, soporte y actualizaciones de contrato.
Período, IVA y renovación aparecen antes de confirmar.
Acceso, soporte y actualizaciones de contrato.
Período, IVA y renovación aparecen antes de confirmar.
Acceso, soporte y actualizaciones de contrato.
Período, IVA y renovación aparecen antes de confirmar.
<div class="ui-sample ui-accordion" data-accordion><details open><summary><span>Qué incluye el servicio</span><span aria-hidden="true">+</span></summary><p>Acceso, soporte y actualizaciones de contrato.</p></details><details><summary><span>Cómo se factura</span><span aria-hidden="true">+</span></summary><p>Período, IVA y renovación aparecen antes de confirmar.</p></details></div>Cada cambio visible declara su autoridad; lo que permanece canónico no se vuelve a inventar en el producto.
Acceso, soporte y actualizaciones de contrato.
Período, IVA y renovación aparecen antes de confirmar.
Acceso, soporte y actualizaciones de contrato.
Período, IVA y renovación aparecen antes de confirmar.
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.
Acceso, soporte y actualizaciones de contrato.
Período, IVA y renovación aparecen antes de confirmar.
La misma anatomía debe conservar lectura, foco y acciones sin cortar contenido ni crear scroll horizontal en la página.
Acceso, soporte y actualizaciones de contrato.
Período, IVA y renovación aparecen antes de confirmar.
Acceso, soporte y actualizaciones de contrato.
Período, IVA y renovación aparecen antes de confirmar.
| Dimensión | Contrato |
|---|---|
| Propietario canónico | Sistema de diseño CIS · core/core-style |
| Consumidores | Todos los sitios y servicios |
| Dependencias | HTML nativo |
| 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/cis-usaia |
| 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 |
| hover |
| focus |
| disabled |
| loading |
Copia el bloque completo; después cambia contenido y destinos, no su anatomía.
<div class="ui-sample ui-accordion" data-accordion><details open><summary><span>Qué incluye el servicio</span><span aria-hidden="true">+</span></summary><p>Acceso, soporte y actualizaciones de contrato.</p></details><details><summary><span>Cómo se factura</span><span aria-hidden="true">+</span></summary><p>Período, IVA y renovación aparecen antes de confirmar.</p></details></div>Copia el bloque completo; después cambia contenido y destinos, no su anatomía.
<div class="ui-sample ui-accordion border border-slate-300 bg-white p-4 text-slate-950" data-accordion><details open><summary><span>Qué incluye el servicio</span><span aria-hidden="true">+</span></summary><p>Acceso, soporte y actualizaciones de contrato.</p></details><details><summary><span>Cómo se factura</span><span aria-hidden="true">+</span></summary><p>Período, IVA y renovación aparecen antes de confirmar.</p></details></div>Copia el bloque completo; después cambia contenido y destinos, no su anatomía.
import type { ReactNode } from "react";
export interface AccordionItem {
/** Texto del encabezado que abre y cierra la sección. */
title: string;
/** Contenido de la sección; un texto se envuelve en un párrafo. */
content: ReactNode;
/** Sección abierta (atributo nativo `open` de `<details>`). */
open?: boolean;
}
export interface AccordionProps {
items?: AccordionItem[];
/** Nombre compartido de las secciones: con él, abrir una cierra las demás (atributo nativo `name`). */
name?: string;
/** Se llama cuando una sección se abre o se cierra, con su posición y su estado nuevo. */
onToggle?: (index: number, open: boolean) => void;
className?: string;
}
const ITEMS: AccordionItem[] = [
{ title: "Qué incluye el servicio", content: "Acceso, soporte y actualizaciones de contrato.", open: true },
{ title: "Cómo se factura", content: "Período, IVA y renovación aparecen antes de confirmar." },
];
/**
* Lista de secciones plegables para preguntas frecuentes o detalles secundarios que no todos necesitan leer.
*
* Usa `<details>` y `<summary>` nativos: abre y cierra sin JavaScript, y `open` fija el estado inicial de cada sección.
*
* @example <Accordion items={[{ title: "Cómo se factura", content: "Período, IVA y renovación aparecen antes de confirmar.", open: true }]} />
* @example <Accordion name="preguntas" items={preguntas} onToggle={registrarApertura} />
*/
export function Accordion({ items = ITEMS, name, onToggle, className }: AccordionProps) {
if (!items.length) return null;
return (
<div className={["ui-accordion", className].filter(Boolean).join(" ")} data-accordion>
{items.map((item, i) => (
<details
open={item.open}
name={name}
onToggle={onToggle ? (event) => onToggle(i, event.currentTarget.open) : undefined}
key={`${item.title}-${i}`}
>
<summary>
<span>{item.title}</span>
<span aria-hidden="true">+</span>
</summary>
{typeof item.content === "string" ? <p>{item.content}</p> : item.content}
</details>
))}
</div>
);
}