# Maristas UI Kit — guía para asistentes de IA

> Archivo generado con `php artisan maristas-ui:ia`. No lo edites a mano: regenéralo al actualizar el paquete.

Eres un asistente que escribe pantallas para un sistema Maristas. Este kit (`maristas/ui-kit`) es el único sistema de diseño permitido: **reutiliza lo que existe, no inventes estilos**.

## Cómo está construido

- Laravel 9–13, Blade, **Bootstrap 5** como base (CSS y JS). Sin Alpine, Livewire ni jQuery obligatorios: el JavaScript del kit (`maristas-ui.js`) es puro.
- Íconos: Remix Icon (`ri-*`). Fuente: Poppins.
- Tokens CSS con prefijo `--maristas-*`; clases propias con prefijo `.mr-*`.
- Componentes Blade anónimos con el prefijo `x-maristas::` (por ejemplo `<x-maristas::button>`).
- Los estilos que cambian el aspecto de Bootstrap solo actúan dentro de un contenedor con la clase `mr-scope`. Envuelve la pantalla en `<div class="mr-scope">…</div>`.
- Carga `vendor/maristas-ui/maristas-ui.css` después de Bootstrap y `maristas-ui.js` al final del `<body>` (se publican con `php artisan vendor:publish --tag=maristas-ui-assets`).

## Reglas obligatorias

1. **Un componente del kit antes que HTML propio.** Si existe un componente `x-maristas::*` para lo que necesitas, úsalo. Si no existe, compón con clases `.mr-*` y Bootstrap; no crees CSS nuevo salvo que el usuario lo pida.
2. **Colores solo con tokens** (`var(--maristas-*)`). Nunca valores hexadecimales sueltos ni clases de color de Bootstrap para decorar (`bg-primary`, `text-danger`…). Los tonos de estado se expresan con `tone="success|warning|danger|info|neutral"`.
3. **Un solo botón principal por vista.** Los demás son secundarios (`variant="secondary"`). El botón deshabilitado es azul claro, nunca gris.
4. **Los estados son etiquetas** (`x-maristas::state`), con un solo mensaje y color semántico. El azul de marca nunca representa un estado.
5. **Las alertas dicen qué pasó y qué hacer**; las confirmaciones temporales van en toast.
6. **Íconos de Remix** (`ri-*`); si un ícono va solo, lleva `aria-label`.
7. **Accesibilidad:** foco visible, `label` en cada campo, contraste suficiente, controles operables con teclado, `aria-current`/`aria-label` en navegación.
8. **Textos en español**, claros y sin jerga. Datos de ejemplo ficticios; nunca datos reales de personas.
9. **No uses clases que no aparezcan en esta guía.** Si dudas de que una clase exista, revisa la sección «Clases disponibles».
10. Entre página y pie deja respiro; no pegues contenido al borde.

## Verifica tu trabajo

Al terminar una vista ejecuta `php artisan maristas-ui:lint <ruta de la vista>` y corrige todos los errores que reporte (clases inventadas, colores sueltos, componentes o propiedades inexistentes, íconos sin `aria-label`). Los avisos son para revisar con criterio.

## Tokens de diseño


**Marca**
- `--maristas-brand`: `#0b3a6f`
- `--maristas-brand-strong`: `#082b54`
- `--maristas-brand-soft`: `#e7eefb`
- `--maristas-accent`: `#2f6fed`

**Neutros con sesgo azul**
- `--maristas-ink`: `#172033`
- `--maristas-ink-soft`: `#3f4a60`
- `--maristas-muted`: `#6a7489`
- `--maristas-line`: `#e6e9f1`
- `--maristas-line-strong`: `#b8c0d0`
- `--maristas-soft`: `#f4f6fb`
- `--maristas-canvas`: `#f4f6fb`
- `--maristas-surface`: `#ffffff`

**Estados (independientes de la marca)**
- `--maristas-success`: `#12805c`
- `--maristas-success-soft`: `#e3f5ee`
- `--maristas-warning`: `#a96a00`
- `--maristas-warning-soft`: `#fdf1d8`
- `--maristas-danger`: `#c93a3a`
- `--maristas-danger-soft`: `#fce8e8`
- `--maristas-info`: `#1f6aa8`
- `--maristas-info-soft`: `#e3f0fb`

**Tipografía**
- `--maristas-font`: `'Poppins', system-ui, -apple-system, 'Segoe UI', sans-serif`
- `--maristas-text-2xs`: `.7rem`
- `--maristas-text-xs`: `.75rem`
- `--maristas-text-sm`: `.8125rem`
- `--maristas-text-base`: `.875rem`
- `--maristas-text-md`: `1rem`
- `--maristas-text-lg`: `1.25rem`
- `--maristas-text-xl`: `1.6rem`

**Forma**
- `--maristas-radius-xs`: `6px`
- `--maristas-radius-sm`: `8px`
- `--maristas-radius-md`: `10px`
- `--maristas-radius-lg`: `16px`
- `--maristas-shadow-sm`: `0 1px 3px rgba(23, 32, 51, .12)`
- `--maristas-shadow-card`: `0 1px 2px rgba(23, 32, 51, .04), 0 6px 20px rgba(23, 32, 51, .05)`
- `--maristas-shadow-float`: `0 12px 32px rgba(23, 32, 51, .14)`
- `--maristas-shadow-modal`: `0 20px 50px rgba(23, 32, 51, .2)`
- `--maristas-shadow-up`: `0 -4px 18px rgba(23, 32, 51, .1)`
- `--maristas-overlay`: `rgba(23, 32, 51, .45)`

**Espaciado (múltiplos de 4px)**
- `--maristas-space-1`: `.25rem`
- `--maristas-space-2`: `.5rem`
- `--maristas-space-3`: `.75rem`
- `--maristas-space-4`: `1rem`
- `--maristas-space-5`: `1.5rem`
- `--maristas-space-6`: `2rem`

**Separación entre ícono y texto: una sola medida para botones, menús, navegación y avisos; -sm para pastillas**
- `--maristas-icon-gap`: `.5rem`
- `--maristas-icon-gap-sm`: `.35rem`

**Controles: botón, campo y selector del mismo tamaño miden lo mismo y usan la misma letra**
- `--maristas-control-h-sm`: `2rem`
- `--maristas-control-h`: `2.5rem`
- `--maristas-control-h-lg`: `3rem`
- `--maristas-control-text-sm`: `var(--maristas-text-sm)`
- `--maristas-control-text`: `var(--maristas-text-base)`
- `--maristas-control-text-lg`: `var(--maristas-text-md)`
- `--maristas-label-text`: `var(--maristas-text-sm)`

**Estados de interacción: uno solo para todo el kit**
- `--maristas-hover`: `var(--maristas-soft)`
- `--maristas-focus-ring`: `0 0 0 3px rgba(47, 111, 237, .15)`
- `--maristas-disabled-opacity`: `.5`

**Margen lateral de la página (crece con la ventana; cada sistema puede redefinirlo en su :root)**
- `--maristas-gutter`: `clamp(2rem, 7vw, 9rem)`

## Componentes Blade

Se usan como `<x-maristas::nombre propiedad="…">contenido</x-maristas::nombre>`. Las propiedades sin valor por defecto son obligatorias.

### `x-maristas::alert`
- Propiedades: `tone = 'info'`, `icon = null`, `dismissible = false`
- Acepta atributos HTML adicionales (`class`, `id`, `data-*`, `wire:*`, `x-*`).

### `x-maristas::avatar`
- Propiedades: `name (obligatoria)`, `size = 'md'`, `soft = false`, `initials = null`
- Acepta atributos HTML adicionales (`class`, `id`, `data-*`, `wire:*`, `x-*`).

### `x-maristas::back-to-top`
- Sin propiedades propias (solo contenido y atributos HTML).
- Acepta atributos HTML adicionales (`class`, `id`, `data-*`, `wire:*`, `x-*`).

### `x-maristas::banner`
- Propiedades: `title (obligatoria)`, `eyebrow = null`, `description = null`, `icon = null`
- Acepta atributos HTML adicionales (`class`, `id`, `data-*`, `wire:*`, `x-*`).

### `x-maristas::button`
- Propiedades: `variant = 'primary'`, `size = null`, `icon = null`, `href = null`, `type = 'button'`
- Acepta atributos HTML adicionales (`class`, `id`, `data-*`, `wire:*`, `x-*`).

### `x-maristas::cover-card`
- Propiedades: `title (obligatoria)`, `image = null`, `position = 'center'`, `subtitle = null`, `icon = 'ri-image-line'`, `fill = true`
- Slots con nombre: `tags`, `meta`, `actions` (`<x-slot:nombre>…</x-slot:nombre>`).
- Acepta atributos HTML adicionales (`class`, `id`, `data-*`, `wire:*`, `x-*`).

### `x-maristas::edit-link`
- Propiedades: `target (obligatoria)`, `locked = false`, `label = 'Editar'`, `lockedLabel = 'Bloqueado'`, `title = null`, `lockedTitle = 'No se puede editar en esta etapa'`
- Acepta atributos HTML adicionales (`class`, `id`, `data-*`, `wire:*`, `x-*`).

### `x-maristas::empty-state`
- Propiedades: `icon = 'ri-inbox-line'`, `title (obligatoria)`
- Acepta atributos HTML adicionales (`class`, `id`, `data-*`, `wire:*`, `x-*`).

### `x-maristas::footer`
- Propiedades: `product = 'SIGEM'`, `version = null`
- Acepta atributos HTML adicionales (`class`, `id`, `data-*`, `wire:*`, `x-*`).

### `x-maristas::institution-menu`
- Propiedades: `current (obligatoria)`, `searchable = false`, `title = 'Institución activa'`, `hint = 'Cambia a otra para ver sus datos'`
- Acepta atributos HTML adicionales (`class`, `id`, `data-*`, `wire:*`, `x-*`).

### `x-maristas::menu-item`
- Propiedades: `href = null`, `icon = null`, `active = false`
- Acepta atributos HTML adicionales (`class`, `id`, `data-*`, `wire:*`, `x-*`).

### `x-maristas::multiselect`
- Propiedades: `name (obligatoria)`, `options = []`, `selected = []`, `placeholder = 'Selecciona opciones'`, `searchPlaceholder = 'Buscar…'`, `emptyText = 'No se encontraron resultados'`, `invalid = false`
- Slots con nombre: `value`, `label` (`<x-slot:nombre>…</x-slot:nombre>`).
- Acepta atributos HTML adicionales (`class`, `id`, `data-*`, `wire:*`, `x-*`).

### `x-maristas::nav-group`
- Propiedades: `label (obligatoria)`, `icon = null`, `active = false`
- Acepta atributos HTML adicionales (`class`, `id`, `data-*`, `wire:*`, `x-*`).

### `x-maristas::nav-link`
- Propiedades: `href = '#'`, `icon = null`, `active = false`
- Acepta atributos HTML adicionales (`class`, `id`, `data-*`, `wire:*`, `x-*`).

