/* ============================================================================
   project.css - overrides de todo el admin (UNICO archivo global del proyecto)
   Se carga una sola vez desde templates/admin/base.html, DESPUES del tema
   (admin/amplecss/style.css).

   REGLAS PARA TOCAR ESTE ARCHIVO
   1. Antes de escribir CSS, busca una clase del tema/Bootstrap que ya haga el
      trabajo (grep en admin/amplecss/style.css). Aqui va SOLO lo que el tema
      no puede expresar.
   2. Cada regla nueva lleva prefijo .cb-  (nombre propio del proyecto). Nada
      de selectores de elemento sueltos ni clases genericas: este archivo lo
      carga tambien la bandeja (admin/chatbot/inbox.html), que trae su propio
      <style>, y no debe cambiar de aspecto.
      Excepciones justificadas (todas son CSS que ya existia tal cual en un
      <style>/style="" y se movio aqui para no cambiar el aspecto): las
      variables :root, #content, .iti, .ui-autocomplete, las reglas de
      #content-main (formularios, editor de prompt .sps-*), #builder-toolbar
      (editor de flujos), y las clases propias de la pagina de sesion de
      WhatsApp (.whatsapp-instructions, .qr-*, ...).
   3. Una regla = un solo sitio. Si ya existe, reutilizala en vez de copiarla.
   4. Nada de estilos en HTML ni en Python (style="", <style>, cssText).
      Aplica la clase .cb-* en el template/widget.

   INDICE
     1. Variables de color
     2. Estructura de pagina
     3. Barra superior y menu lateral
     4. Login
     5. Listados (changelist)
     6. Formularios add/change (cards, fieldsets, campos de solo lectura)
     7. Widgets (popup FK, fecha/hora, editor de secciones del prompt)
     8. Utilidades .cb-*
     9. Paginas concretas (WhatsApp, Meta)
   ============================================================================ */


/* ---- 1. Variables de color ------------------------------------------------ */
/* El tema lee estas variables. El bloque {% if enterprise %} que las pintaba
   desde base.html estaba muerto en este proyecto (el contexto nunca trae
   "enterprise": ver apps/chatbot/templatetags/cropping.py). */
:root {
  --primary-color: #0090BC;
  --secondary-color: #F2b803;
  --warning-color: #F2b803;
  --sidebar-link: #e8e8e8;
  --purple-color: #7460ee;
}
@media (prefers-color-scheme: dark) {
  :root {
    --sidebar-link: #363636;
  }
}


/* ---- 2. Estructura de pagina ---------------------------------------------- */
/* .page-wrapper del tema arranca en display:none (lo prende su JS de
   preloader); el admin lo necesita visible desde el primer momento. */
#content {
  display: block;
}

/* Telefono con intl-tel-input: que ocupe todo el ancho de su columna. */
.iti {
  width: 100%;
}


/* ---- 3. Barra superior y menu lateral ------------------------------------- */
/* Campana de notificaciones */
.cb-bell-icon {
  font-size: 22px;
}
.cb-bell-badge {
  top: 8px;
  right: 0;
  font-size: 10px;
}
.cb-bell-menu {
  min-width: 320px;
}
.cb-notif-icon {
  font-size: 18px;
}

/* "Iniciaste sesion con: usuario" */
.cb-topbar-user {
  line-height: 1.25;
}

/* Buscador del menu lateral */
.cb-sidebar-search {
  padding-left: 8%;
}

/* Icono de cada app del menu: el ancho depende de cuantas apps hay
   (--dense = 8 o mas) y del tamano de pantalla. Mismo orden de reglas que
   tenia el <style> de app_list.html. */
.cb-app-icon {
  width: 2vw;
}
.cb-app-icon--dense {
  width: 1.4vw;
}
@media (max-width: 767px) {
  .cb-app-icon {
    width: 8vw;
  }
  .cb-app-icon--dense {
    width: 6vw;
  }
}
@media (min-width: 768px) and (max-width: 1023px) {
  .cb-app-icon {
    width: 4vw;
  }
  .cb-app-icon--dense {
    width: 3vw;
  }
}

/* Icono de cada modelo dentro del menu. !important porque el tema fija el
   ancho con reglas de mas especificidad (".sidebar-nav ul .sidebar-item
   .sidebar-link i" = 35px y variantes por #main-wrapper); antes lo ganaba el
   style="" del propio <i>. */
.cb-menu-icon {
  width: 1.2vw !important;
}
.cb-sidebar-subitem {
  padding-left: 20px;
}

