/* ================================================================
   COPER / PYMES — Design System Overrides
   Applies on top of Metronic Tailwind (Demo1)
   ================================================================ */

/* ── 1. Design Tokens ───────────────────────────────────────────────
   Fuente única para canvas/texto: --background / --foreground (contrato
   Metronic demo1). --ds-surface / --ds-on-surface aliasan a esas vars.
   Light y dark se resuelven solo cambiando este bloque. */
:root {
  /* Override Metronic KTUI — canvas/texto COPER */
  --background:             #F4F4F4;
  --foreground:             #1A1C1C;

  --ds-primary:             #e0693f;
  /* Canal RGB de --ds-primary, para componer alphas con rgba(... / x).
     Debe seguir a --ds-primary si ese valor cambia. */
  --ds-primary-rgb:         224 105 63;
  --ds-primary-dark:        #c55a31;
  --ds-on-primary:          #FFFFFF;
  --ds-primary-container:   #fde8df;

  /* Surface stack — tonal layering, no borders */
  --ds-surface:             var(--background);
  --ds-surface-low:         #EBEBEB;
  --ds-surface-lowest:      #FFFFFF;
  --ds-surface-high:        #E2E2E2;
  --ds-surface-highest:     #D5D5D5;

  /* Text — never pure black */
  --ds-on-surface:          var(--foreground);
  --ds-on-surface-variant:  #4A4D4D;
  --ds-on-surface-faint:    #8C8F8F;

  /* Ghost border — felt, not seen */
  --ds-outline-variant:     rgba(26, 28, 28, 0.07);

  /* Elevation — ambient only */
  --ds-shadow-card:         0 2px 16px rgba(26, 28, 28, 0.04);
  --ds-shadow-float:        0 8px 40px rgba(26, 28, 28, 0.06);

  /* Metronic form/card tokens → COPER */
  --card:                   var(--ds-surface-lowest);
  --card-foreground:        var(--ds-on-surface);
  --input:                  #e2e2e2;
  --border:                 #e2e2e2;

  /* Radius scale */
  --ds-r-sm:   0.375rem;
  --ds-r-md:   0.5rem;
  --ds-r-lg:   0.75rem;
  --ds-r-xl:   1rem;
  --ds-r-2xl:  1.25rem;

  /* Altura de campo — fuente única de verdad para input, select y KTSelect */
  --ds-input-h: 2.375rem;   /* 38px */
}

.dark {
  --background:             #15171c;
  --foreground:             #e8eaea;

  --ds-surface:             var(--background);
  --ds-surface-low:         #1c1e24;
  --ds-surface-lowest:      #22252c;
  --ds-surface-high:        #2a2d36;
  --ds-surface-highest:     #343842;

  --ds-on-surface:          var(--foreground);
  --ds-on-surface-variant:  #a8abad;
  --ds-on-surface-faint:    #6f7375;

  --ds-primary-container:   rgba(224, 105, 63, 0.18);

  --ds-outline-variant:     rgba(255, 255, 255, 0.12);

  --ds-shadow-card:         0 2px 16px rgba(0, 0, 0, 0.28);
  --ds-shadow-float:        0 8px 40px rgba(0, 0, 0, 0.36);

  /* Alinea bordes/cards Metronic al outline COPER.
     Sin esto, --input/--card quedan en defaults zinc y se ven “blancos”. */
  --card:                   var(--ds-surface-lowest);
  --card-foreground:        var(--ds-on-surface);
  --input:                  #3a3d45;
  --border:                 #3a3d45;
  --ring:                   var(--ds-primary);
}

/* ── 2. Typography ────────────────────────────────────────────────── */
/* Color y fondo del canvas los aportan bg-background / text-foreground
   (tokens --background / --foreground). No forzar aquí. */
body {
  font-family: 'Work Sans', 'Valera Round Regular', sans-serif !important;
  -webkit-font-smoothing: antialiased;
}

/* text-foreground no estaba en el CSS compilado (tree-shake: no se usaba
   en plantillas). Puente al token --foreground hasta el próximo build:css. */
.text-foreground {
  color: var(--foreground);
}

/* jQuery UI accessibility helpers.
   Some views use autocomplete without loading the theme CSS that normally hides these nodes. */
.ui-helper-hidden-accessible {
  position: absolute !important;
  width: 1px !important;
  height: 1px !important;
  padding: 0 !important;
  margin: -1px !important;
  overflow: hidden !important;
  clip: rect(0 0 0 0) !important;
  white-space: nowrap !important;
  border: 0 !important;
}

/* Floating WhatsApp support button used in Metronic layouts. */
a.float.chat_button {
  position: fixed;
  right: 20px;
  bottom: 20px;
  width: 60px;
  height: 60px;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 9999px;
  background-color: #25D366;
  color: #fff;
  box-shadow: var(--ds-shadow-float);
  z-index: 1000;
  text-decoration: none;
}

a.float.chat_button:hover,
a.float.chat_button:focus {
  background-color: #1ebe57;
  color: #fff;
  text-decoration: none;
}

a.float.chat_button .my-float {
  margin-top: 0;
  line-height: 1;
}

a.float.chat_button .chat-button-badge {
  position: absolute;
  top: -2px;
  right: -2px;
  min-width: 18px;
  height: 18px;
  padding: 0 5px;
  border-radius: 9999px;
  background: var(--ds-primary, #e0693f);
  color: #fff;
  font-size: 0.625rem;
  font-weight: 700;
  line-height: 18px;
  text-align: center;
  display: none;
  box-sizing: border-box;
}

a.float.chat_button .chat-button-badge.is-visible {
  display: block;
}

a.float.chat_button + .label-container {
  position: fixed;
  right: 85px;
  bottom: 28px;
  display: none;
  align-items: center;
  opacity: 0;
  pointer-events: none;
  z-index: 1000;
}

a.float.chat_button:hover + .label-container {
  display: flex;
  opacity: 1;
}

a.float.chat_button + .label-container .label-text {
  color: #fff;
  background: rgba(51, 51, 51, 0.5);
  padding: 10px;
  border-radius: 3px;
}

a.float.chat_button + .label-container .label-arrow {
  color: var(--ds-on-surface-faint);
  opacity: 0.5;
}

/* Panel flotante del chat de Ayuda Online.
   Vive en layout_metronic (no carga app.css); sin esto el #chat no se fija. */
.chat-cliente {
  position: fixed;
  right: 50px;
  width: min(30%, 420px);
  min-width: 300px;
  height: 0;
  max-height: 450px;
  bottom: 120px;
  z-index: 1010;
}

.chat-cliente > .kt-card {
  height: 100%;
  display: flex;
  flex-direction: column;
  overflow: hidden;
}

.chat-cliente .kt-card-content {
  display: flex;
  flex-direction: column;
  flex: 1;
  min-height: 0;
}

.chat-cliente #mensajes {
  background: var(--ds-surface-lowest);
  color: var(--ds-on-surface);
  flex: 1;
  min-height: 0;
}

/* Avatar del chat. */
.chat-avatar {
  width: 32px;
  height: 32px;
  border-radius: 50%;
  flex-shrink: 0;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  background: var(--ds-surface-high);
  color: var(--ds-on-surface-variant, var(--ds-on-surface));
  font-size: 1.25rem;
  line-height: 1;
}

@media only screen and (max-width: 767px) {
  .chat-cliente {
    right: 0;
    left: 0;
    width: 100%;
    min-width: 0;
    bottom: 90px;
  }
}

@media only screen and (min-width: 768px) and (max-width: 1279px) {
  .chat-cliente {
    right: 16px;
    width: 50%;
  }
}

h1, h2, h3, h4, h5, h6,
.kt-card-title {
  font-family: 'Plus Jakarta Sans', 'Valera Round Regular', sans-serif !important;
  letter-spacing: -0.02em;
  color: var(--ds-on-surface) !important;
}

.text-xl, .text-2xl, .text-3xl {
  font-family: 'Plus Jakarta Sans', sans-serif !important;
  letter-spacing: -0.02em;
}

.badge,
th,
.form-label,
.text-xs,
.text-2sm,
code, .font-mono {
  font-family: 'Inter', sans-serif !important;
}

/* ── 3. Canvas & Surface ──────────────────────────────────────────── */
/* El canvas lo pinta body.bg-background. Content hereda; no re-pintar. */

/* ── 4. Cards — anatomía Metronic/KTUI ─────────────────────────────
   https://ktui.io/docs/card
   kt-card → kt-card-header (+ kt-card-heading / kt-card-title) →
   kt-card-content → kt-card-footer. No anular borde ni sombra nativos. */
.kt-card {
  background-color: var(--card) !important;
  border: 1px solid var(--border) !important;
  box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05) !important;
  border-radius: calc(var(--radius, 0.5rem) + 4px) !important;
  overflow: hidden;
  color: var(--card-foreground);
}

.kt-card-header {
  background-color: transparent;
  border-bottom: 1px solid var(--border);
}

.kt-card-content {
  color: var(--card-foreground);
}

.kt-card-footer {
  border-top: 1px solid var(--border);
}

.kt-card.filter-card {
  background-color: var(--ds-surface-low) !important;
  box-shadow: none !important;
}

/* ── 5. No-Line Rule — Tables ─────────────────────────────────────── */

/* Ancho de la tabla. En Metronic v9 (Tailwind v4) `.table` es la utilidad de
   display —`display: table`, styles.css:455— y no el componente de Bootstrap,
   que era quien aportaba el `width: 100%`. Como Bootstrap ya no se carga, sin
   esta regla la tabla se encoge al ancho de su contenido y el fondo del thead
   queda cortado a media tarjeta.
   Se limita a `table.table` porque `.table` sigue siendo una utilidad válida
   para dar display:table a un div. */
table.table {
  width: 100%;
}

.table > :not(caption) > * > * {
  border-bottom: none !important;
  border-color: transparent !important;
}

.table-row-bordered > tbody > tr,
.table-row-bordered > thead > tr {
  border-bottom: none !important;
}

/* Tonal alternating rows */
.table > thead > tr {
  background-color: var(--ds-surface-low) !important;
}

.table > tbody > tr:nth-child(even) {
  background-color: var(--ds-surface-low) !important;
}

.table > tbody > tr:nth-child(odd) {
  background-color: var(--ds-surface-lowest) !important;
}

.table > tbody > tr:hover td {
  background-color: var(--ds-surface-high) !important;
}

.table > tbody > tr.totals-row {
  background-color: var(--ds-surface-low) !important;
  font-weight: 700;
}

.table > thead > tr > th {
  border-bottom: none !important;
  color: var(--ds-on-surface-faint) !important;
  font-family: 'Inter', sans-serif !important;
  font-size: 0.625rem !important;
  font-weight: 700 !important;
  letter-spacing: 0.06em !important;
  text-transform: uppercase !important;
  padding-top: 0.875rem !important;
  padding-bottom: 0.875rem !important;
}

/* Alineación de encabezados. El navegador centra los th por defecto mientras
   las celdas van a la izquierda, así que el encabezado no cae sobre su propia
   columna. Aplica a todas las tablas, DataTables incluidas: su hoja sólo
   define text-align mediante las clases opcionales dt-left / dt-center /
   dt-right.

   Los :not() son imprescindibles, no decorativos: las utilidades de Tailwind
   viven en @layer utilities y esta hoja no está en ninguna capa, y en la
   cascada lo no-capado le gana a lo capado por más específico que sea. Sin
   estas exclusiones esta única línea pisaría el text-end de todos los
   encabezados de importes del proyecto. */
.table > thead > tr > th:not(.text-center):not(.text-end):not(.text-right):not(.text-start):not(.text-left) {
  text-align: left;
}

/* Padding de celdas, sólo para tablas planas. Las de DataTables ya lo traen
   de jquery.dataTables.min.css (10px 18px en thead, 8px 10px en tbody);
   pisarlo cambiaría la densidad de todos los listados sin necesidad. */
.table:not(.dataTable) > thead > tr > th,
.table:not(.dataTable) > tbody > tr > td {
  padding-inline: 0.75rem;
}

/* Ritmo vertical, sólo si la celda no declara el suyo. Varias plantillas ya
   usan py-3 y por la misma razón de capas esta regla se lo comería. */
.table:not(.dataTable) > tbody > tr > td:not([class*="py-"]):not([class*="pt-"]):not([class*="pb-"]) {
  padding-block: 0.5rem;
}

/* Aire contra los bordes de la tarjeta que contiene la tabla. */
.table:not(.dataTable) > thead > tr > th:first-child,
.table:not(.dataTable) > tbody > tr > td:first-child {
  padding-inline-start: 1.25rem;
}