### `x-maristas::notification-menu`
- Propiedades: `count = 0`, `title = 'Notificaciones'`
- Slots con nombre: `actions`, `footer` (`<x-slot:nombre>…</x-slot:nombre>`).
- Acepta atributos HTML adicionales (`class`, `id`, `data-*`, `wire:*`, `x-*`).

### `x-maristas::notification`
- Propiedades: `name = null`, `icon = null`, `tone = 'info'`, `time = null`, `new = false`, `href = null`
- Acepta atributos HTML adicionales (`class`, `id`, `data-*`, `wire:*`, `x-*`).

### `x-maristas::page-bar`
- Propiedades: `title (obligatoria)`, `items = []`
- Acepta atributos HTML adicionales (`class`, `id`, `data-*`, `wire:*`, `x-*`).

### `x-maristas::stat`
- Propiedades: `label (obligatoria)`, `value (obligatoria)`, `delta = null`, `trend = 'up'`, `icon = null`, `hint = null`
- Acepta atributos HTML adicionales (`class`, `id`, `data-*`, `wire:*`, `x-*`).

### `x-maristas::state`
- Propiedades: `tone = 'neutral'`, `icon = null`
- Acepta atributos HTML adicionales (`class`, `id`, `data-*`, `wire:*`, `x-*`).

### `x-maristas::topbar`
- Propiedades: `id = 'mr-topbar'`, `label = 'Navegación principal'`
- Slots con nombre: `brand`, `tools` (`<x-slot:nombre>…</x-slot:nombre>`).
- Acepta atributos HTML adicionales (`class`, `id`, `data-*`, `wire:*`, `x-*`).

### `x-maristas::user-menu`
- Propiedades: `name (obligatoria)`, `role = null`
- Acepta atributos HTML adicionales (`class`, `id`, `data-*`, `wire:*`, `x-*`).

## Clases disponibles

Estas son todas las clases `.mr-*` que existen, agrupadas por familia. Usa solo estas.

- **action**: `mr-action-bar`
- **actions**: `mr-actions`
- **auth**: `mr-auth`, `mr-auth-badge`, `mr-auth-brand`, `mr-auth-card`, `mr-auth-crest`, `mr-auth-doc`, `mr-auth-form`, `mr-auth-lead`, `mr-auth-logo`, `mr-auth-title`
- **av**: `mr-av`, `mr-av-lg`, `mr-av-md`, `mr-av-sm`, `mr-av-soft`, `mr-av-stack`
- **backtop**: `mr-backtop`
- **banner**: `mr-banner`, `mr-banner-actions`, `mr-banner-eyebrow`, `mr-banner-icon`, `mr-banner-lead`, `mr-banner-main`, `mr-banner-title`
- **block**: `mr-block-head`
- **blueprint**: `mr-blueprint`, `mr-blueprint-figure`, `mr-blueprint-label`, `mr-blueprint-logo`, `mr-blueprint-marks`, `mr-blueprint-title`
- **body**: `mr-body`
- **box**: `mr-box`, `mr-box-sm`
- **breadcrumb**: `mr-breadcrumb`
- **btn**: `mr-btn-dashed`, `mr-btn-ghost`, `mr-btn-icon`, `mr-btn-main`
- **caption**: `mr-caption`
- **card**: `mr-card-accent`, `mr-card-flat`
- **chip**: `mr-chip`
- **chips**: `mr-chips`
- **copy**: `mr-copy`
- **cover**: `mr-cover`, `mr-cover-actions`, `mr-cover-body`, `mr-cover-card`, `mr-cover-empty`, `mr-cover-meta`, `mr-cover-subtitle`, `mr-cover-tags`, `mr-cover-text`, `mr-cover-title`
- **crumbs**: `mr-crumbs`
- **day**: `mr-day`
- **dim**: `mr-dim`, `mr-dim-h`, `mr-dim-v`
- **doc**: `mr-doc-nav`, `mr-doc-section`
- **docbar**: `mr-docbar`, `mr-docbar-brand`, `mr-docbar-menu`, `mr-docbar-search`, `mr-docbar-tag`, `mr-docbar-version`
- **doclayout**: `mr-doclayout`
- **docmain**: `mr-docmain`
- **docnav**: `mr-docnav`, `mr-docnav-group`
- **docs**: `mr-docs`
- **docside**: `mr-docside`
- **doctoc**: `mr-doctoc`, `mr-doctoc-inner`
- **dot**: `mr-dot`
- **dropzone**: `mr-dropzone`
- **dt**: `mr-dt`, `mr-dt-bulk`, `mr-dt-filter`, `mr-dt-footer`, `mr-dt-panel`, `mr-dt-search`, `mr-dt-toolbar`, `mr-dt-toolbar-end`
- **empty**: `mr-empty`, `mr-empty-title`
- **example**: `mr-example`, `mr-example-code`, `mr-example-codebox`, `mr-example-head`, `mr-example-preview`, `mr-example-tabs`, `mr-example-title`
- **eyebrow**: `mr-eyebrow`
- **fact**: `mr-fact`, `mr-fact-inline`, `mr-fact-sub`, `mr-fact-value`
- **facts**: `mr-facts`
- **file**: `mr-file`
- **files**: `mr-files`
- **filter**: `mr-filter`, `mr-filter-count`, `mr-filter-danger`, `mr-filter-warning`
- **filters**: `mr-filters`
- **footer**: `mr-footer`, `mr-footer-full`
- **form**: `mr-form-actions`, `mr-form-section`, `mr-form-section-hint`, `mr-form-section-title`
- **h1**: `mr-h1`
- **h2**: `mr-h2`
- **h3**: `mr-h3`
- **hero**: `mr-hero`, `mr-hero-top`
- **icon**: `mr-icon-tile`
- **icons**: `mr-icons`
- **inbox**: `mr-inbox`, `mr-inbox-bar`
- **kv**: `mr-kv`
- **label**: `mr-label-row`
- **legend**: `mr-legend`, `mr-legend-value`
- **link**: `mr-link`, `mr-link-id`
- **mail**: `mr-mail`, `mr-mail-date`, `mr-mail-dir`, `mr-mail-list`, `mr-mail-main`, `mr-mail-row`, `mr-mail-snippet`, `mr-mail-subject`, `mr-mail-who`
- **menu**: `mr-menu-head`
- **modal**: `mr-modal-close`, `mr-modal-open`
- **multi**: `mr-multi`, `mr-multi-chips`, `mr-multi-options`
- **name**: `mr-name`
- **notif**: `mr-notif`, `mr-notif-dot`, `mr-notif-icon`, `mr-notif-info`, `mr-notif-neutral`, `mr-notif-success`, `mr-notif-time`
- **page**: `mr-page`
- **pagebar**: `mr-pagebar`, `mr-pagebar-title`
- **pagehead**: `mr-pagehead`
- **pagelead**: `mr-pagelead`
- **pager**: `mr-pager`, `mr-pager-link`
- **pagetitle**: `mr-pagetitle`
- **palette**: `mr-palette`, `mr-palette-body`, `mr-palette-box`, `mr-palette-empty`, `mr-palette-foot`, `mr-palette-group`, `mr-palette-head`, `mr-palette-item`, `mr-palette-list`, `mr-palette-open`, `mr-palette-sub`
- **password**: `mr-password`, `mr-password-toggle`
- **person**: `mr-person`
- **progress**: `mr-progress`, `mr-progress-head`
- **prop**: `mr-prop`, `mr-prop-label`
- **reader**: `mr-reader`, `mr-reader-body`, `mr-reader-empty`, `mr-reader-foot`, `mr-reader-head`
- **relation**: `mr-relation`
- **req**: `mr-req`
- **row**: `mr-row-danger`
- **rule**: `mr-rule`, `mr-rule-do`, `mr-rule-dont`
- **scope**: `mr-scope`
- **scroll**: `mr-scroll`, `mr-scroll-menu`
- **seg**: `mr-seg`
- **skeleton**: `mr-skeleton`
- **small**: `mr-small`
- **spin**: `mr-spin`
- **stat**: `mr-stat`, `mr-stat-body`, `mr-stat-delta`, `mr-stat-hint`, `mr-stat-label`, `mr-stat-value`, `mr-stat-with-icon`
- **state**: `mr-state`, `mr-state-danger`, `mr-state-info`, `mr-state-neutral`, `mr-state-success`, `mr-state-warning`
- **step**: `mr-step`, `mr-step-bar`, `mr-step-label`
- **stepper**: `mr-stepper`, `mr-stepper-dot`, `mr-stepper-item`, `mr-stepper-label`, `mr-stepper-link`, `mr-stepper-vertical`
- **steps**: `mr-steps`
- **swatch**: `mr-swatch`, `mr-swatch-color`, `mr-swatch-meta`
- **swatches**: `mr-swatches`
- **table**: `mr-table-wrap`
- **tabs**: `mr-tabs`
- **tag**: `mr-tag`
- **tags**: `mr-tags`
- **tile**: `mr-tile`, `mr-tile-icon`
- **tl**: `mr-tl`, `mr-tl-author`, `mr-tl-dot`, `mr-tl-item`, `mr-tl-line`, `mr-tl-main`, `mr-tl-note`, `mr-tl-quote`, `mr-tl-time`
- **toast**: `mr-toast-danger`, `mr-toast-info`, `mr-toast-success`, `mr-toast-warning`
- **tone**: `mr-tone-brand`, `mr-tone-danger`, `mr-tone-info`, `mr-tone-muted`, `mr-tone-success`, `mr-tone-warning`
- **topbar**: `mr-topbar`, `mr-topbar-brand`, `mr-topbar-btn`, `mr-topbar-count`, `mr-topbar-full`, `mr-topbar-inst`, `mr-topbar-inst-label`, `mr-topbar-link`, `mr-topbar-main`, `mr-topbar-nav`, `mr-topbar-panel`, `mr-topbar-toggler`, `mr-topbar-tools`, `mr-topbar-user-name`
- **type**: `mr-type-row`

Obsoletas (funcionan en la serie 1.x, se retiran en la 2.0; no las uses en código nuevo):
- `mr-avatar` → <x-maristas::avatar size="lg">
- `mr-pill` → <x-maristas::state>
- `mr-events` → la línea de tiempo `.mr-tl`
- `mr-event` → la línea de tiempo `.mr-tl`
- `mr-chip-action` → un botón `btn mr-btn-dashed`

## Catálogo de componentes y patrones

Cada ejemplo es código listo para copiar. Cambia los datos, no la estructura.

### Empezar

#### Cómo usarlo (`uso`)

Tres pasos para una pantalla nueva o una que se migre.

#### Para asistentes de IA (`ia`)

Una guía en Markdown generada desde este mismo kit, para que Claude, Copilot o Cursor escriban pantallas que respeten el sistema de diseño.

**Genera la guía en tu proyecto** — La guía no se escribe a mano: sale de los tokens del CSS, las propiedades de los componentes y los ejemplos de esta documentación, así que siempre coincide con la versión instalada.