/* Nombre de modelo COMPLETO en el menu: si no cabe junto a la pastilla
   "+ Anadir", baja a otra linea en vez de cortarse. min-width:0 deja que el
   enlace (flex) se encoja; la pastilla (.flex-shrink-0) no se aplasta. */
.cb-menu-link {
  min-width: 0;
  white-space: normal;
}

/* Sub-grupo plegable del menu ("Configuracion", apps/chatbot/menu.py). El
   tema coloca la flecha de .has-arrow a 40px del borde (alto de una fila de
   app); en una fila de segundo nivel, mas baja, se centra. */
.cb-sidebar-group.has-arrow::after {
  top: 50%;
}

/* Sangria del menu anidado: los items principales (first-level) quedan pegados
   a la izquierda, con el mismo margen que el icono de su grupo; los de segundo
   nivel (dentro de "Configuracion") se sangran para que se lea la jerarquia.
   Lleva #sidebarnav para ganarle al ".sidebar-link { padding: 10px 15px }" del
   tema. */
#sidebarnav .second-level > .sidebar-item > .sidebar-link {
  padding-left: 1.5rem;
}


/* ---- 4. Login ------------------------------------------------------------- */
/* Campos altos. El ojo propio de Edge/IE se oculta: pintaba uno encima del
   boton del tema (se veian dos). */
.cb-login-form .form-control {
  height: 4em;
}
.cb-login-img {
  width: 70%;
}
.cb-login-card {
  border-radius: 10px;
}
.cb-login-form input[type="password"]::-ms-reveal,
.cb-login-form input[type="password"]::-ms-clear {
  display: none;
}


/* ---- 5. Listados (changelist) --------------------------------------------- */
/* Sin barra de acciones, la primera columna no debe quedar fija a 1.5em. */
#changelist.cb-changelist-plain table thead th:first-child {
  width: inherit;
}
/* Filas compactas de la tabla de resultados (change_list_results.html) */
.cb-compact-rows tr td,
.cb-compact-rows tr th {
  padding-top: 4px !important;
  padding-bottom: 4px !important;
}
/* Ilustracion de listado vacio (change_list.html) */
.cb-empty-img {
  width: 30%;
}
/* Filtro de fecha exacta (exact_date_filter.html) */
.cb-filter-row {
  margin-bottom: 10px;
}
.cb-filter-clear {
  margin-left: 10px;
}


/* ---- 6. Formularios add/change ------------------------------------------- */
/* Rediseno de cards de #content-main (add/change). Ese id solo existe en las
   paginas de alta/edicion, asi que no toca listados ni el panel.
   OJO: el theme real de Select2 para AutocompleteSelect es
   "admin-autocomplete" (static/admin/css/autocomplete.css), NO "default". */

/* Bordes suaves + jerarquia por sombra. SIN overflow:hidden a proposito: el
   desplegable de Select2 de un FK cerca del borde de la card se recortaba. */
#content-main .card {
  border: none;
  border-radius: 14px;
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08), 0 1px 2px rgba(0, 0, 0, 0.06);
  transition: box-shadow 200ms ease-out;
  margin-bottom: 1rem;
}

/* Header de las cards de formulario (fieldset.html, fieldset plegable y
   edit_inline/tabular.html): lo resuelven las clases del tema en el template
   (.card-header .bg-transparent .border-bottom .text-dark): fondo blanco, texto
   oscuro y linea divisoria fina. Solo el peso va aqui: el body del tema es
   font-weight 300 y sus .fw-bold/.fw-bolder dan 400 (el tema redefine .fw-bold
   como 400), asi que ninguna clase del tema logra la negrita del titulo. */
#content-main fieldset > .card > .card-header {
  font-weight: 600;
}
#content-main .card-body {
  padding: 1.1rem;
}

@media (prefers-reduced-motion: reduce) {
  #content-main .card,
  #content-main .input-group,
  #content-main .input-group-text,
  #content-main .form-control,
  #content-main .form-select,
  #content-main .cb-select2 .select2-selection--single,
  #content-main .select2-container--admin-autocomplete .select2-selection--single {
    transition: none !important;
  }
}

/* Flecha de los <select class="form-select">. El tema (style.css ~L36506) la
   cambia por ../../assets/images/custom-select.png, que este proyecto no
   trae (404) y el select se queda sin flecha; se vuelve a la de Bootstrap,
   que el mismo tema define mas arriba. */
