/* UiMetadata.Modal — overlay/contenedor/cabecera/acciones del sistema de
   modal único del proyecto. Self-contained: cae a valores literales si los
   tokens --grid-* (definidos en UiMetadata.Grid/wwwroot/css/grid.css)
   no están cargados. */

/* ── Modal overlay ──────────────────────────────────────────────────────── */
/* .ui-modal, no .modal — Bootstrap define una clase global `.modal` con
   `overflow-y: auto` (entre otras cosas) sin scope, y EcoTrack carga su CSS
   para el resto del layout. Antes esto vivía en `.modal` y se corregía el
   overflow heredado con una declaración propia que dependía del ORDEN DE
   CARGA (ganaba por especificidad empatada + cargar después) — funcionaba,
   pero se rompía en silencio si alguien reordenaba los <link> de
   _Layout.cshtml. Renombrado para no depender de eso en absoluto: con un
   nombre que Bootstrap no usa, no hay nada que "ganarle" por orden. */
.ui-modal {
    display        : none;
    position       : fixed;
    inset          : 0;
    background     : var(--grid-modal-overlay, rgba(0,0,0,.5));
    justify-content: center;
    align-items    : center;
    animation      : grid-fadeIn .2s ease;
    overflow       : visible;
}

@keyframes grid-fadeIn {
    from { opacity: 0; }
    to   { opacity: 1; }
}

/* ── Modal content ──────────────────────────────────────────────────────── */
/* .ui-modal-content, no .modal-content — mismo motivo que .ui-modal arriba
   (Bootstrap define exactamente `.modal-content`). */