.table:not(.dataTable) > thead > tr > th:last-child,
.table:not(.dataTable) > tbody > tr > td:last-child {
  padding-inline-end: 1.25rem;
}

/* ── 6. Sidebar — Focus-Strip Architecture ────────────────────────── */
.kt-sidebar {
  background-color: var(--ds-surface-lowest) !important;
  border-inline-end: none !important;
  border-right: none !important;
  box-shadow: 1px 0 0 var(--ds-outline-variant) !important;
}

.kt-sidebar-header {
  border-bottom: none !important;
}

/* Accordion triggers: span full width of the menu-item */
.kt-menu-link.ds-menu-link {
  width: 100%;
}

.ds-menu-link {
  display: flex;
  align-items: center;
  gap: 14px;
  padding: 9px 16px;
  border-left: 3px solid transparent;
  color: var(--ds-on-surface-variant);
  text-decoration: none;
  transition: border-color 0.15s ease, color 0.12s ease;
  background-color: transparent !important;
  border-radius: 0 !important;
}

.ds-menu-link:hover {
  color: var(--ds-on-surface);
  border-left-color: var(--ds-outline-variant);
  background-color: transparent !important;
}

.kt-menu-item.active > .ds-menu-link {
  border-left-color: var(--ds-primary) !important;
  color: var(--ds-on-surface) !important;
}

.kt-menu-item.active > .ds-menu-link .ds-menu-icon {
  color: var(--ds-primary) !important;
}

.ds-menu-icon {
  width: 20px;
  color: var(--ds-on-surface-faint);
  transition: color 0.12s ease;
  flex-shrink: 0;
  display: flex;
  align-items: center;
}

.ds-menu-title {
  font-size: 0.8125rem;
  font-weight: 500;
  font-family: 'Work Sans', sans-serif;
  color: inherit;
  transition: color 0.12s ease;
}

.ds-menu-link:hover .ds-menu-icon {
  color: var(--ds-on-surface-variant);
}

.ds-menu-section {
  margin-top: 1.25rem;
  padding-top: 1rem;
}

.ds-menu-section::before {
  content: '';
  display: block;
  height: 1px;
  background-color: var(--ds-outline-variant);
  margin: 0 12px 0.75rem;
}

.ds-menu-section-label {
  font-family: 'Inter', sans-serif;
  font-size: 0.575rem;
  font-weight: 700;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--ds-on-surface-faint);
  padding: 0 12px 0.375rem;
  display: block;
}

/* ── 7. Header — Glassmorphism ────────────────────────────────────── */
#header,
.kt-header {
  background: color-mix(in srgb, var(--background) 85%, transparent) !important;
  backdrop-filter: blur(24px) !important;
  -webkit-backdrop-filter: blur(24px) !important;
  border-bottom: none !important;
  box-shadow: 0 1px 0 var(--ds-outline-variant) !important;
}

/* ── 8. Buttons ─────────────────────────────────────────────────────
   Radio de esquinas = Metronic KTUI: calc(var(--radius) - 2px)
   (ver https://ktui.io/docs/button). Solo override de color/marca. */
.kt-btn {
  border-radius: calc(var(--radius) - 2px) !important;
}

.kt-btn-primary,
.kt-btn-primary:not(:disabled):not(.disabled) {
  background: linear-gradient(150deg, #e0693f 0%, #c55a31 100%) !important;
  border: none !important;
  color: #fff !important;
  font-family: 'Work Sans', sans-serif !important;
  font-weight: 600 !important;
  letter-spacing: 0.01em !important;
  box-shadow: none !important;
  transition: box-shadow 0.2s ease, transform 0.1s ease !important;
}

.kt-btn-primary:hover,
.kt-btn-primary:focus {
  background: linear-gradient(150deg, #cc5f38, #b05029) !important;
  box-shadow: 0 4px 18px rgba(224, 105, 63, 0.28) !important;
  transform: translateY(-1px) !important;
}

/* Outline = variante secundaria del proyecto (tokens Metronic KTUI). */
.kt-btn-outline {
  font-family: 'Work Sans', sans-serif !important;
  border: 1px solid var(--input) !important;
}

/* ── 9. Inputs — surface-lowest background, bottom-border on focus ────────────── */
input:not([type="checkbox"]):not([type="radio"]):not([type="file"]):not([type="range"]),
textarea,
select {
  background-color: var(--ds-surface-lowest) !important;
}

/*
  Legacy “material” (.input / .select): borde inferior al foco.
  Crispy-tailwind agrega la clase de widget ``select`` / a veces ``input`` al
  <select>/<input>, así que estas reglas NO deben aplicar a campos Metronic
  (kt-input, form-control, kt-select) o se apilan con el borde completo.
*/
.input:not(.kt-input):not(.form-control) {
  background-color: var(--ds-surface-lowest) !important;
  border: 1px solid var(--ds-outline-variant) !important;
  border-bottom: 2px solid transparent !important;
  border-radius: var(--ds-r-md) var(--ds-r-md) 0 0 !important;
  box-shadow: none !important;
  transition: border-bottom-color 0.2s ease !important;
}

.input:not(.kt-input):not(.form-control):focus-within {
  border-bottom-color: var(--ds-primary) !important;
  box-shadow: none !important;
}

.select:not(.kt-input):not(.form-control):not(.kt-select):not([data-kt-select-display]) {
  background-color: var(--ds-surface-lowest) !important;
  border: 1px solid var(--ds-outline-variant) !important;
  border-bottom: 2px solid transparent !important;
  border-radius: var(--ds-r-md) var(--ds-r-md) 0 0 !important;
  font-family: 'Work Sans', sans-serif !important;
  color: var(--ds-on-surface) !important;
  box-shadow: none !important;
  transition: border-bottom-color 0.2s ease !important;
}

.select:not(.kt-input):not(.form-control):not(.kt-select):not([data-kt-select-display]):focus {
  border-bottom-color: var(--ds-primary) !important;
  box-shadow: none !important;
  outline: none !important;
}

/* Labels sueltos, fuera de un .form-group de crispy.
   El display:block es funcional, no cosmético: <label> es inline por defecto,
   así que sin él el campo se dibuja al lado del label en vez de debajo. Sólo
   se notaba con inputs comunes; los selects ya saltaban de línea por el
   width:100% del wrapper de KTSelect. */
.form-label {
  display: block;
  margin-bottom: 0.35rem;
  font-family: 'Inter', sans-serif !important;
  font-size: 0.625rem !important;
  font-weight: 700 !important;
  letter-spacing: 0.06em !important;
  text-transform: uppercase !important;
  color: var(--ds-on-surface-faint) !important;
}

/* ── 10. Badges ───────────────────────────────────────────────────── */
.badge {
  font-family: 'Inter', sans-serif !important;
  font-weight: 700 !important;
  letter-spacing: 0.025em !important;
  border-radius: var(--ds-r-sm) !important;
  border: none !important;
}

.badge-warning {
  background-color: #FFF3CD !important;
  color: #92400E !important;
}

.badge-primary {
  background-color: #fde8df !important;
  color: #7c3217 !important;
}

.badge-info {
  background-color: #CFFAFE !important;
  color: #164E63 !important;
}

.badge-light-primary {
  background-color: #F3E8FF !important;
  color: #6B21A8 !important;
}

.badge-success {
  background-color: #D1FAE5 !important;
  color: #065F46 !important;
}

.badge-danger {
  background-color: #FFE4E6 !important;
  color: #9F1239 !important;
}

.badge-gray,
.badge-outline.badge-gray {
  background-color: var(--ds-surface-high) !important;
  color: var(--ds-on-surface-variant) !important;
  border: none !important;
}

.kt-badge {
  font-family: 'Inter', sans-serif !important;
  font-weight: 700 !important;
  letter-spacing: 0.025em !important;
}

.kt-badge-outline,
.kt-badge-outline.kt-badge-secondary {
  background-color: var(--ds-surface-high) !important;
  color: var(--ds-on-surface-variant) !important;
  border-color: transparent !important;
}

.kt-badge-outline.kt-badge-primary {
  background-color: var(--ds-primary-container) !important;
  color: #7c3217 !important;
  border-color: transparent !important;
}

.kt-badge-outline.kt-badge-success {
  background-color: #D1FAE5 !important;
  color: #065F46 !important;
  border-color: transparent !important;
}

.kt-badge-outline.kt-badge-warning {
  background-color: #FFF3CD !important;
  color: #92400E !important;
  border-color: transparent !important;
}

.kt-badge-outline.kt-badge-destructive {
  background-color: #FFE4E6 !important;
  color: #9F1239 !important;
  border-color: transparent !important;
}

.kt-badge-outline.kt-badge-info {
  background-color: #CFFAFE !important;
  color: #164E63 !important;
  border-color: transparent !important;
}

.ds-badge-status {
  padding-inline: 0.5rem !important;
  text-transform: uppercase;
  letter-spacing: 0.06em !important;
}

/* ── Tabs de navegación por URL (presupuesto, etc.) ──────────────── */
.ds-tabs {
  display: flex;
  flex-wrap: wrap;
  gap: 0.25rem 0.5rem;
  border-bottom: 1px solid rgba(26, 28, 28, 0.08);
}
.ds-tab {
  display: inline-flex;
  align-items: center;
  padding: 0.625rem 0.875rem;
  margin-bottom: -1px;
  font-family: 'Inter', sans-serif;
  font-size: 0.8125rem;
  font-weight: 600;
  color: var(--ds-on-surface-variant);
  text-decoration: none;
  border-bottom: 2px solid transparent;
  transition: color 0.15s ease, border-color 0.15s ease;
}
.ds-tab:hover {
  color: var(--ds-on-surface);
  text-decoration: none;
}
.ds-tab.active {
  color: var(--ds-primary);
  border-bottom-color: var(--ds-primary);
}

/* ── 11. User menu dropdown ───────────────────────────────────────── */
.kt-menu-dropdown {
  background-color: var(--ds-surface-lowest) !important;
  border: none !important;
  box-shadow: var(--ds-shadow-float) !important;
  border-radius: var(--ds-r-xl) !important;
}

.kt-menu-separator {
  background-color: var(--ds-outline-variant) !important;
  height: 1px !important;
  border: none !important;
}

.kt-menu-link {
  color: var(--ds-on-surface-variant) !important;
  font-family: 'Work Sans', sans-serif !important;
}

.kt-menu-link:hover {
  background-color: var(--ds-surface-low) !important;
}

.kt-menu-title {
  font-family: 'Work Sans', sans-serif !important;
}

/* ── 12. Alerts / Flash messages ──────────────────────────────────── */
.alert {
  border: none !important;
  border-radius: var(--ds-r-lg) !important;
}

.alert ul {
  margin: 0 !important;
  padding-left: 1.1rem !important;
}

.alert-heading {
  font-size: 0.9rem !important;
  font-weight: 600 !important;
  margin-bottom: 0.35rem !important;
}

.alert-danger {
  background: #fde8e8 !important;
  color: #b91c1c !important;
}

.alert-warning {
  background: #fef3c7 !important;
  color: #92400e !important;
}

.alert-success {
  background: var(--ds-success-container, #dcfce7) !important;
  color: var(--ds-success, #16a34a) !important;
}

.alert-info {
  background: var(--ds-primary-container) !important;
  color: var(--ds-primary) !important;
}

/* ── 13. User menu z-index fix ────────────────────────────────────── */
[data-kt-menu-item-toggle="dropdown"][data-kt-menu-state="open"] + [data-kt-menu-id] {
  z-index: 9999 !important;
}

/* ── 14. Sidebar collapse — hide labels, center icons ────────────── */
.kt-sidebar-collapse .kt-sidebar:not(:hover) .ds-menu-title,
.kt-sidebar-collapse .kt-sidebar:not(:hover) .ds-accordion-arrow,
.kt-sidebar-collapse .kt-sidebar:not(:hover) .ds-menu-section-label {
  display: none !important;
}

.kt-sidebar-collapse .kt-sidebar:not(:hover) .ds-menu-section::before {
  margin: 0 auto 0.5rem;
  width: calc(100% - 24px);
}

.kt-sidebar-collapse .kt-sidebar:not(:hover) .ds-menu-section {
  padding-top: 0.5rem;
}

.kt-sidebar-collapse .kt-sidebar:not(:hover) .ds-menu-link {
  justify-content: center !important;
  gap: 0 !important;
  padding: 9px 0 !important;
}

.kt-sidebar-collapse .kt-sidebar:not(:hover) .ds-menu-icon {
  width: 20px;
  margin: 0;
  flex-shrink: 0;
}

/* Collapsed sidebar: Metronic hides .default-logo and shows .small-logo.
   Estas reglas van sin @layer para ganar a styles.css (components). */
.kt-sidebar .small-logo {
  display: none;
}

.kt-sidebar-collapse .kt-sidebar:not(:hover) .small-logo {
  display: block;
}

/* Center logo and hide toggle button text area in collapsed header */
.kt-sidebar-collapse .kt-sidebar:not(:hover) .kt-sidebar-header {
  justify-content: center;
  padding-inline: 0.5rem;
}

/* Metronic .kt-menu-link has flex-grow:1 — reset in collapsed so icon centers */
.kt-sidebar-collapse .kt-sidebar:not(:hover) .kt-menu-link.ds-menu-link {
  flex-grow: 0;
  width: 100%;
}

/* Remove left-border offset so icon sits truly centered */
.kt-sidebar-collapse .kt-sidebar:not(:hover) .ds-menu-link {
  border-left: none !important;
}

/* ── 15. Page-level header ────────────────────────────────────────── */
.ds-page-title {
  font-family: 'Plus Jakarta Sans', sans-serif !important;
  font-size: 0.9375rem;
  font-weight: 600;
  letter-spacing: -0.01em;
  color: var(--ds-on-surface) !important;
  margin: 0;
  line-height: 1.3;
}

.ds-page-subtitle {
  font-family: 'Work Sans', sans-serif;
  font-size: 0.8125rem;
  color: var(--ds-on-surface-faint);
}

.ds-page-heading {
  display: flex;
  flex-direction: column;
  gap: 0.2rem;
  min-width: 0;
}

/* Fila de cabecera de página: breadcrumb a la izquierda, botonera a la derecha */
.ds-page-header-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: 0.5rem 1rem;
  margin-bottom: 1rem;
}

.ds-page-header-row:not(:has(> :not(:empty))) {
  display: none;
}

.ds-page-header-row .ds-page-toolbar {
  margin-bottom: 0;
  margin-left: auto;
}

.ds-page-toolbar {
  display: flex;
  flex-wrap: wrap;
  justify-content: flex-end;
  gap: 0.5rem;
  margin-bottom: 1rem;
}

#ds-flash-container:empty {
  display: none;
}

.ds-page-toolbar:empty {
  display: none;
  margin-bottom: 0;
}

.ds-form-shell {
  margin-top: 0.25rem;
}

.ds-form-shell > .kt-card-content {
  padding: 1.5rem !important;
}

.ds-form-intro {
  display: flex;
  flex-direction: column;
  gap: 0.4rem;
  margin-bottom: 1.25rem;
  padding-bottom: 0.9rem;
  border-bottom: 1px solid var(--ds-outline-variant);
}

.ds-form-intro:empty {
  display: none;
}

.ds-page-context {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.4rem;
  min-height: 1.25rem;
}

.ds-page-context:empty {
  display: none;
}

.ds-form-intro .ds-page-context a,
.ds-page-header-row .ds-page-context a {
  display: inline-flex;
  align-items: center;
  gap: 0.35rem;
  padding: 0 !important;
  background: transparent !important;
  border: 0 !important;
  border-radius: 0 !important;
  box-shadow: none !important;
  color: var(--ds-on-surface-faint) !important;
  font-family: 'Inter', sans-serif !important;
  font-size: 0.7rem !important;
  font-weight: 600 !important;
  letter-spacing: 0.04em;
  text-transform: uppercase;
}

.ds-form-intro .ds-page-context a:hover,
.ds-page-header-row .ds-page-context a:hover {
  color: var(--ds-on-surface-variant) !important;
  transform: none !important;
}

.ds-form-intro .ds-page-context a + a::before,
.ds-page-header-row .ds-page-context a + a::before {
  content: '/';
  margin-right: 0.35rem;
  color: var(--ds-on-surface-faint);
}

.ds-form-intro .ds-page-subtitle {
  margin: 0;
  max-width: 42rem;
  font-size: 0.8rem;
  line-height: 1.45;
}

/* Secciones de form/detalle: mismo look que kt-card (bridge legacy). */
.ds-form-section {
  border: 1px solid var(--border);
  border-radius: calc(var(--radius, 0.5rem) + 4px);
  background: var(--card);
  box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
  overflow: hidden;
  color: var(--card-foreground);
}

.ds-form-section-header {
  display: flex;
  min-height: 3.5rem;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: 0.625rem;
  padding-inline: 1.25rem;
  padding-block: 0.875rem;
  background: transparent;
  border-bottom: 1px solid var(--border);
  box-shadow: none;
}

.ds-form-section-copy {
  display: flex;
  flex-direction: column;
  gap: 0.25rem;
}

.ds-form-section-title {
  font-family: 'Plus Jakarta Sans', sans-serif;
  font-size: 1rem;
  font-weight: 600;
  letter-spacing: -0.025em;
  line-height: 1;
  color: var(--card-foreground);
  margin: 0;
}

.ds-form-section-subtitle {
  font-family: 'Work Sans', sans-serif;
  font-size: 0.875rem;
  line-height: 1.25;
  color: var(--muted-foreground, var(--ds-on-surface-faint));
  margin: 0;
}

.ds-form-section-body {
  padding: 1.25rem;
}

.ds-form-total {
  display: flex;
  justify-content: flex-end;
  margin-top: 1.25rem;
}

.ds-form-total-offset {
  padding-right: 0.75rem;
}

.ds-form-total-card {
  min-width: min(100%, 260px);
  padding: 0.85rem 1rem;
  border-radius: var(--ds-r-lg);
  background: var(--ds-surface-low);
  text-align: right;
}

.ds-form-total-label {
  display: block;
  margin-bottom: 0.25rem;
  font-family: 'Inter', sans-serif;
  font-size: 0.625rem;
  font-weight: 700;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--ds-on-surface-faint);
}

.ds-form-total-value {
  font-family: 'Plus Jakarta Sans', sans-serif;
  font-size: 1.125rem;
  font-weight: 700;
  color: var(--ds-on-surface);
}

.ds-form-actions {
  display: flex;
  flex-wrap: wrap;
  justify-content: flex-end;
  gap: 0.5rem;
  margin-top: 1.5rem;
  padding-top: 1rem;
  border-top: 1px solid var(--ds-outline-variant);
}

/* ── 16. Inline stat / field blocks ──────────────────────────────── */
.ds-field-label {
  font-family: 'Inter', sans-serif;
  font-size: 0.6rem;
  font-weight: 700;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--ds-on-surface-faint);
  margin-bottom: 0.2rem;
}