#content-main .form-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='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e");
  background-size: 16px 12px;
}

/* Select de una FK con los iconos de agregar/editar/ver: el select va DENTRO
   de .related-widget-wrapper (admin/widgets/related_widget_wrapper.html), que
   en un .input-group solo mide lo que mide su contenido. Sin esto el select
   queda a 120px y los iconos bajan a otra linea. Se limita a los wrappers con
   un .form-select para no tocar el selector de doble lista (.selector). */
#content-main .related-widget-wrapper:has(> .form-select) {
  display: flex;
  flex: 1 1 auto;
  align-items: center;
  column-gap: 0.5rem;
  min-width: 0;
}
#content-main .related-widget-wrapper > .form-select {
  flex: 1 1 auto;
  width: auto;
  min-width: 0;
}

/* Select2 global (static/admin/js/project-select2.js). El JS le pone la clase
   .cb-select2 al contenedor; el tema (style.css ~L41499) ya da borde suave y
   color. Aqui solo se iguala la altura a la de un .form-control (38px), el
   texto a .875rem y el foco a un realce sutil del color primario del tema. */
#content-main .cb-select2 .select2-selection--single {
  height: calc(1.5em + 0.75rem + 2px);
  border-radius: 2px;
  outline: 0;
  transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
}
#content-main .cb-select2 .select2-selection--single .select2-selection__rendered {
  padding-left: 0.75rem;
  padding-right: 2.25rem;
  font-size: 0.875rem;
  line-height: calc(1.5em + 0.75rem);
}
#content-main .cb-select2 .select2-selection--single .select2-selection__arrow {
  height: calc(1.5em + 0.75rem);
}
#content-main .cb-select2 .select2-selection--single .select2-selection__clear {
  margin-right: 0.35rem;
  color: #a1aab2;
}
#content-main .cb-select2 .select2-selection--multiple {
  min-height: calc(1.5em + 0.75rem + 2px);
  font-size: 0.875rem;
}
#content-main .cb-select2.select2-container--focus .select2-selection,
#content-main .cb-select2.select2-container--open .select2-selection {
  border-color: rgba(var(--bs-primary-rgb, 44, 171, 227), 0.55);
  box-shadow: 0 0 0 0.15rem rgba(var(--bs-primary-rgb, 44, 171, 227), 0.15);
}
#content-main .cb-select2.select2-container--disabled .select2-selection {
  background-color: #f6f7f9;
}
/* El desplegable lo agrega Select2 al <body> (fuera de #content-main), por eso
   esta regla usa la clase .cb-select2-dropdown que le pone el JS. */
.cb-select2-dropdown {
  border-color: #e9ecef;
  font-size: 0.875rem;
}
.cb-select2-dropdown .select2-results__option--highlighted[aria-selected] {
  background-color: #2cabe3;
  color: #fff;
}
.cb-select2-dropdown .select2-results__option[aria-selected="true"] {
  background-color: #eef7fc;
  color: #54667a;
}
.cb-select2-dropdown .select2-search--dropdown .select2-search__field {
  border-color: #e9ecef;
  border-radius: 2px;
  outline: 0;
}
/* FK con iconos agregar/editar/ver: el contenedor ocupa el resto de la linea
   y los iconos quedan a su lado (mismo criterio que .form-select arriba). */
#content-main .related-widget-wrapper > .select2-container {
  flex: 1 1 auto;
  min-width: 0;
}

/* Campo de solo lectura de texto largo (includes/fieldset.html) */
.cb-readonly-text {
  min-height: 60px;
  white-space: pre-wrap;
}

/* Boton de envio ya pulsado (change_form.html): sin clics ni brillo pleno */
.cb-busy {
  pointer-events: none;
  opacity: 0.6;
}

/* Inlines paginados: sin margen inferior (edit_inline/paginated_tabular_inline) */
.cb-flush {
  margin-bottom: 0;
}


/* ---- 7. Widgets ------------------------------------------------------------ */
/* Buscador FK (widgets/popup_foreign_key_widget.html): el menu de
   autocompletar debe quedar por encima del modal. Regla global, igual que la
   que vivia en el <style> del widget (el menu lo crea jQuery UI fuera del
   widget, no se le puede poner una clase .cb-*). */
.ui-autocomplete {
  z-index: 9999;
}