```blade
# Escribe docs/maristas-ui.md y avisa a Claude Code, Cursor y Copilot
php artisan maristas-ui:ia --agentes
# Solo el resumen, sin ejemplos
php artisan maristas-ui:ia --resumen
# En otra ruta
php artisan maristas-ui:ia --ruta=storage/maristas-ui.md
```

**Qué hace --agentes** — Agrega un bloque entre marcas a CLAUDE.md y AGENTS.md (si no existe ninguno, crea AGENTS.md). Volver a ejecutarlo actualiza ese bloque sin tocar el resto del archivo.

```blade
<!-- maristas-ui:inicio -->
## Interfaz de usuario
Toda pantalla nueva o modificada usa el Maristas UI Kit. Antes de escribir vistas lee `docs/maristas-ui.md` y sigue sus reglas: componentes `x-maristas::*`, clases `.mr-*` y tokens `--maristas-*`; no inventes estilos.
<!-- maristas-ui:fin -->
```

**Cómo pedirle una pantalla** — Con la guía en el proyecto basta con describir qué necesitas; no hace falta explicar el diseño.

```blade
Crea la pantalla de «Documentos del aspirante»: una tabla con búsqueda y
filtro por estado, selección de filas con acción en lote «Solicitar de nuevo»
y un botón principal «Agregar documento». Usa el Maristas UI Kit.
```

### Fundamentos

#### Colores (`colores`)

La marca es el azul institucional. Los estados (éxito, atención, error, información) son independientes de la marca y nunca se usan como acento decorativo.

#### Tipografía (`tipografia`)

Una sola familia, Poppins, en pesos 400, 500, 600 y 700. La jerarquía se logra con tamaño y peso, no con mayúsculas ni con color.

**Enlaces y listas**

```blade
<div class="w-100">
    <p class="mb-2">Un enlace dentro de un texto se ve así: <a href="#tipografia" class="mr-link">revisar el expediente completo</a>.</p>
    <ul class="mb-2">
        <li>Las listas usan el mismo tamaño que el párrafo.</li>
        <li>Cada elemento dice una sola cosa.</li>
    </ul>
    <ol class="mb-0">
        <li>Las listas numeradas solo se usan si el orden importa.</li>
        <li>Por ejemplo, los pasos de un proceso.</li>
    </ol>
</div>
```

#### Íconos (`iconos`)

Usamos Remix Icon (`ri-*`), en estilo de línea. Haz clic en un ícono para copiar su clase. Un ícono acompaña al texto; si va solo, necesita `aria-label`.

#### Forma y espacio (`forma`)

Cuatro radios según el tamaño del elemento, sombras por nivel de elevación, alturas de los controles, espaciado en múltiplos de 4px y un margen de página compartido.

#### Accesibilidad (`accesibilidad`)

Mínimos que todo componente del kit cumple y que toda pantalla debe respetar.

### Entradas

#### Botones (`botones`)

Un botón principal por vista. Los demás son secundarios. Todos comparten alto, radio, tipografía y estados; el deshabilitado es azul claro, nunca gris.

**Variantes**

```blade
<x-maristas::button icon="ri-contacts-fill">Registrar seguimiento</x-maristas::button>
<x-maristas::button variant="secondary" icon="ri-mail-line">Correo</x-maristas::button>
<x-maristas::button variant="danger" icon="ri-delete-bin-line">Eliminar</x-maristas::button>
<x-maristas::button variant="success" icon="ri-check-line">Aprobar</x-maristas::button>
```

**Sobre fondo oscuro** — Con variant light (principal, blanco) y outline-light (fantasma: transparente, se aclara al pasar el cursor). Úsalos en banners y portadas.

```blade
<x-maristas::button variant="light" icon="ri-add-line">Principal</x-maristas::button>
<x-maristas::button variant="outline-light" icon="ri-price-tag-3-line">Fantasma</x-maristas::button>
```

**Tamaños** — Pequeño dentro de tarjetas, tablas y barras de herramientas; normal para la acción principal de la página; grande en pantallas táctiles o para una acción única y destacada.

```blade
<x-maristas::button size="sm">Pequeño</x-maristas::button>
<x-maristas::button>Normal</x-maristas::button>
<x-maristas::button size="lg">Grande</x-maristas::button>
<x-maristas::button variant="secondary" size="sm">Pequeño secundario</x-maristas::button>
<x-maristas::button variant="secondary" size="lg">Grande secundario</x-maristas::button>
```

**Estados**

```blade
<x-maristas::button disabled icon="ri-send-plane-2-line">Publicar nota</x-maristas::button>
<x-maristas::button variant="secondary" disabled>Deshabilitado</x-maristas::button>
<x-maristas::button disabled><span class="spinner-border spinner-border-sm" role="status" aria-hidden="true"></span>Enviando…</x-maristas::button>
```

**Solo ícono** — Siempre con aria-label y title, porque no tiene texto.

```blade
<x-maristas::button variant="secondary" size="sm" aria-label="Editar" title="Editar"><i class="ri-pencil-fill"></i></x-maristas::button>
<x-maristas::button variant="secondary" size="sm" aria-label="Descargar" title="Descargar"><i class="ri-download-2-line"></i></x-maristas::button>
<x-maristas::button variant="secondary" size="sm" aria-label="Más acciones" title="Más acciones"><i class="ri-more-2-fill"></i></x-maristas::button>
```

**Botón punteado (editar)** — La acción de editar de un bloque: «Editar contacto», «Editar estudiante». Es un botón pequeño con borde punteado azul y lápiz. Bloqueado, aparece con candado y atenuado, y explica el motivo al pasar el cursor.

```blade
<div class="d-flex flex-wrap gap-2">
    <x-maristas::edit-link target="#kit-editar-modal" label="Editar contacto" />
    <x-maristas::edit-link target="#kit-editar-modal" :locked="true" locked-label="Estudiante bloqueado" locked-title="Los datos ya fueron confirmados y no se pueden editar" />
</div>
```

**Grupo y menú de acciones**

```blade
<div class="btn-group" role="group" aria-label="Vista">
    <button type="button" class="btn btn-primary btn-sm">Lista</button>
    <button type="button" class="btn btn-light btn-sm">Tarjetas</button>
</div>
<div class="dropdown">
    <button class="btn btn-light btn-sm dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-expanded="false">Acciones</button>
    <ul class="dropdown-menu">
        <li><a class="dropdown-item" href="#botones"><i class="ri-user-shared-line"></i>Reasignar</a></li>
        <li><a class="dropdown-item" href="#botones"><i class="ri-history-line"></i>Ver historial</a></li>
        <li><hr class="dropdown-divider"></li>
        <li><a class="dropdown-item text-danger" href="#botones"><i class="ri-delete-bin-line"></i>Eliminar</a></li>
    </ul>
</div>
```

#### Formularios (`formularios`)

Etiqueta pequeña arriba, campo con radio medio y un anillo azul al enfocar. El mismo estilo para campos, selectores y áreas de texto. Los errores dicen qué pasó y cómo corregirlo.

**Campos**

```blade
<div class="row g-3 w-100">
    <div class="col-md-6">
        <label class="form-label" for="kit-nombre">Nombre</label>
        <input id="kit-nombre" class="form-control" type="text" value="María López">
    </div>
    <div class="col-md-6">
        <label class="form-label" for="kit-asesor">Responsable</label>
        <select id="kit-asesor" class="form-select">
            <option>Laura Ramírez Soto</option>
            <option>Sin asignar</option>
        </select>
    </div>
    <div class="col-12">
        <label class="form-label" for="kit-nota">Nueva nota</label>
        <textarea id="kit-nota" class="form-control" rows="2" placeholder="Escribe un comentario breve para el equipo"></textarea>
        <div class="form-text">Máximo 500 caracteres.</div>
    </div>
</div>
```

**Campos obligatorios y errores** — Marca los obligatorios con la clase mr-req en la etiqueta: pone el asterisco en rojo sin escribirlo a mano. El error va debajo del campo con is-invalid e invalid-feedback.

```blade
<label class="form-label mr-req" for="nombre">Nombre</label>
<input id="nombre" class="form-control @error('nombre') is-invalid @enderror" wire:model="nombre">
@error('nombre')<div class="invalid-feedback">{{ $message }}</div>@enderror
<div class="mr-box">…bloque…</div>
```

**Revisión antes de confirmar y acciones al pie** — mr-kv ordena pares dato-valor en columnas que se adaptan al ancho. mr-form-actions separa los botones del paso: «Atrás» a la izquierda y la acción principal a la derecha, una sola.

```blade
<div class="mr-box">
    <div class="mr-block-head mb-3"><h6 class="card-title mb-0">Contacto</h6> <button class="btn btn-sm mr-btn-dashed">Editar</button></div>
    <dl class="mr-kv">
        <div><dt>Nombre</dt><dd>María López Soto</dd></div>
        <div class="is-wide"><dt>Correo</dt><dd>maria@example.com</dd></div>
    </dl>
</div>
<div class="mr-form-actions">
    <button class="btn btn-light">Atrás</button>
    <button class="btn btn-primary">Confirmar y guardar</button>
</div>
```

**Etiqueta con acción** — Cuando la etiqueta lleva un interruptor o un enlace a la derecha, envuélvelos en mr-label-row: el campo queda alineado con sus vecinos.

```blade
<div class="mr-label-row">
    <label class="form-label" for="curp">CURP (opcional)</label>
    <div class="form-check form-switch">
        <input class="form-check-input" type="checkbox" id="extranjero">
        <label class="form-check-label mr-small" for="extranjero">Extranjero</label>
    </div>
</div>
<input id="curp" class="form-control">
```

**Formulario largo en secciones** — Divide un formulario de más de cinco campos en secciones con título y una línea de ayuda. Pon el formulario en una tarjeta de ancho cómodo y las instrucciones en una caja a un lado.

```blade
<div class="row g-3">
    <div class="col-lg-8">
        <div class="card"><div class="card-body p-4">
            <section class="mr-form-section">
                <h6 class="mr-form-section-title">Datos de la persona</h6>
                <p class="mr-form-section-hint">Se toman de SIGEM; revisa que coincidan.</p>
                …campos…
            </section>
            <section class="mr-form-section">…</section>
            <div class="mr-form-actions">…</div>
        </div></div>
    </div>
    <div class="col-lg-4"><div class="mr-box is-soft position-sticky" style="top: 1rem">…instrucciones…</div></div>
</div>
```

**Contraseña y pantalla de acceso** — mr-password agrega el botón para mostrar u ocultar. Las pantallas de acceso usan mr-auth (fondo), mr-auth-card con has-brand (dos paneles), mr-auth-brand y mr-auth-form. El botón con data-loading-text muestra «Ingresando…» al enviar.

