/* ==============================================================================
   CRM-GREU — Components: Modal
   Extraído de components.css — ver ese archivo para las reglas realmente
   comunes/transversales que no encajan en ninguna estructura concreta.
   ============================================================================== */

/* --- Modal ----------------------------------------------------------------- */
.modal-overlay {
    position: fixed;
    inset: 0;
    background: rgba(7, 20, 38, 0.4);
    backdrop-filter: blur(4px);
    display: flex;
    align-items: center;
    justify-content: center;
    z-index: 700;
    opacity: 1;
    transition: opacity 0.15s ease-out;
}

.modal-overlay.hidden {
    display: none;
}

/* Segunda capa apilada (ver #modal-overlay-2 en layouts/app.php) — mismo
   fondo/centrado que .modal-overlay, solo por encima del primero. */
#modal-overlay-2 {
    z-index: 750;
}

.modal-container {
    background: var(--color-surface-strong);
    border-radius: var(--radius-lg);
    box-shadow: var(--shadow-sheet);
    width: 90%;
    max-width: 70vh;
    max-height: 85vh;
    display: flex;
    flex-direction: column;
    animation: modalScaleIn 0.36s cubic-bezier(.16, 1, .3, 1);
}

/* Trayectoria "scale" (default, ver [data-motion] en <html>, layouts/app.php)
   — crece mientras asciende, una sola curva de frenado, sin overshoot: la
   curva (.16,1,.3,1) no pasa de y=1 en ningún punto. */
@keyframes modalScaleIn {
    from { transform: translateY(64px) scale(.65); opacity: 0; }
    to   { transform: translateY(0) scale(1); opacity: 1; }
}

/* Trayectoria "genie" — aproximación CSS al efecto de macOS (Dock → ventana):
   no es un warp real (eso requeriría deformar geometría por debajo del nivel
   de `clip-path`), pero recorta el contenedor en una silueta irregular que
   nace de un punto abajo y se despliega hasta el rectángulo completo.
   Asimetría deliberada en los pasos intermedios (nunca un trapecio
   perfecto) para que se lea como algo orgánico, no como una figura
   geométrica con nombre — ver arbitraje en docs/history/ (se descartó
   explícitamente ir hacia humo/mask-image: decoración sin función y coste
   de render no cerrado en .sheet-container, contra motion-dynamics/
   AGENT.md). Sin overshoot en ningún eje. */
html[data-motion="genie"] .modal-container {
    animation: modalGenieIn 0.36s cubic-bezier(.22, 1, .36, 1);
}
@keyframes modalGenieIn {
    0%   { clip-path: polygon(44% 100%, 49% 99%, 53% 100%, 50% 98%); transform: translateY(20px); opacity: 0; }
    30%  { clip-path: polygon(22% 62%, 38% 48%, 58% 52%, 74% 44%, 84% 70%, 70% 100%, 40% 97%, 18% 100%); transform: translateY(12px); opacity: .8; }
    60%  { clip-path: polygon(3% 22%, 40% 10%, 97% 18%, 100% 55%, 100% 100%, 0% 100%, 0% 60%); transform: translateY(4px); opacity: 1; }
    100% { clip-path: polygon(0% 0%, 100% 0%, 100% 100%, 0% 100%); transform: translateY(0); opacity: 1; }
}

/* Reduced-motion del modal GENÉRICO (fade del overlay + slide del
   container) — antes solo existía para la variante .doc-alert-modal, más
   abajo en este archivo; esto cubre todos los demás modales de la app, que
   se quedaban sin cubrir. Debe aparecer en su posición final sin fade ni
   slide, misma información sin trayectoria. */
@media (prefers-reduced-motion: reduce) {
    .modal-overlay {
        transition: none;
    }
    .modal-container {
        animation: none;
        transform: none;
    }
}

.modal-header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: 18px 24px;
    border-bottom: 1px solid var(--color-border-soft);
}

.modal-header h3 {
    font-size: 16px;
    font-weight: 600;
}

.modal-close {
    background: none;
    border: none;
    font-size: 20px;
    color: var(--color-muted);
    cursor: pointer;
    padding: 4px;
    border-radius: var(--radius-xs);
    transition: background 0.15s;
}

.modal-close:hover {
    background: var(--color-bg);
    color: var(--color-text);
}

.modal-body {
    padding: 24px;
    overflow-y: auto;
    flex: 1;
}

.modal-footer {
    display: flex;
    justify-content: flex-end;
    gap: 8px;
    padding: 14px 24px;
    border-top: 1px solid var(--color-border-soft);
}

/* --- Modal overrides for schedule modals / file preview --- */
.modal-container.modal-lg {
    max-width: 900px;
}

/* Modal ancho tipo "hoja de cálculo" (p.ej. oferta con tabla de líneas,
   ver offers.php) — porcentaje del viewport en vez de un px fijo, para que
   aproveche pantallas grandes sin quedar innecesariamente ancho en las pequeñas. */
.modal-container.modal-xl {
    max-width: 80%;
}

/* Overlay genérico para formularios de modal cuyos <select> se rellenan por
   fetch tras abrirse (p.ej. Config → Plantillas): sin esto, mientras la
   petición está en vuelo el formulario parece roto ("los selectores no
   tienen opciones"). Se retira (remove()) en cuanto resuelven todas las
   peticiones — ver openTemplateForm() en document-templates.js. */
.modal-loading-overlay {
    position: absolute;
    inset: 0;
    z-index: 5;
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 8px;
    background: var(--color-surface);
    color: var(--color-text-muted);
}