/* Fecha/hora dividida (AdminSplitDateTime). Django pinta
   <p class="datetime">Fecha: <input> <br> Hora: <input></p> y
   DateTimeShortcuts.js agrega tras cada input un <span class="datetimeshortcuts">
   (Hoy | calendario, Ahora | reloj). Se ponen en una sola linea, a la altura
   de un .form-control; si no cabe, la hora baja entera. El <br> del widget
   se oculta: dentro de un flex desalineaba el texto "Hora:". */
#content-main p.datetime {
  display: flex;
  flex: 1 1 auto;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.35rem 0.5rem;
  min-width: 0;
  font-size: 0.875rem;
}
#content-main p.datetime br {
  display: none;
}
#content-main p.datetime input.form-control {
  flex: 0 1 8.5rem;
  width: auto;
  min-width: 0;
  margin: 0;
}
#content-main p.datetime input.vTimeField {
  flex-basis: 7rem;
}
#content-main p.datetime .datetimeshortcuts {
  margin-right: 0.75rem;
  white-space: nowrap;
}

/* Selector de doble lista (FilteredSelectMultiple: filter_horizontal de
   Grupos / Permisos). Markup de SelectFilter2.js; widgets.css de Django lo
   deja a 800px flotando con bordes negros nativos. Aqui: dos columnas que
   llenan la fila con borde suave, sin acentos de color. */
#content-main .related-widget-wrapper:has(> .selector) {
  display: flex;
  flex: 1 1 30rem;
  align-items: flex-start;
  column-gap: 0.5rem;
  min-width: 0;
}
#content-main .selector {
  display: flex;
  flex: 1 1 auto;
  align-items: stretch;
  float: none;
  gap: 0.75rem;
  width: auto;
  min-width: 0;
}
#content-main .selector-available,
#content-main .selector-chosen {
  flex: 1 1 0;
  float: none;
  width: auto;
  min-width: 0;
  margin-bottom: 0;
}
#content-main .selector-available h2,
#content-main .selector-chosen h2 {
  margin: 0;
  padding: 0.55rem 0;
  border-color: #e9ecef;
  border-radius: 2px 2px 0 0;
  background: var(--darkened-bg);
  color: var(--body-quiet-color);
  font-size: 0.8rem;
  font-weight: 500;
  letter-spacing: 0.04em;
}
#content-main .selector .selector-filter {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  border-color: #e9ecef;
  padding: 0.4rem 0.5rem;
}
#content-main .selector .selector-filter label {
  flex: 0 0 18px;
  margin: 0;
}
#content-main .selector .selector-available input {
  flex: 1 1 auto;
  width: auto;
  min-width: 0;
  margin: 0;
}
#content-main .selector-filter input,
#content-main .selector select {
  padding: 0.3rem 0.6rem;
  border: 1px solid #e9ecef;
  border-radius: 2px;
  background-color: #fff;
  font-size: 0.875rem;
  transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
}
#content-main .selector select {
  width: 100%;
  height: 14rem;
  margin: 0 0 0.4rem;
  border-radius: 0 0 2px 2px;
}
#content-main .selector-chosen {
  display: flex;
  flex-direction: column;
}
#content-main .selector-chosen select {
  flex: 1 1 auto;
  border-top: 1px solid #e9ecef;
}
#content-main .selector ul.selector-chooser {
  align-self: center;
  margin: 0;
}

/* Caja del input de archivo (widgets/clearable_file_input.html) */
.cb-file-box {
  border: 1px solid #e9ecef;
}

/* Editor de secciones del prompt (apps/chatbot/widgets.py). Mismo CSS que
   antes vivia en el <style> del widget, con #id-del-widget -> .sps-widget. El
   flex:1 1 100% saca al editor del input-group del admin y lo baja a su propia
   linea a ancho completo. Las clases son sps-* (componente autocontenido). */
textarea.sps-hidden-textarea {
  display: none !important;
}
#content-main .sps-widget { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Inter, sans-serif; color: #111827; margin-top: 8px; flex: 1 1 100%; width: 100%; max-width: 100%; }
#content-main .sps-widget * { box-sizing: border-box; }

#content-main .sps-widget .sps-toolbar { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; margin-bottom: 12px; padding: 10px 12px; background: #f9fafb; border: 1px solid #e5e7eb; border-radius: 8px; }
#content-main .sps-widget .sps-toolbar-title { font-weight: 600; font-size: 14px; margin-right: auto; }
#content-main .sps-widget .sps-total-counter { font-size: 12px; color: #6b7280; background: #fff; border: 1px solid #e5e7eb; border-radius: 999px; padding: 2px 10px; white-space: nowrap; }