.ds-field-value {
  font-family: 'Work Sans', sans-serif;
  font-size: 0.875rem;
  color: var(--ds-on-surface);
}

.ds-field-value-large {
  font-family: 'Plus Jakarta Sans', sans-serif;
  font-size: 1.125rem;
  font-weight: 700;
  letter-spacing: -0.01em;
  color: var(--ds-on-surface);
}

/* ── 17. Color utilities ──────────────────────────────────────────── */
.text-gray-900 { color: var(--ds-on-surface) !important; }
.text-gray-800 { color: var(--ds-on-surface) !important; }
.text-gray-700 { color: var(--ds-on-surface-variant) !important; }
.text-gray-600 { color: var(--ds-on-surface-variant) !important; }
.text-gray-500 { color: var(--ds-on-surface-faint) !important; }
.text-gray-400 { color: var(--ds-on-surface-faint) !important; }

/* ── 18. Section dividers ─────────────────────────────────────────── */
.ds-section-divider {
  height: 1px;
  background-color: var(--ds-outline-variant);
  margin: 1rem 0;
}

/* ── 19. Delete modal ─────────────────────────────────────────────── */
.ds-delete-modal-overlay {
  position: fixed;
  inset: 0;
  background: rgba(26, 28, 28, 0.4);
  z-index: 9998;
  align-items: center;
  justify-content: center;
}
.ds-delete-modal-overlay:not(.hidden) {
  display: flex;
}

#ds-delete-overlay:not(.hidden) {
  display: flex;
}

#ds-ajax-overlay:not(.hidden) {
  display: flex;
}

.ds-delete-modal {
  background: var(--ds-surface-lowest);
  border-radius: var(--ds-r-xl);
  padding: 2rem;
  max-width: 400px;
  width: 90%;
  box-shadow: var(--ds-shadow-float);
}

/* ── 20. Generic AJAX modal ───────────────────────────────────────── */
.ds-modal-overlay {
  position: fixed;
  inset: 0;
  background: rgba(26, 28, 28, 0.4);
  z-index: 9990;
  display: flex;
  align-items: flex-start;
  justify-content: center;
  padding-top: 5vh;
  overflow-y: auto;
}

.ds-modal {
  background: var(--ds-surface-lowest);
  border-radius: var(--ds-r-xl);
  width: 90%;
  max-width: 640px;
  max-height: 90vh;
  box-shadow: var(--ds-shadow-float);
  margin-bottom: 2rem;
  display: flex;
  flex-direction: column;
  overflow: hidden;
}

.ds-modal-header {
  padding: 1.25rem 1.5rem 0.75rem;
  border-bottom: 1px solid var(--ds-outline-variant);
  display: flex;
  align-items: center;
  justify-content: space-between;
  flex-shrink: 0;
}

.ds-modal-body {
  padding: 1.5rem;
  overflow-y: auto;
  flex: 1 1 auto;
  min-height: 0;
}

.ds-modal-footer {
  padding: 1rem 1.5rem;
  border-top: 1px solid var(--ds-outline-variant);
  display: flex;
  gap: 0.5rem;
  justify-content: flex-end;
  flex-shrink: 0;
}

/* ── 21. Accordion menu ───────────────────────────────────────────── */
.kt-menu-item.open > .kt-menu-accordion {
  display: block !important;
}
.ds-accordion-arrow {
  margin-left: auto;
  font-size: 0.65rem;
  color: var(--ds-on-surface-faint);
  transition: transform 0.2s ease;
}
.kt-menu-item.open > .ds-menu-link .ds-accordion-arrow,
.kt-menu-item.open > div > .ds-accordion-arrow {
  transform: rotate(90deg);
}
.kt-menu-accordion {
  padding-left: 10px;
  position: relative;
}
.kt-menu-accordion::before {
  content: '';
  position: absolute;
  left: 12px;
  top: 0;
  bottom: 0;
  border-left: 1px solid var(--ds-outline-variant);
}
.kt-menu-accordion .ds-menu-link {
  border-left: none;
  padding-left: 20px;
  font-size: 0.8rem;
}
.kt-menu-accordion .kt-menu-item.active > .ds-menu-link {
  color: var(--ds-primary);
  font-weight: 600;
}

/* ── 22. Detail grid & summary strip ─────────────────────────────── */
.ds-detail-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
  gap: 1.25rem 2rem;
}

/* Prevent long unbreakable values (CDC, URLs) from overflowing their cell */
.ds-detail-grid > div {
  min-width: 0;
}

.ds-detail-grid .ds-field-value {
  overflow-wrap: anywhere;
  word-break: break-word;
}

.ds-detail-grid .col-span-full {
  grid-column: 1 / -1;
}

.ds-summary-strip {
  display: flex;
  flex-wrap: wrap;
  gap: 2rem;
  padding: 1rem 1.5rem;
  background: linear-gradient(180deg, var(--ds-surface-lowest) 0%, var(--ds-surface-low) 100%);
  box-shadow: inset 0 0 0 1px var(--ds-outline-variant);
  border-radius: var(--ds-r-lg);
  margin-bottom: 1.25rem;
}

.ds-summary-strip .ds-summary-item {
  display: flex;
  flex-direction: column;
  gap: 0.125rem;
}