/* --- Pop-up de alertas de documentación (ver app.js, checkAndShowDocAlerts()) —
   variante "doc-alert-modal" del modal genérico (extraClass de openModal()):
   contenedor más compacto con más personalidad + hero de resumen + filas
   .alert-item con entrada escalonada. Todo como clases MODIFICADORAS sobre
   .modal-overlay/.modal-container ya existentes, nunca reemplazando sus
   reglas base — el resto de modales de la app no cambian. */
.modal-overlay:has(.doc-alert-modal) {
    background: rgba(7, 20, 38, 0.5);
    backdrop-filter: blur(6px);
}

.modal-container.doc-alert-modal {
    max-width: 440px;
    border-radius: var(--radius-xl);
    overflow: hidden;
    position: relative;
    animation: docAlertModalIn 0.42s cubic-bezier(.34, 1.56, .64, 1);
}

.modal-container.doc-alert-modal::before {
    content: '';
    position: absolute;
    top: 0; left: 0; right: 0;
    height: 3px;
    background: linear-gradient(90deg, transparent, var(--color-danger), transparent);
}
.modal-container.doc-alert-modal.is-warning::before {
    background: linear-gradient(90deg, transparent, var(--color-warning), transparent);
}

@keyframes docAlertModalIn {
    from { opacity: 0; transform: translateY(28px) scale(.94); }
    to   { opacity: 1; transform: translateY(0) scale(1); }
}

/* --- Hero (resumen agrandado, sustituye al .alert plano de antes) --- */
.doc-alert-hero {
    display: flex;
    align-items: center;
    gap: 14px;
    padding: 18px;
    border-radius: var(--radius-lg);
    margin-bottom: 4px;
    animation: docAlertFadeUp 0.36s ease-out 0.08s both;
}
.doc-alert-hero.is-danger {
    background: linear-gradient(135deg, var(--color-danger-bg) 0%, var(--color-surface-strong) 82%);
    border: 1px solid var(--color-danger-border);
}
.doc-alert-hero.is-warning {
    background: linear-gradient(135deg, var(--color-warning-bg) 0%, var(--color-surface-strong) 82%);
    border: 1px solid var(--color-warning-border);
}

.doc-alert-hero-icon {
    position: relative;
    flex-shrink: 0;
    width: 44px;
    height: 44px;
    display: flex;
    align-items: center;
    justify-content: center;
    border-radius: var(--radius-md);
    color: #fff;
}
.doc-alert-hero-icon svg { width: 22px; height: 22px; }
.doc-alert-hero.is-danger .doc-alert-hero-icon { background: var(--color-danger); }
.doc-alert-hero.is-warning .doc-alert-hero-icon { background: var(--color-warning); }

/* Anillo de pulso único (no en bucle) — solo severidad danger, urgencia sin
   parpadeo permanente que resultaría cansino viéndolo varias veces al día. */
.doc-alert-hero.is-danger .doc-alert-hero-icon::after {
    content: '';
    position: absolute;
    inset: -4px;
    border-radius: inherit;
    border: 2px solid var(--color-danger);
    opacity: 0;
    animation: docAlertPulseRing 0.9s ease-out 0.55s 1 forwards;
}
@keyframes docAlertPulseRing {
    0%   { opacity: .6; transform: scale(.85); }
    100% { opacity: 0;  transform: scale(1.35); }
}

.doc-alert-hero-copy {
    display: flex;
    flex-direction: column;
    gap: 1px;
    min-width: 0;
}
.doc-alert-hero-number {
    font-size: 32px;
    font-weight: 700;
    line-height: 1.1;
    letter-spacing: -0.02em;
    color: var(--color-text);
    font-variant-numeric: tabular-nums;
}
.doc-alert-hero-label {
    font-size: 13px;
    color: var(--color-text-muted);
    font-weight: 500;
}

/* --- Secciones + filas --- */
.doc-alert-popup-section {
    margin-top: 16px;
}

.doc-alert-popup-section h4 {
    display: flex;
    align-items: center;
    gap: 6px;
    font-size: 13px;
    font-weight: 600;
    color: var(--color-text);
    margin: 0 0 8px;
    animation: docAlertFadeUp 0.28s ease-out both;
}

.doc-alert-popup-section .alert-list {
    max-height: 180px;
    overflow-y: auto;
}

/* Entrada escalonada de filas — el delay concreto de cada fila lo fija JS
   (style="animation-delay:…") con un contador único hero→cabeceras→filas,
   topado en 10 elementos para que una sección con decenas de filas no
   dispare una cascada de segundos (ver checkAndShowDocAlerts(), app.js).
   Solo dentro de .doc-alert-modal — .alert-item es un componente compartido
   (Taller/Checklist, vista Día del calendario) que no debe cambiar de
   comportamiento fuera de este pop-up. */
.doc-alert-modal .alert-item {
    animation: docAlertRowIn 0.26s cubic-bezier(.22, 1, .36, 1) both;
}
.doc-alert-modal .alert-item:hover {
    transform: translateX(3px);
}
.doc-alert-modal .alert-item-icon {
    transition: transform 0.15s ease;
}
.doc-alert-modal .alert-item:hover .alert-item-icon {
    transform: scale(1.12);
}

@keyframes docAlertFadeUp {
    from { opacity: 0; transform: translateY(6px); }
    to   { opacity: 1; transform: translateY(0); }
}
@keyframes docAlertRowIn {
    from { opacity: 0; transform: translateX(-6px); }
    to   { opacity: 1; transform: translateX(0); }
}

@media (prefers-reduced-motion: reduce) {
    .modal-container.doc-alert-modal,
    .doc-alert-hero,
    .doc-alert-popup-section h4,
    .doc-alert-modal .alert-item {
        animation: none;
    }
    .doc-alert-hero.is-danger .doc-alert-hero-icon::after {
        animation: none;
        opacity: 0;
    }
}