```blade
<div class="mr-auth">
    <div class="mr-auth-card has-brand">
        <div class="mr-auth-brand">
            <img class="mr-auth-logo" src="…logo-blanco.svg" alt="SIGEM">
            <img class="mr-auth-crest" src="…escudo-blanco.svg" alt="">
            <p>Sistema de Información para la Gestión Marista.</p>
        </div>
        <div class="mr-auth-form">
            <h1 class="mr-auth-title">Módulo CRM</h1>
            <p class="mr-auth-lead">Inicia sesión con tu correo y contraseña.</p>
            <form method="POST">
                <label class="form-label" for="password">Contraseña</label>
                <div class="mr-password">
                    <input id="password" class="form-control" type="password">
                    <button type="button" class="mr-password-toggle" data-mr-password-toggle aria-label="Mostrar la contraseña" aria-pressed="false"><i class="ri-eye-line"></i></button>
                </div>
                <button class="btn btn-primary w-100 mt-3" data-loading-text="Ingresando…">Ingresar</button>
            </form>
        </div>
    </div>
</div>
```

**Tamaños de campos** — Pequeño en filtros y celdas de tabla, normal en formularios, grande en pantallas táctiles. Se piden con form-control-sm, form-control-lg, form-select-sm y form-select-lg.

```blade
<div class="row g-3 w-100">
    <div class="col-md-4">
        <label class="form-label" for="kit-t-sm">Pequeño</label>
        <input id="kit-t-sm" class="form-control form-control-sm" type="text" value="María López">
    </div>
    <div class="col-md-4">
        <label class="form-label" for="kit-t-md">Normal</label>
        <input id="kit-t-md" class="form-control" type="text" value="María López">
    </div>
    <div class="col-md-4">
        <label class="form-label" for="kit-t-lg">Grande</label>
        <input id="kit-t-lg" class="form-control form-control-lg" type="text" value="María López">
    </div>
    <div class="col-md-4">
        <label class="form-label" for="kit-s-sm">Selector pequeño</label>
        <select id="kit-s-sm" class="form-select form-select-sm"><option>Todos los estados</option></select>
    </div>
    <div class="col-md-4">
        <label class="form-label" for="kit-s-md">Selector normal</label>
        <select id="kit-s-md" class="form-select"><option>Todos los estados</option></select>
    </div>
    <div class="col-md-4">
        <label class="form-label" for="kit-s-lg">Selector grande</label>
        <select id="kit-s-lg" class="form-select form-select-lg"><option>Todos los estados</option></select>
    </div>
    <div class="col-md-4">
        <div class="input-group input-group-sm">
            <span class="input-group-text"><i class="ri-search-line"></i></span>
            <input class="form-control" type="search" placeholder="Buscar (pequeño)" aria-label="Buscar, tamaño pequeño">
        </div>
    </div>
    <div class="col-md-4">
        <div class="input-group">
            <span class="input-group-text"><i class="ri-search-line"></i></span>
            <input class="form-control" type="search" placeholder="Buscar (normal)" aria-label="Buscar, tamaño normal">
        </div>
    </div>
    <div class="col-md-4">
        <div class="input-group input-group-lg">
            <span class="input-group-text"><i class="ri-search-line"></i></span>
            <input class="form-control" type="search" placeholder="Buscar (grande)" aria-label="Buscar, tamaño grande">
        </div>
    </div>
</div>
```

**Estados del campo**

```blade
<div class="row g-3 w-100">
    <div class="col-md-4">
        <label class="form-label" for="kit-ok">Correo electrónico</label>
        <input id="kit-ok" class="form-control is-valid" type="email" value="maria.lopez@ejemplo.mx">
        <div class="valid-feedback d-block">Correo válido.</div>
    </div>
    <div class="col-md-4">
        <label class="form-label" for="kit-error">Teléfono celular</label>
        <input id="kit-error" class="form-control is-invalid" type="tel" value="55352">
        <div class="invalid-feedback d-block">Escribe los 10 dígitos del celular.</div>
    </div>
    <div class="col-md-4">
        <label class="form-label" for="kit-dis">Folio</label>
        <input id="kit-dis" class="form-control" type="text" value="REG-13573" disabled>
        <div class="form-text">Lo asigna el sistema.</div>
    </div>
</div>
```

**Grupo de entrada y búsqueda**

```blade
<div class="row g-3 w-100">
    <div class="col-md-6">
        <label class="form-label" for="kit-buscar">Buscar persona</label>
        <div class="input-group">
            <span class="input-group-text"><i class="ri-search-line"></i></span>
            <input id="kit-buscar" class="form-control" type="search" placeholder="Nombre, correo o folio">
        </div>
    </div>
    <div class="col-md-6">
        <label class="form-label" for="kit-cel">Celular</label>
        <div class="input-group">
            <span class="input-group-text">+52</span>
            <input id="kit-cel" class="form-control" type="tel" placeholder="10 dígitos">
        </div>
    </div>
</div>
```

**Casillas, opciones e interruptor**

```blade
<div class="d-flex flex-wrap gap-4">
    <div class="form-check">
        <input class="form-check-input" type="checkbox" id="kit-chk" checked>
        <label class="form-check-label" for="kit-chk">Enviar copia al responsable</label>
    </div>
    <div>
        <div class="form-check">
            <input class="form-check-input" type="radio" name="kit-radio" id="kit-r1" checked>
            <label class="form-check-label" for="kit-r1">Por correo</label>
        </div>
        <div class="form-check">
            <input class="form-check-input" type="radio" name="kit-radio" id="kit-r2">
            <label class="form-check-label" for="kit-r2">Por teléfono</label>
        </div>
    </div>
</div>
```

**Tamaños de casillas y opciones** — Con form-check-sm y form-check-lg en el contenedor. El tamaño grande es el recomendado en pantallas táctiles.

```blade
<div class="d-flex flex-wrap align-items-center gap-4">
    <div class="form-check form-check-sm">
        <input class="form-check-input" type="checkbox" id="kit-c-sm" checked>
        <label class="form-check-label" for="kit-c-sm">Pequeña</label>
    </div>
    <div class="form-check">
        <input class="form-check-input" type="checkbox" id="kit-c-md" checked>
        <label class="form-check-label" for="kit-c-md">Normal</label>
    </div>
    <div class="form-check form-check-lg">
        <input class="form-check-input" type="checkbox" id="kit-c-lg" checked>
        <label class="form-check-label" for="kit-c-lg">Grande</label>
    </div>
    <div class="form-check form-check-lg">
        <input class="form-check-input" type="radio" name="kit-rd-lg" id="kit-rd-lg" checked>
        <label class="form-check-label" for="kit-rd-lg">Opción grande</label>
    </div>
</div>
```

**Interruptores** — Para opciones que se activan o desactivan al instante. Tres tamaños: pequeño dentro de tablas y barras, normal en formularios, grande en pantallas táctiles.

```blade
<div class="d-flex flex-wrap align-items-center gap-4">
    <div class="form-check form-switch form-switch-sm">
        <input class="form-check-input" type="checkbox" role="switch" id="kit-sw-sm" checked>
        <label class="form-check-label" for="kit-sw-sm">Pequeño</label>
    </div>
    <div class="form-check form-switch">
        <input class="form-check-input" type="checkbox" role="switch" id="kit-sw-md" checked>
        <label class="form-check-label" for="kit-sw-md">Avisar al responsable</label>
    </div>
    <div class="form-check form-switch form-switch-lg">
        <input class="form-check-input" type="checkbox" role="switch" id="kit-sw-lg" checked>
        <label class="form-check-label" for="kit-sw-lg">Grande</label>
    </div>
    <div class="form-check form-switch">
        <input class="form-check-input" type="checkbox" role="switch" id="kit-sw-off">
        <label class="form-check-label" for="kit-sw-off">Apagado</label>
    </div>
    <div class="form-check form-switch">
        <input class="form-check-input" type="checkbox" role="switch" id="kit-sw-dis" checked disabled>
        <label class="form-check-label" for="kit-sw-dis">Deshabilitado</label>
    </div>
</div>
```

#### Selectores y etiquetas (`seleccion`)

Para elegir entre muchas opciones o capturar varias etiquetas sin salir del formulario.

**Autocompletar** — Un campo de texto con sugerencias nativas (datalist): rápido de escribir y accesible por teclado.

```blade
<div class="w-100" style="max-width: 360px;">
    <label class="form-label" for="mr-inst">Institución</label>
    <input id="mr-inst" class="form-control" list="mr-inst-lista" placeholder="Escribe para buscar">
    <datalist id="mr-inst-lista">
        <option value="Instituto México Primaria"><option value="Colegio Champagnat"><option value="Instituto Hispano Inglés"><option value="Colegio Cristóbal Colón">
    </datalist>
</div>
```

**Etiquetas** — Escribe y presiona Enter o coma para agregar; cada etiqueta se quita con su ×. Se activa con data-mr-tags.

```blade
<div class="w-100" style="max-width: 460px;">
    <label class="form-label" for="mr-tags-input">Intereses del aspirante</label>
    <div class="mr-tags" data-mr-tags data-mr-tags-name="intereses[]">
        <span class="mr-tag">Deportes<button type="button" aria-label="Quitar Deportes">&times;</button></span>
        <span class="mr-tag">Música<button type="button" aria-label="Quitar Música">&times;</button></span>
        <input id="mr-tags-input" type="text" placeholder="Agregar…">
    </div>
    <div class="form-text">Máximo 8 etiquetas.</div>
</div>
```

**Selección múltiple** — Un menú con casillas que no se cierra al elegir; el botón resume cuántas hay marcadas.

```blade
<div class="dropdown" data-mr-multiselect>
    <button type="button" class="btn btn-light dropdown-toggle" data-bs-toggle="dropdown" data-bs-auto-close="outside" aria-expanded="false"><i class="ri-filter-3-line"></i><span data-mr-multiselect-label>Grados</span></button>
    <div class="dropdown-menu" style="min-width: 220px;">
        @foreach (['Preescolar', 'Primaria', 'Secundaria', 'Bachillerato'] as $grado)
            <label class="dropdown-item d-flex align-items-center gap-2 mb-0"><input class="form-check-input mt-0" type="checkbox" value="{{ $grado }}">{{ $grado }}</label>
        @endforeach
    </div>
</div>
```

**Selección múltiple con buscador y etiquetas** — Para listas largas: busca dentro del menú y muestra lo elegido como etiquetas que se quitan con su ×. Las casillas se envían con el formulario.

```blade
<x-maristas::multiselect
    name="instituciones[]"
    placeholder="Selecciona instituciones"
    search-placeholder="Buscar institución…"
    :options="$instituciones->pluck('nombre', 'id')"
    :selected="old('instituciones', $usuario->instituciones->pluck('id'))"
    :invalid="$errors->has('instituciones')" />
```

#### Fecha, hora y rango (`fecha`)

Fechas, horas y rangos con los controles nativos del navegador, con el mismo aspecto que el resto de los campos.

**Fecha y hora** — Controles nativos: en celular abren el selector del sistema y en escritorio el del navegador.

```blade
<div class="row g-3 w-100">
    <div class="col-md-4"><label class="form-label" for="mr-f1">Fecha</label><input id="mr-f1" type="date" class="form-control" value="2026-07-18"></div>
    <div class="col-md-4"><label class="form-label" for="mr-f2">Hora</label><input id="mr-f2" type="time" class="form-control" value="12:00"></div>
    <div class="col-md-4"><label class="form-label" for="mr-f3">Fecha y hora</label><input id="mr-f3" type="datetime-local" class="form-control" value="2026-07-18T12:00"></div>
</div>
```