#content-main .sps-widget .sps-btn { border: 1px solid #0284c7; background: #0ea5e9; color: #fff; padding: 6px 12px; border-radius: 6px; font-size: 13px; cursor: pointer; }
#content-main .sps-widget .sps-btn:hover { background: #0284c7; }
#content-main .sps-widget .sps-btn-secondary { background: #fff; color: #0369a1; border: 1px solid #0ea5e9; }
#content-main .sps-widget .sps-btn-secondary:hover { background: #f0f9ff; }

#content-main .sps-widget .sps-list { display: flex; flex-direction: column; gap: 10px; }
#content-main .sps-widget .sps-card { border: 1px solid #e5e7eb; border-radius: 8px; background: #fff; overflow: hidden; }
#content-main .sps-widget .sps-card-header { display: flex; align-items: center; gap: 8px; padding: 8px 10px; background: #f9fafb; border-bottom: 1px solid #e5e7eb; }
#content-main .sps-widget .sps-collapsed .sps-card-header { border-bottom: none; }
#content-main .sps-widget .sps-collapsed .sps-card-body { display: none; }

#content-main .sps-widget .sps-title-input { flex: 1; border: 1px solid #d1d5db; border-radius: 6px; padding: 6px 8px; font-size: 14px; font-weight: 600; min-width: 0; }
#content-main .sps-widget .sps-title-input:focus { outline: 2px solid #0ea5e9; outline-offset: 1px; border-color: #0ea5e9; }

#content-main .sps-widget .sps-card-actions { display: flex; gap: 4px; flex-shrink: 0; }
#content-main .sps-widget .sps-btn-icon { width: 28px; height: 28px; border: 1px solid #e5e7eb; background: #fff; border-radius: 6px; cursor: pointer; font-size: 13px; line-height: 1; color: #374151; }
#content-main .sps-widget .sps-btn-icon:hover { background: #f3f4f6; }
#content-main .sps-widget .sps-btn-icon:focus-visible { outline: 2px solid #0ea5e9; outline-offset: 1px; }
#content-main .sps-widget .sps-delete:hover { background: #fef2f2; border-color: #ef4444; color: #ef4444; }

#content-main .sps-widget .sps-card-body { padding: 10px; }
#content-main .sps-widget .sps-body-input { width: 100%; min-height: 120px; border: 1px solid #d1d5db; border-radius: 6px; padding: 8px; font-size: 13px; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; line-height: 1.5; resize: vertical; }
#content-main .sps-widget .sps-body-input:focus { outline: 2px solid #0ea5e9; outline-offset: 1px; border-color: #0ea5e9; }

#content-main .sps-widget .sps-body-footer { display: flex; flex-wrap: wrap; justify-content: space-between; align-items: center; gap: 6px; margin-top: 4px; font-size: 12px; }
#content-main .sps-widget .sps-char-count { color: #6b7280; }
#content-main .sps-widget .sps-warning { color: #b45309; background: #fffbeb; border: 1px solid #f59e0b; border-radius: 4px; padding: 2px 6px; }

#content-main .sps-widget .sps-empty { color: #6b7280; font-style: italic; padding: 16px; text-align: center; border: 1px dashed #d1d5db; border-radius: 8px; }
#content-main .sps-widget .sps-footnote { margin-top: 10px; font-size: 12px; color: #6b7280; }

#content-main .sps-widget .sps-modal { display: none; position: fixed; inset: 0; background: rgba(17,24,39,.5); z-index: 9999; align-items: center; justify-content: center; padding: 24px; }
#content-main .sps-widget .sps-modal-open { display: flex; }
#content-main .sps-widget .sps-modal-content { background: #fff; border-radius: 10px; padding: 16px; width: 100%; max-width: 720px; max-height: 80vh; display: flex; flex-direction: column; gap: 10px; }
#content-main .sps-widget .sps-modal-header { display: flex; justify-content: space-between; align-items: center; gap: 8px; flex-wrap: wrap; }
#content-main .sps-widget .sps-preview-textarea { flex: 1; min-height: 320px; width: 100%; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 12.5px; border: 1px solid #d1d5db; border-radius: 6px; padding: 10px; }

@media (max-width: 600px) {
  #content-main .sps-widget .sps-card-header { flex-wrap: wrap; }
  #content-main .sps-widget .sps-title-input { flex-basis: 100%; order: 1; }
}