.ui-modal-content {
    background   : var(--grid-modal-surface, #ffffff);
    color        : var(--grid-text-main, #111827);
    padding      : 1.8rem;
    border-radius: var(--grid-radius-lg, 12px);
    width        : var(--grid-modal-width, 500px);
    max-width    : 100%;
    max-height   : var(--grid-modal-max-h, 95%);
    box-shadow   : var(--grid-modal-shadow, 0 8px 25px rgba(0,0,0,.15));
    animation    : grid-slideUp .3s ease;
    /* max-height por sí solo no alcanza: sin overflow, un modal con muchos
       campos (ej. formulario + subgrid) se desborda visualmente fuera del
       recuadro en vez de scrollear. El <form> interno ya trae su propio
       overflow-y:auto (ver _Grid.cshtml) pero no sirve de nada si este
       contenedor padre —el que realmente tiene el max-height— no acota su
       propio contenido. */
    overflow-y   : auto;

    /* Scrollbar delgada y a tono con el modal en vez del default del SO
       (grueso, gris claro, choca contra un modal oscuro) — Firefox vía
       scrollbar-width/-color, Chrome/Edge/Safari vía ::-webkit-scrollbar. */
    scrollbar-width: thin;
    scrollbar-color: var(--grid-scrollbar-thumb, rgba(148, 163, 184, .5)) transparent;
}

.ui-modal-content::-webkit-scrollbar {
    width: 8px;
}

.ui-modal-content::-webkit-scrollbar-track {
    background: transparent;
}

.ui-modal-content::-webkit-scrollbar-thumb {
    background-color: var(--grid-scrollbar-thumb, rgba(148, 163, 184, .5));
    border-radius: var(--grid-radius-pill, 50px);
}

.ui-modal-content::-webkit-scrollbar-thumb:hover {
    background-color: var(--grid-scrollbar-thumb-hover, rgba(148, 163, 184, .8));
}

@keyframes grid-slideUp {
    from { transform: translateY(30px); opacity: 0; }
    to   { transform: translateY(0);    opacity: 1; }
}

.ui-modal-content h3 {
    margin-bottom: var(--grid-gap-md, 1rem);
    font-size    : var(--grid-font-size-lg, 1.3rem);
    font-weight  : 600;
    color        : var(--grid-text-main, #111827);
}

/* max-width propio (no solo el de .ui-modal-content) — hoy esta clase
   siempre se combina con la base, pero sin esto un consumidor que la use
   sola perdería el cap y desbordaría en un viewport <320px. */
.ui-modal-content-sm {
    width: 320px;
    max-width: 100%;
}

/* Variante ancha — ej. el modal de "expandir chart" de UiMetadata.Charts,
   o cualquier contenido que necesite más que los 500px por defecto.
   overflow-y propio (no solo el de .ui-modal-content) — mismo motivo que
   -sm arriba: hoy siempre va combinada con la base, esto la hace segura
   también si algún día se usa sola. */
.ui-modal-content-lg {
    width: 90vw;
    max-width: 1500px;
    max-height: 100vh;
    max-height: 100dvh;
    overflow-y: auto;
    display: flex;
    flex-direction: column;
    gap: 12px;
}

.modal-header-custom {
    display        : flex;
    justify-content: space-between;
    align-items    : center;
    margin-bottom  : var(--grid-gap-sm, 0.5rem);
}

.modal-actions {
    display        : flex;
    justify-content: flex-end;
    gap            : var(--grid-gap-sm, 0.5rem);
    margin-top     : 10px;
}

/* ── Save / Cancel ──────────────────────────────────────────────────────── */
.cancel-btn {
    background   : var(--grid-btn-secondary-bg, #d1d5db);
    color        : var(--grid-text-main, #111827);
    padding      : 0.5rem var(--grid-gap-md, 1rem);
    border       : none;
    border-radius: var(--grid-radius-pill, 50px);
    cursor       : pointer;
    transition   : background .3s ease;
}

.cancel-btn:hover { background: var(--grid-btn-secondary-bg-hover, #9ca3af); }

.save-btn {
    background   : var(--grid-btn-primary-bg, linear-gradient(135deg,#60a5fa,#2563eb));
    color        : var(--grid-text-on-btn, #ffffff);
    padding      : 0.5rem 1.4rem;
    border       : none;
    border-radius: var(--grid-radius-pill, 50px);
    font-weight  : 500;
    cursor       : pointer;
    transition   : all .3s ease;
}

.save-btn:hover { transform: translateY(-2px); }

/* Acción destructiva (bloquear, eliminar…): contorno rojo, se rellena al pasar el ratón.
   El color sale del token --grid-btn-danger-bg (ver grid.css). */
.danger-btn {
    background   : transparent;
    color        : var(--grid-btn-danger-bg, #dc2626);
    padding      : 0.5rem 1.2rem;
    border       : 1px solid var(--grid-btn-danger-bg, #dc2626);
    border-radius: var(--grid-radius-pill, 50px);
    font-weight  : 500;
    cursor       : pointer;
    transition   : all .3s ease;
}

.danger-btn:hover {
    background: var(--grid-btn-danger-bg, #dc2626);
    color     : var(--grid-text-on-btn, #ffffff);
}

/* ── Clear-form button ──────────────────────────────────────────────────── */
.btn-clear {
    background   : transparent;
    border       : 1px solid var(--grid-border-input, #d1d5db);
    border-radius: var(--grid-radius-sm, 6px);
    padding      : 0.2rem 0.6rem;
    font-size    : var(--grid-font-size-sm, 0.875rem);
    color        : var(--grid-text-muted, #6b7280);
    cursor       : pointer;
    transition   : border-color .2s, color .2s;
}

.btn-clear:hover {
    border-color: var(--grid-input-border-focus, #2563eb);
    color       : var(--grid-text-main, #111827);
}

/* ── Errores de guardado dentro del modal ───────────────────────────────── */
.modal-errors {
    color        : var(--grid-error-text, #dc3545);
    font-size    : var(--grid-font-size-sm, 0.875rem);
    margin-bottom: 10px;
}

/* ── Confirm dialog (confirmDialog(), confirm.js) ───────────────────────── */
.confirm-overlay {
    position       : fixed;
    inset          : 0;
    background     : var(--grid-modal-overlay, rgba(0,0,0,.5));
    display        : flex;
    align-items    : center;
    justify-content: center;
    z-index        : 10100;
    animation      : grid-fadeIn .2s ease;
}

/* max-height/overflow-y — el único variant de modal sin ninguna protección
   de overflow (ver responsive-audit-report.md, hallazgo I5). Bajo riesgo
   real hoy (confirm dialogs son cortos) pero sin costo dejarlo protegido
   igual que el resto. */
.confirm-modal {
    background   : var(--grid-modal-surface, #ffffff);
    color        : var(--grid-text-main, #111827);
    padding      : 1.4rem 1.6rem;
    border-radius: var(--grid-radius-lg, 12px);
    min-width    : 320px;
    max-width    : min(420px, 100%);
    max-height   : 90vh;
    max-height   : 90dvh;
    overflow-y   : auto;
    box-shadow   : var(--grid-modal-shadow, 0 8px 25px rgba(0,0,0,.15));
    animation    : grid-slideUp .3s ease;
}

.confirm-modal h3 {
    margin-bottom: var(--grid-gap-sm, 0.5rem);
    font-size    : var(--grid-font-size-lg, 1.3rem);
    font-weight  : 600;
}

.confirm-modal p {
    margin-bottom: var(--grid-gap-md, 1rem);
    color        : var(--grid-text-muted, #6b7280);
}

/* Variante para acciones destructivas (eliminar, salir de una cuenta, etc.) */
.confirm-danger-btn {
    background: var(--grid-btn-danger-bg-full, linear-gradient(135deg,#ff4d4d,#d32f2f));
}