**Rango de fechas**

```blade
<div class="w-100" style="max-width: 460px;">
    <label class="form-label" for="mr-r1">Periodo</label>
    <div class="input-group">
        <input id="mr-r1" type="date" class="form-control" value="2026-07-01" aria-label="Desde">
        <span class="input-group-text">a</span>
        <input type="date" class="form-control" value="2026-07-31" aria-label="Hasta">
    </div>
</div>
```

**Rango (deslizador)** — Con data-mr-range-output el valor se muestra al lado y se actualiza al mover.

```blade
<div class="w-100" style="max-width: 360px;">
    <label class="form-label d-flex justify-content-between" for="mr-rg">Cuota máxima <strong data-mr-range-output="#mr-rg">$15,000</strong></label>
    <input id="mr-rg" type="range" class="form-range" min="5000" max="30000" step="500" value="15000" data-mr-range-format="currency">
</div>
```

#### Carga de archivos (`archivos`)

Una zona para arrastrar o elegir archivos y una lista que muestra el avance de cada uno.

**Zona de carga** — Arrastra archivos o haz clic para elegirlos. Se activa con data-mr-dropzone y muestra la lista debajo.

```blade
<div class="w-100" data-mr-dropzone>
    <label class="mr-dropzone">
        <i class="ri-upload-cloud-2-line"></i>
        <strong>Arrastra tus archivos aquí</strong>
        <span class="mr-small">o haz clic para elegirlos · PDF, JPG o PNG, máximo 5 MB</span>
        <input type="file" multiple hidden>
    </label>
    <ul class="mr-files" data-mr-file-list></ul>
</div>
```

**Lista de archivos** — Cada archivo muestra su nombre, tamaño y estado: avance, listo o error.

```blade
<ul class="mr-files w-100">
    <li class="mr-file"><i class="ri-file-pdf-2-line"></i><div class="flex-grow-1 min-w-0"><div class="d-flex justify-content-between"><span class="text-truncate">acta-de-nacimiento.pdf</span><span class="mr-small">1.2 MB</span></div><div class="progress mt-1" role="progressbar" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100" style="height: 4px"><div class="progress-bar bg-success" style="width: 100%"></div></div></div><x-maristas::state tone="success" icon="ri-check-line">Listo</x-maristas::state></li>
    <li class="mr-file"><i class="ri-image-line"></i><div class="flex-grow-1 min-w-0"><div class="d-flex justify-content-between"><span class="text-truncate">comprobante-domicilio.jpg</span><span class="mr-small">3.8 MB</span></div><div class="progress mt-1" role="progressbar" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100" style="height: 4px"><div class="progress-bar" style="width: 60%"></div></div></div><x-maristas::state tone="info">60%</x-maristas::state></li>
    <li class="mr-file"><i class="ri-file-pdf-2-line"></i><div class="flex-grow-1 min-w-0"><div class="d-flex justify-content-between"><span class="text-truncate">boleta-anterior.pdf</span><span class="mr-small">8.4 MB</span></div><div class="mr-small text-danger mt-1">Pesa más de 5 MB. Comprímelo e inténtalo de nuevo.</div></div><x-maristas::state tone="danger" icon="ri-error-warning-line">Error</x-maristas::state></li>
</ul>
```

### Datos

#### Acordeón y listas (`disclosure`)

Para ocultar detalle secundario sin perderlo, y para mostrar elementos que se escanean uno tras otro.

**Acordeón**

```blade
<div class="accordion w-100" id="kit-acordeon">
    <div class="accordion-item">
        <h2 class="accordion-header"><button class="accordion-button" type="button" data-bs-toggle="collapse" data-bs-target="#kit-ac1" aria-expanded="true" aria-controls="kit-ac1">Inscripciones activas</button></h2>
        <div id="kit-ac1" class="accordion-collapse collapse show" data-bs-parent="#kit-acordeon"><div class="accordion-body small">Ana Sofía Pérez López · 5º Primaria</div></div>
    </div>
    <div class="accordion-item">
        <h2 class="accordion-header"><button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#kit-ac2" aria-expanded="false" aria-controls="kit-ac2">Inscripciones anteriores</button></h2>
        <div id="kit-ac2" class="accordion-collapse collapse" data-bs-parent="#kit-acordeon"><div class="accordion-body small">Sin inscripciones anteriores.</div></div>
    </div>
</div>
```

**Lista de elementos**

```blade
<ul class="list-group w-100">
    <li class="list-group-item active">Plantilla: Recordatorio de documentos</li>
    <li class="list-group-item">Plantilla: Bienvenida al ciclo escolar</li>
    <li class="list-group-item">Plantilla: Recordatorio de cita</li>
</ul>
```

#### Avatares (`avatares`)

Iniciales sobre un fondo de marca. Tres tamaños y una versión suave para filas de tabla.

**Tamaños y variantes**

```blade
<x-maristas::avatar name="María López" size="lg" />
<x-maristas::avatar name="María López" size="md" />
<x-maristas::avatar name="María López" size="sm" />
<x-maristas::avatar name="María López" size="md" soft />
<span class="mr-av-stack">
    <x-maristas::avatar name="Laura Ramírez" size="sm" />
    <x-maristas::avatar name="Carlos Rivas" size="sm" soft />
    <x-maristas::avatar name="Jorge Hernández" size="sm" />
</span>
```

**Iniciales exactas** — Con nombre y apellido por separado, pasa initials. Sin él, con tres o más palabras se usa la primera y la penúltima (se asume nombre + dos apellidos).

```blade
<x-maristas::avatar :name="$lead->nombre_completo" :initials="mb_substr($lead->nombre, 0, 1).mb_substr($lead->apellido_paterno, 0, 1)" />
```

#### Estados y chips (`estados`)

Una etiqueta de estado dice una cosa y usa un color semántico. Nunca se usa el color de marca para un estado.

**Etiquetas de estado**

```blade
<x-maristas::state tone="success" icon="ri-check-line">Enviado</x-maristas::state>
<x-maristas::state tone="info">Respuesta nueva</x-maristas::state>
<x-maristas::state tone="warning">Enviando…</x-maristas::state>
<x-maristas::state tone="danger" icon="ri-lock-line">Bloqueado</x-maristas::state>
<x-maristas::state tone="neutral">Sin asignar</x-maristas::state>
```

**Chips** — Dato corto y clicable (teléfono, correo), en gris. Un chip muestra un dato; la acción de editar es un botón (ver Botones).

```blade
<div class="mr-chips">
    <a class="mr-chip" href="#estados"><i class="ri-phone-line"></i>55 1234 5678</a>
    <a class="mr-chip" href="#estados"><i class="ri-mail-line"></i>maria.lopez@ejemplo.mx</a>
</div>
```

**Propiedad con etiqueta** — Etiqueta pequeña en gris y valor debajo. Se usa en las pestañas de detalle.

```blade
<div class="w-100" style="max-width: 320px;">
    <x-maristas::prop label="Correo electrónico"><a href="#estados" class="mr-link">maria.lopez@ejemplo.mx</a></x-maristas::prop>
    <x-maristas::prop label="Canal de obtención">Facebook</x-maristas::prop>
</div>
```

**Distribución por estado** — Una barra segmentada con una leyenda que dice el nombre, el porcentaje y, si lo necesitas, lleva al listado filtrado. Los colores son de los tonos del kit, no de Bootstrap.

```blade
<div class="mr-seg" role="img" aria-label="Nuevo 28%, Perdido 72%">
    <span class="mr-tone-success" style="width: 28%"></span>
    <span class="mr-tone-muted" style="width: 72%"></span>
</div>
<ul class="mr-legend">
    <li><a href="…"><span class="mr-dot mr-tone-success"></span>Nuevo<span class="mr-legend-value">28%</span></a></li>
</ul>
```

#### Tablas (`tablas`)

Encabezado en gris sobre fondo suave, filas con separadores finos y resaltado al pasar el cursor. Los estados van como etiquetas y las acciones de fila en un menú.

**Lista de registros**

```blade
<div class="mr-table-wrap w-100">
    <div class="table-responsive">
        <table class="table table-hover">
            <thead>
                <tr><th>Folio</th><th>Nombre</th><th>Grado</th><th>Estado</th><th>Responsable</th><th class="text-end">Acciones</th></tr>
            </thead>
            <tbody>
                <tr>
                    <td><a href="#tablas" class="mr-link-id">REG-14958</a></td>
                    <td><div class="d-flex align-items-center gap-2"><x-maristas::avatar name="María López" size="sm" soft />María López</div></td>
                    <td>5º Primaria</td>
                    <td><x-maristas::state tone="success">Completo</x-maristas::state></td>
                    <td>Laura Ramírez</td>
                    <td class="text-end"><x-maristas::button variant="secondary" size="sm" aria-label="Más acciones"><i class="ri-more-2-fill"></i></x-maristas::button></td>
                </tr>
                <tr>
                    <td><a href="#tablas" class="mr-link-id">REG-14960</a></td>
                    <td><div class="d-flex align-items-center gap-2"><x-maristas::avatar name="Jorge Hernández" size="sm" soft />Jorge Hernández</div></td>
                    <td>1º Primaria</td>
                    <td><x-maristas::state tone="info">Nuevo</x-maristas::state></td>
                    <td><span class="text-muted">Sin asignar</span></td>
                    <td class="text-end"><x-maristas::button variant="secondary" size="sm" aria-label="Más acciones"><i class="ri-more-2-fill"></i></x-maristas::button></td>
                </tr>
                <tr>
                    <td><a href="#tablas" class="mr-link-id">REG-05318</a></td>
                    <td><div class="d-flex align-items-center gap-2"><x-maristas::avatar name="Carlos Rivas" size="sm" soft />Carlos Rivas</div></td>
                    <td>Bachillerato</td>
                    <td><x-maristas::state tone="warning">En revisión</x-maristas::state></td>
                    <td>Laura Ramírez</td>
                    <td class="text-end"><x-maristas::button variant="secondary" size="sm" aria-label="Más acciones"><i class="ri-more-2-fill"></i></x-maristas::button></td>
                </tr>
            </tbody>
        </table>
    </div>
</div>
```

**Enlace principal de la fila** — El enlace que abre el registro lleva mr-link-id (semibold, un solo por fila). Si va en una celda de encabezado de fila (th scope="row") se alinea con su encabezado igual que un td; los demás enlaces de la tabla usan mr-link.

```blade
<div class="mr-table-wrap w-100">
    <div class="table-responsive">
        <table class="table table-hover">
            <thead>
                <tr><th scope="col">Folio</th><th scope="col">Nombre</th><th scope="col">Estado</th></tr>
            </thead>
            <tbody>
                <tr>
                    <th scope="row"><a href="#tablas" class="mr-link-id">REG-15037</a></th>
                    <td>Lisbeth Alarcón <a href="#tablas" class="mr-link">Ver contacto</a></td>
                    <td><x-maristas::state tone="info">Contactado</x-maristas::state></td>
                </tr>
                <tr>
                    <th scope="row"><a href="#tablas" class="mr-link-id">REG-14967</a></th>
                    <td>Eduardo Juárez <a href="#tablas" class="mr-link">Ver contacto</a></td>
                    <td><x-maristas::state tone="success">Nuevo</x-maristas::state></td>
                </tr>
            </tbody>
        </table>
    </div>
</div>
```