/* Confirmacion de borrado (delete_confirmation / delete_selected_confirmation):
   ancho por flex-basis, el tema carga dos versiones de Bootstrap. */
.cb-delete-summary {
  flex: 1 1 260px;
}
.cb-delete-detail {
  flex: 2 1 380px;
  min-width: 0;
}

/* ---- 8. Utilidades .cb-* --------------------------------------------------- */
.cb-pointer {
  cursor: pointer;
}


/* ---- 9. Paginas concretas -------------------------------------------------- */
/* Panel "Flujo de Conversacion" del chatbot (admin/chatbot/chatbot_change_form.html) */
.cb-flow {
  margin: 20px 0;
}
.cb-flow-hero {
  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
  border-radius: 16px;
  padding: 28px 32px;
  box-shadow: 0 4px 20px rgba(102, 126, 234, 0.3);
}
.cb-flow-row {
  display: flex;
  align-items: center;
  gap: 24px;
  flex-wrap: wrap;
}
.cb-flow-icon {
  background: rgba(255, 255, 255, 0.2);
  width: 72px;
  height: 72px;
  border-radius: 16px;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 36px;
  flex-shrink: 0;
}
.cb-flow-text {
  flex: 1;
  min-width: 200px;
}
.cb-flow-title {
  margin: 0 0 6px;
  color: white;
  font-size: 22px;
  font-weight: 600;
}
.cb-flow-sub {
  margin: 0 0 10px;
  color: rgba(255, 255, 255, 0.9);
  font-size: 14px;
}
.cb-flow-badge {
  display: inline-block;
  padding: 6px 14px;
  border-radius: 20px;
  font-size: 13px;
  background: rgba(255, 255, 255, 0.2);
  color: white;
}
.cb-flow-btn {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  background: white;
  color: #667eea;
  padding: 16px 32px;
  border-radius: 12px;
  font-size: 16px;
  font-weight: 600;
  text-decoration: none;
  box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1);
  transition: transform 0.2s, box-shadow 0.2s;
  flex-shrink: 0;
}
.cb-flow-warn {
  background: #fff3cd;
  border: 1px solid #ffc107;
  border-radius: 12px;
  padding: 20px;
  text-align: center;
}
.cb-flow-warn-text {
  margin: 0;
  color: #856404;
}
.cb-flow-empty {
  background: linear-gradient(135deg, #e3f2fd 0%, #f3e5f5 100%);
  border-radius: 16px;
  padding: 40px;
  text-align: center;
}
.cb-flow-empty-icon {
  font-size: 64px;
  margin-bottom: 16px;
}
.cb-flow-empty-title {
  margin: 0 0 8px;
  color: #5e35b1;
  font-size: 20px;
}
.cb-flow-empty-text {
  margin: 0;
  color: #666;
  font-size: 14px;
}

/* Editor visual de flujos (admin/chatbot/flow/change_form.html y
   flow_builder.html). Los !important vienen del <style> original: chocan con
   static/chatbot/css/builder.css. */
#builder-toolbar {
  display: flex !important;
  flex-direction: row !important;
  align-items: center !important;
  justify-content: flex-end !important;
  gap: 6px !important;
  padding: 8px 16px !important;
  background: #16213e !important;
  margin-bottom: 0 !important;
}
#builder-toolbar button {
  flex: 0 0 auto !important;
  width: auto !important;
  display: inline-flex !important;
  align-items: center !important;
  gap: 5px !important;
  border: none !important;
  border-radius: 4px !important;
  padding: 6px 12px !important;
  cursor: pointer !important;
  font-size: 13px !important;
  white-space: nowrap !important;
}
#builder-toolbar #btn-zoom-out,
#builder-toolbar #btn-zoom-reset,
#builder-toolbar #btn-zoom-in {
  background: #0f3460 !important;
  color: #fff !important;
}
#builder-toolbar #btn-test-chatbot {
  background: #17a2b8 !important;
  color: #fff !important;
}
#builder-toolbar #btn-save-flow {
  background: #28a745 !important;
  color: #fff !important;
}
.cb-test-reset {
  padding: 10px 15px;
  text-align: center;
}
.cb-fb-breadcrumb {
  margin-top: 20px;
  margin-bottom: 20px;
  padding-bottom: 10px;
}
.cb-fb-breadcrumb-list {
  margin-bottom: 0 !important;
}
.cb-text-white {
  color: white;
}


/* Admin de Chatbot (apps/chatbot/admin.py): token de envio, respuesta del
   asesor, contexto JSON y avisos. */
