/* ========================================================================== 
 * IMS — Modal Standard
 * --------------------------------------------------------------------------
 * Fuente única del estilo visual de modales de módulos IMS.
 * Regla oficial:
 * Header: icono + título dinámico + estado
 * Body: contenido según grupo, con base visual común
 * Footer: botones de acción
 *
 * Este archivo se carga después de los CSS de grupo para evitar diferencias
 * entre Grupo 1, Grupo 2, Grupo 3, fiscal, sistema y modales globales.
 * ========================================================================== */

:root {
  --ims-modal-width: 920px;
  --ims-modal-radius: 18px;
  --ims-modal-border: #e2e8f0;
  --ims-modal-surface: #ffffff;
  --ims-modal-muted-surface: #f8fafc;
  --ims-modal-title: #0f172a;
  --ims-modal-text: #334155;
  --ims-modal-muted: #64748b;
  --ims-modal-accent: var(--crud-color, var(--ims-primary, #4f46e5));
  --ims-modal-shadow: 0 24px 70px rgba(15, 23, 42, .22);
  --ims-modal-viewport-gap: 2rem;
  --ims-modal-viewport-gap-mobile: 1rem;
  --ims-module-modal-height: 760px;
  --ims-modal-header-min-height: 64px;
  --ims-modal-footer-min-height: 58px;
}

/* Ancho oficial profesional: uniforme y más estrecho que modal-xl. */
.modal-dialog.ims-modal-standard,
.ims-crud-modal .modal-dialog,
.ims-crud-scope .modal-dialog.ims-modal-standard,
.modal-dialog.modal-dialog-centered.ims-modal-standard {
  width: min(var(--ims-modal-width), calc(100vw - 2rem)) !important;
  max-width: min(var(--ims-modal-width), calc(100vw - 2rem)) !important;
}

@media (max-width: 575.98px) {
  .modal-dialog.ims-modal-standard,
  .ims-crud-modal .modal-dialog,
  .ims-crud-scope .modal-dialog.ims-modal-standard,
  .modal-dialog.modal-dialog-centered.ims-modal-standard {
    width: calc(100vw - 1rem) !important;
    max-width: calc(100vw - 1rem) !important;
    margin-left: .5rem !important;
    margin-right: .5rem !important;
  }
}

/* Content común. */
.ims-modal-standard-content,
.ims-crud-modal .modal-content,
.ims-crud-scope .modal-dialog.ims-modal-standard .modal-content,
.modal-content.ims-modal-content,
.modal-content.ims-um-content {
  background: var(--ims-modal-surface) !important;
  color: var(--ims-modal-text) !important;
  border: 1px solid var(--ims-modal-border) !important;
  border-radius: var(--ims-modal-radius) !important;
  box-shadow: var(--ims-modal-shadow) !important;
  overflow: hidden !important;
}

/* Header común: fondo claro, texto visible, icono acentuado y estado a la derecha. */
.ims-modal-standard-header,
.ims-crud-modal-header,
.ims-modal-header,
.ims-crud-modal .modal-header,
.ims-crud-scope .modal-header.dv-header,
.ims-crud-scope .g3-modal .modal-header.g3-head,
.ims-crud-scope .modal-dialog.ims-modal-standard .modal-header {
  background: var(--ims-modal-muted-surface) !important;
  background-image: none !important;
  color: var(--ims-modal-title) !important;
  border-bottom: 1px solid var(--ims-modal-border) !important;
  padding: 1rem 1.25rem !important;
  min-height: var(--ims-modal-header-min-height);
  display: flex !important;
  align-items: center !important;
  gap: .75rem !important;
}

.ims-modal-standard-header .modal-title,
.ims-crud-modal-header .modal-title,
.ims-modal-header .modal-title,
.ims-modal-header h1,
.ims-modal-header h2,
.ims-modal-header h3,
.ims-modal-header h4,
.ims-modal-header h5,
.ims-modal-header h6,
.ims-crud-modal .modal-header .modal-title,
.ims-crud-scope .modal-header.dv-header .modal-title,
.ims-crud-scope .g3-modal .modal-header.g3-head .modal-title,
.ims-crud-scope .modal-dialog.ims-modal-standard .modal-header .modal-title {
  color: var(--ims-modal-title) !important;
  font-size: 1.02rem !important;
  font-weight: 700 !important;
  line-height: 1.25 !important;
  margin: 0 !important;
}

.ims-modal-standard-header .modal-title i,
.ims-crud-modal-header .modal-title i,
.ims-modal-header i,
.ims-crud-modal .modal-header .modal-title i,
.ims-crud-scope .modal-header.dv-header .modal-title i,
.ims-crud-scope .g3-modal .modal-header.g3-head .modal-title i,
.ims-crud-scope .modal-dialog.ims-modal-standard .modal-header .modal-title i {
  color: var(--ims-modal-accent) !important;
  margin-right: .45rem !important;
}

.ims-modal-standard-header .btn-close,
.ims-crud-modal-header .btn-close,
.ims-modal-header .btn-close,
.ims-crud-modal .modal-header .btn-close,
.ims-crud-scope .modal-header.dv-header .btn-close,
.ims-crud-scope .g3-modal .modal-header.g3-head .btn-close,
.ims-crud-scope .modal-dialog.ims-modal-standard .modal-header .btn-close {
  filter: none !important;
  opacity: .72 !important;
}

.ims-modal-standard-header .btn-close:hover,
.ims-crud-modal-header .btn-close:hover,
.ims-modal-header .btn-close:hover,
.ims-crud-modal .modal-header .btn-close:hover,
.ims-crud-scope .modal-header.dv-header .btn-close:hover,
.ims-crud-scope .g3-modal .modal-header.g3-head .btn-close:hover,
.ims-crud-scope .modal-dialog.ims-modal-standard .modal-header .btn-close:hover {
  opacity: 1 !important;
}

.ims-crud-modal-status,
.dv-header-right,
.g3-head-right,
.ims-modal-header-status {
  margin-left: auto !important;
  display: inline-flex !important;
  align-items: center !important;
  gap: .4rem !important;
}

.g3-head-sub,
.dv-fecha-header,
.dv-header-subtitle,
.ims-modal-header-subtitle {
  color: var(--ims-modal-muted) !important;
  font-size: .82rem !important;
  font-weight: 500 !important;
  margin-top: .12rem !important;
}

/* Body común: el contenido interno puede variar por grupo. */
.ims-modal-standard-body,
.ims-crud-modal .modal-body,
.ims-modal-body,
.ims-crud-scope .modal-dialog.ims-modal-standard .modal-body {
  background: var(--ims-modal-surface) !important;
  color: var(--ims-modal-text) !important;
  padding: 1.25rem 1.5rem !important;
  max-height: calc(100vh - 220px) !important;
  overflow-y: auto !important;
}

.ims-modal-standard-body::-webkit-scrollbar,
.ims-crud-modal .modal-body::-webkit-scrollbar,
.ims-modal-body::-webkit-scrollbar,
.ims-crud-scope .modal-dialog.ims-modal-standard .modal-body::-webkit-scrollbar {
  width: 8px;
}

.ims-modal-standard-body::-webkit-scrollbar-track,
.ims-crud-modal .modal-body::-webkit-scrollbar-track,
.ims-modal-body::-webkit-scrollbar-track,
.ims-crud-scope .modal-dialog.ims-modal-standard .modal-body::-webkit-scrollbar-track {
  background: #f1f5f9;
  border-radius: 999px;
}

.ims-modal-standard-body::-webkit-scrollbar-thumb,
.ims-crud-modal .modal-body::-webkit-scrollbar-thumb,
.ims-modal-body::-webkit-scrollbar-thumb,
.ims-crud-scope .modal-dialog.ims-modal-standard .modal-body::-webkit-scrollbar-thumb {
  background: #cbd5e1;
  border-radius: 999px;
}

.ims-modal-standard-body::-webkit-scrollbar-thumb:hover,
.ims-crud-modal .modal-body::-webkit-scrollbar-thumb:hover,
.ims-modal-body::-webkit-scrollbar-thumb:hover,
.ims-crud-scope .modal-dialog.ims-modal-standard .modal-body::-webkit-scrollbar-thumb:hover {
  background: #94a3b8;
}

/* Footer común: botones agrupados a la derecha. */
.ims-modal-standard-footer,
.ims-crud-modal .modal-footer,
.ims-modal-footer,
.ims-crud-scope .modal-footer.g3-foot,
.ims-crud-scope .modal-dialog.ims-modal-standard .modal-footer {
  background: var(--ims-modal-muted-surface) !important;
  border-top: 1px solid var(--ims-modal-border) !important;
  padding: .9rem 1.25rem !important;
  display: flex !important;
  align-items: center !important;
  justify-content: flex-end !important;
  flex-wrap: wrap !important;
  gap: .5rem !important;
  min-height: var(--ims-modal-footer-min-height);
}

.ims-modal-standard-footer .btn,
.ims-crud-modal .modal-footer .btn,
.ims-modal-footer .btn,
.ims-crud-scope .modal-dialog.ims-modal-standard .modal-footer .btn {
  min-height: 34px;
  display: inline-flex;
  align-items: center;
  gap: .35rem;
  font-weight: 600;
}

@media (max-width: 575.98px) {
  .ims-modal-standard-header,
  .ims-crud-modal-header,
  .ims-modal-header,
  .ims-crud-modal .modal-header,
  .ims-crud-scope .modal-dialog.ims-modal-standard .modal-header {
    padding: .85rem 1rem !important;
  }

  .ims-modal-standard-body,
  .ims-crud-modal .modal-body,
  .ims-modal-body,
  .ims-crud-scope .modal-dialog.ims-modal-standard .modal-body {
    padding: 1rem !important;
    max-height: calc(100vh - 185px) !important;
  }

  .ims-modal-standard-footer,
  .ims-crud-modal .modal-footer,
  .ims-modal-footer,
  .ims-crud-scope .modal-dialog.ims-modal-standard .modal-footer {
    padding: .8rem 1rem !important;
  }
}

/* Badges especializados dentro de headers unificados. */
.g3-badge,
.dv-badge,
.ims-modal-header-badge {
  background: rgba(79, 70, 229, .10) !important;
  color: #4338ca !important;
  border: 1px solid rgba(79, 70, 229, .18) !important;
  border-radius: 999px !important;
  font-size: .74rem !important;
  font-weight: 700 !important;
  padding: .25rem .65rem !important;
  line-height: 1.1 !important;
}

/* ==========================================================================
 * IMS — Modal Final Body/Footer Hardening
 * --------------------------------------------------------------------------
 * Cierre visual de modales: todo lo que está dentro del body/footer debe tener
 * fondo, contraste y espaciado uniforme aunque el módulo tenga CSS propio.
 * ========================================================================== */

.ims-modal-standard-content {
  isolation: isolate;
}

.ims-modal-standard-body,
.ims-crud-modal .modal-body,
.ims-modal-body,
.ims-crud-scope .modal-dialog.ims-modal-standard .modal-body {
  font-size: .94rem !important;
}

.ims-modal-standard-body .form-label,
.ims-modal-standard-body label,
.ims-crud-modal .modal-body .form-label,
.ims-crud-modal .modal-body label {
  color: #334155 !important;
  font-weight: 650 !important;
}

.ims-modal-standard-body .form-text,
.ims-crud-modal .modal-body .form-text,
.ims-modal-standard-body .text-muted {
  color: #64748b !important;
}

.ims-modal-standard-body .form-control,
.ims-modal-standard-body .form-select,
.ims-modal-standard-body textarea,
.ims-modal-standard-body input,
.ims-modal-standard-body select,
.ims-crud-modal .modal-body .form-control,
.ims-crud-modal .modal-body .form-select,
.ims-crud-modal .modal-body textarea,
.ims-crud-modal .modal-body input,
.ims-crud-modal .modal-body select {
  background-color: #ffffff !important;
  color: #0f172a !important;
  border-color: #cbd5e1 !important;
}

.ims-modal-standard-body .form-control:focus,
.ims-modal-standard-body .form-select:focus,
.ims-crud-modal .modal-body .form-control:focus,
.ims-crud-modal .modal-body .form-select:focus {
  border-color: var(--ims-modal-accent) !important;
  box-shadow: 0 0 0 .2rem rgba(79, 70, 229, .12) !important;
}

.ims-modal-standard-body .form-control:disabled,
.ims-modal-standard-body .form-select:disabled,
.ims-modal-standard-body .form-control[readonly],
.ims-modal-standard-body .form-select[readonly],
.ims-crud-modal .modal-body .form-control:disabled,
.ims-crud-modal .modal-body .form-select:disabled,
.ims-crud-modal .modal-body .form-control[readonly],
.ims-crud-modal .modal-body .form-select[readonly] {
  background-color: #f8fafc !important;
  color: #64748b !important;
}

.ims-modal-standard-body .input-group-text,
.ims-crud-modal .modal-body .input-group-text {
  background: #f8fafc !important;
  color: #475569 !important;
  border-color: #cbd5e1 !important;
  font-weight: 650 !important;
}

.ims-modal-standard-body .alert {
  border-radius: 12px !important;
  border-width: 1px !important;
}

.ims-modal-standard-body .alert-info {
  background: #eff6ff !important;
  color: #1e3a8a !important;
  border-color: #bfdbfe !important;
}

.ims-modal-standard-body .alert-warning {
  background: #fffbeb !important;
  color: #78350f !important;
  border-color: #fde68a !important;
}

.ims-modal-standard-body .alert-danger {
  background: #fef2f2 !important;
  color: #991b1b !important;
  border-color: #fecaca !important;
}

/* Tarjetas y secciones internas de modales Grupo 1/2/3. */
.ims-modal-standard-body .dv-info-card,
.ims-modal-standard-body .dv-item,
.ims-modal-standard-body .dv-totals,
.ims-modal-standard-body .pd-product-hero,
.ims-modal-standard-body .pd-gasto-hero,
.ims-modal-standard-body .pd-emp-hero,
.ims-modal-standard-body .pd-calc-box,
.ims-modal-standard-body .pd-action-box,
.ims-modal-standard-body .g3-card,
.ims-modal-standard-body .g3-box,
.ims-modal-standard-body .card {
  background-color: #ffffff !important;
  color: #334155 !important;
  border-color: #e2e8f0 !important;
}

.ims-modal-standard-body .dv-totals,
.ims-modal-standard-body .pd-calc-box,
.ims-modal-standard-body .pd-action-box,
.ims-modal-standard-body .g3-box {
  background: #f8fafc !important;
}

.ims-modal-standard-body .dv-info-label,
.ims-modal-standard-body .dv-item-meta,
.ims-modal-standard-body .dv-total-label,
.ims-modal-standard-body .pd-product-hero-meta,
.ims-modal-standard-body .g3-label,
.ims-modal-standard-body .g3-meta,
.ims-modal-standard-body .is-mute {
  color: #64748b !important;
}

.ims-modal-standard-body .dv-info-value,
.ims-modal-standard-body .dv-item-name,
.ims-modal-standard-body .dv-total-value,
.ims-modal-standard-body .pd-product-hero-name,
.ims-modal-standard-body .g3-value,
.ims-modal-standard-body .g3-title {
  color: #0f172a !important;
}

.ims-modal-standard-body .dv-section-title,
.ims-modal-standard-body .g3-section-title {
  color: #0f172a !important;
  border-color: #e2e8f0 !important;
}

/* Iconos de tarjetas informativas: clases reutilizables, sin estilos inline. */
.ims-modal-standard-body .dv-info-icon {
  background: rgba(79, 70, 229, .10) !important;
  color: var(--ims-modal-accent) !important;
}
.ims-modal-standard-body .ims-mi-primary { background: rgba(59,130,246,.10) !important; color: #2563eb !important; }
.ims-modal-standard-body .ims-mi-success { background: rgba(22,163,74,.10) !important; color: #16a34a !important; }
.ims-modal-standard-body .ims-mi-info { background: rgba(6,182,212,.10) !important; color: #0891b2 !important; }
.ims-modal-standard-body .ims-mi-warning { background: rgba(245,158,11,.13) !important; color: #b45309 !important; }
.ims-modal-standard-body .ims-mi-danger { background: rgba(236,72,153,.10) !important; color: #db2777 !important; }
.ims-modal-standard-body .ims-mi-purple { background: rgba(139,92,246,.10) !important; color: #7c3aed !important; }

/* Listas/tablas internas en modales. */
.ims-modal-standard-body table,
.ims-modal-standard-body .table {
  color: #334155 !important;
  background: #ffffff !important;
}
.ims-modal-standard-body .table thead th,
.ims-modal-standard-body table thead th {
  background: #f8fafc !important;
  color: #334155 !important;
  border-bottom-color: #e2e8f0 !important;
}
.ims-modal-standard-body .table tbody td,
.ims-modal-standard-body table tbody td {
  border-color: #edf2f7 !important;
}

/* Footer y botones: contraste seguro en todos los estados. */
.ims-modal-standard-footer .btn,
.ims-crud-modal .modal-footer .btn,
.ims-modal-footer .btn {
  border-radius: 10px !important;
  font-weight: 700 !important;
  box-shadow: none !important;
}
.ims-modal-standard-footer .btn-primary,
.ims-crud-modal .modal-footer .btn-primary {
  background: var(--ims-modal-accent) !important;
  border-color: var(--ims-modal-accent) !important;
  color: #ffffff !important;
}
.ims-modal-standard-footer .btn-secondary,
.ims-crud-modal .modal-footer .btn-secondary {
  background: #475569 !important;
  border-color: #475569 !important;
  color: #ffffff !important;
}
.ims-modal-standard-footer .btn-warning,
.ims-crud-modal .modal-footer .btn-warning {
  background: #f59e0b !important;
  border-color: #f59e0b !important;
  color: #111827 !important;
}
.ims-modal-standard-footer .btn-danger,
.ims-crud-modal .modal-footer .btn-danger {
  background: #dc2626 !important;
  border-color: #dc2626 !important;
  color: #ffffff !important;
}
.ims-modal-standard-footer .btn-outline-secondary,
.ims-crud-modal .modal-footer .btn-outline-secondary {
  background: #ffffff !important;
  border-color: #cbd5e1 !important;
  color: #334155 !important;
}
.ims-modal-standard-footer .btn-outline-secondary:hover,
.ims-crud-modal .modal-footer .btn-outline-secondary:hover {
  background: #f1f5f9 !important;
  color: #0f172a !important;
}

/* Botones grandes de acciones dentro del body Grupo 3. */
.ims-modal-standard-body .pd-btn-action,
.ims-modal-standard-body .dr-btn-action {
  color: #ffffff !important;
  border: 0 !important;
}
.ims-modal-standard-body .pd-btn-title,
.ims-modal-standard-body .pd-btn-sub,
.ims-modal-standard-body .dr-btn-title,
.ims-modal-standard-body .dr-btn-sub {
  color: #ffffff !important;
}

.ims-modal-footer-between {
  justify-content: space-between !important;
}

/* Botones dentro del body del modal: mismo contraste que en el footer. */
.ims-modal-standard-body .btn-primary,
.ims-crud-modal .modal-body .btn-primary {
  background: var(--ims-modal-accent) !important;
  border-color: var(--ims-modal-accent) !important;
  color: #ffffff !important;
}
.ims-modal-standard-body .btn-secondary,
.ims-crud-modal .modal-body .btn-secondary {
  background: #475569 !important;
  border-color: #475569 !important;
  color: #ffffff !important;
}
.ims-modal-standard-body .btn-warning,
.ims-crud-modal .modal-body .btn-warning {
  background: #f59e0b !important;
  border-color: #f59e0b !important;
  color: #111827 !important;
}
.ims-modal-standard-body .btn-danger,
.ims-crud-modal .modal-body .btn-danger {
  background: #dc2626 !important;
  border-color: #dc2626 !important;
  color: #ffffff !important;
}
.ims-modal-standard-body .btn-outline-secondary,
.ims-crud-modal .modal-body .btn-outline-secondary {
  background: #ffffff !important;
  border-color: #cbd5e1 !important;
  color: #334155 !important;
}
.ims-modal-standard-body .btn-outline-secondary:hover,
.ims-crud-modal .modal-body .btn-outline-secondary:hover {
  background: #f1f5f9 !important;
  color: #0f172a !important;
}
.ims-modal-standard-body .ab-add-btn {
  background: var(--ims-modal-accent) !important;
  color: #ffffff !important;
  border: 0 !important;
  border-radius: 10px !important;
  font-weight: 700 !important;
}
.ims-modal-standard-body .ab-add-btn:disabled {
  opacity: .6 !important;
  cursor: not-allowed !important;
}

/* ========================================================================== 
 * IMS — Modal height + scroll hardening (P32J)
 * --------------------------------------------------------------------------
 * Regla final:
 * - Los modales de módulos (.ims-crud-modal) comparten la misma altura útil.
 * - Header y footer permanecen visibles.
 * - Solo el body realiza scroll.
 * - Los formularios anidados dentro de modal-content también son flexibles.
 * - Los modales utilitarios conservan altura por contenido, pero nunca salen
 *   del viewport.
 * ========================================================================== */
.modal-dialog-scrollable {
  margin-top: calc(var(--ims-modal-viewport-gap) / 2) !important;
  margin-bottom: calc(var(--ims-modal-viewport-gap) / 2) !important;
  max-height: calc(100vh - var(--ims-modal-viewport-gap)) !important;
  max-height: calc(100dvh - var(--ims-modal-viewport-gap)) !important;
}

.modal-dialog-scrollable .modal-content,
.modal-dialog-scrollable form.modal-content {
  display: flex !important;
  flex-direction: column !important;
  min-height: 0 !important;
  max-height: calc(100vh - var(--ims-modal-viewport-gap)) !important;
  max-height: calc(100dvh - var(--ims-modal-viewport-gap)) !important;
}

/* Altura oficial de los modales pertenecientes a módulos/listados IMS. */
.ims-crud-modal .modal-dialog.modal-dialog-scrollable {
  height: min(var(--ims-module-modal-height), calc(100vh - var(--ims-modal-viewport-gap))) !important;
  height: min(var(--ims-module-modal-height), calc(100dvh - var(--ims-modal-viewport-gap))) !important;
  min-height: 0 !important;
  max-height: min(var(--ims-module-modal-height), calc(100vh - var(--ims-modal-viewport-gap))) !important;
  max-height: min(var(--ims-module-modal-height), calc(100dvh - var(--ims-modal-viewport-gap))) !important;
}

.ims-crud-modal .modal-dialog.modal-dialog-scrollable > .modal-content,
.ims-crud-modal .modal-dialog.modal-dialog-scrollable > form.modal-content {
  height: 100% !important;
  max-height: 100% !important;
}

/* CRUD unificado y formularios como hijos directos del content. */
.modal-dialog-scrollable .modal-content > form,
.modal-dialog-scrollable .ims-modal-content > form,
.modal-dialog-scrollable .ims-crud-modal-form {
  display: flex !important;
  flex: 1 1 auto !important;
  flex-direction: column !important;
  min-height: 0 !important;
  overflow: hidden !important;
}

.modal-dialog-scrollable .modal-header,
.modal-dialog-scrollable .modal-footer,
.modal-dialog-scrollable .ims-modal-header,
.modal-dialog-scrollable .ims-modal-footer,
.modal-dialog-scrollable .ims-um-header {
  flex: 0 0 auto !important;
  position: relative;
  z-index: 2;
}

.modal-dialog-scrollable .modal-body,
.modal-dialog-scrollable .ims-modal-standard-body,
.modal-dialog-scrollable .ims-modal-body,
.modal-dialog-scrollable .g3-body,
.modal-dialog-scrollable .ims-um-body,
.modal-dialog-scrollable .help-modal-body {
  flex: 1 1 auto !important;
  min-height: 0 !important;
  max-height: none !important;
  overflow-y: auto !important;
  overflow-x: hidden;
  overscroll-behavior: contain;
  scroll-padding-top: .75rem;
  scroll-padding-bottom: 1rem;
  scrollbar-gutter: stable;
  -webkit-overflow-scrolling: touch;
}

/* Los modales G3 conservan su layout horizontal mientras el mismo cuerpo hace scroll. */
.modal-dialog-scrollable .g3-body.modal-body {
  display: flex;
}

@media (max-width: 575.98px) {
  .modal-dialog-scrollable {
    margin-top: calc(var(--ims-modal-viewport-gap-mobile) / 2) !important;
    margin-bottom: calc(var(--ims-modal-viewport-gap-mobile) / 2) !important;
    max-height: calc(100vh - var(--ims-modal-viewport-gap-mobile)) !important;
    max-height: calc(100dvh - var(--ims-modal-viewport-gap-mobile)) !important;
  }

  .modal-dialog-scrollable .modal-content,
  .modal-dialog-scrollable form.modal-content {
    max-height: calc(100vh - var(--ims-modal-viewport-gap-mobile)) !important;
    max-height: calc(100dvh - var(--ims-modal-viewport-gap-mobile)) !important;
  }

  .ims-crud-modal .modal-dialog.modal-dialog-scrollable {
    height: calc(100vh - var(--ims-modal-viewport-gap-mobile)) !important;
    height: calc(100dvh - var(--ims-modal-viewport-gap-mobile)) !important;
    max-height: calc(100vh - var(--ims-modal-viewport-gap-mobile)) !important;
    max-height: calc(100dvh - var(--ims-modal-viewport-gap-mobile)) !important;
  }

  .ims-modal-standard-footer,
  .ims-crud-modal .modal-footer,
  .ims-modal-footer,
  .ims-crud-scope .modal-dialog.ims-modal-standard .modal-footer {
    padding-bottom: calc(.8rem + env(safe-area-inset-bottom)) !important;
  }
}

/* ========================================================================== 
 * P33 — Arquitectura única real de modales
 * --------------------------------------------------------------------------
 * Todo modal normalizado por /js/ims-modal-manager.js queda marcado como:
 * .ims-modal-unified[data-ims-modal="standard"]
 * Esta regla evita diferencias entre modales CRUD, manuales heredados y
 * modales especiales de módulos.
 * ========================================================================== */
.ims-modal-unified .modal-dialog {
  margin-top: 1rem !important;
  margin-bottom: 1rem !important;
}

.ims-modal-unified .modal-dialog.ims-modal-standard-sm {
  width: min(560px, calc(100vw - 2rem)) !important;
  max-width: min(560px, calc(100vw - 2rem)) !important;
}

.ims-modal-unified .modal-dialog.ims-modal-standard-lg {
  width: min(1040px, calc(100vw - 2rem)) !important;
  max-width: min(1040px, calc(100vw - 2rem)) !important;
}

.ims-modal-unified .modal-dialog.ims-modal-standard-xl {
  width: min(1180px, calc(100vw - 2rem)) !important;
  max-width: min(1180px, calc(100vw - 2rem)) !important;
}

.ims-modal-unified .ims-modal-standard-content,
.ims-modal-unified .ims-modal-form-content,
.ims-modal-unified .modal-content.ims-modal-content {
  max-height: min(var(--ims-module-modal-height), calc(100dvh - var(--ims-modal-viewport-gap))) !important;
  display: flex !important;
  flex-direction: column !important;
}

.ims-modal-unified .ims-modal-standard-header,
.ims-modal-unified .ims-modal-header,
.ims-modal-unified .ims-modal-standard-footer,
.ims-modal-unified .ims-modal-footer {
  flex: 0 0 auto !important;
}

.ims-modal-unified .ims-modal-standard-body,
.ims-modal-unified .ims-modal-body,
.ims-modal-unified [data-ims-modal-body="1"] {
  flex: 1 1 auto !important;
  min-height: 0 !important;
  max-height: none !important;
  overflow-y: auto !important;
  overscroll-behavior: contain !important;
}

.ims-modal-unified .ims-modal-loader {
  display: inline-flex;
  align-items: center;
  gap: .5rem;
  margin-bottom: .75rem;
  color: var(--ims-modal-muted);
  font-weight: 600;
  font-size: .9rem;
}

.ims-modal-unified .modal-footer .btn,
.ims-modal-unified .ims-modal-footer .btn {
  white-space: nowrap;
}

@media (max-width: 575.98px) {
  .ims-modal-unified .modal-dialog,
  .ims-modal-unified .modal-dialog.ims-modal-standard-sm,
  .ims-modal-unified .modal-dialog.ims-modal-standard,
  .ims-modal-unified .modal-dialog.ims-modal-standard-lg,
  .ims-modal-unified .modal-dialog.ims-modal-standard-xl {
    width: calc(100vw - 1rem) !important;
    max-width: calc(100vw - 1rem) !important;
    height: calc(100dvh - 1rem) !important;
    margin: .5rem !important;
  }

  .ims-modal-unified .ims-modal-standard-content,
  .ims-modal-unified .ims-modal-form-content,
  .ims-modal-unified .modal-content.ims-modal-content {
    max-height: calc(100dvh - 1rem) !important;
    height: calc(100dvh - 1rem) !important;
  }

  .ims-modal-unified .ims-modal-standard-footer,
  .ims-modal-unified .ims-modal-footer {
    padding-bottom: calc(.85rem + env(safe-area-inset-bottom, 0px)) !important;
  }
}