**Paginación**

```blade
<nav aria-label="Paginación de la lista">
    <ul class="pagination mb-0">
        <li class="page-item disabled"><a class="page-link" href="#tablas" aria-label="Anterior"><i class="ri-arrow-left-s-line"></i></a></li>
        <li class="page-item active"><a class="page-link" href="#tablas">1</a></li>
        <li class="page-item"><a class="page-link" href="#tablas">2</a></li>
        <li class="page-item"><a class="page-link" href="#tablas">3</a></li>
        <li class="page-item"><a class="page-link" href="#tablas" aria-label="Siguiente"><i class="ri-arrow-right-s-line"></i></a></li>
    </ul>
</nav>
```

#### Tablas de datos (`tablas-datos`)

Tabla con búsqueda, filtros, orden por columna, selección de filas y paginación. Funciona con un script ligero de JavaScript puro; no necesita Alpine, Livewire ni jQuery.

**Tabla de datos completa** — Escribe en el buscador, filtra por estado, haz clic en un encabezado para ordenar, marca filas para ver las acciones en lote y cambia de página.

```blade
<div data-mr-table data-mr-page-size="5">
    <input type="search" data-mr-search>
    <select data-mr-filter="3">…</select>
    <div data-mr-bulk hidden><strong data-mr-selected>0</strong> seleccionados …</div>
    <table class="table">
        <thead><tr>
            <th><input type="checkbox" data-mr-select-all></th>
            <th data-mr-sort>Folio</th>
        </tr></thead>
        <tbody>
            <tr><td><input type="checkbox" data-mr-select></td><td>REG-14958</td></tr>
            <tr data-mr-empty hidden><td colspan="2">Sin resultados</td></tr>
        </tbody>
    </table>
    <span data-mr-info></span>
    <ul class="pagination" data-mr-pager></ul>
</div>
```

**Con filtros avanzados y paginación del servidor** — Para listas grandes (Livewire, controlador): la misma pieza, pero buscar, filtrar y paginar lo hace el servidor. Los filtros menos usados van en un panel que se despliega bajo la barra. Lo urgente (por ejemplo, registros sin atención) va como chip con mr-filter-danger o mr-filter-warning: lleva el color del tono desde el inicio para que se vea que se puede pulsar.

```blade
<div class="mr-dt" x-data="{ abierto: false }">
    <div class="mr-dt-toolbar">
        <div class="mr-dt-search"><i class="ri-search-line"></i><input type="search" class="form-control form-control-sm" wire:model.live.debounce.300ms="search"></div>
        <button class="btn btn-light btn-sm" @click="abierto = !abierto" :aria-expanded="abierto">
            <i class="ri-filter-3-line"></i>Filtros <span class="mr-filter-count">2</span>
        </button>
        <button class="mr-filter mr-filter-danger" wire:click="…"><i class="ri-error-warning-line"></i>582 sin atención</button>
        <div class="mr-dt-toolbar-end">…acciones de la pantalla (una sola primaria)…</div>
    </div>
    <div class="mr-dt-panel" x-show="abierto" x-cloak>…selects con form-label…</div>
    <div class="mr-table-wrap"><div class="table-responsive"><table class="table table-hover mb-0">…</table></div></div>
    <div class="mr-dt-footer">
        <span class="mr-small">1502 resultados</span>
        <div>…filas por página…  {{ $items->links() }}</div>
    </div>
</div>
```

**Fila con conflicto y barra de acciones fija** — mr-row-danger resalta una fila con un error. mr-action-bar queda pegada al pie mientras haya algo seleccionado: así no hay que bajar hasta el final para confirmar.

```blade
<tr class="mr-row-danger">…</tr>
<div class="mr-action-bar">
    <span><strong>3</strong> cambios seleccionados</span>
    <button class="btn btn-primary">Aplicar cambios seleccionados</button>
</div>
```

**Tabla compacta** — Con la clase table-sm: menos relleno vertical para pantallas con muchas filas.

```blade
<div class="mr-table-wrap w-100"><div class="table-responsive">
    <table class="table table-sm table-hover mb-0">
        <thead><tr><th>Concepto</th><th class="text-end">Monto</th><th class="text-end">Saldo</th></tr></thead>
        <tbody>
            <tr><td>Inscripción</td><td class="text-end">$15,310.00</td><td class="text-end">$0.00</td></tr>
            <tr><td>Colegiatura agosto</td><td class="text-end">$4,200.00</td><td class="text-end">$4,200.00</td></tr>
            <tr><td>Beca académica</td><td class="text-end">−$1,200.00</td><td class="text-end">−$1,200.00</td></tr>
        </tbody>
    </table>
</div></div>
```

**Cargando y vacía**

```blade
<div class="mr-table-wrap w-100"><div class="table-responsive">
    <table class="table mb-0">
        <thead><tr><th>Folio</th><th>Nombre</th><th>Estado</th></tr></thead>
        <tbody>
            @for ($i = 0; $i < 3; $i++)
                <tr><td><span class="mr-skeleton" style="width: 5rem; height: .8rem; display: inline-block"></span></td><td><span class="mr-skeleton" style="width: 9rem; height: .8rem; display: inline-block"></span></td><td><span class="mr-skeleton" style="width: 4rem; height: .8rem; display: inline-block"></span></td></tr>
            @endfor
        </tbody>
    </table>
</div></div>
```

#### Tarjetas y cifras (`tarjetas`)

La tarjeta agrupa una idea. Solo la cifra que es el punto de la pantalla se destaca como indicador; no todo número merece una tarjeta.

**Indicadores**

```blade
<div class="row g-3 w-100">
    <div class="col-md-4"><x-maristas::stat label="Registros activos" value="248" delta="12 más que la semana pasada" /></div>
    <div class="col-md-4"><x-maristas::stat label="Respuestas sin leer" value="7" delta="3 más que ayer" trend="down" /></div>
    <div class="col-md-4"><x-maristas::stat label="Citas esta semana" value="19" /></div>
</div>
```

**Indicadores con ícono y nota** — Con icon aparece un cuadro de color a la izquierda; hint agrega una nota corta debajo del valor. El valor es una cifra (un conteo o un total); una fecha o un folio va en una lista de datos, no en un indicador.

```blade
<x-maristas::stat icon="ri-graduation-cap-line" label="Grupos" value="86" hint="Activos" />
```

**Variantes de tarjeta**

```blade
<div class="row g-3 w-100">
    <div class="col-md-4"><div class="card h-100"><div class="card-body"><h6 class="card-title mb-1">Con sombra</h6><p class="text-muted small mb-0">La predeterminada. Para el contenido principal de la página.</p></div></div></div>
    <div class="col-md-4"><div class="card mr-card-flat h-100"><div class="card-body"><h6 class="card-title mb-1">Plana con borde</h6><p class="text-muted small mb-0">Para contenido secundario o anidado dentro de otra tarjeta.</p></div></div></div>
    <div class="col-md-4"><div class="card mr-card-accent h-100"><div class="card-body"><h6 class="card-title mb-1">Con acento</h6><p class="text-muted small mb-0">Marca una tarjeta que requiere atención. Úsala una vez por vista.</p></div></div></div>
</div>
```

**Tarjeta con portada** — Para catálogos y listados con imagen: etiquetas sobre la portada, datos con ícono y acciones al pie. Sin imagen muestra un ícono.

```blade
<x-maristas::cover-card title="Encuentro de líderes" subtitle="Convivencia" :image="$url">
    <x-slot:tags><x-maristas::state tone="success">Aprobado</x-maristas::state></x-slot:tags>
    <x-slot:meta>
        <div><i class="ri-calendar-event-line"></i><span>29 dic 2026, 09:00</span></div>
    </x-slot:meta>
    <p class="mr-cover-text">Descripción corta…</p>
    <x-slot:actions><x-maristas::button>Ver detalles</x-maristas::button></x-slot:actions>
</x-maristas::cover-card>
```

### Retroalimentación

#### Alertas y avisos (`alertas`)

Una alerta explica qué pasó y qué hacer. Se queda en la página hasta que se resuelve. Un aviso temporal (toast) confirma una acción y desaparece solo.

**Alertas** — Cuatro tonos; puede llevar un botón de cerrar.

```blade
<div class="w-100 d-flex flex-column gap-2">
    <x-maristas::alert tone="info">El mensaje se enviará desde el buzón de la escuela.</x-maristas::alert>
    <x-maristas::alert tone="success">Responsable actualizado correctamente.</x-maristas::alert>
    <x-maristas::alert tone="warning">En <strong>Confirmación</strong>: los datos del estudiante no pueden modificarse.</x-maristas::alert>
    <x-maristas::alert tone="danger" dismissible>Este registro fue rechazado en la revisión y no puede avanzar.</x-maristas::alert>
</div>
```

**Aviso temporal (toast)**

```blade
<x-maristas::button variant="secondary" size="sm" id="kit-toast-btn">Mostrar aviso</x-maristas::button>
<div class="toast-container position-static">
    <div id="kit-toast" class="toast align-items-center" role="status" aria-live="polite" aria-atomic="true">
        <div class="d-flex">
            <div class="toast-body d-flex align-items-start gap-2"><i class="ri-checkbox-circle-line fs-5 mr-toast-success"></i><span>Nota publicada.</span></div>
            <button type="button" class="btn-close me-2 m-auto" data-bs-dismiss="toast" aria-label="Cerrar"></button>
        </div>
    </div>
</div>
```

**Aviso temporal desde JavaScript** — Para respuestas de acciones (guardado, error). MaristasUI.toast(tono, mensaje) crea el aviso, lo muestra cinco segundos y lo quita. Tonos: success, danger, warning, info.

```blade
MaristasUI.toast('success', 'Los cambios se guardaron.');
// Desde Livewire, con el evento que ya escucha el layout:
$this->dispatch('alert', status: 'success', message: 'Guardado');
```

#### Progreso y carga (`feedback`)

Mientras algo carga se muestra la forma de lo que vendrá; si no se puede saber cuánto falta, un indicador giratorio.

**Barras de progreso**

```blade
<div class="w-100 d-flex flex-column gap-3">
    <div><div class="d-flex justify-content-between mr-small mb-1"><span>Documentos entregados</span><span>3 de 5</span></div><div class="progress" role="progressbar" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100"><div class="progress-bar" style="width: 60%"></div></div></div>
    <div><div class="d-flex justify-content-between mr-small mb-1"><span>Pago de colegiatura</span><span>100%</span></div><div class="progress" role="progressbar" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100"><div class="progress-bar is-success" style="width: 100%"></div></div></div>
    <div><div class="d-flex justify-content-between mr-small mb-1"><span>Adeudo vencido</span><span>25%</span></div><div class="progress" role="progressbar" aria-valuenow="25" aria-valuemin="0" aria-valuemax="100"><div class="progress-bar is-danger" style="width: 25%"></div></div></div>
</div>
```