/* ── 23. Print — keep Bootstrap 3 styles untouched ───────────────── */
@media print {
  .kt-sidebar, .kt-header, .kt-btn { display: none !important; }
  .kt-card { box-shadow: none !important; border: 1px solid #ddd !important; }
}

/* ── 24. DataTables (motor jQuery, UI alineada a KTUI Datatable) ──── */
/* Layout clásico: length + buscador arriba; info + paginación abajo.
 * Sort: .kt-table-col-sort (ocultamos PNG de jquery.dataTables). */

/* Legacy search-with-icon (si alguna vista aún lo usa). */
.ds-datatable-search-wrap {
  position: relative;
  min-width: 12rem;
  max-width: 20rem;
  flex: 1 1 12rem;
}

.ds-datatable-search-icon {
  position: absolute;
  left: 0.75rem;
  top: 50%;
  transform: translateY(-50%);
  font-size: 1rem;
  color: var(--ds-on-surface-variant);
  pointer-events: none;
  z-index: 1;
}

input.kt-input.ds-datatable-search,
input.ds-datatable-search {
  width: 100%;
  height: 2.25rem;
  font-size: 0.8125rem;
  padding-top: 0.5rem !important;
  padding-bottom: 0.5rem !important;
  padding-right: 0.75rem !important;
  padding-left: 2.5rem !important;
}

.ds-datatable-header,
.dataTables_wrapper .ds-datatable-header,
.ds-datatable-footer,
.dataTables_wrapper .ds-datatable-footer {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: 0.5rem 1rem;
  padding: 0.75rem 1.25rem;
  background: transparent;
}

.ds-datatable-header,
.dataTables_wrapper .ds-datatable-header {
  border-bottom: 1px solid var(--border, var(--ds-outline-variant));
  border-top: 0;
}

.ds-datatable-footer,
.dataTables_wrapper .ds-datatable-footer {
  border-top: 1px solid var(--border, var(--ds-outline-variant));
}

.dataTables_wrapper .ds-datatable-header .dataTables_filter,
.dataTables_wrapper .ds-datatable-footer .dataTables_paginate {
  margin-left: auto;
}

.dataTables_wrapper .ds-datatable-header .dataTables_filter input {
  min-width: 12rem;
  max-width: 20rem;
  width: 100%;
}

.ds-datatable-card .kt-card-table .kt-table-wrapper {
  border-radius: 0;
}

/* Wrapper DT: sin padding propio; el toolbar KTUI ya aporta borde/padding. */
.ds-datatable-card .dataTables_wrapper,
.kt-card-table .dataTables_wrapper {
  width: 100% !important;
  margin: 0 !important;
  padding: 0 !important;
}

.dataTables_wrapper table.dataTable.kt-table,
.dataTables_wrapper table.dataTable {
  margin: 0 !important;
  width: 100% !important;
  border-collapse: collapse !important;
}

/* Quitar iconos PNG de sort de jquery.dataTables — usamos kt-table-col-sort. */
.dataTables_wrapper table.dataTable thead > tr > th.sorting,
.dataTables_wrapper table.dataTable thead > tr > th.sorting_asc,
.dataTables_wrapper table.dataTable thead > tr > th.sorting_desc,
.dataTables_wrapper table.dataTable thead > tr > th.sorting_asc_disabled,
.dataTables_wrapper table.dataTable thead > tr > th.sorting_desc_disabled {
  background-image: none !important;
  background-position: initial !important;
  padding-right: 1rem !important;
  cursor: pointer;
}

.dataTables_wrapper table.dataTable thead > tr > th.sorting_disabled {
  cursor: default;
}

.dataTables_wrapper table.dataTable thead th.text-end .kt-table-col,
.dataTables_wrapper table.dataTable thead th.text-right .kt-table-col {
  width: 100%;
  justify-content: flex-end;
}

.dataTables_wrapper table.dataTable > thead > tr,
.dataTables_wrapper table.dataTable > tbody > tr,
.dataTables_wrapper table.dataTable > tbody > tr.odd,
.dataTables_wrapper table.dataTable > tbody > tr.even {
  background-color: transparent !important;
}

.dataTables_wrapper table.dataTable > tbody > tr.even > td {
  background-color: transparent !important;
}

.dataTables_wrapper table.dataTable td.dataTables_empty {
  background-color: transparent !important;
  color: var(--muted-foreground, var(--ds-on-surface-variant)) !important;
  text-align: center;
  padding: 2.5rem 1rem !important;
}

.dataTables_wrapper table.dataTable > thead > tr > th,
.dataTables_wrapper table.dataTable > thead > tr > td {
  background-color: transparent !important;
  color: var(--secondary-foreground, var(--ds-on-surface-faint)) !important;
  border-bottom: 1px solid var(--border, var(--ds-outline-variant)) !important;
  font-weight: 500 !important;
  font-size: 0.8125rem !important;
  text-transform: none !important;
  letter-spacing: normal !important;
}

.dataTables_wrapper table.dataTable > tbody > tr > td,
.dataTables_wrapper table.dataTable > tbody > tr > th,
.dataTables_wrapper table.dataTable tbody td.sorting_1,
.dataTables_wrapper table.dataTable tbody td.sorting_2,
.dataTables_wrapper table.dataTable tbody td.sorting_3 {
  background-color: transparent !important;
  color: var(--foreground, var(--ds-on-surface)) !important;
  border-bottom: 1px solid var(--border, var(--ds-outline-variant)) !important;
  transition: background-color 160ms ease, color 160ms ease;
}

.dataTables_wrapper table.dataTable > tbody > tr:hover > td,
.dataTables_wrapper table.dataTable > tbody > tr:hover > th,
.dataTables_wrapper table.dataTable tbody tr:hover td.sorting_1,
.dataTables_wrapper table.dataTable tbody tr:hover td.sorting_2,
.dataTables_wrapper table.dataTable tbody tr:hover td.sorting_3 {
  background-color: color-mix(in oklab, var(--muted, var(--ds-surface-high)) 50%, transparent) !important;
}

/* Toolbar / length / info — refuerzo sobre clases KTUI ya compiladas. */
.kt-datatable-toolbar.ds-datatable-footer,
.dataTables_wrapper > .kt-datatable-toolbar,
.kt-card-table > .kt-datatable-toolbar {
  background: transparent;
}

.kt-datatable-length,
.kt-datatable-info,
.dataTables_wrapper .dataTables_length,
.dataTables_wrapper .dataTables_info,
.dataTables_wrapper .dataTables_paginate {
  font-size: 0.875rem;
  color: var(--muted-foreground, var(--ds-on-surface-variant));
  padding: 0;
  margin: 0;
  float: none !important;
  text-align: left !important;
}

.dataTables_wrapper .dataTables_length label,
.kt-datatable-length label,
.dataTables_wrapper .dataTables_filter label {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  margin: 0;
  font-weight: 500;
  white-space: nowrap;
  font-size: 0.875rem;
}

.dataTables_wrapper .dataTables_length select,
.dataTables_wrapper .dataTables_length select.ds-datatable-length,
.kt-datatable-length select,
.dataTables_wrapper .dataTables_filter input {
  font-size: 0.8125rem;
  height: 2rem;
  padding: 0.25rem 0.625rem;
  border: 1px solid var(--border, var(--ds-outline-variant));
  border-radius: calc(var(--radius, 0.5rem) - 2px);
  background-color: var(--background, var(--ds-surface-lowest));
  color: var(--foreground, var(--ds-on-surface));
  outline: none;
}

.dataTables_wrapper .dataTables_length select,
.dataTables_wrapper .dataTables_length select.ds-datatable-length,
.kt-datatable-length select {
  font-size: 0.75rem;
  height: 1.75rem;
  min-width: 4rem;
  width: 4rem;
  padding: 0 1.5rem 0 0.625rem;
  appearance: none;
  -webkit-appearance: none;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='none' stroke='%239f9fa9' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-size: 14px 11px;
  background-position: right 0.5rem center;
  cursor: pointer;
}

.dataTables_wrapper .dataTables_filter input:focus {
  border-color: var(--ds-primary);
  box-shadow: 0 0 0 2px var(--ds-primary-container);
}

.dataTables_wrapper .dataTables_length [data-kt-select-wrapper] {
  width: auto !important;
  min-width: 4rem;
}

/* Paginación estilo .kt-datatable-pagination-button (KTUI). */
.dataTables_wrapper .dataTables_paginate,
.kt-datatable-pagination {
  display: flex !important;
  align-items: center;
  gap: 0.25rem;
  float: none !important;
  text-align: left !important;
}

.dataTables_wrapper .dataTables_paginate .paginate_button,
.kt-datatable-pagination .paginate_button,
.kt-datatable-pagination-button {
  display: inline-flex !important;
  align-items: center;
  justify-content: center;
  height: 1.75rem !important;
  min-width: 1.75rem !important;
  padding: 0 0.125rem !important;
  margin: 0 !important;
  border: none !important;
  border-radius: calc(var(--radius, 0.5rem) - 2px) !important;
  background: transparent !important;
  box-shadow: none !important;
  color: var(--muted-foreground, var(--ds-on-surface-variant)) !important;
  font-size: 0.8125rem !important;
  font-weight: 500 !important;
  cursor: pointer;
  float: none !important;
}

.dataTables_wrapper .dataTables_paginate .paginate_button:hover:not(.disabled):not(.current),
.kt-datatable-pagination-button:hover:not(.disabled):not(.current) {
  background-color: var(--accent, var(--ds-surface-low)) !important;
  color: var(--accent-foreground, var(--ds-on-surface)) !important;
}

.dataTables_wrapper .dataTables_paginate .paginate_button.current,
.dataTables_wrapper .dataTables_paginate .paginate_button.current:hover,
.kt-datatable-pagination-button.current {
  background-color: var(--accent, var(--ds-surface-high)) !important;
  color: var(--accent-foreground, var(--ds-on-surface)) !important;
}

.dataTables_wrapper .dataTables_paginate .paginate_button.disabled,
.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover,
.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active {
  color: var(--muted-foreground, var(--ds-on-surface-faint)) !important;
  background: transparent !important;
  cursor: default !important;
  opacity: 0.7;
}

.dataTables_wrapper .dataTables_paginate .ellipsis {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 1.75rem;
  height: 1.75rem;
  color: var(--muted-foreground, var(--ds-on-surface-variant));
}

.dataTables_wrapper .dataTables_processing {
  background: var(--card, var(--ds-surface-lowest));
  border: 1px solid var(--border, var(--ds-outline-variant));
  border-radius: calc(var(--radius, 0.5rem) - 2px);
  color: var(--card-foreground, var(--ds-on-surface-variant));
  font-size: 0.875rem;
  font-weight: 500;
  padding: 0.5rem 1rem;
  box-shadow: 0 1px 2px rgb(0 0 0 / 0.05);
}

/* Filtros por columna (thead, estilo kt-input) */
.dataTables_wrapper thead input.input,
.dataTables_wrapper thead input.ds-datatable-col-filter {
  height: 28px;
  font-size: 0.75rem;
  padding: 3px 8px;
  border: 1px solid var(--border, var(--ds-outline-variant));
  border-radius: var(--ds-r-sm, 4px);
  background: var(--background, var(--ds-surface-lowest));
  color: var(--foreground, var(--ds-on-surface));
  width: 100%;
  box-sizing: border-box;
}

.dataTables_wrapper thead input.input:focus,
.dataTables_wrapper thead input.ds-datatable-col-filter:focus {
  border-color: var(--ds-primary);
  outline: none;
  box-shadow: 0 0 0 2px var(--ds-primary-container);
}

/* Action buttons in DataTable cells — keep inline */
td:has(> .kt-btn) {
  white-space: nowrap;
  vertical-align: middle;
}

td .kt-btn + .kt-btn { margin-left: 2px; }

td .kt-btn { display: inline-flex; align-items: center; justify-content: center; vertical-align: middle; }

td .kt-btn:is(.btn-sm, .kt-btn-sm):is(.btn-light, .btn-secondary, .kt-btn-outline) {
  min-width: 32px;
  min-height: 32px;
  padding: 0.45rem 0.55rem !important;
  border: 1px solid var(--ds-outline-variant) !important;
  background: var(--ds-surface-high) !important;
  box-shadow: var(--ds-shadow-card) !important;
  color: var(--ds-on-surface) !important;
  transition:
    background-color 160ms ease,
    border-color 160ms ease,
    color 160ms ease,
    box-shadow 160ms ease,
    transform 160ms ease !important;
}

td .kt-btn:is(.btn-sm, .kt-btn-sm):is(.btn-light, .btn-secondary, .kt-btn-outline):hover {
  transform: translateY(-1px);
  box-shadow: 0 6px 14px rgba(15, 23, 42, 0.10) !important;
}

td .kt-btn:is(.btn-sm, .kt-btn-sm):is(.btn-light, .btn-secondary, .kt-btn-outline) i {
  color: inherit !important;
}

td .kt-btn:is(.btn-sm, .kt-btn-sm):is(.btn-light, .btn-secondary, .kt-btn-outline):has(.ki-eye),
td .kt-btn:is(.btn-sm, .kt-btn-sm):is(.btn-light, .btn-secondary, .kt-btn-outline):has(.ki-cloud-download) {
  color: #0f5ec9 !important;
  background: #eef5ff !important;
  border-color: rgba(15, 94, 201, 0.18) !important;
}

td .kt-btn:is(.btn-sm, .kt-btn-sm):is(.btn-light, .btn-secondary, .kt-btn-outline):has(.ki-eye):hover,
td .kt-btn:is(.btn-sm, .kt-btn-sm):is(.btn-light, .btn-secondary, .kt-btn-outline):has(.ki-cloud-download):hover {
  color: #0b4aa0 !important;
  background: #e0eeff !important;
  border-color: rgba(15, 94, 201, 0.28) !important;
}

td .kt-btn:is(.btn-sm, .kt-btn-sm):is(.btn-light, .btn-secondary, .kt-btn-outline):has(.ki-pencil),
td .kt-btn:is(.btn-sm, .kt-btn-sm):is(.btn-light, .btn-secondary, .kt-btn-outline):has(.ki-notepad-edit) {
  color: #c55a31 !important;
  background: #fff2ea !important;
  border-color: rgba(197, 90, 49, 0.18) !important;
}

td .kt-btn:is(.btn-sm, .kt-btn-sm):is(.btn-light, .btn-secondary, .kt-btn-outline):has(.ki-pencil):hover,
td .kt-btn:is(.btn-sm, .kt-btn-sm):is(.btn-light, .btn-secondary, .kt-btn-outline):has(.ki-notepad-edit):hover {
  color: #a94b26 !important;
  background: #ffe7da !important;
  border-color: rgba(197, 90, 49, 0.28) !important;
}

td .kt-btn:is(.btn-sm, .kt-btn-sm):is(.btn-light, .btn-secondary, .kt-btn-outline):has(.ki-plus),
td .kt-btn:is(.btn-sm, .kt-btn-sm):is(.btn-light, .btn-secondary, .kt-btn-outline):has(.ki-check) {
  color: #15803d !important;
  background: #ecfdf3 !important;
  border-color: rgba(21, 128, 61, 0.18) !important;
}

td .kt-btn:is(.btn-sm, .kt-btn-sm):is(.btn-light, .btn-secondary, .kt-btn-outline):has(.ki-plus):hover,
td .kt-btn:is(.btn-sm, .kt-btn-sm):is(.btn-light, .btn-secondary, .kt-btn-outline):has(.ki-check):hover {
  color: #166534 !important;
  background: #dcfce8 !important;
  border-color: rgba(21, 128, 61, 0.28) !important;
}

td .kt-btn:is(.btn-sm, .kt-btn-sm):is(.btn-light, .btn-secondary, .kt-btn-outline):has(.ki-trash) {
  color: #b42318 !important;
  background: #fff1f0 !important;
  border-color: rgba(180, 35, 24, 0.18) !important;
}

td .kt-btn:is(.btn-sm, .kt-btn-sm):is(.btn-light, .btn-secondary, .kt-btn-outline):has(.ki-trash):hover {
  color: #912018 !important;
  background: #ffe2e0 !important;
  border-color: rgba(180, 35, 24, 0.28) !important;
}

/* ── Date inputs wrapper alignment ────────────────────────────────── */
.form-group:has(.dpicker),
.form-group:has(.dpicker-nohour),
div[id^="div_id_fecha"] {
  position: relative;
}

/* ── Bootstrap 3-style responsive grid (crispy forms row/col-* classes) ──
   Breakpoints follow Tailwind's own scale (sm/md/lg), so the grid reflows
   at the same widths as the sidebar collapse (lg = 1024px, see
   metronic/css/styles.css ".demo1 .kt-sidebar" / sidebar_metronic.html
   "hidden lg:flex"):
     xs: 0px+     (unconditional — Bootstrap 3 has no media query for xs)
     sm: >=640px
     md: >=768px
     lg: >=1024px
   True Bootstrap-3 mobile-first cascade: a lone .col-md-6 (no xs/sm class
   present) is 100% wide below 768px, 50% at >=768px. Rules are declared
   smallest-tier-first so a larger, later-declared breakpoint always wins
   the cascade when multiple size classes are combined on one element
   (equal specificity + source order, same mechanism real Bootstrap uses). */
.row {
  display: flex !important;
  flex-wrap: wrap;
  margin-right: -12px;
  margin-left: -12px;
}
.row > [class*="col-"] {
  padding-right: 12px;
  padding-left: 12px;
  box-sizing: border-box;
  /* Sin esto el min-content (p.ej. toolbar CKEditor) empuja el ancho de la página. */
  min-width: 0;
}

/* Mobile-first floor: a sm/md/lg-only element (no matching xs class) must
   still be full-width below its own breakpoint. .row is flex, so an
   element with no width rule shrinks to content instead of stacking —
   this floor prevents that. (Not needed for col-xs-* itself: its rules
   below are already unconditional.) */
.col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6,
.col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12,
.col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6,
.col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12,
.col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6,
.col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {
  flex: 0 0 100%;
  max-width: 100%;
}

/* ── xs (default, unconditional) ─────────────────────────────────── */
.col-xs-1  { flex: 0 0 8.3333%;  max-width: 8.3333%; }
.col-xs-2  { flex: 0 0 16.6667%; max-width: 16.6667%; }
.col-xs-3  { flex: 0 0 25%;      max-width: 25%; }
.col-xs-4  { flex: 0 0 33.3333%; max-width: 33.3333%; }
.col-xs-5  { flex: 0 0 41.6667%; max-width: 41.6667%; }
.col-xs-6  { flex: 0 0 50%;      max-width: 50%; }
.col-xs-7  { flex: 0 0 58.3333%; max-width: 58.3333%; }
.col-xs-8  { flex: 0 0 66.6667%; max-width: 66.6667%; }
.col-xs-9  { flex: 0 0 75%;      max-width: 75%; }
.col-xs-10 { flex: 0 0 83.3333%; max-width: 83.3333%; }
.col-xs-11 { flex: 0 0 91.6667%; max-width: 91.6667%; }
.col-xs-12 { flex: 0 0 100%;     max-width: 100%; }
.col-xs-offset-0  { margin-left: 0; }
.col-xs-offset-1  { margin-left: 8.3333%; }
.col-xs-offset-2  { margin-left: 16.6667%; }
.col-xs-offset-3  { margin-left: 25%; }
.col-xs-offset-4  { margin-left: 33.3333%; }
.col-xs-offset-5  { margin-left: 41.6667%; }
.col-xs-offset-6  { margin-left: 50%; }
.col-xs-offset-7  { margin-left: 58.3333%; }
.col-xs-offset-8  { margin-left: 66.6667%; }
.col-xs-offset-9  { margin-left: 75%; }
.col-xs-offset-10 { margin-left: 83.3333%; }
.col-xs-offset-11 { margin-left: 91.6667%; }

/* ── sm >=640px ───────────────────────────────────────────────────── */
@media (min-width: 640px) {
  .col-sm-1  { flex: 0 0 8.3333%;  max-width: 8.3333%; }
  .col-sm-2  { flex: 0 0 16.6667%; max-width: 16.6667%; }
  .col-sm-3  { flex: 0 0 25%;      max-width: 25%; }
  .col-sm-4  { flex: 0 0 33.3333%; max-width: 33.3333%; }
  .col-sm-5  { flex: 0 0 41.6667%; max-width: 41.6667%; }
  .col-sm-6  { flex: 0 0 50%;      max-width: 50%; }
  .col-sm-7  { flex: 0 0 58.3333%; max-width: 58.3333%; }
  .col-sm-8  { flex: 0 0 66.6667%; max-width: 66.6667%; }
  .col-sm-9  { flex: 0 0 75%;      max-width: 75%; }
  .col-sm-10 { flex: 0 0 83.3333%; max-width: 83.3333%; }
  .col-sm-11 { flex: 0 0 91.6667%; max-width: 91.6667%; }
  .col-sm-12 { flex: 0 0 100%;     max-width: 100%; }
  .col-sm-offset-0  { margin-left: 0; }
  .col-sm-offset-1  { margin-left: 8.3333%; }
  .col-sm-offset-2  { margin-left: 16.6667%; }
  .col-sm-offset-3  { margin-left: 25%; }
  .col-sm-offset-4  { margin-left: 33.3333%; }
  .col-sm-offset-5  { margin-left: 41.6667%; }
  .col-sm-offset-6  { margin-left: 50%; }
  .col-sm-offset-7  { margin-left: 58.3333%; }
  .col-sm-offset-8  { margin-left: 66.6667%; }
  .col-sm-offset-9  { margin-left: 75%; }
  .col-sm-offset-10 { margin-left: 83.3333%; }
  .col-sm-offset-11 { margin-left: 91.6667%; }
}

/* ── md >=768px ───────────────────────────────────────────────────── */
@media (min-width: 768px) {
  .col-md-1  { flex: 0 0 8.3333%;  max-width: 8.3333%; }
  .col-md-2  { flex: 0 0 16.6667%; max-width: 16.6667%; }
  .col-md-3  { flex: 0 0 25%;      max-width: 25%; }
  .col-md-4  { flex: 0 0 33.3333%; max-width: 33.3333%; }
  .col-md-5  { flex: 0 0 41.6667%; max-width: 41.6667%; }
  .col-md-6  { flex: 0 0 50%;      max-width: 50%; }
  .col-md-7  { flex: 0 0 58.3333%; max-width: 58.3333%; }
  .col-md-8  { flex: 0 0 66.6667%; max-width: 66.6667%; }
  .col-md-9  { flex: 0 0 75%;      max-width: 75%; }
  .col-md-10 { flex: 0 0 83.3333%; max-width: 83.3333%; }
  .col-md-11 { flex: 0 0 91.6667%; max-width: 91.6667%; }
  .col-md-12 { flex: 0 0 100%;     max-width: 100%; }
  .col-md-offset-0  { margin-left: 0; }
  .col-md-offset-1  { margin-left: 8.3333%; }
  .col-md-offset-2  { margin-left: 16.6667%; }
  .col-md-offset-3  { margin-left: 25%; }
  .col-md-offset-4  { margin-left: 33.3333%; }
  .col-md-offset-5  { margin-left: 41.6667%; }
  .col-md-offset-6  { margin-left: 50%; }
  .col-md-offset-7  { margin-left: 58.3333%; }
  .col-md-offset-8  { margin-left: 66.6667%; }
  .col-md-offset-9  { margin-left: 75%; }
  .col-md-offset-10 { margin-left: 83.3333%; }
  .col-md-offset-11 { margin-left: 91.6667%; }
}

/* ── lg >=1024px (was 991px; realigned to Tailwind's lg breakpoint so
       the grid reflows in step with the sidebar collapse) ──────────── */
@media (min-width: 1024px) {
  .col-lg-1  { flex: 0 0 8.3333%;  max-width: 8.3333%; }
  .col-lg-2  { flex: 0 0 16.6667%; max-width: 16.6667%; }
  .col-lg-3  { flex: 0 0 25%;      max-width: 25%; }
  .col-lg-4  { flex: 0 0 33.3333%; max-width: 33.3333%; }
  .col-lg-5  { flex: 0 0 41.6667%; max-width: 41.6667%; }
  .col-lg-6  { flex: 0 0 50%;      max-width: 50%; }
  .col-lg-7  { flex: 0 0 58.3333%; max-width: 58.3333%; }
  .col-lg-8  { flex: 0 0 66.6667%; max-width: 66.6667%; }
  .col-lg-9  { flex: 0 0 75%;      max-width: 75%; }
  .col-lg-10 { flex: 0 0 83.3333%; max-width: 83.3333%; }
  .col-lg-11 { flex: 0 0 91.6667%; max-width: 91.6667%; }
  .col-lg-12 { flex: 0 0 100%;     max-width: 100%; }
  .col-lg-offset-0  { margin-left: 0; }
  .col-lg-offset-1  { margin-left: 8.3333%; }
  .col-lg-offset-2  { margin-left: 16.6667%; }
  .col-lg-offset-3  { margin-left: 25%; }
  .col-lg-offset-4  { margin-left: 33.3333%; }
  .col-lg-offset-5  { margin-left: 41.6667%; }
  .col-lg-offset-6  { margin-left: 50%; }
  .col-lg-offset-7  { margin-left: 58.3333%; }
  .col-lg-offset-8  { margin-left: 66.6667%; }
  .col-lg-offset-9  { margin-left: 75%; }
  .col-lg-offset-10 { margin-left: 83.3333%; }
  .col-lg-offset-11 { margin-left: 91.6667%; }
}

/* #content must not carry its own inline-start offset — the sidebar
   gutter is already applied one level up, on .kt-wrapper, by Metronic's own
   .demo1.sidebar-fixed rule (styles.css). A second offset here would
   compound and break the layout. */
#content {
  margin-inline-start: 0 !important;
}