.cb-token-row {
  display: flex;
  gap: 8px;
  align-items: center;
}
.cb-token-code {
  user-select: all;
  background: #f5f5f5;
  padding: 4px 8px;
  border-radius: 4px;
  display: inline-block;
}
.cb-token-copy {
  padding: 4px 10px;
  border: 1px solid #ccc;
  border-radius: 4px;
  background: #fff;
  cursor: pointer;
  font-size: 12px;
}
.cb-token-ok {
  color: #28a745;
  font-size: 12px;
}
.cb-copy-hidden {
  position: fixed;
  opacity: 0;
}
.cb-agent-reply {
  color: #e67e22;
  font-style: italic;
}
.cb-context-pre {
  background: #f5f5f5;
  padding: 10px;
  border-radius: 4px;
}
.cb-reply-box {
  display: flex;
  gap: 8px;
  align-items: flex-start;
  max-width: 600px;
}
.cb-reply-text {
  flex: 1;
  padding: 8px;
  border: 1px solid #ccc;
  border-radius: 4px;
  resize: vertical;
  font-size: 13px;
}
.cb-reply-send {
  padding: 8px 14px;
  background: #25D366;
  color: #fff;
  border: none;
  border-radius: 4px;
  cursor: pointer;
  white-space: nowrap;
}
.cb-toast {
  position: fixed;
  top: 20px;
  right: 20px;
  padding: 12px 20px;
  border-radius: 4px;
  color: #fff;
  z-index: 9999;
  font-size: 14px;
}
.cb-toast--ok {
  background: #28a745;
}
.cb-toast--error {
  background: #dc3545;
}
.cb-small-link {
  font-size: 0.85em;
}
.cb-text-error {
  color: #d32f2f;
}
/* Badge de vencimiento del token de Meta (whatsapp_cloud/admin.py: MetaPhoneNumberAdmin.vence). */
.cb-badge {
  display: inline-block;
  padding: 2px 8px;
  border-radius: 10px;
  font-size: 0.8em;
  font-weight: 600;
  white-space: nowrap;
}
.cb-badge--warn {
  background: #fff3cd;
  color: #8a6100;
}
.cb-badge--error {
  background: #fdecea;
  color: #d32f2f;
}
/* Sesion de WhatsApp (templates/apps/whatsapp/whatsapp_session.html y su JS).
   Es el <style> original de esa pagina, tal cual: sus clases son propias de la
   pagina (ninguna la usa otro template) y el JS las conoce por nombre. */