**Indicador giratorio y esqueleto de carga**

```blade
<div class="d-flex align-items-center gap-2"><span class="spinner-border spinner-border-sm" role="status"></span><span class="mr-small">Abriendo correo…</span></div>
<div class="w-100" style="max-width: 420px;" aria-hidden="true">
    <div class="d-flex gap-3 align-items-center">
        <span class="mr-skeleton" style="width: 44px; height: 44px; border-radius: 50%;"></span>
        <div class="flex-grow-1 d-flex flex-column gap-2">
            <span class="mr-skeleton" style="height: 12px; width: 60%;"></span>
            <span class="mr-skeleton" style="height: 12px; width: 90%;"></span>
        </div>
    </div>
</div>
```

**Estado vacío**

```blade
<div class="w-100">
    <x-maristas::empty-state icon="ri-mail-open-line" title="Aún no hay mensajes">
        Los mensajes que envíes y las respuestas que recibas aparecerán aquí.
        <div class="mt-3"><x-maristas::button size="sm">Redactar mensaje</x-maristas::button></div>
    </x-maristas::empty-state>
</div>
```

### Navegación

#### Barra principal (`barra`)

Una barra con dos niveles: arriba la marca y las herramientas de la persona (institución, notificaciones, perfil); abajo la navegación. Lo de uso diario va suelto y lo demás se agrupa en menús desplegables.

**Barra completa** — Abre los menús para ver el selector de institución, el panel de notificaciones y el menú de perfil. En pantallas angostas la navegación se oculta detrás del botón de hamburguesa y los grupos se despliegan en lista.

```blade
<x-maristas::topbar id="topbar">
    <x-slot:brand><a class="mr-topbar-brand" href="/">Maristas</a></x-slot:brand>
    <x-slot:tools>
<x-maristas::institution-menu current="Instituto México Primaria" searchable>
    <x-maristas::menu-item icon="ri-check-line" :active="true">Instituto México Primaria</x-maristas::menu-item>
    <x-maristas::menu-item icon="ri-building-line">Colegio Champagnat</x-maristas::menu-item>
</x-maristas::institution-menu>
<x-maristas::notification-menu :count="3">
    <x-maristas::notification name="Laura Ramírez" time="Hace 5 min" :new="true">Te mencionó en una nota</x-maristas::notification>
    <x-slot:footer><a class="dropdown-item" href="/notificaciones">Ver todas</a></x-slot:footer>
</x-maristas::notification-menu>
<x-maristas::user-menu name="Fredy Osorio" role="Administrador">
    <x-maristas::menu-item href="/perfil" icon="ri-user-line">Mi perfil</x-maristas::menu-item>
</x-maristas::user-menu>
    </x-slot:tools>
    <x-maristas::nav-link href="/" icon="ri-dashboard-line">Inicio</x-maristas::nav-link>
    <x-maristas::nav-link href="/registros" icon="ri-filter-3-line" :active="true">Registros</x-maristas::nav-link>
    <x-maristas::nav-group label="Personas" icon="ri-team-line">
<x-maristas::menu-item href="/responsables" icon="ri-contacts-line">Responsables</x-maristas::menu-item>
    </x-maristas::nav-group>
</x-maristas::topbar>
```

#### Pestañas y migas (`navegacion`)

Pestañas para cambiar de contenido dentro de una misma página; filtros en píldora para acotar una lista; ruta de migas para ubicarse.

**Pestañas con subrayado**

```blade
<ul class="nav nav-tabs mr-tabs w-100">
    <li class="nav-item"><a class="nav-link active" href="#navegacion"><i class="ri-history-line"></i>Seguimiento</a></li>
    <li class="nav-item"><a class="nav-link" href="#navegacion"><i class="ri-mail-line"></i>Comunicación</a></li>
    <li class="nav-item"><a class="nav-link" href="#navegacion"><i class="ri-user-line"></i>Detalles</a></li>
</ul>
```

**Píldoras y filtros**

```blade
<ul class="nav nav-pills">
    <li class="nav-item"><a class="nav-link active" href="#navegacion">Activos</a></li>
    <li class="nav-item"><a class="nav-link" href="#navegacion">Ganados</a></li>
    <li class="nav-item"><a class="nav-link" href="#navegacion">Perdidos</a></li>
</ul>
<div class="mr-filters">
    <button type="button" class="mr-filter is-active">Todo</button>
    <button type="button" class="mr-filter">Notas</button>
    <button type="button" class="mr-filter">Mensajes</button>
</div>
```

**Ruta de migas**

```blade
<nav aria-label="Ruta">
    <ol class="breadcrumb mb-0">
        <li class="breadcrumb-item"><a href="#navegacion" class="mr-link">Lista de registros</a></li>
        <li class="breadcrumb-item active" aria-current="page">Detalle del registro</li>
    </ol>
</nav>
```

**Título de pantalla con migas de pan** — El último elemento es la página actual y no lleva enlace.

```blade
<x-maristas::page-bar title="Detalle del funnel"
    :items="[['name' => 'Inicio', 'href' => route('dashboard')], ['name' => 'Detalle del funnel']]" />
```

**Banner de encabezado** — Para la cabecera de una pantalla con título, texto de apoyo y acciones. Los botones llevan variant light (principal, blanco) y outline-light (secundario, fantasma sobre fondo oscuro).

```blade
<x-maristas::banner title="Eventos" eyebrow="Gestión" icon="ri-calendar-event-line"
    description="Administra las convocatorias y actividades.">
    <x-maristas::button variant="outline-light" icon="ri-price-tag-3-line">Categorías</x-maristas::button>
    <x-maristas::button variant="light" icon="ri-add-line">Nuevo evento</x-maristas::button>
</x-maristas::banner>
```

**Pie de página y botón para volver arriba** — Incluye el botón una sola vez en el diseño: aparece al bajar y vuelve al inicio con desplazamiento suave.

```blade
<x-maristas::footer product="SIGEM" version="V.2.0">Maristas | {{ now()->year }}</x-maristas::footer>
<x-maristas::back-to-top />
```

#### Menús desplegables (`menus`)

Un menú agrupa acciones relacionadas detrás de un solo botón. Úsalo cuando la pantalla no tiene espacio para todas.

**Menú de acciones** — Un botón secundario que abre una lista corta. Cada opción lleva un ícono y un verbo.

```blade
<div class="dropdown">
    <button type="button" class="btn btn-light dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false">Acciones</button>
    <div class="dropdown-menu">
        <a class="dropdown-item" href="#"><i class="ri-eye-line"></i>Ver detalle</a>
        <a class="dropdown-item" href="#"><i class="ri-pencil-line"></i>Editar</a>
        <a class="dropdown-item" href="#"><i class="ri-file-copy-line"></i>Duplicar</a>
    </div>
</div>
```

**Con secciones y acción destructiva** — Separa con encabezado y línea; la acción que borra va al final, en rojo.

```blade
<div class="dropdown">
    <button type="button" class="btn btn-light dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false" aria-label="Más acciones"><i class="ri-more-2-fill"></i></button>
    <div class="dropdown-menu">
        <h6 class="dropdown-header">Registro</h6>
        <a class="dropdown-item" href="#"><i class="ri-pencil-line"></i>Editar</a>
        <a class="dropdown-item" href="#"><i class="ri-user-shared-line"></i>Reasignar</a>
        <div class="dropdown-divider"></div>
        <h6 class="dropdown-header">Zona de riesgo</h6>
        <a class="dropdown-item text-danger" href="#"><i class="ri-delete-bin-line"></i>Eliminar</a>
    </div>
</div>
```

**Botón dividido** — La acción más común queda a un clic y las demás detrás de la flecha.

```blade
<div class="btn-group">
    <button type="button" class="btn btn-primary"><i class="ri-send-plane-line"></i>Enviar</button>
    <button type="button" class="btn btn-primary dropdown-toggle dropdown-toggle-split" data-bs-toggle="dropdown" aria-expanded="false" aria-label="Más opciones de envío"></button>
    <div class="dropdown-menu">
        <a class="dropdown-item" href="#"><i class="ri-time-line"></i>Programar envío</a>
        <a class="dropdown-item" href="#"><i class="ri-draft-line"></i>Guardar borrador</a>
    </div>
</div>
```

**Alineación** — dropdown-menu-end alinea el menú al borde derecho del botón; úsalo en elementos pegados al borde de la pantalla.

```blade
<div class="dropdown"><button type="button" class="btn btn-light dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false">Izquierda</button><div class="dropdown-menu"><a class="dropdown-item" href="#">Opción</a></div></div>
<div class="dropdown"><button type="button" class="btn btn-light dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false">Derecha</button><div class="dropdown-menu dropdown-menu-end"><a class="dropdown-item" href="#">Opción</a></div></div>
<div class="dropup"><button type="button" class="btn btn-light dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false">Hacia arriba</button><div class="dropdown-menu"><a class="dropdown-item" href="#">Opción</a></div></div>
```

#### Pasos (`pasos`)

Indica en qué punto de un proceso largo está la persona y qué falta.

**Pasos horizontales** — Para formularios largos o procesos con orden. Completado, actual y pendiente se distinguen por forma y color, no solo por color.

```blade
<ol class="mr-stepper w-100" aria-label="Avance del registro">
    <li class="mr-stepper-item is-done"><span class="mr-stepper-dot"><i class="ri-check-line"></i></span><span class="mr-stepper-label">Datos del estudiante</span></li>
    <li class="mr-stepper-item is-current" aria-current="step"><span class="mr-stepper-dot">2</span><span class="mr-stepper-label">Tutor</span></li>
    <li class="mr-stepper-item"><span class="mr-stepper-dot">3</span><span class="mr-stepper-label">Documentos</span></li>
    <li class="mr-stepper-item"><span class="mr-stepper-dot">4</span><span class="mr-stepper-label">Confirmación</span></li>
</ol>
```

**Pasos en los que se puede hacer clic** — Para volver a un paso ya completado, envuelve el punto y la etiqueta en un botón mr-stepper-link. El paso pendiente va deshabilitado.

```blade
<ol class="mr-stepper w-100" aria-label="Avance del registro">
    <li class="mr-stepper-item is-done"><button type="button" class="mr-stepper-link"><span class="mr-stepper-dot"><i class="ri-check-line"></i></span><span class="mr-stepper-label">Contacto</span></button></li>
    <li class="mr-stepper-item is-current" aria-current="step"><button type="button" class="mr-stepper-link"><span class="mr-stepper-dot">2</span><span class="mr-stepper-label">Aspirante</span></button></li>
    <li class="mr-stepper-item"><button type="button" class="mr-stepper-link" disabled><span class="mr-stepper-dot">3</span><span class="mr-stepper-label">Datos</span></button></li>
</ol>
```