/* ── Metronic-style form inputs (full border, rounded) ────────── */
/* Pack crispy Tailwind usa kt-input; form-control queda como puente
   para widgets/formsets y HTML embebido en Layouts.
   ds-widget-select: crispy quita kt-input de <select> (KTSelect); si el
   wrap JS falla o aún no corrió, el nativo debe verse igual al input. */
input.form-control,
select.form-control,
textarea.form-control,
input.kt-input,
select.kt-input,
textarea.kt-input,
select.ds-widget-select {
  background-color: var(--ds-surface-lowest) !important;
  border: 1.5px solid var(--ds-outline-variant) !important;
  border-color: var(--ds-outline-variant) !important;
  border-radius: var(--ds-r-md) !important;
  padding: 0.5rem 0.75rem !important;
  font-size: 0.875rem !important;
  color: var(--ds-on-surface) !important;
  transition: border-color 0.15s, box-shadow 0.15s !important;
  box-shadow: none !important;
}
/* La altura fija aplica a input y select, nunca a textarea. */
input.form-control,
select.form-control,
input.kt-input:not(textarea),
select.kt-input,
select.ds-widget-select {
  height: var(--ds-input-h) !important;
}
/* Select nativo: sin flecha del SO; chevron CSS alineado a KTSelect. */
select.form-control,
select.kt-input,
select.ds-widget-select {
  appearance: none !important;
  -webkit-appearance: none !important;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='none' stroke='%238C8F8F' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3E%3C/svg%3E") !important;
  background-repeat: no-repeat !important;
  background-position: right 0.75rem center !important;
  background-size: 14px 11px !important;
  padding-inline-end: 2rem !important;
}
.dark select.form-control,
.dark select.kt-input,
.dark select.ds-widget-select {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='none' stroke='%23a8abad' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3E%3C/svg%3E") !important;
}
input.form-control:focus,
select.form-control:focus,
textarea.form-control:focus,
input.kt-input:focus,
select.kt-input:focus,
textarea.kt-input:focus,
select.ds-widget-select:focus,
input.form-control:focus-visible,
select.form-control:focus-visible,
textarea.form-control:focus-visible,
input.kt-input:focus-visible,
select.kt-input:focus-visible,
textarea.kt-input:focus-visible,
select.ds-widget-select:focus-visible {
  /* Un solo acento: borde primary. Sin ring Metronic (evita “doble marco”). */
  border-color: var(--ds-primary) !important;
  box-shadow: none !important;
  outline: none !important;
}
/* Variante "stacked" de Metronic: <div class="kt-input"><i></i><input></div>.
   El contenedor toma el aspecto del campo y el <input> interno queda
   transparente; sin esto la regla global de inputs (sección 9) lo pinta como
   una caja blanca dentro del campo. Los :not() superan su especificidad. */
