Saltar al contenido
npm ↗ GitHub ↗

Documentación

27/Overlays

Modal

Diálogo centrado con foco atrapado, cierre con Esc, clic en el fondo y botones data-cb-close.

Confirmación

¿Archivar el proyecto?

Podrás restaurarlo durante 30 días.

HTML
<button class="cb-btn cb-btn--primary" type="button" data-cb-open="demo-modal">Abrir modal</button>

<div class="cb-modal" id="demo-modal" data-cb-modal>
  <div class="cb-modal__panel">
    <div class="cb-modal__head">
      <div>
        <h2 class="cb-modal__title">¿Archivar el proyecto?</h2>
        <p class="cb-modal__desc">Podrás restaurarlo durante 30 días.</p>
      </div>
      <button class="cb-modal__close" type="button" data-cb-close aria-label="Cerrar"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><path d="M6 6l12 12M18 6 6 18"/></svg></button>
    </div>
    <div class="cb-modal__body">
      <div class="cb-field">
        <label class="cb-field__label" for="modal-reason">Motivo</label>
        <input class="cb-input" id="modal-reason" placeholder="Opcional">
      </div>
    </div>
    <div class="cb-modal__foot">
      <button class="cb-btn cb-btn--outline" type="button" data-cb-close>Cancelar</button>
      <button class="cb-btn cb-btn--danger" type="button" data-cb-close>Archivar</button>
    </div>
  </div>
</div>

Tamaños y estático

Con data-cb-static el clic en el fondo no lo cierra. cb-modal--center lo centra verticalmente.

Términos del servicio

Este modal solo se cierra con los botones o con Esc.

HTML
<button class="cb-btn cb-btn--outline" type="button" data-cb-open="demo-modal-lg">Modal grande</button>

<div class="cb-modal cb-modal--lg cb-modal--center" id="demo-modal-lg" data-cb-modal data-cb-static>
  <div class="cb-modal__panel">
    <div class="cb-modal__head">
      <h2 class="cb-modal__title">Términos del servicio</h2>
      <button class="cb-modal__close" type="button" data-cb-close aria-label="Cerrar"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><path d="M6 6l12 12M18 6 6 18"/></svg></button>
    </div>
    <div class="cb-modal__body"><p>Este modal solo se cierra con los botones o con Esc.</p></div>
    <div class="cb-modal__foot"><button class="cb-btn cb-btn--primary" type="button" data-cb-close>Aceptar</button></div>
  </div>
</div>

Clases y modificadores

ClaseDescripción
.cb-modalFondo con desenfoque. .is-open lo muestra.
.cb-modal--sm, .cb-modal--lgAnchos de 400 y 760px (por defecto 520).
.cb-modal--centerCentrado vertical.
.cb-modal__panelCaja del diálogo.
.cb-modal__head, .cb-modal__title, .cb-modal__descCabecera, título y descripción.
.cb-modal__closeBotón de cerrar.
.cb-modal__body, .cb-modal__footContenido y acciones.

Atributos data-cb-*

AtributoDescripción
data-cb-modalActiva el modal. Necesita id.
data-cb-open="id"En cualquier botón, abre ese modal o drawer.
data-cb-closeDentro del modal, lo cierra.
data-cb-staticIgnora el clic en el fondo.
data-cb-open-on-loadLo abre al cargar.
data-cb-role="alertdialog"Cambia el rol para confirmaciones críticas.

JavaScript

EventoCuándo se dispara
cb:openAntes de abrir. Se puede cancelar con preventDefault().
cb:closeAntes de cerrar. También se puede cancelar.

Abrir y cerrar desde JS:

JS
cobalto.modal.open('demo-modal');
cobalto.modal.close('demo-modal');

Desde Livewire 4: despacha el evento con $this->dispatch('abrir-modal', id: 'confirmar') y escúchalo con Livewire.on():

JS
document.addEventListener('livewire:init', () => {
  Livewire.on('abrir-modal', (event) => cobalto.modal.open(event.id));
});

Accesibilidad

  • El panel recibe role="dialog", aria-modal="true" y aria-labelledby apuntando al título.
  • El foco entra al primer control (o al que tenga autofocus), queda atrapado y vuelve al botón al cerrar.
  • Esc cierra solo el overlay de más arriba si hay varios abiertos.
  • El scroll del body se bloquea mientras está abierto.