.whatsapp-instructions {
  background: linear-gradient(135deg, #25D366 0%, #128C7E 100%);
  color: white;
  border-radius: 12px;
  padding: 0;
  margin-bottom: 20px;
  box-shadow: 0 4px 15px rgba(37, 211, 102, 0.3);
}
.whatsapp-instructions .card-header {
  background: transparent;
  border-bottom: 1px solid rgba(255,255,255,0.2);
  padding: 15px 20px;
}
.whatsapp-instructions .card-body {
  padding: 20px;
}
.whatsapp-instructions h6 {
  margin: 0;
  font-size: 1.1em;
  font-weight: 600;
}
.whatsapp-instructions ol {
  margin: 0;
  padding-left: 20px;
}
.whatsapp-instructions ol li {
  margin-bottom: 8px;
  font-size: 0.95em;
}
.whatsapp-instructions .text-muted {
  color: rgba(255,255,255,0.8) !important;
}
.qr-container {
  text-align: center;
  padding: 20px;
  background: #f8f9fa;
  border-radius: 8px;
  margin-top: 15px;
}
.qr-container img {
  max-width: 280px;
  border: 4px solid #25D366;
  border-radius: 12px;
  padding: 15px;
  background: white;
  box-shadow: 0 4px 20px rgba(0,0,0,0.1);
}
.btn-generate-qr {
  background: #25D366;
  border-color: #25D366;
  color: white;
  font-weight: 600;
  padding: 12px 30px;
  font-size: 1.1em;
  transition: all 0.3s ease;
  border-radius: 8px;
}
.btn-generate-qr:hover {
  background: #128C7E;
  border-color: #128C7E;
  color: white;
  transform: translateY(-2px);
  box-shadow: 0 4px 12px rgba(37, 211, 102, 0.4);
}
.btn-generate-qr:disabled {
  background: #6c757d;
  border-color: #6c757d;
  transform: none;
  box-shadow: none;
}
.session-status-card {
  border-left: 4px solid #25D366;
  background: #f8f9fa;
  padding: 15px 20px;
  border-radius: 0 8px 8px 0;
  margin-bottom: 20px;
}
.session-status-card.disconnected {
  border-left-color: #dc3545;
}
.session-status-card.pending {
  border-left-color: #ffc107;
}
.session-status-card.connecting {
  border-left-color: #17a2b8;
}
.connection-status {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 10px 15px;
  border-radius: 8px;
  background: #e9ecef;
  margin-top: 15px;
}
.connection-status.connected {
  background: #d4edda;
  color: #155724;
}
.connection-status.connecting {
  background: #d1ecf1;
  color: #0c5460;
}
.connection-status.error {
  background: #f8d7da;
  color: #721c24;
}
@keyframes pulse {
  0% { opacity: 1; }
  50% { opacity: 0.5; }
  100% { opacity: 1; }
}
.pulse-animation {
  animation: pulse 1.5s infinite;
}
/* Overlay de escaneo QR */
.qr-scanning-overlay {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background: rgba(0, 0, 0, 0.8);
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  z-index: 9999;
}
.qr-scanning-container {
  background: white;
  border-radius: 20px;
  padding: 30px;
  max-width: 400px;
  width: 90%;
  text-align: center;
  box-shadow: 0 10px 40px rgba(0, 0, 0, 0.3);
  animation: slideUp 0.3s ease-out;
}
@keyframes slideUp {
  from {
    opacity: 0;
    transform: translateY(20px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}
.qr-scanning-header {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 10px;
  margin-bottom: 20px;
  color: #25D366;
}
.qr-scanning-header i {
  font-size: 2em;
}
.qr-scanning-header h4 {
  margin: 0;
  color: #333;
}
.qr-scanning-qr {
  margin: 20px 0;
}
.qr-scanning-qr img {
  max-width: 250px;
  border: 4px solid #25D366;
  border-radius: 12px;
  padding: 10px;
  background: white;
}
.qr-scanning-status {
  padding: 15px;
  border-radius: 10px;
  margin: 15px 0;
  font-weight: 500;
}
.qr-scanning-status.waiting {
  background: linear-gradient(135deg, #e3f2fd, #bbdefb);
  color: #1565c0;
}
.qr-scanning-status.scanning {
  background: linear-gradient(135deg, #fff3e0, #ffe0b2);
  color: #e65100;
}
.qr-scanning-status.success {
  background: linear-gradient(135deg, #e8f5e9, #c8e6c9);
  color: #2e7d32;
}
.qr-scanning-status.error {
  background: linear-gradient(135deg, #ffebee, #ffcdd2);
  color: #c62828;
}
.qr-scanning-instructions {
  font-size: 0.9em;
  color: #666;
  margin-top: 15px;
  padding: 15px;
  background: #f5f5f5;
  border-radius: 10px;
}
.qr-scanning-instructions ol {
  margin: 10px 0 0 0;
  padding-left: 20px;
  text-align: left;
}
.qr-scanning-instructions li {
  margin-bottom: 5px;
}
.qr-scanning-cancel {
  margin-top: 20px;
  padding: 10px 25px;
  background: #f5f5f5;
  border: none;
  border-radius: 8px;
  color: #666;
  cursor: pointer;
  transition: all 0.3s;
}
.qr-scanning-cancel:hover {
  background: #e0e0e0;
}
.qr-phone-display {
  background: #f0f4f8;
  padding: 10px 20px;
  border-radius: 8px;
  display: inline-block;
  margin-bottom: 15px;
  font-family: monospace;
  font-size: 1.1em;
  color: #333;
}
@keyframes spin {
  100% { transform: rotate(360deg); }
}
.spinner-icon {
  animation: spin 1s linear infinite;
  display: inline-block;
}

.whatsapp-instructions hr {
  border-color: rgba(255, 255, 255, 0.3);
}
.qr-container img,
.qr-scanning-qr img {
  display: block;
}
.cb-wa-loading {
  padding: 50px;
}
.cb-wa-loading-icon {
  font-size: 3em;
  color: #25D366;
}
.cb-wa-loading-text {
  margin-top: 15px;
  color: #666;
}

/* Meta: payload JSON legible (apps/whatsapp_cloud/admin.py) */
.cb-payload {
  white-space: pre-wrap;
  max-height: 420px;
  overflow: auto;
  font-size: 12px;
}
