Modal
Ventana gn-modal para mostrar contenido o acciones sobre una capa superpuesta.
1. Modal interactiva (abrir / cerrar / reabrir)
Modal heading
Contenido de ejemplo para documentar el patrón gn-modal y su ciclo de interacción en docs.
Mostrar HTML
<section class="docs-modal-example" data-modal-example>
<div>
<button type="button" class="gn-button gn-button--primary gn-button--md" data-modal-open aria-haspopup="dialog" aria-controls="gn-modal-example-1">Abrir gn-modal</button>
</div>
<div class="docs-modal-stage">
<div id="gn-modal-example-1" class="gn-modal gn-modal--open" data-gn-modal data-gn-modal-lock-scroll="false" data-gn-modal-isolate="false" aria-hidden="false">
<div class="gn-modal__dialog" role="dialog" aria-modal="true" aria-labelledby="gn-modal-title-example-1" aria-describedby="gn-modal-desc-example-1">
<div class="gn-modal__header">
<h3 class="gn-modal__title" id="gn-modal-title-example-1">Modal heading</h3>
<button type="button" class="gn-modal__close" aria-label="Cerrar gn-modal" data-modal-close>
<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false">
<path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z" />
</svg>
</button>
</div>
<div class="gn-modal__body" id="gn-modal-desc-example-1">
<p>Contenido de ejemplo para documentar el patrón gn-modal y su ciclo de interacción en docs.</p>
</div>
<div class="gn-modal__footer">
<button type="button" class="gn-button gn-button--primary gn-button--md">Acción principal</button>
<button type="button" class="gn-button gn-button--secondary gn-button--md" data-modal-close>Cancelar</button>
</div>
</div>
</div>
</div>
</section>
<section class="docs-modal-example">
Mostrar JS
document.addEventListener('DOMContentLoaded', () => {
window.GNDS.initModals();
});
2. Modal expandida (estructura)
Mostrar HTML
<div class="docs-modal-stage">
<div class="gn-modal gn-modal--open gn-modal--expanded" aria-hidden="false">
<div class="gn-modal__dialog" role="dialog" aria-modal="true" aria-labelledby="gn-modal-title-example-2" aria-describedby="gn-modal-desc-example-2">
<div class="gn-modal__header">
<h3 class="gn-modal__title" id="gn-modal-title-example-2">Modal de tamaño expandido</h3>
<button type="button" class="gn-modal__close" aria-label="Cerrar gn-modal">
<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false">
<path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z" />
</svg>
</button>
</div>
<div class="gn-modal__body" id="gn-modal-desc-example-2">
<p>Ejemplo visual de la variante <code>\.gn-modal--expanded</code> para contenidos más extensos.</p>
</div>
</div>
</div>
</div>
</section>
Modal
El componente modal proporciona una ventana superpuesta que bloquea la interacción con el resto de la página, centrando la atención del usuario en una tarea, información o decisión importante.
Cuándo usar
- Para solicitar confirmación sobre acciones destructivas o importantes.
- Para mostrar formularios o tareas breves sin perder el contexto de la página actual.
- Para presentar información crítica que requiere atención inmediata.
Cuándo NO usar
- Para mensajes de éxito o notificaciones no bloqueantes (utiliza *Toast* o *Alert*).
- Si el contenido es muy extenso y requiere navegación o múltiples pasos complejos (es preferible una página dedicada).
- No anides modales (abrir una gn-modal sobre otra gn-modal).
Estructura
El componente base consta de:
.gn-modal: El contenedor principal y el *backdrop* (fondo oscurecido)..gn-modal__dialog: La caja visible que contiene la información..gn-modal__header: Zona superior, contiene el título y, opcionalmente, el botón de cierre..gn-modal__title: Título principal de la gn-modal..gn-modal__close: Botón iconográfico para descartar la gn-modal..gn-modal__body: Contenedor principal para el texto, formularios u otros elementos..gn-modal__footer: Zona inferior, destinada a las acciones principales y secundarias.
Variantes
- Default: Tamaño por defecto (máximo 560px de ancho adaptado del sistema de columnas).
- Large: Utiliza el modificador
.gn-modal--largeen el contenedor principal para un tamaño más amplio (máximo 850px), útil para contenidos más extensos.
Accesibilidad (HTML/CSS)
- El contenedor
.gn-modal__dialogdebe tener el rolrole="dialog"y el atributoaria-modal="true". - Utiliza
aria-labelledbyen el.gn-modal__dialogapuntando aliddel.gn-modal__titlepara proporcionar un nombre accesible. - Si hay un texto descriptivo adicional clave, se puede enlazar con
aria-describedby(apuntando al ID del.gn-modal__body). - El botón de cierre utiliza un
<button>nativo con su correspondientearia-label="Cerrar gn-modal". - Los estilos de foco visible están definidos mediante
:focus-visible.
Comportamiento Interactivo (Requiere JavaScript)
La implementación proporcionada cubre la estructura semántica y el diseño visual mediante HTML y CSS. Para que la gn-modal sea completamente funcional y accesible de manera interactiva, se requiere implementar el siguiente comportamiento con JavaScript:
- Apertura y Cierre:
- Alternar la clase .gn-modal--open en el contenedor .gn-modal y actualizar aria-hidden según el estado. - Restablecer el foco al botón o elemento que disparó la gn-modal una vez que esta se cierra.
- Focus Trap (Trampa de foco):
- Al abrir la gn-modal, el foco debe moverse al primer elemento interactivo dentro del diálogo (o al propio .gn-modal__dialog si no hay interactivos). - El foco debe quedar atrapado dentro del .gn-modal__dialog. Al presionar Tab o Shift + Tab, la navegación debe ciclar únicamente por los elementos de la gn-modal, sin salir al fondo de la página.
- Cierre por Teclado y Clic:
- Detectar la tecla Escape (Esc) para cerrar la gn-modal inmediatamente. - Detectar el evento de clic en el contenedor exterior (.gn-modal) para cerrar la gn-modal cuando el usuario hace clic en el fondo oscurecido (backdrop), si procede.
- Bloqueo de Scroll (Body):
- Aplicar overflow: hidden al elemento <body> o <html> cuando la gn-modal esté abierta para evitar que el usuario pueda hacer scroll en la página subyacente.
Nota sobre examples/documentación
En los examples del sistema se incluye un JavaScript mínimo de demostración para:
- abrir la gn-modal con un botón externo,
- cerrarla con la
X(y con acción secundaria), - volver a abrirla,
- y cerrar con
Escapeo clic en backdrop en el ejemplo interactivo.
Ese script está acotado a documentación/examples y no convierte el pattern base en dependiente obligatorio de JS.