.kt-input:not(input):not(select):not(textarea) {
  height: var(--ds-input-h);
  font-size: 0.875rem;
  background-color: var(--ds-surface-lowest) !important;
  border: 1.5px solid var(--ds-outline-variant) !important;
  border-radius: var(--ds-r-md) !important;
  box-shadow: none !important;
}
.kt-input:not(input):not(select):not(textarea):focus-within {
  border-color: var(--ds-primary) !important;
  box-shadow: none !important;
}
.kt-input:not(input):not(select):not(textarea) input:not([type="checkbox"]):not([type="radio"]):not([type="file"]):not([type="range"]) {
  background-color: transparent !important;
}
.form-group {
  margin-bottom: 15px;
}
.form-group label {
  display: block;
  font-size: 0.75rem;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  color: var(--ds-on-surface-variant);
  margin-bottom: 0.35rem;
}
/* El input/select/textarea y su mensaje de error (.help-block) deben
   apilarse siempre en columna, nunca lado a lado. */
.form-group .controls {
  display: flex;
  flex-direction: column;
  align-items: stretch;
}

/* ── Estados de error (crispy: .has-error + .help-block / .ds-field-error) ── */
.has-error .form-control,
.has-error .kt-input,
.has-error [data-kt-select-display].kt-select {
  border-color: #dc2626 !important;
}
.has-error .form-group label,
.has-error label {
  color: #b91c1c;
}
.help-block {
  display: block;
  color: var(--ds-on-surface-faint);
  font-size: 0.8125rem;
  font-weight: 400;
  margin-top: 0.25rem;
}
.has-error .help-block {
  color: #b91c1c;
}