**Pasos verticales con descripción** — Cuando cada paso necesita una explicación o una fecha.

```blade
<ol class="mr-stepper mr-stepper-vertical" style="max-width: 420px;">
    <li class="mr-stepper-item is-done"><span class="mr-stepper-dot"><i class="ri-check-line"></i></span><span><span class="mr-stepper-label">Solicitud enviada</span><span class="d-block mr-small">16 de julio, 11:47 a. m.</span></span></li>
    <li class="mr-stepper-item is-current"><span class="mr-stepper-dot">2</span><span><span class="mr-stepper-label">Revisión de documentos</span><span class="d-block mr-small">Responsable: Laura Ramírez</span></span></li>
    <li class="mr-stepper-item"><span class="mr-stepper-dot">3</span><span><span class="mr-stepper-label">Entrevista</span><span class="d-block mr-small">Pendiente de agendar</span></span></li>
    <li class="mr-stepper-item"><span class="mr-stepper-dot">4</span><span><span class="mr-stepper-label">Resultado</span></span></li>
</ol>
```

### Superposiciones

#### Ventanas y capas (`overlays`)

Modal para decidir o capturar algo sin salir de la página (un editor largo, como redactar un mensaje, va en modal grande con scroll y sin cerrarse al hacer clic fuera); panel lateral para tareas más largas; globos de ayuda para aclarar sin ocupar espacio.

**Modal, panel lateral, ayuda y popover**

```blade
<x-maristas::button variant="secondary" data-bs-toggle="modal" data-bs-target="#kit-modal">Abrir modal</x-maristas::button>
<x-maristas::button variant="secondary" data-bs-toggle="offcanvas" data-bs-target="#kit-offcanvas">Abrir panel lateral</x-maristas::button>
<x-maristas::button variant="secondary" data-bs-toggle="tooltip" data-bs-title="Asigna el registro a otro responsable">Ayuda corta</x-maristas::button>
<x-maristas::button variant="secondary" data-bs-toggle="popover" data-bs-title="Parentesco" data-bs-content="Indica la relación de la persona de contacto con el estudiante.">Popover</x-maristas::button>
```

### Patrones

#### Patrones de página (`patrones`)

Composiciones completas hechas con los componentes del kit y pensadas para cualquier sistema Maristas. Se copian tal cual y se cambian los datos. Los textos de estos ejemplos son ficticios.

**Cabecera de perfil** — Nombre como protagonista, relación en una línea, contacto como chips clicables y una sola acción principal.

```blade
<div class="w-100 d-flex flex-wrap gap-3 justify-content-between align-items-start">
    <div class="mr-person">
        <x-maristas::avatar name="María López" size="lg" aria-hidden="true" />
        <div class="min-w-0">
            <h3 class="mr-name">María López</h3>
            <div class="mr-relation">Responsable de Ana Sofía Pérez López</div>
            <div class="mr-chips">
                <a class="mr-chip" href="#"><i class="ri-phone-line"></i>55 1234 5678</a>
                <a class="mr-chip" href="#"><i class="ri-mail-line"></i>maria.lopez@ejemplo.mx</a>
            </div>
        </div>
    </div>
    <div class="mr-actions">
        <button type="button" class="mr-btn-ghost"><i class="ri-sticky-note-line"></i>Nota</button>
        <button type="button" class="mr-btn-ghost"><i class="ri-mail-line"></i>Correo</button>
        <button type="button" class="btn btn-primary"><i class="ri-checkbox-circle-line"></i>Guardar cambios</button>
    </div>
</div>
```

**Progreso por etapas** — Cuatro etapas; la actual en azul de marca, las anteriores en azul claro. Si el resultado es negativo, agrega is-danger.

```blade
<ol class="mr-steps w-100" aria-label="Etapas del proceso">
    <li class="mr-step is-done"><div class="mr-step-bar"></div><div class="mr-step-label">Solicitud</div></li>
    <li class="mr-step is-current" aria-current="step"><div class="mr-step-bar"></div><div class="mr-step-label">Revisión</div></li>
    <li class="mr-step"><div class="mr-step-bar"></div><div class="mr-step-label">Confirmación</div></li>
    <li class="mr-step"><div class="mr-step-bar"></div><div class="mr-step-label">Cierre</div></li>
</ol>
```

**Datos clave en una fila** — Columnas con divisores finos, sin cajas. En pantallas angostas se apilan.

```blade
<div class="mr-facts w-100" style="margin-top: 0; padding-top: 0; border-top: 0;">
    <div class="mr-fact"><div class="mr-eyebrow">Estudiante</div><div class="mr-fact-value">Ana Sofía Pérez López</div><div class="mr-fact-sub">Matrícula 20260145</div></div>
    <div class="mr-fact"><div class="mr-eyebrow">Grado</div><div class="mr-fact-value">5º Primaria</div><div class="mr-fact-sub">Ciclo escolar 2026 - 2027</div></div>
    <div class="mr-fact"><div class="mr-eyebrow">Responsable</div><div class="mr-fact-value">Laura Ramírez</div></div>
</div>
```

**Acción de editar** — Botón punteado en azul con lápiz y el nombre de lo que edita: «Editar contacto», «Editar estudiante», «Editar grado». Va al final del bloque. Si no se puede editar en ese momento, el mismo botón aparece con candado, atenuado, y explica el motivo al pasar el cursor.

```blade
<div class="d-flex flex-wrap gap-2">
    <x-maristas::edit-link target="#kit-editar-modal" label="Editar contacto" />
    <x-maristas::edit-link target="#kit-editar-modal" label="Editar estudiante" />
    <x-maristas::edit-link target="#kit-editar-modal" label="Editar grado" />
    <x-maristas::edit-link target="#kit-editar-modal" :locked="true" locked-label="Estudiante bloqueado" locked-title="Los datos ya fueron confirmados y no pueden modificarse" />
</div>
```

**Pestañas y filtros**

```blade
<div class="w-100">
    <ul class="nav nav-tabs mr-tabs mb-3">
        <li class="nav-item"><a class="nav-link active" href="#patrones">Actividad</a></li>
        <li class="nav-item"><a class="nav-link" href="#patrones">Mensajes</a></li>
        <li class="nav-item"><a class="nav-link" href="#patrones">Detalles</a></li>
    </ul>
    <div class="mr-filters">
        <button type="button" class="mr-filter is-active">Todo</button>
        <button type="button" class="mr-filter">Notas</button>
        <button type="button" class="mr-filter">Mensajes</button>
    </div>
</div>
```

**Línea de tiempo por día** — Un encabezado por día y tres tipos de entrada: las notas y actividades llevan avatar del autor y una burbuja con el texto; los cambios de estado son una sola línea con etiquetas «antes → después»; el autor siempre se muestra: en las notas va en negrita y en los demás eventos junto a la hora. Si un comentario se repite en eventos seguidos, se escribe una sola vez.

```blade
<div class="w-100">
    <h6 class="mr-day">Hoy</h6>
    <ol class="mr-tl">
        <li class="mr-tl-item">
            <span class="mr-tl-dot bg-success-subtle text-success"><i class="ri-arrow-left-right-line"></i></span>
            <div class="mr-tl-main">
                <div class="mr-tl-line"><x-maristas::state tone="neutral">En revisión</x-maristas::state><i class="ri-arrow-right-line text-muted"></i><x-maristas::state tone="success">Aprobado</x-maristas::state><span class="mr-small">· pasa a <strong>Confirmación</strong></span><span class="mr-tl-time"><span class="mr-tl-author">Laura Ramírez</span> · 11:57 a. m.</span></div>
            </div>
        </li>
        <li class="mr-tl-item">
            <x-maristas::avatar name="Laura Ramírez" size="sm" class="mr-tl-dot" />
            <div class="mr-tl-main">
                <div class="mr-tl-line"><strong>Laura Ramírez</strong><span class="text-muted">agregó una nota</span><span class="mr-tl-time">11:49 a. m.</span></div>
                <div class="mr-tl-note">Entregó la documentación completa.</div>
            </div>
        </li>
        <li class="mr-tl-item">
            <x-maristas::avatar name="Laura Ramírez" size="sm" class="mr-tl-dot" />
            <div class="mr-tl-main">
                <div class="mr-tl-line"><strong>Laura Ramírez</strong><span class="text-muted">registró</span><x-maristas::state tone="warning" icon="ri-calendar-event-line">Cita</x-maristas::state><span class="mr-tl-time">11:40 a. m.</span></div>
                <div class="mr-tl-note">Visita al plantel y entrega de documentos.</div>
            </div>
        </li>
    </ol>
    <h6 class="mr-day">Ayer</h6>
    <ol class="mr-tl">
        <li class="mr-tl-item">
            <span class="mr-tl-dot bg-info-subtle text-info"><i class="ri-mail-download-line"></i></span>
            <div class="mr-tl-main">
                <div class="mr-tl-line"><strong>Respuesta recibida</strong><span class="mr-tl-time"><span class="mr-tl-author">María López</span> · 4:12 p. m.</span></div>
                <div class="mr-tl-quote">Gracias, adjunto el acta de nacimiento que faltaba.</div>
            </div>
        </li>
    </ol>
</div>
```

**Fila de bandeja de mensajes** — Flecha de dirección, remitente, asunto en negrita si no se ha leído, extracto de una línea y estado.

```blade
<ul class="list-unstyled mb-0 w-100" style="max-width: 380px; border: 1px solid var(--maristas-line); border-radius: var(--maristas-radius-md); overflow: hidden;">
    <li class="mr-mail is-in is-unread is-selected">
        <button type="button" class="mr-mail-row">
            <span class="mr-mail-dir"><i class="ri-arrow-down-line"></i></span>
            <span class="mr-mail-main">
                <span class="d-flex justify-content-between gap-2"><span class="mr-mail-who text-truncate">maria.lopez@ejemplo.mx</span><span class="mr-mail-date">5 nov, 11:04 a. m.</span></span>
                <span class="d-block mr-mail-subject text-truncate">Re: Documentos del ciclo escolar</span>
                <span class="mr-mail-snippet">Gracias, adjunto el acta de nacimiento que faltaba</span>
                <span class="d-flex gap-1 mt-1"><x-maristas::state tone="info">Respuesta nueva</x-maristas::state></span>
            </span>
        </button>
    </li>
    <li class="mr-mail is-out">
        <button type="button" class="mr-mail-row">
            <span class="mr-mail-dir"><i class="ri-arrow-up-line"></i></span>
            <span class="mr-mail-main">
                <span class="d-flex justify-content-between gap-2"><span class="mr-mail-who text-truncate">secretaria@ejemplo.mx</span><span class="mr-mail-date">11 sep, 2:29 p. m.</span></span>
                <span class="d-block mr-mail-subject text-truncate">Recordatorio de entrega de documentos</span>
                <span class="mr-mail-snippet">Hola, María: te recordamos que falta un documento</span>
                <span class="d-flex gap-1 mt-1"><x-maristas::state tone="success">Enviado</x-maristas::state></span>
            </span>
        </button>
    </li>
</ul>
```