.asteriskField {
  color: var(--destructive, #dc2626);
  margin-left: 0.15rem;
  font-weight: 700;
}

/* Mensaje de error de un campo, debajo de su input.
   Reemplaza al `text-danger text-xs` que traían las plantillas de formset:
   `text-danger` es un nombre de Bootstrap 3 y no existe en el build de
   Metronic (el tema usa --destructive, no un color "danger"), asi que esos
   mensajes se venían pintando con el gris del body. El color sale del token
   de Metronic para no abrir un rojo paralelo al del sistema. */
.ds-field-error {
  display: block;
  margin-top: 0.3rem;
  font-size: 0.75rem;
  line-height: 1.35;
  color: var(--destructive);
}

/* Checkboxes/radios alineados a la paleta de marca */
input[type="checkbox"],
input[type="radio"] {
  accent-color: var(--ds-primary);
}

/* ── Widget de teléfonos ─────────────────────────────────────── */
.ds-tel-list {
  list-style: none;
  margin: 0 0 1rem;
  padding: 0;
  display: flex;
  flex-wrap: wrap;
  gap: 0.5rem;
}
.ds-tel-empty {
  list-style: none;
  margin: 0 0 1rem;
  color: var(--ds-on-surface-variant);
  font-size: 0.875rem;
}
.ds-tel-chip {
  display: inline-flex;
  align-items: center;
  gap: 0.6rem;
  max-width: 100%;
  padding: 0.35rem 0.55rem 0.35rem 0.6rem;
  background: var(--ds-surface-low);
  border-radius: 999px;
}
.ds-tel-chip-tipo {
  flex: 0 0 auto;
  font-size: 0.7rem;
  font-weight: 700;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  color: #5f7d95;
  background: #e7eef4;
  padding: 0.15rem 0.55rem;
  border-radius: 999px;
}
.ds-tel-chip-num {
  min-width: 0;
  font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
  font-weight: 700;
  letter-spacing: 0.08em;
  color: var(--ds-on-surface);
  overflow-wrap: anywhere;
}
.ds-tel-chip-remove {
  border: none;
  background: transparent;
  cursor: pointer;
  color: var(--ds-on-surface-variant);
  font-size: 1.05rem;
  line-height: 1;
  padding: 0 0.15rem;
}
.ds-tel-chip-remove:hover {
  color: var(--ds-primary);
}
.ds-tel-input-row {
  display: flex;
  flex-wrap: wrap;
  gap: 0.75rem;
  align-items: stretch;
  padding-top: 1.25rem;
  border-top: 1px solid var(--ds-outline-variant);
}
.ds-tel-input-row .ds-tel-tipo {
  flex: 0 0 190px;
  max-width: 190px;
}
/* El select puede ser nativo o quedar envuelto por KTSelect: en cualquier
   caso debe llenar el contenedor de ancho fijo, no expandirse a toda la fila. */
.ds-tel-input-row .ds-tel-tipo > select,
.ds-tel-input-row .ds-tel-tipo [data-kt-select-wrapper] {
  width: 100% !important;
}
.ds-tel-input-row .ds-tel-numero {
  flex: 0 1 320px;
  max-width: 320px;
  min-width: 0;
}
.ds-tel-add {
  flex: 0 0 auto;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border: none;
  border-radius: var(--ds-r-md);
  background: var(--ds-primary);
  color: #fff;
  font-weight: 600;
  font-size: 0.875rem;
  padding: 0 1.35rem;
  cursor: pointer;
  transition: background 0.15s;
}
.ds-tel-add:hover {
  background: var(--ds-primary-dark);
}

/* Responsive: en pantallas chicas apilamos los controles */
@media (max-width: 575px) {
  .ds-tel-list {
    flex-direction: column;
    align-items: stretch;
  }
  .ds-tel-chip {
    width: 100%;
    justify-content: flex-start;
    border-radius: var(--ds-r-md);
  }
  .ds-tel-chip .ds-tel-chip-remove {
    margin-left: auto;
  }
  .ds-tel-input-row {
    flex-direction: column;
    align-items: stretch;
  }
  .ds-tel-input-row .ds-tel-tipo {
    flex: 1 1 auto;
    max-width: none;
  }
  .ds-tel-input-row .ds-tel-numero {
    flex: 1 1 auto;
    max-width: none;
  }
  .ds-tel-add {
    width: 100%;
    padding: 0.55rem 1rem;
  }
}

/* ── Image Input (KTUI / Metronic, reemplazo Dropify) ─────────── */
.ds-image-input-avatar.kt-image-input {
  width: 7.5rem;
  height: 7.5rem;
}

.ds-image-input-zone.kt-image-input {
  display: flex;
  width: 100%;
  max-width: 340px;
  height: 200px;
  border-radius: var(--ds-r-lg);
}

.ds-image-input-zone .kt-image-input-placeholder,
.ds-image-input-zone .kt-image-input-preview {
  border-radius: var(--ds-r-lg);
  background-color: var(--ds-surface-low);
  background-size: contain;
  background-position: center;
  /* Tablero para ver transparencias PNG/SVG */
  background-image:
    linear-gradient(45deg, #eee 25%, transparent 25%),
    linear-gradient(-45deg, #eee 25%, transparent 25%),
    linear-gradient(45deg, transparent 75%, #eee 75%),
    linear-gradient(-45deg, transparent 75%, #eee 75%);
  background-size: 16px 16px, 16px 16px, 16px 16px, 16px 16px, contain;
  background-position: 0 0, 0 8px, 8px -8px, -8px 0, center;
}

.ds-image-input-zone .kt-image-input-preview {
  background-color: transparent;
  background-image: none;
  background-size: contain;
  background-repeat: no-repeat;
  background-position: center;
}

.ds-image-input-zone .kt-image-input-placeholder {
  border: 1.5px dashed var(--ds-outline-variant);
  transition: border-color 0.15s, background-color 0.15s;
}

.ds-image-input-zone:hover .kt-image-input-placeholder {
  border-color: var(--ds-primary);
}

.ds-image-input-hint {
  position: absolute;
  inset: 0;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 0.35rem;
  padding: 0.75rem;
  text-align: center;
  pointer-events: none;
  color: var(--ds-on-surface-variant);
  font-size: 0.85rem;
  line-height: 1.3;
  background: rgb(var(--ds-surface-lowest-rgb, 255 255 255) / 0.55);
}

.ds-image-input-hint i {
  font-size: 1.35rem;
  color: var(--ds-primary);
}

/* Con preview cargado, el hint no debe tapar la imagen. */
[data-kt-image-input-initialized]:not(.empty) .ds-image-input-hint {
  display: none;
}

.ds-image-input-avatar .ds-image-input-hint {
  font-size: 0.7rem;
  background: rgb(0 0 0 / 0.35);
  color: #fff;
  border-radius: inherit;
}

.ds-image-input-avatar .ds-image-input-hint i {
  color: #fff;
  font-size: 1.1rem;
}

.ds-image-input-avatar[data-kt-image-input-initialized]:not(.empty) .ds-image-input-hint {
  display: none;
}

/* File input genérico (p.ej. importar Excel) */
.ds-file-input-zone {
  position: relative;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 100%;
  max-width: 420px;
  min-height: 120px;
  padding: 1.25rem;
  cursor: pointer;
  border: 1.5px dashed var(--ds-outline-variant);
  border-radius: var(--ds-r-lg);
  background: var(--ds-surface-low);
  transition: border-color 0.15s, background-color 0.15s;
}
.ds-file-input-zone:hover {
  border-color: var(--ds-primary);
}
.ds-file-input-zone input[type='file'] {
  position: absolute;
  inset: 0;
  opacity: 0;
  cursor: pointer;
}
.ds-file-input-label {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 0.4rem;
  text-align: center;
  color: var(--ds-on-surface-variant);
  font-size: 0.85rem;
  pointer-events: none;
}
.ds-file-input-label i {
  font-size: 1.5rem;
  color: var(--ds-primary);
}
.ds-file-input-name {
  font-weight: 600;
  color: var(--ds-on-surface);
  word-break: break-all;
}

/* ── CKEditor (membrete / RichTextField) ───────────────────────────
   django-ckeditor envuelve el editor en .django-ckeditor-widget con
   display:inline-block; sin width:100% el toolbar fuerza el min-content
   y genera scroll horizontal (p.ej. en Mi empresa → Impresión). */
.django-ckeditor-widget {
  display: block !important;
  width: 100% !important;
  max-width: 100%;
}

.django-ckeditor-widget .cke {
  max-width: 100%;
}

.cke_chrome {
  max-width: 100%;
  box-sizing: border-box;
}

.cke_inner,
.cke_top,
.cke_contents {
  max-width: 100%;
  box-sizing: border-box;
}


[data-kt-select-wrapper] { width: 100%; }

/*
  KTSelect (_createHtmlStructure) copia al wrapper todas las clases del
  <select> excepto kt-select/kt-select-sm/kt-select-lg. Si el select traía
  kt-input o form-control (crispy / apply_kt / forms.py), el wrapper hereda
  borde+padding+altura y el display .kt-select dibuja OTRO marco adentro.
  Neutralizamos el look de “input” en el wrapper; el display lleva el estilo.
*/
[data-kt-select-wrapper].kt-input,
[data-kt-select-wrapper].form-control,
[data-kt-select-wrapper].input,
[data-kt-select-wrapper].ds-widget-select,
.kt-select-wrapper.kt-input,
.kt-select-wrapper.form-control {
  border: none !important;
  background: transparent !important;
  background-image: none !important;
  box-shadow: none !important;
  padding: 0 !important;
  height: auto !important;
  min-height: 0 !important;
  border-radius: 0 !important;
}

/* Native <select> que KTSelect oculta con .hidden — forzar por si Tailwind
   .hidden queda debajo de reglas más específicas (select.kt-input { height }). */
select.hidden,
select.form-control.hidden,
select.kt-input.hidden,
select.ds-widget-select.hidden {
  display: none !important;
  height: 0 !important;
  min-height: 0 !important;
  margin: 0 !important;
  padding: 0 !important;
  border: 0 !important;
  box-shadow: none !important;
  background-image: none !important;
}

[data-kt-select-display].kt-select {
  height: var(--ds-input-h);
  min-height: var(--ds-input-h);
  border: 1.5px solid var(--ds-outline-variant) !important;
  border-radius: var(--ds-r-md);
  /* background-color (no shorthand): conserva el chevron de Metronic. */
  background-color: var(--ds-surface-lowest) !important;
  color: var(--ds-on-surface) !important;
  padding: 0 2rem 0 0.75rem;
  font-size: 0.875rem;
  box-shadow: none !important;
  /* Chevron Metronic: posición explícita a la derecha */
  background-repeat: no-repeat !important;
  background-position: right 0.75rem center !important;
  background-size: 14px 11px !important;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='none' stroke='%238C8F8F' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3E%3C/svg%3E") !important;
}

.dark [data-kt-select-display].kt-select {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='none' stroke='%23a8abad' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3E%3C/svg%3E") !important;
}

[data-kt-select-display].kt-select:focus-visible,
[data-kt-select-display].kt-select.active {
  outline: none !important;
  border-color: var(--ds-primary) !important;
  box-shadow: none !important;
}

[data-kt-select-display] .kt-select-placeholder {
  color: var(--ds-on-surface-variant);
}

.kt-select-dropdown {
  border: 1.5px solid var(--ds-outline-variant) !important;
  border-radius: var(--ds-r-md);
  box-shadow: var(--ds-shadow-float);
  font-size: 0.875rem;
  background-color: var(--ds-surface-lowest) !important;
  color: var(--ds-on-surface) !important;
}

.kt-select-dropdown .kt-select-options,
ul.kt-select-options {
  max-height: 15rem; /* ~7 opciones */
  overflow-y: auto;
  overscroll-behavior: contain;
}

.kt-select-option:hover,
.kt-select-option[data-kt-select-option]:focus,
.kt-select-option.focused,
.kt-select-option.selected {
  background-color: var(--ds-primary-container, #fde8dc);
  color: var(--ds-primary);
}

.kt-select-search .kt-input,
input.kt-select-search {
  border: 1.5px solid var(--ds-outline-variant);
  border-radius: var(--ds-r-sm);
  padding: 4px 8px;
  font-size: 0.875rem;
}

.kt-select-search .kt-input:focus,
input.kt-select-search:focus {
  outline: none;
  border-color: var(--ds-primary);
}

/* ── Fix: contención del scroll horizontal de tablas (mobile/tablet) ──── */
/* La cadena flex del shell (.kt-wrapper → #content → .grow) usaba min-width:auto
   y se expandía hasta el ancho de la tabla (min-width:600px o tablas de 10+
   columnas), empujando el ancho de toda la página. Con min-width:0 la cadena
   puede encoger por debajo del contenido y el scroll horizontal queda contenido
   dentro de .table-responsive en vez de desbordar la página. */
.kt-wrapper,
#content,
#content > .grow,
.kt-card,
.kt-card-content {
  min-width: 0;
}

.table-responsive {
  overflow-x: auto;
  max-width: 100%;
  -webkit-overflow-scrolling: touch;
}

/* ── Compatibilidad Bootstrap para HTML generado desde Python ──────────
   forms.py, views.py y helpers.py arman HTML a mano, y el @source de Tailwind
   (frontend/css/styles.css) sólo escanea plantillas, pymes_design.css y
   pymes_metronic.js: ningún .py. Las utilidades usadas ahí nunca llegan al
   build, así que estas tres clases de la era Bootstrap no tenían definición
   en ninguna hoja y quedaban sin efecto.
   Los componentes kt-btn* sí funcionan desde Python porque son CSS real, no
   utilidades generadas bajo demanda.
   Se pueden borrar cuando ese HTML deje de construirse en Python. */
.pull-right {
  float: right;
}

.input-group {
  display: flex;
  width: 100%;
  align-items: stretch;
}

.input-group > .form-control {
  flex: 1 1 auto;
  min-width: 0;
}

.input-group-btn {
  display: flex;
  align-items: center;
  gap: 4px;
  padding-inline-start: 6px;
}

/* ── Toasts (kt-alert flotante) ────────────────────────────────────────
   Metronic define el color del ícono de cerrar sólo para `> svg`
   (`.kt-alert-close i` se queda en --muted-foreground, un gris que sobre los
   fondos sólidos verde/rojo/amarillo de las variantes casi no se lee).
   Acá los íconos son <i> de KeenIcons, así que hay que heredar el color. */
.kt-alert .kt-alert-close i {
  color: inherit;
  opacity: 0.75;
  transition: opacity 0.15s ease;
}

.kt-alert .kt-alert-close:hover i,
.kt-alert .kt-alert-close:focus i {
  color: inherit;
  opacity: 1;
}

/* Mismo caso para el ícono principal del alert: Metronic lo colorea sólo con
   `.kt-alert-icon > svg`. En las variantes sólidas alcanza con heredar; en la
   variante `light` el texto va en --foreground y el ícono tiene que llevar el
   color de la variante. */
.kt-alert .kt-alert-icon > i {
  color: inherit;
}

.kt-alert-light .kt-alert-icon > i {
  color: var(--muted-foreground);
}

.kt-alert-light.kt-alert-destructive .kt-alert-icon > i {
  color: var(--destructive);
}

.kt-alert-light.kt-alert-success .kt-alert-icon > i {
  color: var(--color-green-500);
}

.kt-alert-light.kt-alert-warning .kt-alert-icon > i {
  color: var(--color-yellow-500);
}

.kt-alert-light.kt-alert-info .kt-alert-icon > i {
  color: var(--color-violet-600);
}

.kt-alert-light.kt-alert-primary .kt-alert-icon > i {
  color: var(--primary);
}

.ds-flash-alert {
  box-shadow: var(--ds-shadow-float);
}

/* ── Avisos de la campana del header ───────────────────────────────────
   Cada aviso es un enlace (o un botón, cuando en vez de navegar abre el
   chat de Ayuda Online); ambos comparten la misma caja para que el
   dropdown se lea como una sola lista. Ver get_avisos en
   empresa/templatetags/avisos_tags.py. ────────────────────────────────── */
.ds-aviso-item {
  display: flex;
  align-items: flex-start;
  gap: 0.5rem;
  width: 100%;
  padding: 0.45rem 0.5rem;
  margin: 0 -0.5rem;
  border: 0;
  border-radius: var(--ds-r-sm, 0.375rem);
  background: transparent;
  color: var(--ds-on-surface);
  font-size: 0.8125rem;
  line-height: 1.35;
  text-align: start;
  cursor: pointer;
}

.ds-aviso-item + .ds-aviso-item {
  margin-top: 0.15rem;
}

.ds-aviso-item:hover,
.ds-aviso-item:focus {
  background: var(--ds-surface);
  color: var(--ds-on-surface);
}

.ds-aviso-item > i {
  margin-top: 0.1rem;
  flex-shrink: 0;
}

/* ── Avatar con inicial ────────────────────────────────────────────────
   Usado en el header (toggle del menú de usuario y ficha del dropdown).
   Antes vivía como estilos inline duplicados en header_metronic.html, con
   los dos usos desincronizados. No combinar con .kt-btn-icon: ese componente
   mide 8.5 × --spacing = 34px y recortaba el círculo de 36px. ─────────── */
.ds-avatar {
  width: 36px;
  height: 36px;
  flex-shrink: 0;
  border-radius: 50%;
  background: var(--ds-primary);
  color: var(--ds-on-primary);
  display: flex;
  align-items: center;
  justify-content: center;
  font-family: 'Work Sans', sans-serif;
  font-weight: 700;
  font-size: 0.9rem;
  line-height: 1;
  text-transform: uppercase;
  user-select: none;
}

/* Como toggle del dropdown: cursor y realce al pasar por encima, sin el
   borde ni el fondo que traería .kt-btn. */
.kt-menu-toggle > .ds-avatar {
  cursor: pointer;
  transition: box-shadow 0.15s ease, filter 0.15s ease;
}
.kt-menu-toggle:hover > .ds-avatar {
  filter: brightness(1.06);
  box-shadow: 0 0 0 3px rgb(var(--ds-primary-rgb) / 0.18);
}

/* ── flatpickr — calendario alineado al design system ──────────────────
   flatpickr trae su tema azul por defecto (#569ff7) y tipografía propia, lo
   que hacía que el input se viera COPER pero el calendario que abre pareciera
   de otra aplicación. Estas reglas ganan por orden de carga: pymes_design.css
   es el último <link> del head (ver layout_metronic.html), así que no hace
   falta !important salvo donde flatpickr lo usa.
   Los inputs de fecha se inicializan en pymes_metronic.js (.dpicker /
   .dpicker-nohour). ─────────────────────────────────────────────────── */

.flatpickr-calendar {
  background: var(--ds-surface-lowest);
  border: 1px solid var(--ds-outline-variant);
  border-radius: var(--ds-r-lg);
  box-shadow: var(--ds-shadow-float);
  font-family: 'Inter', sans-serif;
  font-size: 0.8125rem;
  color: var(--ds-on-surface);
  width: auto;
  padding: 0.25rem;
}

/* Punta del popover */
.flatpickr-calendar.arrowTop:before,
.flatpickr-calendar.arrowTop:after {
  border-bottom-color: var(--ds-surface-lowest);
}
.flatpickr-calendar.arrowBottom:before,
.flatpickr-calendar.arrowBottom:after {
  border-top-color: var(--ds-surface-lowest);
}

/* Cabecera: mes, año y flechas */
.flatpickr-months {
  padding-top: 0.375rem;
}
.flatpickr-months .flatpickr-month,
.flatpickr-current-month .flatpickr-monthDropdown-months,
.flatpickr-current-month input.cur-year {
  background: transparent;
  color: var(--ds-on-surface);
  font-weight: 600;
}
.flatpickr-current-month {
  font-size: 0.875rem;
  padding-top: 0.375rem;
}
.flatpickr-current-month .flatpickr-monthDropdown-months:hover {
  background: var(--ds-surface-low);
  border-radius: var(--ds-r-sm);
}
.flatpickr-current-month .flatpickr-monthDropdown-months .flatpickr-monthDropdown-month {
  background: var(--ds-surface-lowest);
  color: var(--ds-on-surface);
}
.flatpickr-months .flatpickr-prev-month,
.flatpickr-months .flatpickr-next-month {
  padding: 0.5rem;
  border-radius: var(--ds-r-sm);
  fill: var(--ds-on-surface-variant);
}
.flatpickr-months .flatpickr-prev-month:hover,
.flatpickr-months .flatpickr-next-month:hover {
  background: var(--ds-surface-low);
}
.flatpickr-months .flatpickr-prev-month:hover svg,
.flatpickr-months .flatpickr-next-month:hover svg {
  fill: var(--ds-primary);
}

/* Encabezado de días de la semana — micro-caps, igual que los labels */
span.flatpickr-weekday {
  color: var(--ds-on-surface-faint);
  font-size: 0.6875rem;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  background: transparent;
}

/* Días */
.flatpickr-calendar .flatpickr-day {
  border-radius: var(--ds-r-sm);
  color: var(--ds-on-surface);
  font-weight: 500;
  border-color: transparent;
}
.flatpickr-calendar .flatpickr-day:hover,
.flatpickr-calendar .flatpickr-day:focus {
  background: var(--ds-surface-low);
  border-color: transparent;
  color: var(--ds-on-surface);
}
.flatpickr-calendar .flatpickr-day.today {
  border-color: var(--ds-primary);
  color: var(--ds-primary);
  font-weight: 600;
}
.flatpickr-calendar .flatpickr-day.today:hover {
  background: var(--ds-primary-container);
  color: var(--ds-primary-dark);
}
.flatpickr-calendar .flatpickr-day.selected,
.flatpickr-calendar .flatpickr-day.selected:hover,
.flatpickr-calendar .flatpickr-day.startRange,
.flatpickr-calendar .flatpickr-day.endRange {
  background: var(--ds-primary);
  border-color: var(--ds-primary);
  color: var(--ds-on-primary);
  font-weight: 600;
}
.flatpickr-calendar .flatpickr-day.inRange {
  background: var(--ds-primary-container);
  border-color: var(--ds-primary-container);
  color: var(--ds-primary-dark);
  box-shadow: -5px 0 0 var(--ds-primary-container), 5px 0 0 var(--ds-primary-container);
}
.flatpickr-calendar .flatpickr-day.prevMonthDay,
.flatpickr-calendar .flatpickr-day.nextMonthDay {
  color: var(--ds-on-surface-faint);
}
.flatpickr-calendar .flatpickr-day.flatpickr-disabled,
.flatpickr-calendar .flatpickr-day.flatpickr-disabled:hover {
  color: var(--ds-on-surface-faint);
  background: transparent;
  opacity: 0.45;
}

/* Selector de hora (los .dpicker sin -nohour habilitan enableTime) */
.flatpickr-calendar .flatpickr-time {
  border-top: 1px solid var(--ds-outline-variant);
}
.flatpickr-calendar .flatpickr-time input,
.flatpickr-calendar .flatpickr-time .flatpickr-time-separator,
.flatpickr-calendar .flatpickr-time .flatpickr-am-pm {
  color: var(--ds-on-surface);
  font-family: 'Inter', sans-serif;
  font-weight: 600;
}
.flatpickr-calendar .flatpickr-time input:hover,
.flatpickr-calendar .flatpickr-time input:focus,
.flatpickr-calendar .flatpickr-time .flatpickr-am-pm:hover {
  background: var(--ds-surface-low);
}
.flatpickr-calendar .numInputWrapper span.arrowUp:after {
  border-bottom-color: var(--ds-on-surface-variant);
}
.flatpickr-calendar .numInputWrapper span.arrowDown:after {
  border-top-color: var(--ds-on-surface-variant);
}
.flatpickr-calendar .numInputWrapper:hover {
  background: transparent;
}

/* El input de fecha es readonly-por-defecto en flatpickr; mantener el cursor
   coherente con que sí se puede escribir (allowInput: true en la init). */
input.form-control.dpicker,
input.form-control.dpicker-nohour {
  cursor: text;
}
input.form-control.dpicker.disabled,
input.form-control.dpicker-nohour.disabled {
  cursor: not-allowed;
  background-color: var(--ds-surface-low) !important;
}

/* ── 25. Pill de estado ───────────────────────────────────────────── */
/* Señal de vigencia para cabeceras de documento: punto + etiqueta compacta.
   Genérico a propósito; los tonos siguen la paleta de badges. */
.ds-status-pill {
  display: inline-flex;
  align-items: center;
  gap: 0.4rem;
  padding: 0.3rem 0.7rem;
  border-radius: 9999px;
  font-family: 'Inter', sans-serif;
  font-size: 0.625rem;
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  white-space: nowrap;
  background-color: var(--ds-surface-high);
  color: var(--ds-on-surface-variant);
}

.ds-status-pill::before {
  content: '';
  width: 0.375rem;
  height: 0.375rem;
  border-radius: 9999px;
  background-color: currentColor;
}

.ds-status-pill-on {
  background-color: var(--ds-primary-container);
  color: #7c3217;
}

.ds-status-pill-on::before {
  background-color: var(--ds-primary);
}

.ds-status-pill-warn {
  background-color: #fef3c7;
  color: #92400e;
}

.ds-status-pill-off {
  background-color: var(--ds-surface-high);
  color: var(--ds-on-surface-variant);
}

/* ── 26. Estado de licencia ───────────────────────────────────────── */
.ds-lic-head {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.875rem;
  padding: 1.125rem 1.5rem;
  background: linear-gradient(180deg, var(--ds-surface-low) 0%, var(--ds-surface-high) 100%);
  border-bottom: 1px solid var(--ds-outline-variant);
}

.ds-lic-plan {
  font-family: 'Plus Jakarta Sans', sans-serif;
  font-size: 1.375rem;
  font-weight: 700;
  letter-spacing: -0.02em;
  color: var(--ds-on-surface);
  margin: 0;
}

.ds-lic-actions {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.625rem;
  margin-inline-start: auto;
}

/* Los CTA son <a>: sin esto la clase .disabled sólo cambiaría el color y el
   enlace seguiría navegando. */
.ds-lic-actions .kt-btn.disabled {
  pointer-events: none;
  background: var(--ds-surface-high) !important;
  color: var(--ds-on-surface-faint) !important;
  border-color: transparent !important;
  box-shadow: none !important;
  transform: none !important;
  cursor: not-allowed;
}

.ds-lic-body {
  padding: 1.5rem;
}

/* Enlace secundario delante de los CTA: misma caja que .kt-btn (alto, tamaño e
   interlineado del texto) para que texto y chevron queden centrados con los
   botones, y un poco más de aire hacia ellos. */
.ds-lic-link {
  display: inline-flex;
  align-items: center;
  align-self: center;
  gap: 0.375rem;
  height: calc(var(--spacing) * 8.5);
  margin-inline-end: 0.625rem;
  font-family: 'Work Sans', sans-serif;
  font-size: 0.8125rem;
  line-height: var(--text-sm--line-height);
  font-weight: 600;
  color: var(--ds-primary);
}

.ds-lic-link .ki-filled {
  font-size: 0.625rem;
  line-height: 1;
}

.ds-lic-link:hover,
.ds-lic-link:focus {
  color: var(--ds-primary-dark);
  text-decoration: underline;
}

.ds-lic-notice {
  margin: 0 1.5rem 1.5rem;
  padding: 0.75rem 1rem;
  border-radius: var(--ds-r-lg);
  background-color: #fef3c7;
  color: #92400e;
  font-size: 0.8125rem;
}

.ds-lic-notice a {
  color: inherit;
  font-weight: 700;
  text-decoration: underline;
}

@media (max-width: 640px) {
  .ds-lic-actions {
    margin-inline-start: 0;
    width: 100%;
  }

  .ds-lic-actions .kt-btn {
    flex: 1 1 auto;
    justify-content: center;
  }
}

/* ── 27. Resumen de importes de licencia ──────────────────────────── */
/* Panel gris con los importes de la operación (crédito, saldo resultante) y,
   dentro suyo, la tarjeta blanca del monto a abonar. Se usa igual en el modal
   de cambiar/renovar plan y en la pantalla de pago. */
.ds-lic-summary {
  background-color: var(--ds-surface);
  border-radius: var(--ds-r-lg);
  padding: 1.25rem;
}

.ds-lic-summary-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
  gap: 1rem 1.5rem;
}

.ds-lic-summary-value {
  font-family: 'Plus Jakarta Sans', sans-serif;
  font-size: 1.125rem;
  font-weight: 700;
  letter-spacing: -0.01em;
  color: var(--ds-on-surface);
  margin: 0;
}

.ds-lic-total {
  display: flex;
  align-items: center;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: 0.75rem 1rem;
  margin-top: 1.25rem;
  padding: 1rem 1.25rem;
  background-color: var(--ds-surface-lowest);
  border-radius: var(--ds-r-md);
}

.ds-lic-total .ds-field-label {
  margin-bottom: 0;
}

.ds-lic-total-value {
  font-family: 'Plus Jakarta Sans', sans-serif;
  font-size: 1.5rem;
  font-weight: 700;
  letter-spacing: -0.02em;
  color: var(--ds-primary);
  margin: 0;
  white-space: nowrap;
}

/* ── 28. Modal de plan (cambiar / renovar licencia) ───────────────── */
/* El contenido del panel llega por AJAX (plan/form_plan.html) e incluye su
   propia cabecera, cuerpo y pie, así que el <form> hereda la columna flex del
   panel para que sólo el cuerpo haga scroll. */
.ds-plan-overlay {
  align-items: flex-start;
  padding: 5vh 1rem;
  overflow-y: auto;
}

.ds-plan-modal {
  width: 100%;
  max-width: 620px;
}

.ds-plan-modal > form {
  display: flex;
  flex-direction: column;
  flex: 1 1 auto;
  min-height: 0;
}

.ds-plan-head {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: 1rem;
  padding: 1.75rem 1.75rem 0;
  flex-shrink: 0;
}

.ds-plan-eyebrow {
  margin-bottom: 0.35rem;
}

.ds-plan-title {
  font-family: 'Plus Jakarta Sans', sans-serif;
  font-size: 1.375rem;
  font-weight: 700;
  letter-spacing: -0.02em;
  line-height: 1.25;
  color: var(--ds-on-surface);
  margin: 0;
}

.ds-plan-body {
  display: flex;
  flex-direction: column;
  gap: 1.5rem;
  padding: 1.5rem 1.75rem 1.75rem;
  overflow-y: auto;
  flex: 1 1 auto;
  min-height: 0;
}

.ds-plan-fields {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  align-items: start;
  gap: 1.25rem 1.5rem;
}

/* El campo lo arma crispy; su margen inferior sobra porque acá separa el grid. */
.ds-plan-fields .form-group {
  margin-bottom: 0;
}

/* El label del select tiene que leerse igual que el de "Precio" al lado. */
.ds-plan-fields .form-group label {
  font-family: 'Inter', sans-serif;
  font-size: 0.625rem;
  font-weight: 700;
  letter-spacing: 0.06em;
  color: var(--ds-on-surface-faint);
}

.ds-plan-precio {
  text-align: end;
}

.ds-plan-precio-value {
  font-family: 'Plus Jakarta Sans', sans-serif;
  font-size: 1.375rem;
  font-weight: 700;
  letter-spacing: -0.02em;
  color: var(--ds-on-surface);
  margin: 0;
  white-space: nowrap;
}

.ds-plan-notes {
  display: flex;
  flex-direction: column;
  gap: 0.75rem;
}

.ds-plan-notes .ds-field-label {
  margin-bottom: 0;
}

.ds-plan-note {
  font-family: 'Work Sans', sans-serif;
  font-size: 0.875rem;
  line-height: 1.6;
  color: var(--ds-on-surface-variant);
  margin: 0;
}

/* Las notas se ocultan por JS según el monto: sin esto ganaría el display
   de las reglas de arriba, que se cargan después de la utilidad .hidden. */
.ds-plan-notes.hidden,
.ds-plan-note.hidden {
  display: none;
}

.ds-plan-foot {
  display: flex;
  justify-content: flex-end;
  gap: 0.625rem;
  padding: 1.125rem 1.75rem;
  background-color: var(--ds-surface-low);
  border-top: 1px solid var(--ds-outline-variant);
  flex-shrink: 0;
}

@media (max-width: 640px) {
  .ds-plan-head,
  .ds-plan-body,
  .ds-plan-foot {
    padding-inline: 1.25rem;
  }

  .ds-plan-title {
    font-size: 1.125rem;
  }

  .ds-plan-fields {
    grid-template-columns: minmax(0, 1fr);
  }

  .ds-plan-precio {
    text-align: start;
  }
}
